summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/CMakeLists.txt19
-rw-r--r--indra/cmake/00-Common.cmake21
-rw-r--r--indra/cmake/APR.cmake59
-rw-r--r--indra/cmake/Audio.cmake44
-rw-r--r--indra/cmake/Boost.cmake163
-rw-r--r--indra/cmake/CEFPlugin.cmake87
-rw-r--r--indra/cmake/CMakeLists.txt4
-rw-r--r--indra/cmake/CURL.cmake23
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake30
-rw-r--r--indra/cmake/Discord.cmake54
-rw-r--r--indra/cmake/EXPAT.cmake23
-rw-r--r--indra/cmake/FMODSTUDIO.cmake33
-rw-r--r--indra/cmake/FreeType.cmake11
-rw-r--r--indra/cmake/GLEXT.cmake4
-rw-r--r--indra/cmake/Hunspell.cmake20
-rw-r--r--indra/cmake/JPEG.cmake20
-rw-r--r--indra/cmake/LLAddBuildTest.cmake12
-rw-r--r--indra/cmake/LLKDU.cmake16
-rw-r--r--indra/cmake/LLPhysicsExtensions.cmake29
-rw-r--r--indra/cmake/LLPrimitive.cmake147
-rw-r--r--indra/cmake/LLWindow.cmake2
-rw-r--r--indra/cmake/LibVLCPlugin.cmake15
-rw-r--r--indra/cmake/Linking.cmake14
-rw-r--r--indra/cmake/Meshoptimizer.cmake28
-rw-r--r--indra/cmake/NDOF.cmake55
-rw-r--r--indra/cmake/NGHTTP2.cmake13
-rw-r--r--indra/cmake/NVAPI.cmake4
-rw-r--r--indra/cmake/OPENAL.cmake35
-rw-r--r--indra/cmake/OpenJPEG.cmake8
-rw-r--r--indra/cmake/OpenSSL.cmake29
-rw-r--r--indra/cmake/OpenXR.cmake9
-rw-r--r--indra/cmake/PNG.cmake15
-rw-r--r--indra/cmake/PluginAPI.cmake4
-rw-r--r--indra/cmake/Python.cmake2
-rw-r--r--indra/cmake/SSE2NEON.cmake12
-rw-r--r--indra/cmake/Tracy.cmake6
-rw-r--r--indra/cmake/UI.cmake6
-rw-r--r--indra/cmake/VHACD.cmake30
-rw-r--r--indra/cmake/Variables.cmake42
-rw-r--r--indra/cmake/ViewerMiscLibs.cmake2
-rw-r--r--indra/cmake/WebRTC.cmake46
-rw-r--r--indra/cmake/ZLIBNG.cmake13
-rw-r--r--indra/cmake/xxHash.cmake5
-rw-r--r--indra/doxygen/CMakeLists.txt14
-rw-r--r--indra/edit-me-to-trigger-new-build.txt1
-rw-r--r--indra/integration_tests/CMakeLists.txt7
-rw-r--r--indra/integration_tests/llimage_libtest/CMakeLists.txt70
-rw-r--r--indra/integration_tests/llimage_libtest/llimage_libtest.cpp18
-rw-r--r--indra/llappearance/CMakeLists.txt1
-rw-r--r--indra/llappearance/llavatarappearance.cpp66
-rw-r--r--indra/llappearance/llavatarappearance.h10
-rw-r--r--indra/llappearance/lljointdata.h66
-rw-r--r--indra/llappearance/llpolymesh.cpp1
-rw-r--r--indra/llappearance/llpolymorph.cpp8
-rw-r--r--indra/llappearance/lltexlayer.cpp34
-rw-r--r--indra/llappearance/lltexlayerparams.cpp5
-rw-r--r--indra/llaudio/llvorbisencode.cpp32
-rw-r--r--indra/llcharacter/llbvhloader.cpp6
-rw-r--r--indra/llcharacter/llbvhloader.h2
-rw-r--r--indra/llcharacter/llcharacter.cpp7
-rw-r--r--indra/llcharacter/llcharacter.h4
-rw-r--r--indra/llcharacter/lljoint.cpp7
-rw-r--r--indra/llcharacter/lljoint.h2
-rw-r--r--indra/llcommon/CMakeLists.txt3
-rw-r--r--indra/llcommon/StackWalker.cpp8
-rw-r--r--indra/llcommon/always_return.h16
-rw-r--r--indra/llcommon/fsyspath.h47
-rw-r--r--indra/llcommon/indra_constants.h410
-rw-r--r--indra/llcommon/linden_common.h6
-rw-r--r--indra/llcommon/llapp.cpp4
-rw-r--r--indra/llcommon/llassettype.cpp17
-rw-r--r--indra/llcommon/llassettype.h2
-rw-r--r--indra/llcommon/llcommon.cpp72
-rw-r--r--indra/llcommon/lldefs.h14
-rw-r--r--indra/llcommon/llerror.cpp2
-rw-r--r--indra/llcommon/llexception.cpp44
-rw-r--r--indra/llcommon/llexception.h114
-rw-r--r--indra/llcommon/llfasttimer.cpp2
-rw-r--r--indra/llcommon/llfasttimer.h70
-rw-r--r--indra/llcommon/llfile.cpp410
-rw-r--r--indra/llcommon/llfile.h114
-rw-r--r--indra/llcommon/llleap.cpp11
-rw-r--r--indra/llcommon/llmd5.cpp9
-rw-r--r--indra/llcommon/llmemory.h53
-rw-r--r--indra/llcommon/llpreprocessor.h38
-rw-r--r--indra/llcommon/llprocessor.cpp40
-rw-r--r--indra/llcommon/llprocessor.h15
-rw-r--r--indra/llcommon/llprofiler.h56
-rw-r--r--indra/llcommon/llqueuedthread.cpp34
-rw-r--r--indra/llcommon/llsdjson.cpp4
-rw-r--r--indra/llcommon/llsdutil.h94
-rw-r--r--indra/llcommon/llstring.cpp2
-rw-r--r--indra/llcommon/llstring.h4
-rw-r--r--indra/llcommon/llsys.cpp17
-rw-r--r--indra/llcommon/llthread.cpp105
-rw-r--r--indra/llcommon/llthread.h7
-rw-r--r--indra/llcommon/llthreadsafequeue.h6
-rw-r--r--indra/llcommon/lluuid.cpp15
-rw-r--r--indra/llcommon/lluuid.h2
-rw-r--r--indra/llcommon/llwin32headers.h1
-rw-r--r--indra/llcommon/stdtypes.h6
-rw-r--r--indra/llcommon/tests/llprocess_test.cpp44
-rw-r--r--indra/llcommon/tests/stringize_test.cpp12
-rw-r--r--indra/llcommon/threadpool.h4
-rw-r--r--indra/llcommon/workqueue.cpp68
-rw-r--r--indra/llcommon/workqueue.h11
-rw-r--r--indra/llcorehttp/_httpoprequest.cpp17
-rw-r--r--indra/llcorehttp/examples/http_texture_load.cpp52
-rw-r--r--indra/llcorehttp/httpcommon.cpp2
-rw-r--r--indra/llcorehttp/httpoptions.cpp6
-rw-r--r--indra/llcorehttp/httpoptions.h8
-rwxr-xr-xindra/llcorehttp/llhttpconstants.cpp2
-rwxr-xr-xindra/llcorehttp/llhttpconstants.h2
-rwxr-xr-xindra/llcorehttp/tests/llcorehttp_test.cpp57
-rw-r--r--indra/llcorehttp/tests/test_httprequest.hpp13
-rw-r--r--indra/llcorehttp/tests/test_refcounted.hpp3
-rw-r--r--indra/llcrashlogger/llcrashlock.cpp4
-rw-r--r--indra/llcrashlogger/llcrashlogger.cpp4
-rw-r--r--indra/llfilesystem/lldir.cpp13
-rw-r--r--indra/llfilesystem/lldir_mac.cpp2
-rw-r--r--indra/llfilesystem/lldir_utils_objc.mm28
-rw-r--r--indra/llfilesystem/lldir_win32.cpp12
-rw-r--r--indra/llfilesystem/lldir_win32.h2
-rw-r--r--indra/llfilesystem/lldirguard.h7
-rw-r--r--indra/llfilesystem/lldiriterator.cpp10
-rw-r--r--indra/llfilesystem/lldiskcache.cpp39
-rw-r--r--indra/llfilesystem/llfilesystem.cpp7
-rw-r--r--indra/llfilesystem/tests/lldir_test.cpp2
-rw-r--r--indra/llimage/llimagebmp.cpp6
-rw-r--r--indra/llimage/llimagedimensionsinfo.cpp20
-rw-r--r--indra/llimage/llimagedimensionsinfo.h4
-rw-r--r--indra/llimage/llimagedxt.cpp6
-rw-r--r--indra/llimage/llimagej2c.cpp9
-rw-r--r--indra/llimage/llimagejpeg.cpp10
-rw-r--r--indra/llimage/llimagejpeg.h2
-rw-r--r--indra/llimagej2coj/llimagej2coj.cpp303
-rw-r--r--indra/llimagej2coj/llimagej2coj.h2
-rw-r--r--indra/llinventory/llfoldertype.cpp19
-rw-r--r--indra/llinventory/llfoldertype.h2
-rw-r--r--indra/llinventory/llinventory.cpp197
-rw-r--r--indra/llinventory/llinventory.h9
-rw-r--r--indra/llinventory/llparcel.h105
-rw-r--r--indra/llinventory/llpermissions.cpp121
-rw-r--r--indra/llinventory/llpermissions.h3
-rw-r--r--indra/llinventory/llsaleinfo.cpp9
-rw-r--r--indra/llinventory/llsaleinfo.h1
-rw-r--r--indra/llinventory/llsettingsbase.cpp6
-rw-r--r--indra/llinventory/llsettingsbase.h2
-rw-r--r--indra/llinventory/llsettingssky.cpp11
-rw-r--r--indra/llinventory/tests/inventorymisc_test.cpp56
-rw-r--r--indra/llkdu/CMakeLists.txt15
-rw-r--r--indra/llkdu/llimagej2ckdu.cpp79
-rw-r--r--indra/llkdu/llimagej2ckdu.h4
-rw-r--r--indra/llkdu/llkdumem.h12
-rw-r--r--indra/llkdu/tests/llimagej2ckdu_test.cpp30
-rw-r--r--indra/llmath/llbbox.h4
-rw-r--r--indra/llmath/llbboxlocal.h3
-rw-r--r--indra/llmath/llcamera.h26
-rw-r--r--indra/llmath/llcoordframe.cpp27
-rw-r--r--indra/llmath/llcoordframe.h2
-rw-r--r--indra/llmath/llline.h7
-rw-r--r--indra/llmath/llmath.h83
-rw-r--r--indra/llmath/llmatrix3a.h8
-rw-r--r--indra/llmath/llmatrix4a.h7
-rw-r--r--indra/llmath/llplane.h3
-rw-r--r--indra/llmath/llquaternion.cpp5
-rw-r--r--indra/llmath/llquaternion.h4
-rw-r--r--indra/llmath/llquaternion2.h4
-rw-r--r--indra/llmath/llquaternion2.inl5
-rw-r--r--indra/llmath/llrect.h8
-rw-r--r--indra/llmath/llsimdmath.h8
-rw-r--r--indra/llmath/llsimdtypes.h12
-rw-r--r--indra/llmath/llvector4a.cpp10
-rw-r--r--indra/llmath/llvector4a.h11
-rw-r--r--indra/llmath/llvector4a.inl39
-rw-r--r--indra/llmath/llvector4logical.h6
-rw-r--r--indra/llmath/llvolume.cpp63
-rw-r--r--indra/llmath/llvolume.h1
-rw-r--r--indra/llmath/m3math.cpp1
-rw-r--r--indra/llmath/m3math.h4
-rw-r--r--indra/llmath/m4math.cpp5
-rw-r--r--indra/llmath/m4math.h6
-rw-r--r--indra/llmath/raytrace.cpp1
-rw-r--r--indra/llmath/tests/llquaternion_test.cpp6
-rw-r--r--indra/llmath/v2math.cpp44
-rw-r--r--indra/llmath/v2math.h205
-rw-r--r--indra/llmath/v3color.cpp122
-rw-r--r--indra/llmath/v3color.h428
-rw-r--r--indra/llmath/v3colorutil.h68
-rw-r--r--indra/llmath/v3dmath.cpp45
-rw-r--r--indra/llmath/v3dmath.h382
-rw-r--r--indra/llmath/v3math.cpp137
-rw-r--r--indra/llmath/v3math.h311
-rw-r--r--indra/llmath/v4color.cpp391
-rw-r--r--indra/llmath/v4color.h708
-rw-r--r--indra/llmath/v4coloru.cpp65
-rw-r--r--indra/llmath/v4coloru.h373
-rw-r--r--indra/llmath/v4math.cpp19
-rw-r--r--indra/llmath/v4math.h417
-rw-r--r--indra/llmath/xform.h2
-rw-r--r--indra/llmessage/llcoproceduremanager.cpp56
-rw-r--r--indra/llmessage/llcoproceduremanager.h2
-rw-r--r--indra/llmessage/llexperiencecache.cpp3
-rw-r--r--indra/llmessage/llpacketring.cpp10
-rw-r--r--indra/llmessage/llproxy.cpp1
-rw-r--r--indra/llmessage/llxfermanager.cpp2
-rw-r--r--indra/llmessage/message_prehash.cpp1
-rw-r--r--indra/llmessage/message_prehash.h1
-rw-r--r--indra/llmessage/patch_code.cpp1
-rw-r--r--indra/llmessage/patch_dct.cpp1
-rw-r--r--indra/llmessage/patch_idct.cpp1
-rw-r--r--indra/llphysicsextensionsos/CMakeLists.txt47
-rw-r--r--indra/llphysicsextensionsos/LLPathingLibStubImpl.cpp109
-rw-r--r--indra/llphysicsextensionsos/LLPathingLibStubImpl.h78
-rw-r--r--indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.cpp51
-rw-r--r--indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.h46
-rw-r--r--indra/llphysicsextensionsos/llconvexdecomposition.cpp84
-rw-r--r--indra/llphysicsextensionsos/llconvexdecomposition.h231
-rw-r--r--indra/llphysicsextensionsos/llconvexdecompositionvhacd.cpp492
-rw-r--r--indra/llphysicsextensionsos/llconvexdecompositionvhacd.h339
-rw-r--r--indra/llphysicsextensionsos/llpathinglib.cpp83
-rw-r--r--indra/llphysicsextensionsos/llpathinglib.h187
-rw-r--r--indra/llphysicsextensionsos/llphysicsextensions.cpp78
-rw-r--r--indra/llphysicsextensionsos/llphysicsextensions.h59
-rw-r--r--indra/llplugin/CMakeLists.txt2
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp54
-rw-r--r--indra/llplugin/llpluginclassmedia.h25
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp23
-rw-r--r--indra/llplugin/slplugin/CMakeLists.txt37
-rw-r--r--indra/llplugin/slplugin/slplugin-objc.mm98
-rw-r--r--indra/llprimitive/CMakeLists.txt35
-rw-r--r--indra/llprimitive/lldaeloader.cpp20
-rw-r--r--indra/llprimitive/lldaeloader.h30
-rw-r--r--indra/llprimitive/llgltfloader.cpp404
-rw-r--r--indra/llprimitive/llgltfloader.h206
-rw-r--r--indra/llprimitive/llgltfmaterial.cpp31
-rw-r--r--indra/llprimitive/llgltfmaterial.h8
-rw-r--r--indra/llprimitive/llmodel.cpp205
-rw-r--r--indra/llprimitive/llmodel.h14
-rw-r--r--indra/llprimitive/llmodelloader.cpp196
-rw-r--r--indra/llprimitive/llmodelloader.h19
-rw-r--r--indra/llprimitive/object_flags.h12
-rw-r--r--indra/llrender/llcubemap.cpp10
-rw-r--r--indra/llrender/llcubemaparray.cpp3
-rw-r--r--indra/llrender/llfontfreetype.cpp230
-rw-r--r--indra/llrender/llfontfreetype.h23
-rw-r--r--indra/llrender/llgl.cpp51
-rw-r--r--indra/llrender/llgl.h13
-rw-r--r--indra/llrender/llglslshader.cpp59
-rw-r--r--indra/llrender/llglslshader.h5
-rw-r--r--indra/llrender/llimagegl.cpp42
-rw-r--r--indra/llrender/llrender.cpp197
-rw-r--r--indra/llrender/llrender.h20
-rw-r--r--indra/llrender/llrender2dutils.cpp3
-rw-r--r--indra/llrender/llrendertarget.cpp199
-rw-r--r--indra/llrender/llrendertarget.h11
-rw-r--r--indra/llrender/llshadermgr.cpp80
-rw-r--r--indra/llrender/llshadermgr.h18
-rw-r--r--indra/llrender/llvertexbuffer.cpp211
-rw-r--r--indra/llrender/llvertexbuffer.h8
-rw-r--r--indra/llui/CMakeLists.txt2
-rw-r--r--indra/llui/llaccordionctrl.cpp1
-rw-r--r--indra/llui/llaccordionctrltab.cpp54
-rw-r--r--indra/llui/llaccordionctrltab.h6
-rw-r--r--indra/llui/llchatentry.cpp17
-rw-r--r--indra/llui/llchatentry.h2
-rw-r--r--indra/llui/llchatmentionhelper.cpp158
-rw-r--r--indra/llui/llchatmentionhelper.h66
-rw-r--r--indra/llui/llcheckboxctrl.h8
-rw-r--r--indra/llui/llcontainerview.h18
-rw-r--r--indra/llui/lldockablefloater.h4
-rw-r--r--indra/llui/lldockcontrol.cpp2
-rw-r--r--indra/llui/lldockcontrol.h8
-rw-r--r--indra/llui/lldraghandle.h2
-rw-r--r--indra/llui/llemojidictionary.cpp11
-rw-r--r--indra/llui/llemojihelper.cpp21
-rw-r--r--indra/llui/llemojihelper.h7
-rw-r--r--indra/llui/llfiltereditor.h2
-rw-r--r--indra/llui/llflashtimer.cpp4
-rw-r--r--indra/llui/llflashtimer.h4
-rw-r--r--indra/llui/llflatlistview.cpp21
-rw-r--r--indra/llui/llflatlistview.h46
-rw-r--r--indra/llui/llfloater.cpp4
-rw-r--r--indra/llui/llfloater.h45
-rw-r--r--indra/llui/llfloaterreglistener.h1
-rw-r--r--indra/llui/llflyoutbutton.h2
-rw-r--r--indra/llui/llfocusmgr.h2
-rw-r--r--indra/llui/llfolderview.cpp1
-rw-r--r--indra/llui/llfolderview.h31
-rw-r--r--indra/llui/llfolderviewitem.cpp269
-rw-r--r--indra/llui/llfolderviewitem.h38
-rw-r--r--indra/llui/llfolderviewmodel.h74
-rw-r--r--indra/llui/llkeywords.cpp2
-rw-r--r--indra/llui/llkeywords.h4
-rw-r--r--indra/llui/lllayoutstack.cpp4
-rw-r--r--indra/llui/lllayoutstack.h6
-rw-r--r--indra/llui/lllineeditor.cpp24
-rw-r--r--indra/llui/lllineeditor.h6
-rw-r--r--indra/llui/llmenubutton.h4
-rw-r--r--indra/llui/llmenugl.cpp2
-rw-r--r--indra/llui/llmenugl.h2
-rw-r--r--indra/llui/llmodaldialog.cpp12
-rw-r--r--indra/llui/llmultifloater.cpp2
-rw-r--r--indra/llui/llmultifloater.h2
-rw-r--r--indra/llui/llmultislider.h8
-rw-r--r--indra/llui/llmultisliderctrl.h9
-rw-r--r--indra/llui/llnotifications.h7
-rw-r--r--indra/llui/llprogressbar.h4
-rw-r--r--indra/llui/llresizebar.h2
-rw-r--r--indra/llui/llresizehandle.h12
-rw-r--r--indra/llui/llrngwriter.h2
-rw-r--r--indra/llui/llscrolllistcell.h2
-rw-r--r--indra/llui/llscrolllistctrl.cpp2
-rw-r--r--indra/llui/llscrolllistctrl.h9
-rw-r--r--indra/llui/llsliderctrl.h1
-rw-r--r--indra/llui/llspinctrl.h1
-rw-r--r--indra/llui/llstatbar.h2
-rw-r--r--indra/llui/llstatgraph.cpp1
-rw-r--r--indra/llui/llstatgraph.h7
-rw-r--r--indra/llui/llstatview.h1
-rw-r--r--indra/llui/llstyle.cpp8
-rw-r--r--indra/llui/llstyle.h21
-rw-r--r--indra/llui/lltabcontainer.cpp10
-rw-r--r--indra/llui/lltabcontainer.h12
-rw-r--r--indra/llui/lltextbase.cpp209
-rw-r--r--indra/llui/lltextbase.h38
-rw-r--r--indra/llui/lltextbox.h34
-rw-r--r--indra/llui/lltexteditor.cpp120
-rw-r--r--indra/llui/lltexteditor.h17
-rw-r--r--indra/llui/lltoolbar.cpp2
-rw-r--r--indra/llui/lltoolbar.h6
-rw-r--r--indra/llui/lltooltip.cpp8
-rw-r--r--indra/llui/lltooltip.h30
-rw-r--r--indra/llui/llui.cpp5
-rw-r--r--indra/llui/llui.h12
-rw-r--r--indra/llui/lluiconstants.h20
-rw-r--r--indra/llui/lluictrl.h6
-rw-r--r--indra/llui/lluictrlfactory.h2
-rw-r--r--indra/llui/llundo.h6
-rw-r--r--indra/llui/llurlaction.cpp38
-rw-r--r--indra/llui/llurlaction.h10
-rw-r--r--indra/llui/llurlentry.cpp102
-rw-r--r--indra/llui/llurlentry.h51
-rw-r--r--indra/llui/llurlmatch.cpp10
-rw-r--r--indra/llui/llurlmatch.h12
-rw-r--r--indra/llui/llurlregistry.cpp47
-rw-r--r--indra/llui/llurlregistry.h6
-rw-r--r--indra/llui/llview.h22
-rw-r--r--indra/llui/llviewborder.h1
-rw-r--r--indra/llui/llviewereventrecorder.cpp2
-rw-r--r--indra/llui/llviewereventrecorder.h2
-rw-r--r--indra/llui/llvirtualtrackball.h23
-rw-r--r--indra/llui/llwindowshade.h2
-rw-r--r--indra/llui/llxyvector.h18
-rw-r--r--indra/llwebrtc/CMakeLists.txt21
-rw-r--r--indra/llwebrtc/llwebrtc.cpp863
-rw-r--r--indra/llwebrtc/llwebrtc.h5
-rw-r--r--indra/llwebrtc/llwebrtc_impl.h430
-rw-r--r--indra/llwindow/CMakeLists.txt7
-rw-r--r--indra/llwindow/lldxhardware.cpp656
-rw-r--r--indra/llwindow/lldxhardware.h68
-rw-r--r--indra/llwindow/llopenglview-objc.h22
-rw-r--r--indra/llwindow/llopenglview-objc.mm540
-rw-r--r--indra/llwindow/llwindow.cpp27
-rw-r--r--indra/llwindow/llwindow.h5
-rw-r--r--indra/llwindow/llwindowcallbacks.cpp8
-rw-r--r--indra/llwindow/llwindowcallbacks.h3
-rw-r--r--indra/llwindow/llwindowheadless.h3
-rw-r--r--indra/llwindow/llwindowmacosx-objc.h7
-rw-r--r--indra/llwindow/llwindowmacosx-objc.mm283
-rw-r--r--indra/llwindow/llwindowmacosx.cpp35
-rw-r--r--indra/llwindow/llwindowmacosx.h4
-rw-r--r--indra/llwindow/llwindowsdl.cpp9
-rw-r--r--indra/llwindow/llwindowsdl.h4
-rw-r--r--indra/llwindow/llwindowwin32.cpp447
-rw-r--r--indra/llwindow/llwindowwin32.h11
-rw-r--r--indra/llxml/llcontrol.cpp3
-rw-r--r--indra/llxml/llxmlnode.cpp6
-rw-r--r--indra/media_plugins/base/CMakeLists.txt2
-rw-r--r--indra/media_plugins/base/media_plugin_base.cpp4
-rw-r--r--indra/media_plugins/cef/CMakeLists.txt95
-rw-r--r--indra/media_plugins/cef/media_plugin_cef.cpp142
-rw-r--r--indra/media_plugins/example/CMakeLists.txt2
-rw-r--r--indra/media_plugins/libvlc/CMakeLists.txt51
-rw-r--r--indra/media_plugins/libvlc/media_plugin_libvlc.cpp2
-rw-r--r--indra/newview/CMakeLists.txt429
-rw-r--r--indra/newview/English.lproj/InfoPlist.strings2
-rw-r--r--indra/newview/FixBundle.cmake.in776
-rw-r--r--indra/newview/FixPackage.cmake.in776
-rw-r--r--indra/newview/PKGBUILD.in2
-rw-r--r--indra/newview/SecondLife.nibbin11888 -> 0 bytes
-rw-r--r--indra/newview/SecondLife.xib1327
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/ViewerInstall.cmake123
-rw-r--r--indra/newview/app_settings/commands.xml4
-rwxr-xr-xindra/newview/app_settings/message.xml751
-rw-r--r--indra/newview/app_settings/settings.xml626
-rw-r--r--indra/newview/app_settings/settings_per_account.xml2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/CASF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/MPHDRDisplayGammaF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl89
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl1
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/materialF.glsl1
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl1
-rw-r--r--indra/newview/app_settings/shaders/class3/environment/waterF.glsl7
-rw-r--r--indra/newview/character/attentions.xml4
-rw-r--r--indra/newview/featuretable_mac.txt23
-rw-r--r--indra/newview/gltf/accessor.cpp7
-rw-r--r--indra/newview/gltf/asset.cpp206
-rw-r--r--indra/newview/gltf/asset.h13
-rw-r--r--indra/newview/gltf/buffer_util.h23
-rw-r--r--indra/newview/gltf/llgltfloader.cpp1833
-rw-r--r--indra/newview/gltf/llgltfloader.h216
-rw-r--r--indra/newview/gltfscenemanager.cpp11
-rw-r--r--indra/newview/groupchatlistener.cpp84
-rw-r--r--indra/newview/groupchatlistener.h15
-rw-r--r--indra/newview/icons/release/secondlife.icnsbin113020 -> 302511 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_128x128.pngbin0 -> 8653 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.pngbin0 -> 19795 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_16x16.pngbin0 -> 681 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.pngbin0 -> 1508 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_256x256.pngbin0 -> 19795 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.pngbin0 -> 50874 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_32x32.pngbin0 -> 1508 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.pngbin0 -> 3697 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_512x512.pngbin0 -> 50874 bytes
-rw-r--r--indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.pngbin0 -> 105494 bytes
-rw-r--r--indra/newview/icons/release/secondlife_1024.pngbin0 -> 105494 bytes
-rw-r--r--indra/newview/icons/release/secondlife_128.pngbin5320 -> 0 bytes
-rw-r--r--indra/newview/icons/release/secondlife_16.pngbin669 -> 0 bytes
-rw-r--r--indra/newview/icons/release/secondlife_256.pngbin11572 -> 0 bytes
-rw-r--r--indra/newview/icons/release/secondlife_32.pngbin1283 -> 0 bytes
-rw-r--r--indra/newview/icons/release/secondlife_48.pngbin1958 -> 0 bytes
-rw-r--r--indra/newview/icons/test/secondlife.icobin76861 -> 9662 bytes
-rw-r--r--indra/newview/icons/test/secondlife_256.BMPbin196662 -> 262954 bytes
-rw-r--r--indra/newview/installers/windows/installer_template.nsi86
-rw-r--r--indra/newview/licenses-linux.txt59
-rw-r--r--indra/newview/licenses-mac.txt134
-rw-r--r--indra/newview/licenses-win32.txt350
-rwxr-xr-xindra/newview/linux_tools/launch_url.sh1
-rw-r--r--indra/newview/llagent.cpp131
-rw-r--r--indra/newview/llagent.h13
-rw-r--r--indra/newview/llagentcamera.cpp38
-rw-r--r--indra/newview/llagentcamera.h9
-rw-r--r--indra/newview/llagentlistener.cpp387
-rw-r--r--indra/newview/llagentlistener.h16
-rw-r--r--indra/newview/llagentpilot.cpp4
-rw-r--r--indra/newview/llagentwearables.cpp35
-rw-r--r--indra/newview/llagentwearables.h1
-rw-r--r--indra/newview/llaisapi.cpp2
-rw-r--r--indra/newview/llappdelegate-objc.mm156
-rw-r--r--indra/newview/llappearancelistener.cpp158
-rw-r--r--indra/newview/llappearancelistener.h46
-rw-r--r--indra/newview/llappearancemgr.cpp129
-rw-r--r--indra/newview/llappearancemgr.h3
-rw-r--r--indra/newview/llappviewer.cpp467
-rw-r--r--indra/newview/llappviewer.h22
-rw-r--r--indra/newview/llappviewerlinux.cpp16
-rw-r--r--indra/newview/llappviewermacosx-objc.h3
-rw-r--r--indra/newview/llappviewermacosx-objc.mm51
-rw-r--r--indra/newview/llappviewermacosx.cpp5
-rw-r--r--indra/newview/llappviewerwin32.cpp172
-rw-r--r--indra/newview/llappviewerwin32.h1
-rw-r--r--indra/newview/llautoreplace.cpp5
-rw-r--r--indra/newview/llavatarlist.cpp85
-rw-r--r--indra/newview/llavatarlist.h9
-rw-r--r--indra/newview/llavatarlistitem.cpp18
-rw-r--r--indra/newview/llavatarlistitem.h3
-rw-r--r--indra/newview/llchathistory.cpp28
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp19
-rw-r--r--indra/newview/llcontrolavatar.cpp16
-rw-r--r--indra/newview/llconversationlog.cpp22
-rw-r--r--indra/newview/llconversationmodel.cpp20
-rw-r--r--indra/newview/llconversationmodel.h3
-rw-r--r--indra/newview/llconversationview.cpp11
-rw-r--r--indra/newview/llconversationview.h3
-rw-r--r--indra/newview/lldrawpool.h4
-rw-r--r--indra/newview/lldrawpoolavatar.cpp2
-rw-r--r--indra/newview/lldrawpoolbump.cpp13
-rw-r--r--indra/newview/lldrawpoolterrain.h1
-rw-r--r--indra/newview/lldrawpoolwater.cpp5
-rw-r--r--indra/newview/lldynamictexture.cpp4
-rw-r--r--indra/newview/llenvironment.cpp1
-rw-r--r--indra/newview/lleventpoll.cpp64
-rw-r--r--indra/newview/lleventpoll.h25
-rw-r--r--indra/newview/llface.cpp7
-rw-r--r--indra/newview/llfasttimerview.cpp9
-rw-r--r--indra/newview/llfeaturemanager.cpp47
-rw-r--r--indra/newview/llfeaturemanager.h2
-rw-r--r--indra/newview/llfetchedgltfmaterial.cpp8
-rw-r--r--indra/newview/llfetchedgltfmaterial.h1
-rw-r--r--indra/newview/llfilepicker.cpp16
-rw-r--r--indra/newview/llfilepicker_mac.mm118
-rw-r--r--indra/newview/llfloaterautoreplacesettings.cpp51
-rw-r--r--indra/newview/llfloaterautoreplacesettings.h2
-rw-r--r--indra/newview/llfloateravatar.cpp61
-rw-r--r--indra/newview/llfloateravatar.h46
-rw-r--r--indra/newview/llfloateravatarwelcomepack.cpp64
-rw-r--r--indra/newview/llfloateravatarwelcomepack.h45
-rw-r--r--indra/newview/llfloaterbulkpermission.cpp16
-rw-r--r--indra/newview/llfloaterbulkpermission.h7
-rw-r--r--indra/newview/llfloaterbvhpreview.cpp11
-rw-r--r--indra/newview/llfloaterbvhpreview.h4
-rw-r--r--indra/newview/llfloaterchatmentionpicker.cpp184
-rw-r--r--indra/newview/llfloaterchatmentionpicker.h58
-rw-r--r--indra/newview/llfloaterdestinations.cpp12
-rw-r--r--indra/newview/llfloaterdisplayname.cpp22
-rw-r--r--indra/newview/llfloatereditenvironmentbase.h3
-rw-r--r--indra/newview/llfloatereditextdaycycle.cpp2
-rw-r--r--indra/newview/llfloateremojipicker.cpp13
-rw-r--r--indra/newview/llfloaterenvironmentadjust.cpp29
-rw-r--r--indra/newview/llfloaterfixedenvironment.cpp13
-rw-r--r--indra/newview/llfloaterimagepreview.cpp126
-rw-r--r--indra/newview/llfloaterimagepreview.h4
-rw-r--r--indra/newview/llfloaterimcontainer.cpp19
-rw-r--r--indra/newview/llfloaterimcontainer.h2
-rw-r--r--indra/newview/llfloaterimnearbychat.cpp5
-rw-r--r--indra/newview/llfloaterimnearbychatlistener.cpp34
-rw-r--r--indra/newview/llfloaterimnearbychatlistener.h6
-rw-r--r--indra/newview/llfloaterimsession.cpp2
-rw-r--r--indra/newview/llfloaterimsessiontab.cpp108
-rw-r--r--indra/newview/llfloaterimsessiontab.h5
-rw-r--r--indra/newview/llfloaterinspect.cpp3
-rw-r--r--indra/newview/llfloaterinventorysettings.cpp28
-rw-r--r--indra/newview/llfloaterinventorysettings.h5
-rw-r--r--indra/newview/llfloaterjoystick.cpp2
-rw-r--r--indra/newview/llfloaterland.cpp3
-rw-r--r--indra/newview/llfloatermarketplace.cpp70
-rw-r--r--indra/newview/llfloatermarketplace.h46
-rw-r--r--indra/newview/llfloatermediasettings.cpp9
-rw-r--r--indra/newview/llfloatermediasettings.h2
-rw-r--r--indra/newview/llfloatermodelpreview.cpp138
-rw-r--r--indra/newview/llfloatermodelpreview.h11
-rw-r--r--indra/newview/llfloatermyenvironment.cpp89
-rw-r--r--indra/newview/llfloatermyenvironment.h3
-rw-r--r--indra/newview/llfloaternamedesc.cpp32
-rw-r--r--indra/newview/llfloaternamedesc.h3
-rw-r--r--indra/newview/llfloaternewfeaturenotification.cpp26
-rw-r--r--indra/newview/llfloaterobjectweights.cpp96
-rw-r--r--indra/newview/llfloaterobjectweights.h19
-rw-r--r--indra/newview/llfloaterperformance.h1
-rw-r--r--indra/newview/llfloaterpreference.cpp244
-rw-r--r--indra/newview/llfloaterpreference.h25
-rw-r--r--indra/newview/llfloaterpreferencesgraphicsadvanced.cpp12
-rw-r--r--indra/newview/llfloaterpreferencesgraphicsadvanced.h2
-rw-r--r--indra/newview/llfloaterregioninfo.cpp39
-rw-r--r--indra/newview/llfloaterregioninfo.h1
-rw-r--r--indra/newview/llfloatersearch.cpp188
-rw-r--r--indra/newview/llfloatersearch.h82
-rw-r--r--indra/newview/llfloatersettingsdebug.cpp5
-rw-r--r--indra/newview/llfloatersettingsdebug.h1
-rw-r--r--indra/newview/llfloatersnapshot.cpp44
-rw-r--r--indra/newview/llfloatersnapshot.h3
-rw-r--r--indra/newview/llfloatertoybox.cpp2
-rw-r--r--indra/newview/llfloateruipreview.cpp5
-rw-r--r--indra/newview/llfloaterurlentry.cpp10
-rw-r--r--indra/newview/llfloaterwebcontent.cpp2
-rwxr-xr-xindra/newview/llfloaterworldmap.cpp342
-rw-r--r--indra/newview/llfloaterworldmap.h17
-rw-r--r--indra/newview/llfolderviewmodelinventory.cpp30
-rw-r--r--indra/newview/llfolderviewmodelinventory.h2
-rw-r--r--indra/newview/llglsandbox.cpp21
-rw-r--r--indra/newview/llgltffolderitem.h5
-rw-r--r--indra/newview/llgltfmateriallist.cpp11
-rw-r--r--indra/newview/llgltfmaterialpreviewmgr.cpp43
-rw-r--r--indra/newview/llgroupactions.cpp2
-rw-r--r--indra/newview/llheroprobemanager.cpp11
-rw-r--r--indra/newview/llhudeffectlookat.cpp39
-rw-r--r--indra/newview/llhudeffectpointat.cpp14
-rw-r--r--indra/newview/llhudeffectresetskeleton.cpp220
-rw-r--r--indra/newview/llhudeffectresetskeleton.h60
-rw-r--r--indra/newview/llhudobject.cpp4
-rw-r--r--indra/newview/llhudobject.h3
-rw-r--r--indra/newview/llhudtext.cpp4
-rw-r--r--indra/newview/llimprocessing.cpp53
-rw-r--r--indra/newview/llimprocessing.h1
-rw-r--r--indra/newview/llimview.cpp52
-rw-r--r--indra/newview/llimview.h4
-rw-r--r--indra/newview/llinspecttexture.cpp13
-rw-r--r--indra/newview/llinventorybridge.cpp491
-rw-r--r--indra/newview/llinventorybridge.h48
-rw-r--r--indra/newview/llinventoryfilter.cpp85
-rw-r--r--indra/newview/llinventoryfilter.h17
-rw-r--r--indra/newview/llinventoryfunctions.cpp396
-rw-r--r--indra/newview/llinventoryfunctions.h57
-rw-r--r--indra/newview/llinventorygallery.cpp191
-rw-r--r--indra/newview/llinventorygallery.h5
-rw-r--r--indra/newview/llinventorygallerymenu.cpp132
-rw-r--r--indra/newview/llinventorygallerymenu.h1
-rw-r--r--indra/newview/llinventoryitemslist.cpp87
-rw-r--r--indra/newview/llinventoryitemslist.h13
-rw-r--r--indra/newview/llinventorylistener.cpp309
-rw-r--r--indra/newview/llinventorylistener.h48
-rw-r--r--indra/newview/llinventorylistitem.cpp56
-rw-r--r--indra/newview/llinventorylistitem.h6
-rw-r--r--indra/newview/llinventorymodel.cpp193
-rw-r--r--indra/newview/llinventoryobserver.cpp29
-rw-r--r--indra/newview/llinventoryobserver.h19
-rw-r--r--indra/newview/llinventorypanel.cpp448
-rw-r--r--indra/newview/llinventorypanel.h10
-rw-r--r--indra/newview/lllocalbitmaps.cpp27
-rw-r--r--indra/newview/lllocalbitmaps.h1
-rw-r--r--indra/newview/lllocalgltfmaterials.cpp2
-rw-r--r--indra/newview/lllogchat.cpp97
-rw-r--r--indra/newview/lllogininstance.cpp29
-rw-r--r--indra/newview/lllogininstance.h2
-rw-r--r--indra/newview/llmachineid.cpp4
-rw-r--r--indra/newview/llmaterialeditor.cpp117
-rw-r--r--indra/newview/llmaterialeditor.h14
-rw-r--r--indra/newview/llmediactrl.cpp10
-rw-r--r--indra/newview/llmediactrl.h1
-rw-r--r--indra/newview/llmeshrepository.cpp899
-rw-r--r--indra/newview/llmeshrepository.h139
-rw-r--r--indra/newview/llmodelpreview.cpp243
-rw-r--r--indra/newview/llmodelpreview.h7
-rw-r--r--indra/newview/llmoveview.cpp2
-rw-r--r--indra/newview/llmoveview.h1
-rw-r--r--indra/newview/llmutelist.cpp50
-rw-r--r--indra/newview/llmutelist.h14
-rw-r--r--indra/newview/llnotificationlistitem.cpp21
-rw-r--r--indra/newview/lloutfitgallery.cpp237
-rw-r--r--indra/newview/lloutfitgallery.h36
-rw-r--r--indra/newview/lloutfitslist.cpp416
-rw-r--r--indra/newview/lloutfitslist.h66
-rw-r--r--indra/newview/llpanelappearancetab.h7
-rw-r--r--indra/newview/llpanelemojicomplete.cpp1
-rw-r--r--indra/newview/llpanelface.cpp884
-rw-r--r--indra/newview/llpanelface.h9
-rw-r--r--indra/newview/llpanelgroupbulk.cpp62
-rw-r--r--indra/newview/llpanelgroupbulkimpl.h4
-rw-r--r--indra/newview/llpanelgroupcreate.cpp1
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp1
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp4
-rw-r--r--indra/newview/llpanelmaininventory.cpp263
-rw-r--r--indra/newview/llpanelobject.cpp24
-rw-r--r--indra/newview/llpanelobjectinventory.cpp32
-rw-r--r--indra/newview/llpaneloutfitedit.cpp4
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp67
-rw-r--r--indra/newview/llpaneloutfitsinventory.h22
-rw-r--r--indra/newview/llpanelpeople.cpp8
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp11
-rw-r--r--indra/newview/llpanelpermissions.cpp17
-rw-r--r--indra/newview/llpanelpermissions.h1
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp4
-rw-r--r--indra/newview/llpanelprofile.cpp5
-rw-r--r--indra/newview/llpanelprofileclassifieds.h16
-rw-r--r--indra/newview/llpanelprofilepicks.cpp42
-rw-r--r--indra/newview/llpanelprofilepicks.h10
-rw-r--r--indra/newview/llpanelsnapshot.cpp12
-rw-r--r--indra/newview/llpanelsnapshotinventory.cpp128
-rw-r--r--indra/newview/llpanelsnapshotlocal.cpp20
-rw-r--r--indra/newview/llpanelsnapshotoptions.cpp37
-rw-r--r--indra/newview/llpanelsnapshotpostcard.cpp20
-rw-r--r--indra/newview/llpanelsnapshotprofile.cpp18
-rw-r--r--indra/newview/llpanelteleporthistory.cpp15
-rw-r--r--indra/newview/llpanelvoicedevicesettings.cpp29
-rw-r--r--indra/newview/llpanelvolume.cpp48
-rw-r--r--indra/newview/llpanelwearing.cpp28
-rw-r--r--indra/newview/llpanelwearing.h6
-rw-r--r--indra/newview/llphysicsmotion.cpp21
-rw-r--r--indra/newview/llpreviewscript.cpp5
-rw-r--r--indra/newview/llpreviewscript.h5
-rw-r--r--indra/newview/llprogressview.cpp132
-rw-r--r--indra/newview/llprogressview.h19
-rw-r--r--indra/newview/llreflectionmap.cpp2
-rw-r--r--indra/newview/llreflectionmap.h8
-rw-r--r--indra/newview/llreflectionmapmanager.cpp361
-rw-r--r--indra/newview/llreflectionmapmanager.h13
-rw-r--r--indra/newview/llscriptfloater.cpp34
-rw-r--r--indra/newview/llselectmgr.cpp162
-rw-r--r--indra/newview/llselectmgr.h3
-rw-r--r--indra/newview/llsettingspicker.cpp6
-rw-r--r--indra/newview/llsidepanelappearance.cpp9
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp24
-rw-r--r--indra/newview/llsidepaneliteminfo.h2
-rw-r--r--indra/newview/llskinningutil.cpp13
-rw-r--r--indra/newview/llsky.h1
-rw-r--r--indra/newview/llslurl.cpp6
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp8
-rw-r--r--indra/newview/llspatialpartition.cpp17
-rw-r--r--indra/newview/llspeakers.cpp4
-rw-r--r--indra/newview/llspeakingindicatormanager.cpp13
-rw-r--r--indra/newview/llsprite.h2
-rw-r--r--indra/newview/llstartup.cpp99
-rw-r--r--indra/newview/llstatusbar.cpp93
-rw-r--r--indra/newview/llstatusbar.h15
-rw-r--r--indra/newview/llsurface.cpp91
-rw-r--r--indra/newview/llsurface.h15
-rw-r--r--indra/newview/llsurfacepatch.cpp8
-rw-r--r--indra/newview/llsurfacepatch.h2
-rw-r--r--indra/newview/llteleporthistorystorage.cpp6
-rw-r--r--indra/newview/llterrainpaintmap.cpp10
-rw-r--r--indra/newview/lltexturecache.cpp45
-rw-r--r--indra/newview/lltexturectrl.cpp150
-rw-r--r--indra/newview/lltexturectrl.h9
-rw-r--r--indra/newview/lltexturefetch.cpp57
-rw-r--r--indra/newview/lltexturefetch.h3
-rw-r--r--indra/newview/lltextureview.cpp3
-rw-r--r--indra/newview/llthumbnailctrl.cpp10
-rw-r--r--indra/newview/lltoast.cpp2
-rw-r--r--indra/newview/lltoastgroupnotifypanel.cpp19
-rw-r--r--indra/newview/lltoolbarview.cpp29
-rw-r--r--indra/newview/lltoolbarview.h2
-rw-r--r--indra/newview/lltooldraganddrop.cpp281
-rw-r--r--indra/newview/lltoolpie.cpp149
-rw-r--r--indra/newview/lltoolpie.h16
-rw-r--r--indra/newview/llviewerassetupload.cpp25
-rw-r--r--indra/newview/llviewerassetupload.h5
-rw-r--r--indra/newview/llviewerattachmenu.cpp4
-rw-r--r--indra/newview/llvieweraudio.cpp5
-rw-r--r--indra/newview/llviewercamera.cpp97
-rw-r--r--indra/newview/llviewercamera.h20
-rw-r--r--indra/newview/llviewerchat.cpp8
-rw-r--r--indra/newview/llviewercontrol.cpp26
-rw-r--r--indra/newview/llviewerdisplay.cpp154
-rw-r--r--indra/newview/llviewerfloaterreg.cpp9
-rw-r--r--indra/newview/llviewerinventory.cpp39
-rw-r--r--indra/newview/llviewerinventory.h6
-rw-r--r--indra/newview/llviewerjoystick.cpp27
-rw-r--r--indra/newview/llviewermedia.cpp247
-rw-r--r--indra/newview/llviewermedia.h19
-rw-r--r--indra/newview/llviewermedia_streamingaudio.cpp21
-rw-r--r--indra/newview/llviewermenu.cpp141
-rw-r--r--indra/newview/llviewermenu.h2
-rw-r--r--indra/newview/llviewermenufile.cpp216
-rw-r--r--indra/newview/llviewermenufile.h11
-rw-r--r--indra/newview/llviewermessage.cpp86
-rw-r--r--indra/newview/llviewernetwork.cpp4
-rw-r--r--indra/newview/llviewerobject.cpp144
-rw-r--r--indra/newview/llviewerobject.h8
-rw-r--r--indra/newview/llviewerobjectlist.cpp4
-rw-r--r--indra/newview/llviewerparcelmgr.cpp36
-rw-r--r--indra/newview/llviewerparcelmgr.h6
-rwxr-xr-xindra/newview/llviewerparceloverlay.cpp76
-rw-r--r--indra/newview/llviewerparceloverlay.h13
-rwxr-xr-xindra/newview/llviewerregion.cpp7
-rw-r--r--indra/newview/llviewerregion.h2
-rw-r--r--indra/newview/llviewershadermgr.cpp196
-rw-r--r--indra/newview/llviewershadermgr.h10
-rw-r--r--indra/newview/llviewerstats.cpp136
-rw-r--r--indra/newview/llviewerstats.h23
-rw-r--r--indra/newview/llviewertexture.cpp113
-rw-r--r--indra/newview/llviewertexture.h5
-rw-r--r--indra/newview/llviewertexturelist.cpp29
-rw-r--r--indra/newview/llviewerthrottle.cpp11
-rw-r--r--indra/newview/llviewerthrottle.h1
-rw-r--r--indra/newview/llviewerwindow.cpp193
-rw-r--r--indra/newview/llviewerwindow.h13
-rw-r--r--indra/newview/llviewerwindowlistener.cpp2
-rw-r--r--indra/newview/llvoavatar.cpp314
-rw-r--r--indra/newview/llvoavatar.h26
-rw-r--r--indra/newview/llvoavatarself.cpp22
-rw-r--r--indra/newview/llvoavatarself.h4
-rw-r--r--indra/newview/llvocache.cpp21
-rw-r--r--indra/newview/llvoicecallhandler.cpp5
-rw-r--r--indra/newview/llvoicechannel.cpp10
-rw-r--r--indra/newview/llvoicechannel.h1
-rw-r--r--indra/newview/llvoiceclient.cpp93
-rw-r--r--indra/newview/llvoicevivox.cpp1
-rw-r--r--indra/newview/llvoicewebrtc.cpp331
-rw-r--r--indra/newview/llvoicewebrtc.h12
-rw-r--r--indra/newview/llvosurfacepatch.cpp51
-rw-r--r--indra/newview/llvosurfacepatch.h4
-rw-r--r--indra/newview/llvovolume.cpp71
-rw-r--r--indra/newview/llwatchdog.cpp34
-rw-r--r--indra/newview/llwatchdog.h12
-rw-r--r--indra/newview/llwearableitemslist.cpp36
-rw-r--r--indra/newview/llwearableitemslist.h11
-rw-r--r--indra/newview/llworld.cpp4
-rw-r--r--indra/newview/llworldmap.cpp18
-rw-r--r--indra/newview/mpfloatertuning.cpp42
-rw-r--r--indra/newview/mpfloatertuning.h16
-rw-r--r--indra/newview/pipeline.cpp1161
-rw-r--r--indra/newview/pipeline.h38
-rw-r--r--indra/newview/res/ll_icon_small.icobin0 -> 153296 bytes
-rw-r--r--indra/newview/res/resource.h1
-rwxr-xr-xindra/newview/res/viewerRes.rc13
-rw-r--r--indra/newview/rlvdefines.h9
-rw-r--r--indra/newview/rlvhandler.cpp211
-rw-r--r--indra/newview/rlvhelper.cpp16
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Cone_Selected.pngbin4891 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Cube_Selected.pngbin4797 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Cylinder_Selected.pngbin4759 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Grass_Selected.pngbin5098 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Hemi_Cone_Selected.pngbin4855 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder_Selected.pngbin4775 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere_Selected.pngbin5010 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Prism_Selected.pngbin4804 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Pyramid_Selected.pngbin4912 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Ring_Selected.pngbin5061 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Sphere_Selected.pngbin5329 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Tetrahedron_Selected.pngbin4888 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Torus_Selected.pngbin5139 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Tree_Selected.pngbin5158 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/build/Object_Tube_Selected.pngbin4871 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/cloud-particle.j2cbin4049 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/default_land_picture.pngbin0 -> 67335 bytes
-rw-r--r--indra/newview/skins/contrast/textures/default_profile_picture.pngbin0 -> 63511 bytes
-rw-r--r--indra/newview/skins/contrast/textures/icons/SL_Logo.pngbin5631 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/icons/hand.pngbin5338 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/icons/see_on_map.pngbin4987 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/icons/see_them_on_map.pngbin4998 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/icons/see_them_online.pngbin4810 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/navbar/Info_Off.pngbin608 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/navbar/Info_Over.pngbin622 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/navbar/Info_Press.pngbin605 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/textures.xml934
-rw-r--r--indra/newview/skins/contrast/textures/widgets/track_control_sphere.pngbin10854 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast_gold/colors.xml1001
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Center.pngbin0 -> 4436 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_In.pngbin0 -> 4711 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Out.pngbin0 -> 8388 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Center.pngbin0 -> 4521 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_In.pngbin0 -> 4521 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Out.pngbin0 -> 5711 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/ChatBarHandle.pngbin0 -> 260 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/DownArrow.pngbin0 -> 139 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_Off.pngbin0 -> 354 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_On.pngbin0 -> 5138 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_Off.pngbin0 -> 51706 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_On.pngbin0 -> 6254 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_Off.pngbin0 -> 322 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_On.pngbin0 -> 5102 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_Off.pngbin0 -> 51016 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_On.pngbin0 -> 6441 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_Off.pngbin0 -> 49845 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_On.pngbin0 -> 6213 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_Off.pngbin0 -> 431 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_On.pngbin0 -> 5237 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_Off.pngbin0 -> 432 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_On.pngbin0 -> 5200 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_Off.pngbin0 -> 53763 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_On.pngbin0 -> 6493 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_Off.pngbin0 -> 55000 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_On.pngbin0 -> 51183 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/Unread_Chiclet.pngbin0 -> 334 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl1.pngbin0 -> 5160 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl2.pngbin0 -> 5270 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl3.pngbin0 -> 607 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Off.pngbin0 -> 461 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_On.pngbin0 -> 5022 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit.pngbin0 -> 5762 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit_Selected.pngbin0 -> 5762 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/cloud-particle.pngbin0 -> 44778 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Off.pngbin0 -> 175 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Press.pngbin0 -> 175 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Off.pngbin0 -> 169 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Press.pngbin0 -> 169 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Accordion_Off.pngbin0 -> 3868 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Accordion_Over.pngbin0 -> 3868 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Accordion_Press.pngbin0 -> 3868 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Accordion_Selected.pngbin0 -> 3939 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Container.pngbin0 -> 673 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Off.pngbin0 -> 4922 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Selected.pngbin0 -> 249 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle.pngbin0 -> 168 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Off.pngbin0 -> 4430 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Selected.pngbin0 -> 168 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Right.pngbin0 -> 258 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Flashing.pngbin0 -> 252 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Off.pngbin0 -> 4966 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Selected.pngbin0 -> 258 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Flash.pngbin0 -> 276 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Off.pngbin0 -> 4491 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Over.pngbin0 -> 4491 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Selected.pngbin0 -> 283 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Flash.pngbin0 -> 316 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Off.pngbin0 -> 3979 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Over.pngbin0 -> 3980 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Selected.pngbin0 -> 212 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Flash.pngbin0 -> 428 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Off.pngbin0 -> 3632 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Over.pngbin0 -> 3632 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Selected.pngbin0 -> 272 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/default_land_picture.j2cbin0 -> 37622 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/default_land_picture.pngbin0 -> 67335 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/default_profile_picture.j2cbin0 -> 27739 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/default_profile_picture.pngbin0 -> 63511 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/AddItem_Disabled.pngbin0 -> 403 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/AddItem_Off.pngbin0 -> 397 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/AddItem_Press.pngbin0 -> 392 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/AudioMute_Off.pngbin0 -> 800 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/AudioMute_Over.pngbin0 -> 787 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Audio_Off.pngbin0 -> 596 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Audio_Press.pngbin0 -> 585 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Condense.pngbin0 -> 465 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Expand.pngbin0 -> 427 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Info.pngbin0 -> 535 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Info_Over.pngbin0 -> 5316 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Info_Small.pngbin0 -> 478 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/MP_Logo.pngbin0 -> 4838 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/MinusItem_Disabled.pngbin0 -> 370 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/MinusItem_Off.pngbin0 -> 377 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/MinusItem_Press.pngbin0 -> 373 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Dark.pngbin0 -> 490 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Light.pngbin0 -> 488 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Dark.pngbin0 -> 495 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Light.pngbin0 -> 492 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/Parcel_R_Light.pngbin0 -> 487 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/ProgressLarge_8.pngbin0 -> 6223 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/VoiceMute_Off.pngbin0 -> 753 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl1.pngbin0 -> 5160 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl2.pngbin0 -> 5270 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl3.pngbin0 -> 952 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Off.pngbin0 -> 583 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/VoicePTT_On.pngbin0 -> 5022 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/add_icon.pngbin0 -> 691 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/back_arrow_off.pngbin0 -> 5862 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/back_arrow_over.pngbin0 -> 6119 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/back_arrow_press.pngbin0 -> 6223 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/check_mark.pngbin0 -> 5179 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/see_me_online.pngbin0 -> 4672 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/icons/unknown_icon.pngbin0 -> 1177 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/megapahit/icon_group.pngbin0 -> 1479 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/megapahit/icon_land_auction.pngbin0 -> 1464 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/megapahit/icon_land_forsale.pngbin0 -> 1485 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/megapahit/icon_place.pngbin0 -> 1584 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/model_wizard/progress_bar_bg.pngbin0 -> 556 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/model_wizard/progress_light.pngbin0 -> 4870 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Over.pngbin0 -> 4935 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Press.pngbin0 -> 4937 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Active.pngbin0 -> 5485 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Off.pngbin0 -> 444 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Over.pngbin0 -> 5241 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Press.pngbin0 -> 616 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG.pngbin0 -> 6334 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoFav_Bevel.pngbin0 -> 5658 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoNav_Bevel.pngbin0 -> 5130 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/Row_Selection.pngbin0 -> 3782 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/navbar/separator.pngbin0 -> 330 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/textures.xml934
-rw-r--r--indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_bottom.pngbin0 -> 195 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_left.pngbin0 -> 948 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_right.pngbin0 -> 949 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting.pngbin0 -> 3044 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting_selected.pngbin0 -> 4986 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Arrow_Down.pngbin0 -> 517 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Arrow_Left.pngbin0 -> 485 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Arrow_Right.pngbin0 -> 487 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Down.pngbin0 -> 478 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Left.pngbin0 -> 414 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Right.pngbin0 -> 414 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Up.pngbin0 -> 493 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Arrow_Up.pngbin0 -> 528 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Badge_Background.pngbin0 -> 1266 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Badge_Border.pngbin0 -> 1392 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Disabled.pngbin0 -> 1997 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Off.pngbin0 -> 1997 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Over.pngbin0 -> 1997 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Press.pngbin0 -> 2110 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.pngbin0 -> 796 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Off.pngbin0 -> 6107 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Over.pngbin0 -> 6229 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Press.pngbin0 -> 6352 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Disabled.pngbin0 -> 588 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Off.pngbin0 -> 4081 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Over.pngbin0 -> 4083 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Press.pngbin0 -> 4081 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Disabled.pngbin0 -> 470 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Off.pngbin0 -> 480 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On.pngbin0 -> 635 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Disabled.pngbin0 -> 621 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Press.pngbin0 -> 647 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Press.pngbin0 -> 515 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Disabled.pngbin0 -> 575 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Hover.pngbin0 -> 552 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Off.pngbin0 -> 583 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ComboButton_On.pngbin0 -> 5055 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Selected.pngbin0 -> 5846 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpOff.pngbin0 -> 553 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpSelected.pngbin0 -> 5630 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/DisclosureArrow_Opened_Off.pngbin0 -> 392 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/DropDown.pngbin0 -> 465 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/DropDown_Disabled.pngbin0 -> 472 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/DropDown_Off.pngbin0 -> 4363 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/DropDown_On.pngbin0 -> 489 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/DropDown_Press.pngbin0 -> 489 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/DropTarget.pngbin0 -> 604 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Error_Tag_Background.pngbin0 -> 1317 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Alert.pngbin0 -> 68647 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Background.pngbin0 -> 130520 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ListItem_Over.pngbin0 -> 4786 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ListItem_Select.pngbin0 -> 4795 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Off.pngbin0 -> 5696 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Selected.pngbin0 -> 5735 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Marketplace_Dropzone_Background.pngbin0 -> 639 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Background.pngbin0 -> 948 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Border.pngbin0 -> 963 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ProgressBar.pngbin0 -> 160 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ProgressBarSolid.pngbin0 -> 378 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ProgressTrack.pngbin0 -> 399 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Disabled.pngbin0 -> 569 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login.pngbin0 -> 1437 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Over.pngbin0 -> 1516 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Pressed.pngbin0 -> 1493 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Off.pngbin0 -> 3602 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_On.pngbin0 -> 198 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_On_Selected.pngbin0 -> 198 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Over.pngbin0 -> 4011 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Press.pngbin0 -> 198 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected.pngbin0 -> 198 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Disabled.pngbin0 -> 4008 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Press.pngbin0 -> 198 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Disabled.pngbin0 -> 606 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Off.pngbin0 -> 628 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On.pngbin0 -> 679 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Disabled.pngbin0 -> 652 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Press.pngbin0 -> 688 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Press.pngbin0 -> 666 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down.pngbin0 -> 443 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Opaque.pngbin0 -> 470 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Over_Opaque.pngbin0 -> 445 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left.pngbin0 -> 454 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Opaque.pngbin0 -> 418 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Over_Opaque.pngbin0 -> 431 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right.pngbin0 -> 445 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Opaque.pngbin0 -> 420 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Over_Opaque.pngbin0 -> 429 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up.pngbin0 -> 465 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Opaque.pngbin0 -> 458 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Over_Opaque.pngbin0 -> 468 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Horiz.pngbin0 -> 509 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Vert.pngbin0 -> 494 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Horiz.pngbin0 -> 364 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Vert.pngbin0 -> 361 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Disabled.pngbin0 -> 513 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Off.pngbin0 -> 521 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Over.pngbin0 -> 527 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Press.pngbin0 -> 576 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected.pngbin0 -> 576 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.pngbin0 -> 225 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Over.pngbin0 -> 225 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Press.pngbin0 -> 225 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Disabled.pngbin0 -> 454 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected.pngbin0 -> 524 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.pngbin0 -> 119 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.pngbin0 -> 119 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Disabled.pngbin0 -> 525 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Off.pngbin0 -> 531 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_On_Selected.pngbin0 -> 229 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Over.pngbin0 -> 539 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Press.pngbin0 -> 585 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected.pngbin0 -> 585 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.pngbin0 -> 4051 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Press.pngbin0 -> 224 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Disabled.pngbin0 -> 592 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Off.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Press.pngbin0 -> 582 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Horiz.pngbin0 -> 420 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Vert.pngbin0 -> 417 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Off.pngbin0 -> 4901 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Press.pngbin0 -> 6120 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Off.pngbin0 -> 4909 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Press.pngbin0 -> 6143 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/TextField_Active.pngbin0 -> 4359 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/TextField_Disabled.pngbin0 -> 4356 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/TextField_Off.pngbin0 -> 4359 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Active.pngbin0 -> 903 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Disabled.pngbin0 -> 886 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Highlight.pngbin0 -> 3250 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Off.pngbin0 -> 901 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/Tooltip.pngbin0 -> 404 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/bevel_background.pngbin0 -> 451 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/buy_off.pngbin0 -> 4845 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/buy_over.pngbin0 -> 4856 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/buy_press.pngbin0 -> 4909 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/horizontal_drag_handle.pngbin0 -> 389 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/jump_left_in.pngbin0 -> 434 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/jump_left_out.pngbin0 -> 422 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/jump_right_in.pngbin0 -> 426 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/jump_right_out.pngbin0 -> 423 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/widgets/vertical_drag_handle.png (renamed from indra/newview/skins/contrast/textures/widgets/vertical_drag_handle.png)bin396 -> 396 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Dragbar.pngbin0 -> 503 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Flyout_Left.pngbin0 -> 421 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Flyout_Pointer.pngbin0 -> 436 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Flyout_Right.pngbin0 -> 423 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Foreground.pngbin0 -> 402 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Press.pngbin0 -> 416 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Toast.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Foreground.pngbin0 -> 413 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Press.pngbin0 -> 428 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Gear.pngbin0 -> 4355 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Background.pngbin0 -> 515 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Foreground.pngbin0 -> 516 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Press.pngbin0 -> 510 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Foreground.pngbin0 -> 501 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Press.pngbin0 -> 501 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Foreground.pngbin0 -> 351 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Press.pngbin0 -> 351 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Foreground.pngbin0 -> 450 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Press.pngbin0 -> 456 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Icon_Undock_Foreground.pngbin0 -> 415 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Inspector_Background.pngbin0 -> 462 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Inspector_Hover.pngbin0 -> 645 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Inspector_I.pngbin0 -> 5316 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Resize_Corner.pngbin0 -> 4679 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Toast_Background.pngbin0 -> 460 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Toast_CloseBtn.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Toast_Over.pngbin0 -> 647 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Volume_Background.pngbin0 -> 1652 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Wearables_Divider.pngbin0 -> 311 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Window_Background.pngbin0 -> 7131 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/Window_Foreground.pngbin0 -> 7087 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/first_login_image.jpgbin0 -> 398853 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/hint_arrow_down.pngbin0 -> 623 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/hint_arrow_left.pngbin0 -> 532 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/hint_arrow_lower_left.pngbin0 -> 540 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/hint_arrow_right.pngbin0 -> 563 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/hint_arrow_up.pngbin0 -> 637 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/hint_background.pngbin0 -> 1582 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/login_mp_logo.pngbin0 -> 23425 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/login_mp_logo_small.pngbin0 -> 17032 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/login_sl_logo.pngbin0 -> 6180 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/login_sl_logo_small.pngbin0 -> 5204 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/startup_logo.pngbin0 -> 3446 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/windows/yellow_gradient.pngbin0 -> 1733 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/world/CameraDragDot.pngbin0 -> 563 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/world/NoEntryLines.pngbin0 -> 4829 bytes
-rw-r--r--indra/newview/skins/contrast_gold/textures/world/NoEntryPassLines.pngbin0 -> 5263 bytes
-rw-r--r--indra/newview/skins/contrast_gold/xui/en/panel_progress.xml201
-rw-r--r--indra/newview/skins/contrast_gold/xui/en/widgets/progress_bar.xml12
-rw-r--r--indra/newview/skins/default/colors.xml17
-rw-r--r--indra/newview/skins/default/textures/3p_icons/fmod_logo.pngbin0 -> 14486 bytes
-rw-r--r--indra/newview/skins/default/textures/3p_icons/havok_logo.pngbin0 -> 41488 bytes
-rw-r--r--indra/newview/skins/default/textures/cloud-particle.j2cbin4049 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/cloud-particle.pngbin0 -> 42378 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Icon_Pointer.pngbin0 -> 294 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.pngbin0 -> 620 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.pngbin0 -> 485 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/MP_Logo.pngbin1410 -> 1106 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/fps_button.pngbin0 -> 195 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_blue_bullet.pngbin0 -> 654 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_green_bullet.pngbin0 -> 626 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_help_bullet.pngbin0 -> 704 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_info_bullet.pngbin0 -> 490 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_red_bullet.pngbin0 -> 629 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.pngbin0 -> 648 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Info_Off.pngbin608 -> 2654 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Info_Over.pngbin622 -> 675 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Info_Press.pngbin605 -> 700 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml47
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Off.pngbin583 -> 5629 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_UpOff.pngbin553 -> 5555 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.pngbin513 -> 4673 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.pngbin521 -> 4680 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.pngbin527 -> 4619 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.pngbin576 -> 4786 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.pngbin576 -> 4786 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.pngbin4940 -> 4850 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.pngbin4778 -> 4388 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.pngbin5427 -> 5438 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.pngbin454 -> 4542 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.pngbin524 -> 4574 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.pngbin4678 -> 4601 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.pngbin5313 -> 5348 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.pngbin525 -> 4922 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.pngbin531 -> 4921 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.pngbin5687 -> 5725 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.pngbin539 -> 4844 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.pngbin585 -> 4926 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.pngbin585 -> 4926 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.pngbin5159 -> 5112 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.pngbin5687 -> 5725 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Down_Press.pngbin2150 -> 506 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/first_login_image.jpgbin398853 -> 104529 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_item_info.xml3
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml92
-rw-r--r--indra/newview/skins/default/xui/da/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/de/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_item_info.xml3
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml7782
-rw-r--r--indra/newview/skins/default/xui/de/teleport_strings.xml124
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml119
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml25
-rw-r--r--indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml31
-rw-r--r--indra/newview/skins/default/xui/en/floater_inspect.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml421
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_settings.xml181
-rw-r--r--indra/newview/skins/default/xui/en/floater_marketplace.xml201
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_preview.xml177
-rw-r--r--indra/newview/skins/default/xui/en/floater_mp_performance.xml115
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_new_feature_notification.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_object_weights.xml110
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml112
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_trash.xml2
-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_snapshot.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml53
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_slapp.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_web_content.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml18
-rw-r--r--indra/newview/skins/default/xui/en/menu_gallery_inventory.xml176
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml166
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml11
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_view_default.xml11
-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_outfit_gallery_sort.xml42
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_gear.xml63
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_list_sort.xml49
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_tab.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_settings_gear.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_objectim.xml7
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_parcel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml75
-rw-r--r--indra/newview/skins/default/xui/en/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/en/menu_wearing_tab.xml14
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml139
-rw-r--r--indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml1179
-rw-r--r--indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_login_first.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_gallery.xml48
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_list.xml46
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_wearing.xml33
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml21
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml47
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml25
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml122
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml31
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml79
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml2181
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml42
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml102
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml286
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_firstlife.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_pick.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_secondlife.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_progress.xml40
-rw-r--r--indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_settings_water.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_local.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_sound_devices.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_tools_texture.xml45
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml111
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml4
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml66
-rw-r--r--indra/newview/skins/default/xui/en/widgets/folder_view_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/xy_vector.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml7652
-rw-r--r--indra/newview/skins/default/xui/es/teleport_strings.xml120
-rw-r--r--indra/newview/skins/default/xui/fr/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml7784
-rw-r--r--indra/newview/skins/default/xui/fr/teleport_strings.xml122
-rw-r--r--indra/newview/skins/default/xui/it/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml7672
-rw-r--r--indra/newview/skins/default/xui/it/teleport_strings.xml118
-rw-r--r--indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_360capture.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/floater_add_payment_method.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_textures.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bumps.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_god_tools.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_incoming_call.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inspect.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_joystick.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/floater_lagmeter.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_land_holdings.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_lsl_guide.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_preview.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outgoing_call.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/floater_performance.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_settings_debug.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_snapshot.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_stats.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml64
-rw-r--r--indra/newview/skins/default/xui/ja/floater_top_objects.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_translation_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_ui_preview.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_url_entry.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_other.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_other.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_conversation.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_gesture_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_participant_list.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_profile_other.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_profile_self.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_settings_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_slurl.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_agent.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_http.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml58
-rw-r--r--indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml102
-rw-r--r--indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_universal.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_invite.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notices.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_roles.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmark_info.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_main_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_media.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notification_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_performance_huds.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_performance_preferences.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_postcard_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_colors.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_progress.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_covenant.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_environment.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_estate.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_terrain.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_settings_water.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_tools_texture.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_item_info.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_task_info.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml128
-rw-r--r--indra/newview/skins/default/xui/ja/teleport_strings.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_progress.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml26
-rw-r--r--indra/newview/skins/default/xui/pl/teleport_strings.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml7614
-rw-r--r--indra/newview/skins/default/xui/pt/teleport_strings.xml118
-rw-r--r--indra/newview/skins/default/xui/ru/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/strings.xml20
-rw-r--r--indra/newview/skins/default/xui/tr/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/strings.xml102
-rw-r--r--indra/newview/skins/default/xui/tr/teleport_strings.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_snapshot_options.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/strings.xml26
-rw-r--r--indra/newview/skins/default/xui/zh/teleport_strings.xml2
-rw-r--r--indra/newview/skins/gold/colors.xml1019
-rw-r--r--indra/newview/skins/gold/textures/3p_icons/fmod_logo.pngbin0 -> 14486 bytes
-rw-r--r--indra/newview/skins/gold/textures/3p_icons/havok_logo.pngbin0 -> 41488 bytes
-rw-r--r--indra/newview/skins/gold/textures/Blank.png (renamed from indra/newview/skins/contrast/textures/Blank.png)bin110 -> 110 bytes
-rw-r--r--indra/newview/skins/gold/textures/Rounded_Rect.png (renamed from indra/newview/skins/contrast/textures/Rounded_Rect.png)bin338 -> 338 bytes
-rw-r--r--indra/newview/skins/gold/textures/alpha_gradient.tga (renamed from indra/newview/skins/contrast/textures/alpha_gradient.tga)bin300 -> 300 bytes
-rw-r--r--indra/newview/skins/gold/textures/alpha_gradient_2d.j2c (renamed from indra/newview/skins/contrast/textures/alpha_gradient_2d.j2c)bin4325 -> 4325 bytes
-rw-r--r--indra/newview/skins/gold/textures/arrow_down.tga (renamed from indra/newview/skins/contrast/textures/arrow_down.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/arrow_up.tga (renamed from indra/newview/skins/contrast/textures/arrow_up.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.png (renamed from indra/newview/skins/contrast/textures/avatar_thumb_bkgrnd.png)bin17692 -> 17692 bytes
-rw-r--r--indra/newview/skins/gold/textures/badge_note.j2c (renamed from indra/newview/skins/contrast/textures/badge_note.j2c)bin2040 -> 2040 bytes
-rw-r--r--indra/newview/skins/gold/textures/badge_ok.j2c (renamed from indra/newview/skins/contrast/textures/badge_ok.j2c)bin2043 -> 2043 bytes
-rw-r--r--indra/newview/skins/gold/textures/badge_warn.j2c (renamed from indra/newview/skins/contrast/textures/badge_warn.j2c)bin2043 -> 2043 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Avatar_Off.png)bin527 -> 527 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_FreeCam_Off.png)bin365 -> 365 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Orbit_Off.png)bin532 -> 532 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Pan_Off.png)bin328 -> 328 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_Off.png)bin49285 -> 49285 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_On.png)bin50855 -> 50855 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Eye_Off.png)bin914 -> 914 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_Off.png)bin50394 -> 50394 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_On.png)bin50127 -> 50127 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_Off.png)bin49268 -> 49268 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_On.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_On.png)bin50209 -> 50209 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Center.pngbin0 -> 663 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_In.pngbin0 -> 935 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Out.pngbin0 -> 8388 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Center.pngbin0 -> 764 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_In.pngbin0 -> 764 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Out.pngbin0 -> 5711 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/ChatBarHandle.pngbin0 -> 260 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/DownArrow.pngbin0 -> 139 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Mouselook_View_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_Off.png)bin51189 -> 51189 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_On.png)bin53113 -> 53113 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Move_Fly_Off.png)bin609 -> 609 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Move_Run_Off.png)bin496 -> 496 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Move_Walk_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Move_Walk_Off.png)bin515 -> 515 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Backward_Off.pngbin0 -> 354 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Backward_On.pngbin0 -> 3473 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Down_Off.pngbin0 -> 51706 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Down_On.pngbin0 -> 4134 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Forward_Off.pngbin0 -> 322 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Forward_On.pngbin0 -> 412 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Left_Off.pngbin0 -> 51016 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Left_On.pngbin0 -> 328 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Right_Off.pngbin0 -> 49845 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Right_On.pngbin0 -> 340 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_Off.pngbin0 -> 431 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_On.pngbin0 -> 570 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_Off.pngbin0 -> 432 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_On.pngbin0 -> 512 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Up_Off.pngbin0 -> 53763 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Movement_Up_On.pngbin0 -> 380 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Notices_Unread.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Notices_Unread.png)bin436 -> 436 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Object_View_Off.pngbin0 -> 55000 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Object_View_On.pngbin0 -> 51183 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/PanOrbit_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/PanOrbit_Off.png)bin51539 -> 51539 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Snapshot_Off.png (renamed from indra/newview/skins/contrast/textures/bottomtray/Snapshot_Off.png)bin549 -> 549 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Unread_Chiclet.pngbin0 -> 334 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl1.pngbin0 -> 6625 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl2.pngbin0 -> 6879 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl3.pngbin0 -> 607 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/VoicePTT_Off.pngbin0 -> 461 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/VoicePTT_On.pngbin0 -> 5521 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/WellButton_Lit.pngbin0 -> 5762 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/WellButton_Lit_Selected.pngbin0 -> 5762 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Cone.png (renamed from indra/newview/skins/contrast/textures/build/Object_Cone.png)bin481 -> 481 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Cone_Selected.pngbin0 -> 5269 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Cube.png (renamed from indra/newview/skins/contrast/textures/build/Object_Cube.png)bin370 -> 370 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Cube_Selected.pngbin0 -> 4505 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Cylinder.png (renamed from indra/newview/skins/contrast/textures/build/Object_Cylinder.png)bin373 -> 373 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Cylinder_Selected.pngbin0 -> 4451 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Grass.png (renamed from indra/newview/skins/contrast/textures/build/Object_Grass.png)bin456 -> 456 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Grass_Selected.pngbin0 -> 7922 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Hemi_Cone.png (renamed from indra/newview/skins/contrast/textures/build/Object_Hemi_Cone.png)bin441 -> 441 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Hemi_Cone_Selected.pngbin0 -> 5001 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder.png (renamed from indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder.png)bin378 -> 378 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder_Selected.pngbin0 -> 4497 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Hemi_Sphere.png (renamed from indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere.png)bin545 -> 545 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Hemi_Sphere_Selected.pngbin0 -> 5224 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Prism.png (renamed from indra/newview/skins/contrast/textures/build/Object_Prism.png)bin395 -> 395 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Prism_Selected.pngbin0 -> 4747 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Pyramid.png (renamed from indra/newview/skins/contrast/textures/build/Object_Pyramid.png)bin452 -> 452 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Pyramid_Selected.pngbin0 -> 5137 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Ring.png (renamed from indra/newview/skins/contrast/textures/build/Object_Ring.png)bin615 -> 615 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Ring_Selected.pngbin0 -> 6066 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Sphere.png (renamed from indra/newview/skins/contrast/textures/build/Object_Sphere.png)bin737 -> 737 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Sphere_Selected.pngbin0 -> 7005 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Tetrahedron.png (renamed from indra/newview/skins/contrast/textures/build/Object_Tetrahedron.png)bin411 -> 411 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Tetrahedron_Selected.pngbin0 -> 5201 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Torus.png (renamed from indra/newview/skins/contrast/textures/build/Object_Torus.png)bin803 -> 803 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Torus_Selected.pngbin0 -> 6125 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Tree.png (renamed from indra/newview/skins/contrast/textures/build/Object_Tree.png)bin737 -> 737 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Tree_Selected.pngbin0 -> 6377 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Tube.png (renamed from indra/newview/skins/contrast/textures/build/Object_Tube.png)bin460 -> 460 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Tube_Selected.pngbin0 -> 5131 bytes
-rwxr-xr-x[-rw-r--r--]indra/newview/skins/gold/textures/build/Tool_Create.png (renamed from indra/newview/skins/contrast/textures/build/Tool_Create.png)bin705 -> 705 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Create_Selected.pngbin0 -> 621 bytes
-rwxr-xr-x[-rw-r--r--]indra/newview/skins/gold/textures/build/Tool_Dozer.png (renamed from indra/newview/skins/contrast/textures/build/Tool_Dozer.png)bin492 -> 492 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Dozer_Selected.pngbin0 -> 537 bytes
-rwxr-xr-x[-rw-r--r--]indra/newview/skins/gold/textures/build/Tool_Face.png (renamed from indra/newview/skins/contrast/textures/build/Tool_Face.png)bin304 -> 304 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Face_Selected.pngbin0 -> 373 bytes
-rwxr-xr-x[-rw-r--r--]indra/newview/skins/gold/textures/build/Tool_Grab.png (renamed from indra/newview/skins/contrast/textures/build/Tool_Grab.png)bin417 -> 417 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Grab_Selected.pngbin0 -> 456 bytes
-rwxr-xr-x[-rw-r--r--]indra/newview/skins/gold/textures/build/Tool_Zoom.png (renamed from indra/newview/skins/contrast/textures/build/Tool_Zoom.png)bin533 -> 533 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Zoom_Selected.pngbin0 -> 526 bytes
-rw-r--r--indra/newview/skins/gold/textures/button_anim_pause.tga (renamed from indra/newview/skins/contrast/textures/button_anim_pause.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/button_anim_pause_selected.tga (renamed from indra/newview/skins/contrast/textures/button_anim_pause_selected.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/button_anim_play.tga (renamed from indra/newview/skins/contrast/textures/button_anim_play.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/button_anim_play_selected.tga (renamed from indra/newview/skins/contrast/textures/button_anim_play_selected.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/checker.png (renamed from indra/newview/skins/contrast/textures/checker.png)bin130 -> 130 bytes
-rw-r--r--indra/newview/skins/gold/textures/cloud-particle.pngbin0 -> 42378 bytes
-rw-r--r--indra/newview/skins/gold/textures/color_swatch_alpha.tga (renamed from indra/newview/skins/contrast/textures/color_swatch_alpha.tga)bin16428 -> 16428 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Off.pngbin0 -> 175 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Press.pngbin0 -> 175 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Off.pngbin0 -> 169 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Press.pngbin0 -> 169 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Accordion_Off.pngbin0 -> 239 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Accordion_Over.pngbin0 -> 206 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Accordion_Press.pngbin0 -> 200 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Accordion_Selected.pngbin0 -> 2235 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Container.pngbin0 -> 673 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/TabTop_Left_Off.pngbin0 -> 6072 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/TabTop_Left_Selected.pngbin0 -> 568 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/TabTop_Middle.pngbin0 -> 4440 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/TabTop_Middle_Off.pngbin0 -> 5999 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/TabTop_Middle_Selected.pngbin0 -> 470 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/TabTop_Right_Flashing.pngbin0 -> 252 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/TabTop_Right_Off.pngbin0 -> 5638 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/TabTop_Right_Selected.pngbin0 -> 597 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Left_Flash.pngbin0 -> 356 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Left_Off.pngbin0 -> 4894 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Left_Over.pngbin0 -> 4903 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Left_Selected.pngbin0 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Middle_Flash.pngbin0 -> 316 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Middle_Off.pngbin0 -> 4812 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Middle_Over.pngbin0 -> 4818 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Middle_Selected.pngbin0 -> 409 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Right_Flash.pngbin0 -> 428 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Right_Off.pngbin0 -> 4917 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Right_Over.pngbin0 -> 4921 bytes
-rw-r--r--indra/newview/skins/gold/textures/containers/Toolbar_Right_Selected.pngbin0 -> 525 bytes
-rw-r--r--indra/newview/skins/gold/textures/crosshairs.tga (renamed from indra/newview/skins/contrast/textures/crosshairs.tga)bin300 -> 300 bytes
-rw-r--r--indra/newview/skins/gold/textures/default_irradiance.png (renamed from indra/newview/skins/contrast/textures/default_irradiance.png)bin48853 -> 48853 bytes
-rw-r--r--indra/newview/skins/gold/textures/default_land_picture.j2cbin0 -> 24492 bytes
-rw-r--r--indra/newview/skins/gold/textures/default_profile_picture.j2cbin0 -> 1512 bytes
-rw-r--r--indra/newview/skins/gold/textures/direction_arrow.tga (renamed from indra/newview/skins/contrast/textures/direction_arrow.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/down_arrow.png (renamed from indra/newview/skins/contrast/textures/down_arrow.png)bin423 -> 423 bytes
-rw-r--r--indra/newview/skins/gold/textures/eye_button_active.tga (renamed from indra/newview/skins/contrast/textures/eye_button_active.tga)bin3116 -> 3116 bytes
-rw-r--r--indra/newview/skins/gold/textures/eye_button_inactive.tga (renamed from indra/newview/skins/contrast/textures/eye_button_inactive.tga)bin3116 -> 3116 bytes
-rw-r--r--indra/newview/skins/gold/textures/flatnormal.tga (renamed from indra/newview/skins/contrast/textures/flatnormal.tga)bin92 -> 92 bytes
-rw-r--r--indra/newview/skins/gold/textures/folder_arrow.tga (renamed from indra/newview/skins/contrast/textures/folder_arrow.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/foot_shadow.j2c (renamed from indra/newview/skins/contrast/textures/foot_shadow.j2c)bin1647 -> 1647 bytes
-rw-r--r--indra/newview/skins/gold/textures/green_checkmark.png (renamed from indra/newview/skins/contrast/textures/green_checkmark.png)bin414 -> 414 bytes
-rw-r--r--indra/newview/skins/gold/textures/icn_media_movie.tga (renamed from indra/newview/skins/contrast/textures/icn_media_movie.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/icn_media_web.tga (renamed from indra/newview/skins/contrast/textures/icn_media_web.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_auction.tga (renamed from indra/newview/skins/contrast/textures/icon_auction.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_avatar_offline.tga (renamed from indra/newview/skins/contrast/textures/icon_avatar_offline.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_avatar_online.tga (renamed from indra/newview/skins/contrast/textures/icon_avatar_online.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_diurnal.tga (renamed from indra/newview/skins/contrast/textures/icon_diurnal.tga)bin6162 -> 6162 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_for_sale_adult.tga (renamed from indra/newview/skins/contrast/textures/icon_for_sale_adult.tga)bin743 -> 743 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_group.tga (renamed from indra/newview/skins/contrast/textures/icon_group.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_legacy_event.tga (renamed from indra/newview/skins/contrast/textures/icon_legacy_event.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_legacy_event_adult.tga (renamed from indra/newview/skins/contrast/textures/icon_legacy_event_adult.tga)bin648 -> 648 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_legacy_event_mature.tga (renamed from indra/newview/skins/contrast/textures/icon_legacy_event_mature.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_place.tga (renamed from indra/newview/skins/contrast/textures/icon_place.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_top_pick.tga (renamed from indra/newview/skins/contrast/textures/icon_top_pick.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/AddItem_Disabled.pngbin0 -> 403 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/AddItem_Off.pngbin0 -> 397 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/AddItem_Press.pngbin0 -> 392 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/AudioMute_Off.pngbin0 -> 800 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/AudioMute_Over.pngbin0 -> 787 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Audio_Off.pngbin0 -> 596 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Audio_Press.pngbin0 -> 585 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/BackArrow_Off.png (renamed from indra/newview/skins/contrast/textures/icons/BackArrow_Off.png)bin434 -> 434 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/ClipboardMenu_Disabled.png)bin406 -> 406 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.png (renamed from indra/newview/skins/contrast/textures/icons/ClipboardMenu_Off.png)bin392 -> 392 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.png (renamed from indra/newview/skins/contrast/textures/icons/ClipboardMenu_Press.png)bin403 -> 403 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Disabled.png)bin395 -> 395 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.png (renamed from indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Off.png)bin386 -> 386 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.png (renamed from indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Press.png)bin395 -> 395 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_log_inbox.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_log_inbox.png)bin544 -> 544 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_add_person.png)bin522 -> 522 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_ne.png)bin428 -> 428 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_sw.png)bin428 -> 428 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_call_log.png)bin592 -> 592 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_close.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_close.png)bin479 -> 479 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_collapse.png)bin538 -> 538 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_expand.png)bin533 -> 533 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_hang_up.png)bin609 -> 609 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_open_call.png)bin546 -> 546 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_plus.png)bin368 -> 368 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.png (renamed from indra/newview/skins/contrast/textures/icons/Conv_toolbar_sort.png)bin424 -> 424 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Copy.png (renamed from indra/newview/skins/contrast/textures/icons/Copy.png)bin588 -> 588 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/CopyBright.png (renamed from indra/newview/skins/contrast/textures/icons/CopyBright.png)bin615 -> 615 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.png (renamed from indra/newview/skins/contrast/textures/icons/Default_Outfit_Photo.png)bin13832 -> 13832 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/DownArrow_Off.png (renamed from indra/newview/skins/contrast/textures/icons/DownArrow_Off.png)bin431 -> 431 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Edit_Wrench.png (renamed from indra/newview/skins/contrast/textures/icons/Edit_Wrench.png)bin502 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.png (renamed from indra/newview/skins/contrast/textures/icons/ExternalBrowser_Off.png)bin476 -> 476 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Facebook.png (renamed from indra/newview/skins/contrast/textures/icons/Facebook.png)bin576 -> 576 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Female.png (renamed from indra/newview/skins/contrast/textures/icons/Female.png)bin489 -> 489 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ForSale_Badge.png (renamed from indra/newview/skins/contrast/textures/icons/ForSale_Badge.png)bin5896 -> 5896 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ForwardArrow_Off.png (renamed from indra/newview/skins/contrast/textures/icons/ForwardArrow_Off.png)bin424 -> 424 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ForwardArrow_Press.png (renamed from indra/newview/skins/contrast/textures/icons/ForwardArrow_Press.png)bin424 -> 424 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Group.png (renamed from indra/newview/skins/contrast/textures/icons/Generic_Group.png)bin2683 -> 2683 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Group_Large.png (renamed from indra/newview/skins/contrast/textures/icons/Generic_Group_Large.png)bin2772 -> 2772 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Object_Small.png (renamed from indra/newview/skins/contrast/textures/icons/Generic_Object_Small.png)bin502 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Person.png (renamed from indra/newview/skins/contrast/textures/icons/Generic_Person.png)bin544 -> 544 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Person_Large.png (renamed from indra/newview/skins/contrast/textures/icons/Generic_Person_Large.png)bin2510 -> 2510 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Group_Notices.png (renamed from indra/newview/skins/contrast/textures/icons/Group_Notices.png)bin3502 -> 3502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/Hierarchy_View_Disabled.png)bin401 -> 401 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Hierarchy_View_On.png (renamed from indra/newview/skins/contrast/textures/icons/Hierarchy_View_On.png)bin356 -> 356 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.png (renamed from indra/newview/skins/contrast/textures/icons/Icon_Attachment_Large.png)bin1593 -> 1593 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.png (renamed from indra/newview/skins/contrast/textures/icons/Icon_Attachment_Small.png)bin1383 -> 1383 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Color_Palette.png (renamed from indra/newview/skins/contrast/textures/icons/Icon_Color_Palette.png)bin3419 -> 3419 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Font_Size.png (renamed from indra/newview/skins/contrast/textures/icons/Icon_Font_Size.png)bin2994 -> 2994 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_For_Sale.png (renamed from indra/newview/skins/contrast/textures/icons/Icon_For_Sale.png)bin729 -> 729 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Notification_Condense.pngbin0 -> 465 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Notification_Expand.pngbin0 -> 427 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Info.pngbin0 -> 535 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Info_Over.pngbin0 -> 724 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Info_Small.pngbin0 -> 478 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Alpha.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Alpha.png)bin494 -> 494 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Animation.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Animation.png)bin708 -> 708 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_BodyShape.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_BodyShape.png)bin828 -> 828 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_CallingCard.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_CallingCard.png)bin462 -> 462 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Clothing.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Clothing.png)bin463 -> 463 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Eye.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Eye.png)bin654 -> 654 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_FolderClosed.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_FolderClosed.png)bin441 -> 441 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_FolderOpen.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_FolderOpen.png)bin614 -> 614 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Gesture.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Gesture.png)bin615 -> 615 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Gloves.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Gloves.png)bin582 -> 582 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Hair.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Hair.png)bin551 -> 551 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Invalid.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Invalid.png)bin539 -> 539 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Jacket.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Jacket.png)bin893 -> 893 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Landmark.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Landmark.png)bin965 -> 965 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Link.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Link.png)bin367 -> 367 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LinkFolder.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_LinkFolder.png)bin508 -> 508 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LinkItem.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_LinkItem.png)bin508 -> 508 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_LookFolderClosed.png)bin538 -> 538 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_LookFolderOpen.png)bin697 -> 697 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LostClosed.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_LostClosed.png)bin495 -> 495 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LostOpen.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_LostOpen.png)bin745 -> 745 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Material.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Material.png)bin1008 -> 1008 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Mesh.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Mesh.png)bin977 -> 977 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Notecard.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Notecard.png)bin414 -> 414 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Object.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Object.png)bin575 -> 575 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Object_Multi.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Object_Multi.png)bin976 -> 976 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Pants.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Pants.png)bin611 -> 611 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Physics.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Physics.png)bin758 -> 758 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Script.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Script.png)bin551 -> 551 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Settings.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Settings.png)bin1623 -> 1623 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SettingsDay.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_SettingsDay.png)bin1812 -> 1812 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SettingsSky.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_SettingsSky.png)bin1811 -> 1811 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SettingsWater.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_SettingsWater.png)bin1621 -> 1621 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Shape.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Shape.png)bin693 -> 693 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Shirt.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Shirt.png)bin612 -> 612 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Shoe.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Shoe.png)bin3875 -> 3875 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Skin.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Skin.png)bin627 -> 627 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Skirt.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Skirt.png)bin702 -> 702 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Snapshot.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Snapshot.png)bin722 -> 722 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Socks.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Socks.png)bin565 -> 565 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Sound.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Sound.png)bin584 -> 584 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_StockFolderClosed.png)bin1120 -> 1120 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_StockFolderOpen.png)bin1282 -> 1282 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SysClosed.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_SysClosed.png)bin4558 -> 4558 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SysOpen.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_SysOpen.png)bin4649 -> 4649 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Tattoo.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Tattoo.png)bin559 -> 559 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Texture.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Texture.png)bin379 -> 379 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Toolbar_SearchVisibility.png)bin722 -> 722 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_TrashClosed.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_TrashClosed.png)bin480 -> 480 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_TrashOpen.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_TrashOpen.png)bin479 -> 479 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Underpants.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Underpants.png)bin577 -> 577 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Undershirt.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Undershirt.png)bin423 -> 423 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Universal.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_Universal.png)bin1081 -> 1081 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_UnknownObject.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_UnknownObject.png)bin1752 -> 1752 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_VersionFolderClosed.png)bin1120 -> 1120 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.png (renamed from indra/newview/skins/contrast/textures/icons/Inv_VersionFolderOpen.png)bin1438 -> 1438 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/List_View_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/List_View_Disabled.png)bin374 -> 374 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/List_View_On.png (renamed from indra/newview/skins/contrast/textures/icons/List_View_On.png)bin379 -> 379 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Lock.png (renamed from indra/newview/skins/contrast/textures/icons/Lock.png)bin577 -> 577 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Locked_Icon.png (renamed from indra/newview/skins/contrast/textures/icons/Locked_Icon.png)bin471 -> 471 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/MP_Logo.pngbin0 -> 1106 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Male.png (renamed from indra/newview/skins/contrast/textures/icons/Male.png)bin494 -> 494 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Microphone_On.png (renamed from indra/newview/skins/contrast/textures/icons/Microphone_On.png)bin520 -> 520 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/MinusItem_Disabled.pngbin0 -> 370 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/MinusItem_Off.pngbin0 -> 377 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/MinusItem_Press.pngbin0 -> 373 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/MusicNote.png (renamed from indra/newview/skins/contrast/textures/icons/MusicNote.png)bin764 -> 764 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/OptionsMenu_Disabled.png)bin520 -> 520 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OptionsMenu_Off.png (renamed from indra/newview/skins/contrast/textures/icons/OptionsMenu_Off.png)bin523 -> 523 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OptionsMenu_Press.png (renamed from indra/newview/skins/contrast/textures/icons/OptionsMenu_Press.png)bin506 -> 506 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Disabled.png)bin5520 -> 5520 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Off.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Off.png)bin5495 -> 5495 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_On.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_On.png)bin5570 -> 5570 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_On_Over.png)bin5556 -> 5556 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Over.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Over.png)bin5274 -> 5274 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Press.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Press.png)bin5563 -> 5563 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_1.png)bin5529 -> 5529 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_2.png)bin5483 -> 5483 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_3.png)bin5486 -> 5486 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_4.png)bin5557 -> 5557 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_5.png)bin5593 -> 5593 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_6.png)bin5526 -> 5526 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Selected.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Selected.png)bin5596 -> 5596 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Disabled.png)bin5554 -> 5554 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Over.png)bin5576 -> 5576 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.png (renamed from indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Press.png)bin5628 -> 5628 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Dark.png)bin721 -> 721 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Light.png)bin730 -> 730 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Build_Dark.png)bin527 -> 527 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_DamageNo_Dark.png)bin636 -> 636 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Damage_Dark.png)bin511 -> 511 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Exp_Color.png)bin460 -> 460 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Dark.png)bin943 -> 943 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Light.png)bin934 -> 934 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Fly_Dark.png)bin524 -> 524 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_ForSale_Light.png)bin652 -> 652 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Health_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Health_Dark.png)bin600 -> 600 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_M_Dark.pngbin0 -> 490 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_M_Light.pngbin0 -> 488 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_PG_Dark.pngbin0 -> 495 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_PG_Light.pngbin0 -> 492 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_PushNo_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Dark.png)bin683 -> 683 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Light.png)bin654 -> 654 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Push_Dark.png)bin596 -> 596 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_R_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_R_Dark.png)bin490 -> 490 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_R_Light.pngbin0 -> 487 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_ScriptsNo_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_ScriptsNo_Dark.png)bin723 -> 723 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Scripts_Dark.png)bin553 -> 553 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Dark.png)bin660 -> 660 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Light.png)bin655 -> 655 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Dark.png)bin502 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Light.png)bin503 -> 503 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Dark.png)bin710 -> 710 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Light.png)bin710 -> 710 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Voice_Dark.png)bin550 -> 550 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.png (renamed from indra/newview/skins/contrast/textures/icons/Parcel_Voice_Light.png)bin599 -> 599 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.png (renamed from indra/newview/skins/contrast/textures/icons/Pathfinding_Dirty.png)bin713 -> 713 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/Pathfinding_Disabled.png)bin579 -> 579 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pause_Off.png (renamed from indra/newview/skins/contrast/textures/icons/Pause_Off.png)bin385 -> 385 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pause_Over.png (renamed from indra/newview/skins/contrast/textures/icons/Pause_Over.png)bin380 -> 380 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pause_Press.png (renamed from indra/newview/skins/contrast/textures/icons/Pause_Press.png)bin376 -> 376 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Permission_Ungranted.png (renamed from indra/newview/skins/contrast/textures/icons/Permission_Ungranted.png)bin834 -> 834 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Person_Check.png (renamed from indra/newview/skins/contrast/textures/icons/Person_Check.png)bin855 -> 855 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Person_Star.png (renamed from indra/newview/skins/contrast/textures/icons/Person_Star.png)bin690 -> 690 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Play_Off.png (renamed from indra/newview/skins/contrast/textures/icons/Play_Off.png)bin451 -> 451 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Play_Over.png (renamed from indra/newview/skins/contrast/textures/icons/Play_Over.png)bin443 -> 443 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Play_Press.png (renamed from indra/newview/skins/contrast/textures/icons/Play_Press.png)bin448 -> 448 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Presets_Icon.png (renamed from indra/newview/skins/contrast/textures/icons/Presets_Icon.png)bin1069 -> 1069 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.png (renamed from indra/newview/skins/contrast/textures/icons/Presets_Icon_Graphic.png)bin535 -> 535 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.png (renamed from indra/newview/skins/contrast/textures/icons/Profile_Friend_Offline.png)bin420 -> 420 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Friend_Online.png (renamed from indra/newview/skins/contrast/textures/icons/Profile_Friend_Online.png)bin433 -> 433 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Disabled.png)bin1008 -> 1008 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.png (renamed from indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Enabled.png)bin1051 -> 1051 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Disabled.png)bin888 -> 888 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.png (renamed from indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Enabled.png)bin949 -> 949 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Disabled.png)bin897 -> 897 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.png (renamed from indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Enabled.png)bin939 -> 939 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_1.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_1.png)bin6163 -> 6163 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_10.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_10.png)bin6310 -> 6310 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_11.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_11.png)bin6169 -> 6169 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_12.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_12.png)bin6197 -> 6197 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_2.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_2.png)bin6227 -> 6227 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_3.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_3.png)bin6090 -> 6090 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_4.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_4.png)bin6295 -> 6295 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_5.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_5.png)bin6158 -> 6158 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_6.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_6.png)bin6220 -> 6220 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_7.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_7.png)bin6100 -> 6100 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_8.pngbin0 -> 6223 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_9.png (renamed from indra/newview/skins/contrast/textures/icons/ProgressLarge_9.png)bin6034 -> 6034 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_1.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_1.png)bin678 -> 678 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_10.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_10.png)bin671 -> 671 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_11.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_11.png)bin674 -> 674 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_12.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_12.png)bin685 -> 685 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_2.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_2.png)bin675 -> 675 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_3.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_3.png)bin679 -> 679 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_4.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_4.png)bin673 -> 673 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_5.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_5.png)bin671 -> 671 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_6.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_6.png)bin684 -> 684 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_7.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_7.png)bin674 -> 674 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_8.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_8.png)bin680 -> 680 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_9.png (renamed from indra/newview/skins/contrast/textures/icons/Progress_9.png)bin680 -> 680 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Refresh_Off.png (renamed from indra/newview/skins/contrast/textures/icons/Refresh_Off.png)bin624 -> 624 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/SL_Logo.pngbin0 -> 1484 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Search_Icon.png (renamed from indra/newview/skins/contrast/textures/icons/Search_Icon.png)bin628 -> 628 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Shirt_Large.png (renamed from indra/newview/skins/contrast/textures/icons/Shirt_Large.png)bin641 -> 641 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Shop.png (renamed from indra/newview/skins/contrast/textures/icons/Shop.png)bin523 -> 523 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/SkipBackward_Off.png (renamed from indra/newview/skins/contrast/textures/icons/SkipBackward_Off.png)bin477 -> 477 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/SkipForward_Off.png (renamed from indra/newview/skins/contrast/textures/icons/SkipForward_Off.png)bin469 -> 469 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/StopReload_Off.png (renamed from indra/newview/skins/contrast/textures/icons/StopReload_Off.png)bin639 -> 639 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/StopReload_Over.png (renamed from indra/newview/skins/contrast/textures/icons/StopReload_Over.png)bin626 -> 626 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Stop_Off.png (renamed from indra/newview/skins/contrast/textures/icons/Stop_Off.png)bin363 -> 363 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/Sync_Disabled.png)bin1089 -> 1089 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Enabled.png (renamed from indra/newview/skins/contrast/textures/icons/Sync_Enabled.png)bin4636 -> 4636 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_1.png (renamed from indra/newview/skins/contrast/textures/icons/Sync_Progress_1.png)bin1080 -> 1080 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_2.png (renamed from indra/newview/skins/contrast/textures/icons/Sync_Progress_2.png)bin1077 -> 1077 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_3.png (renamed from indra/newview/skins/contrast/textures/icons/Sync_Progress_3.png)bin1114 -> 1114 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_4.png (renamed from indra/newview/skins/contrast/textures/icons/Sync_Progress_4.png)bin1108 -> 1108 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_5.png (renamed from indra/newview/skins/contrast/textures/icons/Sync_Progress_5.png)bin1070 -> 1070 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_6.png (renamed from indra/newview/skins/contrast/textures/icons/Sync_Progress_6.png)bin1095 -> 1095 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/System_Notification_Large.png (renamed from indra/newview/skins/contrast/textures/icons/System_Notification_Large.png)bin1170 -> 1170 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/System_Notification_Small.png (renamed from indra/newview/skins/contrast/textures/icons/System_Notification_Small.png)bin593 -> 593 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/TrashItem_Disabled.png (renamed from indra/newview/skins/contrast/textures/icons/TrashItem_Disabled.png)bin416 -> 416 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/TrashItem_Off.png (renamed from indra/newview/skins/contrast/textures/icons/TrashItem_Off.png)bin415 -> 415 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/TrashItem_Press.png (renamed from indra/newview/skins/contrast/textures/icons/TrashItem_Press.png)bin407 -> 407 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/UnZoom_Off.png (renamed from indra/newview/skins/contrast/textures/icons/UnZoom_Off.png)bin587 -> 587 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/UpArrow_Off.png (renamed from indra/newview/skins/contrast/textures/icons/UpArrow_Off.png)bin428 -> 428 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Video_URL_Off.png (renamed from indra/newview/skins/contrast/textures/icons/Video_URL_Off.png)bin466 -> 466 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/VoiceMute_Off.pngbin0 -> 753 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/VoicePTT_Lvl1.pngbin0 -> 6625 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/VoicePTT_Lvl2.pngbin0 -> 6879 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/VoicePTT_Lvl3.pngbin0 -> 952 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/VoicePTT_Off.pngbin0 -> 583 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/VoicePTT_On.pngbin0 -> 5521 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Web_Profile_Off.png (renamed from indra/newview/skins/contrast/textures/icons/Web_Profile_Off.png)bin460 -> 460 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/YouAreHere_Badge.png (renamed from indra/newview/skins/contrast/textures/icons/YouAreHere_Badge.png)bin6385 -> 6385 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Zoom_Off.png (renamed from indra/newview/skins/contrast/textures/icons/Zoom_Off.png)bin598 -> 598 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/add_icon.pngbin0 -> 691 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/back_arrow_off.pngbin0 -> 1177 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/back_arrow_over.pngbin0 -> 1258 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/back_arrow_press.pngbin0 -> 1326 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/icons/check_mark.pngbin0 -> 370 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/collapse_to_one_line.png (renamed from indra/newview/skins/contrast/textures/icons/collapse_to_one_line.png)bin621 -> 621 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/copy_clipboard.png (renamed from indra/newview/skins/contrast/textures/icons/copy_clipboard.png)bin811 -> 811 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/delete_icon.png (renamed from indra/newview/skins/contrast/textures/icons/delete_icon.png)bin809 -> 809 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/edit_mine.png (renamed from indra/newview/skins/contrast/textures/icons/edit_mine.png)bin896 -> 896 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/edit_theirs.png (renamed from indra/newview/skins/contrast/textures/icons/edit_theirs.png)bin902 -> 902 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/emoji_picker_icon.png (renamed from indra/newview/skins/contrast/textures/icons/emoji_picker_icon.png)bin787 -> 787 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/expand_one_liner.png (renamed from indra/newview/skins/contrast/textures/icons/expand_one_liner.png)bin627 -> 627 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/file_upload.png (renamed from indra/newview/skins/contrast/textures/icons/file_upload.png)bin640 -> 640 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/hand.pngbin0 -> 899 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/map_placeholder.png (renamed from indra/newview/skins/contrast/textures/icons/map_placeholder.png)bin8718 -> 8718 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/multi_folder_mode.png (renamed from indra/newview/skins/contrast/textures/icons/multi_folder_mode.png)bin329 -> 329 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/nearby_chat_icon.png (renamed from indra/newview/skins/contrast/textures/icons/nearby_chat_icon.png)bin586 -> 586 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/object_icon.png (renamed from indra/newview/skins/contrast/textures/icons/object_icon.png)bin502 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/paste_clipboard.png (renamed from indra/newview/skins/contrast/textures/icons/paste_clipboard.png)bin792 -> 792 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/pop_up_caution.png (renamed from indra/newview/skins/contrast/textures/icons/pop_up_caution.png)bin765 -> 765 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_beta.png (renamed from indra/newview/skins/contrast/textures/icons/profile_badge_beta.png)bin644 -> 644 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.png (renamed from indra/newview/skins/contrast/textures/icons/profile_badge_beta_lifetime.png)bin641 -> 641 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_lifetime.png (renamed from indra/newview/skins/contrast/textures/icons/profile_badge_lifetime.png)bin780 -> 780 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_linden.png (renamed from indra/newview/skins/contrast/textures/icons/profile_badge_linden.png)bin1065 -> 1065 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.png (renamed from indra/newview/skins/contrast/textures/icons/profile_badge_pplus_lifetime.png)bin780 -> 780 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.png (renamed from indra/newview/skins/contrast/textures/icons/profile_badge_premium_lifetime.png)bin777 -> 777 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.png (renamed from indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off.png)bin656 -> 656 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.png (renamed from indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off_pressed.png)bin656 -> 656 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.png (renamed from indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on.png)bin616 -> 616 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.png (renamed from indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on_pressed.png)bin646 -> 646 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/remove_icon.png (renamed from indra/newview/skins/contrast/textures/icons/remove_icon.png)bin705 -> 705 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/see_me_online.pngbin0 -> 2315 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/see_on_map.pngbin0 -> 2665 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/see_them_on_map.pngbin0 -> 2679 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/see_them_online.pngbin0 -> 2469 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/single_folder_back.png (renamed from indra/newview/skins/contrast/textures/icons/single_folder_back.png)bin607 -> 607 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/single_folder_forward.png (renamed from indra/newview/skins/contrast/textures/icons/single_folder_forward.png)bin608 -> 608 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/single_folder_mode.png (renamed from indra/newview/skins/contrast/textures/icons/single_folder_mode.png)bin320 -> 320 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/single_folder_up.png (renamed from indra/newview/skins/contrast/textures/icons/single_folder_up.png)bin545 -> 545 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/snapshot_icon.png (renamed from indra/newview/skins/contrast/textures/icons/snapshot_icon.png)bin717 -> 717 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/texture_icon.png (renamed from indra/newview/skins/contrast/textures/icons/texture_icon.png)bin349 -> 349 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/thumbnail_fallback_icon.png (renamed from indra/newview/skins/contrast/textures/icons/thumbnail_fallback_icon.png)bin2203 -> 2203 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/unknown_icon.pngbin0 -> 1177 bytes
-rw-r--r--indra/newview/skins/gold/textures/jump_left_in.tga (renamed from indra/newview/skins/contrast/textures/jump_left_in.tga)bin812 -> 812 bytes
-rw-r--r--indra/newview/skins/gold/textures/jump_left_out.tga (renamed from indra/newview/skins/contrast/textures/jump_left_out.tga)bin812 -> 812 bytes
-rw-r--r--indra/newview/skins/gold/textures/jump_right_in.tga (renamed from indra/newview/skins/contrast/textures/jump_right_in.tga)bin812 -> 812 bytes
-rw-r--r--indra/newview/skins/gold/textures/jump_right_out.tga (renamed from indra/newview/skins/contrast/textures/jump_right_out.tga)bin812 -> 812 bytes
-rw-r--r--indra/newview/skins/gold/textures/lag_status_critical.tga (renamed from indra/newview/skins/contrast/textures/lag_status_critical.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/lag_status_good.tga (renamed from indra/newview/skins/contrast/textures/lag_status_good.tga)bin658 -> 658 bytes
-rw-r--r--indra/newview/skins/gold/textures/lag_status_warning.tga (renamed from indra/newview/skins/contrast/textures/lag_status_warning.tga)bin658 -> 658 bytes
-rw-r--r--indra/newview/skins/gold/textures/legend.tga (renamed from indra/newview/skins/contrast/textures/legend.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/locked_image.j2c (renamed from indra/newview/skins/contrast/textures/locked_image.j2c)bin6140 -> 6140 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_16.tga (renamed from indra/newview/skins/contrast/textures/map_avatar_16.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_32.tga (renamed from indra/newview/skins/contrast/textures/map_avatar_32.tga)bin2894 -> 2894 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_8.tga (renamed from indra/newview/skins/contrast/textures/map_avatar_8.tga)bin300 -> 300 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_above_32.tga (renamed from indra/newview/skins/contrast/textures/map_avatar_above_32.tga)bin2909 -> 2909 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_below_32.tga (renamed from indra/newview/skins/contrast/textures/map_avatar_below_32.tga)bin3037 -> 3037 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_unknown_32.tga (renamed from indra/newview/skins/contrast/textures/map_avatar_unknown_32.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_you_32.tga (renamed from indra/newview/skins/contrast/textures/map_avatar_you_32.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_event.tga (renamed from indra/newview/skins/contrast/textures/map_event.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_home.tga (renamed from indra/newview/skins/contrast/textures/map_home.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_infohub.tga (renamed from indra/newview/skins/contrast/textures/map_infohub.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_telehub.tga (renamed from indra/newview/skins/contrast/textures/map_telehub.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_track_16.tga (renamed from indra/newview/skins/contrast/textures/map_track_16.tga)bin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_ui_collapse_icon.png (renamed from indra/newview/skins/contrast/textures/map_ui_collapse_icon.png)bin300 -> 300 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_ui_expand_icon.png (renamed from indra/newview/skins/contrast/textures/map_ui_expand_icon.png)bin284 -> 284 bytes
-rw-r--r--indra/newview/skins/gold/textures/materials_ui_x_24.png (renamed from indra/newview/skins/contrast/textures/materials_ui_x_24.png)bin602 -> 602 bytes
-rw-r--r--indra/newview/skins/gold/textures/megapahit/icon_group.pngbin0 -> 1479 bytes
-rw-r--r--indra/newview/skins/gold/textures/megapahit/icon_land_auction.pngbin0 -> 1464 bytes
-rw-r--r--indra/newview/skins/gold/textures/megapahit/icon_land_forsale.pngbin0 -> 1485 bytes
-rw-r--r--indra/newview/skins/gold/textures/megapahit/icon_place.pngbin0 -> 1584 bytes
-rw-r--r--indra/newview/skins/gold/textures/menu_separator.png (renamed from indra/newview/skins/contrast/textures/menu_separator.png)bin304 -> 304 bytes
-rw-r--r--indra/newview/skins/gold/textures/missing_asset.tga (renamed from indra/newview/skins/contrast/textures/missing_asset.tga)bin2511 -> 2511 bytes
-rw-r--r--indra/newview/skins/gold/textures/model_wizard/progress_bar_bg.pngbin0 -> 556 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/model_wizard/progress_light.pngbin0 -> 366 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Arrow_Left_Off.png (renamed from indra/newview/skins/contrast/textures/navbar/Arrow_Left_Off.png)bin382 -> 382 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Arrow_Right_Off.png (renamed from indra/newview/skins/contrast/textures/navbar/Arrow_Right_Off.png)bin380 -> 380 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/navbar/BuyArrow_Off.pngbin0 -> 324 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/navbar/BuyArrow_Over.pngbin0 -> 258 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/navbar/BuyArrow_Press.pngbin0 -> 258 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Favorite_Link_Over.png (renamed from indra/newview/skins/contrast/textures/navbar/Favorite_Link_Over.png)bin191 -> 191 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Favorite_Star_Active.pngbin0 -> 808 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Favorite_Star_Off.pngbin0 -> 444 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Favorite_Star_Over.pngbin0 -> 563 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Favorite_Star_Press.pngbin0 -> 616 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/FileMenu_Divider.png (renamed from indra/newview/skins/contrast/textures/navbar/FileMenu_Divider.png)bin116 -> 116 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Flag.png (renamed from indra/newview/skins/contrast/textures/navbar/Flag.png)bin338 -> 338 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Help_Press.png (renamed from indra/newview/skins/contrast/textures/navbar/Help_Press.png)bin384 -> 384 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Home_Off.png (renamed from indra/newview/skins/contrast/textures/navbar/Home_Off.png)bin379 -> 379 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Info_Off.pngbin0 -> 724 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Info_Over.pngbin0 -> 693 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Info_Press.pngbin0 -> 707 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Landmarks.png (renamed from indra/newview/skins/contrast/textures/navbar/Landmarks.png)bin15870 -> 15870 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Lock.png (renamed from indra/newview/skins/contrast/textures/navbar/Lock.png)bin302 -> 302 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/NavBar_BG.pngbin0 -> 6334 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/NavBar_BG_NoFav_Bevel.pngbin0 -> 5658 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/NavBar_BG_NoNav_Bevel.pngbin0 -> 5130 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Row_Selection.pngbin0 -> 1197 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Search.png (renamed from indra/newview/skins/contrast/textures/navbar/Search.png)bin516 -> 516 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/separator.pngbin0 -> 330 bytes
-rw-r--r--indra/newview/skins/gold/textures/notify_caution_icon.tga (renamed from indra/newview/skins/contrast/textures/notify_caution_icon.tga)bin4140 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/pixiesmall.j2c (renamed from indra/newview/skins/contrast/textures/pixiesmall.j2c)bin2845 -> 2845 bytes
-rw-r--r--indra/newview/skins/gold/textures/red_x.png (renamed from indra/newview/skins/contrast/textures/red_x.png)bin624 -> 624 bytes
-rw-r--r--indra/newview/skins/gold/textures/rounded_square.j2c (renamed from indra/newview/skins/contrast/textures/rounded_square.j2c)bin1074 -> 1074 bytes
-rw-r--r--indra/newview/skins/gold/textures/script_error.j2c (renamed from indra/newview/skins/contrast/textures/script_error.j2c)bin8132 -> 8132 bytes
-rw-r--r--indra/newview/skins/gold/textures/silhouette.j2c (renamed from indra/newview/skins/contrast/textures/silhouette.j2c)bin1460 -> 1460 bytes
-rw-r--r--indra/newview/skins/gold/textures/slim_icon_16_viewer.tga (renamed from indra/newview/skins/contrast/textures/slim_icon_16_viewer.tga)bin1032 -> 1032 bytes
-rw-r--r--indra/newview/skins/gold/textures/snapshot_download.png (renamed from indra/newview/skins/contrast/textures/snapshot_download.png)bin1226 -> 1226 bytes
-rw-r--r--indra/newview/skins/gold/textures/snapshot_email.png (renamed from indra/newview/skins/contrast/textures/snapshot_email.png)bin1231 -> 1231 bytes
-rw-r--r--indra/newview/skins/gold/textures/spacer24.tga (renamed from indra/newview/skins/contrast/textures/spacer24.tga)bin2348 -> 2348 bytes
-rw-r--r--indra/newview/skins/gold/textures/tabarea.tga (renamed from indra/newview/skins/contrast/textures/tabarea.tga)bin1340 -> 1340 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.png (renamed from indra/newview/skins/contrast/textures/taskpanel/Activate_Checkmark.png)bin435 -> 435 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png (renamed from indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png)bin355 -> 355 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.png (renamed from indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Press.png)bin339 -> 339 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png (renamed from indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png)bin341 -> 341 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.png (renamed from indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Press.png)bin344 -> 344 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TabIcon_Close_Off.png)bin305 -> 305 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TabIcon_Home_Selected.png)bin790 -> 790 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TabIcon_Me_Off.png)bin297 -> 297 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TabIcon_Open_Off.png)bin294 -> 294 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TabIcon_People_Off.png)bin367 -> 367 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TabIcon_Places_Off.png)bin405 -> 405 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TabIcon_Things_Off.png)bin223 -> 223 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Off.png)bin272 -> 272 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.png (renamed from indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Selected.png)bin325 -> 325 bytes
-rw-r--r--indra/newview/skins/gold/textures/tearoff_pressed.tga (renamed from indra/newview/skins/contrast/textures/tearoff_pressed.tga)bin513 -> 513 bytes
-rw-r--r--indra/newview/skins/gold/textures/tearoffbox.tga (renamed from indra/newview/skins/contrast/textures/tearoffbox.tga)bin408 -> 408 bytes
-rw-r--r--indra/newview/skins/gold/textures/textures.xml934
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/360_capture.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/360_capture.png)bin793 -> 793 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/appearance.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/appearance.png)bin1205 -> 1205 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/avatars.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/avatars.png)bin1432 -> 1432 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/build.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/build.png)bin1246 -> 1246 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/caret_bottom.pngbin0 -> 195 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/caret_left.pngbin0 -> 948 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/caret_right.pngbin0 -> 949 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/chat.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/chat.png)bin1277 -> 1277 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/destinations.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/destinations.png)bin1297 -> 1297 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/environments.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/environments.png)bin1630 -> 1630 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/facebook.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/facebook.png)bin424 -> 424 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/favorite_folder.png)bin572 -> 572 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/flickr.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/flickr.png)bin15530 -> 15530 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/gestures.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/gestures.png)bin1675 -> 1675 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/grid_status.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/grid_status.png)bin483 -> 483 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/highlighting.pngbin0 -> 500 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/highlighting_selected.pngbin0 -> 748 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/howto.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/howto.png)bin1306 -> 1306 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/inventory.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/inventory.png)bin1114 -> 1114 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/land.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/land.png)bin1123 -> 1123 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/map.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/map.png)bin1206 -> 1206 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/marketplace.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/marketplace.png)bin1311 -> 1311 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/mini_cart.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/mini_cart.png)bin474 -> 474 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/mini_map.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/mini_map.png)bin1766 -> 1766 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/mktlistings.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/mktlistings.png)bin579 -> 579 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/move.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/move.png)bin1328 -> 1328 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/nearbyvoice.png)bin1479 -> 1479 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/outbox.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/outbox.png)bin1521 -> 1521 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/people.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/people.png)bin1313 -> 1313 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/performance.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/performance.png)bin451 -> 451 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/picks.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/picks.png)bin1396 -> 1396 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/places.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/places.png)bin1391 -> 1391 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/preferences.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/preferences.png)bin1587 -> 1587 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/profile.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/profile.png)bin1180 -> 1180 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/report_abuse.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/report_abuse.png)bin407 -> 407 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/resync_animations.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/resync_animations.png)bin3627 -> 3627 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/search.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/search.png)bin1406 -> 1406 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/snapshot.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/snapshot.png)bin1142 -> 1142 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/speak.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/speak.png)bin1253 -> 1253 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/twitter.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/twitter.png)bin5696 -> 5696 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/view.png (renamed from indra/newview/skins/contrast/textures/toolbar_icons/view.png)bin1487 -> 1487 bytes
-rw-r--r--indra/newview/skins/gold/textures/transparent.j2c (renamed from indra/newview/skins/contrast/textures/transparent.j2c)bin172 -> 172 bytes
-rw-r--r--indra/newview/skins/gold/textures/up_arrow.png (renamed from indra/newview/skins/contrast/textures/up_arrow.png)bin426 -> 426 bytes
-rw-r--r--indra/newview/skins/gold/textures/uv_test1.j2c (renamed from indra/newview/skins/contrast/textures/uv_test1.j2c)bin1206 -> 1206 bytes
-rw-r--r--indra/newview/skins/gold/textures/uv_test2.tga (renamed from indra/newview/skins/contrast/textures/uv_test2.tga)bin1308 -> 1308 bytes
-rw-r--r--indra/newview/skins/gold/textures/voice_meter_dot.j2c (renamed from indra/newview/skins/contrast/textures/voice_meter_dot.j2c)bin499 -> 499 bytes
-rw-r--r--indra/newview/skins/gold/textures/voice_meter_rings.j2c (renamed from indra/newview/skins/contrast/textures/voice_meter_rings.j2c)bin2518 -> 2518 bytes
-rw-r--r--indra/newview/skins/gold/textures/white.tga (renamed from indra/newview/skins/contrast/textures/white.tga)bin178 -> 178 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Arrow_Down.pngbin0 -> 517 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Arrow_Left.pngbin0 -> 485 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Arrow_Right.pngbin0 -> 487 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Arrow_Small_Down.pngbin0 -> 478 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Arrow_Small_Left.pngbin0 -> 414 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Arrow_Small_Right.pngbin0 -> 414 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Arrow_Small_Up.pngbin0 -> 493 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Arrow_Up.pngbin0 -> 528 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Badge_Background.pngbin0 -> 1266 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Badge_Border.pngbin0 -> 1392 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Disabled.pngbin0 -> 851 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Off.pngbin0 -> 1094 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Over.pngbin0 -> 1195 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Press.pngbin0 -> 1319 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.pngbin0 -> 796 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Off.pngbin0 -> 1010 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Over.pngbin0 -> 1074 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Press.pngbin0 -> 1218 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Disabled.pngbin0 -> 588 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Off.pngbin0 -> 1569 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Over.pngbin0 -> 1714 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Press.pngbin0 -> 1772 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Checkbox_Disabled.pngbin0 -> 470 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Checkbox_Off.pngbin0 -> 480 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Checkbox_On.pngbin0 -> 635 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Checkbox_On_Disabled.pngbin0 -> 621 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Checkbox_On_Press.pngbin0 -> 647 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Checkbox_Press.pngbin0 -> 515 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ComboButton_Disabled.pngbin0 -> 575 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ComboButton_Hover.pngbin0 -> 552 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ComboButton_Off.pngbin0 -> 5629 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ComboButton_On.pngbin0 -> 606 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ComboButton_Selected.pngbin0 -> 711 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ComboButton_UpOff.pngbin0 -> 5555 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ComboButton_UpSelected.pngbin0 -> 733 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/DisclosureArrow_Opened_Off.pngbin0 -> 392 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/DropDown_Disabled.pngbin0 -> 669 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/DropDown_Off.pngbin0 -> 678 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/DropDown_On.pngbin0 -> 741 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/DropDown_Press.pngbin0 -> 841 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/DropTarget.pngbin0 -> 604 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Error_Tag_Background.pngbin0 -> 1317 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Linden_Dollar_Alert.pngbin0 -> 68647 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Linden_Dollar_Background.pngbin0 -> 130520 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ListItem_Over.pngbin0 -> 1209 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ListItem_Select.pngbin0 -> 1217 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Off.pngbin0 -> 911 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Selected.pngbin0 -> 1191 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Marketplace_Dropzone_Background.pngbin0 -> 639 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/New_Tag_Background.pngbin0 -> 948 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/New_Tag_Border.pngbin0 -> 963 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ProgressBar.pngbin0 -> 344 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ProgressBarSolid.pngbin0 -> 378 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ProgressTrack.pngbin0 -> 399 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Disabled.pngbin0 -> 569 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Login.pngbin0 -> 1437 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Login_Over.pngbin0 -> 1516 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Login_Pressed.pngbin0 -> 1493 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Off.pngbin0 -> 4809 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_On.pngbin0 -> 606 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_On_Selected.pngbin0 -> 668 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Over.pngbin0 -> 4815 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Press.pngbin0 -> 668 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Selected.pngbin0 -> 668 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Selected_Disabled.pngbin0 -> 611 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/PushButton_Selected_Press.pngbin0 -> 668 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/RadioButton_Disabled.pngbin0 -> 606 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/RadioButton_Off.pngbin0 -> 628 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/RadioButton_On.pngbin0 -> 679 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/RadioButton_On_Disabled.pngbin0 -> 652 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/RadioButton_On_Press.pngbin0 -> 688 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/RadioButton_Press.pngbin0 -> 666 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Down.pngbin0 -> 443 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Opaque.pngbin0 -> 470 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Over_Opaque.pngbin0 -> 445 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Left.pngbin0 -> 454 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Opaque.pngbin0 -> 418 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Over_Opaque.pngbin0 -> 431 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Right.pngbin0 -> 445 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Opaque.pngbin0 -> 420 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Over_Opaque.pngbin0 -> 429 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Up.pngbin0 -> 465 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Opaque.pngbin0 -> 458 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Over_Opaque.pngbin0 -> 468 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollThumb_Horiz.pngbin0 -> 509 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollThumb_Vert.pngbin0 -> 494 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollTrack_Horiz.pngbin0 -> 364 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/ScrollTrack_Vert.pngbin0 -> 361 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Disabled.pngbin0 -> 4673 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Off.pngbin0 -> 4680 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Over.pngbin0 -> 4619 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Press.pngbin0 -> 4786 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected.pngbin0 -> 4786 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.pngbin0 -> 508 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Over.pngbin0 -> 510 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Press.pngbin0 -> 593 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Disabled.pngbin0 -> 4542 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected.pngbin0 -> 4574 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.pngbin0 -> 414 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.pngbin0 -> 507 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Disabled.pngbin0 -> 4922 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Off.pngbin0 -> 4921 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_On_Selected.pngbin0 -> 619 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Over.pngbin0 -> 4844 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Press.pngbin0 -> 4926 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected.pngbin0 -> 4926 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.pngbin0 -> 534 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Press.pngbin0 -> 617 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SliderThumb_Disabled.pngbin0 -> 592 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SliderThumb_Off.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SliderThumb_Press.pngbin0 -> 582 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SliderTrack_Horiz.pngbin0 -> 420 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/SliderTrack_Vert.pngbin0 -> 417 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Stepper_Down_Off.pngbin0 -> 4901 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Stepper_Down_Press.pngbin0 -> 532 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Stepper_Up_Off.pngbin0 -> 4909 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Stepper_Up_Press.pngbin0 -> 539 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/TextField_Active.pngbin0 -> 4359 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/TextField_Disabled.pngbin0 -> 4356 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/TextField_Off.pngbin0 -> 4359 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/TextField_Search_Active.pngbin0 -> 903 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/TextField_Search_Disabled.pngbin0 -> 886 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/TextField_Search_Highlight.pngbin0 -> 3250 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/TextField_Search_Off.pngbin0 -> 901 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/Tooltip.pngbin0 -> 404 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/bevel_background.pngbin0 -> 451 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/buy_off.pngbin0 -> 392 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/buy_over.pngbin0 -> 401 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/buy_press.pngbin0 -> 454 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/horizontal_drag_handle.pngbin0 -> 389 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/jump_left_in.pngbin0 -> 434 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/jump_left_out.pngbin0 -> 422 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/jump_right_in.pngbin0 -> 426 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/jump_right_out.pngbin0 -> 423 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_moon_back.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_moon_back.png)bin1767 -> 1767 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_moon_front.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_moon_front.png)bin2060 -> 2060 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom.png)bin1125 -> 1125 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom_active.png)bin617 -> 617 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side.png)bin1107 -> 1107 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side_active.png)bin561 -> 561 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side.png)bin1121 -> 1121 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side_active.png)bin591 -> 591 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_top.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_rotate_top.png)bin1133 -> 1133 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_top_active.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_rotate_top_active.png)bin627 -> 627 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_sphere.pngbin0 -> 7131 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_sun_back.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_sun_back.png)bin1626 -> 1626 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_sun_front.png (renamed from indra/newview/skins/contrast/textures/widgets/track_control_sun_front.png)bin1911 -> 1911 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/vertical_drag_handle.pngbin0 -> 396 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Dragbar.pngbin0 -> 503 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Flyout_Left.pngbin0 -> 421 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Flyout_Pointer.pngbin0 -> 436 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Flyout_Right.pngbin0 -> 423 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Close_Foreground.pngbin0 -> 402 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Close_Press.pngbin0 -> 416 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Close_Toast.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Dock_Foreground.pngbin0 -> 413 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Dock_Press.pngbin0 -> 428 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Gear.pngbin0 -> 4355 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Gear_Background.pngbin0 -> 515 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Gear_Foreground.pngbin0 -> 516 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Gear_Press.pngbin0 -> 510 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Help_Foreground.pngbin0 -> 501 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Help_Press.pngbin0 -> 501 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Minimize_Foreground.pngbin0 -> 351 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Minimize_Press.pngbin0 -> 351 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Restore_Foreground.pngbin0 -> 450 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Restore_Press.pngbin0 -> 456 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Icon_Undock_Foreground.pngbin0 -> 415 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Inspector_Background.pngbin0 -> 462 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Inspector_Hover.pngbin0 -> 645 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Inspector_I.pngbin0 -> 6320 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Resize_Corner.pngbin0 -> 4679 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Toast_Background.pngbin0 -> 460 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Toast_CloseBtn.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Toast_Over.pngbin0 -> 647 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Volume_Background.pngbin0 -> 674 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Wearables_Divider.pngbin0 -> 311 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Window_Background.pngbin0 -> 6780 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/Window_Foreground.pngbin0 -> 6900 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/add_payment_image_center.png (renamed from indra/newview/skins/contrast/textures/windows/add_payment_image_center.png)bin36083 -> 36083 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/add_payment_image_left.png (renamed from indra/newview/skins/contrast/textures/windows/add_payment_image_left.png)bin34181 -> 34181 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/add_payment_image_right.png (renamed from indra/newview/skins/contrast/textures/windows/add_payment_image_right.png)bin33753 -> 33753 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/first_login_image.jpgbin0 -> 199811 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/hint_arrow_down.pngbin0 -> 623 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/hint_arrow_left.pngbin0 -> 532 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/hint_arrow_lower_left.pngbin0 -> 540 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/hint_arrow_right.pngbin0 -> 563 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/hint_arrow_up.pngbin0 -> 637 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/hint_background.pngbin0 -> 1582 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/login_mp_logo.pngbin0 -> 23425 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/login_mp_logo_small.pngbin0 -> 17032 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/login_sl_logo.pngbin0 -> 6180 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/login_sl_logo_small.pngbin0 -> 5204 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/startup_logo.pngbin0 -> 3446 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/yellow_gradient.pngbin0 -> 1733 bytes
-rw-r--r--indra/newview/skins/gold/textures/world/BeaconArrow.png (renamed from indra/newview/skins/contrast/textures/world/BeaconArrow.png)bin994 -> 994 bytes
-rw-r--r--indra/newview/skins/gold/textures/world/CameraDragDot.pngbin0 -> 563 bytes
-rw-r--r--indra/newview/skins/gold/textures/world/NoEntryLines.pngbin0 -> 4829 bytes
-rw-r--r--indra/newview/skins/gold/textures/world/NoEntryPassLines.pngbin0 -> 5263 bytes
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp1
-rw-r--r--indra/newview/tests/llviewerassetstats_test.cpp5
-rw-r--r--indra/newview/tests/llworldmap_test.cpp6
-rwxr-xr-xindra/newview/viewer_manifest.py212
-rw-r--r--indra/test/CMakeLists.txt2
-rw-r--r--indra/test/llhttpdate_tut.cpp7
-rw-r--r--indra/test/test.cpp70
-rw-r--r--indra/tools/vstool/DispatchUtility.cs271
-rw-r--r--indra/tools/vstool/README.txt9
-rwxr-xr-xindra/tools/vstool/VSTool.csproj98
-rwxr-xr-xindra/tools/vstool/VSTool.exebin24576 -> 0 bytes
-rwxr-xr-xindra/tools/vstool/VSTool.sln19
-rw-r--r--indra/tools/vstool/app.config3
-rwxr-xr-xindra/tools/vstool/main.cs733
-rw-r--r--indra/win_crash_logger/README.txt3
2241 files changed, 71404 insertions, 29831 deletions
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index b1970fba35..6f3ec1cfff 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -10,7 +10,13 @@
## Nicky: Ideally we want at least 3.21 for good preset support
## We're not there yet, but once done, there is a kludge in Linking.cmake
# "if(${CMAKE_VERSION} VERSION_LESS "3.20.0")" that can also be removed
-cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.16.0...4.0 FATAL_ERROR)
+if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.29.0")
+ cmake_policy(SET CMP0156 NEW)
+endif()
+if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.31.0")
+ cmake_policy(SET CMP0179 NEW)
+endif()
set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING
"The root project/makefile/solution name. Defaults to SecondLife.")
@@ -33,6 +39,14 @@ if (NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 20)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_SCAN_FOR_MODULES OFF) # This slows down build massively
+
+set(CMAKE_OPTIMIZE_DEPENDENCIES ON)
+
+set(CMAKE_COLOR_DIAGNOSTICS ON)
+
+# Speeds up cmake generation significantly in some cases
+set(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY ON)
include(Variables)
include(BuildVersion)
@@ -56,10 +70,11 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llinventory)
add_subdirectory(${LIBS_OPEN_PREFIX}llmath)
add_subdirectory(${LIBS_OPEN_PREFIX}llmeshoptimizer)
add_subdirectory(${LIBS_OPEN_PREFIX}llmessage)
+add_subdirectory(${LIBS_OPEN_PREFIX}llphysicsextensionsos)
add_subdirectory(${LIBS_OPEN_PREFIX}llprimitive)
add_subdirectory(${LIBS_OPEN_PREFIX}llrender)
add_subdirectory(${LIBS_OPEN_PREFIX}llfilesystem)
-if (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD)
+if (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64) OR (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)))
add_subdirectory(${LIBS_OPEN_PREFIX}llwebrtc)
endif ()
add_subdirectory(${LIBS_OPEN_PREFIX}llwindow)
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 0e3b89e98e..42e211c84d 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -35,6 +35,8 @@ add_compile_definitions(BOOST_BIND_GLOBAL_PLACEHOLDERS)
if(CMAKE_OSX_ARCHITECTURES MATCHES arm64 OR CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
add_compile_definitions(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES=1 GLM_FORCE_NEON=1 GLM_ENABLE_EXPERIMENTAL=1)
+elseif($ENV{MSYSTEM_CARCH} MATCHES aarch64)
+add_compile_definitions(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES=1 GLM_ENABLE_EXPERIMENTAL=1)
else()
# Force enable SSE2 instructions in GLM per the manual
# https://github.com/g-truc/glm/blob/master/manual.md#section2_10
@@ -83,6 +85,8 @@ if (NOT CMAKE_CXX_COMPILER_ID MATCHES GNU AND WINDOWS)
NOMINMAX
# DOM_DYNAMIC # For shared library colladadom
_CRT_SECURE_NO_WARNINGS # Allow use of sprintf etc
+ _CRT_NONSTDC_NO_DEPRECATE # Allow use of sprintf etc
+ _CRT_OBSOLETE_NO_WARNINGS
_WINSOCK_DEPRECATED_NO_WARNINGS # Disable deprecated WinSock API warnings
)
add_compile_options(
@@ -224,26 +228,17 @@ if (LINUX OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
endif (LINUX OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
if (DARWIN)
+ # Use rpath loading on macos
+ set(CMAKE_MACOSX_RPATH TRUE)
+
# Warnings should be fatal -- thanks, Nicky Perian, for spotting reversed default
set(CLANG_DISABLE_FATAL_WARNINGS OFF)
set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
- set(DARWIN_extra_cstar_flags "-Wno-unused-local-typedef -Wno-deprecated-declarations")
- # Ensure that CMAKE_CXX_FLAGS has the correct -g debug information format --
- # see Variables.cmake.
- string(REPLACE "-gdwarf-2" "-g${CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT}"
- CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags}")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${DARWIN_extra_cstar_flags}")
- # NOTE: it's critical that the optimization flag is put in front.
- # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered.
-## Really?? On developer machines too?
-##set(ENABLE_SIGNING TRUE)
-##set(SIGNING_IDENTITY "Developer ID Application: Linden Research, Inc.")
# required for clang-15/xcode-15 since our boost package still uses deprecated std::unary_function/binary_function
# see https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#C++-Standard-Library
- add_compile_definitions(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION)
+ #add_compile_definitions(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION)
set(GCC_WARNINGS -Wall -Wno-sign-compare -Wno-trigraphs)
diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake
index fa3b8a4ffb..22e94f2c8f 100644
--- a/indra/cmake/APR.cmake
+++ b/indra/cmake/APR.cmake
@@ -8,7 +8,7 @@ add_library( ll::apr INTERFACE IMPORTED )
if (WINDOWS)
target_include_directories(ll::apr SYSTEM INTERFACE ${prefix_result}/../include)
target_link_directories(ll::apr INTERFACE ${prefix_result})
- target_link_libraries(ll::apr INTERFACE apr-1 apr-util-1)
+ target_link_libraries(ll::apr INTERFACE libapr-1 libaprutil-1)
else ()
include(FindPkgConfig)
pkg_check_modules(Apr REQUIRED apr-1 apr-util-1)
@@ -23,35 +23,30 @@ use_system_binary( apr apr-util )
use_prebuilt_binary(apr_suite)
if (WINDOWS)
- if (LLCOMMON_LINK_SHARED)
- set(APR_selector "lib")
- else (LLCOMMON_LINK_SHARED)
- set(APR_selector "")
- endif (LLCOMMON_LINK_SHARED)
- target_link_libraries( ll::apr INTERFACE
- ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}apr-1.lib
- ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}aprutil-1.lib
- )
- target_compile_definitions( ll::apr INTERFACE APR_DECLARE_STATIC=1 APU_DECLARE_STATIC=1 API_DECLARE_STATIC=1)
-elseif (DARWIN)
- if (LLCOMMON_LINK_SHARED)
- set(APR_selector "0.dylib")
- set(APRUTIL_selector "0.dylib")
- else (LLCOMMON_LINK_SHARED)
- set(APR_selector "a")
- set(APRUTIL_selector "a")
- endif (LLCOMMON_LINK_SHARED)
-
- target_link_libraries( ll::apr INTERFACE
- ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.${APR_selector}
- ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.${APR_selector}
- iconv
- )
-else()
- target_link_libraries( ll::apr INTERFACE
- ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.a
- ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.a
- rt
- )
+ target_compile_definitions(ll::apr INTERFACE APR_DECLARE_STATIC=1 APU_DECLARE_STATIC=1 API_DECLARE_STATIC=1)
endif ()
-target_include_directories( ll::apr SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/apr-1 )
+
+find_library(APR_LIBRARY
+ NAMES
+ apr-1.lib
+ libapr-1.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+find_library(APRUTIL_LIBRARY
+ NAMES
+ aprutil-1.lib
+ libaprutil-1.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::apr INTERFACE ${APR_LIBRARY} ${APRUTIL_LIBRARY})
+
+if(DARWIN)
+ target_link_libraries(ll::apr INTERFACE iconv)
+endif()
+
+target_include_directories(ll::apr SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/apr-1)
+
+# Fix erroneous check for __attribute__ definition introduced with APR 1.7.5, causing lots of "this declaration may not have extern 'C' linkage" errors in VS
+file(READ ${LIBS_PREBUILT_DIR}/include/apr-1/apr.h APR_HEADER_CONTENTS)
+string(REPLACE "#if !(defined(__attribute__) || defined(__has_attribute))" "#if !defined(__attribute__)" APR_HEADER_CONTENTS "${APR_HEADER_CONTENTS}")
+file(WRITE ${LIBS_PREBUILT_DIR}/include/apr-1/apr.h "${APR_HEADER_CONTENTS}")
diff --git a/indra/cmake/Audio.cmake b/indra/cmake/Audio.cmake
index c569fba4e8..db0969ff23 100644
--- a/indra/cmake/Audio.cmake
+++ b/indra/cmake/Audio.cmake
@@ -16,23 +16,29 @@ use_system_binary(vorbis)
use_prebuilt_binary(ogg_vorbis)
target_include_directories( ll::vorbis SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include )
-if (WINDOWS)
- target_link_libraries(ll::vorbis INTERFACE
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libogg.lib
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libogg.lib
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbisenc.lib
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbisenc.lib
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbisfile.lib
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbisfile.lib
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbis.lib
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbis.lib
- )
-else (WINDOWS)
- target_link_libraries(ll::vorbis INTERFACE
- ${ARCH_PREBUILT_DIRS_RELEASE}/libogg.a
- ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbisenc.a
- ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbisfile.a
- ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbis.a
- )
-endif (WINDOWS)
+find_library(OGG_LIBRARY
+ NAMES
+ libogg.lib
+ libogg.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+find_library(VORBIS_LIBRARY
+ NAMES
+ libvorbis.lib
+ libvorbis.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+find_library(VORBISENC_LIBRARY
+ NAMES
+ libvorbisenc.lib
+ libvorbisenc.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+find_library(VORBISFILE_LIBRARY
+ NAMES
+ libvorbisfile.lib
+ libvorbisfile.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::vorbis INTERFACE ${VORBISENC_LIBRARY} ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY} ${OGG_LIBRARY} )
diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake
index 9ea1f6c9a6..14ea27e686 100644
--- a/indra/cmake/Boost.cmake
+++ b/indra/cmake/Boost.cmake
@@ -6,26 +6,36 @@ include_guard()
add_library( ll::boost INTERFACE IMPORTED )
if (DARWIN)
- target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/libexec/boost/1.87/include)
- target_link_directories( ll::boost INTERFACE /opt/local/libexec/boost/1.87/lib)
+ target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/libexec/boost/1.88/include)
+ target_link_directories( ll::boost INTERFACE /opt/local/libexec/boost/1.88/lib)
set(sfx -mt)
elseif (WINDOWS)
target_include_directories( ll::boost SYSTEM INTERFACE ${prefix_result}/../include)
target_link_directories( ll::boost INTERFACE ${prefix_result})
- set(sfx -vc143-mt-x64-1_88)
+ if ($ENV{MSYSTEM_CARCH} MATCHES aarch64)
+ set(sfx -vc143-mt-a64-1_90)
+ else ()
+ set(sfx -vc143-mt-x64-1_90)
+ endif ()
else ()
- find_package( Boost REQUIRED )
+ find_package( Boost )
endif ()
target_link_libraries( ll::boost INTERFACE
boost_context${sfx}
boost_fiber${sfx}
boost_filesystem${sfx}
boost_program_options${sfx}
- boost_regex${sfx}
- boost_system${sfx}
boost_thread${sfx}
boost_url${sfx}
)
+if (WINDOWS)
+ target_link_libraries( ll::boost INTERFACE boost_json${sfx})
+else ()
+ target_link_libraries( ll::boost INTERFACE boost_regex${sfx})
+endif ()
+if (NOT (${LINUX_DISTRO} MATCHES arch OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed) OR WINDOWS OR CMAKE_SYSTEM_NAME MATCHES FreeBSD))
+ target_link_libraries( ll::boost INTERFACE boost_system${sfx})
+endif ()
target_compile_definitions( ll::boost INTERFACE BOOST_BIND_GLOBAL_PLACEHOLDERS )
return()
@@ -42,39 +52,118 @@ use_prebuilt_binary(boost)
set(addrsfx "-x${ADDRESS_SIZE}")
if (WINDOWS)
- target_link_libraries( ll::boost INTERFACE
- libboost_context-mt${addrsfx}
- libboost_fiber-mt${addrsfx}
- libboost_filesystem-mt${addrsfx}
- libboost_program_options-mt${addrsfx}
- libboost_regex-mt${addrsfx}
- libboost_system-mt${addrsfx}
- libboost_thread-mt${addrsfx}
- libboost_url-mt${addrsfx})
-elseif (LINUX)
- target_link_libraries( ll::boost INTERFACE
- boost_fiber-mt${addrsfx}
- boost_context-mt${addrsfx}
- boost_filesystem-mt${addrsfx}
- boost_program_options-mt${addrsfx}
- boost_regex-mt${addrsfx}
- boost_system-mt${addrsfx}
- boost_thread-mt${addrsfx}
- boost_url-mt${addrsfx})
-elseif (DARWIN)
- target_link_libraries( ll::boost INTERFACE
- boost_context-mt${addrsfx}
- boost_fiber-mt${addrsfx}
- boost_filesystem-mt${addrsfx}
- boost_program_options-mt${addrsfx}
- boost_regex-mt${addrsfx}
- boost_system-mt${addrsfx}
- boost_thread-mt${addrsfx}
- boost_url-mt${addrsfx})
+
+ find_library(BOOST_CONTEXT_LIBRARY
+ NAMES
+ libboost_context-mt
+ libboost_context-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_FIBER_LIBRARY
+ NAMES
+ libboost_fiber-mt
+ libboost_fiber-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_FILESYSTEM_LIBRARY
+ NAMES
+ libboost_filesystem-mt
+ libboost_filesystem-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_PROGRAMOPTIONS_LIBRARY
+ NAMES
+ libboost_program_options-mt
+ libboost_program_options-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_REGEX_LIBRARY
+ NAMES
+ libboost_regex-mt
+ libboost_regex-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_SYSTEM_LIBRARY
+ NAMES
+ libboost_system-mt
+ libboost_system-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_THREAD_LIBRARY
+ NAMES
+ libboost_thread-mt
+ libboost_thread-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_URL_LIBRARY
+ NAMES
+ libboost_url-mt
+ libboost_url-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+else (WINDOWS)
+
+ find_library(BOOST_CONTEXT_LIBRARY
+ NAMES
+ boost_context-mt
+ boost_context-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_FIBER_LIBRARY
+ NAMES
+ boost_fiber-mt
+ boost_fiber-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_FILESYSTEM_LIBRARY
+ NAMES
+ boost_filesystem-mt
+ boost_filesystem-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_PROGRAMOPTIONS_LIBRARY
+ NAMES
+ boost_program_options-mt
+ boost_program_options-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_REGEX_LIBRARY
+ NAMES
+ boost_regex-mt
+ boost_regex-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_SYSTEM_LIBRARY
+ NAMES
+ boost_system-mt
+ boost_system-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_THREAD_LIBRARY
+ NAMES
+ boost_thread-mt
+ boost_thread-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(BOOST_URL_LIBRARY
+ NAMES
+ boost_url-mt
+ boost_url-mt${addrsfx}
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
endif (WINDOWS)
+target_link_libraries(ll::boost INTERFACE
+ ${BOOST_FIBER_LIBRARY}
+ ${BOOST_CONTEXT_LIBRARY}
+ ${BOOST_FILESYSTEM_LIBRARY}
+ ${BOOST_PROGRAMOPTIONS_LIBRARY}
+ ${BOOST_REGEX_LIBRARY}
+ ${BOOST_SYSTEM_LIBRARY}
+ ${BOOST_THREAD_LIBRARY}
+ ${BOOST_URL_LIBRARY})
+
if (LINUX)
- set(BOOST_SYSTEM_LIBRARY ${BOOST_SYSTEM_LIBRARY} rt)
- set(BOOST_THREAD_LIBRARY ${BOOST_THREAD_LIBRARY} rt)
+ target_link_libraries(ll::boost INTERFACE rt)
endif (LINUX)
diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake
index 70e6c366a4..31ed86213a 100644
--- a/indra/cmake/CEFPlugin.cmake
+++ b/indra/cmake/CEFPlugin.cmake
@@ -5,37 +5,7 @@ include(Prebuilt)
include_guard()
add_library( ll::cef INTERFACE IMPORTED )
-if (CMAKE_OSX_ARCHITECTURES MATCHES arm64)
- if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0)
- if (NOT EXISTS ${CMAKE_BINARY_DIR}/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070244.tar.bz2)
- file(DOWNLOAD
- https://megapahit.net/downloads/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070244.tar.bz2
- ${CMAKE_BINARY_DIR}/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070244.tar.bz2
- SHOW_PROGRESS
- )
- endif (NOT EXISTS ${CMAKE_BINARY_DIR}/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070244.tar.bz2)
- file(ARCHIVE_EXTRACT
- INPUT ${CMAKE_BINARY_DIR}/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070244.tar.bz2
- DESTINATION ${LIBS_PREBUILT_DIR}
- )
- file(WRITE ${PREBUILD_TRACKING_DIR}/dullahan_installed "0")
- endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0)
-elseif (CMAKE_OSX_ARCHITECTURES MATCHES x86_64)
- if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0)
- if (NOT EXISTS ${CMAKE_BINARY_DIR}/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070158.tar.bz2)
- file(DOWNLOAD
- https://megapahit.net/downloads/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070158.tar.bz2
- ${CMAKE_BINARY_DIR}/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070158.tar.bz2
- SHOW_PROGRESS
- )
- endif (NOT EXISTS ${CMAKE_BINARY_DIR}/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070158.tar.bz2)
- file(ARCHIVE_EXTRACT
- INPUT ${CMAKE_BINARY_DIR}/dullahan-1.14.0.202312131437_118.7.1_g99817d2_chromium-118.0.5993.119-darwin64-242070158.tar.bz2
- DESTINATION ${LIBS_PREBUILT_DIR}
- )
- file(WRITE ${PREBUILD_TRACKING_DIR}/dullahan_installed "0")
- endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0)
-elseif (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
+if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0)
if (NOT EXISTS ${CMAKE_BINARY_DIR}/v1.14.0-r3.tar.gz)
file(DOWNLOAD
@@ -84,16 +54,14 @@ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
file(WRITE ${PREBUILD_TRACKING_DIR}/dullahan_installed "${dullahan_installed}")
endif (${DULLAHAN_RESULT})
endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0)
-else (CMAKE_OSX_ARCHITECTURES MATCHES arm64)
+else ()
use_prebuilt_binary(dullahan)
-endif (CMAKE_OSX_ARCHITECTURES MATCHES arm64)
+endif ()
-if (${LINUX_DISTRO} MATCHES fedora)
- execute_process(
- COMMAND patchelf --remove-rpath bin/release/dullahan_host
- WORKING_DIRECTORY ${LIBS_PREBUILT_DIR}
- )
-endif (${LINUX_DISTRO} MATCHES fedora)
+execute_process(
+ COMMAND patchelf --remove-rpath bin/release/dullahan_host
+ WORKING_DIRECTORY ${LIBS_PREBUILT_DIR}
+ )
target_include_directories( ll::cef SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/cef)
@@ -118,9 +86,48 @@ elseif (DARWIN)
${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a
${ARCH_PREBUILT_DIRS_RELEASE}/libdullahan.a
${APPKIT_LIBRARY}
- "-F ${CEF_LIBRARY}"
)
+ execute_process(
+ COMMAND lipo Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework
+ COMMAND lipo Chromium\ Embedded\ Framework.framework/Libraries/libEGL.dylib
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output Chromium\ Embedded\ Framework.framework/Libraries/libEGL.dylib
+ COMMAND lipo Chromium\ Embedded\ Framework.framework/Libraries/libGLESv2.dylib
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output Chromium\ Embedded\ Framework.framework/Libraries/libGLESv2.dylib
+ COMMAND lipo Chromium\ Embedded\ Framework.framework/Libraries/libcef_sandbox.dylib
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output Chromium\ Embedded\ Framework.framework/Libraries/libcef_sandbox.dylib
+ COMMAND lipo Chromium\ Embedded\ Framework.framework/Libraries/libvk_swiftshader.dylib
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output Chromium\ Embedded\ Framework.framework/Libraries/libvk_swiftshader.dylib
+ COMMAND lipo DullahanHelper\ \(Alerts\).app/Contents/MacOS/DullahanHelper\ \(Alerts\)
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output DullahanHelper\ \(Alerts\).app/Contents/MacOS/DullahanHelper\ \(Alerts\)
+ COMMAND lipo DullahanHelper\ \(GPU\).app/Contents/MacOS/DullahanHelper\ \(GPU\)
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output DullahanHelper\ \(GPU\).app/Contents/MacOS/DullahanHelper\ \(GPU\)
+ COMMAND lipo DullahanHelper\ \(Plugin\).app/Contents/MacOS/DullahanHelper\ \(Plugin\)
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output DullahanHelper\ \(Plugin\).app/Contents/MacOS/DullahanHelper\ \(Plugin\)
+ COMMAND lipo DullahanHelper\ \(Renderer\).app/Contents/MacOS/DullahanHelper\ \(Renderer\)
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output DullahanHelper\ \(Renderer\).app/Contents/MacOS/DullahanHelper\ \(Renderer\)
+ COMMAND lipo DullahanHelper.app/Contents/MacOS/DullahanHelper
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output DullahanHelper.app/Contents/MacOS/DullahanHelper
+ COMMAND lipo libcef_dll_wrapper.a
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output libcef_dll_wrapper.a
+ COMMAND lipo libdullahan.a
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output libdullahan.a
+ WORKING_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE}
+ )
+
elseif (LINUX)
target_link_libraries( ll::cef INTERFACE
libdullahan.a
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 746d242560..be1e9008e5 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -19,11 +19,13 @@ set(cmake_SOURCE_FILES
Copy3rdPartyLibs.cmake
DBusGlib.cmake
DeploySharedLibs.cmake
+ Discord.cmake
DragDrop.cmake
EXPAT.cmake
FindAutobuild.cmake
FMODSTUDIO.cmake
FreeType.cmake
+ GLEXT.cmake
GLH.cmake
GLM.cmake
Havok.cmake
@@ -54,10 +56,12 @@ set(cmake_SOURCE_FILES
TemplateCheck.cmake
TinyEXR.cmake
TinyGLTF.cmake
+ Tracy.cmake
Tut.cmake
UI.cmake
UnixInstall.cmake
Variables.cmake
+ VHACD.cmake
ViewerMiscLibs.cmake
VisualLeakDetector.cmake
LibVLCPlugin.cmake
diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake
index 06d5927174..99045e3aa3 100644
--- a/indra/cmake/CURL.cmake
+++ b/indra/cmake/CURL.cmake
@@ -5,8 +5,9 @@ include(Linking)
include_guard()
add_library( ll::libcurl INTERFACE IMPORTED )
-#use_system_binary(libcurl)
-if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR WINDOWS)
+if ($ENV{MSYSTEM_CARCH} MATCHES aarch64)
+use_system_binary(libcurl)
+elseif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR WINDOWS)
use_prebuilt_binary(curl)
if (DARWIN)
execute_process(
@@ -26,20 +27,20 @@ use_prebuilt_binary(curl)
endif ()
endif ()
elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/curl_installed OR NOT ${curl_installed} EQUAL 0)
- if (NOT EXISTS ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.tar.gz)
+ if (NOT EXISTS ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r3.tar.gz)
file(DOWNLOAD
- https://github.com/secondlife/3p-curl/archive/refs/tags/v7.54.1-r1.tar.gz
- ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.tar.gz
+ https://github.com/secondlife/3p-curl/archive/refs/tags/v7.54.1-r3.tar.gz
+ ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r3.tar.gz
)
endif ()
file(ARCHIVE_EXTRACT
- INPUT ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.tar.gz
+ INPUT ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r3.tar.gz
DESTINATION ${CMAKE_BINARY_DIR}
)
- if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64 AND (${LINUX_DISTRO} MATCHES fedora))
+ if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
execute_process(
COMMAND sed -i netrc.c -e "s/defined(HAVE_GETPWUID_R)/0/g" netrc.c
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1/curl/lib
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r3/curl/lib
)
endif ()
file(
@@ -59,16 +60,16 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA
set(ENV{CFLAGS} "-std=c90")
execute_process(
COMMAND ./configure --disable-alt-svc --disable-dict --disable-doh --disable-file --disable-gopher --disable-headers-api --disable-hsts --disable-imap --disable-ldap --disable-ldaps --disable-libcurl-option --disable-manual --disable-mqtt --disable-ntlm --disable-ntlm-wb --disable-pop3 --disable-rtsp --disable-shared --disable-smb --disable-smtp --disable-sspi --disable-telnet --disable-tftp --disable-tls-srp --disable-unix-sockets --disable-verbose --disable-versioned-symbols --enable-threaded-resolver --with-ssl=${LIBS_PREBUILT_DIR} --without-libidn2 --without-libpsl --without-libssh2 --prefix=${LIBS_PREBUILT_DIR} --libdir=${ARCH_PREBUILT_DIRS_RELEASE}
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1/curl
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r3/curl
)
execute_process(
COMMAND make -j${MAKE_JOBS}
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1/curl
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r3/curl
)
unset(ENV{CFLAGS})
execute_process(
COMMAND make install
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1/curl
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r3/curl
RESULT_VARIABLE curl_installed
)
if (CMAKE_SYSTEM_NAME MATCHES FreeBSD)
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 6ac00fd131..680f2f3ac2 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -6,6 +6,9 @@
include(CMakeCopyIfDifferent)
include(Linking)
+if (USE_DISCORD)
+ include(Discord)
+endif ()
include(OPENAL)
# When we copy our dependent libraries, we almost always want to copy them to
@@ -56,11 +59,6 @@ if(WINDOWS)
openjp2.dll
)
- if(LLCOMMON_LINK_SHARED)
- set(release_files ${release_files} libapr-1.dll)
- set(release_files ${release_files} libaprutil-1.dll)
- endif()
-
# Filenames are different for 32/64 bit BugSplat file and we don't
# have any control over them so need to branch.
if (USE_BUGSPLAT)
@@ -75,6 +73,10 @@ if(WINDOWS)
endif(ADDRESS_SIZE EQUAL 32)
endif (USE_BUGSPLAT)
+ if (TARGET ll::discord_sdk)
+ list(APPEND release_files discord_partner_sdk.dll)
+ endif ()
+
if (TARGET ll::openal)
list(APPEND release_files openal32.dll alut.dll)
endif ()
@@ -171,14 +173,9 @@ elseif(DARWIN)
libndofdev.dylib
)
- if(LLCOMMON_LINK_SHARED)
- set(release_files ${release_files}
- libapr-1.0.dylib
- libapr-1.dylib
- libaprutil-1.0.dylib
- libaprutil-1.dylib
- )
- endif()
+ if (TARGET ll::discord_sdk)
+ list(APPEND release_files libdiscord_partner_sdk.dylib)
+ endif ()
if (TARGET ll::openal)
list(APPEND release_files libalut.dylib libopenal.dylib)
@@ -225,13 +222,6 @@ elseif(LINUX)
libgmodule-2.0.so
libgobject-2.0.so
)
-
- if(LLCOMMON_LINK_SHARED)
- set(release_files ${release_files}
- libapr-1.so.0
- libaprutil-1.so.0
- )
- endif()
endif()
else(WINDOWS)
diff --git a/indra/cmake/Discord.cmake b/indra/cmake/Discord.cmake
new file mode 100644
index 0000000000..f474457b03
--- /dev/null
+++ b/indra/cmake/Discord.cmake
@@ -0,0 +1,54 @@
+include(Prebuilt)
+
+include_guard()
+
+add_library(ll::discord_sdk INTERFACE IMPORTED)
+target_compile_definitions(ll::discord_sdk INTERFACE LL_DISCORD=1)
+
+#use_prebuilt_binary(discord_sdk)
+
+if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/discord_sdk_installed OR NOT ${discord_sdk_installed} EQUAL 0)
+ file(ARCHIVE_EXTRACT
+ INPUT $ENV{HOME}/Downloads/DiscordSocialSdk-1.8.13395.zip
+ DESTINATION ${CMAKE_BINARY_DIR}
+ )
+ file(MAKE_DIRECTORY ${LIBS_PREBUILT_DIR}/include/discord_sdk)
+ file(
+ COPY
+ ${CMAKE_BINARY_DIR}/discord_social_sdk/include/cdiscord.h
+ ${CMAKE_BINARY_DIR}/discord_social_sdk/include/discordpp.h
+ DESTINATION ${LIBS_PREBUILT_DIR}/include/discord_sdk
+ )
+ if (WINDOWS)
+ file(
+ COPY ${CMAKE_BINARY_DIR}/discord_social_sdk/bin/release/discord_partner_sdk.dll
+ DESTINATION ${LIBS_PREBUILT_DIR}/bin/release
+ )
+ set(LIBRARY_EXTENSION lib)
+ else ()
+ set(LIBRARY_PREFIX lib)
+ set(LIBRARY_EXTENSION so)
+ endif ()
+ if (DARWIN)
+ execute_process(
+ COMMAND lipo
+ libdiscord_partner_sdk.dylib
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscord_partner_sdk.dylib
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/discord_social_sdk/lib/release
+ )
+ else ()
+ file(
+ COPY ${CMAKE_BINARY_DIR}/discord_social_sdk/lib/release/${LIBRARY_PREFIX}discord_partner_sdk.${LIBRARY_EXTENSION}
+ DESTINATION ${ARCH_PREBUILT_DIRS_RELEASE}
+ )
+ endif ()
+ file(WRITE ${PREBUILD_TRACKING_DIR}/discord_sdk_installed "0")
+endif ()
+
+target_include_directories(ll::discord_sdk SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/discord_sdk)
+find_library(DISCORD_LIBRARY
+ NAMES
+ discord_partner_sdk
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+target_link_libraries(ll::discord_sdk INTERFACE ${DISCORD_LIBRARY})
diff --git a/indra/cmake/EXPAT.cmake b/indra/cmake/EXPAT.cmake
index 1a0b8789dc..fe6dced795 100644
--- a/indra/cmake/EXPAT.cmake
+++ b/indra/cmake/EXPAT.cmake
@@ -2,18 +2,21 @@
include(Prebuilt)
include_guard()
-add_library( ll::expat INTERFACE IMPORTED )
+add_library(ll::expat INTERFACE IMPORTED)
use_system_binary(expat)
use_prebuilt_binary(expat)
+
if (WINDOWS)
- target_compile_definitions( ll::expat INTERFACE XML_STATIC=1)
- target_link_libraries( ll::expat INTERFACE
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libexpatd.lib
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.lib)
-else ()
- target_link_libraries( ll::expat INTERFACE
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libexpat.a
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.a)
+ target_compile_definitions(ll::expat INTERFACE XML_STATIC=1)
endif ()
-target_include_directories( ll::expat SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include )
+
+find_library(EXPAT_LIBRARY
+ NAMES
+ libexpat.lib
+ libexpat.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::expat INTERFACE ${EXPAT_LIBRARY})
+
+target_include_directories(ll::expat SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include)
diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake
index fb4734fe7b..2342f07e53 100644
--- a/indra/cmake/FMODSTUDIO.cmake
+++ b/indra/cmake/FMODSTUDIO.cmake
@@ -34,7 +34,7 @@ if (USE_FMODSTUDIO)
file(MAKE_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE})
if (DARWIN)
execute_process(
- COMMAND hdiutil attach -noverify fmodstudioapi20228mac-installer.dmg
+ COMMAND hdiutil attach -noverify fmodstudioapi20233mac-installer.dmg
WORKING_DIRECTORY $ENV{HOME}/Downloads
)
file(
@@ -64,36 +64,36 @@ if (USE_FMODSTUDIO)
file(WRITE ${PREBUILD_TRACKING_DIR}/fmodstudio_installed "${fmodstudio_installed}")
else ()
file(ARCHIVE_EXTRACT
- INPUT $ENV{HOME}/Downloads/fmodstudioapi20228linux.tar.gz
+ INPUT $ENV{HOME}/Downloads/fmodstudioapi20233linux.tar.gz
DESTINATION ${CMAKE_BINARY_DIR}
)
file(
COPY
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/inc/fmod.h
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/inc/fmod.hpp
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/inc/fmod_codec.h
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/inc/fmod_common.h
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/inc/fmod_dsp.h
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/inc/fmod_dsp_effects.h
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/inc/fmod_errors.h
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/inc/fmod_output.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/inc/fmod.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/inc/fmod.hpp
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/inc/fmod_codec.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/inc/fmod_common.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/inc/fmod_dsp.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/inc/fmod_dsp_effects.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/inc/fmod_errors.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/inc/fmod_output.h
DESTINATION ${LIBS_PREBUILT_DIR}/include/fmodstudio
)
if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
file(
COPY
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/lib/arm64/libfmod.so
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/lib/arm64/libfmod.so.13
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/lib/arm64/libfmod.so.13.28
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/lib/arm64/libfmod.so
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/lib/arm64/libfmod.so.13
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/lib/arm64/libfmod.so.13.33
DESTINATION ${ARCH_PREBUILT_DIRS_RELEASE}
FOLLOW_SYMLINK_CHAIN
)
else ()
file(
COPY
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so.13
- ${CMAKE_BINARY_DIR}/fmodstudioapi20228linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so.13.28
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so.13
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20233linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so.13.33
DESTINATION ${ARCH_PREBUILT_DIRS_RELEASE}
FOLLOW_SYMLINK_CHAIN
)
@@ -107,6 +107,7 @@ if (USE_FMODSTUDIO)
target_link_libraries( ll::fmodstudio INTERFACE fmod_vc)
elseif (DARWIN)
#despite files being called libfmod.dylib, we are searching for fmod
+ target_link_directories( ll::fmodstudio INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE})
target_link_libraries( ll::fmodstudio INTERFACE fmod)
elseif (LINUX)
target_link_libraries( ll::fmodstudio INTERFACE fmod)
diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake
index d5c7891032..09dc649515 100644
--- a/indra/cmake/FreeType.cmake
+++ b/indra/cmake/FreeType.cmake
@@ -16,9 +16,10 @@ use_system_binary(freetype)
use_prebuilt_binary(freetype)
target_include_directories( ll::freetype SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/freetype2/)
-if (WINDOWS)
- target_link_libraries( ll::freetype INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/freetype.lib)
-else()
- target_link_libraries( ll::freetype INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libfreetype.a)
-endif()
+find_library(FREETYPE_LIBRARY
+ NAMES
+ freetype.lib
+ libfreetype.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+target_link_libraries(ll::freetype INTERFACE ${FREETYPE_LIBRARY})
diff --git a/indra/cmake/GLEXT.cmake b/indra/cmake/GLEXT.cmake
index a780966f0c..f45b27e7b8 100644
--- a/indra/cmake/GLEXT.cmake
+++ b/indra/cmake/GLEXT.cmake
@@ -3,7 +3,9 @@ include(Prebuilt)
include(GLH)
add_library( ll::glext INTERFACE IMPORTED )
-use_system_binary(glext)
+#use_system_binary(glext)
+if (WINDOWS)
use_prebuilt_binary(glext)
+endif ()
diff --git a/indra/cmake/Hunspell.cmake b/indra/cmake/Hunspell.cmake
index 129679febd..b063363bc0 100644
--- a/indra/cmake/Hunspell.cmake
+++ b/indra/cmake/Hunspell.cmake
@@ -8,17 +8,17 @@ use_prebuilt_binary(dictionaries)
add_library( ll::hunspell INTERFACE IMPORTED )
use_system_binary(hunspell)
use_prebuilt_binary(libhunspell)
+
if (WINDOWS)
target_compile_definitions( ll::hunspell INTERFACE HUNSPELL_STATIC=1)
- target_link_libraries( ll::hunspell INTERFACE
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libhunspell.lib
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libhunspell.lib
- )
-elseif(DARWIN)
- target_link_libraries( ll::hunspell INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libhunspell-1.7.a
- )
-elseif(LINUX)
- target_link_libraries( ll::hunspell INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libhunspell-1.7.a
- )
endif()
+
+find_library(HUNSPELL_LIBRARY
+ NAMES
+ libhunspell.lib
+ libhunspell-1.7.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::hunspell INTERFACE ${HUNSPELL_LIBRARY})
+
target_include_directories( ll::hunspell SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/hunspell)
diff --git a/indra/cmake/JPEG.cmake b/indra/cmake/JPEG.cmake
index ade5a070cc..f864ca7f8d 100644
--- a/indra/cmake/JPEG.cmake
+++ b/indra/cmake/JPEG.cmake
@@ -8,13 +8,13 @@ add_library( ll::libjpeg INTERFACE IMPORTED )
use_system_binary(libjpeg)
use_prebuilt_binary(libjpeg-turbo)
-if (LINUX)
- target_link_libraries( ll::libjpeg INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libjpeg.a)
-elseif (DARWIN)
- target_link_libraries( ll::libjpeg INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libjpeg.a)
-elseif (WINDOWS)
- target_link_libraries( ll::libjpeg INTERFACE
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/jpeg.lib
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/jpeg.lib)
-endif (LINUX)
-target_include_directories( ll::libjpeg SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include)
+
+find_library(JPEG_LIBRARY
+ NAMES
+ jpeg.lib
+ libjpeg.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::libjpeg INTERFACE ${JPEG_LIBRARY})
+
+target_include_directories(ll::libjpeg SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include)
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index 5d96a4398f..15d5be235c 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -99,6 +99,13 @@ MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)
target_include_directories (PROJECT_${project}_TEST_${name} PRIVATE ${LIBS_OPEN_DIR}/test )
set_target_properties(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
+ if (DARWIN)
+ set_target_properties(PROJECT_${project}_TEST_${name}
+ PROPERTIES
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_RPATH "@executable_path/Resources"
+ )
+ endif(DARWIN)
#
# Per-codefile additional / external project dep and lib dep property extraction
@@ -232,7 +239,10 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
# test binaries always need to be signed for local development
set_target_properties(INTEGRATION_TEST_${testname}
PROPERTIES
- XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "-")
+ XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "-"
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_RPATH "@executable_path/Resources"
+ )
endif ()
# Add link deps to the executable
diff --git a/indra/cmake/LLKDU.cmake b/indra/cmake/LLKDU.cmake
index 668b07ffab..7680ab7b54 100644
--- a/indra/cmake/LLKDU.cmake
+++ b/indra/cmake/LLKDU.cmake
@@ -13,14 +13,26 @@ add_library( ll::kdu INTERFACE IMPORTED )
if (USE_KDU)
include(Prebuilt)
use_prebuilt_binary(kdu)
+
if (WINDOWS)
- target_link_libraries( ll::kdu INTERFACE kdu.lib)
+ find_library(KDU_LIBRARY
+ NAMES
+ kdu
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
else (WINDOWS)
- target_link_libraries( ll::kdu INTERFACE libkdu.a)
+ find_library(KDU_LIBRARY
+ NAMES
+ libkdu.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
endif (WINDOWS)
+ target_link_libraries(ll::kdu INTERFACE ${KDU_LIBRARY})
+
target_include_directories( ll::kdu SYSTEM INTERFACE
${AUTOBUILD_INSTALL_DIR}/include/kdu
${LIBS_OPEN_DIR}/llkdu
)
+ target_compile_definitions(ll::kdu INTERFACE KDU_NO_THREADS=1)
endif (USE_KDU)
diff --git a/indra/cmake/LLPhysicsExtensions.cmake b/indra/cmake/LLPhysicsExtensions.cmake
index 80d243d9f8..84722b45a7 100644
--- a/indra/cmake/LLPhysicsExtensions.cmake
+++ b/indra/cmake/LLPhysicsExtensions.cmake
@@ -22,14 +22,25 @@ if (HAVOK)
include(Havok)
use_prebuilt_binary(llphysicsextensions_source)
set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/src)
- target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions)
+ if(DARWIN)
+ set(LLPHYSICSEXTENSIONS_STUB_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/stub)
+ # can't set these library dependencies per-arch here, need to do it using XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=*] in newview/CMakeLists.txt
+ #target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions)
+ #target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensionsstub)
+ else()
+ target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions)
+ target_compile_definitions( llphysicsextensions_impl INTERFACE LL_HAVOK=1 )
+ endif()
+ target_include_directories( llphysicsextensions_impl INTERFACE ${LIBS_PREBUILT_DIR}/include/llphysicsextensions)
elseif (HAVOK_TPV)
use_prebuilt_binary(llphysicsextensions_tpv)
- target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions_tpv)
-else (HAVOK)
- use_prebuilt_binary(llphysicsextensions_stub)
- set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/stub)
- target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensionsstub)
-endif (HAVOK)
-
-target_include_directories( llphysicsextensions_impl INTERFACE ${LIBS_PREBUILT_DIR}/include/llphysicsextensions)
+ if (NOT DARWIN)
+ if(WINDOWS)
+ target_link_libraries( llphysicsextensions_impl INTERFACE ${ARCH_PREBUILT_DIRS}/llphysicsextensions_tpv.lib)
+ elseif(LINUX)
+ target_link_libraries( llphysicsextensions_impl INTERFACE ${ARCH_PREBUILT_DIRS}/libllphysicsextensions_tpv.a)
+ endif()
+ target_compile_definitions( llphysicsextensions_impl INTERFACE LL_HAVOK=1 )
+ endif()
+ target_include_directories( llphysicsextensions_impl INTERFACE ${LIBS_PREBUILT_DIR}/include/llphysicsextensions)
+endif ()
diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake
index 3429a744f5..09413c912d 100644
--- a/indra/cmake/LLPrimitive.cmake
+++ b/indra/cmake/LLPrimitive.cmake
@@ -18,49 +18,72 @@ if( USE_CONAN )
"${CONAN_INCLUDE_DIRS_COLLADADOM}/collada-dom/1.4/" )
endif()
-if( LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
- # Build of the collada-dom for Linux and FreeBSD is done in
- # indra/llprimitive/CMakeLists.txt
- return()
-elseif ( NOT WINDOWS )
+if (TRUE)
include(FindPkgConfig)
pkg_check_modules(Minizip REQUIRED minizip)
pkg_check_modules(Libxml2 REQUIRED libxml-2.0)
target_link_libraries( ll::minizip-ng INTERFACE ${Minizip_LIBRARIES} )
target_link_libraries( ll::libxml INTERFACE ${Libxml2_LIBRARIES} )
- if( ${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/colladadom_installed OR NOT ${colladadom_installed} EQUAL 0 )
- if( NOT EXISTS ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz )
+ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/colladadom_installed OR NOT ${colladadom_installed} EQUAL 0)
+ if (NOT EXISTS ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10.tar.gz)
file(DOWNLOAD
- https://github.com/secondlife/3p-colladadom/archive/refs/tags/v2.3-r8.tar.gz
- ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz
+ https://github.com/secondlife/3p-colladadom/archive/refs/tags/v2.3-r10.tar.gz
+ ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10.tar.gz
)
- endif()
+ endif ()
file(ARCHIVE_EXTRACT
- INPUT ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz
+ INPUT ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10.tar.gz
DESTINATION ${CMAKE_BINARY_DIR}
)
- if ( WINDOWS )
+ if (WINDOWS OR CMAKE_COMMAND MATCHES /usr/bin/cmake)
execute_process(
- COMMAND sed -i "s/SHARED/STATIC/g" CMakeLists.txt
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8/src/1.4
+ COMMAND sed -i "s/include_directories/cmake_minimum_required(VERSION 3.28)\\ninclude_directories/" CMakeLists.txt
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10
)
- set(BOOST_LIBRARY_SUFFIX -vc143-mt-x64-1_88)
else ()
execute_process(
- COMMAND sed -i "" -e "s/SHARED/STATIC/g" CMakeLists.txt
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8/src/1.4
+ COMMAND sed -i "" -e "s/include_directories/cmake_minimum_required(VERSION 3.28)\\ninclude_directories/" CMakeLists.txt
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10
)
endif ()
- if( DARWIN )
- set(BOOST_CFLAGS -I${Libxml2_LIBRARY_DIRS}exec/boost/1.87/include)
- set(BOOST_LIBS -L${Minizip_LIBRARY_DIRS}exec/boost/1.87/lib)
+ if (WINDOWS)
+ execute_process(
+ COMMAND sed -i "s/SHARED/STATIC/" 1.4/CMakeLists.txt
+ COMMAND sed -i "/#include <cstdarg>/a #define WIN32" dae/daeUtils.cpp
+ COMMAND sed -i "/using namespace cdom;/a namespace boost{void boost::throw_exception(class std::exception const &){}}" dae/daeURI.cpp
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10/src
+ )
+ else ()
+ execute_process(
+ COMMAND sed -i "" -e "s/SHARED/STATIC/" src/1.4/CMakeLists.txt
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10
+ )
+ endif ()
+ if (DARWIN)
+ set(BOOST_CFLAGS -I${Libxml2_LIBRARY_DIRS}exec/boost/1.88/include)
+ set(BOOST_LIBS -L${Minizip_LIBRARY_DIRS}exec/boost/1.88/lib)
set(BOOST_LIBRARY_SUFFIX -mt)
- endif()
+ elseif (WINDOWS)
+ set(BOOST_CFLAGS -I${prefix_result}/../include)
+ set(BOOST_LIBS -L${prefix_result})
+ if ($ENV{MSYSTEM_CARCH} MATCHES aarch64)
+ set(BOOST_LIBRARY_SUFFIX -vc143-mt-a64-1_90)
+ else ()
+ set(BOOST_LIBRARY_SUFFIX -vc143-mt-x64-1_90)
+ endif ()
+ elseif (CMAKE_SYSTEM_NAME MATCHES FreeBSD)
+ set(BOOST_CFLAGS -I/usr/local/include)
+ execute_process(
+ COMMAND sed -i "" -e "s/endif 0/endif/" dae/daeUtils.cpp
+ COMMAND sed -i "" -e "s/linux/FreeBSD/" dae/daeUtils.cpp
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10/src
+ )
+ endif ()
file(MAKE_DIRECTORY ${LIBS_PREBUILT_DIR}/include/collada/1.4)
try_compile(COLLADADOM_RESULT
PROJECT colladadom
- SOURCE_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8
- BINARY_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8
+ SOURCE_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10
+ BINARY_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10
TARGET collada14dom
CMAKE_FLAGS
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
@@ -78,49 +101,79 @@ elseif ( NOT WINDOWS )
-DOPT_COLLADA14:BOOL=ON
-DCOLLADA_DOM_INCLUDE_INSTALL_DIR:PATH=${LIBS_PREBUILT_DIR}/include/collada
)
- if( ${COLLADADOM_RESULT} )
+ if (WINDOWS)
+ execute_process(
+ COMMAND MSBuild.exe ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10/Project.sln -p:Configuration=${CMAKE_BUILD_TYPE}
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10
+ OUTPUT_VARIABLE colladadom_installed
+ )
+ file(REMOVE_RECURSE ${LIBS_PREBUILT_DIR}/include/collada)
+ file(
+ COPY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10/include
+ DESTINATION ${LIBS_PREBUILT_DIR}/include
+ )
+ file(RENAME
+ ${LIBS_PREBUILT_DIR}/include/include
+ ${LIBS_PREBUILT_DIR}/include/collada
+ )
+ file(MAKE_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE})
+ file(RENAME
+ ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10/src/1.4/${CMAKE_BUILD_TYPE}/collada14dom.lib
+ ${ARCH_PREBUILT_DIRS_RELEASE}/libcollada14dom23-s.lib
+ )
+ elseif (${COLLADADOM_RESULT})
execute_process(
COMMAND ${CMAKE_MAKE_PROGRAM} install
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r10
OUTPUT_VARIABLE colladadom_installed
)
file(RENAME
${ARCH_PREBUILT_DIRS}/libcollada14dom.a
${ARCH_PREBUILT_DIRS_RELEASE}/libcollada14dom.a
)
- file(WRITE ${PREBUILD_TRACKING_DIR}/colladadom_installed "${colladadom_installed}")
- endif()
- endif()
-endif()
+ endif ()
+ file(WRITE ${PREBUILD_TRACKING_DIR}/colladadom_installed "${colladadom_installed}")
+ endif ()
-#use_system_binary( colladadom )
+else (TRUE)
+
+use_system_binary( colladadom )
-if (WINDOWS)
use_prebuilt_binary(colladadom)
-endif ()
-if( FALSE )
use_prebuilt_binary(minizip-ng) # needed for colladadom
use_prebuilt_binary(libxml2)
-if (WINDOWS)
- target_link_libraries( ll::minizip-ng INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/minizip.lib )
-else()
- target_link_libraries( ll::minizip-ng INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libminizip.a )
-endif()
+find_library(MINIZIPNG_LIBRARY
+ NAMES
+ minizip.lib
+ libminizip.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::minizip-ng INTERFACE ${MINIZIPNG_LIBRARY})
+
+find_library(LIBXML2_LIBRARY
+ NAMES
+ libxml2.lib
+ libxml2.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::libxml INTERFACE ${LIBXML2_LIBRARY})
if (WINDOWS)
- target_link_libraries( ll::libxml INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libxml2.lib Bcrypt.lib)
-else()
- target_link_libraries( ll::libxml INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libxml2.a)
+ target_link_libraries( ll::libxml INTERFACE Bcrypt.lib)
endif()
-endif( FALSE )
+
+endif (TRUE)
target_include_directories( ll::colladadom SYSTEM INTERFACE
${LIBS_PREBUILT_DIR}/include/collada
${LIBS_PREBUILT_DIR}/include/collada/1.4
)
-if (WINDOWS)
- target_link_libraries(ll::colladadom INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libcollada14dom23-s.lib ll::libxml ll::minizip-ng )
-else ()
- target_link_libraries(ll::colladadom INTERFACE collada14dom ll::boost ll::libxml ll::minizip-ng)
-endif()
+
+find_library(COLLADADOM_LIBRARY
+ NAMES
+ libcollada14dom23-s.lib
+ collada14dom
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::colladadom INTERFACE ${COLLADADOM_LIBRARY} ll::boost ll::libxml ll::minizip-ng)
diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake
index 34df3ad33b..007b8dfba6 100644
--- a/indra/cmake/LLWindow.cmake
+++ b/indra/cmake/LLWindow.cmake
@@ -1,7 +1,7 @@
# -*- cmake -*-
include(Variables)
-include(GLH)
+include(GLEXT)
include(Prebuilt)
include_guard()
diff --git a/indra/cmake/LibVLCPlugin.cmake b/indra/cmake/LibVLCPlugin.cmake
index 5ed77af0c2..981f020745 100644
--- a/indra/cmake/LibVLCPlugin.cmake
+++ b/indra/cmake/LibVLCPlugin.cmake
@@ -12,21 +12,27 @@ if (DARWIN)
set(ARCHITECTURE ${CMAKE_OSX_ARCHITECTURES})
endif ()
if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/vlc_installed OR NOT ${vlc_installed} EQUAL 0)
- if (NOT EXISTS ${CMAKE_BINARY_DIR}/vlc-3.0.21-${ARCHITECTURE}.dmg)
+ if (NOT EXISTS ${CMAKE_BINARY_DIR}/vlc-3.0.23-${ARCHITECTURE}.dmg)
file(DOWNLOAD
- https://get.videolan.org/vlc/3.0.21/macosx/vlc-3.0.21-${ARCHITECTURE}.dmg
- ${CMAKE_BINARY_DIR}/vlc-3.0.21-${ARCHITECTURE}.dmg
+ https://get.videolan.org/vlc/3.0.23/macosx/vlc-3.0.23-${ARCHITECTURE}.dmg
+ ${CMAKE_BINARY_DIR}/vlc-3.0.23-${ARCHITECTURE}.dmg
)
endif ()
file(WRITE ${PREBUILD_TRACKING_DIR}/vlc_installed "0")
endif ()
execute_process(
- COMMAND hdiutil attach -noverify vlc-3.0.21-${ARCHITECTURE}.dmg
+ COMMAND hdiutil attach -noverify vlc-3.0.23-${ARCHITECTURE}.dmg
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
target_include_directories( ll::libvlc SYSTEM INTERFACE /Volumes/VLC\ media\ player/VLC.app/Contents/MacOS/include)
target_link_directories( ll::libvlc INTERFACE /Volumes/VLC\ media\ player/VLC.app/Contents/MacOS/lib)
target_link_libraries( ll::libvlc INTERFACE vlc vlccore )
+elseif (WINDOWS)
+use_prebuilt_binary(vlc-bin)
+ target_link_libraries( ll::libvlc INTERFACE
+ libvlc.lib
+ libvlccore.lib
+ )
else ()
include(FindPkgConfig)
pkg_check_modules(Libvlc REQUIRED libvlc vlc-plugin)
@@ -35,7 +41,6 @@ else ()
target_link_libraries( ll::libvlc INTERFACE ${Libvlc_LIBRARIES} )
endif ()
-#use_prebuilt_binary(vlc-bin)
set(LIBVLCPLUGIN ON CACHE BOOL
"LIBVLCPLUGIN support for the llplugin/llmedia test apps.")
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index 8e91dac109..c9a0d69afc 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -38,9 +38,10 @@ endif ()
# windows) and CMAKE_BUILD_TYPE on Makefile based generators (like linux). The reason for this is
# that CMAKE_BUILD_TYPE is essentially meaningless at configuration time for IDE generators and
# CMAKE_CFG_INTDIR is meaningless at build time for Makefile generators
-
-link_directories(${AUTOBUILD_INSTALL_DIR}/lib/$<LOWER_CASE:$<CONFIG>>)
-link_directories(${AUTOBUILD_INSTALL_DIR}/lib/release)
+if(NOT DARWIN)
+ link_directories(${AUTOBUILD_INSTALL_DIR}/lib/$<LOWER_CASE:$<CONFIG>>)
+ link_directories(${AUTOBUILD_INSTALL_DIR}/lib/release)
+endif(NOT DARWIN)
add_library( ll::oslibraries INTERFACE IMPORTED )
@@ -67,24 +68,25 @@ elseif (WINDOWS)
legacy_stdio_definitions
)
elseif (DARWIN)
- include(CMakeFindFrameworks)
find_library(COREFOUNDATION_LIBRARY CoreFoundation)
find_library(CARBON_LIBRARY Carbon)
find_library(COCOA_LIBRARY Cocoa)
find_library(IOKIT_LIBRARY IOKit)
- find_library(AGL_LIBRARY AGL)
find_library(APPKIT_LIBRARY AppKit)
find_library(COREAUDIO_LIBRARY CoreAudio)
+ find_library(COREGRAPHICS_LIBRARY CoreGraphics)
+ find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox)
target_link_libraries( ll::oslibraries INTERFACE
${COCOA_LIBRARY}
${IOKIT_LIBRARY}
${COREFOUNDATION_LIBRARY}
${CARBON_LIBRARY}
- ${AGL_LIBRARY}
${APPKIT_LIBRARY}
${COREAUDIO_LIBRARY}
+ ${AUDIOTOOLBOX_LIBRARY}
+ ${COREGRAPHICS_LIBRARY}
)
endif()
diff --git a/indra/cmake/Meshoptimizer.cmake b/indra/cmake/Meshoptimizer.cmake
index 5058614580..225f44b1fb 100644
--- a/indra/cmake/Meshoptimizer.cmake
+++ b/indra/cmake/Meshoptimizer.cmake
@@ -16,20 +16,20 @@ if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR CMAKE_
elseif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 AND NOT (${LINUX_DISTRO} MATCHES gentoo))
use_prebuilt_binary(meshoptimizer)
elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/meshoptimizer_installed OR NOT ${meshoptimizer_installed} EQUAL 0)
- if (NOT EXISTS ${CMAKE_BINARY_DIR}/meshoptimizer-0.21.tar.gz)
+ if (NOT EXISTS ${CMAKE_BINARY_DIR}/meshoptimizer-1.0.1.tar.gz)
file(DOWNLOAD
- https://github.com/zeux/meshoptimizer/archive/refs/tags/v0.21.tar.gz
- ${CMAKE_BINARY_DIR}/meshoptimizer-0.21.tar.gz
+ https://github.com/zeux/meshoptimizer/archive/refs/tags/v1.0.1.tar.gz
+ ${CMAKE_BINARY_DIR}/meshoptimizer-1.0.1.tar.gz
)
endif ()
file(ARCHIVE_EXTRACT
- INPUT ${CMAKE_BINARY_DIR}/meshoptimizer-0.21.tar.gz
+ INPUT ${CMAKE_BINARY_DIR}/meshoptimizer-1.0.1.tar.gz
DESTINATION ${CMAKE_BINARY_DIR}
)
try_compile(MESHOPTIMIZER_RESULT
PROJECT meshoptimizer
- SOURCE_DIR ${CMAKE_BINARY_DIR}/meshoptimizer-0.21
- BINARY_DIR ${CMAKE_BINARY_DIR}/meshoptimizer-0.21
+ SOURCE_DIR ${CMAKE_BINARY_DIR}/meshoptimizer-1.0.1
+ BINARY_DIR ${CMAKE_BINARY_DIR}/meshoptimizer-1.0.1
TARGET meshoptimizer
CMAKE_FLAGS
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
@@ -42,17 +42,19 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA
if (${MESHOPTIMIZER_RESULT})
execute_process(
COMMAND ${CMAKE_MAKE_PROGRAM} install
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/meshoptimizer-0.21
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/meshoptimizer-1.0.1
OUTPUT_VARIABLE meshoptimizer_installed
)
file(WRITE ${PREBUILD_TRACKING_DIR}/meshoptimizer_installed "${meshoptimizer_installed}")
endif ()
endif ()
-if (WINDOWS)
- target_link_libraries( ll::meshoptimizer INTERFACE meshoptimizer.lib)
-else ()
- target_link_libraries( ll::meshoptimizer INTERFACE libmeshoptimizer.a)
-endif (WINDOWS)
+find_library(MESHOPTIMIZER_LIBRARY
+ NAMES
+ meshoptimizer.lib
+ libmeshoptimizer.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
-target_include_directories( ll::meshoptimizer SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/meshoptimizer)
+target_link_libraries(ll::meshoptimizer INTERFACE ${MESHOPTIMIZER_LIBRARY})
+
+target_include_directories(ll::meshoptimizer SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/meshoptimizer)
diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake
index d6e5e53ac9..50f0ea1f51 100644
--- a/indra/cmake/NDOF.cmake
+++ b/indra/cmake/NDOF.cmake
@@ -7,9 +7,10 @@ include_guard()
add_library( ll::ndof INTERFACE IMPORTED )
if (NDOF)
- if (WINDOWS OR DARWIN)
- #use_prebuilt_binary(libndofdev)
- if (DARWIN AND (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/libndofdev_installed OR NOT ${libndofdev_installed} EQUAL 0))
+ if (WINDOWS)
+ use_prebuilt_binary(libndofdev)
+ elseif (DARWIN)
+ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/libndofdev_installed OR NOT ${libndofdev_installed} EQUAL 0)
file(DOWNLOAD
https://github.com/secondlife/3p-libndofdev/archive/refs/tags/v0.1.8e9edc7.tar.gz
${CMAKE_BINARY_DIR}/3p-libndofdev-0.1.8e9edc7.tar.gz
@@ -43,15 +44,45 @@ if (NDOF)
endif ()
endif ()
elseif (LINUX)
+ if (CMAKE_SYSTEM_PROCESSOR MATCHES x86_64)
use_prebuilt_binary(open-libndofdev)
- endif (WINDOWS OR DARWIN)
+ else ()
+ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/libndofdev_installed OR NOT ${libndofdev_installed} EQUAL 0)
+ file(DOWNLOAD
+ https://github.com/janoc/libndofdev/archive/refs/tags/v0.14.tar.gz
+ ${CMAKE_BINARY_DIR}/libndofdev-0.14.tar.gz
+ )
+ file(ARCHIVE_EXTRACT
+ INPUT ${CMAKE_BINARY_DIR}/libndofdev-0.14.tar.gz
+ DESTINATION ${CMAKE_BINARY_DIR}
+ )
+ set(ENV{USE_SDL2} 1)
+ execute_process(
+ COMMAND make -j${MAKE_JOBS}
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/libndofdev-0.14
+ RESULT_VARIABLE libndofdev_installed
+ )
+ unset(ENV{USE_SDL2})
+ file(
+ COPY ${CMAKE_BINARY_DIR}/libndofdev-0.14/ndofdev_external.h
+ DESTINATION ${LIBS_PREBUILT_DIR}/include
+ )
+ file(
+ COPY ${CMAKE_BINARY_DIR}/libndofdev-0.14/libndofdev.a
+ DESTINATION ${ARCH_PREBUILT_DIRS_RELEASE}
+ )
+ file(WRITE ${PREBUILD_TRACKING_DIR}/libndofdev_installed "${libndofdev_installed}")
+ endif ()
+ endif ()
+ endif ()
- if (WINDOWS)
- target_link_libraries( ll::ndof INTERFACE libndofdev)
- elseif (DARWIN OR LINUX)
- target_link_libraries( ll::ndof INTERFACE ndofdev)
- endif (WINDOWS)
- target_compile_definitions( ll::ndof INTERFACE LIB_NDOF=1)
-else()
- add_compile_options(-ULIB_NDOF)
+ find_library(NDOF_LIBRARY
+ NAMES
+ libndofdev
+ ndofdev
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ target_link_libraries(ll::ndof INTERFACE ${NDOF_LIBRARY})
+
+ target_compile_definitions(ll::ndof INTERFACE LIB_NDOF=1)
endif (NDOF)
diff --git a/indra/cmake/NGHTTP2.cmake b/indra/cmake/NGHTTP2.cmake
index 7b2aa5971f..e81204d716 100644
--- a/indra/cmake/NGHTTP2.cmake
+++ b/indra/cmake/NGHTTP2.cmake
@@ -6,9 +6,12 @@ add_library( ll::nghttp2 INTERFACE IMPORTED )
use_system_binary(nghttp2)
use_prebuilt_binary(nghttp2)
-if (WINDOWS)
- target_link_libraries( ll::nghttp2 INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/nghttp2.lib)
-else ()
- target_link_libraries( ll::nghttp2 INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libnghttp2.a)
-endif ()
+
+find_library(NGHTTP2_LIBRARY
+ NAMES
+ nghttp2.lib
+ libnghttp2.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::nghttp2 INTERFACE ${NGHTTP2_LIBRARY})
target_include_directories( ll::nghttp2 SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/nghttp2)
diff --git a/indra/cmake/NVAPI.cmake b/indra/cmake/NVAPI.cmake
index ff5a5428e0..1bec691a18 100644
--- a/indra/cmake/NVAPI.cmake
+++ b/indra/cmake/NVAPI.cmake
@@ -4,10 +4,10 @@ include(Prebuilt)
set(NVAPI ON CACHE BOOL "Use NVAPI.")
if (NVAPI)
- if (WINDOWS)
+ if (WINDOWS AND NOT ($ENV{MSYSTEM_CARCH} MATCHES aarch64))
add_library( ll::nvapi INTERFACE IMPORTED )
target_link_libraries( ll::nvapi INTERFACE nvapi)
use_prebuilt_binary(nvapi)
- endif (WINDOWS)
+ endif ()
endif (NVAPI)
diff --git a/indra/cmake/OPENAL.cmake b/indra/cmake/OPENAL.cmake
index f63e55cdf3..1b7f9b9071 100644
--- a/indra/cmake/OPENAL.cmake
+++ b/indra/cmake/OPENAL.cmake
@@ -8,7 +8,7 @@ include_guard()
# to have memory leaks, has no option to play music streams
# It probably makes sense to to completely remove it
-set(USE_OPENAL OFF CACHE BOOL "Enable OpenAL")
+set(USE_OPENAL ON CACHE BOOL "Enable OpenAL")
# ND: To streamline arguments passed, switch from OPENAL to USE_OPENAL
# To not break all old build scripts convert old arguments but warn about it
if(OPENAL)
@@ -31,20 +31,21 @@ if (USE_OPENAL)
target_compile_definitions( ll::openal INTERFACE LL_OPENAL=1)
use_prebuilt_binary(openal)
- if(WINDOWS)
- target_link_libraries( ll::openal INTERFACE
- OpenAL32
- alut
- )
- elseif(LINUX)
- target_link_libraries( ll::openal INTERFACE
- openal
- alut
- )
- else()
- target_link_libraries( ll::openal INTERFACE
- openal
- alut
- )
- endif()
+ find_library(OPENAL_LIBRARY
+ NAMES
+ OpenAL32
+ openal
+ libopenal.dylib
+ libopenal.so
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ find_library(ALUT_LIBRARY
+ NAMES
+ alut
+ libalut.dylib
+ libalut.so
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+ target_link_libraries(ll::openal INTERFACE ${OPENAL_LIBRARY} ${ALUT_LIBRARY})
+
endif ()
diff --git a/indra/cmake/OpenJPEG.cmake b/indra/cmake/OpenJPEG.cmake
index 5729f6a10e..125f32e711 100644
--- a/indra/cmake/OpenJPEG.cmake
+++ b/indra/cmake/OpenJPEG.cmake
@@ -1,7 +1,9 @@
# -*- cmake -*-
+include_guard()
+
include(Prebuilt)
+include(Linking)
-include_guard()
add_library( ll::openjpeg INTERFACE IMPORTED )
#use_system_binary(openjpeg)
@@ -19,7 +21,7 @@ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKIN
DESTINATION ${CMAKE_BINARY_DIR}
)
- if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu))
+ if (${LINUX_DISTRO} MATCHES ubuntu)
try_compile(OPENJPEG_RESULT
PROJECT OPENJPEG
SOURCE_DIR ${CMAKE_BINARY_DIR}/openjpeg-2.5.3
@@ -61,7 +63,7 @@ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKIN
file(WRITE ${PREBUILD_TRACKING_DIR}/openjpeg_installed "${openjpeg_installed}")
endif ()
-if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu))
+if (${LINUX_DISTRO} MATCHES ubuntu)
target_link_libraries(ll::openjpeg INTERFACE openjp2 )
else ()
include(FindPkgConfig)
diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake
index ef90068993..54f989d611 100644
--- a/indra/cmake/OpenSSL.cmake
+++ b/indra/cmake/OpenSSL.cmake
@@ -5,9 +5,25 @@ include(Linking)
include_guard()
add_library( ll::openssl INTERFACE IMPORTED )
-#use_system_binary(openssl)
-if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR WINDOWS)
+if ($ENV{MSYSTEM_CARCH} MATCHES aarch64)
+use_system_binary(openssl)
+elseif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR WINDOWS)
use_prebuilt_binary(openssl)
+
+find_library(SSL_LIBRARY
+ NAMES
+ libssl.lib
+ libssl.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+find_library(CRYPTO_LIBRARY
+ NAMES
+ libcrypto.lib
+ libcrypto.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::openssl INTERFACE ${SSL_LIBRARY} ${CRYPTO_LIBRARY})
+
if (DARWIN)
execute_process(
COMMAND lipo -archs libcrypto.a
@@ -67,13 +83,12 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA
file(WRITE ${PREBUILD_TRACKING_DIR}/openssl_installed "${openssl_installed}")
endif ()
if (WINDOWS)
- target_link_libraries(ll::openssl INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libssl.lib ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto.lib Crypt32.lib)
+ target_link_libraries(ll::openssl INTERFACE Crypt32.lib)
elseif (LINUX)
target_link_libraries(ll::openssl INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libssl.a ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto.a dl)
-else()
+elseif (NOT DARWIN)
target_link_libraries(ll::openssl INTERFACE ssl crypto)
endif (WINDOWS)
-if (NOT WINDOWS)
-target_include_directories( ll::openssl SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include)
-endif ()
+
+target_include_directories(ll::openssl SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include)
diff --git a/indra/cmake/OpenXR.cmake b/indra/cmake/OpenXR.cmake
index b37ed50939..e315a99025 100644
--- a/indra/cmake/OpenXR.cmake
+++ b/indra/cmake/OpenXR.cmake
@@ -22,3 +22,12 @@ endif (WINDOWS)
if( NOT LINUX )
target_include_directories( ll::openxr SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include)
endif()
+
+if (DARWIN)
+ execute_process(
+ COMMAND lipo libopenxr_loader.a
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output libopenxr_loader.a
+ WORKING_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE}
+ )
+endif ()
diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake
index e5893e9a20..0c01e5ee78 100644
--- a/indra/cmake/PNG.cmake
+++ b/indra/cmake/PNG.cmake
@@ -6,9 +6,12 @@ add_library( ll::libpng INTERFACE IMPORTED )
use_system_binary(libpng)
use_prebuilt_binary(libpng)
-if (WINDOWS)
- target_link_libraries(ll::libpng INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libpng16.lib)
-else()
- target_link_libraries(ll::libpng INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libpng16.a)
-endif()
-target_include_directories( ll::libpng SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/libpng16)
+
+find_library(LIBPNG_LIBRARY
+ NAMES
+ libpng16.lib
+ libpng16.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::libpng INTERFACE ${LIBPNG_LIBRARY})
+target_include_directories(ll::libpng SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/libpng16)
diff --git a/indra/cmake/PluginAPI.cmake b/indra/cmake/PluginAPI.cmake
index 114415e514..a2bf13db2c 100644
--- a/indra/cmake/PluginAPI.cmake
+++ b/indra/cmake/PluginAPI.cmake
@@ -1,5 +1,7 @@
# -*- cmake -*-
+include(OpenGL)
+
add_library( ll::pluginlibraries INTERFACE IMPORTED )
if (WINDOWS)
@@ -13,4 +15,6 @@ if (WINDOWS)
)
endif (WINDOWS)
+target_link_libraries( ll::pluginlibraries INTERFACE OpenGL::GL)
+target_include_directories( ll::pluginlibraries INTERFACE ${CMAKE_SOURCE_DIR}/llimage ${CMAKE_SOURCE_DIR}/llrender)
diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake
index da5d2ef22c..7cce190f6a 100644
--- a/indra/cmake/Python.cmake
+++ b/indra/cmake/Python.cmake
@@ -13,7 +13,7 @@ elseif (WINDOWS)
foreach(hive HKEY_CURRENT_USER HKEY_LOCAL_MACHINE)
# prefer more recent Python versions to older ones, if multiple versions
# are installed
- foreach(pyver 3.12 3.11 3.10 3.9 3.8 3.7)
+ foreach(pyver 3.13 3.12 3.11 3.10 3.9 3.8 3.7)
list(APPEND regpaths "[${hive}\\SOFTWARE\\Python\\PythonCore\\${pyver}\\InstallPath]")
endforeach()
endforeach()
diff --git a/indra/cmake/SSE2NEON.cmake b/indra/cmake/SSE2NEON.cmake
new file mode 100644
index 0000000000..797f2af80e
--- /dev/null
+++ b/indra/cmake/SSE2NEON.cmake
@@ -0,0 +1,12 @@
+# -*- cmake -*-
+
+include(Prebuilt)
+
+add_library(ll::sse2neon INTERFACE IMPORTED)
+
+if (DARWIN)
+ use_system_binary(sse2neon)
+ use_prebuilt_binary(sse2neon)
+
+ target_include_directories( ll::sse2neon SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/sse2neon)
+endif()
diff --git a/indra/cmake/Tracy.cmake b/indra/cmake/Tracy.cmake
index a7eac2711f..cb09337d15 100644
--- a/indra/cmake/Tracy.cmake
+++ b/indra/cmake/Tracy.cmake
@@ -15,6 +15,7 @@ endif()
if (USE_TRACY)
option(USE_TRACY_ON_DEMAND "Use on-demand Tracy profiling." ON)
option(USE_TRACY_LOCAL_ONLY "Disallow remote Tracy profiling." OFF)
+ option(USE_TRACY_GPU "Use Tracy GPU profiling" OFF)
use_system_binary(tracy)
use_prebuilt_binary(tracy)
@@ -31,9 +32,8 @@ if (USE_TRACY)
target_compile_definitions(ll::tracy INTERFACE -DTRACY_NO_BROADCAST=1 -DTRACY_ONLY_LOCALHOST=1)
endif ()
- # GHA runners don't always provide invariant TSC support, but always build with LL_TESTS enabled
- if (DARWIN AND LL_TESTS)
- target_compile_definitions(ll::tracy INTERFACE -DTRACY_TIMER_FALLBACK=1)
+ if (USE_TRACY_GPU AND NOT DARWIN) # Tracy OpenGL mode is incompatible with macOS/iOS
+ target_compile_definitions(ll::tracy INTERFACE -DLL_PROFILER_ENABLE_TRACY_OPENGL=1)
endif ()
# See: indra/llcommon/llprofiler.h
diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake
index 85e74f03e4..ac45838427 100644
--- a/indra/cmake/UI.cmake
+++ b/indra/cmake/UI.cmake
@@ -12,6 +12,12 @@ if (LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)
return()
endif()
+ if (${LINUX_DISTRO} MATCHES debian)
+ include(FindPkgConfig)
+ pkg_check_modules(Cairo REQUIRED cairo)
+ target_include_directories(ll::uilibraries SYSTEM INTERFACE ${Cairo_INCLUDE_DIRS})
+ endif ()
+
target_link_libraries( ll::uilibraries INTERFACE
fltk
Xrender
diff --git a/indra/cmake/VHACD.cmake b/indra/cmake/VHACD.cmake
new file mode 100644
index 0000000000..b368fe28e0
--- /dev/null
+++ b/indra/cmake/VHACD.cmake
@@ -0,0 +1,30 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+add_library(ll::vhacd INTERFACE IMPORTED)
+
+if (FALSE)
+use_system_binary(vhacd)
+use_prebuilt_binary(vhacd)
+
+elseif (NOT (${LINUX_DISTRO} MATCHES fedora))
+ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/vhacd_installed OR NOT ${vhacd_installed} EQUAL 0)
+ if (NOT EXISTS ${CMAKE_BINARY_DIR}/v-hacd-4.1.0.tar.gz)
+ file(DOWNLOAD
+ https://github.com/kmammou/v-hacd/archive/refs/tags/v4.1.0.tar.gz
+ ${CMAKE_BINARY_DIR}/v-hacd-4.1.0.tar.gz
+ )
+ endif ()
+ file(ARCHIVE_EXTRACT
+ INPUT ${CMAKE_BINARY_DIR}/v-hacd-4.1.0.tar.gz
+ DESTINATION ${CMAKE_BINARY_DIR}
+ )
+ file(MAKE_DIRECTORY ${LIBS_PREBUILT_DIR}/include/vhacd)
+ file(
+ COPY ${CMAKE_BINARY_DIR}/v-hacd-4.1.0/include/VHACD.h
+ DESTINATION ${LIBS_PREBUILT_DIR}/include/vhacd
+ )
+ file(WRITE ${PREBUILD_TRACKING_DIR}/vhacd_installed "0")
+ endif ()
+target_include_directories(ll::vhacd SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/vhacd/)
+endif ()
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index c287f135fe..da9be417d3 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -118,6 +118,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
else (ADDRESS_SIZE EQUAL 32)
set(DEB_ARCHITECTURE amd64)
set(FIND_LIBRARY_USE_LIB64_PATHS ON)
+ set(ARCH ${CMAKE_SYSTEM_PROCESSOR})
endif (ADDRESS_SIZE EQUAL 32)
execute_process(COMMAND dpkg-architecture -a${DEB_ARCHITECTURE} -qDEB_HOST_MULTIARCH
@@ -145,52 +146,19 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(DARWIN 1)
string(REGEX MATCH "-mmacosx-version-min=([^ ]+)" scratch "$ENV{LL_BUILD}")
- set(CMAKE_OSX_DEPLOYMENT_TARGET "${CMAKE_MATCH_1}")
+ set(CMAKE_OSX_DEPLOYMENT_TARGET "${CMAKE_MATCH_1}" CACHE STRING "macOS Deploy Target" FORCE)
message(STATUS "CMAKE_OSX_DEPLOYMENT_TARGET = '${CMAKE_OSX_DEPLOYMENT_TARGET}'")
- string(REGEX MATCH "-stdlib=([^ ]+)" scratch "$ENV{LL_BUILD}")
- set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "${CMAKE_MATCH_1}")
- message(STATUS "CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY = '${CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY}'")
-
- string(REGEX MATCH " -g([^ ]*)" scratch "$ENV{LL_BUILD}")
- set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "${CMAKE_MATCH_1}")
- # -gdwarf-2 is passed in LL_BUILD according to 00-COMPILE-LINK-RUN.txt.
- # However, when CMake 3.9.2 sees -gdwarf-2, it silently deletes the whole -g
- # switch, producing no symbols at all! The same thing happens if we specify
- # plain -g ourselves, i.e. CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT is
- # the empty string. Specifying -gdwarf-with-dsym or just -gdwarf drives a
- # different CMake behavior: it substitutes plain -g. As of 2017-09-19,
- # viewer-build-variables/variables still passes -gdwarf-2, which is the
- # no-symbols case. Set -gdwarf, triggering CMake to substitute plain -g --
- # at least that way we should get symbols, albeit mangled ones. It Would Be
- # Nice if CMake's behavior could be predicted from a consistent mental
- # model, instead of only observed experimentally.
- string(REPLACE "dwarf-2" "dwarf"
- CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT
- "${CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT}")
- message(STATUS "CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT = '${CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT}'")
+ # Use dwarf symbols for most libraries for compilation speed
+ set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf")
string(REGEX MATCH "-O([^ ]*)" scratch "$ENV{LL_BUILD}")
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL "${CMAKE_MATCH_1}")
message(STATUS "CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL = '${CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL}'")
- # allow disabling this check by setting LL_SKIP_REQUIRE_SYSROOT either ON as cmake cache var or non-empty as environment var
- set(LL_SKIP_REQUIRE_SYSROOT OFF CACHE BOOL "Skip requirement to set toolchain sysroot ahead of time. Not skipped by default for consistency, but skipping can be useful for selecting alternative xcode versions side by side")
- if("$ENV{LL_SKIP_REQUIRE_SYSROOT}" STREQUAL "" AND NOT ${LL_SKIP_REQUIRE_SYSROOT})
- string(REGEX MATCHALL "[^ ]+" LL_BUILD_LIST "$ENV{LL_BUILD}")
- list(FIND LL_BUILD_LIST "-iwithsysroot" sysroot_idx)
- if ("${sysroot_idx}" LESS 0)
- message(FATAL_ERROR "Environment variable LL_BUILD must contain '-iwithsysroot'")
- endif ()
- math(EXPR sysroot_idx "${sysroot_idx} + 1")
- list(GET LL_BUILD_LIST "${sysroot_idx}" CMAKE_OSX_SYSROOT)
- endif()
- message(STATUS "CMAKE_OSX_SYSROOT = '${CMAKE_OSX_SYSROOT}'")
-
- set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0")
set(CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO)
set(CMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH NO)
- set(CMAKE_XCODE_ATTRIBUTE_CLANG_X86_VECTOR_INSTRUCTIONS ssse3)
+ set(CMAKE_XCODE_ATTRIBUTE_CLANG_X86_VECTOR_INSTRUCTIONS sse4.2)
# we must hard code this to off for now. xcode's built in signing does not
# handle embedded app bundles such as CEF and others. Any signing for local
# development must be done after the build as we do in viewer_manifest.py for
diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake
index 4ab69e30aa..af13746c91 100644
--- a/indra/cmake/ViewerMiscLibs.cmake
+++ b/indra/cmake/ViewerMiscLibs.cmake
@@ -16,7 +16,7 @@ endif()
use_prebuilt_binary(slvoice)
endif (FALSE)
-if (${LINUX_DISTRO} MATCHES debian OR DARWIN OR WINDOWS)
+if (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN)
use_prebuilt_binary(nanosvg)
endif ()
use_prebuilt_binary(viewer-fonts)
diff --git a/indra/cmake/WebRTC.cmake b/indra/cmake/WebRTC.cmake
index 454ed8c0a1..5fda2f71b9 100644
--- a/indra/cmake/WebRTC.cmake
+++ b/indra/cmake/WebRTC.cmake
@@ -1,14 +1,14 @@
# -*- cmake -*-
+include_guard()
+
include(Linking)
include(Prebuilt)
-include_guard()
-
add_library( ll::webrtc INTERFACE IMPORTED )
target_include_directories( ll::webrtc SYSTEM INTERFACE "${LIBS_PREBUILT_DIR}/include/webrtc" "${LIBS_PREBUILT_DIR}/include/webrtc/third_party/abseil-cpp")
-if (${LINUX_DISTRO} MATCHES debian OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64 OR WINDOWS)
+if (DARWIN OR WINDOWS)
use_prebuilt_binary(webrtc)
-elseif (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD)
+elseif (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64) OR (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)))
target_compile_definitions(ll::webrtc INTERFACE CM_WEBRTC=1)
if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/webrtc_installed OR NOT ${webrtc_installed} EQUAL 0)
if (DARWIN)
@@ -20,7 +20,7 @@ elseif (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD)
endif ()
if (NOT EXISTS ${CMAKE_BINARY_DIR}/libwebrtc-${WEBRTC_PLATFORM}.tar.xz)
file(DOWNLOAD
- https://github.com/crow-misia/libwebrtc-bin/releases/download/114.5735.6.1/libwebrtc-${WEBRTC_PLATFORM}.tar.xz
+ https://github.com/crow-misia/libwebrtc-bin/releases/download/137.7151.3.1/libwebrtc-${WEBRTC_PLATFORM}.tar.xz
${CMAKE_BINARY_DIR}/libwebrtc-${WEBRTC_PLATFORM}.tar.xz
SHOW_PROGRESS
)
@@ -79,25 +79,27 @@ elseif (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD)
endif ()
endif ()
-if (WINDOWS)
- target_link_libraries( ll::webrtc INTERFACE webrtc.lib )
-elseif (DARWIN)
- FIND_LIBRARY(COREAUDIO_LIBRARY CoreAudio)
- FIND_LIBRARY(COREGRAPHICS_LIBRARY CoreGraphics)
- FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY AudioToolbox)
- FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation)
- FIND_LIBRARY(COCOA_LIBRARY Cocoa)
+find_library(WEBRTC_LIBRARY
+ NAMES
+ webrtc
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
- target_link_libraries( ll::webrtc INTERFACE
- libwebrtc.a
- ${COREAUDIO_LIBRARY}
- ${AUDIOTOOLBOX_LIBRARY}
- ${COREGRAPHICS_LIBRARY}
- ${COREFOUNDATION_LIBRARY}
- ${COCOA_LIBRARY}
+target_link_libraries( ll::webrtc INTERFACE ${WEBRTC_LIBRARY} )
+
+if (DARWIN)
+ if (CMAKE_OSX_ARCHITECTURES MATCHES x86_64)
+ target_link_directories( ll::webrtc INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE} )
+ target_link_libraries( ll::webrtc INTERFACE webrtc )
+ endif ()
+ target_link_libraries( ll::webrtc INTERFACE ll::oslibraries )
+ execute_process(
+ COMMAND lipo libwebrtc.a
+ -thin ${CMAKE_OSX_ARCHITECTURES}
+ -output libwebrtc.a
+ WORKING_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE}
)
elseif (LINUX)
- target_link_libraries( ll::webrtc INTERFACE libwebrtc.a X11 )
-endif (WINDOWS)
+ target_link_libraries( ll::webrtc INTERFACE X11 )
+endif ()
diff --git a/indra/cmake/ZLIBNG.cmake b/indra/cmake/ZLIBNG.cmake
index 7c2c59a68d..44d12227df 100644
--- a/indra/cmake/ZLIBNG.cmake
+++ b/indra/cmake/ZLIBNG.cmake
@@ -17,11 +17,14 @@ if(USE_CONAN )
endif()
use_prebuilt_binary(zlib-ng)
-if (WINDOWS)
- target_link_libraries( ll::zlib-ng INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/zlib.lib )
-else()
- target_link_libraries( ll::zlib-ng INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libz.a )
-endif (WINDOWS)
+
+find_library(ZLIBNG_LIBRARY
+ NAMES
+ zlib.lib
+ libz.a
+ PATHS "${ARCH_PREBUILT_DIRS_RELEASE}" REQUIRED NO_DEFAULT_PATH)
+
+target_link_libraries(ll::zlib-ng INTERFACE ${ZLIBNG_LIBRARY})
if( NOT LINUX )
target_include_directories( ll::zlib-ng SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/zlib-ng)
diff --git a/indra/cmake/xxHash.cmake b/indra/cmake/xxHash.cmake
index 84f4f4e0f2..72758fa067 100644
--- a/indra/cmake/xxHash.cmake
+++ b/indra/cmake/xxHash.cmake
@@ -1,8 +1,5 @@
# -*- cmake -*-
-if (XXHASH_CMAKE_INCLUDED)
- return()
-endif (XXHASH_CMAKE_INCLUDED)
-set (XXHASH_CMAKE_INCLUDED TRUE)
+include_guard()
include(Prebuilt)
diff --git a/indra/doxygen/CMakeLists.txt b/indra/doxygen/CMakeLists.txt
index 616b5cd09c..43ebf4ae26 100644
--- a/indra/doxygen/CMakeLists.txt
+++ b/indra/doxygen/CMakeLists.txt
@@ -1,19 +1,5 @@
# -*- cmake -*-
-# cmake_minimum_required should appear before any
-# other commands to guarantee full compatibility
-# with the version specified
-## prior to 2.8, the add_custom_target commands used in setting the version did not work correctly
-cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR)
-
-set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING
- "The root project/makefile/solution name. Defaults to SecondLife.")
-project(${ROOT_PROJECT_NAME})
-
-set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
-
-include(Variables)
-
# add a target to generate API documentation with Doxygen
find_package(Doxygen)
if(DOXYGEN_FOUND)
diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt
deleted file mode 100644
index 8b13789179..0000000000
--- a/indra/edit-me-to-trigger-new-build.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/indra/integration_tests/CMakeLists.txt b/indra/integration_tests/CMakeLists.txt
index ced2b3dbcf..1d5f0772b5 100644
--- a/indra/integration_tests/CMakeLists.txt
+++ b/indra/integration_tests/CMakeLists.txt
@@ -1,8 +1,3 @@
# -*- cmake -*-
add_subdirectory(llui_libtest)
-IF (LLIMAGE_LIBTEST)
- MESSAGE(STATUS "Build llimage_libtest")
- add_subdirectory(llimage_libtest)
-ELSE (LLIMAGE_LIBTEST)
- MESSAGE(STATUS "Skip llimage_libtest")
-ENDIF (LLIMAGE_LIBTEST)
+add_subdirectory(llimage_libtest)
diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt
index ee2890778b..e6ff142626 100644
--- a/indra/integration_tests/llimage_libtest/CMakeLists.txt
+++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt
@@ -1,6 +1,7 @@
# -*- cmake -*-
# Integration tests of the llimage library (JPEG2000, PNG, jpeg, etc... images reading and writing)
+if (LL_TESTS)
project (llimage_libtest)
@@ -8,9 +9,7 @@ include(00-Common)
include(LLCommon)
include(LLImage)
include(LLMath)
-include(LLImageJ2COJ)
include(LLKDU)
-include(LLFileSystem)
set(llimage_libtest_SOURCE_FILES
llimage_libtest.cpp
@@ -24,17 +23,9 @@ set(llimage_libtest_HEADER_FILES
list(APPEND llimage_libtest_SOURCE_FILES ${llimage_libtest_HEADER_FILES})
add_executable(llimage_libtest
- WIN32
- MACOSX_BUNDLE
${llimage_libtest_SOURCE_FILES}
)
-set_target_properties(llimage_libtest
- PROPERTIES
- WIN32_EXECUTABLE
- FALSE
-)
-
# Libraries on which this application depends on
# Sort by high-level to low-level
target_link_libraries(llimage_libtest
@@ -42,64 +33,9 @@ target_link_libraries(llimage_libtest
llfilesystem
llmath
llimage
- llkdu
- llimagej2coj
)
-
-if (DARWIN)
- # Path inside the app bundle where we'll need to copy libraries
- set(LLIMAGE_LIBTEST_DESTINATION_DIR
- ${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/llimage_libtest.app/Contents/Resources
- )
- # Create the Contents/Resources directory
- add_custom_command(
- TARGET llimage_libtest POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- make_directory
- ${LLIMAGE_LIBTEST_DESTINATION_DIR}
- COMMENT "Creating Resources directory in app bundle."
- )
-else (DARWIN)
- set(LLIMAGE_LIBTEST_DESTINATION_DIR
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
- )
-endif (DARWIN)
-
-get_target_property(BUILT_LLCOMMON llcommon LOCATION)
-add_custom_command(TARGET llimage_libtest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${LLIMAGE_LIBTEST_DESTINATION_DIR}
- DEPENDS ${BUILT_LLCOMMON}
-)
-
-if (DARWIN)
- # Copy the required libraries to the package app
- add_custom_command(TARGET llimage_libtest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libapr-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
- DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libapr-1.0.dylib
- )
- add_custom_command(TARGET llimage_libtest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libaprutil-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
- DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libaprutil-1.0.dylib
- )
- add_custom_command(TARGET llimage_libtest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libexception_handler.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
- DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libexception_handler.dylib
- )
- foreach(expat ${EXPAT_COPY})
- add_custom_command(TARGET llimage_libtest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/${expat} ${LLIMAGE_LIBTEST_DESTINATION_DIR}
- DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/${expat}
- )
- endforeach(expat)
-endif (DARWIN)
-
-if (WINDOWS)
- # Check indra/test_apps/llplugintest/CMakeLists.txt for an example of what to copy over for Windows and how
-endif (WINDOWS)
# Ensure people working on the viewer don't break this library
-# *NOTE: This could be removed, or only built by TeamCity, if the build
-# and link times become too long.
add_dependencies(viewer llimage_libtest)
+
+endif(LL_TESTS)
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
index 95102094ae..c45bd6fd01 100644
--- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
@@ -43,6 +43,8 @@
#include "v4coloru.h"
#include "llsdserialize.h"
#include "llcleanup.h"
+#include "lltrace.h"
+#include "llfasttimer.h"
// system libraries
#include <iostream>
@@ -573,10 +575,10 @@ int main(int argc, char** argv)
// Create the logging thread if required
- if (LLFastTimer::sMetricLog)
+ if (LLTrace::BlockTimer::sMetricLog)
{
- LLFastTimer::sLogLock = new LLMutex(NULL);
- fast_timer_log_thread = new LogThread(LLFastTimer::sLogName);
+ LLTrace::BlockTimer::setLogLock(new LLMutex());
+ fast_timer_log_thread = new LogThread(LLTrace::BlockTimer::sLogName);
fast_timer_log_thread->start();
}
@@ -618,9 +620,9 @@ int main(int argc, char** argv)
// Output perf data if requested by user
if (analyze_performance)
{
- std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp";
- std::string current_name = LLFastTimer::sLogName + ".slp";
- std::string report_name = LLFastTimer::sLogName + "_report.csv";
+ std::string baseline_name = LLTrace::BlockTimer::sLogName + "_baseline.slp";
+ std::string current_name = LLTrace::BlockTimer::sLogName + ".slp";
+ std::string report_name = LLTrace::BlockTimer::sLogName + "_report.csv";
std::cout << "Analyzing performance, check report in : " << report_name << std::endl;
@@ -628,9 +630,9 @@ int main(int argc, char** argv)
}
// Stop the perf gathering system if needed
- if (LLFastTimer::sMetricLog)
+ if (LLTrace::BlockTimer::sMetricLog)
{
- LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName);
+ LLMetricPerformanceTesterBasic::deleteTester(LLTrace::BlockTimer::sLogName);
sAllDone = true;
}
diff --git a/indra/llappearance/CMakeLists.txt b/indra/llappearance/CMakeLists.txt
index f3f822f61c..b382e21b3c 100644
--- a/indra/llappearance/CMakeLists.txt
+++ b/indra/llappearance/CMakeLists.txt
@@ -14,6 +14,7 @@ set(llappearance_SOURCE_FILES
llavatarjoint.cpp
llavatarjointmesh.cpp
lldriverparam.cpp
+ lljointdata.h
lllocaltextureobject.cpp
llpolyskeletaldistortion.cpp
llpolymesh.cpp
diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp
index 3d66809ed6..dab18c240d 100644
--- a/indra/llappearance/llavatarappearance.cpp
+++ b/indra/llappearance/llavatarappearance.cpp
@@ -29,16 +29,17 @@
#include "llavatarappearance.h"
#include "llavatarappearancedefines.h"
#include "llavatarjointmesh.h"
+#include "lljointdata.h"
#include "llstl.h"
#include "lldir.h"
#include "llpolymorph.h"
#include "llpolymesh.h"
#include "llpolyskeletaldistortion.h"
-#include "llstl.h"
#include "lltexglobalcolor.h"
#include "llwearabledata.h"
#include "boost/bind.hpp"
#include "boost/tokenizer.hpp"
+#include "v4math.h"
using namespace LLAvatarAppearanceDefines;
@@ -71,11 +72,13 @@ public:
mChildren.clear();
}
bool parseXml(LLXmlTreeNode* node);
+ glm::mat4 getJointMatrix();
private:
std::string mName;
std::string mSupport;
std::string mAliases;
+ std::string mGroup;
bool mIsJoint;
LLVector3 mPos;
LLVector3 mEnd;
@@ -106,10 +109,16 @@ public:
S32 getNumCollisionVolumes() const { return mNumCollisionVolumes; }
private:
+ typedef std::vector<LLAvatarBoneInfo*> bone_info_list_t;
+ static void getJointMatricesAndHierarhy(
+ LLAvatarBoneInfo* bone_info,
+ LLJointData& data,
+ const glm::mat4& parent_mat);
+
+private:
S32 mNumBones;
S32 mNumCollisionVolumes;
LLAvatarAppearance::joint_alias_map_t mJointAliasMap;
- typedef std::vector<LLAvatarBoneInfo*> bone_info_list_t;
bone_info_list_t mBoneInfoList;
};
@@ -1598,6 +1607,15 @@ bool LLAvatarBoneInfo::parseXml(LLXmlTreeNode* node)
mSupport = "base";
}
+ // Skeleton has 133 bones, but shader only allows 110 (LL_MAX_JOINTS_PER_MESH_OBJECT)
+ // Groups can be used by importer to cut out unused groups of joints
+ static LLStdStringHandle group_string = LLXmlTree::addAttributeString("group");
+ if (!node->getFastAttributeString(group_string, mGroup))
+ {
+ LL_WARNS() << "Bone without group " << mName << LL_ENDL;
+ mGroup = "global";
+ }
+
if (mIsJoint)
{
static LLStdStringHandle pivot_string = LLXmlTree::addAttributeString("pivot");
@@ -1623,6 +1641,21 @@ bool LLAvatarBoneInfo::parseXml(LLXmlTreeNode* node)
return true;
}
+
+glm::mat4 LLAvatarBoneInfo::getJointMatrix()
+{
+ glm::mat4 mat(1.0f);
+ // 1. Scaling
+ mat = glm::scale(mat, glm::vec3(mScale[0], mScale[1], mScale[2]));
+ // 2. Rotation (Euler angles rad)
+ mat = glm::rotate(mat, mRot[0], glm::vec3(1, 0, 0));
+ mat = glm::rotate(mat, mRot[1], glm::vec3(0, 1, 0));
+ mat = glm::rotate(mat, mRot[2], glm::vec3(0, 0, 1));
+ // 3. Position
+ mat = glm::translate(mat, glm::vec3(mPos[0], mPos[1], mPos[2]));
+ return mat;
+}
+
//-----------------------------------------------------------------------------
// LLAvatarSkeletonInfo::parseXml()
//-----------------------------------------------------------------------------
@@ -1653,6 +1686,25 @@ bool LLAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node)
return true;
}
+void LLAvatarSkeletonInfo::getJointMatricesAndHierarhy(
+ LLAvatarBoneInfo* bone_info,
+ LLJointData& data,
+ const glm::mat4& parent_mat)
+{
+ data.mName = bone_info->mName;
+ data.mJointMatrix = bone_info->getJointMatrix();
+ data.mScale = glm::vec3(bone_info->mScale[0], bone_info->mScale[1], bone_info->mScale[2]);
+ data.mRotation = bone_info->mRot;
+ data.mRestMatrix = parent_mat * data.mJointMatrix;
+ data.mIsJoint = bone_info->mIsJoint;
+ data.mGroup = bone_info->mGroup;
+ for (LLAvatarBoneInfo* child_info : bone_info->mChildren)
+ {
+ LLJointData& child_data = data.mChildren.emplace_back();
+ getJointMatricesAndHierarhy(child_info, child_data, data.mRestMatrix);
+ }
+}
+
//Make aliases for joint and push to map.
void LLAvatarAppearance::makeJointAliases(LLAvatarBoneInfo *bone_info)
{
@@ -1714,6 +1766,16 @@ const LLAvatarAppearance::joint_alias_map_t& LLAvatarAppearance::getJointAliases
return mJointAliasMap;
}
+void LLAvatarAppearance::getJointMatricesAndHierarhy(std::vector<LLJointData> &data) const
+{
+ glm::mat4 identity(1.f);
+ for (LLAvatarBoneInfo* bone_info : sAvatarSkeletonInfo->mBoneInfoList)
+ {
+ LLJointData& child_data = data.emplace_back();
+ LLAvatarSkeletonInfo::getJointMatricesAndHierarhy(bone_info, child_data, identity);
+ }
+}
+
//-----------------------------------------------------------------------------
// parseXmlSkeletonNode(): parses <skeleton> nodes from XML tree
diff --git a/indra/llappearance/llavatarappearance.h b/indra/llappearance/llavatarappearance.h
index 13e504e639..84cb42056a 100644
--- a/indra/llappearance/llavatarappearance.h
+++ b/indra/llappearance/llavatarappearance.h
@@ -34,6 +34,7 @@
#include "lltexlayer.h"
#include "llviewervisualparam.h"
#include "llxmltree.h"
+#include "v4math.h"
class LLTexLayerSet;
class LLTexGlobalColor;
@@ -41,6 +42,7 @@ class LLTexGlobalColorInfo;
class LLWearableData;
class LLAvatarBoneInfo;
class LLAvatarSkeletonInfo;
+class LLJointData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLAvatarAppearance
@@ -138,7 +140,7 @@ public:
LLVector3 mHeadOffset{}; // current head position
LLAvatarJoint* mRoot{ nullptr };
- typedef std::map<std::string, LLJoint*> joint_map_t;
+ typedef std::map<std::string, LLJoint*, std::less<>> joint_map_t;
joint_map_t mJointMap;
typedef std::map<std::string, LLVector3> joint_state_map_t;
@@ -151,9 +153,11 @@ public:
public:
typedef std::vector<LLAvatarJoint*> avatar_joint_list_t;
const avatar_joint_list_t& getSkeleton() { return mSkeleton; }
- typedef std::map<std::string, std::string> joint_alias_map_t;
+ typedef std::map<std::string, std::string, std::less<>> joint_alias_map_t;
const joint_alias_map_t& getJointAliases();
-
+ typedef std::map<std::string, std::string> joint_parent_map_t; // matrix plus parent
+ typedef std::map<std::string, glm::mat4> joint_rest_map_t;
+ void getJointMatricesAndHierarhy(std::vector<LLJointData> &data) const;
protected:
static bool parseSkeletonFile(const std::string& filename, LLXmlTree& skeleton_xml_tree);
diff --git a/indra/llappearance/lljointdata.h b/indra/llappearance/lljointdata.h
new file mode 100644
index 0000000000..2fc26198ee
--- /dev/null
+++ b/indra/llappearance/lljointdata.h
@@ -0,0 +1,66 @@
+/**
+ * @file lljointdata.h
+ * @brief LLJointData class for holding individual joint data and skeleton
+ *
+ * $LicenseInfo:firstyear=2025&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2025, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLJOINTDATA_H
+#define LL_LLJOINTDATA_H
+
+#include "v4math.h"
+
+// may be just move LLAvatarBoneInfo
+class LLJointData
+{
+public:
+ std::string mName;
+ std::string mGroup;
+ glm::mat4 mJointMatrix;
+ glm::mat4 mRestMatrix;
+ glm::vec3 mScale;
+ LLVector3 mRotation;
+
+ typedef std::vector<LLJointData> bones_t;
+ bones_t mChildren;
+
+ bool mIsJoint; // if not, collision_volume
+ enum SupportCategory
+ {
+ SUPPORT_BASE,
+ SUPPORT_EXTENDED
+ };
+ SupportCategory mSupport;
+ void setSupport(const std::string& support)
+ {
+ if (support == "extended")
+ {
+ mSupport = SUPPORT_EXTENDED;
+ }
+ else
+ {
+ mSupport = SUPPORT_BASE;
+ }
+ }
+};
+
+#endif //LL_LLJOINTDATA_H
diff --git a/indra/llappearance/llpolymesh.cpp b/indra/llappearance/llpolymesh.cpp
index 719381b4fc..d5323e0b84 100644
--- a/indra/llappearance/llpolymesh.cpp
+++ b/indra/llappearance/llpolymesh.cpp
@@ -283,6 +283,7 @@ bool LLPolyMeshSharedData::loadMesh( const std::string& fileName )
LLFILE* fp = LLFile::fopen(fileName, "rb"); /*Flawfinder: ignore*/
if (!fp)
{
+ LLError::LLUserWarningMsg::showMissingFiles();
LL_ERRS() << "can't open: " << fileName << LL_ENDL;
return false;
}
diff --git a/indra/llappearance/llpolymorph.cpp b/indra/llappearance/llpolymorph.cpp
index 8df8a9726f..5ee6649164 100644
--- a/indra/llappearance/llpolymorph.cpp
+++ b/indra/llappearance/llpolymorph.cpp
@@ -550,12 +550,12 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
mLastSex = avatar_sex;
- // Check for NaN condition (NaN is detected if a variable doesn't equal itself.
- if (mCurWeight != mCurWeight)
+ // Check for NaN condition
+ if (llisnan(mCurWeight))
{
- mCurWeight = 0.0;
+ mCurWeight = 0.f;
}
- if (mLastWeight != mLastWeight)
+ if (llisnan(mLastWeight))
{
mLastWeight = mCurWeight+.001f;
}
diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp
index e368ace35e..bcb00e6afd 100644
--- a/indra/llappearance/lltexlayer.cpp
+++ b/indra/llappearance/lltexlayer.cpp
@@ -1293,7 +1293,7 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
{
if (!force_render && !hasMorph())
{
- LL_DEBUGS() << "skipping renderMorphMasks for " << getUUID() << LL_ENDL;
+ LL_DEBUGS("Morph") << "skipping renderMorphMasks for " << getUUID() << LL_ENDL;
return;
}
LL_PROFILE_ZONE_SCOPED;
@@ -1325,7 +1325,7 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
success &= param->render( x, y, width, height );
if (!success && !force_render)
{
- LL_DEBUGS() << "Failed to render param " << param->getID() << " ; skipping morph mask." << LL_ENDL;
+ LL_DEBUGS("Morph") << "Failed to render param " << param->getID() << " ; skipping morph mask." << LL_ENDL;
return;
}
}
@@ -1365,7 +1365,7 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
}
else
{
- LL_WARNS() << "Skipping rendering of " << getInfo()->mStaticImageFileName
+ LL_WARNS("Morph") << "Skipping rendering of " << getInfo()->mStaticImageFileName
<< "; expected 1 or 4 components." << LL_ENDL;
}
}
@@ -1404,8 +1404,8 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
// We can get bad morph masks during login, on minimize, and occasional gl errors.
// We should only be doing this when we believe something has changed with respect to the user's appearance.
{
- LL_DEBUGS("Avatar") << "gl alpha cache of morph mask not found, doing readback: " << getName() << LL_ENDL;
- // clear out a slot if we have filled our cache
+ LL_DEBUGS("Morph") << "gl alpha cache of morph mask not found, doing readback: " << getName() << LL_ENDL;
+ // clear out a slot if we have filled our cache
S32 max_cache_entries = getTexLayerSet()->getAvatarAppearance()->isSelf() ? 4 : 1;
while ((S32)mAlphaCache.size() >= max_cache_entries)
{
@@ -1446,13 +1446,20 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
#if GL_VERSION_1_1
glGetTexImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGBA, GL_UNSIGNED_BYTE, temp);
#endif
-
- U8* alpha_cursor = alpha_data;
- U8* pixel = temp;
- for (int i = 0; i < pixels; i++)
+ GLenum error = glGetError();
+ if (error != GL_NO_ERROR)
+ {
+ LL_INFOS("Morph") << "GL Error while reading back morph texture. Error code: " << error << LL_ENDL;
+ }
+ else
{
- *alpha_cursor++ = pixel[3];
- pixel += 4;
+ U8* alpha_cursor = alpha_data;
+ U8* pixel = temp;
+ for (int i = 0; i < pixels; i++)
+ {
+ *alpha_cursor++ = pixel[3];
+ pixel += 4;
+ }
}
gGL.getTexUnit(0)->disable();
@@ -1885,7 +1892,10 @@ LLGLTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_name,
image_raw->copyUnscaledAlphaMask(alpha_image_raw, LLColor4U::black);
}
- tex->createGLTexture(0, image_raw, 0, true, LLGLTexture::LOCAL);
+ if (!tex->createGLTexture(0, image_raw, 0, true, LLGLTexture::LOCAL))
+ {
+ LL_WARNS() << "Failed to create GL texture for image: " << file_name << LL_ENDL;
+ }
gGL.getTexUnit(0)->bind(tex);
tex->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/llappearance/lltexlayerparams.cpp b/indra/llappearance/lltexlayerparams.cpp
index 30551c115d..dd2499cf37 100644
--- a/indra/llappearance/lltexlayerparams.cpp
+++ b/indra/llappearance/lltexlayerparams.cpp
@@ -338,7 +338,10 @@ bool LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
// Create the GL texture, and then hang onto it for future use.
if (mNeedsCreateTexture)
{
- mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw);
+ if (!mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw))
+ {
+ LL_WARNS() << "Failed to create GL texture for image: " << mCachedProcessedTexture->getID() << LL_ENDL;
+ }
mNeedsCreateTexture = false;
gGL.getTexUnit(0)->bind(mCachedProcessedTexture);
mCachedProcessedTexture->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/llaudio/llvorbisencode.cpp b/indra/llaudio/llvorbisencode.cpp
index 83e7fad92f..d115dc309d 100644
--- a/indra/llaudio/llvorbisencode.cpp
+++ b/indra/llaudio/llvorbisencode.cpp
@@ -34,38 +34,6 @@
#include "llmath.h"
#include "llapr.h"
-//#if LL_DARWIN
-// MBW -- XXX -- Getting rid of SecondLifeVorbis for now
-#if 0
-#include "VorbisFramework.h"
-
-#define vorbis_analysis mac_vorbis_analysis
-#define vorbis_analysis_headerout mac_vorbis_analysis_headerout
-#define vorbis_analysis_init mac_vorbis_analysis_init
-#define vorbis_encode_ctl mac_vorbis_encode_ctl
-#define vorbis_encode_setup_init mac_vorbis_encode_setup_init
-#define vorbis_encode_setup_managed mac_vorbis_encode_setup_managed
-
-#define vorbis_info_init mac_vorbis_info_init
-#define vorbis_info_clear mac_vorbis_info_clear
-#define vorbis_comment_init mac_vorbis_comment_init
-#define vorbis_comment_clear mac_vorbis_comment_clear
-#define vorbis_block_init mac_vorbis_block_init
-#define vorbis_block_clear mac_vorbis_block_clear
-#define vorbis_dsp_clear mac_vorbis_dsp_clear
-#define vorbis_analysis_buffer mac_vorbis_analysis_buffer
-#define vorbis_analysis_wrote mac_vorbis_analysis_wrote
-#define vorbis_analysis_blockout mac_vorbis_analysis_blockout
-
-#define ogg_stream_packetin mac_ogg_stream_packetin
-#define ogg_stream_init mac_ogg_stream_init
-#define ogg_stream_flush mac_ogg_stream_flush
-#define ogg_stream_pageout mac_ogg_stream_pageout
-#define ogg_page_eos mac_ogg_page_eos
-#define ogg_stream_clear mac_ogg_stream_clear
-
-#endif
-
S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& error_msg)
{
U16 num_channels = 0;
diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index 9dace08e6f..581e9f62d5 100644
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -131,7 +131,7 @@ LLQuaternion::Order bvhStringToOrder( char *str )
// LLBVHLoader()
//-----------------------------------------------------------------------------
-LLBVHLoader::LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &errorLine, std::map<std::string, std::string>& joint_alias_map )
+LLBVHLoader::LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &errorLine, std::map<std::string, std::string, std::less<>>& joint_alias_map )
{
reset();
errorLine = 0;
@@ -156,9 +156,9 @@ LLBVHLoader::LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &error
}
// Recognize all names we've been told are legal.
- for (std::map<std::string, std::string>::value_type& alias_pair : joint_alias_map)
+ for (const auto& [alias, joint] : joint_alias_map)
{
- makeTranslation( alias_pair.first , alias_pair.second );
+ makeTranslation(alias, joint);
}
char error_text[128]; /* Flawfinder: ignore */
diff --git a/indra/llcharacter/llbvhloader.h b/indra/llcharacter/llbvhloader.h
index de31f76dd3..ae2e347ba1 100644
--- a/indra/llcharacter/llbvhloader.h
+++ b/indra/llcharacter/llbvhloader.h
@@ -227,7 +227,7 @@ class LLBVHLoader
friend class LLKeyframeMotion;
public:
// Constructor
- LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &errorLine, std::map<std::string, std::string>& joint_alias_map );
+ LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &errorLine, std::map<std::string, std::string, std::less<>>& joint_alias_map );
~LLBVHLoader();
/*
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index ecbcdb3bf5..8efcd9dd29 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -77,12 +77,11 @@ LLCharacter::~LLCharacter()
//-----------------------------------------------------------------------------
// getJoint()
//-----------------------------------------------------------------------------
-LLJoint *LLCharacter::getJoint( const std::string &name )
+LLJoint* LLCharacter::getJoint(std::string_view name)
{
- LLJoint* joint = NULL;
+ LLJoint* joint = nullptr;
- LLJoint *root = getRootJoint();
- if (root)
+ if (LLJoint* root = getRootJoint())
{
joint = root->findJoint(name);
}
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index 6143ec8cd1..079bcd132a 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -76,7 +76,7 @@ public:
// get the specified joint
// default implementation does recursive search,
// subclasses may optimize/cache results.
- virtual LLJoint *getJoint( const std::string &name );
+ virtual LLJoint* getJoint(std::string_view name);
// get the position of the character
virtual LLVector3 getCharacterPosition() = 0;
@@ -119,6 +119,8 @@ public:
virtual void addDebugText( const std::string& text ) = 0;
+ virtual std::string getDebugName() const { return getID().asString(); }
+
virtual const LLUUID& getID() const = 0;
//-------------------------------------------------------------------------
// End Interface
diff --git a/indra/llcharacter/lljoint.cpp b/indra/llcharacter/lljoint.cpp
index f31aa5d4c9..405e62a38b 100644
--- a/indra/llcharacter/lljoint.cpp
+++ b/indra/llcharacter/lljoint.cpp
@@ -242,21 +242,20 @@ LLJoint *LLJoint::getRoot()
//-----------------------------------------------------------------------------
// findJoint()
//-----------------------------------------------------------------------------
-LLJoint *LLJoint::findJoint( const std::string &name )
+LLJoint* LLJoint::findJoint(std::string_view name)
{
if (name == getName())
return this;
for (LLJoint* joint : mChildren)
{
- LLJoint *found = joint->findJoint(name);
- if (found)
+ if (LLJoint* found = joint->findJoint(name))
{
return found;
}
}
- return NULL;
+ return nullptr;
}
diff --git a/indra/llcharacter/lljoint.h b/indra/llcharacter/lljoint.h
index 763c1e3865..b58dc797f8 100644
--- a/indra/llcharacter/lljoint.h
+++ b/indra/llcharacter/lljoint.h
@@ -222,7 +222,7 @@ public:
LLJoint *getRoot();
// search for child joints by name
- LLJoint *findJoint( const std::string &name );
+ LLJoint* findJoint(std::string_view name);
// add/remove children
void addChild( LLJoint *joint );
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 6c1e1ef64a..55dde5dc42 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -11,7 +11,6 @@ include(LLSharedLibs)
include(ZLIBNG)
include(Tracy)
-
set(llcommon_SOURCE_FILES
apply.cpp
commoncontrol.cpp
@@ -297,6 +296,8 @@ if (CMAKE_OSX_ARCHITECTURES MATCHES arm64 OR CMAKE_SYSTEM_PROCESSOR MATCHES aarc
file(WRITE ${PREBUILD_TRACKING_DIR}/sse2neon_installed "0")
endif ()
target_include_directories(llcommon PUBLIC ${LIBS_PREBUILT_DIR}/include/sse2neon)
+elseif ($ENV{MSYSTEM_CARCH} MATCHES aarch64)
+ target_include_directories(llcommon PUBLIC ${prefix_result}/../include/sse2neon)
endif ()
if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed))
diff --git a/indra/llcommon/StackWalker.cpp b/indra/llcommon/StackWalker.cpp
index e9ae1723fb..027df80df5 100644
--- a/indra/llcommon/StackWalker.cpp
+++ b/indra/llcommon/StackWalker.cpp
@@ -1100,6 +1100,14 @@ bool StackWalker::ShowCallstack(bool verbose, HANDLE hThread, const CONTEXT *con
s.AddrBStore.Mode = AddrModeFlat;
s.AddrStack.Offset = c.IntSp;
s.AddrStack.Mode = AddrModeFlat;
+#elif _M_ARM64
+ imageType = IMAGE_FILE_MACHINE_ARM64;
+ s.AddrPC.Offset = c.Pc;
+ s.AddrPC.Mode = AddrModeFlat;
+ s.AddrFrame.Offset = c.Fp;
+ s.AddrFrame.Mode = AddrModeFlat;
+ s.AddrStack.Offset = c.Sp;
+ s.AddrStack.Mode = AddrModeFlat;
#else
#error "Platform not supported!"
#endif
diff --git a/indra/llcommon/always_return.h b/indra/llcommon/always_return.h
index b99eb49096..a206471da5 100644
--- a/indra/llcommon/always_return.h
+++ b/indra/llcommon/always_return.h
@@ -79,22 +79,6 @@ namespace LL
DESIRED mDefault;
};
- // specialize for AlwaysReturn<void>
- template <>
- struct AlwaysReturn<void>
- {
- public:
- AlwaysReturn() {}
-
- // callable returns a type not convertible to DESIRED, return default
- template <typename CALLABLE, typename... ARGS>
- void operator()(CALLABLE&& callable, ARGS&&... args)
- {
- // discard whatever callable(args) returns
- std::forward<CALLABLE>(callable)(std::forward<ARGS>(args)...);
- }
- };
-
/**
* always_return<T>(some_function, some_args...) calls
* some_function(some_args...). It is guaranteed to return a value of type
diff --git a/indra/llcommon/fsyspath.h b/indra/llcommon/fsyspath.h
index e9c96edce3..2c900c02a7 100644
--- a/indra/llcommon/fsyspath.h
+++ b/indra/llcommon/fsyspath.h
@@ -12,7 +12,10 @@
#if ! defined(LL_FSYSPATH_H)
#define LL_FSYSPATH_H
+#include <boost/iterator/transform_iterator.hpp>
#include <filesystem>
+#include <string>
+#include <string_view>
// While std::filesystem::path can be directly constructed from std::string on
// both Posix and Windows, that's not what we want on Windows. Per
@@ -33,37 +36,43 @@
// char"), the "native narrow encoding" isn't UTF-8, so file paths containing
// non-ASCII characters get mangled.
//
-// Once we're building with C++20, we could pass a UTF-8 std::string through a
-// vector<char8_t> to engage std::filesystem::path's own UTF-8 conversion. But
-// sigh, as of 2024-04-03 we're not yet there.
-//
-// Anyway, encapsulating the important UTF-8 conversions in our own subclass
-// allows us to migrate forward to C++20 conventions without changing
-// referencing code.
+// Encapsulating the important UTF-8 conversions in our own subclass allows us
+// to migrate forward to C++20 conventions without changing referencing code.
class fsyspath: public std::filesystem::path
{
using super = std::filesystem::path;
+ // In C++20 (__cpp_lib_char8_t), std::filesystem::u8path() is deprecated.
+ // std::filesystem::path(iter, iter) performs UTF-8 conversions when the
+ // value_type of the iterators is char8_t. While we could copy into a
+ // temporary std::u8string and from there into std::filesystem::path, to
+ // minimize string copying we'll define a transform_iterator that accepts
+ // a std::string_view::iterator and dereferences to char8_t.
+ struct u8ify
+ {
+ char8_t operator()(char c) const { return char8_t(c); }
+ };
+ using u8iter = boost::transform_iterator<u8ify, std::string_view::iterator>;
+
public:
// default
fsyspath() {}
- // construct from UTF-8 encoded std::string
- fsyspath(const std::string& path): super(std::filesystem::u8path(path)) {}
- // construct from UTF-8 encoded const char*
- fsyspath(const char* path): super(std::filesystem::u8path(path)) {}
+ // construct from UTF-8 encoded string
+ fsyspath(const std::string& path): fsyspath(std::string_view(path)) {}
+ fsyspath(const char* path): fsyspath(std::string_view(path)) {}
+ fsyspath(std::string_view path):
+ super(u8iter(path.begin(), u8ify()), u8iter(path.end(), u8ify()))
+ {}
// construct from existing path
fsyspath(const super& path): super(path) {}
- fsyspath& operator=(const super& p) { super::operator=(p); return *this; }
- fsyspath& operator=(const std::string& p)
- {
- super::operator=(std::filesystem::u8path(p));
- return *this;
- }
- fsyspath& operator=(const char* p)
+ fsyspath& operator=(const super& p) { super::operator=(p); return *this; }
+ fsyspath& operator=(const std::string& p) { return (*this) = std::string_view(p); }
+ fsyspath& operator=(const char* p) { return (*this) = std::string_view(p); }
+ fsyspath& operator=(std::string_view p)
{
- super::operator=(std::filesystem::u8path(p));
+ assign(u8iter(p.begin(), u8ify()), u8iter(p.end(), u8ify()));
return *this;
}
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index d2de88ff0a..a0394da281 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -31,15 +31,15 @@
class LLUUID;
-static const F32 REGION_WIDTH_METERS = 256.f;
-static const S32 REGION_WIDTH_UNITS = 256;
-static const U32 REGION_WIDTH_U32 = 256;
+static constexpr F32 REGION_WIDTH_METERS = 256.f;
+static constexpr S32 REGION_WIDTH_UNITS = 256;
+static constexpr U32 REGION_WIDTH_U32 = 256;
-const F32 REGION_HEIGHT_METERS = 4096.f;
+constexpr F32 REGION_HEIGHT_METERS = 4096.f;
-const F32 DEFAULT_AGENT_DEPTH = 0.45f;
-const F32 DEFAULT_AGENT_WIDTH = 0.60f;
-const F32 DEFAULT_AGENT_HEIGHT = 1.9f;
+constexpr F32 DEFAULT_AGENT_DEPTH = 0.45f;
+constexpr F32 DEFAULT_AGENT_WIDTH = 0.60f;
+constexpr F32 DEFAULT_AGENT_HEIGHT = 1.9f;
enum ETerrainBrushType
{
@@ -67,112 +67,112 @@ enum EMouseClickType{
// keys
// Bit masks for various keyboard modifier keys.
-const MASK MASK_NONE = 0x0000;
-const MASK MASK_CONTROL = 0x0001; // Mapped to cmd on Macs
-const MASK MASK_ALT = 0x0002;
-const MASK MASK_SHIFT = 0x0004;
-const MASK MASK_NORMALKEYS = 0x0007; // A real mask - only get the bits for normal modifier keys
-const MASK MASK_MAC_CONTROL = 0x0008; // Un-mapped Ctrl key on Macs, not used on Windows
-const MASK MASK_MODIFIERS = MASK_CONTROL|MASK_ALT|MASK_SHIFT|MASK_MAC_CONTROL;
+constexpr MASK MASK_NONE = 0x0000;
+constexpr MASK MASK_CONTROL = 0x0001; // Mapped to cmd on Macs
+constexpr MASK MASK_ALT = 0x0002;
+constexpr MASK MASK_SHIFT = 0x0004;
+constexpr MASK MASK_NORMALKEYS = 0x0007; // A real mask - only get the bits for normal modifier keys
+constexpr MASK MASK_MAC_CONTROL = 0x0008; // Un-mapped Ctrl key on Macs, not used on Windows
+constexpr MASK MASK_MODIFIERS = MASK_CONTROL|MASK_ALT|MASK_SHIFT|MASK_MAC_CONTROL;
// Special keys go into >128
-const KEY KEY_SPECIAL = 0x80; // special keys start here
-const KEY KEY_RETURN = 0x81;
-const KEY KEY_LEFT = 0x82;
-const KEY KEY_RIGHT = 0x83;
-const KEY KEY_UP = 0x84;
-const KEY KEY_DOWN = 0x85;
-const KEY KEY_ESCAPE = 0x86;
-const KEY KEY_BACKSPACE =0x87;
-const KEY KEY_DELETE = 0x88;
-const KEY KEY_SHIFT = 0x89;
-const KEY KEY_CONTROL = 0x8A;
-const KEY KEY_ALT = 0x8B;
-const KEY KEY_HOME = 0x8C;
-const KEY KEY_END = 0x8D;
-const KEY KEY_PAGE_UP = 0x8E;
-const KEY KEY_PAGE_DOWN = 0x8F;
-const KEY KEY_HYPHEN = 0x90;
-const KEY KEY_EQUALS = 0x91;
-const KEY KEY_INSERT = 0x92;
-const KEY KEY_CAPSLOCK = 0x93;
-const KEY KEY_TAB = 0x94;
-const KEY KEY_ADD = 0x95;
-const KEY KEY_SUBTRACT =0x96;
-const KEY KEY_MULTIPLY =0x97;
-const KEY KEY_DIVIDE = 0x98;
-const KEY KEY_F1 = 0xA1;
-const KEY KEY_F2 = 0xA2;
-const KEY KEY_F3 = 0xA3;
-const KEY KEY_F4 = 0xA4;
-const KEY KEY_F5 = 0xA5;
-const KEY KEY_F6 = 0xA6;
-const KEY KEY_F7 = 0xA7;
-const KEY KEY_F8 = 0xA8;
-const KEY KEY_F9 = 0xA9;
-const KEY KEY_F10 = 0xAA;
-const KEY KEY_F11 = 0xAB;
-const KEY KEY_F12 = 0xAC;
-
-const KEY KEY_PAD_UP = 0xC0;
-const KEY KEY_PAD_DOWN = 0xC1;
-const KEY KEY_PAD_LEFT = 0xC2;
-const KEY KEY_PAD_RIGHT = 0xC3;
-const KEY KEY_PAD_HOME = 0xC4;
-const KEY KEY_PAD_END = 0xC5;
-const KEY KEY_PAD_PGUP = 0xC6;
-const KEY KEY_PAD_PGDN = 0xC7;
-const KEY KEY_PAD_CENTER = 0xC8; // the 5 in the middle
-const KEY KEY_PAD_INS = 0xC9;
-const KEY KEY_PAD_DEL = 0xCA;
-const KEY KEY_PAD_RETURN = 0xCB;
-const KEY KEY_PAD_ADD = 0xCC; // not used
-const KEY KEY_PAD_SUBTRACT = 0xCD; // not used
-const KEY KEY_PAD_MULTIPLY = 0xCE; // not used
-const KEY KEY_PAD_DIVIDE = 0xCF; // not used
-
-const KEY KEY_BUTTON0 = 0xD0;
-const KEY KEY_BUTTON1 = 0xD1;
-const KEY KEY_BUTTON2 = 0xD2;
-const KEY KEY_BUTTON3 = 0xD3;
-const KEY KEY_BUTTON4 = 0xD4;
-const KEY KEY_BUTTON5 = 0xD5;
-const KEY KEY_BUTTON6 = 0xD6;
-const KEY KEY_BUTTON7 = 0xD7;
-const KEY KEY_BUTTON8 = 0xD8;
-const KEY KEY_BUTTON9 = 0xD9;
-const KEY KEY_BUTTON10 = 0xDA;
-const KEY KEY_BUTTON11 = 0xDB;
-const KEY KEY_BUTTON12 = 0xDC;
-const KEY KEY_BUTTON13 = 0xDD;
-const KEY KEY_BUTTON14 = 0xDE;
-const KEY KEY_BUTTON15 = 0xDF;
-
-const KEY KEY_NONE = 0xFF; // not sent from keyboard. For internal use only.
-
-const S32 KEY_COUNT = 256;
-
-
-const F32 DEFAULT_WATER_HEIGHT = 20.0f;
+constexpr KEY KEY_SPECIAL = 0x80; // special keys start here
+constexpr KEY KEY_RETURN = 0x81;
+constexpr KEY KEY_LEFT = 0x82;
+constexpr KEY KEY_RIGHT = 0x83;
+constexpr KEY KEY_UP = 0x84;
+constexpr KEY KEY_DOWN = 0x85;
+constexpr KEY KEY_ESCAPE = 0x86;
+constexpr KEY KEY_BACKSPACE =0x87;
+constexpr KEY KEY_DELETE = 0x88;
+constexpr KEY KEY_SHIFT = 0x89;
+constexpr KEY KEY_CONTROL = 0x8A;
+constexpr KEY KEY_ALT = 0x8B;
+constexpr KEY KEY_HOME = 0x8C;
+constexpr KEY KEY_END = 0x8D;
+constexpr KEY KEY_PAGE_UP = 0x8E;
+constexpr KEY KEY_PAGE_DOWN = 0x8F;
+constexpr KEY KEY_HYPHEN = 0x90;
+constexpr KEY KEY_EQUALS = 0x91;
+constexpr KEY KEY_INSERT = 0x92;
+constexpr KEY KEY_CAPSLOCK = 0x93;
+constexpr KEY KEY_TAB = 0x94;
+constexpr KEY KEY_ADD = 0x95;
+constexpr KEY KEY_SUBTRACT =0x96;
+constexpr KEY KEY_MULTIPLY =0x97;
+constexpr KEY KEY_DIVIDE = 0x98;
+constexpr KEY KEY_F1 = 0xA1;
+constexpr KEY KEY_F2 = 0xA2;
+constexpr KEY KEY_F3 = 0xA3;
+constexpr KEY KEY_F4 = 0xA4;
+constexpr KEY KEY_F5 = 0xA5;
+constexpr KEY KEY_F6 = 0xA6;
+constexpr KEY KEY_F7 = 0xA7;
+constexpr KEY KEY_F8 = 0xA8;
+constexpr KEY KEY_F9 = 0xA9;
+constexpr KEY KEY_F10 = 0xAA;
+constexpr KEY KEY_F11 = 0xAB;
+constexpr KEY KEY_F12 = 0xAC;
+
+constexpr KEY KEY_PAD_UP = 0xC0;
+constexpr KEY KEY_PAD_DOWN = 0xC1;
+constexpr KEY KEY_PAD_LEFT = 0xC2;
+constexpr KEY KEY_PAD_RIGHT = 0xC3;
+constexpr KEY KEY_PAD_HOME = 0xC4;
+constexpr KEY KEY_PAD_END = 0xC5;
+constexpr KEY KEY_PAD_PGUP = 0xC6;
+constexpr KEY KEY_PAD_PGDN = 0xC7;
+constexpr KEY KEY_PAD_CENTER = 0xC8; // the 5 in the middle
+constexpr KEY KEY_PAD_INS = 0xC9;
+constexpr KEY KEY_PAD_DEL = 0xCA;
+constexpr KEY KEY_PAD_RETURN = 0xCB;
+constexpr KEY KEY_PAD_ADD = 0xCC; // not used
+constexpr KEY KEY_PAD_SUBTRACT = 0xCD; // not used
+constexpr KEY KEY_PAD_MULTIPLY = 0xCE; // not used
+constexpr KEY KEY_PAD_DIVIDE = 0xCF; // not used
+
+constexpr KEY KEY_BUTTON0 = 0xD0;
+constexpr KEY KEY_BUTTON1 = 0xD1;
+constexpr KEY KEY_BUTTON2 = 0xD2;
+constexpr KEY KEY_BUTTON3 = 0xD3;
+constexpr KEY KEY_BUTTON4 = 0xD4;
+constexpr KEY KEY_BUTTON5 = 0xD5;
+constexpr KEY KEY_BUTTON6 = 0xD6;
+constexpr KEY KEY_BUTTON7 = 0xD7;
+constexpr KEY KEY_BUTTON8 = 0xD8;
+constexpr KEY KEY_BUTTON9 = 0xD9;
+constexpr KEY KEY_BUTTON10 = 0xDA;
+constexpr KEY KEY_BUTTON11 = 0xDB;
+constexpr KEY KEY_BUTTON12 = 0xDC;
+constexpr KEY KEY_BUTTON13 = 0xDD;
+constexpr KEY KEY_BUTTON14 = 0xDE;
+constexpr KEY KEY_BUTTON15 = 0xDF;
+
+constexpr KEY KEY_NONE = 0xFF; // not sent from keyboard. For internal use only.
+
+constexpr S32 KEY_COUNT = 256;
+
+
+constexpr F32 DEFAULT_WATER_HEIGHT = 20.0f;
// Maturity ratings for simulators
-const U8 SIM_ACCESS_MIN = 0; // Treated as 'unknown', usually ends up being SIM_ACCESS_PG
-const U8 SIM_ACCESS_PG = 13;
-const U8 SIM_ACCESS_MATURE = 21;
-const U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only
-const U8 SIM_ACCESS_DOWN = 254;
-const U8 SIM_ACCESS_MAX = SIM_ACCESS_ADULT;
+constexpr U8 SIM_ACCESS_MIN = 0; // Treated as 'unknown', usually ends up being SIM_ACCESS_PG
+constexpr U8 SIM_ACCESS_PG = 13;
+constexpr U8 SIM_ACCESS_MATURE = 21;
+constexpr U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only
+constexpr U8 SIM_ACCESS_DOWN = 254;
+constexpr U8 SIM_ACCESS_MAX = SIM_ACCESS_ADULT;
// attachment constants
-const U8 ATTACHMENT_ADD = 0x80;
+constexpr U8 ATTACHMENT_ADD = 0x80;
// god levels
-const U8 GOD_MAINTENANCE = 250;
-const U8 GOD_FULL = 200;
-const U8 GOD_LIAISON = 150;
-const U8 GOD_CUSTOMER_SERVICE = 100;
-const U8 GOD_LIKE = 1;
-const U8 GOD_NOT = 0;
+constexpr U8 GOD_MAINTENANCE = 250;
+constexpr U8 GOD_FULL = 200;
+constexpr U8 GOD_LIAISON = 150;
+constexpr U8 GOD_CUSTOMER_SERVICE = 100;
+constexpr U8 GOD_LIKE = 1;
+constexpr U8 GOD_NOT = 0;
// "agent id" for things that should be done to ALL agents
LL_COMMON_API extern const LLUUID LL_UUID_ALL_AGENTS;
@@ -239,121 +239,123 @@ LL_COMMON_API extern const LLUUID BLANK_OBJECT_NORMAL;
LL_COMMON_API extern const LLUUID BLANK_MATERIAL_ASSET_ID;
// radius within which a chat message is fully audible
-const F32 CHAT_NORMAL_RADIUS = 20.f;
+constexpr F32 CHAT_NORMAL_RADIUS = 20.f;
// media commands
-const U32 PARCEL_MEDIA_COMMAND_STOP = 0;
-const U32 PARCEL_MEDIA_COMMAND_PAUSE = 1;
-const U32 PARCEL_MEDIA_COMMAND_PLAY = 2;
-const U32 PARCEL_MEDIA_COMMAND_LOOP = 3;
-const U32 PARCEL_MEDIA_COMMAND_TEXTURE = 4;
-const U32 PARCEL_MEDIA_COMMAND_URL = 5;
-const U32 PARCEL_MEDIA_COMMAND_TIME = 6;
-const U32 PARCEL_MEDIA_COMMAND_AGENT = 7;
-const U32 PARCEL_MEDIA_COMMAND_UNLOAD = 8;
-const U32 PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9;
-const U32 PARCEL_MEDIA_COMMAND_TYPE = 10;
-const U32 PARCEL_MEDIA_COMMAND_SIZE = 11;
-const U32 PARCEL_MEDIA_COMMAND_DESC = 12;
-const U32 PARCEL_MEDIA_COMMAND_LOOP_SET = 13;
+constexpr U32 PARCEL_MEDIA_COMMAND_STOP = 0;
+constexpr U32 PARCEL_MEDIA_COMMAND_PAUSE = 1;
+constexpr U32 PARCEL_MEDIA_COMMAND_PLAY = 2;
+constexpr U32 PARCEL_MEDIA_COMMAND_LOOP = 3;
+constexpr U32 PARCEL_MEDIA_COMMAND_TEXTURE = 4;
+constexpr U32 PARCEL_MEDIA_COMMAND_URL = 5;
+constexpr U32 PARCEL_MEDIA_COMMAND_TIME = 6;
+constexpr U32 PARCEL_MEDIA_COMMAND_AGENT = 7;
+constexpr U32 PARCEL_MEDIA_COMMAND_UNLOAD = 8;
+constexpr U32 PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9;
+constexpr U32 PARCEL_MEDIA_COMMAND_TYPE = 10;
+constexpr U32 PARCEL_MEDIA_COMMAND_SIZE = 11;
+constexpr U32 PARCEL_MEDIA_COMMAND_DESC = 12;
+constexpr U32 PARCEL_MEDIA_COMMAND_LOOP_SET = 13;
const S32 CHAT_CHANNEL_DEBUG = S32_MAX;
// agent constants
-const U32 CONTROL_AT_POS_INDEX = 0;
-const U32 CONTROL_AT_NEG_INDEX = 1;
-const U32 CONTROL_LEFT_POS_INDEX = 2;
-const U32 CONTROL_LEFT_NEG_INDEX = 3;
-const U32 CONTROL_UP_POS_INDEX = 4;
-const U32 CONTROL_UP_NEG_INDEX = 5;
-const U32 CONTROL_PITCH_POS_INDEX = 6;
-const U32 CONTROL_PITCH_NEG_INDEX = 7;
-const U32 CONTROL_YAW_POS_INDEX = 8;
-const U32 CONTROL_YAW_NEG_INDEX = 9;
-const U32 CONTROL_FAST_AT_INDEX = 10;
-const U32 CONTROL_FAST_LEFT_INDEX = 11;
-const U32 CONTROL_FAST_UP_INDEX = 12;
-const U32 CONTROL_FLY_INDEX = 13;
-const U32 CONTROL_STOP_INDEX = 14;
-const U32 CONTROL_FINISH_ANIM_INDEX = 15;
-const U32 CONTROL_STAND_UP_INDEX = 16;
-const U32 CONTROL_SIT_ON_GROUND_INDEX = 17;
-const U32 CONTROL_MOUSELOOK_INDEX = 18;
-const U32 CONTROL_NUDGE_AT_POS_INDEX = 19;
-const U32 CONTROL_NUDGE_AT_NEG_INDEX = 20;
-const U32 CONTROL_NUDGE_LEFT_POS_INDEX = 21;
-const U32 CONTROL_NUDGE_LEFT_NEG_INDEX = 22;
-const U32 CONTROL_NUDGE_UP_POS_INDEX = 23;
-const U32 CONTROL_NUDGE_UP_NEG_INDEX = 24;
-const U32 CONTROL_TURN_LEFT_INDEX = 25;
-const U32 CONTROL_TURN_RIGHT_INDEX = 26;
-const U32 CONTROL_AWAY_INDEX = 27;
-const U32 CONTROL_LBUTTON_DOWN_INDEX = 28;
-const U32 CONTROL_LBUTTON_UP_INDEX = 29;
-const U32 CONTROL_ML_LBUTTON_DOWN_INDEX = 30;
-const U32 CONTROL_ML_LBUTTON_UP_INDEX = 31;
-const U32 TOTAL_CONTROLS = 32;
-
-const U32 AGENT_CONTROL_AT_POS = 0x1 << CONTROL_AT_POS_INDEX; // 0x00000001
-const U32 AGENT_CONTROL_AT_NEG = 0x1 << CONTROL_AT_NEG_INDEX; // 0x00000002
-const U32 AGENT_CONTROL_LEFT_POS = 0x1 << CONTROL_LEFT_POS_INDEX; // 0x00000004
-const U32 AGENT_CONTROL_LEFT_NEG = 0x1 << CONTROL_LEFT_NEG_INDEX; // 0x00000008
-const U32 AGENT_CONTROL_UP_POS = 0x1 << CONTROL_UP_POS_INDEX; // 0x00000010
-const U32 AGENT_CONTROL_UP_NEG = 0x1 << CONTROL_UP_NEG_INDEX; // 0x00000020
-const U32 AGENT_CONTROL_PITCH_POS = 0x1 << CONTROL_PITCH_POS_INDEX; // 0x00000040
-const U32 AGENT_CONTROL_PITCH_NEG = 0x1 << CONTROL_PITCH_NEG_INDEX; // 0x00000080
-const U32 AGENT_CONTROL_YAW_POS = 0x1 << CONTROL_YAW_POS_INDEX; // 0x00000100
-const U32 AGENT_CONTROL_YAW_NEG = 0x1 << CONTROL_YAW_NEG_INDEX; // 0x00000200
-
-const U32 AGENT_CONTROL_FAST_AT = 0x1 << CONTROL_FAST_AT_INDEX; // 0x00000400
-const U32 AGENT_CONTROL_FAST_LEFT = 0x1 << CONTROL_FAST_LEFT_INDEX; // 0x00000800
-const U32 AGENT_CONTROL_FAST_UP = 0x1 << CONTROL_FAST_UP_INDEX; // 0x00001000
-
-const U32 AGENT_CONTROL_FLY = 0x1 << CONTROL_FLY_INDEX; // 0x00002000
-const U32 AGENT_CONTROL_STOP = 0x1 << CONTROL_STOP_INDEX; // 0x00004000
-const U32 AGENT_CONTROL_FINISH_ANIM = 0x1 << CONTROL_FINISH_ANIM_INDEX; // 0x00008000
-const U32 AGENT_CONTROL_STAND_UP = 0x1 << CONTROL_STAND_UP_INDEX; // 0x00010000
-const U32 AGENT_CONTROL_SIT_ON_GROUND = 0x1 << CONTROL_SIT_ON_GROUND_INDEX; // 0x00020000
-const U32 AGENT_CONTROL_MOUSELOOK = 0x1 << CONTROL_MOUSELOOK_INDEX; // 0x00040000
-
-const U32 AGENT_CONTROL_NUDGE_AT_POS = 0x1 << CONTROL_NUDGE_AT_POS_INDEX; // 0x00080000
-const U32 AGENT_CONTROL_NUDGE_AT_NEG = 0x1 << CONTROL_NUDGE_AT_NEG_INDEX; // 0x00100000
-const U32 AGENT_CONTROL_NUDGE_LEFT_POS = 0x1 << CONTROL_NUDGE_LEFT_POS_INDEX; // 0x00200000
-const U32 AGENT_CONTROL_NUDGE_LEFT_NEG = 0x1 << CONTROL_NUDGE_LEFT_NEG_INDEX; // 0x00400000
-const U32 AGENT_CONTROL_NUDGE_UP_POS = 0x1 << CONTROL_NUDGE_UP_POS_INDEX; // 0x00800000
-const U32 AGENT_CONTROL_NUDGE_UP_NEG = 0x1 << CONTROL_NUDGE_UP_NEG_INDEX; // 0x01000000
-const U32 AGENT_CONTROL_TURN_LEFT = 0x1 << CONTROL_TURN_LEFT_INDEX; // 0x02000000
-const U32 AGENT_CONTROL_TURN_RIGHT = 0x1 << CONTROL_TURN_RIGHT_INDEX; // 0x04000000
-
-const U32 AGENT_CONTROL_AWAY = 0x1 << CONTROL_AWAY_INDEX; // 0x08000000
-
-const U32 AGENT_CONTROL_LBUTTON_DOWN = 0x1 << CONTROL_LBUTTON_DOWN_INDEX; // 0x10000000
-const U32 AGENT_CONTROL_LBUTTON_UP = 0x1 << CONTROL_LBUTTON_UP_INDEX; // 0x20000000
-const U32 AGENT_CONTROL_ML_LBUTTON_DOWN = 0x1 << CONTROL_ML_LBUTTON_DOWN_INDEX; // 0x40000000
-const U32 AGENT_CONTROL_ML_LBUTTON_UP = ((U32)0x1) << CONTROL_ML_LBUTTON_UP_INDEX; // 0x80000000
+constexpr U32 CONTROL_AT_POS_INDEX = 0;
+constexpr U32 CONTROL_AT_NEG_INDEX = 1;
+constexpr U32 CONTROL_LEFT_POS_INDEX = 2;
+constexpr U32 CONTROL_LEFT_NEG_INDEX = 3;
+constexpr U32 CONTROL_UP_POS_INDEX = 4;
+constexpr U32 CONTROL_UP_NEG_INDEX = 5;
+constexpr U32 CONTROL_PITCH_POS_INDEX = 6;
+constexpr U32 CONTROL_PITCH_NEG_INDEX = 7;
+constexpr U32 CONTROL_YAW_POS_INDEX = 8;
+constexpr U32 CONTROL_YAW_NEG_INDEX = 9;
+constexpr U32 CONTROL_FAST_AT_INDEX = 10;
+constexpr U32 CONTROL_FAST_LEFT_INDEX = 11;
+constexpr U32 CONTROL_FAST_UP_INDEX = 12;
+constexpr U32 CONTROL_FLY_INDEX = 13;
+constexpr U32 CONTROL_STOP_INDEX = 14;
+constexpr U32 CONTROL_FINISH_ANIM_INDEX = 15;
+constexpr U32 CONTROL_STAND_UP_INDEX = 16;
+constexpr U32 CONTROL_SIT_ON_GROUND_INDEX = 17;
+constexpr U32 CONTROL_MOUSELOOK_INDEX = 18;
+constexpr U32 CONTROL_NUDGE_AT_POS_INDEX = 19;
+constexpr U32 CONTROL_NUDGE_AT_NEG_INDEX = 20;
+constexpr U32 CONTROL_NUDGE_LEFT_POS_INDEX = 21;
+constexpr U32 CONTROL_NUDGE_LEFT_NEG_INDEX = 22;
+constexpr U32 CONTROL_NUDGE_UP_POS_INDEX = 23;
+constexpr U32 CONTROL_NUDGE_UP_NEG_INDEX = 24;
+constexpr U32 CONTROL_TURN_LEFT_INDEX = 25;
+constexpr U32 CONTROL_TURN_RIGHT_INDEX = 26;
+constexpr U32 CONTROL_AWAY_INDEX = 27;
+constexpr U32 CONTROL_LBUTTON_DOWN_INDEX = 28;
+constexpr U32 CONTROL_LBUTTON_UP_INDEX = 29;
+constexpr U32 CONTROL_ML_LBUTTON_DOWN_INDEX = 30;
+constexpr U32 CONTROL_ML_LBUTTON_UP_INDEX = 31;
+constexpr U32 TOTAL_CONTROLS = 32;
+
+constexpr U32 AGENT_CONTROL_AT_POS = 0x1 << CONTROL_AT_POS_INDEX; // 0x00000001
+constexpr U32 AGENT_CONTROL_AT_NEG = 0x1 << CONTROL_AT_NEG_INDEX; // 0x00000002
+constexpr U32 AGENT_CONTROL_LEFT_POS = 0x1 << CONTROL_LEFT_POS_INDEX; // 0x00000004
+constexpr U32 AGENT_CONTROL_LEFT_NEG = 0x1 << CONTROL_LEFT_NEG_INDEX; // 0x00000008
+constexpr U32 AGENT_CONTROL_UP_POS = 0x1 << CONTROL_UP_POS_INDEX; // 0x00000010
+constexpr U32 AGENT_CONTROL_UP_NEG = 0x1 << CONTROL_UP_NEG_INDEX; // 0x00000020
+constexpr U32 AGENT_CONTROL_PITCH_POS = 0x1 << CONTROL_PITCH_POS_INDEX; // 0x00000040
+constexpr U32 AGENT_CONTROL_PITCH_NEG = 0x1 << CONTROL_PITCH_NEG_INDEX; // 0x00000080
+constexpr U32 AGENT_CONTROL_YAW_POS = 0x1 << CONTROL_YAW_POS_INDEX; // 0x00000100
+constexpr U32 AGENT_CONTROL_YAW_NEG = 0x1 << CONTROL_YAW_NEG_INDEX; // 0x00000200
+
+constexpr U32 AGENT_CONTROL_FAST_AT = 0x1 << CONTROL_FAST_AT_INDEX; // 0x00000400
+constexpr U32 AGENT_CONTROL_FAST_LEFT = 0x1 << CONTROL_FAST_LEFT_INDEX; // 0x00000800
+constexpr U32 AGENT_CONTROL_FAST_UP = 0x1 << CONTROL_FAST_UP_INDEX; // 0x00001000
+
+constexpr U32 AGENT_CONTROL_FLY = 0x1 << CONTROL_FLY_INDEX; // 0x00002000
+constexpr U32 AGENT_CONTROL_STOP = 0x1 << CONTROL_STOP_INDEX; // 0x00004000
+constexpr U32 AGENT_CONTROL_FINISH_ANIM = 0x1 << CONTROL_FINISH_ANIM_INDEX; // 0x00008000
+constexpr U32 AGENT_CONTROL_STAND_UP = 0x1 << CONTROL_STAND_UP_INDEX; // 0x00010000
+constexpr U32 AGENT_CONTROL_SIT_ON_GROUND = 0x1 << CONTROL_SIT_ON_GROUND_INDEX; // 0x00020000
+constexpr U32 AGENT_CONTROL_MOUSELOOK = 0x1 << CONTROL_MOUSELOOK_INDEX; // 0x00040000
+
+constexpr U32 AGENT_CONTROL_NUDGE_AT_POS = 0x1 << CONTROL_NUDGE_AT_POS_INDEX; // 0x00080000
+constexpr U32 AGENT_CONTROL_NUDGE_AT_NEG = 0x1 << CONTROL_NUDGE_AT_NEG_INDEX; // 0x00100000
+constexpr U32 AGENT_CONTROL_NUDGE_LEFT_POS = 0x1 << CONTROL_NUDGE_LEFT_POS_INDEX; // 0x00200000
+constexpr U32 AGENT_CONTROL_NUDGE_LEFT_NEG = 0x1 << CONTROL_NUDGE_LEFT_NEG_INDEX; // 0x00400000
+constexpr U32 AGENT_CONTROL_NUDGE_UP_POS = 0x1 << CONTROL_NUDGE_UP_POS_INDEX; // 0x00800000
+constexpr U32 AGENT_CONTROL_NUDGE_UP_NEG = 0x1 << CONTROL_NUDGE_UP_NEG_INDEX; // 0x01000000
+constexpr U32 AGENT_CONTROL_TURN_LEFT = 0x1 << CONTROL_TURN_LEFT_INDEX; // 0x02000000
+constexpr U32 AGENT_CONTROL_TURN_RIGHT = 0x1 << CONTROL_TURN_RIGHT_INDEX; // 0x04000000
+
+constexpr U32 AGENT_CONTROL_AWAY = 0x1 << CONTROL_AWAY_INDEX; // 0x08000000
+
+constexpr U32 AGENT_CONTROL_LBUTTON_DOWN = 0x1 << CONTROL_LBUTTON_DOWN_INDEX; // 0x10000000
+constexpr U32 AGENT_CONTROL_LBUTTON_UP = 0x1 << CONTROL_LBUTTON_UP_INDEX; // 0x20000000
+constexpr U32 AGENT_CONTROL_ML_LBUTTON_DOWN = 0x1 << CONTROL_ML_LBUTTON_DOWN_INDEX; // 0x40000000
+constexpr U32 AGENT_CONTROL_ML_LBUTTON_UP = ((U32)0x1) << CONTROL_ML_LBUTTON_UP_INDEX; // 0x80000000
// move these up so that we can hide them in "State" for object updates
// (for now)
-const U32 AGENT_ATTACH_OFFSET = 4;
-const U32 AGENT_ATTACH_MASK = 0xf << AGENT_ATTACH_OFFSET;
+constexpr U32 AGENT_ATTACH_OFFSET = 4;
+constexpr U32 AGENT_ATTACH_MASK = 0xf << AGENT_ATTACH_OFFSET;
// RN: this method swaps the upper and lower nibbles to maintain backward
// compatibility with old objects that only used the upper nibble
#define ATTACHMENT_ID_FROM_STATE(state) ((S32)((((U8)state & AGENT_ATTACH_MASK) >> 4) | (((U8)state & ~AGENT_ATTACH_MASK) << 4)))
// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
-const U8 CLICK_ACTION_NONE = 0;
-const U8 CLICK_ACTION_TOUCH = 0;
-const U8 CLICK_ACTION_SIT = 1;
-const U8 CLICK_ACTION_BUY = 2;
-const U8 CLICK_ACTION_PAY = 3;
-const U8 CLICK_ACTION_OPEN = 4;
-const U8 CLICK_ACTION_PLAY = 5;
-const U8 CLICK_ACTION_OPEN_MEDIA = 6;
-const U8 CLICK_ACTION_ZOOM = 7;
-const U8 CLICK_ACTION_DISABLED = 8;
-const U8 CLICK_ACTION_IGNORE = 9;
+constexpr U8 CLICK_ACTION_NONE = 0;
+constexpr U8 CLICK_ACTION_TOUCH = 0;
+constexpr U8 CLICK_ACTION_SIT = 1;
+constexpr U8 CLICK_ACTION_BUY = 2;
+constexpr U8 CLICK_ACTION_PAY = 3;
+constexpr U8 CLICK_ACTION_OPEN = 4;
+constexpr U8 CLICK_ACTION_PLAY = 5;
+constexpr U8 CLICK_ACTION_OPEN_MEDIA = 6;
+constexpr U8 CLICK_ACTION_ZOOM = 7;
+constexpr U8 CLICK_ACTION_DISABLED = 8;
+constexpr U8 CLICK_ACTION_IGNORE = 9;
// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
+constexpr U32 BEACON_SHOW_MAP = 0x0001;
+constexpr U32 BEACON_FOCUS_MAP = 0x0002;
#endif
diff --git a/indra/llcommon/linden_common.h b/indra/llcommon/linden_common.h
index a918caa2e8..a41af153fe 100644
--- a/indra/llcommon/linden_common.h
+++ b/indra/llcommon/linden_common.h
@@ -28,12 +28,6 @@
#define LL_LINDEN_COMMON_H
#include "llprofiler.h"
-#if TRACY_ENABLE && !defined(LL_PROFILER_ENABLE_TRACY_OPENGL) // hooks for memory profiling
-void *tracy_aligned_malloc(size_t size, size_t alignment);
-void tracy_aligned_free(void *memblock);
-#define _aligned_malloc(X, Y) tracy_aligned_malloc((X), (Y))
-#define _aligned_free(X) tracy_aligned_free((X))
-#endif
// *NOTE: Please keep includes here to a minimum!
//
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 08a43983d3..c532620daa 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -229,7 +229,7 @@ bool LLApp::parseCommandOptions(int argc, wchar_t** wargv)
if(wargv[ii][1] == '-') ++offset;
#if LL_WINDOWS
- name.assign(utf16str_to_utf8str(&wargv[ii][offset]));
+ name.assign(ll_convert_wide_to_string(&wargv[ii][offset]));
#else
name.assign(wstring_to_utf8str(&wargv[ii][offset]));
#endif
@@ -253,7 +253,7 @@ bool LLApp::parseCommandOptions(int argc, wchar_t** wargv)
++ii;
#if LL_WINDOWS
- value.assign(utf16str_to_utf8str((wargv[ii])));
+ value.assign(ll_convert_wide_to_string((wargv[ii])));
#else
value.assign(wstring_to_utf8str((wargv[ii])));
#endif
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index c09cf7abd2..9672a3262b 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -29,6 +29,7 @@
#include "llassettype.h"
#include "lldictionary.h"
#include "llmemory.h"
+#include "llsd.h"
#include "llsingleton.h"
///----------------------------------------------------------------------------
@@ -246,3 +247,19 @@ bool LLAssetType::lookupIsAssetIDKnowable(EType asset_type)
}
return false;
}
+
+LLSD LLAssetType::getTypeNames()
+{
+ LLSD type_names;
+ const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
+ for (S32 type = AT_TEXTURE; type < AT_COUNT; ++type)
+ {
+ const AssetEntry *entry = dict->lookup((LLAssetType::EType) type);
+ // skip llassettype_bad_lookup
+ if (entry)
+ {
+ type_names.append(entry->mTypeName);
+ }
+ }
+ return type_names;
+}
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index 547c3f4329..17177d81c3 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -165,6 +165,8 @@ public:
static bool lookupIsAssetFetchByIDAllowed(EType asset_type); // the asset allows direct download
static bool lookupIsAssetIDKnowable(EType asset_type); // asset data can be known by the viewer
+ static LLSD getTypeNames();
+
static const std::string BADLOOKUP;
protected:
diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp
index 84b35749cc..7a22eaf203 100644
--- a/indra/llcommon/llcommon.cpp
+++ b/indra/llcommon/llcommon.cpp
@@ -33,23 +33,23 @@
#include "lltracethreadrecorder.h"
#include "llcleanup.h"
-thread_local bool gProfilerEnabled = false;
-
-#if (TRACY_ENABLE)
+#if LL_PROFILER_CONFIGURATION >= LL_PROFILER_CONFIG_TRACY && TRACY_ENABLE
// Override new/delete for tracy memory profiling
void* ll_tracy_new(size_t size)
{
- void* ptr;
- if (gProfilerEnabled)
- {
- //LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
- ptr = (malloc)(size);
- }
- else
+ void* ptr = (malloc)(size);
+ if (!ptr)
{
- ptr = (malloc)(size);
+ throw std::bad_alloc();
}
+ LL_PROFILE_ALLOC(ptr, size);
+ return ptr;
+}
+
+void* ll_tracy_aligned_new(size_t size, size_t alignment)
+{
+ void* ptr = ll_aligned_malloc_fallback(size, alignment);
if (!ptr)
{
throw std::bad_alloc();
@@ -58,6 +58,18 @@ void* ll_tracy_new(size_t size)
return ptr;
}
+void ll_tracy_delete(void* ptr)
+{
+ LL_PROFILE_FREE(ptr);
+ (free)(ptr);
+}
+
+void ll_tracy_aligned_delete(void* ptr)
+{
+ LL_PROFILE_FREE(ptr);
+ ll_aligned_free_fallback(ptr);
+}
+
void* operator new(size_t size)
{
return ll_tracy_new(size);
@@ -68,18 +80,14 @@ void* operator new[](std::size_t count)
return ll_tracy_new(count);
}
-void ll_tracy_delete(void* ptr)
+void* operator new(size_t size, std::align_val_t align)
{
- LL_PROFILE_FREE(ptr);
- if (gProfilerEnabled)
- {
- //LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
- (free)(ptr);
- }
- else
- {
- (free)(ptr);
- }
+ return ll_tracy_aligned_new(size, (size_t)align);
+}
+
+void* operator new[](std::size_t count, std::align_val_t align)
+{
+ return ll_tracy_aligned_new(count, (size_t)align);
}
void operator delete(void *ptr) noexcept
@@ -92,27 +100,17 @@ void operator delete[](void* ptr) noexcept
ll_tracy_delete(ptr);
}
-// C-style malloc/free can't be so easily overridden, so we define tracy versions and use
-// a pre-processor #define in linden_common.h to redirect to them. The parens around the native
-// functions below prevents recursive substitution by the preprocessor.
-//
-// Unaligned mallocs are rare in LL code but hooking them causes problems in 3p lib code (looking at
-// you, Havok), so we'll only capture the aligned version.
-
-void *tracy_aligned_malloc(size_t size, size_t alignment)
+void operator delete(void *ptr, std::align_val_t align) noexcept
{
- auto ptr = ll_aligned_malloc_fallback(size, alignment);
- if (ptr) LL_PROFILE_ALLOC(ptr, size);
- return ptr;
+ ll_tracy_aligned_delete(ptr);
}
-void tracy_aligned_free(void *memblock)
+void operator delete[](void* ptr, std::align_val_t align) noexcept
{
- LL_PROFILE_FREE(memblock);
- ll_aligned_free_fallback(memblock);
+ ll_tracy_aligned_delete(ptr);
}
-#endif
+#endif // TRACY_ENABLE && !LL_PROFILER_ENABLE_TRACY_OPENGL
//static
bool LLCommon::sAprInitialized = false;
diff --git a/indra/llcommon/lldefs.h b/indra/llcommon/lldefs.h
index 2fbb26dc1a..232987da14 100644
--- a/indra/llcommon/lldefs.h
+++ b/indra/llcommon/lldefs.h
@@ -171,13 +171,13 @@ constexpr U32 MAXADDRSTR = 17; // 123.567.901.345 = 15 chars + \0 +
// recursion tail
template <typename T>
-inline auto llmax(T data)
+constexpr auto llmax(T data)
{
return data;
}
template <typename T0, typename T1, typename... Ts>
-inline auto llmax(T0 d0, T1 d1, Ts... rest)
+constexpr auto llmax(T0 d0, T1 d1, Ts... rest)
{
auto maxrest = llmax(d1, rest...);
return (d0 > maxrest)? d0 : maxrest;
@@ -185,20 +185,20 @@ inline auto llmax(T0 d0, T1 d1, Ts... rest)
// recursion tail
template <typename T>
-inline auto llmin(T data)
+constexpr auto llmin(T data)
{
return data;
}
template <typename T0, typename T1, typename... Ts>
-inline auto llmin(T0 d0, T1 d1, Ts... rest)
+constexpr auto llmin(T0 d0, T1 d1, Ts... rest)
{
auto minrest = llmin(d1, rest...);
return (d0 < minrest) ? d0 : minrest;
}
template <typename A, typename MIN, typename MAX>
-inline A llclamp(A a, MIN minval, MAX maxval)
+constexpr A llclamp(A a, MIN minval, MAX maxval)
{
A aminval{ static_cast<A>(minval) }, amaxval{ static_cast<A>(maxval) };
if ( a < aminval )
@@ -213,13 +213,13 @@ inline A llclamp(A a, MIN minval, MAX maxval)
}
template <class LLDATATYPE>
-inline LLDATATYPE llclampf(LLDATATYPE a)
+constexpr LLDATATYPE llclampf(LLDATATYPE a)
{
return llmin(llmax(a, LLDATATYPE(0)), LLDATATYPE(1));
}
template <class LLDATATYPE>
-inline LLDATATYPE llclampb(LLDATATYPE a)
+constexpr LLDATATYPE llclampb(LLDATATYPE a)
{
return llmin(llmax(a, LLDATATYPE(0)), LLDATATYPE(255));
}
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index d834098994..3411e9c6bb 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -79,7 +79,7 @@ namespace {
//
if (s.size())
{
- OutputDebugString(utf8str_to_utf16str(s).c_str());
+ OutputDebugString(ll_convert<std::wstring>(s).c_str());
OutputDebugString(TEXT("\n"));
}
}
diff --git a/indra/llcommon/llexception.cpp b/indra/llcommon/llexception.cpp
index 107fdc2b2d..c0154a569f 100644
--- a/indra/llcommon/llexception.cpp
+++ b/indra/llcommon/llexception.cpp
@@ -15,12 +15,7 @@
#include "llexception.h"
// STL headers
// std headers
-#include <iomanip>
-#include <sstream>
#include <typeinfo>
-#if LL_WINDOWS
-#include <excpt.h>
-#endif // LL_WINDOWS
// external library headers
#include <boost/exception/diagnostic_information.hpp>
#include <boost/exception/error_info.hpp>
@@ -34,6 +29,7 @@
// On Windows, header-only implementation causes macro collisions -- use
// prebuilt library
#define BOOST_STACKTRACE_LINK
+#include <excpt.h>
#endif // LL_WINDOWS
#include <boost/stacktrace.hpp>
@@ -98,47 +94,25 @@ void annotate_exception_(boost::exception& exc)
// For windows SEH exception handling we sometimes need a filter that will
// separate C++ exceptions from C SEH exceptions
-static constexpr U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
-static constexpr U32 STATUS_STACK_FULL = 0xC00000FD;
+static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
-void LL::seh::fill_stacktrace(std::string& stacktrace, U32 code)
+U32 msc_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop)
{
- // Sadly, despite its diagnostic importance, trying to capture a
- // stacktrace when the stack is already blown only terminates us faster.
- if (code == STATUS_STACK_FULL)
- {
- stacktrace = "(stack overflow, no traceback)";
- }
- else
- {
- stacktrace = to_string(boost::stacktrace::stacktrace());
- }
-}
+ const auto stack = to_string(boost::stacktrace::stacktrace());
+ LL_WARNS() << "SEH Exception handled (that probably shouldn't be): Code " << code
+ << "\n Stack trace: \n"
+ << stack << LL_ENDL;
-U32 LL::seh::common_filter(U32 code, struct _EXCEPTION_POINTERS*)
-{
if (code == STATUS_MSC_EXCEPTION)
{
- // C++ exception, don't stop at this handler
+ // C++ exception, go on
return EXCEPTION_CONTINUE_SEARCH;
}
else
{
- // This is a non-C++ exception, e.g. hardware check.
- // Pass control into the handler block.
+ // handle it
return EXCEPTION_EXECUTE_HANDLER;
}
}
-void LL::seh::rethrow(U32 code, const std::string& stacktrace)
-{
- std::ostringstream out;
- out << "Windows exception 0x" << std::hex << code;
- if (! stacktrace.empty())
- {
- out << '\n' << stacktrace;
- }
- LLTHROW(Windows_SEH_exception(out.str()));
-}
-
#endif //LL_WINDOWS
diff --git a/indra/llcommon/llexception.h b/indra/llcommon/llexception.h
index f58a553eb3..68e609444e 100644
--- a/indra/llcommon/llexception.h
+++ b/indra/llcommon/llexception.h
@@ -12,7 +12,6 @@
#if ! defined(LL_LLEXCEPTION_H)
#define LL_LLEXCEPTION_H
-#include "always_return.h"
#include <stdexcept>
#include <boost/exception/exception.hpp>
#include <boost/throw_exception.hpp>
@@ -103,115 +102,14 @@ void crash_on_unhandled_exception_(const char*, int, const char*, const std::str
log_unhandled_exception_(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION, CONTEXT)
void log_unhandled_exception_(const char*, int, const char*, const std::string&);
-/*****************************************************************************
-* Structured Exception Handling
-*****************************************************************************/
-// this is used in platform-generic code -- define outside #if LL_WINDOWS
-struct Windows_SEH_exception: public LLException
-{
- Windows_SEH_exception(const std::string& what): LLException(what) {}
-};
-
-namespace LL
-{
-namespace seh
-{
-
-#if LL_WINDOWS //-------------------------------------------------------------
-
-void fill_stacktrace(std::string& stacktrace, U32 code);
-
-// wrapper around caller's U32 filter(U32 code, struct _EXCEPTION_POINTERS*)
-// filter function: capture a stacktrace, if possible, before forwarding the
-// call to the caller's filter() function
-template <typename FILTER>
-U32 filter_(std::string& stacktrace, FILTER&& filter,
- U32 code, struct _EXCEPTION_POINTERS* exptrs)
-{
- // By the time the handler gets control, the stack has been unwound,
- // so report the stack trace now at filter() time.
- fill_stacktrace(stacktrace, code);
- return std::forward<FILTER>(filter)(code, exptrs);
-}
-
-template <typename TRYCODE, typename FILTER, typename HANDLER>
-auto catcher_inner(std::string& stacktrace,
- TRYCODE&& trycode, FILTER&& filter, HANDLER&& handler)
-{
- __try
- {
- return std::forward<TRYCODE>(trycode)();
- }
- __except (filter_(stacktrace,
- std::forward<FILTER>(filter),
- GetExceptionCode(), GetExceptionInformation()))
- {
- return always_return<decltype(trycode())>(
- std::forward<HANDLER>(handler), GetExceptionCode(), stacktrace);
- }
-}
-
-// triadic variant specifies try(), filter(U32, struct _EXCEPTION_POINTERS*),
-// handler(U32, const std::string& stacktrace)
-// stacktrace may or may not be available
-template <typename TRYCODE, typename FILTER, typename HANDLER>
-auto catcher(TRYCODE&& trycode, FILTER&& filter, HANDLER&& handler)
-{
- // Construct and destroy this stacktrace string in the outer function
- // because we can't do either in the function with __try/__except.
- std::string stacktrace;
- return catcher_inner(stacktrace,
- std::forward<TRYCODE>(trycode),
- std::forward<FILTER>(filter),
- std::forward<HANDLER>(handler));
-}
-// common_filter() handles the typical case in which we want our handler
-// clause to handle only Structured Exceptions rather than explicitly-thrown
-// C++ exceptions
-U32 common_filter(U32 code, struct _EXCEPTION_POINTERS*);
-
-// dyadic variant specifies try(), handler(U32, stacktrace), assumes common_filter()
-template <typename TRYCODE, typename HANDLER>
-auto catcher(TRYCODE&& trycode, HANDLER&& handler)
-{
- return catcher(std::forward<TRYCODE>(trycode),
- common_filter,
- std::forward<HANDLER>(handler));
-}
-
-// monadic variant specifies try(), assumes default filter and handler
-template <typename TRYCODE>
-auto catcher(TRYCODE&& trycode)
-{
- return catcher(std::forward<TRYCODE>(trycode), rethrow);
-}
-
-[[noreturn]] void rethrow(U32 code, const std::string& stacktrace);
-
-#else // not LL_WINDOWS -----------------------------------------------------
-
-template <typename TRYCODE, typename FILTER, typename HANDLER>
-auto catcher(TRYCODE&& trycode, FILTER&&, HANDLER&&)
-{
- return std::forward<TRYCODE>(trycode)();
-}
-
-template <typename TRYCODE, typename HANDLER>
-auto catcher(TRYCODE&& trycode, HANDLER&&)
-{
- return std::forward<TRYCODE>(trycode)();
-}
-
-template <typename TRYCODE>
-auto catcher(TRYCODE&& trycode)
-{
- return std::forward<TRYCODE>(trycode)();
-}
+#if LL_WINDOWS
-#endif // not LL_WINDOWS -----------------------------------------------------
+// SEH exception filtering for use in __try __except
+// Separates C++ exceptions from C SEH exceptions
+// Todo: might be good idea to do some kind of seh_to_msc_wrapper(function, ARGS&&);
+U32 msc_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop);
-} // namespace LL::seh
-} // namespace LL
+#endif //LL_WINDOWS
#endif /* ! defined(LL_LLEXCEPTION_H) */
diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp
index 7ceb57336e..be0cab36e3 100644
--- a/indra/llcommon/llfasttimer.cpp
+++ b/indra/llcommon/llfasttimer.cpp
@@ -64,7 +64,7 @@ bool BlockTimer::sLog = false;
std::string BlockTimer::sLogName = "";
bool BlockTimer::sMetricLog = false;
-#if LL_LINUX
+#if LL_LINUX || (LL_DARWIN && LL_ARM64)
U64 BlockTimer::sClockResolution = 1000000000; // Nanosecond resolution
#else
U64 BlockTimer::sClockResolution = 1000000; // Microsecond resolution
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index a69a03e419..fde168b022 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -30,9 +30,14 @@
#include "llinstancetracker.h"
#include "lltrace.h"
#include "lltreeiterators.h"
+#include "llprocessor.h"
+#if LL_X86 || LL_X86_64
#if LL_WINDOWS
#include <intrin.h>
+#else
+#include <x86intrin.h>
+#endif
#endif
#define LL_FAST_TIMER_ON 1
@@ -68,38 +73,17 @@ public:
//
// Windows implementation of CPU clock
//
-
- //
- // NOTE: put back in when we aren't using platform sdk anymore
- //
- // because MS has different signatures for these functions in winnt.h
- // need to rename them to avoid conflicts
- //#define _interlockedbittestandset _renamed_interlockedbittestandset
- //#define _interlockedbittestandreset _renamed_interlockedbittestandreset
- //#include <intrin.h>
- //#undef _interlockedbittestandset
- //#undef _interlockedbittestandreset
-
- //inline U32 getCPUClockCount32()
- //{
- // U64 time_stamp = __rdtsc();
- // return (U32)(time_stamp >> 8);
- //}
- //
- //// return full timer value, *not* shifted by 8 bits
- //inline U64 getCPUClockCount64()
- //{
- // return __rdtsc();
- //}
-
-
+#if LL_FASTTIMER_USE_RDTSC
// shift off lower 8 bits for lower resolution but longer term timing
// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
-#if LL_FASTTIMER_USE_RDTSC
static U32 getCPUClockCount32()
{
+#if _M_ARM64
+ unsigned __int64 val = _ReadStatusReg(ARM64_PMCCNTR_EL0);
+#else
unsigned __int64 val = __rdtsc();
+#endif
val = val >> 8;
return static_cast<U32>(val);
}
@@ -107,7 +91,11 @@ public:
// return full timer value, *not* shifted by 8 bits
static U64 getCPUClockCount64()
{
+#if _M_ARM64
+ return static_cast<U64>( _ReadStatusReg(ARM64_PMCCNTR_EL0) );
+#else
return static_cast<U64>( __rdtsc() );
+#endif
}
#else
@@ -173,23 +161,39 @@ public:
#endif // (LL_LINUX) && !(defined(__i386__) || defined(__amd64__))
+/*
+#if LL_DARWIN && LL_ARM64
+ //
+ // Mac implementation of CPU clock - non-x86.
+ //
+ static U64 getCPUClockCount64()
+ {
+ return clock_gettime_nsec_np(CLOCK_UPTIME_RAW);
+ }
+
+ static U32 getCPUClockCount32()
+ {
+ return (U32)(getCPUClockCount64() >> 8);
+ }
+#endif // LL_DARWIN && LL_ARM64
+*/
+
#if (LL_LINUX || LL_DARWIN || __FreeBSD__) && (defined(__i386__) || defined(__amd64__))
//
// Mac+Linux FAST x86 implementation of CPU clock
+ //
+#if LL_FASTTIMER_USE_RDTSC
static U32 getCPUClockCount32()
{
- U32 low(0),high(0);
- __asm__ volatile (".byte 0x0f, 0x31": "=a"(low), "=d"(high) );
- return (low>>8) | (high<<24);
+ U64 time_stamp = __rdtsc() >> 8U;
+ return static_cast<U32>(time_stamp);
}
static U64 getCPUClockCount64()
{
- U32 low(0),high(0);
- __asm__ volatile (".byte 0x0f, 0x31": "=a"(low), "=d"(high) );
- return (U64)low | ( ((U64)high) << 32);
+ return static_cast<U64>(__rdtsc());
}
-
+#endif
#endif
static BlockTimerStatHandle& getRootTimeBlock();
diff --git a/indra/llcommon/llfile.cpp b/indra/llcommon/llfile.cpp
index d0bc8f7652..a539e4fe28 100644
--- a/indra/llcommon/llfile.cpp
+++ b/indra/llcommon/llfile.cpp
@@ -35,7 +35,6 @@
#if LL_WINDOWS
#include "llwin32headers.h"
-#include <stdlib.h> // Windows errno
#include <vector>
#else
#include <errno.h>
@@ -49,6 +48,86 @@ static std::string empty;
// variants of strerror() to report errors.
#if LL_WINDOWS
+// For the situations where we directly call into Windows API functions we need to translate
+// the Windows error codes into errno values
+namespace
+{
+ struct errentry
+ {
+ unsigned long oserr; // Windows OS error value
+ int errcode; // System V error code
+ };
+}
+
+// translation table between Windows OS error value and System V errno code
+static errentry const errtable[]
+{
+ { ERROR_INVALID_FUNCTION, EINVAL }, // 1
+ { ERROR_FILE_NOT_FOUND, ENOENT }, // 2
+ { ERROR_PATH_NOT_FOUND, ENOENT }, // 3
+ { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, // 4
+ { ERROR_ACCESS_DENIED, EACCES }, // 5
+ { ERROR_INVALID_HANDLE, EBADF }, // 6
+ { ERROR_ARENA_TRASHED, ENOMEM }, // 7
+ { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, // 8
+ { ERROR_INVALID_BLOCK, ENOMEM }, // 9
+ { ERROR_BAD_ENVIRONMENT, E2BIG }, // 10
+ { ERROR_BAD_FORMAT, ENOEXEC }, // 11
+ { ERROR_INVALID_ACCESS, EINVAL }, // 12
+ { ERROR_INVALID_DATA, EINVAL }, // 13
+ { ERROR_INVALID_DRIVE, ENOENT }, // 15
+ { ERROR_CURRENT_DIRECTORY, EACCES }, // 16
+ { ERROR_NOT_SAME_DEVICE, EXDEV }, // 17
+ { ERROR_NO_MORE_FILES, ENOENT }, // 18
+ { ERROR_LOCK_VIOLATION, EACCES }, // 33
+ { ERROR_BAD_NETPATH, ENOENT }, // 53
+ { ERROR_NETWORK_ACCESS_DENIED, EACCES }, // 65
+ { ERROR_BAD_NET_NAME, ENOENT }, // 67
+ { ERROR_FILE_EXISTS, EEXIST }, // 80
+ { ERROR_CANNOT_MAKE, EACCES }, // 82
+ { ERROR_FAIL_I24, EACCES }, // 83
+ { ERROR_INVALID_PARAMETER, EINVAL }, // 87
+ { ERROR_NO_PROC_SLOTS, EAGAIN }, // 89
+ { ERROR_DRIVE_LOCKED, EACCES }, // 108
+ { ERROR_BROKEN_PIPE, EPIPE }, // 109
+ { ERROR_DISK_FULL, ENOSPC }, // 112
+ { ERROR_INVALID_TARGET_HANDLE, EBADF }, // 114
+ { ERROR_WAIT_NO_CHILDREN, ECHILD }, // 128
+ { ERROR_CHILD_NOT_COMPLETE, ECHILD }, // 129
+ { ERROR_DIRECT_ACCESS_HANDLE, EBADF }, // 130
+ { ERROR_NEGATIVE_SEEK, EINVAL }, // 131
+ { ERROR_SEEK_ON_DEVICE, EACCES }, // 132
+ { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, // 145
+ { ERROR_NOT_LOCKED, EACCES }, // 158
+ { ERROR_BAD_PATHNAME, ENOENT }, // 161
+ { ERROR_MAX_THRDS_REACHED, EAGAIN }, // 164
+ { ERROR_LOCK_FAILED, EACCES }, // 167
+ { ERROR_ALREADY_EXISTS, EEXIST }, // 183
+ { ERROR_FILENAME_EXCED_RANGE, ENOENT }, // 206
+ { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, // 215
+ { ERROR_NO_UNICODE_TRANSLATION, EILSEQ }, // 1113
+ { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } // 1816
+};
+
+static int set_errno_from_oserror(unsigned long oserr)
+{
+ if (!oserr)
+ return 0;
+
+ // Check the table for the Windows OS error code
+ for (const struct errentry &entry : errtable)
+ {
+ if (oserr == entry.oserr)
+ {
+ _set_errno(entry.errcode);
+ return -1;
+ }
+ }
+
+ _set_errno(EINVAL);
+ return -1;
+}
+
// On Windows, use strerror_s().
std::string strerr(int errn)
{
@@ -57,7 +136,67 @@ std::string strerr(int errn)
return buffer;
}
-typedef std::basic_ios<char,std::char_traits < char > > _Myios;
+inline bool is_slash(wchar_t const c)
+{
+ return c == L'\\' || c == L'/';
+}
+
+static std::wstring utf8path_to_wstring(const std::string& utf8path)
+{
+ if (utf8path.size() >= MAX_PATH)
+ {
+ // By prepending "\\?\" to a path, Windows widechar file APIs will not fail on long path names
+ std::wstring utf16path = L"\\\\?\\" + ll_convert<std::wstring>(utf8path);
+ // We need to make sure that the path does not contain forward slashes as above
+ // prefix does bypass the path normalization that replaces slashes with backslashes
+ // before passing the path to kernel mode APIs
+ std::replace(utf16path.begin(), utf16path.end(), L'/', L'\\');
+ return utf16path;
+ }
+ return ll_convert<std::wstring>(utf8path);
+}
+
+static unsigned short get_fileattr(const std::wstring& utf16path, bool dontFollowSymLink = false)
+{
+ unsigned long flags = FILE_FLAG_BACKUP_SEMANTICS;
+ if (dontFollowSymLink)
+ {
+ flags |= FILE_FLAG_OPEN_REPARSE_POINT;
+ }
+ HANDLE file_handle = CreateFileW(utf16path.c_str(), FILE_READ_ATTRIBUTES,
+ FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
+ nullptr, OPEN_EXISTING, flags, nullptr);
+ if (file_handle != INVALID_HANDLE_VALUE)
+ {
+ FILE_ATTRIBUTE_TAG_INFO attribute_info;
+ if (GetFileInformationByHandleEx(file_handle, FileAttributeTagInfo, &attribute_info, sizeof(attribute_info)))
+ {
+ // A volume path alone (only drive letter) is not recognized as directory while it technically is
+ bool is_directory = (attribute_info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
+ (iswalpha(utf16path[0]) && utf16path[1] == ':' &&
+ (!utf16path[2] || (is_slash(utf16path[2]) && !utf16path[3])));
+ unsigned short st_mode = is_directory ? S_IFDIR :
+ (attribute_info.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT ? S_IFLNK : S_IFREG);
+ st_mode |= (attribute_info.FileAttributes & FILE_ATTRIBUTE_READONLY) ? S_IREAD : S_IREAD | S_IWRITE;
+ // we do not try to guess executable flag
+
+ // propagate user bits to group/other fields:
+ st_mode |= (st_mode & 0700) >> 3;
+ st_mode |= (st_mode & 0700) >> 6;
+
+ CloseHandle(file_handle);
+ return st_mode;
+ }
+ }
+ // Retrieve last error and set errno before calling CloseHandle()
+ set_errno_from_oserror(GetLastError());
+
+ if (file_handle != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(file_handle);
+ }
+ return 0;
+}
#else
// On Posix we want to call strerror_r(), but alarmingly, there are two
@@ -108,18 +247,13 @@ std::string strerr(int errn)
}
#endif // ! LL_WINDOWS
-// On either system, shorthand call just infers global 'errno'.
-std::string strerr()
-{
- return strerr(errno);
-}
-
-int warnif(const std::string& desc, const std::string& filename, int rc, int accept=0)
+static int warnif(const std::string& desc, const std::string& filename, int rc, int accept = 0)
{
if (rc < 0)
{
// Capture errno before we start emitting output
int errn = errno;
+
// For certain operations, a particular errno value might be
// acceptable -- e.g. stat() could permit ENOENT, mkdir() could permit
// EEXIST. Don't warn if caller explicitly says this errno is okay.
@@ -176,68 +310,59 @@ int warnif(const std::string& desc, const std::string& filename, int rc, int acc
// static
int LLFile::mkdir(const std::string& dirname, int perms)
{
+ // We often use mkdir() to ensure the existence of a directory that might
+ // already exist. There is no known case in which we want to call out as
+ // an error the requested directory already existing.
#if LL_WINDOWS
// permissions are ignored on Windows
- std::string utf8dirname = dirname;
- llutf16string utf16dirname = utf8str_to_utf16str(utf8dirname);
- int rc = _wmkdir(utf16dirname.c_str());
+ int rc = 0;
+ std::wstring utf16dirname = utf8path_to_wstring(dirname);
+ if (!CreateDirectoryW(utf16dirname.c_str(), nullptr))
+ {
+ // Only treat other errors than an already existing file as a real error
+ unsigned long oserr = GetLastError();
+ if (oserr != ERROR_ALREADY_EXISTS)
+ {
+ rc = set_errno_from_oserror(oserr);
+ }
+ }
#else
int rc = ::mkdir(dirname.c_str(), (mode_t)perms);
-#endif
- // We often use mkdir() to ensure the existence of a directory that might
- // already exist. There is no known case in which we want to call out as
- // an error the requested directory already existing.
if (rc < 0 && errno == EEXIST)
{
// this is not the error you want, move along
return 0;
}
+#endif
// anything else might be a problem
- return warnif("mkdir", dirname, rc, EEXIST);
+ return warnif("mkdir", dirname, rc);
}
// static
-int LLFile::rmdir(const std::string& dirname)
+int LLFile::rmdir(const std::string& dirname, int suppress_error)
{
#if LL_WINDOWS
- // permissions are ignored on Windows
- std::string utf8dirname = dirname;
- llutf16string utf16dirname = utf8str_to_utf16str(utf8dirname);
+ std::wstring utf16dirname = utf8path_to_wstring(dirname);
int rc = _wrmdir(utf16dirname.c_str());
#else
int rc = ::rmdir(dirname.c_str());
#endif
- return warnif("rmdir", dirname, rc);
+ return warnif("rmdir", dirname, rc, suppress_error);
}
// static
-LLFILE* LLFile::fopen(const std::string& filename, const char* mode) /* Flawfinder: ignore */
+LLFILE* LLFile::fopen(const std::string& filename, const char* mode)
{
#if LL_WINDOWS
- std::string utf8filename = filename;
- std::string utf8mode = std::string(mode);
- llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
- llutf16string utf16mode = utf8str_to_utf16str(utf8mode);
- return _wfopen(utf16filename.c_str(),utf16mode.c_str());
+ std::wstring utf16filename = utf8path_to_wstring(filename);
+ std::wstring utf16mode = ll_convert<std::wstring>(std::string(mode));
+ return _wfopen(utf16filename.c_str(), utf16mode.c_str());
#else
- return ::fopen(filename.c_str(),mode); /* Flawfinder: ignore */
-#endif
-}
-
-LLFILE* LLFile::_fsopen(const std::string& filename, const char* mode, int sharingFlag)
-{
-#if LL_WINDOWS
- std::string utf8filename = filename;
- std::string utf8mode = std::string(mode);
- llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
- llutf16string utf16mode = utf8str_to_utf16str(utf8mode);
- return _wfsopen(utf16filename.c_str(),utf16mode.c_str(),sharingFlag);
-#else
- llassert(0);//No corresponding function on non-windows
- return NULL;
+ return ::fopen(filename.c_str(),mode);
#endif
}
+// static
int LLFile::close(LLFILE * file)
{
int ret_value = 0;
@@ -248,9 +373,10 @@ int LLFile::close(LLFILE * file)
return ret_value;
}
+// static
std::string LLFile::getContents(const std::string& filename)
{
- LLFILE* fp = fopen(filename, "rb"); /* Flawfinder: ignore */
+ LLFILE* fp = LLFile::fopen(filename, "rb");
if (fp)
{
fseek(fp, 0, SEEK_END);
@@ -267,45 +393,80 @@ std::string LLFile::getContents(const std::string& filename)
return LLStringUtil::null;
}
-int LLFile::remove(const std::string& filename, int supress_error)
+// static
+int LLFile::remove(const std::string& filename, int suppress_error)
{
#if LL_WINDOWS
- std::string utf8filename = filename;
- llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
- int rc = _wremove(utf16filename.c_str());
+ // Posix remove() works on both files and directories although on Windows
+ // remove() and its wide char variant _wremove() only removes files just
+ // as its siblings unlink() and _wunlink().
+ // If we really only want to support files we should instead use
+ // unlink() in the non-Windows part below too
+ int rc = -1;
+ std::wstring utf16filename = utf8path_to_wstring(filename);
+ unsigned short st_mode = get_fileattr(utf16filename);
+ if (S_ISDIR(st_mode))
+ {
+ rc = _wrmdir(utf16filename.c_str());
+ }
+ else if (S_ISREG(st_mode))
+ {
+ rc = _wunlink(utf16filename.c_str());
+ }
+ else if (st_mode)
+ {
+ // it is something else than a file or directory
+ // this should not really happen as long as we do not allow for symlink
+ // detection in the optional parameter to get_fileattr()
+ rc = set_errno_from_oserror(ERROR_INVALID_PARAMETER);
+ }
+ else
+ {
+ // get_fileattr() failed and already set errno, preserve it for correct error reporting
+ }
#else
int rc = ::remove(filename.c_str());
#endif
- return warnif("remove", filename, rc, supress_error);
+ return warnif("remove", filename, rc, suppress_error);
}
-int LLFile::rename(const std::string& filename, const std::string& newname, int supress_error)
+// static
+int LLFile::rename(const std::string& filename, const std::string& newname, int suppress_error)
{
#if LL_WINDOWS
- std::string utf8filename = filename;
- std::string utf8newname = newname;
- llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
- llutf16string utf16newname = utf8str_to_utf16str(utf8newname);
- int rc = _wrename(utf16filename.c_str(),utf16newname.c_str());
+ // Posix rename() will gladly overwrite a file at newname if it exists, the Windows
+ // rename(), respectively _wrename(), will bark on that. Instead call directly the Windows
+ // API MoveFileEx() and use its flags to specify that overwrite is allowed.
+ std::wstring utf16filename = utf8path_to_wstring(filename);
+ std::wstring utf16newname = utf8path_to_wstring(newname);
+ int rc = 0;
+ if (!MoveFileExW(utf16filename.c_str(), utf16newname.c_str(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED))
+ {
+ rc = set_errno_from_oserror(GetLastError());
+ }
#else
int rc = ::rename(filename.c_str(),newname.c_str());
#endif
- return warnif(STRINGIZE("rename to '" << newname << "' from"), filename, rc, supress_error);
+ return warnif(STRINGIZE("rename to '" << newname << "' from"), filename, rc, suppress_error);
}
+// Make this a define rather than using magic numbers multiple times in the code
+#define LLFILE_COPY_BUFFER_SIZE 16384
+
+// static
bool LLFile::copy(const std::string& from, const std::string& to)
{
bool copied = false;
- LLFILE* in = LLFile::fopen(from, "rb"); /* Flawfinder: ignore */
+ LLFILE* in = LLFile::fopen(from, "rb");
if (in)
{
- LLFILE* out = LLFile::fopen(to, "wb"); /* Flawfinder: ignore */
+ LLFILE* out = LLFile::fopen(to, "wb");
if (out)
{
- char buf[16384]; /* Flawfinder: ignore */
+ char buf[LLFILE_COPY_BUFFER_SIZE];
size_t readbytes;
bool write_ok = true;
- while(write_ok && (readbytes = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */
+ while (write_ok && (readbytes = fread(buf, 1, LLFILE_COPY_BUFFER_SIZE, in)))
{
if (fwrite(buf, 1, readbytes, out) != readbytes)
{
@@ -324,34 +485,62 @@ bool LLFile::copy(const std::string& from, const std::string& to)
return copied;
}
-int LLFile::stat(const std::string& filename, llstat* filestatus)
+// static
+int LLFile::stat(const std::string& filename, llstat* filestatus, int suppress_error)
{
#if LL_WINDOWS
- std::string utf8filename = filename;
- llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
- int rc = _wstat(utf16filename.c_str(),filestatus);
+ std::wstring utf16filename = utf8path_to_wstring(filename);
+ int rc = _wstat64(utf16filename.c_str(), filestatus);
#else
- int rc = ::stat(filename.c_str(),filestatus);
+ int rc = ::stat(filename.c_str(), filestatus);
#endif
- // We use stat() to determine existence (see isfile(), isdir()).
- // Don't spam the log if the subject pathname doesn't exist.
- return warnif("stat", filename, rc, ENOENT);
+ return warnif("stat", filename, rc, suppress_error);
}
-bool LLFile::isdir(const std::string& filename)
+// static
+unsigned short LLFile::getattr(const std::string& filename, bool dontFollowSymLink, int suppress_error)
{
- llstat st;
+#if LL_WINDOWS
+ // _wstat64() is a bit heavyweight on Windows, use a more lightweight API
+ // to just get the attributes
+ int rc = -1;
+ std::wstring utf16filename = utf8path_to_wstring(filename);
+ unsigned short st_mode = get_fileattr(utf16filename, dontFollowSymLink);
+ if (st_mode)
+ {
+ return st_mode;
+ }
+#else
+ llstat filestatus;
+ int rc = dontFollowSymLink ? ::lstat(filename.c_str(), &filestatus) : ::stat(filename.c_str(), &filestatus);
+ if (rc == 0)
+ {
+ return filestatus.st_mode;
+ }
+#endif
+ warnif("getattr", filename, rc, suppress_error);
+ return 0;
+}
- return stat(filename, &st) == 0 && S_ISDIR(st.st_mode);
+// static
+bool LLFile::isdir(const std::string& filename)
+{
+ return S_ISDIR(getattr(filename));
}
+// static
bool LLFile::isfile(const std::string& filename)
{
- llstat st;
+ return S_ISREG(getattr(filename));
+}
- return stat(filename, &st) == 0 && S_ISREG(st.st_mode);
+// static
+bool LLFile::islink(const std::string& filename)
+{
+ return S_ISLNK(getattr(filename, true));
}
+// static
const char *LLFile::tmpdir()
{
static std::string utf8path;
@@ -378,89 +567,22 @@ const char *LLFile::tmpdir()
return utf8path.c_str();
}
-
-/***************** Modified file stream created to overcome the incorrect behaviour of posix fopen in windows *******************/
-
#if LL_WINDOWS
-LLFILE * LLFile::_Fiopen(const std::string& filename,
- std::ios::openmode mode)
-{ // open a file
- static const char *mods[] =
- { // fopen mode strings corresponding to valid[i]
- "r", "w", "w", "a", "rb", "wb", "wb", "ab",
- "r+", "w+", "a+", "r+b", "w+b", "a+b",
- 0};
- static const int valid[] =
- { // valid combinations of open flags
- ios_base::in,
- ios_base::out,
- ios_base::out | ios_base::trunc,
- ios_base::out | ios_base::app,
- ios_base::in | ios_base::binary,
- ios_base::out | ios_base::binary,
- ios_base::out | ios_base::trunc | ios_base::binary,
- ios_base::out | ios_base::app | ios_base::binary,
- ios_base::in | ios_base::out,
- ios_base::in | ios_base::out | ios_base::trunc,
- ios_base::in | ios_base::out | ios_base::app,
- ios_base::in | ios_base::out | ios_base::binary,
- ios_base::in | ios_base::out | ios_base::trunc
- | ios_base::binary,
- ios_base::in | ios_base::out | ios_base::app
- | ios_base::binary,
- 0};
-
- LLFILE *fp = 0;
- int n;
- ios_base::openmode atendflag = mode & ios_base::ate;
- ios_base::openmode norepflag = mode & ios_base::_Noreplace;
-
- if (mode & ios_base::_Nocreate)
- mode |= ios_base::in; // file must exist
- mode &= ~(ios_base::ate | ios_base::_Nocreate | ios_base::_Noreplace);
- for (n = 0; valid[n] != 0 && valid[n] != mode; ++n)
- ; // look for a valid mode
-
- if (valid[n] == 0)
- return (0); // no valid mode
- else if (norepflag && mode & (ios_base::out | ios_base::app)
- && (fp = LLFile::fopen(filename, "r")) != 0) /* Flawfinder: ignore */
- { // file must not exist, close and fail
- fclose(fp);
- return (0);
- }
- else if (fp != 0 && fclose(fp) != 0)
- return (0); // can't close after test open
-// should open with protection here, if other than default
- else if ((fp = LLFile::fopen(filename, mods[n])) == 0) /* Flawfinder: ignore */
- return (0); // open failed
-
- if (!atendflag || fseek(fp, 0, SEEK_END) == 0)
- return (fp); // no need to seek to end, or seek succeeded
-
- fclose(fp); // can't position at end
- return (0);
-}
-
-#endif /* LL_WINDOWS */
-
-
-#if LL_WINDOWS
/************** input file stream ********************************/
llifstream::llifstream() {}
// explicit
llifstream::llifstream(const std::string& _Filename, ios_base::openmode _Mode):
- std::ifstream(utf8str_to_utf16str( _Filename ).c_str(),
+ std::ifstream(ll_convert<std::wstring>( _Filename ).c_str(),
_Mode | ios_base::in)
{
}
void llifstream::open(const std::string& _Filename, ios_base::openmode _Mode)
{
- std::ifstream::open(utf8str_to_utf16str(_Filename).c_str(),
+ std::ifstream::open(ll_convert<std::wstring>(_Filename).c_str(),
_Mode | ios_base::in);
}
@@ -472,14 +594,14 @@ llofstream::llofstream() {}
// explicit
llofstream::llofstream(const std::string& _Filename, ios_base::openmode _Mode):
- std::ofstream(utf8str_to_utf16str( _Filename ).c_str(),
+ std::ofstream(ll_convert<std::wstring>( _Filename ).c_str(),
_Mode | ios_base::out)
{
}
void llofstream::open(const std::string& _Filename, ios_base::openmode _Mode)
{
- std::ofstream::open(utf8str_to_utf16str( _Filename ).c_str(),
+ std::ofstream::open(ll_convert<std::wstring>( _Filename ).c_str(),
_Mode | ios_base::out);
}
diff --git a/indra/llcommon/llfile.h b/indra/llcommon/llfile.h
index 1661cbeb55..04a2946ac4 100644
--- a/indra/llcommon/llfile.h
+++ b/indra/llcommon/llfile.h
@@ -41,8 +41,9 @@ typedef FILE LLFILE;
#include <sys/stat.h>
#if LL_WINDOWS
-// windows version of stat function and stat data structure are called _stat
-typedef struct _stat llstat;
+// The Windows version of stat function and stat data structure are called _stat64
+// We use _stat64 here to support 64-bit st_size and time_t values
+typedef struct _stat64 llstat;
#else
typedef struct stat llstat;
#include <sys/types.h>
@@ -56,35 +57,110 @@ typedef struct stat llstat;
# define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
#endif
+// Windows C runtime library does not define this and does not support symlink detection in the
+// stat functions but we do in our getattr() function
+#ifndef S_IFLNK
+#define S_IFLNK 0xA000 /* symlink */
+#endif
+
+#ifndef S_ISLNK
+#define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK)
+#endif
+
#include "llstring.h" // safe char* -> std::string conversion
+/// LLFile is a class of static functions operating on paths
+/// All the functions with a path string input take UTF8 path/filenames
class LL_COMMON_API LLFile
{
public:
- // All these functions take UTF8 path/filenames.
- static LLFILE* fopen(const std::string& filename,const char* accessmode); /* Flawfinder: ignore */
- static LLFILE* _fsopen(const std::string& filename,const char* accessmode,int sharingFlag);
+ /// open a file with the specified access mode
+ static LLFILE* fopen(const std::string& filename, const char* accessmode); /* Flawfinder: ignore */
+ ///< 'accessmode' follows the rules of the Posix fopen() mode parameter
+ /// "r" open the file for reading only and positions the stream at the beginning
+ /// "r+" open the file for reading and writing and positions the stream at the beginning
+ /// "w" open the file for reading and writing and truncate it to zero length
+ /// "w+" open or create the file for reading and writing and truncate to zero length if it existed
+ /// "a" open the file for reading and writing and position the stream at the end of the file
+ /// "a+" open or create the file for reading and writing and position the stream at the end of the file
+ ///
+ /// in addition to these values, "b" can be appended to indicate binary stream access, but on Linux and Mac
+ /// this is strictly for compatibility and has no effect. On Windows this makes the file functions not
+ /// try to translate line endings. Windows also allows to append "t" to indicate text mode. If neither
+ /// "b" or "t" is defined, Windows uses the value set by _fmode which by default is _O_TEXT.
+ /// This means that it is always a good idea to append "b" specifically for binary file access to
+ /// avoid corruption of the binary consistency of the data stream when reading or writing
+ /// Other characters in 'accessmode' will usually cause an error as fopen will verify this parameter
+ /// @returns a valid LLFILE* pointer on success or NULL on failure
static int close(LLFILE * file);
+ /// retrieve the content of a file into a string
static std::string getContents(const std::string& filename);
+ ///< @returns the content of the file or an empty string on failure
- // perms is a permissions mask like 0777 or 0700. In most cases it will
- // be overridden by the user's umask. It is ignored on Windows.
- // mkdir() considers "directory already exists" to be SUCCESS.
+ /// create a directory
static int mkdir(const std::string& filename, int perms = 0700);
-
- static int rmdir(const std::string& filename);
- static int remove(const std::string& filename, int supress_error = 0);
- static int rename(const std::string& filename,const std::string& newname, int supress_error = 0);
+ ///< perms is a permissions mask like 0777 or 0700. In most cases it will be
+ /// overridden by the user's umask. It is ignored on Windows.
+ /// mkdir() considers "directory already exists" to be not an error.
+ /// @returns 0 on success and -1 on failure.
+
+ //// remove a directory
+ static int rmdir(const std::string& filename, int suppress_error = 0);
+ ///< pass ENOENT in the optional 'suppress_error' parameter
+ /// if you don't want a warning in the log when the directory does not exist
+ /// @returns 0 on success and -1 on failure.
+
+ /// remove a file or directory
+ static int remove(const std::string& filename, int suppress_error = 0);
+ ///< pass ENOENT in the optional 'suppress_error' parameter
+ /// if you don't want a warning in the log when the directory does not exist
+ /// @returns 0 on success and -1 on failure.
+
+ /// rename a file
+ static int rename(const std::string& filename, const std::string& newname, int suppress_error = 0);
+ ///< it will silently overwrite newname if it exists without returning an error
+ /// Posix guarantees that if newname already exists, then there will be no moment
+ /// in which for other processes newname does not exist. There is no such guarantee
+ /// under Windows at this time. It may do it in the same way but the used Windows API
+ /// does not make such guarantees.
+ /// @returns 0 on success and -1 on failure.
+
+
+ /// copy the contents of file from 'from' to 'to' filename
static bool copy(const std::string& from, const std::string& to);
-
- static int stat(const std::string& filename,llstat* file_status);
- static bool isdir(const std::string& filename);
- static bool isfile(const std::string& filename);
- static LLFILE * _Fiopen(const std::string& filename,
- std::ios::openmode mode);
-
+ ///< @returns true on success and false on failure.
+
+ /// return the file stat structure for filename
+ static int stat(const std::string& filename, llstat* file_status, int suppress_error = ENOENT);
+ ///< for compatibility with existing uses of LL_File::stat() we use ENOENT as default in the
+ /// optional 'suppress_error' parameter to avoid spamming the log with warnings when the API
+ /// is used to detect if a file exists
+ /// @returns 0 on success and -1 on failure.
+
+ /// get the file or directory attributes for filename
+ static unsigned short getattr(const std::string& filename, bool dontFollowSymLink = false, int suppress_error = ENOENT);
+ ///< a more lightweight function on Windows to stat, that just returns the file attribute flags
+ /// dontFollowSymLinks set to true returns the attributes of the symlink if it is one, rather than resolving it
+ /// we pass by default ENOENT in the optional 'suppress_error' parameter to not spam the log with
+ /// warnings when the file or directory does not exist
+ /// @returns 0 on failure and a st_mode value with either S_IFDIR or S_IFREG set otherwise
+ /// together with the three access bits which under Windows only the write bit is relevant.
+
+ /// check if filename is an existing directory
+ static bool isdir(const std::string& filename);
+ ///< @returns true if the path is for an existing directory
+
+ /// check if filename is an existing file
+ static bool isfile(const std::string& filename);
+ ///< @returns true if the path is for an existing file
+
+ /// check if filename is a symlink
+ static bool islink(const std::string& filename);
+ ///< @returns true if the path is pointing at a symlink
+
+ /// return a path to the temporary directory on the system
static const char * tmpdir();
};
diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp
index 662a2511cd..ada6b9519e 100644
--- a/indra/llcommon/llleap.cpp
+++ b/indra/llcommon/llleap.cpp
@@ -188,6 +188,17 @@ public:
<< childout.peek(0, peeklen) << "..." << LL_ENDL;
}
+ // Handle any remaining stderr data (partial lines) the same way as we do
+ // for stdout: log it.
+ LLProcess::ReadPipe& childerr(mChild->getReadPipe(LLProcess::STDERR));
+ if (childerr.size())
+ {
+ LLProcess::ReadPipe::size_type
+ peeklen((std::min)(LLProcess::ReadPipe::size_type(50), childerr.size()));
+ LL_WARNS("LLLeap") << "Final stderr " << childerr.size() << " bytes: "
+ << childerr.peek(0, peeklen) << "..." << LL_ENDL;
+ }
+
// Kill this instance. MUST BE LAST before return!
delete this;
return false;
diff --git a/indra/llcommon/llmd5.cpp b/indra/llcommon/llmd5.cpp
index e999b8f597..c8ca586e7f 100644
--- a/indra/llcommon/llmd5.cpp
+++ b/indra/llcommon/llmd5.cpp
@@ -255,6 +255,11 @@ void LLMD5::raw_digest(unsigned char* s) const
memcpy(s, digest, 16); /* Flawfinder: ignore */
}
+#if LL_DARWIN
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
void LLMD5::hex_digest(char* s) const
{
if (!finalized)
@@ -273,6 +278,10 @@ void LLMD5::hex_digest(char* s) const
s[32] = '\0';
}
+#if LL_DARWIN
+#pragma clang diagnostic pop
+#endif
+
std::ostream& operator<<(std::ostream& stream, const LLMD5& context)
{
char s[33]; /* Flawfinder: ignore */
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index d5802b9d95..c06ae93766 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -235,8 +235,6 @@ inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed wi
LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
#if defined(LL_WINDOWS)
void* ret = _aligned_malloc(size, 32);
-#elif defined(LL_DARWIN)
- void* ret = ll_aligned_malloc_fallback( size, 32 );
#else
void *ret;
if (0 != posix_memalign(&ret, 32, size))
@@ -252,8 +250,31 @@ inline void ll_aligned_free_32(void *p)
LL_PROFILE_FREE(p);
#if defined(LL_WINDOWS)
_aligned_free(p);
-#elif defined(LL_DARWIN)
- ll_aligned_free_fallback( p );
+#else
+ free(p); // posix_memalign() is compatible with heap deallocator
+#endif
+}
+
+inline void* ll_aligned_malloc_64(size_t size) // returned hunk MUST be freed with ll_aligned_free_32().
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
+#if defined(LL_WINDOWS)
+ void* ret = _aligned_malloc(size, 64);
+#else
+ void *ret;
+ if (0 != posix_memalign(&ret, 64, size))
+ return nullptr;
+#endif
+ LL_PROFILE_ALLOC(ret, size);
+ return ret;
+}
+
+inline void ll_aligned_free_64(void *p)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
+ LL_PROFILE_FREE(p);
+#if defined(LL_WINDOWS)
+ _aligned_free(p);
#else
free(p); // posix_memalign() is compatible with heap deallocator
#endif
@@ -265,19 +286,23 @@ LL_FORCE_INLINE void* ll_aligned_malloc(size_t size)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
void* ret;
- if (LL_DEFAULT_HEAP_ALIGN % ALIGNMENT == 0)
+ if constexpr (LL_DEFAULT_HEAP_ALIGN % ALIGNMENT == 0)
{
ret = malloc(size);
LL_PROFILE_ALLOC(ret, size);
}
- else if (ALIGNMENT == 16)
+ else if constexpr (ALIGNMENT == 16)
{
ret = ll_aligned_malloc_16(size);
}
- else if (ALIGNMENT == 32)
+ else if constexpr (ALIGNMENT == 32)
{
ret = ll_aligned_malloc_32(size);
}
+ else if constexpr (ALIGNMENT == 64)
+ {
+ ret = ll_aligned_malloc_64(size);
+ }
else
{
ret = ll_aligned_malloc_fallback(size, ALIGNMENT);
@@ -289,16 +314,20 @@ template<size_t ALIGNMENT>
LL_FORCE_INLINE void ll_aligned_free(void* ptr)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
- if (ALIGNMENT == LL_DEFAULT_HEAP_ALIGN)
+ if constexpr (ALIGNMENT == LL_DEFAULT_HEAP_ALIGN)
{
LL_PROFILE_FREE(ptr);
free(ptr);
}
- else if (ALIGNMENT == 16)
+ else if constexpr (ALIGNMENT == 16)
{
ll_aligned_free_16(ptr);
}
- else if (ALIGNMENT == 32)
+ else if constexpr (ALIGNMENT == 32)
+ {
+ return ll_aligned_free_32(ptr);
+ }
+ else if constexpr (ALIGNMENT == 64)
{
return ll_aligned_free_32(ptr);
}
@@ -314,6 +343,9 @@ LL_FORCE_INLINE void ll_aligned_free(void* ptr)
inline void ll_memcpy_nonaliased_aligned_16(char* __restrict dst, const char* __restrict src, size_t bytes)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
+#if defined(LL_ARM64)
+ memcpy(dst, src, bytes);
+#else
assert(src != NULL);
assert(dst != NULL);
assert(bytes > 0);
@@ -379,6 +411,7 @@ inline void ll_memcpy_nonaliased_aligned_16(char* __restrict dst, const char* __
dst += 16;
src += 16;
}
+#endif
}
#ifndef __DEBUG_PRIVATE_MEM__
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index e9f07f6fdf..7e2d0b47f7 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -78,6 +78,23 @@
#endif
#endif
+// Set up CPU architecture defines
+#if LL_MSVC && defined(_M_ARM64)
+# define LL_ARM64 1
+#elif LL_GNUC && (defined(__arm64__) || defined(__aarch64__))
+# define LL_ARM64 1
+#elif LL_MSVC && _M_X64
+# define LL_X86_64 1
+# define LL_X86 1
+#elif LL_MSVC && _M_IX86
+# define LL_X86 1
+#elif LL_GNUC && ( defined(__amd64__) || defined(__x86_64__) )
+# define LL_X86_64 1
+# define LL_X86 1
+#elif LL_GNUC && ( defined(__i386__) )
+# define LL_X86 1
+#endif
+
// Deal with minor differences on Unixy OSes.
#if LL_DARWIN || LL_LINUX || __FreeBSD__
// Different name, same functionality.
@@ -120,11 +137,8 @@
#if LL_WINDOWS
#define LL_DLLEXPORT __declspec(dllexport)
#define LL_DLLIMPORT __declspec(dllimport)
-#elif LL_LINUX
-#define LL_DLLEXPORT __attribute__ ((visibility("default")))
-#define LL_DLLIMPORT
#else
-#define LL_DLLEXPORT
+#define LL_DLLEXPORT __attribute__ ((visibility("default")))
#define LL_DLLIMPORT
#endif // LL_WINDOWS
@@ -169,7 +183,7 @@
#define LL_TO_STRING_HELPER(x) #x
#define LL_TO_STRING(x) LL_TO_STRING_HELPER(x)
-#define LL_TO_WSTRING_HELPER(x) L#x
+#define LL_TO_WSTRING_HELPER(x) L## #x
#define LL_TO_WSTRING(x) LL_TO_WSTRING_HELPER(x)
#define LL_FILE_LINENO_MSG(msg) __FILE__ "(" LL_TO_STRING(__LINE__) ") : " msg
#define LL_GLUE_IMPL(x, y) x##y
@@ -189,4 +203,18 @@
#define LL_PRETTY_FUNCTION __PRETTY_FUNCTION__
#endif
+#ifndef _M_ARM64
+#if LL_ARM64
+#define GLM_FORCE_NEON 1
+#else
+#define GLM_FORCE_SSE2 1
+#endif
+#endif
+
+#if LL_ARM64
+#define KDU_NEON_INTRINSICS 1
+#else
+#define KDU_X86_INTRINSICS 1
+#endif
+
#endif // not LL_LINDEN_PREPROCESSOR_H
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 9b3cdf4df5..2b6e4be1c8 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -439,13 +439,21 @@ static F64 calculate_cpu_frequency(U32 measure_msecs)
//// completed now (serialization)
//__asm cpuid
int cpu_info[4] = {-1};
+#if _M_ARM64
+ std::fill(cpu_info, cpu_info + 4, 0);
+#else
__cpuid(cpu_info, 0);
+#endif
// We ask the high-res timer for the start time
QueryPerformanceCounter((LARGE_INTEGER *) &starttime);
// Then we get the current cpu clock and store it
+#if _M_ARM64
+ start = _ReadStatusReg(ARM64_PMCCNTR_EL0);
+#else
start = __rdtsc();
+#endif
// Now we wart for some msecs
_Delay(measure_msecs);
@@ -455,7 +463,11 @@ static F64 calculate_cpu_frequency(U32 measure_msecs)
QueryPerformanceCounter((LARGE_INTEGER *) &endtime);
// And also for the end cpu clock
+#if _M_ARM64
+ end = _ReadStatusReg(ARM64_PMCCNTR_EL0);
+#else
end = __rdtsc();
+#endif
// Now we can restore the default process and thread priorities
SetProcessAffinityMask(hProcess, dwProcessMask);
@@ -495,17 +507,21 @@ private:
// the other three array elements. The CPU identification string is
// not in linear order. The code below arranges the information
// in a human readable form.
+#if !_M_ARM64
int cpu_info[4] = {-1};
__cpuid(cpu_info, 0);
unsigned int ids = (unsigned int)cpu_info[0];
setConfig(eMaxID, (S32)ids);
+#endif
char cpu_vendor[0x20];
memset(cpu_vendor, 0, sizeof(cpu_vendor));
+#if !_M_ARM64
*((int*)cpu_vendor) = cpu_info[1];
*((int*)(cpu_vendor+4)) = cpu_info[3];
*((int*)(cpu_vendor+8)) = cpu_info[2];
setInfo(eVendor, cpu_vendor);
+#endif
std::string cmp_vendor(cpu_vendor);
bool is_amd = false;
if (cmp_vendor == "AuthenticAMD")
@@ -513,6 +529,20 @@ private:
is_amd = true;
}
+#if _M_ARM64
+ HKEY hKey;
+ DWORD gotType;
+ char inBuffer[48] = "";
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
+ {
+ if (!RegQueryValueExA(hKey, "ProcessorNameString", nullptr, &gotType, (PBYTE)(inBuffer), nullptr))
+ {
+ if ((gotType == REG_SZ) && strlen(inBuffer))
+ setInfo(eModel, inBuffer);
+ }
+ RegCloseKey(hKey);
+ }
+#else
// Get the information associated with each valid Id
for(unsigned int i=0; i<=ids; ++i)
{
@@ -623,6 +653,7 @@ private:
setConfig(eCacheSizeK, (cpu_info[2] >> 16) & 0xffff);
}
}
+#endif
}
};
@@ -638,7 +669,8 @@ public:
{
getCPUIDInfo();
uint64_t frequency = getSysctlInt64("hw.cpufrequency");
- if (!frequency) {
+ if (!frequency)
+ {
auto tbfrequency = getSysctlInt64("hw.tbfrequency");
struct clockinfo clockrate;
auto clockrate_len = sizeof(clockrate);
@@ -648,14 +680,14 @@ public:
setInfo(eFrequency, (F64)frequency / (F64)1000000);
}
- virtual ~LLProcessorInfoDarwinImpl() {}
+ virtual ~LLProcessorInfoDarwinImpl() = default;
private:
int getSysctlInt(const char* name)
{
int result = 0;
size_t len = sizeof(int);
- int error = sysctlbyname(name, (void*)&result, &len, NULL, 0);
+ int error = sysctlbyname(name, (void*)&result, &len, nullptr, 0);
return error == -1 ? 0 : result;
}
@@ -663,7 +695,7 @@ private:
{
uint64_t value = 0;
size_t size = sizeof(value);
- int result = sysctlbyname(name, (void*)&value, &size, NULL, 0);
+ int result = sysctlbyname(name, (void*)&value, &size, nullptr, 0);
if ( result == 0 )
{
if ( size == sizeof( uint64_t ) )
diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h
index f8ccf686c8..b955f7f55c 100644
--- a/indra/llcommon/llprocessor.h
+++ b/indra/llcommon/llprocessor.h
@@ -28,20 +28,7 @@
#ifndef LLPROCESSOR_H
#define LLPROCESSOR_H
#include "llunits.h"
-
-#if LL_MSVC && _M_X64
-# define LL_X86_64 1
-# define LL_X86 1
-#elif LL_MSVC && _M_IX86
-# define LL_X86 1
-#elif LL_GNUC && ( defined(__amd64__) || defined(__x86_64__) )
-# define LL_X86_64 1
-# define LL_X86 1
-#elif LL_GNUC && ( defined(__i386__) )
-# define LL_X86 1
-#elif LL_GNUC && ( defined(__powerpc__) || defined(__ppc__) )
-# define LL_PPC 1
-#endif
+#include "llpreprocessor.h"
class LLProcessorInfoImpl;
diff --git a/indra/llcommon/llprofiler.h b/indra/llcommon/llprofiler.h
index f6a4d24747..fa94f78019 100644
--- a/indra/llcommon/llprofiler.h
+++ b/indra/llcommon/llprofiler.h
@@ -71,26 +71,21 @@
#define LL_PROFILER_CONFIG_TRACY_FAST_TIMER 3 // Profiling on: Fast Timers + Tracy
#ifndef LL_PROFILER_CONFIGURATION
-#define LL_PROFILER_CONFIGURATION LL_PROFILER_CONFIG_FAST_TIMER
+#define LL_PROFILER_CONFIGURATION 1
#endif
-extern thread_local bool gProfilerEnabled;
-
#if defined(LL_PROFILER_CONFIGURATION) && (LL_PROFILER_CONFIGURATION > LL_PROFILER_CONFIG_NONE)
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY || LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY_FAST_TIMER
#include "tracy/Tracy.hpp"
- // Enable OpenGL profiling
- #define LL_PROFILER_ENABLE_TRACY_OPENGL 0
-
// Enable RenderDoc labeling
- #define LL_PROFILER_ENABLE_RENDER_DOC 0
+ //#define LL_PROFILER_ENABLE_RENDER_DOC 0
#endif
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY
#define LL_PROFILER_FRAME_END FrameMark
- #define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name ); gProfilerEnabled = true;
+ #define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name );
#define LL_RECORD_BLOCK_TIME(name) ZoneScoped // Want descriptive names; was: ZoneNamedN( ___tracy_scoped_zone, #name, true );
#define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, true );
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, true ) // RGB
@@ -133,7 +128,7 @@ extern thread_local bool gProfilerEnabled;
#endif
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY_FAST_TIMER
#define LL_PROFILER_FRAME_END FrameMark
- #define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name ); gProfilerEnabled = true;
+ #define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name );
#define LL_RECORD_BLOCK_TIME(name) ZoneNamedN(___tracy_scoped_zone, #name, true); const LLTrace::BlockTimer& LL_GLUE_TOKENS(block_time_recorder, __LINE__)(LLTrace::timeThisBlock(name)); (void)LL_GLUE_TOKENS(block_time_recorder, __LINE__);
#define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, #name, true );
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, true ) // RGB
@@ -155,26 +150,45 @@ extern thread_local bool gProfilerEnabled;
#else
#define LL_PROFILER_FRAME_END
#define LL_PROFILER_SET_THREAD_NAME( name ) (void)(name)
+
+ #define LL_PROFILER_FRAME_END
+ #define LL_PROFILER_SET_THREAD_NAME( name ) (void)(name)
+ #define LL_RECORD_BLOCK_TIME(name)
+ #define LL_PROFILE_ZONE_NAMED(name) // LL_PROFILE_ZONE_NAMED is a no-op when Tracy is disabled
+ #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) // LL_PROFILE_ZONE_NAMED_COLOR is a no-op when Tracy is disabled
+ #define LL_PROFILE_ZONE_SCOPED // LL_PROFILE_ZONE_SCOPED is a no-op when Tracy is disabled
+ #define LL_PROFILE_ZONE_COLOR(name,color) // LL_RECORD_BLOCK_TIME(name)
+
+ #define LL_PROFILE_ZONE_NUM( val ) (void)( val ); // Not supported
+ #define LL_PROFILE_ZONE_TEXT( text, size ) (void)( text ); void( size ); // Not supported
+
+ #define LL_PROFILE_ZONE_ERR(name) (void)(name); // Not supported
+ #define LL_PROFILE_ZONE_INFO(name) (void)(name); // Not supported
+ #define LL_PROFILE_ZONE_WARN(name) (void)(name); // Not supported
+
+ #define LL_PROFILE_MUTEX(type, varname) type varname
+ #define LL_PROFILE_MUTEX_NAMED(type, varname, desc) type varname
+ #define LL_PROFILE_MUTEX_SHARED(type, varname) type varname
+ #define LL_PROFILE_MUTEX_SHARED_NAMED(type, varname, desc) type varname
+ #define LL_PROFILE_MUTEX_LOCK(varname) // LL_PROFILE_MUTEX_LOCK is a no-op when Tracy is disabled
+
#endif // LL_PROFILER
#if LL_PROFILER_ENABLE_TRACY_OPENGL
-#define LL_PROFILE_GPU_ZONE(name) TracyGpuZone(name)
-#define LL_PROFILE_GPU_ZONEC(name,color) TracyGpuZoneC(name,color)
+#define LL_PROFILE_GPU_ZONE(name) TracyGpuZone(name)
+#define LL_PROFILE_GPU_ZONEC(name,color) TracyGpuZoneC(name,color)
#define LL_PROFILER_GPU_COLLECT TracyGpuCollect
#define LL_PROFILER_GPU_CONTEXT TracyGpuContext
-
-// disable memory tracking (incompatible with GPU tracing
-#define LL_PROFILE_ALLOC(ptr, size) (void)(ptr); (void)(size);
-#define LL_PROFILE_FREE(ptr) (void)(ptr);
+#define LL_PROFILER_GPU_CONTEXT_NAMED TracyGpuContextName
#else
-#define LL_PROFILE_GPU_ZONE(name) (void)name;
-#define LL_PROFILE_GPU_ZONEC(name,color) (void)name;(void)color;
+#define LL_PROFILE_GPU_ZONE(name) (void)name;
+#define LL_PROFILE_GPU_ZONEC(name,color) (void)name;(void)color;
#define LL_PROFILER_GPU_COLLECT
#define LL_PROFILER_GPU_CONTEXT
+#define LL_PROFILER_GPU_CONTEXT_NAMED(name) (void)name;
+#endif // LL_PROFILER_ENABLE_TRACY_OPENGL
-#define LL_LABEL_OBJECT_GL(type, name, length, label)
-
-#if !LL_DARWIN && LL_PROFILER_CONFIGURATION > 1
+#if LL_PROFILER_CONFIGURATION >= LL_PROFILER_CONFIG_TRACY
#define LL_PROFILE_ALLOC(ptr, size) TracyAlloc(ptr, size)
#define LL_PROFILE_FREE(ptr) TracyFree(ptr)
#else
@@ -182,8 +196,6 @@ extern thread_local bool gProfilerEnabled;
#define LL_PROFILE_FREE(ptr) (void)(ptr);
#endif
-#endif
-
#if LL_PROFILER_ENABLE_RENDER_DOC
#define LL_LABEL_OBJECT_GL(type, name, length, label) glObjectLabel(type, name, length, label)
#else
diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp
index 0196a24b18..efeeb1340e 100644
--- a/indra/llcommon/llqueuedthread.cpp
+++ b/indra/llcommon/llqueuedthread.cpp
@@ -80,7 +80,7 @@ void LLQueuedThread::shutdown()
mRequestQueue.close();
}
- S32 timeout = 100;
+ S32 timeout = 50;
for ( ; timeout>0; timeout--)
{
if (isStopped())
@@ -101,19 +101,34 @@ void LLQueuedThread::shutdown()
}
QueuedRequest* req;
- S32 active_count = 0;
+ S32 queued_count = 0;
+ bool has_active = false;
+ lockData();
while ( (req = (QueuedRequest*)mRequestHash.pop_element()) )
{
- if (req->getStatus() == STATUS_QUEUED || req->getStatus() == STATUS_INPROGRESS)
+ if (req->getStatus() == STATUS_INPROGRESS)
+ {
+ has_active = true;
+ req->setFlags(FLAG_ABORT | FLAG_AUTO_COMPLETE);
+ continue;
+ }
+ if (req->getStatus() == STATUS_QUEUED)
{
- ++active_count;
+ ++queued_count;
req->setStatus(STATUS_ABORTED); // avoid assert in deleteRequest
}
req->deleteRequest();
}
- if (active_count)
+ unlockData();
+ if (queued_count)
+ {
+ LL_WARNS() << "~LLQueuedThread() called with unpocessed requests: " << queued_count << LL_ENDL;
+ }
+ if (has_active)
{
- LL_WARNS() << "~LLQueuedThread() called with active requests: " << active_count << LL_ENDL;
+ LL_WARNS() << "~LLQueuedThread() called with active requests!" << LL_ENDL;
+ ms_sleep(100); // last chance for request to finish
+ printQueueStats();
}
mRequestQueue.close();
@@ -570,7 +585,12 @@ LLQueuedThread::QueuedRequest::QueuedRequest(LLQueuedThread::handle_t handle, U3
LLQueuedThread::QueuedRequest::~QueuedRequest()
{
- llassert_always(mStatus == STATUS_DELETE);
+ if (mStatus != STATUS_DELETE)
+ {
+ // The only method to delete a request is deleteRequest(),
+ // it should have set the status to STATUS_DELETE
+ LL_ERRS() << "LLQueuedThread::QueuedRequest deleted with status " << mStatus << LL_ENDL;
+ }
}
//virtual
diff --git a/indra/llcommon/llsdjson.cpp b/indra/llcommon/llsdjson.cpp
index 655869a704..a4b45ed80d 100644
--- a/indra/llcommon/llsdjson.cpp
+++ b/indra/llcommon/llsdjson.cpp
@@ -35,7 +35,11 @@
#include "llerror.h"
#include "../llmath/llmath.h"
+#if LL_WINDOWS
+#include <boost/json.hpp>
+#else
#include <boost/json/src.hpp>
+#endif
//=========================================================================
LLSD LlsdFromJson(const boost::json::value& val)
diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h
index 38bbe19ddd..497c0ad3eb 100644
--- a/indra/llcommon/llsdutil.h
+++ b/indra/llcommon/llsdutil.h
@@ -553,6 +553,100 @@ LLSD shallow(LLSD value, LLSD filter=LLSD()) { return llsd_shallow(value, filter
} // namespace llsd
+/*****************************************************************************
+* LLSDParam<std::vector<T>>
+*****************************************************************************/
+// Given an LLSD array, return a const std::vector<T>&, where T is a type
+// supported by LLSDParam. Bonus: if the LLSD value is actually a scalar,
+// return a single-element vector containing the converted value.
+template <typename T>
+class LLSDParam<std::vector<T>>: public LLSDParamBase
+{
+public:
+ LLSDParam(const LLSD& array)
+ {
+ // treat undefined "array" as empty vector
+ if (array.isDefined())
+ {
+ // what if it's a scalar?
+ if (! array.isArray())
+ {
+ v.push_back(LLSDParam<T>(array));
+ }
+ else // really is an array
+ {
+ // reserve space for the array entries
+ v.reserve(array.size());
+ for (const auto& item : llsd::inArray(array))
+ {
+ v.push_back(LLSDParam<T>(item));
+ }
+ }
+ }
+ }
+
+ operator const std::vector<T>&() const { return v; }
+
+private:
+ std::vector<T> v;
+};
+
+
+/*****************************************************************************
+ * toArray(), toMap()
+ *****************************************************************************/
+namespace llsd
+{
+
+// For some T convertible to LLSD, given std::vector<T> myVec,
+// toArray(myVec) returns an LLSD array whose entries correspond to the
+// items in myVec.
+// For some U convertible to LLSD, given function U xform(const T&),
+// toArray(myVec, xform) returns an LLSD array whose every entry is
+// xform(item) of the corresponding item in myVec.
+// toArray() actually works with any container<C> usable with range
+// 'for', not just std::vector.
+// (Once we get C++20 we can use std::identity instead of this default lambda.)
+template<typename C, typename FUNC>
+LLSD toArray(const C& container, FUNC&& func = [](const auto& arg) { return arg; })
+{
+ LLSD array;
+ for (const auto& item : container)
+ {
+ array.append(std::forward<FUNC>(func)(item));
+ }
+ return array;
+}
+
+// For some T convertible to LLSD, given std::map<std::string, T> myMap,
+// toMap(myMap) returns an LLSD map whose entries correspond to the
+// (key, value) pairs in myMap.
+// For some U convertible to LLSD, given function
+// std::pair<std::string, U> xform(const std::pair<std::string, T>&),
+// toMap(myMap, xform) returns an LLSD map whose every entry is
+// xform(pair) of the corresponding (key, value) pair in myMap.
+// toMap() actually works with any container usable with range 'for', not
+// just std::map. It need not even be an associative container, as long as
+// you pass an xform function that returns std::pair<std::string, U>.
+// (Once we get C++20 we can use std::identity instead of this default lambda.)
+template<typename C, typename FUNC>
+LLSD toMap(const C& container, FUNC&& func = [](const auto& arg) { return arg; })
+{
+ LLSD map;
+ for (const auto& pair : container)
+ {
+ const auto& [key, value] = std::forward<FUNC>(func)(pair);
+ map[key] = value;
+ }
+ return map;
+}
+
+} // namespace llsd
+
+/*****************************************************************************
+ * boost::hash<LLSD>
+ *****************************************************************************/
+
// Specialization for generating a hash value from an LLSD block.
namespace boost
{
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 07adf71d18..bb6d091a97 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -260,7 +260,7 @@ S32 utf16str_wstring_length(const llutf16string &utf16str, const S32 utf16_len)
{
S32 surrogate_pairs = 0;
// ... craziness to make gcc happy (llutf16string.c_str() is tweaked on linux):
- const U16 *const utf16_chars = &(*(utf16str.begin()));
+ const auto *const utf16_chars = &(*(utf16str.begin()));
S32 i = 0;
while (i < utf16_len)
{
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 7a8edc176d..2e579a4d2d 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -635,7 +635,11 @@ LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw);
//
// This typedef may or may not be identical to std::wstring, depending on
// LL_WCHAR_T_NATIVE.
+#if __FreeBSD__
+typedef std::basic_string<char16_t> llutf16string;
+#else
typedef std::basic_string<U16> llutf16string;
+#endif
// Considering wchar_t, llwchar and U16, there are three relevant cases:
#if LLWCHAR_IS_WCHAR_T // every which way but Windows
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 5c35aeb476..edc891f5ec 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -197,6 +197,9 @@ LLOSInfo::LLOSInfo() :
GetSystemInfo(&si); //if it fails get regular system info
//(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load)
+#pragma warning(push)
+#pragma warning(disable : 4996) // ignore 'deprecated.' GetVersionEx is deprecated
+
// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
OSVERSIONINFOEX osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
@@ -215,6 +218,8 @@ LLOSInfo::LLOSInfo() :
}
}
+#pragma warning(pop)
+
S32 ubr = 0; // Windows 10 Update Build Revision, can be retrieved from a registry
if (mMajorVer == 10)
{
@@ -1332,7 +1337,7 @@ bool gunzip_file(const std::string& srcfile, const std::string& dstfile)
S32 bytes = 0;
tmpfile = dstfile + ".t";
#ifdef LL_WINDOWS
- llutf16string utf16filename = utf8str_to_utf16str(srcfile);
+ std::wstring utf16filename = ll_convert<std::wstring>(srcfile);
src = gzopen_w(utf16filename.c_str(), "rb");
#else
src = gzopen(srcfile.c_str(), "rb");
@@ -1352,10 +1357,6 @@ bool gunzip_file(const std::string& srcfile, const std::string& dstfile)
} while(gzeof(src) == 0);
fclose(dst);
dst = NULL;
-#if LL_WINDOWS
- // Rename in windows needs the dstfile to not exist.
- LLFile::remove(dstfile, ENOENT);
-#endif
if (LLFile::rename(tmpfile, dstfile) == -1) goto err; /* Flawfinder: ignore */
retval = true;
err:
@@ -1376,7 +1377,7 @@ bool gzip_file(const std::string& srcfile, const std::string& dstfile)
tmpfile = dstfile + ".t";
#ifdef LL_WINDOWS
- llutf16string utf16filename = utf8str_to_utf16str(tmpfile);
+ std::wstring utf16filename = ll_convert<std::wstring>(tmpfile);
dst = gzopen_w(utf16filename.c_str(), "wb");
#else
dst = gzopen(tmpfile.c_str(), "wb");
@@ -1403,10 +1404,6 @@ bool gzip_file(const std::string& srcfile, const std::string& dstfile)
gzclose(dst);
dst = NULL;
-#if LL_WINDOWS
- // Rename in windows needs the dstfile to not exist.
- LLFile::remove(dstfile);
-#endif
if (LLFile::rename(tmpfile, dstfile) == -1) goto err; /* Flawfinder: ignore */
retval = true;
err:
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index e5d25b52f0..692941a892 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -28,6 +28,7 @@
#include "apr_portable.h"
+#include "llapp.h"
#include "llthread.h"
#include "llmutex.h"
@@ -35,6 +36,7 @@
#include "lltrace.h"
#include "lltracethreadrecorder.h"
#include "llexception.h"
+#include "workqueue.h"
#if LL_LINUX
#include <sched.h>
@@ -106,6 +108,27 @@ namespace
return s_thread_id;
}
+#if LL_WINDOWS
+
+ static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
+
+ U32 exception_filter(U32 code, struct _EXCEPTION_POINTERS* exception_infop)
+ {
+ if (LLApp::instance()->reportCrashToBugsplat((void*)exception_infop))
+ {
+ // Handled
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ else if (code == STATUS_MSC_EXCEPTION)
+ {
+ // C++ exception, go on
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+
+ // handle it, convert to std::exception
+ return EXCEPTION_EXECUTE_HANDLER;
+ }
+#endif // LL_WINDOWS
} // anonymous namespace
LL_COMMON_API bool on_main_thread()
@@ -157,20 +180,11 @@ void LLThread::threadRun()
// Run the user supplied function
do
{
- try
- {
- run();
- }
- catch (const LLContinueError &e)
- {
- LL_WARNS("THREAD") << "ContinueException on thread '" << mName <<
- "' reentering run(). Error what is: '" << e.what() << "'" << LL_ENDL;
- //output possible call stacks to log file.
- LLError::LLCallStacks::print();
-
- LOG_UNHANDLED_EXCEPTION("LLThread");
- continue;
- }
+#ifdef LL_WINDOWS
+ sehHandle(); // Structured Exception Handling
+#else
+ tryRun();
+#endif
break;
} while (true);
@@ -188,6 +202,69 @@ void LLThread::threadRun()
mStatus = STOPPED;
}
+void LLThread::tryRun()
+{
+ try
+ {
+ run();
+ }
+ catch (const LLContinueError& e)
+ {
+ LL_WARNS("THREAD") << "ContinueException on thread '" << mName <<
+ "'. Error what is: '" << e.what() << "'" << LL_ENDL;
+ LLError::LLCallStacks::print();
+
+ LOG_UNHANDLED_EXCEPTION("LLThread");
+ }
+ catch (std::bad_alloc&)
+ {
+ // Todo: improve this, this is going to have a different callstack
+ // instead of showing where it crashed
+ LL_WARNS("THREAD") << "Out of memory in a thread: " << mName << LL_ENDL;
+
+ LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop");
+ main_queue->post(
+ // Bind the current exception, rethrow it in main loop.
+ []() {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS("THREAD") << "Out of memory in a thread" << LL_ENDL;
+ });
+ }
+#ifndef LL_WINDOWS
+ catch (...)
+ {
+ // Stash any other kind of uncaught exception to be rethrown by main thread.
+ LL_WARNS("THREAD") << "Capturing and rethrowing uncaught exception in LLThread "
+ << mName << LL_ENDL;
+
+ LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop");
+ main_queue->post(
+ // Bind the current exception, rethrow it in main loop.
+ [exc = std::current_exception()]() { std::rethrow_exception(exc); });
+ }
+#endif // else LL_WINDOWS
+}
+
+#ifdef LL_WINDOWS
+void LLThread::sehHandle()
+{
+ __try
+ {
+ // handle stop and continue exceptions first
+ tryRun();
+ }
+ __except (exception_filter(GetExceptionCode(), GetExceptionInformation()))
+ {
+ // convert to C++ styled exception
+ // Note: it might be better to use _se_set_translator
+ // if you want exception to inherit full callstack
+ char integer_string[512];
+ sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());
+ throw std::exception(integer_string);
+ }
+}
+#endif
+
LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
mPaused(false),
mName(name),
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index 4194e0014d..8794ac93aa 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -68,7 +68,7 @@ public:
// Called from MAIN THREAD.
void pause();
void unpause();
- bool isPaused() { return isStopped() || mPaused; }
+ bool isPaused() const { return isStopped() || mPaused; }
// Cause the thread to wake up and check its condition
void wake();
@@ -97,6 +97,11 @@ private:
// static function passed to APR thread creation routine
void threadRun();
+ void tryRun();
+
+#ifdef LL_WINDOWS
+ void sehHandle();
+#endif
protected:
std::string mName;
diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h
index 85fcbbacac..6532439dd9 100644
--- a/indra/llcommon/llthreadsafequeue.h
+++ b/indra/llcommon/llthreadsafequeue.h
@@ -452,11 +452,9 @@ ElementT LLThreadSafeQueue<ElementT, QueueT>::pop(void)
// so we can finish draining the queue.
pop_result popped = pop_(lock1, value);
if (popped == POPPED)
-#if LL_LINUX
return value;
-#else
- return std::move(value);
-#endif
+ // don't use std::move when returning local value because
+ // it prevents the compiler from optimizing with copy elision
// Once the queue is DONE, there will never be any more coming.
if (popped == DONE)
diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp
index 6d7cf473f5..3fbc45baaf 100644
--- a/indra/llcommon/lluuid.cpp
+++ b/indra/llcommon/lluuid.cpp
@@ -174,14 +174,6 @@ void LLUUID::toString(std::string& out) const
(U8)(mData[15]));
}
-// *TODO: deprecate
-void LLUUID::toString(char* out) const
-{
- std::string buffer;
- toString(buffer);
- strcpy(out, buffer.c_str()); /* Flawfinder: ignore */
-}
-
void LLUUID::toCompressedString(std::string& out) const
{
char bytes[UUID_BYTES + 1];
@@ -190,13 +182,6 @@ void LLUUID::toCompressedString(std::string& out) const
out.assign(bytes, UUID_BYTES);
}
-// *TODO: deprecate
-void LLUUID::toCompressedString(char* out) const
-{
- memcpy(out, mData, UUID_BYTES); /* Flawfinder: ignore */
- out[UUID_BYTES] = '\0';
-}
-
std::string LLUUID::getString() const
{
return asString();
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index bd4edc7993..ca1cf03c4d 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -103,9 +103,7 @@ public:
friend LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLUUID &uuid);
friend LL_COMMON_API std::istream& operator>>(std::istream& s, LLUUID &uuid);
- void toString(char *out) const; // Does not allocate memory, needs 36 characters (including \0)
void toString(std::string& out) const;
- void toCompressedString(char *out) const; // Does not allocate memory, needs 17 characters (including \0)
void toCompressedString(std::string& out) const;
std::string asString() const;
diff --git a/indra/llcommon/llwin32headers.h b/indra/llcommon/llwin32headers.h
index df433deb7a..32139821d5 100644
--- a/indra/llcommon/llwin32headers.h
+++ b/indra/llcommon/llwin32headers.h
@@ -29,6 +29,7 @@
#ifdef LL_WINDOWS
#include <windows.h> // Does not include winsock.h because WIN32_LEAN_AND_MEAN is defined
+#include <ws2tcpip.h>
#include <winsock2.h> // Requires windows.h
#endif
diff --git a/indra/llcommon/stdtypes.h b/indra/llcommon/stdtypes.h
index b40a718593..78d5e50e4b 100644
--- a/indra/llcommon/stdtypes.h
+++ b/indra/llcommon/stdtypes.h
@@ -169,14 +169,14 @@ private:
FROM mValue;
public:
- narrow(FROM value): mValue(value) {}
+ constexpr narrow(FROM value): mValue(value) {}
/*---------------------- Narrowing unsigned to signed ----------------------*/
template <typename TO,
typename std::enable_if<std::is_unsigned<FROM>::value &&
std::is_signed<TO>::value,
bool>::type = true>
- inline
+ constexpr
operator TO() const
{
// The reason we skip the
@@ -194,7 +194,7 @@ public:
typename std::enable_if<! (std::is_unsigned<FROM>::value &&
std::is_signed<TO>::value),
bool>::type = true>
- inline
+ constexpr
operator TO() const
{
// two different assert()s so we can tell which condition failed
diff --git a/indra/llcommon/tests/llprocess_test.cpp b/indra/llcommon/tests/llprocess_test.cpp
index b63cc52bec..13422612d6 100644
--- a/indra/llcommon/tests/llprocess_test.cpp
+++ b/indra/llcommon/tests/llprocess_test.cpp
@@ -54,14 +54,29 @@ std::string apr_strerror_helper(apr_status_t rv)
*****************************************************************************/
#define ensure_equals_(left, right) \
- ensure_equals(STRINGIZE(#left << " != " << #right), (left), (right))
+do { \
+ auto _left_val = (left); \
+ auto _right_val = (right); \
+ if (_left_val != _right_val) { \
+ std::string _msg = std::string(#left) + " != " + std::string(#right); \
+ tut::ensure_equals(_msg, _left_val, _right_val); \
+ } else { \
+ tut::ensure_equals("", _left_val, _right_val); \
+ } \
+} while(0)
#define aprchk(expr) aprchk_(#expr, (expr))
static void aprchk_(const char* call, apr_status_t rv, apr_status_t expected=APR_SUCCESS)
{
- tut::ensure_equals(STRINGIZE(call << " => " << rv << ": " << apr_strerror_helper
- (rv)),
- rv, expected);
+ if (rv != expected)
+ {
+ std::string msg = std::string(call) + " => " + std::to_string(rv) + ": " + apr_strerror_helper(rv);
+ tut::ensure_equals(msg, rv, expected);
+ }
+ else
+ {
+ tut::ensure_equals("", rv, expected);
+ }
}
/**
@@ -78,11 +93,14 @@ static std::string readfile(const std::string& pathname, const std::string& desc
std::string use_desc(desc);
if (use_desc.empty())
{
- use_desc = STRINGIZE("in " << pathname);
+ use_desc = "in " + pathname;
}
std::ifstream inf(pathname.c_str());
std::string output;
- tut::ensure(STRINGIZE("No output " << use_desc), bool(std::getline(inf, output)));
+ if (!std::getline(inf, output))
+ {
+ tut::ensure("No output " + use_desc, false);
+ }
std::string more;
while (std::getline(inf, more))
{
@@ -108,8 +126,8 @@ void waitfor(LLProcess& proc, int timeout=60)
{
yield();
}
- tut::ensure(STRINGIZE("process took longer than " << timeout << " seconds to terminate"),
- i < timeout);
+ std::string msg = "process took longer than " + std::to_string(timeout) + " seconds to terminate";
+ tut::ensure(msg, i < timeout);
}
void waitfor(LLProcess::handle h, const std::string& desc, int timeout=60)
@@ -119,8 +137,8 @@ void waitfor(LLProcess::handle h, const std::string& desc, int timeout=60)
{
yield();
}
- tut::ensure(STRINGIZE("process took longer than " << timeout << " seconds to terminate"),
- i < timeout);
+ std::string msg = "process took longer than " + std::to_string(timeout) + " seconds to terminate";
+ tut::ensure(msg, i < timeout);
}
/**
@@ -153,7 +171,8 @@ struct PythonProcessLauncher
try
{
mPy = LLProcess::create(mParams);
- tut::ensure(STRINGIZE("Couldn't launch " << mDesc << " script"), bool(mPy));
+ std::string msg = "Couldn't launch " + mDesc + " script";
+ tut::ensure(msg, bool(mPy));
}
catch (const tut::failure&)
{
@@ -214,7 +233,8 @@ struct PythonProcessLauncher
mParams.args.add(out.getName());
run();
// assuming the script wrote to that file, read it
- return readfile(out.getName(), STRINGIZE("from " << mDesc << " script"));
+ std::string desc = "from " + mDesc + " script";
+ return readfile(out.getName(), desc);
}
LLProcess::Params mParams;
diff --git a/indra/llcommon/tests/stringize_test.cpp b/indra/llcommon/tests/stringize_test.cpp
index a3ce7f8e3d..3f99041592 100644
--- a/indra/llcommon/tests/stringize_test.cpp
+++ b/indra/llcommon/tests/stringize_test.cpp
@@ -110,6 +110,17 @@ namespace tut
void stringize_object::test<3>()
{
//Tests rely on validity of wstring_to_utf8str()
+#if LL_WINDOWS // Windows wstring is a 2byte UTF16 type
+ ensure_equals(ll_convert<std::string>(wstringize(c)), ll_convert<std::string>(std::wstring(L"c")));
+ ensure_equals(ll_convert<std::string>(wstringize(s)), ll_convert<std::string>(std::wstring(L"17")));
+ ensure_equals(ll_convert<std::string>(wstringize(i)), ll_convert<std::string>(std::wstring(L"34")));
+ ensure_equals(ll_convert<std::string>(wstringize(l)), ll_convert<std::string>(std::wstring(L"68")));
+ ensure_equals(ll_convert<std::string>(wstringize(f)), ll_convert<std::string>(std::wstring(L"3.14159")));
+ ensure_equals(ll_convert<std::string>(wstringize(d)), ll_convert<std::string>(std::wstring(L"3.14159")));
+ ensure_equals(ll_convert<std::string>(wstringize(abc)), ll_convert<std::string>(std::wstring(L"abc def")));
+ ensure_equals(ll_convert<std::string>(wstringize(abc)), ll_convert<std::string>(wstringize(abc.c_str())));
+ ensure_equals(ll_convert<std::string>(wstringize(def)), ll_convert<std::string>(std::wstring(L"def ghi")));
+#else
ensure_equals(wstring_to_utf8str(wstringize(c)), wstring_to_utf8str(L"c"));
ensure_equals(wstring_to_utf8str(wstringize(s)), wstring_to_utf8str(L"17"));
ensure_equals(wstring_to_utf8str(wstringize(i)), wstring_to_utf8str(L"34"));
@@ -119,6 +130,7 @@ namespace tut
ensure_equals(wstring_to_utf8str(wstringize(abc)), wstring_to_utf8str(L"abc def"));
ensure_equals(wstring_to_utf8str(wstringize(abc)), wstring_to_utf8str(wstringize(abc.c_str())));
ensure_equals(wstring_to_utf8str(wstringize(def)), wstring_to_utf8str(L"def ghi"));
+#endif
// ensure_equals(wstring_to_utf8str(wstringize(llsd)), wstring_to_utf8str(L"{'abc':'abc def','d':r3.14159,'i':i34}"));
}
} // namespace tut
diff --git a/indra/llcommon/threadpool.h b/indra/llcommon/threadpool.h
index 0eb1891754..ac4f415f3e 100644
--- a/indra/llcommon/threadpool.h
+++ b/indra/llcommon/threadpool.h
@@ -55,7 +55,7 @@ namespace LL
* ThreadPool listens for application shutdown messages on the "LLApp"
* LLEventPump. Call close() to shut down this ThreadPool early.
*/
- virtual void close();
+ void close();
std::string getName() const { return mName; }
size_t getWidth() const { return mThreads.size(); }
@@ -122,7 +122,7 @@ namespace LL
size_t threads=1,
size_t capacity=1024*1024,
bool auto_shutdown = true):
- ThreadPoolBase(name, threads, new queue_t(name, capacity), auto_shutdown)
+ ThreadPoolBase(name, threads, new queue_t(name, capacity, false), auto_shutdown)
{}
~ThreadPoolUsing() override {}
diff --git a/indra/llcommon/workqueue.cpp b/indra/llcommon/workqueue.cpp
index c8ece616b2..7efaebd569 100644
--- a/indra/llcommon/workqueue.cpp
+++ b/indra/llcommon/workqueue.cpp
@@ -21,6 +21,7 @@
#include "llcoros.h"
#include LLCOROS_MUTEX_HEADER
#include "llerror.h"
+#include "llevents.h"
#include "llexception.h"
#include "stringize.h"
@@ -30,11 +31,38 @@ using Lock = LLCoros::LockType;
/*****************************************************************************
* WorkQueueBase
*****************************************************************************/
-LL::WorkQueueBase::WorkQueueBase(const std::string& name):
- super(makeName(name))
+LL::WorkQueueBase::WorkQueueBase(const std::string& name, bool auto_shutdown)
+ : super(makeName(name))
{
- // TODO: register for "LLApp" events so we can implicitly close() on
- // viewer shutdown.
+ if (auto_shutdown)
+ {
+ // Register for "LLApp" events so we can implicitly close() on viewer shutdown
+ std::string listener_name = "WorkQueue:" + getKey();
+ LLEventPumps::instance().obtain("LLApp").listen(
+ listener_name,
+ [this](const LLSD& stat)
+ {
+ std::string status(stat["status"]);
+ if (status != "running")
+ {
+ // Viewer is shutting down, close this queue
+ LL_DEBUGS("WorkQueue") << getKey() << " closing on app shutdown" << LL_ENDL;
+ close();
+ }
+ return false;
+ });
+
+ // Store the listener name so we can unregister in the destructor
+ mListenerName = listener_name;
+ }
+}
+
+LL::WorkQueueBase::~WorkQueueBase()
+{
+ if (!mListenerName.empty() && !LLEventPumps::wasDeleted())
+ {
+ LLEventPumps::instance().obtain("LLApp").stopListening(mListenerName);
+ }
}
void LL::WorkQueueBase::runUntilClose()
@@ -182,14 +210,22 @@ void LL::WorkQueueBase::callWork(const Work& work)
}
catch (...)
{
- // Stash any other kind of uncaught exception to be rethrown by main thread.
- LL_WARNS("LLCoros") << "Capturing and rethrowing uncaught exception in WorkQueueBase "
- << getKey() << LL_ENDL;
-
- LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop");
- main_queue->post(
- // Bind the current exception, rethrow it in main loop.
- [exc = std::current_exception()]() { std::rethrow_exception(exc); });
+ if (getKey() != "mainloop")
+ {
+ // Stash any other kind of uncaught exception to be rethrown by main thread.
+ LL_WARNS("LLCoros") << "Capturing and rethrowing uncaught exception in WorkQueueBase "
+ << getKey() << LL_ENDL;
+
+ LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop");
+ main_queue->post(
+ // Bind the current exception, rethrow it in main loop.
+ [exc = std::current_exception()]() { std::rethrow_exception(exc); });
+ }
+ else
+ {
+ // let main loop crash
+ throw;
+ }
}
#endif // else LL_WINDOWS
}
@@ -212,8 +248,8 @@ void LL::WorkQueueBase::checkCoroutine(const std::string& method)
/*****************************************************************************
* WorkQueue
*****************************************************************************/
-LL::WorkQueue::WorkQueue(const std::string& name, size_t capacity):
- super(name),
+LL::WorkQueue::WorkQueue(const std::string& name, size_t capacity, bool auto_shutdown):
+ super(name, auto_shutdown),
mQueue(capacity)
{
}
@@ -261,8 +297,8 @@ bool LL::WorkQueue::tryPop_(Work& work)
/*****************************************************************************
* WorkSchedule
*****************************************************************************/
-LL::WorkSchedule::WorkSchedule(const std::string& name, size_t capacity):
- super(name),
+LL::WorkSchedule::WorkSchedule(const std::string& name, size_t capacity, bool auto_shutdown):
+ super(name, auto_shutdown),
mQueue(capacity)
{
}
diff --git a/indra/llcommon/workqueue.h b/indra/llcommon/workqueue.h
index 9d7bbfbf7a..735ad38a26 100644
--- a/indra/llcommon/workqueue.h
+++ b/indra/llcommon/workqueue.h
@@ -51,7 +51,9 @@ namespace LL
* You may omit the WorkQueueBase name, in which case a unique name is
* synthesized; for practical purposes that makes it anonymous.
*/
- WorkQueueBase(const std::string& name);
+ WorkQueueBase(const std::string& name, bool auto_shutdown);
+
+ virtual ~WorkQueueBase();
/**
* Since the point of WorkQueue is to pass work to some other worker
@@ -197,6 +199,9 @@ namespace LL
private:
virtual Work pop_() = 0;
virtual bool tryPop_(Work&) = 0;
+
+ // Name used for the LLApp event listener (empty if not registered)
+ std::string mListenerName;
};
/*****************************************************************************
@@ -212,7 +217,7 @@ namespace LL
* You may omit the WorkQueue name, in which case a unique name is
* synthesized; for practical purposes that makes it anonymous.
*/
- WorkQueue(const std::string& name = std::string(), size_t capacity=1024);
+ WorkQueue(const std::string& name = std::string(), size_t capacity=1024, bool auto_shutdown = true);
/**
* Since the point of WorkQueue is to pass work to some other worker
@@ -282,7 +287,7 @@ namespace LL
* You may omit the WorkSchedule name, in which case a unique name is
* synthesized; for practical purposes that makes it anonymous.
*/
- WorkSchedule(const std::string& name = std::string(), size_t capacity=1024);
+ WorkSchedule(const std::string& name = std::string(), size_t capacity=1024, bool auto_shutdown = true);
/**
* Since the point of WorkSchedule is to pass work to some other worker
diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp
index 6186e7a308..bde1aed910 100644
--- a/indra/llcorehttp/_httpoprequest.cpp
+++ b/indra/llcorehttp/_httpoprequest.cpp
@@ -513,7 +513,9 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
check_curl_easy_setopt(mCurlHandle, CURLOPT_NOPROGRESS, 1);
check_curl_easy_setopt(mCurlHandle, CURLOPT_URL, mReqURL.c_str());
check_curl_easy_setopt(mCurlHandle, CURLOPT_PRIVATE, getHandle());
+#if LIBCURL_VERSION_MAJOR < 8
check_curl_easy_setopt(mCurlHandle, CURLOPT_ENCODING, "");
+#endif
check_curl_easy_setopt(mCurlHandle, CURLOPT_AUTOREFERER, 1);
check_curl_easy_setopt(mCurlHandle, CURLOPT_MAXREDIRS, HTTP_REDIRECTS_DEFAULT);
@@ -538,6 +540,7 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
long sslHostV(0L);
long dnsCacheTimeout(-1L);
long nobody(0L);
+ curl_off_t lastModified(0L);
if (mReqOptions)
{
@@ -546,6 +549,7 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
sslHostV = mReqOptions->getSSLVerifyHost() ? 2L : 0L;
dnsCacheTimeout = mReqOptions->getDNSCacheTimeout();
nobody = mReqOptions->getHeadersOnly() ? 1L : 0L;
+ lastModified = (curl_off_t)mReqOptions->getLastModified();
}
check_curl_easy_setopt(mCurlHandle, CURLOPT_FOLLOWLOCATION, follow_redirect);
@@ -554,6 +558,17 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
check_curl_easy_setopt(mCurlHandle, CURLOPT_NOBODY, nobody);
+ if (lastModified)
+ {
+ check_curl_easy_setopt(mCurlHandle, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
+#if (LIBCURL_VERSION_NUM >= 0x073B00)
+ // requires curl 7.59.0
+ check_curl_easy_setopt(mCurlHandle, CURLOPT_TIMEVALUE_LARGE, lastModified);
+#else
+ check_curl_easy_setopt(mCurlHandle, CURLOPT_TIMEVALUE, (long)lastModified);
+#endif
+ }
+
// The Linksys WRT54G V5 router has an issue with frequent
// DNS lookups from LAN machines. If they happen too often,
// like for every HTTP request, the router gets annoyed after
@@ -603,7 +618,9 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
case HOR_POST:
{
check_curl_easy_setopt(mCurlHandle, CURLOPT_POST, 1);
+#if LIBCURL_VERSION_MAJOR < 8
check_curl_easy_setopt(mCurlHandle, CURLOPT_ENCODING, "");
+#endif
long data_size(0);
if (mReqBody)
{
diff --git a/indra/llcorehttp/examples/http_texture_load.cpp b/indra/llcorehttp/examples/http_texture_load.cpp
index 72e0c29a24..986e675d00 100644
--- a/indra/llcorehttp/examples/http_texture_load.cpp
+++ b/indra/llcorehttp/examples/http_texture_load.cpp
@@ -52,8 +52,6 @@
void init_curl();
void term_curl();
-void ssl_thread_id_callback(CRYPTO_THREADID*);
-void ssl_locking_callback(int mode, int type, const char * file, int line);
void usage(std::ostream & out);
// Default command line settings
@@ -606,63 +604,15 @@ void WorkingSet::loadAssetUuids(FILE * in)
}
-int ssl_mutex_count(0);
-LLCoreInt::HttpMutex ** ssl_mutex_list = NULL;
-
void init_curl()
{
curl_global_init(CURL_GLOBAL_ALL);
-
- ssl_mutex_count = CRYPTO_num_locks();
- if (ssl_mutex_count > 0)
- {
- ssl_mutex_list = new LLCoreInt::HttpMutex * [ssl_mutex_count];
-
- for (int i(0); i < ssl_mutex_count; ++i)
- {
- ssl_mutex_list[i] = new LLCoreInt::HttpMutex;
- }
-
- CRYPTO_set_locking_callback(ssl_locking_callback);
- CRYPTO_THREADID_set_callback(ssl_thread_id_callback);
- }
}
void term_curl()
{
- CRYPTO_set_locking_callback(NULL);
- for (int i(0); i < ssl_mutex_count; ++i)
- {
- delete ssl_mutex_list[i];
- }
- delete [] ssl_mutex_list;
-}
-
-
-void ssl_thread_id_callback(CRYPTO_THREADID* pthreadid)
-{
-#if defined(WIN32)
- CRYPTO_THREADID_set_pointer(pthreadid, GetCurrentThread());
-#else
- CRYPTO_THREADID_set_pointer(pthreadid, pthread_self());
-#endif
-}
-
-
-void ssl_locking_callback(int mode, int type, const char * /* file */, int /* line */)
-{
- if (type >= 0 && type < ssl_mutex_count)
- {
- if (mode & CRYPTO_LOCK)
- {
- ssl_mutex_list[type]->lock();
- }
- else
- {
- ssl_mutex_list[type]->unlock();
- }
- }
+ curl_global_cleanup();
}
diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp
index 315ff15ebb..2b09653d8e 100644
--- a/indra/llcorehttp/httpcommon.cpp
+++ b/indra/llcorehttp/httpcommon.cpp
@@ -289,8 +289,10 @@ CURL *getCurlTemplateHandle()
check_curl_code(result, CURLOPT_NOSIGNAL);
result = curl_easy_setopt(curlpTemplateHandle, CURLOPT_NOPROGRESS, 1);
check_curl_code(result, CURLOPT_NOPROGRESS);
+#if LIBCURL_VERSION_MAJOR < 8
result = curl_easy_setopt(curlpTemplateHandle, CURLOPT_ENCODING, "");
check_curl_code(result, CURLOPT_ENCODING);
+#endif
result = curl_easy_setopt(curlpTemplateHandle, CURLOPT_AUTOREFERER, 1);
check_curl_code(result, CURLOPT_AUTOREFERER);
result = curl_easy_setopt(curlpTemplateHandle, CURLOPT_FOLLOWLOCATION, 1);
diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp
index d85f6039b1..5abd28e211 100644
--- a/indra/llcorehttp/httpoptions.cpp
+++ b/indra/llcorehttp/httpoptions.cpp
@@ -47,6 +47,7 @@ HttpOptions::HttpOptions() :
mVerifyPeer(sDefaultVerifyPeer),
mVerifyHost(false),
mDNSCacheTimeout(-1L),
+ mLastModified(0),
mNoBody(false)
{}
@@ -129,6 +130,11 @@ void HttpOptions::setHeadersOnly(bool nobody)
}
}
+void HttpOptions::setLastModified(time_t lastModified)
+{
+ mLastModified = lastModified;
+}
+
void HttpOptions::setDefaultSSLVerifyPeer(bool verify)
{
sDefaultVerifyPeer = verify;
diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h
index 56a28013cb..fdb277c66e 100644
--- a/indra/llcorehttp/httpoptions.h
+++ b/indra/llcorehttp/httpoptions.h
@@ -178,6 +178,13 @@ public:
return mNoBody;
}
+ // Default: 0
+ void setLastModified(time_t lastModified);
+ time_t getLastModified() const
+ {
+ return mLastModified;
+ }
+
/// Sets default behavior for verifying that the name in the
/// security certificate matches the name of the host contacted.
/// Defaults false if not set, but should be set according to
@@ -199,6 +206,7 @@ protected:
bool mVerifyHost;
int mDNSCacheTimeout;
bool mNoBody;
+ time_t mLastModified;
static bool sDefaultVerifyPeer;
}; // end class HttpOptions
diff --git a/indra/llcorehttp/llhttpconstants.cpp b/indra/llcorehttp/llhttpconstants.cpp
index 40d6c7506c..7a671543d9 100755
--- a/indra/llcorehttp/llhttpconstants.cpp
+++ b/indra/llcorehttp/llhttpconstants.cpp
@@ -100,6 +100,7 @@ const std::string HTTP_IN_HEADER_LOCATION("location");
const std::string HTTP_IN_HEADER_RETRY_AFTER("retry-after");
const std::string HTTP_IN_HEADER_SET_COOKIE("set-cookie");
const std::string HTTP_IN_HEADER_USER_AGENT("user-agent");
+const std::string HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS("x-content-type-options");
const std::string HTTP_IN_HEADER_X_FORWARDED_FOR("x-forwarded-for");
const std::string HTTP_CONTENT_LLSD_XML("application/llsd+xml");
@@ -122,6 +123,7 @@ const std::string HTTP_CONTENT_IMAGE_BMP("image/bmp");
const std::string HTTP_NO_CACHE("no-cache");
const std::string HTTP_NO_CACHE_CONTROL("no-cache, max-age=0");
+const std::string HTTP_NOSNIFF("nosniff");
const std::string HTTP_VERB_INVALID("(invalid)");
const std::string HTTP_VERB_HEAD("HEAD");
diff --git a/indra/llcorehttp/llhttpconstants.h b/indra/llcorehttp/llhttpconstants.h
index 583f9fbcb7..71c1dfa173 100755
--- a/indra/llcorehttp/llhttpconstants.h
+++ b/indra/llcorehttp/llhttpconstants.h
@@ -190,6 +190,7 @@ extern const std::string HTTP_IN_HEADER_LOCATION;
extern const std::string HTTP_IN_HEADER_RETRY_AFTER;
extern const std::string HTTP_IN_HEADER_SET_COOKIE;
extern const std::string HTTP_IN_HEADER_USER_AGENT;
+extern const std::string HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS;
extern const std::string HTTP_IN_HEADER_X_FORWARDED_FOR;
//// HTTP Content Types ////
@@ -215,5 +216,6 @@ extern const std::string HTTP_CONTENT_IMAGE_BMP;
//// HTTP Cache Settings ////
extern const std::string HTTP_NO_CACHE;
extern const std::string HTTP_NO_CACHE_CONTROL;
+extern const std::string HTTP_NOSNIFF;
#endif
diff --git a/indra/llcorehttp/tests/llcorehttp_test.cpp b/indra/llcorehttp/tests/llcorehttp_test.cpp
index c0cc2c8030..c7c50e6166 100755
--- a/indra/llcorehttp/tests/llcorehttp_test.cpp
+++ b/indra/llcorehttp/tests/llcorehttp_test.cpp
@@ -41,11 +41,7 @@
#include "test_httpstatus.hpp"
#include "test_refcounted.hpp"
#include "test_httpoperation.hpp"
-// As of 2019-06-28, test_httprequest.hpp consistently crashes on Mac Release
-// builds for reasons not yet diagnosed.
-#if ! (LL_DARWIN && LL_RELEASE)
#include "test_httprequest.hpp"
-#endif
#include "test_httpheaders.hpp"
#include "test_httprequestqueue.hpp"
#include "_httpservice.h"
@@ -53,9 +49,6 @@
#include "llproxy.h"
#include "llcleanup.h"
-void ssl_thread_id_callback(CRYPTO_THREADID*);
-void ssl_locking_callback(int mode, int type, const char * file, int line);
-
#if 0 // lltut provides main and runner
namespace tut
@@ -80,27 +73,10 @@ int main()
#endif // 0
-int ssl_mutex_count(0);
-LLCoreInt::HttpMutex ** ssl_mutex_list = NULL;
-
void init_curl()
{
curl_global_init(CURL_GLOBAL_ALL);
- ssl_mutex_count = CRYPTO_num_locks();
- if (ssl_mutex_count > 0)
- {
- ssl_mutex_list = new LLCoreInt::HttpMutex * [ssl_mutex_count];
-
- for (int i(0); i < ssl_mutex_count; ++i)
- {
- ssl_mutex_list[i] = new LLCoreInt::HttpMutex;
- }
-
- CRYPTO_set_locking_callback(ssl_locking_callback);
- CRYPTO_THREADID_set_callback(ssl_thread_id_callback);
- }
-
LLProxy::getInstance();
}
@@ -108,39 +84,6 @@ void init_curl()
void term_curl()
{
SUBSYSTEM_CLEANUP(LLProxy);
-
- CRYPTO_set_locking_callback(NULL);
- for (int i(0); i < ssl_mutex_count; ++i)
- {
- delete ssl_mutex_list[i];
- }
- delete [] ssl_mutex_list;
-}
-
-
-void ssl_thread_id_callback(CRYPTO_THREADID* pthreadid)
-{
-#if defined(WIN32)
- CRYPTO_THREADID_set_pointer(pthreadid, GetCurrentThread());
-#else
- CRYPTO_THREADID_set_pointer(pthreadid, pthread_self());
-#endif
-}
-
-
-void ssl_locking_callback(int mode, int type, const char * /* file */, int /* line */)
-{
- if (type >= 0 && type < ssl_mutex_count)
- {
- if (mode & CRYPTO_LOCK)
- {
- ssl_mutex_list[type]->lock();
- }
- else
- {
- ssl_mutex_list[type]->unlock();
- }
- }
}
diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp
index aed906bb8f..77ed8df066 100644
--- a/indra/llcorehttp/tests/test_httprequest.hpp
+++ b/indra/llcorehttp/tests/test_httprequest.hpp
@@ -454,6 +454,10 @@ void HttpRequestTestObjectType::test<4>()
template <> template <>
void HttpRequestTestObjectType::test<5>()
{
+#ifndef LL_WINDOWS
+ skip("Skip due to issues with testing pthread cancellation");
+#endif
+
ScopedCurlInit ready;
set_test_name("HttpRequest Spin (soft) + NoOp + hard termination");
@@ -517,6 +521,9 @@ void HttpRequestTestObjectType::test<5>()
template <> template <>
void HttpRequestTestObjectType::test<6>()
{
+#ifndef LL_WINDOWS
+ skip("Skip due to issues with testing pthread cancellation");
+#endif
ScopedCurlInit ready;
set_test_name("HttpRequest Spin + NoOp + hard termination");
@@ -2779,7 +2786,7 @@ void HttpRequestTestObjectType::test<22>()
for (int i(0); i < test_count; ++i)
{
char buffer[128];
- sprintf(buffer, "/bug2295/%d/", i);
+ snprintf(buffer, sizeof(buffer), "/bug2295/%d/", i);
HttpHandle handle = req->requestGetByteRange(HttpRequest::DEFAULT_POLICY_ID,
url_base + buffer,
0,
@@ -2810,7 +2817,7 @@ void HttpRequestTestObjectType::test<22>()
for (int i(0); i < test2_count; ++i)
{
char buffer[128];
- sprintf(buffer, "/bug2295/00000012/%d/", i);
+ snprintf(buffer, sizeof(buffer), "/bug2295/00000012/%d/", i);
HttpHandle handle = req->requestGetByteRange(HttpRequest::DEFAULT_POLICY_ID,
url_base + buffer,
0,
@@ -2841,7 +2848,7 @@ void HttpRequestTestObjectType::test<22>()
for (int i(0); i < test3_count; ++i)
{
char buffer[128];
- sprintf(buffer, "/bug2295/inv_cont_range/%d/", i);
+ snprintf(buffer, sizeof(buffer), "/bug2295/inv_cont_range/%d/", i);
HttpHandle handle = req->requestGetByteRange(HttpRequest::DEFAULT_POLICY_ID,
url_base + buffer,
0,
diff --git a/indra/llcorehttp/tests/test_refcounted.hpp b/indra/llcorehttp/tests/test_refcounted.hpp
index c0c8e78413..eb23a25545 100644
--- a/indra/llcorehttp/tests/test_refcounted.hpp
+++ b/indra/llcorehttp/tests/test_refcounted.hpp
@@ -28,8 +28,6 @@
#include "_refcounted.h"
-// disable all of this because it's hanging win64 builds?
-#if ! (LL_WINDOWS && ADDRESS_SIZE == 64)
using namespace LLCoreInt;
namespace tut
@@ -122,5 +120,4 @@ namespace tut
ensure(rc->getRefCount() == RefCounted::NOT_REF_COUNTED);
}
}
-#endif // disabling on Win64
#endif // TEST_LLCOREINT_REF_COUNTED_H_
diff --git a/indra/llcrashlogger/llcrashlock.cpp b/indra/llcrashlogger/llcrashlock.cpp
index ecd197b2c1..bc34f6798f 100644
--- a/indra/llcrashlogger/llcrashlock.cpp
+++ b/indra/llcrashlogger/llcrashlock.cpp
@@ -189,7 +189,7 @@ LLSD LLCrashLock::getProcessList()
bool LLCrashLock::fileExists(std::string filename)
{
#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
- boost::filesystem::path file_path(utf8str_to_utf16str(filename));
+ boost::filesystem::path file_path(ll_convert<std::wstring>(filename));
#else
boost::filesystem::path file_path(filename);
#endif
@@ -199,7 +199,7 @@ bool LLCrashLock::fileExists(std::string filename)
void LLCrashLock::cleanupProcess(std::string proc_dir)
{
#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
- boost::filesystem::path dir_path(utf8str_to_utf16str(proc_dir));
+ boost::filesystem::path dir_path(ll_convert<std::wstring>(proc_dir));
#else
boost::filesystem::path dir_path(proc_dir);
#endif
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index b1b698375a..d5c585b45e 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -576,10 +576,6 @@ bool LLCrashLogger::init()
std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log.old");
std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log");
-#if LL_WINDOWS
- LLAPRFile::remove(old_log_file);
-#endif
-
LLFile::rename(log_file.c_str(), old_log_file.c_str());
// Set the log file to crashreport.log
diff --git a/indra/llfilesystem/lldir.cpp b/indra/llfilesystem/lldir.cpp
index e8e5d6538b..33760d28ae 100644
--- a/indra/llfilesystem/lldir.cpp
+++ b/indra/llfilesystem/lldir.cpp
@@ -103,16 +103,17 @@ std::vector<std::string> LLDir::getFilesInDir(const std::string &dirname)
//Returns a vector of fullpath filenames.
#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
- boost::filesystem::path p(utf8str_to_utf16str(dirname));
+ boost::filesystem::path p(ll_convert<std::wstring>(dirname));
#else
boost::filesystem::path p(dirname);
#endif
std::vector<std::string> v;
- if (exists(p))
+ boost::system::error_code ec;
+ if (exists(p, ec) && !ec.failed())
{
- if (is_directory(p))
+ if (is_directory(p, ec) && !ec.failed())
{
boost::filesystem::directory_iterator end_iter;
for (boost::filesystem::directory_iterator dir_itr(p);
@@ -121,7 +122,11 @@ std::vector<std::string> LLDir::getFilesInDir(const std::string &dirname)
{
if (boost::filesystem::is_regular_file(dir_itr->status()))
{
+#if LL_WINDOWS
+ v.push_back(utf16str_to_utf8str(dir_itr->path().filename().wstring()));
+#else
v.push_back(dir_itr->path().filename().string());
+#endif
}
}
}
@@ -196,7 +201,7 @@ U32 LLDir::deleteDirAndContents(const std::string& dir_name)
try
{
#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
- boost::filesystem::path dir_path(utf8str_to_utf16str(dir_name));
+ boost::filesystem::path dir_path(ll_convert<std::wstring>(dir_name));
#else
boost::filesystem::path dir_path(dir_name);
#endif
diff --git a/indra/llfilesystem/lldir_mac.cpp b/indra/llfilesystem/lldir_mac.cpp
index b25c654e31..8b9bdd9853 100644
--- a/indra/llfilesystem/lldir_mac.cpp
+++ b/indra/llfilesystem/lldir_mac.cpp
@@ -149,7 +149,7 @@ LLDir_Mac::LLDir_Mac()
mWorkingDir = getCurPath();
- mLLPluginDir = mAppRODataDir + mDirDelimiter + "llplugin";
+ mLLPluginDir = mAppRODataDir + mDirDelimiter + "SLPlugin.app" + mDirDelimiter + "Contents" + mDirDelimiter + "Frameworks";
}
}
diff --git a/indra/llfilesystem/lldir_utils_objc.mm b/indra/llfilesystem/lldir_utils_objc.mm
index 01fe9e1f2c..35513d5647 100644
--- a/indra/llfilesystem/lldir_utils_objc.mm
+++ b/indra/llfilesystem/lldir_utils_objc.mm
@@ -1,28 +1,28 @@
-/**
+/**
* @file lldir_utils_objc.mm
* @brief Cocoa implementation of directory utilities for macOS
*
* $LicenseInfo:firstyear=2020&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2020, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
- */
+ */
#if LL_DARWIN
//WARNING: This file CANNOT use standard linden includes due to conflicts between definitions of BOOL
@@ -39,18 +39,18 @@ std::string getSystemTempFolder()
tempDir = @"/tmp";
result = std::string([tempDir UTF8String]);
}
-
+
return result;
}
-//findSystemDirectory scoped exclusively to this file.
+//findSystemDirectory scoped exclusively to this file.
std::string findSystemDirectory(NSSearchPathDirectory searchPathDirectory,
NSSearchPathDomainMask domainMask)
{
std::string result;
@autoreleasepool {
NSString *path = nil;
-
+
// Search for the path
NSArray* paths = NSSearchPathForDirectoriesInDomains(searchPathDirectory,
domainMask,
@@ -60,10 +60,10 @@ std::string findSystemDirectory(NSSearchPathDirectory searchPathDirectory,
path = [paths objectAtIndex:0];
//HACK: Always attempt to create directory, ignore errors.
NSError *error = nil;
-
+
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
-
-
+
+
result = std::string([path UTF8String]);
}
}
@@ -88,7 +88,7 @@ std::string getSystemResourceFolder()
NSString *bundlePath = [[NSBundle mainBundle] resourcePath];
result = std::string([bundlePath UTF8String]);
}
-
+
return result;
}
@@ -102,7 +102,7 @@ std::string getSystemApplicationSupportFolder()
{
return findSystemDirectory (NSApplicationSupportDirectory,
NSUserDomainMask);
-
+
}
#endif // LL_DARWIN
diff --git a/indra/llfilesystem/lldir_win32.cpp b/indra/llfilesystem/lldir_win32.cpp
index a607c70b44..58c080c982 100644
--- a/indra/llfilesystem/lldir_win32.cpp
+++ b/indra/llfilesystem/lldir_win32.cpp
@@ -172,7 +172,7 @@ LLDir_Win32::LLDir_Win32()
{
w_str[wcslen(w_str)-1] = '\0'; /* Flawfinder: ignore */ // remove trailing slash
}
- mTempDir = utf16str_to_utf8str(llutf16string(w_str));
+ mTempDir = ll_convert<std::string>(std::wstring(w_str));
if (mOSUserDir.empty())
{
@@ -225,14 +225,14 @@ LLDir_Win32::LLDir_Win32()
// Set working directory, for LLDir::getWorkingDir()
GetCurrentDirectory(MAX_PATH, w_str);
- mWorkingDir = utf16str_to_utf8str(llutf16string(w_str));
+ mWorkingDir = ll_convert<std::string>(std::wstring(w_str));
// Set the executable directory
S32 size = GetModuleFileName(NULL, w_str, MAX_PATH);
if (size)
{
w_str[size] = '\0';
- mExecutablePathAndName = utf16str_to_utf8str(llutf16string(w_str));
+ mExecutablePathAndName = ll_convert<std::string>(std::wstring(w_str));
auto path_end = mExecutablePathAndName.find_last_of('\\');
if (path_end != std::string::npos)
{
@@ -347,8 +347,8 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &
WIN32_FIND_DATA FileData;
- llutf16string pathname = utf8str_to_utf16str(dirname);
- pathname += utf8str_to_utf16str(mask);
+ std::wstring pathname = ll_convert<std::wstring>(dirname);
+ pathname += ll_convert<std::wstring>(mask);
if ((count_search_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)
{
@@ -370,7 +370,7 @@ std::string LLDir_Win32::getCurPath()
WCHAR w_str[MAX_PATH];
GetCurrentDirectory(MAX_PATH, w_str);
- return utf16str_to_utf8str(llutf16string(w_str));
+ return ll_convert<std::string>(std::wstring(w_str));
}
diff --git a/indra/llfilesystem/lldir_win32.h b/indra/llfilesystem/lldir_win32.h
index ab2726f1a0..21a3f1213b 100644
--- a/indra/llfilesystem/lldir_win32.h
+++ b/indra/llfilesystem/lldir_win32.h
@@ -51,7 +51,7 @@ public:
private:
void* mDirSearch_h{ nullptr };
- llutf16string mCurrentDir;
+ std::wstring mCurrentDir;
};
#endif // LL_LLDIR_WIN32_H
diff --git a/indra/llfilesystem/lldirguard.h b/indra/llfilesystem/lldirguard.h
index fcb179bbc8..c6ce13efb4 100644
--- a/indra/llfilesystem/lldirguard.h
+++ b/indra/llfilesystem/lldirguard.h
@@ -31,6 +31,9 @@
#include "llerror.h"
#if LL_WINDOWS
+
+#include "llwin32headers.h"
+
class LLDirectoryGuard
{
public:
@@ -46,8 +49,8 @@ public:
(wcsncmp(mOrigDir,mFinalDir,mOrigDirLen)!=0))
{
// Dir has changed
- std::string mOrigDirUtf8 = utf16str_to_utf8str(llutf16string(mOrigDir));
- std::string mFinalDirUtf8 = utf16str_to_utf8str(llutf16string(mFinalDir));
+ std::string mOrigDirUtf8 = ll_convert<std::string>(std::wstring(mOrigDir));
+ std::string mFinalDirUtf8 = ll_convert<std::string>(std::wstring(mFinalDir));
LL_INFOS() << "Resetting working dir from " << mFinalDirUtf8 << " to " << mOrigDirUtf8 << LL_ENDL;
SetCurrentDirectory(mOrigDir);
}
diff --git a/indra/llfilesystem/lldiriterator.cpp b/indra/llfilesystem/lldiriterator.cpp
index 61f768c512..a6eb4adf7f 100644
--- a/indra/llfilesystem/lldiriterator.cpp
+++ b/indra/llfilesystem/lldiriterator.cpp
@@ -52,7 +52,7 @@ LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
: mIsValid(false)
{
#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
- fs::path dir_path(utf8str_to_utf16str(dirname));
+ fs::path dir_path(ll_convert<std::wstring>(dirname));
#else
fs::path dir_path(dirname);
#endif
@@ -72,7 +72,11 @@ LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
if (!is_dir)
{
+#if LL_WINDOWS
+ LL_WARNS() << "Invalid path: \"" << utf16str_to_utf8str(dir_path.wstring()) << "\"" << LL_ENDL;
+#else
LL_WARNS() << "Invalid path: \"" << dir_path.string() << "\"" << LL_ENDL;
+#endif
return;
}
@@ -130,7 +134,11 @@ bool LLDirIterator::Impl::next(std::string &fname)
while (mIter != end_itr && !found)
{
boost::smatch match;
+#if LL_WINDOWS
+ std::string name = utf16str_to_utf8str(mIter->path().filename().wstring());
+#else
std::string name = mIter->path().filename().string();
+#endif
found = ll_regex_match(name, match, mFilterExp);
if (found)
{
diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp
index 49904911a9..82e9e18918 100644
--- a/indra/llfilesystem/lldiskcache.cpp
+++ b/indra/llfilesystem/lldiskcache.cpp
@@ -103,7 +103,7 @@ void LLDiskCache::purge()
std::vector<file_info_t> file_info;
#if LL_WINDOWS
- std::wstring cache_path(utf8str_to_utf16str(sCacheDir));
+ std::wstring cache_path(ll_convert<std::wstring>(sCacheDir));
#else
std::string cache_path(sCacheDir);
#endif
@@ -114,14 +114,22 @@ void LLDiskCache::purge()
{
if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())
{
+#if LL_WINDOWS
+ if (utf16str_to_utf8str((*iter).path().wstring()).find(CACHE_FILENAME_PREFIX) != std::string::npos)
+#else
if ((*iter).path().string().find(CACHE_FILENAME_PREFIX) != std::string::npos)
+#endif
{
uintmax_t file_size = boost::filesystem::file_size(*iter, ec);
if (ec.failed())
{
continue;
}
+#if LL_WINDOWS
+ const std::string file_path = utf16str_to_utf8str((*iter).path().wstring());
+#else
const std::string file_path = (*iter).path().string();
+#endif
const std::time_t file_time = boost::filesystem::last_write_time(*iter, ec);
if (ec.failed())
{
@@ -159,10 +167,16 @@ void LLDiskCache::purge()
}
if (should_remove)
{
+#if LL_WINDOWS
+ boost::filesystem::remove(utf8str_to_utf16str(entry.second.second), ec);
+#else
boost::filesystem::remove(entry.second.second, ec);
+#endif
if (ec.failed())
{
+#if !LL_WINDOWS
LL_WARNS() << "Failed to delete cache file " << entry.second.second << ": " << ec.message() << LL_ENDL;
+#endif
}
}
}
@@ -226,7 +240,7 @@ void LLDiskCache::clearCache()
*/
boost::system::error_code ec;
#if LL_WINDOWS
- std::wstring cache_path(utf8str_to_utf16str(sCacheDir));
+ std::wstring cache_path(ll_convert<std::wstring>(sCacheDir));
#else
std::string cache_path(sCacheDir);
#endif
@@ -237,12 +251,18 @@ void LLDiskCache::clearCache()
{
if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())
{
+#if LL_WINDOWS
+ if (utf16str_to_utf8str((*iter).path().wstring()).find(CACHE_FILENAME_PREFIX) != std::string::npos)
+#else
if ((*iter).path().string().find(CACHE_FILENAME_PREFIX) != std::string::npos)
+#endif
{
boost::filesystem::remove(*iter, ec);
if (ec.failed())
{
+#if !LL_WINDOWS
LL_WARNS() << "Failed to delete cache file " << *iter << ": " << ec.message() << LL_ENDL;
+#endif
}
}
}
@@ -259,7 +279,7 @@ void LLDiskCache::removeOldVFSFiles()
boost::system::error_code ec;
#if LL_WINDOWS
- std::wstring cache_path(utf8str_to_utf16str(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "")));
+ std::wstring cache_path(ll_convert<std::wstring>(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "")));
#else
std::string cache_path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""));
#endif
@@ -270,13 +290,20 @@ void LLDiskCache::removeOldVFSFiles()
{
if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())
{
+#if LL_WINDOWS
+ if ((utf16str_to_utf8str((*iter).path().wstring()).find(CACHE_FORMAT) != std::string::npos) ||
+ (utf16str_to_utf8str((*iter).path().wstring()).find(DB_FORMAT) != std::string::npos))
+#else
if (((*iter).path().string().find(CACHE_FORMAT) != std::string::npos) ||
((*iter).path().string().find(DB_FORMAT) != std::string::npos))
+#endif
{
boost::filesystem::remove(*iter, ec);
if (ec.failed())
{
+#if !LL_WINDOWS
LL_WARNS() << "Failed to delete cache file " << *iter << ": " << ec.message() << LL_ENDL;
+#endif
}
}
}
@@ -300,7 +327,7 @@ uintmax_t LLDiskCache::dirFileSize(const std::string& dir)
*/
boost::system::error_code ec;
#if LL_WINDOWS
- std::wstring dir_path(utf8str_to_utf16str(dir));
+ std::wstring dir_path(ll_convert<std::wstring>(dir));
#else
std::string dir_path(dir);
#endif
@@ -311,7 +338,11 @@ uintmax_t LLDiskCache::dirFileSize(const std::string& dir)
{
if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())
{
+#if LL_WINDOWS
+ if (utf16str_to_utf8str((*iter).path().wstring()).find(CACHE_FILENAME_PREFIX) != std::string::npos)
+#else
if ((*iter).path().string().find(CACHE_FILENAME_PREFIX) != std::string::npos)
+#endif
{
uintmax_t file_size = boost::filesystem::file_size(*iter, ec);
if (!ec.failed())
diff --git a/indra/llfilesystem/llfilesystem.cpp b/indra/llfilesystem/llfilesystem.cpp
index c8ce9531c2..541266af4f 100644
--- a/indra/llfilesystem/llfilesystem.cpp
+++ b/indra/llfilesystem/llfilesystem.cpp
@@ -103,9 +103,6 @@ bool LLFileSystem::renameFile(const LLUUID& old_file_id, const LLAssetType::ETyp
const std::string old_filename = LLDiskCache::metaDataToFilepath(old_file_id, old_file_type);
const std::string new_filename = LLDiskCache::metaDataToFilepath(new_file_id, new_file_type);
- // Rename needs the new file to not exist.
- LLFileSystem::removeFile(new_file_id, new_file_type, ENOENT);
-
if (LLFile::rename(old_filename, new_filename) != 0)
{
// We would like to return false here indicating the operation
@@ -316,7 +313,7 @@ void LLFileSystem::updateFileAccessTime(const std::string& file_path)
boost::system::error_code ec;
#if LL_WINDOWS
// file last write time
- const std::time_t last_write_time = boost::filesystem::last_write_time(utf8str_to_utf16str(file_path), ec);
+ const std::time_t last_write_time = boost::filesystem::last_write_time(ll_convert<std::wstring>(file_path), ec);
if (ec.failed())
{
LL_WARNS() << "Failed to read last write time for cache file " << file_path << ": " << ec.message() << LL_ENDL;
@@ -330,7 +327,7 @@ void LLFileSystem::updateFileAccessTime(const std::string& file_path)
// before the last one
if (delta_time > time_threshold)
{
- boost::filesystem::last_write_time(utf8str_to_utf16str(file_path), cur_time, ec);
+ boost::filesystem::last_write_time(ll_convert<std::wstring>(file_path), cur_time, ec);
}
#else
// file last write time
diff --git a/indra/llfilesystem/tests/lldir_test.cpp b/indra/llfilesystem/tests/lldir_test.cpp
index 6e191ad096..d7d57fa86f 100644
--- a/indra/llfilesystem/tests/lldir_test.cpp
+++ b/indra/llfilesystem/tests/lldir_test.cpp
@@ -435,7 +435,7 @@ namespace tut
for (counter=0, foundUnused=false; !foundUnused; counter++ )
{
char counterStr[3];
- sprintf(counterStr, "%02d", counter);
+ snprintf(counterStr, sizeof(counterStr), "%02d", counter);
uniqueDir = dirbase + counterStr;
foundUnused = ! ( LLFile::isdir(uniqueDir) || LLFile::isfile(uniqueDir) );
}
diff --git a/indra/llimage/llimagebmp.cpp b/indra/llimage/llimagebmp.cpp
index 2a328675c2..c8f99380ea 100644
--- a/indra/llimage/llimagebmp.cpp
+++ b/indra/llimage/llimagebmp.cpp
@@ -558,6 +558,12 @@ bool LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
LL_INFOS() << "Dropping alpha information during BMP encoding" << LL_ENDL;
}
+ if (raw_image->isBufferInvalid())
+ {
+ setLastError("Invalid input, no buffer");
+ return false;
+ }
+
setSize(raw_image->getWidth(), raw_image->getHeight(), dst_components);
U8 magic[14];
diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp
index d4efbcfad2..c896d60c85 100644
--- a/indra/llimage/llimagedimensionsinfo.cpp
+++ b/indra/llimage/llimagedimensionsinfo.cpp
@@ -75,7 +75,7 @@ bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec)
bool LLImageDimensionsInfo::getImageDimensionsBmp()
{
// Make sure the file is long enough.
- const S32 DATA_LEN = 26; // BMP header (14) + DIB header size (4) + width (4) + height (4)
+ constexpr S32 DATA_LEN = 26; // BMP header (14) + DIB header size (4) + width (4) + height (4)
if (!checkFileLength(DATA_LEN))
{
LL_WARNS() << "Premature end of file" << LL_ENDL;
@@ -105,7 +105,7 @@ bool LLImageDimensionsInfo::getImageDimensionsBmp()
bool LLImageDimensionsInfo::getImageDimensionsTga()
{
- const S32 TGA_FILE_HEADER_SIZE = 12;
+ constexpr S32 TGA_FILE_HEADER_SIZE = 12;
// Make sure the file is long enough.
if (!checkFileLength(TGA_FILE_HEADER_SIZE + 1 /* width */ + 1 /* height */))
@@ -124,7 +124,7 @@ bool LLImageDimensionsInfo::getImageDimensionsTga()
bool LLImageDimensionsInfo::getImageDimensionsPng()
{
- const S32 PNG_MAGIC_SIZE = 8;
+ constexpr S32 PNG_MAGIC_SIZE = 8;
// Make sure the file is long enough.
if (!checkFileLength(PNG_MAGIC_SIZE + 8 + sizeof(S32) * 2 /* width, height */))
@@ -134,7 +134,7 @@ bool LLImageDimensionsInfo::getImageDimensionsPng()
}
// Read PNG signature.
- const U8 png_magic[PNG_MAGIC_SIZE] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
+ constexpr U8 png_magic[PNG_MAGIC_SIZE] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
U8 signature[PNG_MAGIC_SIZE];
mInfile.read((void*)signature, PNG_MAGIC_SIZE);
@@ -166,34 +166,36 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg()
{
sJpegErrorEncountered = false;
clean();
- FILE *fp = LLFile::fopen(mSrcFilename, "rb");
- if (fp == NULL)
+ FILE* fp = LLFile::fopen(mSrcFilename, "rb");
+ if (!fp)
{
setLastError("Unable to open file for reading", mSrcFilename);
return false;
}
/* Make sure this is a JPEG file. */
- const size_t JPEG_MAGIC_SIZE = 2;
- const U8 jpeg_magic[JPEG_MAGIC_SIZE] = {0xFF, 0xD8};
+ constexpr size_t JPEG_MAGIC_SIZE = 2;
+ constexpr U8 jpeg_magic[JPEG_MAGIC_SIZE] = {0xFF, 0xD8};
U8 signature[JPEG_MAGIC_SIZE];
if (fread(signature, sizeof(signature), 1, fp) != 1)
{
LL_WARNS() << "Premature end of file" << LL_ENDL;
+ fclose(fp);
return false;
}
if (memcmp(signature, jpeg_magic, JPEG_MAGIC_SIZE) != 0)
{
LL_WARNS() << "Not a JPEG" << LL_ENDL;
mWarning = "texture_load_format_error";
+ fclose(fp);
return false;
}
fseek(fp, 0, SEEK_SET); // go back to start of the file
/* Init jpeg */
jpeg_error_mgr jerr;
- jpeg_decompress_struct cinfo;
+ jpeg_decompress_struct cinfo{};
cinfo.err = jpeg_std_error(&jerr);
// Call our function instead of exit() if Libjpeg encounters an error.
// This is done to avoid crash in this case (STORM-472).
diff --git a/indra/llimage/llimagedimensionsinfo.h b/indra/llimage/llimagedimensionsinfo.h
index 681d66ae4e..4870f2e815 100644
--- a/indra/llimage/llimagedimensionsinfo.h
+++ b/indra/llimage/llimagedimensionsinfo.h
@@ -38,7 +38,7 @@ class LLImageDimensionsInfo
{
public:
LLImageDimensionsInfo():
- mData(NULL)
+ mData(nullptr)
,mHeight(0)
,mWidth(0)
{}
@@ -67,7 +67,7 @@ protected:
{
mInfile.close();
delete[] mData;
- mData = NULL;
+ mData = nullptr;
mWidth = 0;
mHeight = 0;
}
diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp
index 6b960f9077..c3fd0c5aa8 100644
--- a/indra/llimage/llimagedxt.cpp
+++ b/indra/llimage/llimagedxt.cpp
@@ -329,6 +329,12 @@ bool LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_
{
llassert_always(raw_image);
+ if (raw_image->isBufferInvalid())
+ {
+ setLastError("Invalid input, no buffer");
+ return false;
+ }
+
S32 ncomponents = raw_image->getComponents();
EFileFormat format;
switch (ncomponents)
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index aa161709a1..5a941dc958 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -281,10 +281,11 @@ S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 r
S32 height = (h > 0) ? h : 2048;
S32 max_dimension = llmax(width, height); // Find largest dimension
S32 block_area = MAX_BLOCK_SIZE * MAX_BLOCK_SIZE; // Calculated initial block area from established max block size (currently 64)
- block_area *= llmax((max_dimension / MAX_BLOCK_SIZE / max_components), 1); // Adjust initial block area by ratio of largest dimension to block size per component
- S32 totalbytes = (S32) (block_area * max_components * precision); // First block layer computed before loop without compression rate
- S32 block_layers = 1; // Start at layer 1 since first block layer is computed outside loop
- while (block_layers < 6) // Walk five layers for the five discards in JPEG2000
+ S32 max_layers = (S32)llmax(llround(log2f((float)max_dimension) - log2f((float)MAX_BLOCK_SIZE)), 4); // Find number of powers of two between extents and block size to a minimum of 4
+ block_area *= llmax(max_layers, 1); // Adjust initial block area by max number of layers
+ S32 totalbytes = (S32) (MIN_LAYER_SIZE * max_components * precision); // Start estimation with a minimum reasonable size
+ S32 block_layers = 0;
+ while (block_layers <= max_layers) // Walk the layers
{
if (block_layers <= (5 - discard_level)) // Walk backwards from discard 5 to required discard layer.
totalbytes += (S32) (block_area * max_components * precision * rate); // Add each block layer reduced by assumed compression rate
diff --git a/indra/llimage/llimagejpeg.cpp b/indra/llimage/llimagejpeg.cpp
index dd3efb3459..803d8f17fc 100644
--- a/indra/llimage/llimagejpeg.cpp
+++ b/indra/llimage/llimagejpeg.cpp
@@ -31,7 +31,9 @@
#include "llerror.h"
#include "llexception.h"
+#if !(LL_DARWIN && defined(__arm64__))
jmp_buf LLImageJPEG::sSetjmpBuffer ;
+#endif
LLImageJPEG::LLImageJPEG(S32 quality)
: LLImageFormatted(IMG_CODEC_JPEG),
mOutputBuffer( NULL ),
@@ -435,7 +437,6 @@ void LLImageJPEG::errorExit( j_common_ptr cinfo )
// Let the memory manager delete any temp files
jpeg_destroy(cinfo);
-
// Return control to the setjmp point
#if !(LL_DARWIN && defined(__arm64__))
longjmp(sSetjmpBuffer, 1) ;
@@ -497,6 +498,12 @@ bool LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
resetLastError();
+ if (raw_image->isBufferInvalid())
+ {
+ setLastError("Invalid input, no buffer");
+ return false;
+ }
+
LLImageDataSharedLock lockIn(raw_image);
LLImageDataLock lockOut(this);
@@ -563,7 +570,6 @@ bool LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
return false;
}
#endif
-
try
{
diff --git a/indra/llimage/llimagejpeg.h b/indra/llimage/llimagejpeg.h
index f6d9f19ba5..920f712fba 100644
--- a/indra/llimage/llimagejpeg.h
+++ b/indra/llimage/llimagejpeg.h
@@ -78,7 +78,9 @@ protected:
S32 mEncodeQuality; // on a scale from 1 to 100
private:
+#if !(LL_DARWIN && defined(__arm64__))
static jmp_buf sSetjmpBuffer; // To allow the library to abort.
+#endif
};
#endif // LL_LLIMAGEJPEG_H
diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index 04b527d783..9350901324 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -29,10 +29,6 @@
// this is defined so that we get static linking.
#include <openjpeg-2.5/openjpeg.h>
-#include <openjpeg-2.5/event.h>
-#include <openjpeg-2.5/cio.h>
-
-#define MAX_ENCODED_DISCARD_LEVELS 5
// Factory function: see declaration in llimagej2c.cpp
LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl()
@@ -50,6 +46,7 @@ std::string LLImageJ2COJ::getEngineInfo() const
#endif
}
+#if WANT_VERBOSE_OPJ_SPAM
// Return string from message, eliminating final \n if present
static std::string chomp(const char* msg)
{
@@ -65,27 +62,34 @@ static std::string chomp(const char* msg)
}
return message;
}
+#endif
/**
sample error callback expecting a LLFILE* client object
*/
void error_callback(const char* msg, void*)
{
- LL_DEBUGS() << "LLImageJ2COJ: " << chomp(msg) << LL_ENDL;
+#if WANT_VERBOSE_OPJ_SPAM
+ LL_WARNS() << "LLImageJ2COJ: " << chomp(msg) << LL_ENDL;
+#endif
}
/**
sample warning callback expecting a LLFILE* client object
*/
void warning_callback(const char* msg, void*)
{
- LL_DEBUGS() << "LLImageJ2COJ: " << chomp(msg) << LL_ENDL;
+#if WANT_VERBOSE_OPJ_SPAM
+ LL_WARNS() << "LLImageJ2COJ: " << chomp(msg) << LL_ENDL;
+#endif
}
/**
sample debug callback expecting no client object
*/
void info_callback(const char* msg, void*)
{
- LL_DEBUGS() << "LLImageJ2COJ: " << chomp(msg) << LL_ENDL;
+#if WANT_VERBOSE_OPJ_SPAM
+ LL_INFOS() << "LLImageJ2COJ: " << chomp(msg) << LL_ENDL;
+#endif
}
// Divide a by 2 to the power of b and round upwards
@@ -97,108 +101,105 @@ int ceildivpow2(int a, int b)
class JPEG2KBase
{
public:
- JPEG2KBase() {}
+ JPEG2KBase() = default;
U8* buffer = nullptr;
OPJ_SIZE_T size = 0;
OPJ_OFF_T offset = 0;
};
-#define WANT_VERBOSE_OPJ_SPAM LL_DEBUG
-
-static void opj_info(const char* msg, void* user_data)
-{
- llassert(user_data);
-#if WANT_VERBOSE_OPJ_SPAM
- LL_INFOS("OpenJPEG") << msg << LL_ENDL;
-#endif
-}
-
-static void opj_warn(const char* msg, void* user_data)
-{
- llassert(user_data);
-#if WANT_VERBOSE_OPJ_SPAM
- LL_WARNS("OpenJPEG") << msg << LL_ENDL;
-#endif
-}
-
-static void opj_error(const char* msg, void* user_data)
-{
- llassert(user_data);
-#if WANT_VERBOSE_OPJ_SPAM
- LL_WARNS("OpenJPEG") << msg << LL_ENDL;
-#endif
-}
-
static OPJ_SIZE_T opj_read(void * buffer, OPJ_SIZE_T bytes, void* user_data)
{
- llassert(user_data);
+ llassert(user_data && buffer);
+
JPEG2KBase* jpeg_codec = static_cast<JPEG2KBase*>(user_data);
- OPJ_SIZE_T remainder = (jpeg_codec->size - jpeg_codec->offset);
- if (remainder <= 0)
+
+ if (jpeg_codec->offset < 0 || static_cast<OPJ_SIZE_T>(jpeg_codec->offset) >= jpeg_codec->size)
{
jpeg_codec->offset = jpeg_codec->size;
- // Indicate end of stream (hacky?)
- return (OPJ_OFF_T)-1;
+ return static_cast<OPJ_SIZE_T>(-1); // Indicate EOF
}
- OPJ_SIZE_T to_read = llclamp(U32(bytes), U32(0), U32(remainder));
+
+ OPJ_SIZE_T remainder = jpeg_codec->size - static_cast<OPJ_SIZE_T>(jpeg_codec->offset);
+ OPJ_SIZE_T to_read = (bytes < remainder) ? bytes : remainder;
+
memcpy(buffer, jpeg_codec->buffer + jpeg_codec->offset, to_read);
jpeg_codec->offset += to_read;
+
return to_read;
}
static OPJ_SIZE_T opj_write(void * buffer, OPJ_SIZE_T bytes, void* user_data)
{
- llassert(user_data);
+ llassert(user_data && buffer);
+
JPEG2KBase* jpeg_codec = static_cast<JPEG2KBase*>(user_data);
- OPJ_SIZE_T remainder = jpeg_codec->size - jpeg_codec->offset;
- if (remainder < bytes)
+ OPJ_OFF_T required_offset = jpeg_codec->offset + static_cast<OPJ_OFF_T>(bytes);
+
+ // Overflow check
+ if (required_offset < jpeg_codec->offset)
+ return 0; // Overflow detected
+
+ // Resize if needed (exponential growth)
+ if (required_offset > static_cast<OPJ_OFF_T>(jpeg_codec->size))
{
- OPJ_SIZE_T new_size = jpeg_codec->size + (bytes - remainder);
+ OPJ_SIZE_T new_size = jpeg_codec->size ? jpeg_codec->size : 1024;
+ while (required_offset > static_cast<OPJ_OFF_T>(new_size))
+ new_size *= 2;
+
+ const OPJ_SIZE_T MAX_BUFFER_SIZE = 512 * 1024 * 1024; // 512 MB, increase if needed
+ if (new_size > MAX_BUFFER_SIZE) return 0;
+
U8* new_buffer = (U8*)ll_aligned_malloc_16(new_size);
- memcpy(new_buffer, jpeg_codec->buffer, jpeg_codec->offset);
- U8* old_buffer = jpeg_codec->buffer;
+ if (!new_buffer) return 0; // Allocation failed
+
+ if (jpeg_codec->offset > 0)
+ memcpy(new_buffer, jpeg_codec->buffer, static_cast<size_t>(jpeg_codec->offset));
+
+ ll_aligned_free_16(jpeg_codec->buffer);
jpeg_codec->buffer = new_buffer;
- ll_aligned_free_16(old_buffer);
jpeg_codec->size = new_size;
}
- memcpy(jpeg_codec->buffer + jpeg_codec->offset, buffer, bytes);
- jpeg_codec->offset += bytes;
+
+ memcpy(jpeg_codec->buffer + jpeg_codec->offset, buffer, static_cast<size_t>(bytes));
+ jpeg_codec->offset = required_offset;
return bytes;
}
static OPJ_OFF_T opj_skip(OPJ_OFF_T bytes, void* user_data)
{
+ llassert(user_data);
JPEG2KBase* jpeg_codec = static_cast<JPEG2KBase*>(user_data);
- jpeg_codec->offset += bytes;
- if (jpeg_codec->offset > (OPJ_OFF_T)jpeg_codec->size)
- {
- jpeg_codec->offset = jpeg_codec->size;
- // Indicate end of stream
- return (OPJ_OFF_T)-1;
- }
+ OPJ_OFF_T new_offset = jpeg_codec->offset + bytes;
- if (jpeg_codec->offset < 0)
+ if (new_offset < 0 || new_offset > static_cast<OPJ_OFF_T>(jpeg_codec->size))
{
- // Shouldn't be possible?
- jpeg_codec->offset = 0;
+ // Clamp and indicate EOF or error
+ jpeg_codec->offset = llclamp<OPJ_OFF_T>(new_offset, 0, static_cast<OPJ_OFF_T>(jpeg_codec->size));
return (OPJ_OFF_T)-1;
}
+ jpeg_codec->offset = new_offset;
return bytes;
}
-static OPJ_BOOL opj_seek(OPJ_OFF_T bytes, void * user_data)
+static OPJ_BOOL opj_seek(OPJ_OFF_T offset, void * user_data)
{
+ llassert(user_data);
JPEG2KBase* jpeg_codec = static_cast<JPEG2KBase*>(user_data);
- jpeg_codec->offset = bytes;
- jpeg_codec->offset = llclamp(U32(jpeg_codec->offset), U32(0), U32(jpeg_codec->size));
+
+ if (offset < 0 || offset > static_cast<OPJ_OFF_T>(jpeg_codec->size))
+ return OPJ_FALSE;
+
+ jpeg_codec->offset = offset;
return OPJ_TRUE;
}
static void opj_free_user_data(void * user_data)
{
+ llassert(user_data);
+
JPEG2KBase* jpeg_codec = static_cast<JPEG2KBase*>(user_data);
// Don't free, data is managed externally
jpeg_codec->buffer = nullptr;
@@ -208,25 +209,61 @@ static void opj_free_user_data(void * user_data)
static void opj_free_user_data_write(void * user_data)
{
+ llassert(user_data);
+
JPEG2KBase* jpeg_codec = static_cast<JPEG2KBase*>(user_data);
// Free, data was allocated here
- ll_aligned_free_16(jpeg_codec->buffer);
- jpeg_codec->buffer = nullptr;
+ if (jpeg_codec->buffer)
+ {
+ ll_aligned_free_16(jpeg_codec->buffer);
+ jpeg_codec->buffer = nullptr;
+ }
jpeg_codec->size = 0;
jpeg_codec->offset = 0;
}
+/**
+ * Estimates the number of layers necessary depending on the image surface (w x h)
+ */
+static U32 estimate_num_layers(U32 surface)
+{
+ if (surface <= 1024) return 2; // Tiny (≤32×32)
+ else if (surface <= 16384) return 3; // Small (≤128×128)
+ else if (surface <= 262144) return 4; // Medium (≤512×512)
+ else if (surface <= 1048576) return 5; // Up to ~1MP
+ else return 6; // Up to ~1.5–2MP
+}
+
+/**
+ * Sets the parameters.tcp_rates according to the number of layers and a last tcp_rate value (which equals to the final compression ratio).
+ *
+ * Example for 6 layers:
+ *
+ * i = 5, parameters.tcp_rates[6 - 1 - 5] = 8.0f * (1 << (5 << 1)) = 8192 // Layer 5 (lowest quality)
+ * i = 4, parameters.tcp_rates[6 - 1 - 4] = 8.0f * (1 << (4 << 1)) = 2048 // Layer 4
+ * i = 3, parameters.tcp_rates[6 - 1 - 3] = 8.0f * (1 << (3 << 1)) = 512 // Layer 3
+ * i = 2, parameters.tcp_rates[6 - 1 - 2] = 8.0f * (1 << (2 << 1)) = 128 // Layer 2
+ * i = 1, parameters.tcp_rates[6 - 1 - 1] = 8.0f * (1 << (1 << 1)) = 32 // Layer 1
+ * i = 0, parameters.tcp_rates[6 - 1 - 0] = 8.0f * (1 << (0 << 1)) = 8 // Layer 0 (highest quality)
+ *
+ */
+static void set_tcp_rates(opj_cparameters_t* parameters, U32 num_layers = 1, F32 last_tcp_rate = LAST_TCP_RATE)
+{
+ parameters->tcp_numlayers = num_layers;
+
+ for (int i = num_layers - 1; i >= 0; i--)
+ {
+ parameters->tcp_rates[num_layers - 1 - i] = last_tcp_rate * static_cast<F32>(1 << (i << 1));
+ }
+}
+
class JPEG2KDecode : public JPEG2KBase
{
public:
JPEG2KDecode(S8 discardLevel)
{
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
memset(&parameters, 0, sizeof(opj_dparameters_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
opj_set_default_decoder_parameters(&parameters);
parameters.cp_reduce = discardLevel;
}
@@ -270,6 +307,11 @@ public:
decoder = opj_create_decompress(OPJ_CODEC_J2K);
+ /* catch events using our callbacks and give a local context */
+ opj_set_error_handler(decoder, error_callback, nullptr);
+ opj_set_warning_handler(decoder, warning_callback, nullptr);
+ opj_set_info_handler(decoder, info_callback, nullptr);
+
if (!opj_setup_decoder(decoder, &parameters))
{
return false;
@@ -340,9 +382,9 @@ public:
decoder = opj_create_decompress(OPJ_CODEC_J2K);
opj_setup_decoder(decoder, &parameters);
- opj_set_info_handler(decoder, opj_info, this);
- opj_set_warning_handler(decoder, opj_warn, this);
- opj_set_error_handler(decoder, opj_error, this);
+ opj_set_info_handler(decoder, info_callback, this);
+ opj_set_warning_handler(decoder, warning_callback, this);
+ opj_set_error_handler(decoder, error_callback, this);
if (stream)
{
@@ -408,7 +450,6 @@ public:
private:
opj_dparameters_t parameters;
- opj_event_mgr_t event_mgr;
opj_image_t* image = nullptr;
opj_codec_t* decoder = nullptr;
opj_stream_t* stream = nullptr;
@@ -423,22 +464,19 @@ public:
JPEG2KEncode(const char* comment_text_in, bool reversible)
{
memset(&parameters, 0, sizeof(opj_cparameters_t));
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
opj_set_default_encoder_parameters(&parameters);
parameters.cod_format = OPJ_CODEC_J2K;
- parameters.cp_disto_alloc = 1;
+ parameters.prog_order = OPJ_RLCP; // should be the default, but, just in case
+ parameters.cp_disto_alloc = 1; // enable rate allocation by distortion
+ parameters.max_cs_size = 0; // do not cap max size because we're using tcp_rates and also irrelevant with lossless.
if (reversible)
{
- parameters.max_cs_size = 0; // do not limit size for reversible compression
parameters.irreversible = 0; // should be the default, but, just in case
parameters.tcp_numlayers = 1;
/* documentation seems to be wrong, should be 0.0f for lossless, not 1.0f
- see https://github.com/uclouvain/openjpeg/blob/39e8c50a2f9bdcf36810ee3d41bcbf1cc78968ae/src/lib/openjp2/j2k.c#L7755
+ see https://github.com/uclouvain/openjpeg/blob/e7453e398b110891778d8da19209792c69ca7169/src/lib/openjp2/j2k.c#L7817
*/
parameters.tcp_rates[0] = 0.0f;
}
@@ -493,53 +531,48 @@ public:
encoder = opj_create_compress(OPJ_CODEC_J2K);
- parameters.tcp_mct = (image->numcomps >= 3) ? 1 : 0;
- parameters.cod_format = OPJ_CODEC_J2K;
- parameters.prog_order = OPJ_RLCP;
- parameters.cp_disto_alloc = 1;
+ /* catch events using our callbacks and give a local context */
+ opj_set_error_handler(encoder, error_callback, nullptr);
+ opj_set_warning_handler(encoder, warning_callback, nullptr);
+ opj_set_info_handler(encoder, info_callback, nullptr);
+
+ parameters.tcp_mct = (image->numcomps >= 3) ? 1 : 0; // no color transform for RGBA images
+
// if not lossless compression, computes tcp_numlayers and max_cs_size depending on the image dimensions
- if( parameters.irreversible ) {
+ if( parameters.irreversible )
+ {
// computes a number of layers
U32 surface = rawImageIn.getWidth() * rawImageIn.getHeight();
- U32 nb_layers = 1;
- U32 s = 64*64;
- while (surface > s)
- {
- nb_layers++;
- s *= 4;
- }
- nb_layers = llclamp(nb_layers, 1, 6);
- parameters.tcp_numlayers = nb_layers;
- parameters.tcp_rates[nb_layers - 1] = (U32)(1.f / DEFAULT_COMPRESSION_RATE); // 1:8 by default
+ // gets the necessary number of layers
+ U32 nb_layers = estimate_num_layers(surface);
- // for each subsequent layer, computes its rate and adds surface * numcomps * 1/rate to the max_cs_size
- U32 max_cs_size = (U32)(surface * image->numcomps * DEFAULT_COMPRESSION_RATE);
- U32 multiplier;
- for (int i = nb_layers - 2; i >= 0; i--)
- {
- if( i == nb_layers - 2 )
- {
- multiplier = 15;
- }
- else if( i == nb_layers - 3 )
- {
- multiplier = 4;
- }
- else
- {
- multiplier = 2;
- }
- parameters.tcp_rates[i] = parameters.tcp_rates[i + 1] * multiplier;
- max_cs_size += (U32)(surface * image->numcomps * (1 / parameters.tcp_rates[i]));
- }
+ // fills parameters.tcp_rates and updates parameters.tcp_numlayers
+ set_tcp_rates(&parameters, nb_layers, LAST_TCP_RATE);
+
+ }
- //ensure that we have at least a minimal size
- max_cs_size = llmax(max_cs_size, (U32)FIRST_PACKET_SIZE);
+ U32 width_tiles = (rawImageIn.getWidth() >> 6);
+ U32 height_tiles = (rawImageIn.getHeight() >> 6);
- parameters.max_cs_size = max_cs_size;
+ // Allow images with a width or height that are MIN_IMAGE_SIZE <= x < 64
+ if (width_tiles == 0 && (rawImageIn.getWidth() >= MIN_IMAGE_SIZE))
+ {
+ width_tiles = 1;
+ }
+ if (height_tiles == 0 && (rawImageIn.getHeight() >= MIN_IMAGE_SIZE))
+ {
+ height_tiles = 1;
+ }
+
+ if (width_tiles == 1 || height_tiles == 1)
+ {
+ // Images with either dimension less than 32 need less number of resolutions otherwise they error
+ int min_dim = rawImageIn.getWidth() < rawImageIn.getHeight() ? rawImageIn.getWidth() : rawImageIn.getHeight();
+ int max_res = 1 + (int)floor(log2(min_dim));
+ parameters.numresolution = max_res;
}
if (!opj_setup_encoder(encoder, &parameters, image))
@@ -547,11 +580,7 @@ public:
return false;
}
- opj_set_info_handler(encoder, opj_info, this);
- opj_set_warning_handler(encoder, opj_warn, this);
- opj_set_error_handler(encoder, opj_error, this);
-
- U32 tile_count = (rawImageIn.getWidth() >> 6) * (rawImageIn.getHeight() >> 6);
+ U32 tile_count = width_tiles * height_tiles;
U32 data_size_guess = tile_count * TILE_SIZE;
// will be freed in opj_free_user_data_write
@@ -566,7 +595,7 @@ public:
opj_stream_destroy(stream);
}
- stream = opj_stream_create(data_size_guess, false);
+ stream = opj_stream_create(data_size_guess, OPJ_FALSE);
if (!stream)
{
return false;
@@ -607,17 +636,15 @@ public:
void setImage(const LLImageRaw& raw)
{
- opj_image_cmptparm_t cmptparm[MAX_ENCODED_DISCARD_LEVELS];
- memset(&cmptparm[0], 0, MAX_ENCODED_DISCARD_LEVELS * sizeof(opj_image_cmptparm_t));
-
S32 numcomps = raw.getComponents();
- S32 width = raw.getWidth();
- S32 height = raw.getHeight();
+ S32 width = raw.getWidth();
+ S32 height = raw.getHeight();
+
+ std::vector<opj_image_cmptparm_t> cmptparm(numcomps);
for (S32 c = 0; c < numcomps; c++)
{
- cmptparm[c].prec = 8;
- cmptparm[c].bpp = 8;
+ cmptparm[c].prec = 8; // replaces .bpp
cmptparm[c].sgnd = 0;
cmptparm[c].dx = parameters.subsampling_dx;
cmptparm[c].dy = parameters.subsampling_dy;
@@ -625,7 +652,7 @@ public:
cmptparm[c].h = height;
}
- image = opj_image_create(numcomps, &cmptparm[0], OPJ_CLRSPC_SRGB);
+ image = opj_image_create(numcomps, cmptparm.data(), OPJ_CLRSPC_SRGB);
image->x1 = width;
image->y1 = height;
@@ -637,7 +664,7 @@ public:
{
for (S32 x = 0; x < width; x++)
{
- const U8 *pixel = src_datap + (y*width + x) * numcomps;
+ const U8 *pixel = src_datap + (y * width + x) * numcomps;
for (S32 c = 0; c < numcomps; c++)
{
image->comps[c].data[i] = *pixel;
@@ -744,7 +771,6 @@ public:
private:
opj_cparameters_t parameters;
- opj_event_mgr_t event_mgr;
opj_image_t* image = nullptr;
opj_codec_t* encoder = nullptr;
opj_stream_t* stream = nullptr;
@@ -855,14 +881,19 @@ bool LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
bool LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, bool reversible)
{
+ if (raw_image.isBufferInvalid())
+ {
+ base.setLastError("Invalid input, no buffer");
+ return false;
+ }
+
JPEG2KEncode encode(comment_text, reversible);
bool encoded = encode.encode(raw_image, base);
- if (encoded)
+ if (!encoded)
{
- LL_WARNS() << "Openjpeg encoding implementation isn't complete, returning false" << LL_ENDL;
+ LL_WARNS() << "Openjpeg encoding was unsuccessful, returning false" << LL_ENDL;
}
return encoded;
- //return false;
}
bool LLImageJ2COJ::getMetadata(LLImageJ2C &base)
diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h
index 498502451a..da49597302 100644
--- a/indra/llimagej2coj/llimagej2coj.h
+++ b/indra/llimagej2coj/llimagej2coj.h
@@ -29,6 +29,8 @@
#include "llimagej2c.h"
+const F32 LAST_TCP_RATE = 1.f/DEFAULT_COMPRESSION_RATE; // should be 8, giving a 1:8 ratio
+
class LLImageJ2COJ : public LLImageJ2CImpl
{
public:
diff --git a/indra/llinventory/llfoldertype.cpp b/indra/llinventory/llfoldertype.cpp
index 7e1be17ecc..670405e9b5 100644
--- a/indra/llinventory/llfoldertype.cpp
+++ b/indra/llinventory/llfoldertype.cpp
@@ -29,6 +29,7 @@
#include "llfoldertype.h"
#include "lldictionary.h"
#include "llmemory.h"
+#include "llsd.h"
#include "llsingleton.h"
///----------------------------------------------------------------------------
@@ -220,3 +221,21 @@ const std::string &LLFolderType::badLookup()
static const std::string sBadLookup = "llfoldertype_bad_lookup";
return sBadLookup;
}
+
+LLSD LLFolderType::getTypeNames()
+{
+ LLSD type_names;
+ for (S32 type = FT_TEXTURE; type < FT_COUNT; ++type)
+ {
+ if (lookupIsEnsembleType((LLFolderType::EType)type))
+ continue;
+
+ const FolderEntry* entry = LLFolderDictionary::getInstance()->lookup((LLFolderType::EType)type);
+ // skip llfoldertype_bad_lookup
+ if (entry)
+ {
+ type_names.append(entry->mName);
+ }
+ }
+ return type_names;
+}
diff --git a/indra/llinventory/llfoldertype.h b/indra/llinventory/llfoldertype.h
index 46a1b92a96..dd12693f66 100644
--- a/indra/llinventory/llfoldertype.h
+++ b/indra/llinventory/llfoldertype.h
@@ -115,6 +115,8 @@ public:
static const std::string& badLookup(); // error string when a lookup fails
+ static LLSD getTypeNames();
+
protected:
LLFolderType() {}
~LLFolderType() {}
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index 075abf9536..3defad8f3b 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -46,6 +46,7 @@ static const std::string INV_ITEM_ID_LABEL("item_id");
static const std::string INV_FOLDER_ID_LABEL("cat_id");
static const std::string INV_PARENT_ID_LABEL("parent_id");
static const std::string INV_THUMBNAIL_LABEL("thumbnail");
+static const std::string INV_FAVORITE_LABEL("favorite");
static const std::string INV_THUMBNAIL_ID_LABEL("thumbnail_id");
static const std::string INV_ASSET_TYPE_LABEL("type");
static const std::string INV_PREFERRED_TYPE_LABEL("preferred_type");
@@ -59,6 +60,7 @@ static const std::string INV_LINKED_ID_LABEL("linked_id");
static const std::string INV_SALE_INFO_LABEL("sale_info");
static const std::string INV_FLAGS_LABEL("flags");
static const std::string INV_CREATION_DATE_LABEL("created_at");
+static const std::string INV_TOGGLED_LABEL("toggled");
// key used by agent-inventory-service
static const std::string INV_ASSET_TYPE_LABEL_WS("type_default");
@@ -82,14 +84,16 @@ LLInventoryObject::LLInventoryObject(const LLUUID& uuid,
mParentUUID(parent_uuid),
mType(type),
mName(name),
- mCreationDate(0)
+ mCreationDate(0),
+ mFavorite(false)
{
correctInventoryName(mName);
}
LLInventoryObject::LLInventoryObject()
: mType(LLAssetType::AT_NONE),
- mCreationDate(0)
+ mCreationDate(0),
+ mFavorite(false)
{
}
@@ -104,6 +108,7 @@ void LLInventoryObject::copyObject(const LLInventoryObject* other)
mType = other->mType;
mName = other->mName;
mThumbnailUUID = other->mThumbnailUUID;
+ mFavorite = other->mFavorite;
}
const LLUUID& LLInventoryObject::getUUID() const
@@ -121,6 +126,11 @@ const LLUUID& LLInventoryObject::getThumbnailUUID() const
return mThumbnailUUID;
}
+bool LLInventoryObject::getIsFavorite() const
+{
+ return mFavorite;
+}
+
const std::string& LLInventoryObject::getName() const
{
return mName;
@@ -175,6 +185,11 @@ void LLInventoryObject::setThumbnailUUID(const LLUUID& thumbnail_uuid)
mThumbnailUUID = thumbnail_uuid;
}
+void LLInventoryObject::setFavorite(bool favorite)
+{
+ mFavorite = favorite;
+}
+
void LLInventoryObject::setType(LLAssetType::EType type)
{
mType = type;
@@ -247,6 +262,23 @@ bool LLInventoryObject::importLegacyStream(std::istream& input_stream)
{
setThumbnailUUID(LLUUID::null);
}
+
+ if (metadata.has("favorite"))
+ {
+ const LLSD& favorite = metadata["favorite"];
+ if (favorite.has("toggled"))
+ {
+ setFavorite(favorite["toggled"].asBoolean());
+ }
+ else
+ {
+ setFavorite(false);
+ }
+ }
+ else
+ {
+ setFavorite(false);
+ }
}
else if(0 == strcmp("name", keyword))
{
@@ -735,6 +767,23 @@ bool LLInventoryItem::importLegacyStream(std::istream& input_stream)
{
setThumbnailUUID(LLUUID::null);
}
+
+ if (metadata.has("favorite"))
+ {
+ const LLSD& favorite = metadata["favorite"];
+ if (favorite.has("toggled"))
+ {
+ setFavorite(favorite["toggled"].asBoolean());
+ }
+ else
+ {
+ setFavorite(false);
+ }
+ }
+ else
+ {
+ setFavorite(false);
+ }
}
else if(0 == strcmp("inv_type", keyword))
{
@@ -879,7 +928,7 @@ bool LLInventoryItem::exportLegacyStream(std::ostream& output_stream, bool inclu
LLSD LLInventoryItem::asLLSD() const
{
- LLSD sd = LLSD();
+ LLSD sd;
asLLSD(sd);
return sd;
}
@@ -888,13 +937,18 @@ void LLInventoryItem::asLLSD( LLSD& sd ) const
{
sd[INV_ITEM_ID_LABEL] = mUUID;
sd[INV_PARENT_ID_LABEL] = mParentUUID;
- sd[INV_PERMISSIONS_LABEL] = ll_create_sd_from_permissions(mPermissions);
+ ll_fill_sd_from_permissions(sd[INV_PERMISSIONS_LABEL], mPermissions);
if (mThumbnailUUID.notNull())
{
sd[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
}
+ if (mFavorite)
+ {
+ sd[INV_FAVORITE_LABEL] = LLSD().with(INV_TOGGLED_LABEL, mFavorite);
+ }
+
U32 mask = mPermissions.getMaskBase();
if(((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
|| (mAssetUUID.isNull()))
@@ -909,19 +963,22 @@ void LLInventoryItem::asLLSD( LLSD& sd ) const
cipher.encrypt(shadow_id.mData, UUID_BYTES);
sd[INV_SHADOW_ID_LABEL] = shadow_id;
}
- sd[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(mType);
- sd[INV_INVENTORY_TYPE_LABEL] = mInventoryType;
+ sd[INV_ASSET_TYPE_LABEL] = std::string(LLAssetType::lookup(mType));
const std::string inv_type_str = LLInventoryType::lookup(mInventoryType);
if(!inv_type_str.empty())
{
sd[INV_INVENTORY_TYPE_LABEL] = inv_type_str;
}
+ else
+ {
+ sd[INV_INVENTORY_TYPE_LABEL] = (LLSD::Integer)mInventoryType;
+ }
//sd[INV_FLAGS_LABEL] = (S32)mFlags;
sd[INV_FLAGS_LABEL] = ll_sd_from_U32(mFlags);
- sd[INV_SALE_INFO_LABEL] = mSaleInfo.asLLSD();
+ mSaleInfo.asLLSD(sd[INV_SALE_INFO_LABEL]);
sd[INV_NAME_LABEL] = mName;
sd[INV_DESC_LABEL] = mDescription;
- sd[INV_CREATION_DATE_LABEL] = (S32) mCreationDate;
+ sd[INV_CREATION_DATE_LABEL] = (LLSD::Integer)mCreationDate;
}
bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
@@ -937,6 +994,8 @@ bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
// TODO - figure out if this should be moved into the noclobber fields above
mThumbnailUUID.setNull();
+ mFavorite = false;
+ mPermissions.init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null);
// iterate as map to avoid making unnecessary temp copies of everything
LLSD::map_const_iterator i, end;
@@ -982,9 +1041,20 @@ bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
continue;
}
+ if (i->first == INV_FAVORITE_LABEL)
+ {
+ const LLSD& favorite_map = i->second;
+ const std::string w = INV_TOGGLED_LABEL;
+ if (favorite_map.has(w))
+ {
+ mFavorite = favorite_map[w].asBoolean();
+ }
+ continue;
+ }
+
if (i->first == INV_PERMISSIONS_LABEL)
{
- mPermissions = ll_permissions_from_sd(i->second);
+ mPermissions.importLLSD(i->second);
continue;
}
@@ -1177,6 +1247,11 @@ LLSD LLInventoryCategory::asLLSD() const
sd[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
}
+ if (mFavorite)
+ {
+ sd[INV_FAVORITE_LABEL] = LLSD().with(INV_TOGGLED_LABEL, mFavorite);
+ }
+
return sd;
}
@@ -1188,11 +1263,17 @@ LLSD LLInventoryCategory::asAISCreateCatLLSD() const
S8 type = static_cast<S8>(mPreferredType);
sd[INV_ASSET_TYPE_LABEL_WS] = type;
sd[INV_NAME_LABEL] = mName;
+
if (mThumbnailUUID.notNull())
{
sd[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
}
+ if (mFavorite)
+ {
+ sd[INV_FAVORITE_LABEL] = LLSD().with(INV_TOGGLED_LABEL, mFavorite);
+ }
+
return sd;
}
@@ -1240,6 +1321,17 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd)
mThumbnailUUID = sd[w];
}
}
+ mFavorite = false;
+ w = INV_FAVORITE_LABEL;
+ if (sd.has(w))
+ {
+ const LLSD& favorite_map = sd[w];
+ w = INV_TOGGLED_LABEL;
+ if (favorite_map.has(w))
+ {
+ mFavorite = favorite_map[w].asBoolean();
+ }
+ }
w = INV_ASSET_TYPE_LABEL;
if (sd.has(w))
{
@@ -1362,6 +1454,23 @@ bool LLInventoryCategory::importLegacyStream(std::istream& input_stream)
{
setThumbnailUUID(LLUUID::null);
}
+
+ if (metadata.has("favorite"))
+ {
+ const LLSD& favorite = metadata["favorite"];
+ if (favorite.has("toggled"))
+ {
+ setFavorite(favorite["toggled"].asBoolean());
+ }
+ else
+ {
+ setFavorite(false);
+ }
+ }
+ else
+ {
+ setFavorite(false);
+ }
}
else
{
@@ -1396,12 +1505,11 @@ bool LLInventoryCategory::exportLegacyStream(std::ostream& output_stream, bool)
return true;
}
-LLSD LLInventoryCategory::exportLLSD() const
+void LLInventoryCategory::exportLLSD(LLSD& cat_data) const
{
- LLSD cat_data;
cat_data[INV_FOLDER_ID_LABEL] = mUUID;
cat_data[INV_PARENT_ID_LABEL] = mParentUUID;
- cat_data[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(mType);
+ cat_data[INV_ASSET_TYPE_LABEL] = std::string(LLAssetType::lookup(mType));
cat_data[INV_PREFERRED_TYPE_LABEL] = LLFolderType::lookup(mPreferredType);
cat_data[INV_NAME_LABEL] = mName;
@@ -1409,49 +1517,76 @@ LLSD LLInventoryCategory::exportLLSD() const
{
cat_data[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
}
+ if (mFavorite)
+ {
+ cat_data[INV_FAVORITE_LABEL] = LLSD().with(INV_TOGGLED_LABEL, mFavorite);
+ }
+}
- return cat_data;
+bool LLInventoryCategory::importLLSDMap(const LLSD& cat_data)
+{
+ LLSD::map_const_iterator i, end;
+ end = cat_data.endMap();
+ for ( i = cat_data.beginMap(); i != end; ++i)
+ {
+ importLLSD(i->first, i->second);
+ }
+ return true;
}
-bool LLInventoryCategory::importLLSD(const LLSD& cat_data)
+bool LLInventoryCategory::importLLSD(const std::string& label, const LLSD& value)
{
- if (cat_data.has(INV_FOLDER_ID_LABEL))
+ if (label == INV_FOLDER_ID_LABEL)
{
- setUUID(cat_data[INV_FOLDER_ID_LABEL].asUUID());
+ setUUID(value.asUUID());
+ return true;
}
- if (cat_data.has(INV_PARENT_ID_LABEL))
+ else if (label == INV_PARENT_ID_LABEL)
{
- setParent(cat_data[INV_PARENT_ID_LABEL].asUUID());
+ setParent(value.asUUID());
+ return true;
}
- if (cat_data.has(INV_ASSET_TYPE_LABEL))
+ else if (label == INV_ASSET_TYPE_LABEL)
{
- setType(LLAssetType::lookup(cat_data[INV_ASSET_TYPE_LABEL].asString()));
+ setType(LLAssetType::lookup(value.asString()));
+ return true;
}
- if (cat_data.has(INV_PREFERRED_TYPE_LABEL))
+ else if (label == INV_PREFERRED_TYPE_LABEL)
{
- setPreferredType(LLFolderType::lookup(cat_data[INV_PREFERRED_TYPE_LABEL].asString()));
+ setPreferredType(LLFolderType::lookup(value.asString()));
+ return true;
}
- if (cat_data.has(INV_THUMBNAIL_LABEL))
+ else if (label == INV_THUMBNAIL_LABEL)
{
LLUUID thumbnail_uuid;
- const LLSD &thumbnail_data = cat_data[INV_THUMBNAIL_LABEL];
- if (thumbnail_data.has(INV_ASSET_ID_LABEL))
+ if (value.has(INV_ASSET_ID_LABEL))
{
- thumbnail_uuid = thumbnail_data[INV_ASSET_ID_LABEL].asUUID();
+ thumbnail_uuid = value[INV_ASSET_ID_LABEL].asUUID();
}
setThumbnailUUID(thumbnail_uuid);
+ return true;
+ }
+ if (label == INV_FAVORITE_LABEL)
+ {
+ bool favorite = false;
+ if (value.has(INV_TOGGLED_LABEL))
+ {
+ favorite = value[INV_TOGGLED_LABEL].asBoolean();
+ }
+ setFavorite(favorite);
}
- if (cat_data.has(INV_NAME_LABEL))
+ else if (label == INV_NAME_LABEL)
{
- mName = cat_data[INV_NAME_LABEL].asString();
+ mName = value.asString();
LLStringUtil::replaceNonstandardASCII(mName, ' ');
LLStringUtil::replaceChar(mName, '|', ' ');
+ return true;
}
-
- return true;
+ return false;
}
+
///----------------------------------------------------------------------------
-/// Local function definitions
+/// Local function definitions for testing purposes
///----------------------------------------------------------------------------
LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item)
diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h
index e63f2deba7..181c46226c 100644
--- a/indra/llinventory/llinventory.h
+++ b/indra/llinventory/llinventory.h
@@ -71,6 +71,7 @@ public:
virtual const LLUUID& getLinkedUUID() const; // inventoryID that this item points to, else this item's inventoryID
const LLUUID& getParentUUID() const;
virtual const LLUUID& getThumbnailUUID() const;
+ virtual bool getIsFavorite() const;
virtual const std::string& getName() const;
virtual LLAssetType::EType getType() const;
LLAssetType::EType getActualType() const; // bypasses indirection for linked items
@@ -86,6 +87,7 @@ public:
virtual void rename(const std::string& new_name);
void setParent(const LLUUID& new_parent);
virtual void setThumbnailUUID(const LLUUID& thumbnail_uuid);
+ virtual void setFavorite(bool favorite);
void setType(LLAssetType::EType type);
virtual void setCreationDate(time_t creation_date_utc); // only stored for items
@@ -111,6 +113,7 @@ protected:
LLUUID mUUID;
LLUUID mParentUUID; // Parent category. Root categories have LLUUID::NULL.
LLUUID mThumbnailUUID;
+ bool mFavorite;
LLAssetType::EType mType;
std::string mName;
time_t mCreationDate; // seconds from 1/1/1970, UTC
@@ -270,8 +273,9 @@ public:
virtual bool importLegacyStream(std::istream& input_stream);
virtual bool exportLegacyStream(std::ostream& output_stream, bool include_asset_key = true) const;
- LLSD exportLLSD() const;
- bool importLLSD(const LLSD& cat_data);
+ virtual void exportLLSD(LLSD& sd) const;
+ bool importLLSDMap(const LLSD& cat_data);
+ virtual bool importLLSD(const std::string& label, const LLSD& value);
//--------------------------------------------------------------------
// Member Variables
//--------------------------------------------------------------------
@@ -285,6 +289,7 @@ protected:
//
// These functions convert between structured data and an inventory
// item, appropriate for serialization.
+// Not up to date (no favorites, nor thumbnails), for testing purposes
//-----------------------------------------------------------------------------
LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item);
LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat);
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index 67d713db1f..ac50b428bf 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -37,98 +37,98 @@
#include "llsettingsdaycycle.h"
// Grid out of which parcels taken is stepped every 4 meters.
-const F32 PARCEL_GRID_STEP_METERS = 4.f;
+constexpr F32 PARCEL_GRID_STEP_METERS = 4.f;
// Area of one "square" of parcel
-const S32 PARCEL_UNIT_AREA = 16;
+constexpr S32 PARCEL_UNIT_AREA = 16;
// Height _above_ground_ that parcel boundary ends
-const F32 PARCEL_HEIGHT = 50.f;
+constexpr F32 PARCEL_HEIGHT = 50.f;
//Height above ground which parcel boundries exist for explicitly banned avatars
-const F32 BAN_HEIGHT = 5000.f;
+constexpr F32 BAN_HEIGHT = 5000.f;
// Maximum number of entries in an access list
-const S32 PARCEL_MAX_ACCESS_LIST = 300;
+constexpr S32 PARCEL_MAX_ACCESS_LIST = 300;
//Maximum number of entires in an update packet
//for access/ban lists.
-const F32 PARCEL_MAX_ENTRIES_PER_PACKET = 48.f;
+constexpr F32 PARCEL_MAX_ENTRIES_PER_PACKET = 48.f;
// Maximum number of experiences
-const S32 PARCEL_MAX_EXPERIENCE_LIST = 24;
+constexpr S32 PARCEL_MAX_EXPERIENCE_LIST = 24;
// Weekly charge for listing a parcel in the directory
-const S32 PARCEL_DIRECTORY_FEE = 30;
+constexpr S32 PARCEL_DIRECTORY_FEE = 30;
-const S32 PARCEL_PASS_PRICE_DEFAULT = 10;
-const F32 PARCEL_PASS_HOURS_DEFAULT = 1.f;
+constexpr S32 PARCEL_PASS_PRICE_DEFAULT = 10;
+constexpr F32 PARCEL_PASS_HOURS_DEFAULT = 1.f;
// Number of "chunks" in which parcel overlay data is sent
// Chunk 0 = southern rows, entire width
-const S32 PARCEL_OVERLAY_CHUNKS = 4;
+constexpr S32 PARCEL_OVERLAY_CHUNKS = 4;
// Bottom three bits are a color index for the land overlay
-const U8 PARCEL_COLOR_MASK = 0x07;
-const U8 PARCEL_PUBLIC = 0x00;
-const U8 PARCEL_OWNED = 0x01;
-const U8 PARCEL_GROUP = 0x02;
-const U8 PARCEL_SELF = 0x03;
-const U8 PARCEL_FOR_SALE = 0x04;
-const U8 PARCEL_AUCTION = 0x05;
+constexpr U8 PARCEL_COLOR_MASK = 0x07;
+constexpr U8 PARCEL_PUBLIC = 0x00;
+constexpr U8 PARCEL_OWNED = 0x01;
+constexpr U8 PARCEL_GROUP = 0x02;
+constexpr U8 PARCEL_SELF = 0x03;
+constexpr U8 PARCEL_FOR_SALE = 0x04;
+constexpr U8 PARCEL_AUCTION = 0x05;
// unused 0x06
// unused 0x07
// flag, unused 0x08
-const U8 PARCEL_HIDDENAVS = 0x10; // avatars not visible outside of parcel. Used for 'see avs' feature, but must be off for compatibility
-const U8 PARCEL_SOUND_LOCAL = 0x20;
-const U8 PARCEL_WEST_LINE = 0x40; // flag, property line on west edge
-const U8 PARCEL_SOUTH_LINE = 0x80; // flag, property line on south edge
+constexpr U8 PARCEL_HIDDENAVS = 0x10; // avatars not visible outside of parcel. Used for 'see avs' feature, but must be off for compatibility
+constexpr U8 PARCEL_SOUND_LOCAL = 0x20;
+constexpr U8 PARCEL_WEST_LINE = 0x40; // flag, property line on west edge
+constexpr U8 PARCEL_SOUTH_LINE = 0x80; // flag, property line on south edge
// Transmission results for parcel properties
-const S32 PARCEL_RESULT_NO_DATA = -1;
-const S32 PARCEL_RESULT_SUCCESS = 0; // got exactly one parcel
-const S32 PARCEL_RESULT_MULTIPLE = 1; // got multiple parcels
-
-const S32 SELECTED_PARCEL_SEQ_ID = -10000;
-const S32 COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID = -20000;
-const S32 COLLISION_BANNED_PARCEL_SEQ_ID = -30000;
-const S32 COLLISION_NOT_ON_LIST_PARCEL_SEQ_ID = -40000;
-const S32 HOVERED_PARCEL_SEQ_ID = -50000;
-
-const U32 RT_NONE = 0x1 << 0;
-const U32 RT_OWNER = 0x1 << 1;
-const U32 RT_GROUP = 0x1 << 2;
-const U32 RT_OTHER = 0x1 << 3;
-const U32 RT_LIST = 0x1 << 4;
-const U32 RT_SELL = 0x1 << 5;
-
-const S32 INVALID_PARCEL_ID = -1;
-
-const S32 INVALID_PARCEL_ENVIRONMENT_VERSION = -2;
+constexpr S32 PARCEL_RESULT_NO_DATA = -1;
+constexpr S32 PARCEL_RESULT_SUCCESS = 0; // got exactly one parcel
+constexpr S32 PARCEL_RESULT_MULTIPLE = 1; // got multiple parcels
+
+constexpr S32 SELECTED_PARCEL_SEQ_ID = -10000;
+constexpr S32 COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID = -20000;
+constexpr S32 COLLISION_BANNED_PARCEL_SEQ_ID = -30000;
+constexpr S32 COLLISION_NOT_ON_LIST_PARCEL_SEQ_ID = -40000;
+constexpr S32 HOVERED_PARCEL_SEQ_ID = -50000;
+
+constexpr U32 RT_NONE = 0x1 << 0;
+constexpr U32 RT_OWNER = 0x1 << 1;
+constexpr U32 RT_GROUP = 0x1 << 2;
+constexpr U32 RT_OTHER = 0x1 << 3;
+constexpr U32 RT_LIST = 0x1 << 4;
+constexpr U32 RT_SELL = 0x1 << 5;
+
+constexpr S32 INVALID_PARCEL_ID = -1;
+
+constexpr S32 INVALID_PARCEL_ENVIRONMENT_VERSION = -2;
// if Region settings are used, parcel env. version is -1
-const S32 UNSET_PARCEL_ENVIRONMENT_VERSION = -1;
+constexpr S32 UNSET_PARCEL_ENVIRONMENT_VERSION = -1;
// Timeouts for parcels
// default is 21 days * 24h/d * 60m/h * 60s/m *1000000 usec/s = 1814400000000
-const U64 DEFAULT_USEC_CONVERSION_TIMEOUT = U64L(1814400000000);
+constexpr U64 DEFAULT_USEC_CONVERSION_TIMEOUT = U64L(1814400000000);
// ***** TESTING is 10 minutes
//const U64 DEFAULT_USEC_CONVERSION_TIMEOUT = U64L(600000000);
// group is 60 days * 24h/d * 60m/h * 60s/m *1000000 usec/s = 5184000000000
-const U64 GROUP_USEC_CONVERSION_TIMEOUT = U64L(5184000000000);
+constexpr U64 GROUP_USEC_CONVERSION_TIMEOUT = U64L(5184000000000);
// ***** TESTING is 10 minutes
//const U64 GROUP_USEC_CONVERSION_TIMEOUT = U64L(600000000);
// default sale timeout is 2 days -> 172800000000
-const U64 DEFAULT_USEC_SALE_TIMEOUT = U64L(172800000000);
+constexpr U64 DEFAULT_USEC_SALE_TIMEOUT = U64L(172800000000);
// ***** TESTING is 10 minutes
//const U64 DEFAULT_USEC_SALE_TIMEOUT = U64L(600000000);
// more grace period extensions.
-const U64 SEVEN_DAYS_IN_USEC = U64L(604800000000);
+constexpr U64 SEVEN_DAYS_IN_USEC = U64L(604800000000);
// if more than 100,000s before sale revert, and no extra extension
// has been given, go ahead and extend it more. That's about 1.2 days.
-const S32 EXTEND_GRACE_IF_MORE_THAN_SEC = 100000;
+constexpr S32 EXTEND_GRACE_IF_MORE_THAN_SEC = 100000;
@@ -250,9 +250,9 @@ public:
void setMediaURL(const std::string& url);
void setMediaType(const std::string& type);
void setMediaDesc(const std::string& desc);
- void setMediaID(const LLUUID& id) { mMediaID = id; }
- void setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
- void setMediaLoop (U8 loop) { mMediaLoop = loop; }
+ void setMediaID(const LLUUID& id) { mMediaID = id; }
+ void setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
+ void setMediaLoop(U8 loop) { mMediaLoop = loop; }
void setMediaWidth(S32 width);
void setMediaHeight(S32 height);
void setMediaCurrentURL(const std::string& url);
@@ -262,6 +262,8 @@ public:
void setMediaURLResetTimer(F32 time);
virtual void setLocalID(S32 local_id);
+ void setRegionID(const LLUUID& id) { mRegionID = id; }
+ const LLUUID& getRegionID() const { return mRegionID; }
// blow away all the extra stuff lurking in parcels, including urls, access lists, etc
void clearParcel();
@@ -651,6 +653,7 @@ public:
S32 mLocalID;
LLUUID mBanListTransactionID;
LLUUID mAccessListTransactionID;
+ LLUUID mRegionID;
std::map<LLUUID,LLAccessEntry> mAccessList;
std::map<LLUUID,LLAccessEntry> mBanList;
std::map<LLUUID,LLAccessEntry> mTempBanList;
diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp
index c8963881df..b17e22e465 100644
--- a/indra/llinventory/llpermissions.cpp
+++ b/indra/llinventory/llpermissions.cpp
@@ -704,6 +704,80 @@ bool LLPermissions::exportLegacyStream(std::ostream& output_stream) const
return true;
}
+static const std::string PERM_CREATOR_ID_LABEL("creator_id");
+static const std::string PERM_OWNER_ID_LABEL("owner_id");
+static const std::string PERM_LAST_OWNER_ID_LABEL("last_owner_id");
+static const std::string PERM_GROUP_ID_LABEL("group_id");
+static const std::string PERM_IS_OWNER_GROUP_LABEL("is_owner_group");
+static const std::string PERM_BASE_MASK_LABEL("base_mask");
+static const std::string PERM_OWNER_MASK_LABEL("owner_mask");
+static const std::string PERM_GROUP_MASK_LABEL("group_mask");
+static const std::string PERM_EVERYONE_MASK_LABEL("everyone_mask");
+static const std::string PERM_NEXT_OWNER_MASK_LABEL("next_owner_mask");
+
+void LLPermissions::importLLSD(const LLSD& sd_perm)
+{
+ LLSD::map_const_iterator i, end;
+ end = sd_perm.endMap();
+ for (i = sd_perm.beginMap(); i != end; ++i)
+ {
+ const std::string& label = i->first;
+ if (label == PERM_CREATOR_ID_LABEL)
+ {
+ mCreator = i->second.asUUID();
+ continue;
+ }
+ if (label == PERM_OWNER_ID_LABEL)
+ {
+ mOwner = i->second.asUUID();
+ continue;
+ }
+ if (label == PERM_LAST_OWNER_ID_LABEL)
+ {
+ mLastOwner = i->second.asUUID();
+ continue;
+ }
+ if (label == PERM_GROUP_ID_LABEL)
+ {
+ mGroup = i->second.asUUID();
+ continue;
+ }
+ if (label == PERM_BASE_MASK_LABEL)
+ {
+ PermissionMask mask = i->second.asInteger();
+ mMaskBase = mask;
+ continue;
+ }
+ if (label == PERM_OWNER_MASK_LABEL)
+ {
+ PermissionMask mask = i->second.asInteger();
+ mMaskOwner = mask;
+ continue;
+ }
+ if (label == PERM_EVERYONE_MASK_LABEL)
+ {
+ PermissionMask mask = i->second.asInteger();
+ mMaskEveryone = mask;
+ continue;
+ }
+ if (label == PERM_GROUP_MASK_LABEL)
+ {
+ PermissionMask mask = i->second.asInteger();
+ mMaskGroup = mask;
+ continue;
+ }
+ if (label == PERM_NEXT_OWNER_MASK_LABEL)
+ {
+ PermissionMask mask = i->second.asInteger();
+ mMaskNextOwner = mask;
+ continue;
+ }
+ }
+
+ fixOwnership();
+ fix();
+}
+
bool LLPermissions::operator==(const LLPermissions &rhs) const
{
return
@@ -998,55 +1072,30 @@ std::string mask_to_string(U32 mask)
///----------------------------------------------------------------------------
/// exported functions
///----------------------------------------------------------------------------
-static const std::string PERM_CREATOR_ID_LABEL("creator_id");
-static const std::string PERM_OWNER_ID_LABEL("owner_id");
-static const std::string PERM_LAST_OWNER_ID_LABEL("last_owner_id");
-static const std::string PERM_GROUP_ID_LABEL("group_id");
-static const std::string PERM_IS_OWNER_GROUP_LABEL("is_owner_group");
-static const std::string PERM_BASE_MASK_LABEL("base_mask");
-static const std::string PERM_OWNER_MASK_LABEL("owner_mask");
-static const std::string PERM_GROUP_MASK_LABEL("group_mask");
-static const std::string PERM_EVERYONE_MASK_LABEL("everyone_mask");
-static const std::string PERM_NEXT_OWNER_MASK_LABEL("next_owner_mask");
LLSD ll_create_sd_from_permissions(const LLPermissions& perm)
{
LLSD rv;
+ ll_fill_sd_from_permissions(rv, perm);
+ return rv;
+}
+void ll_fill_sd_from_permissions(LLSD& rv, const LLPermissions& perm)
+{
rv[PERM_CREATOR_ID_LABEL] = perm.getCreator();
rv[PERM_OWNER_ID_LABEL] = perm.getOwner();
rv[PERM_LAST_OWNER_ID_LABEL] = perm.getLastOwner();
rv[PERM_GROUP_ID_LABEL] = perm.getGroup();
rv[PERM_IS_OWNER_GROUP_LABEL] = perm.isGroupOwned();
- rv[PERM_BASE_MASK_LABEL] = (S32)perm.getMaskBase();
- rv[PERM_OWNER_MASK_LABEL] = (S32)perm.getMaskOwner();
- rv[PERM_GROUP_MASK_LABEL] = (S32)perm.getMaskGroup();
- rv[PERM_EVERYONE_MASK_LABEL] = (S32)perm.getMaskEveryone();
- rv[PERM_NEXT_OWNER_MASK_LABEL] = (S32)perm.getMaskNextOwner();
- return rv;
+ rv[PERM_BASE_MASK_LABEL] = (LLSD::Integer)perm.getMaskBase();
+ rv[PERM_OWNER_MASK_LABEL] = (LLSD::Integer)perm.getMaskOwner();
+ rv[PERM_GROUP_MASK_LABEL] = (LLSD::Integer)perm.getMaskGroup();
+ rv[PERM_EVERYONE_MASK_LABEL] = (LLSD::Integer)perm.getMaskEveryone();
+ rv[PERM_NEXT_OWNER_MASK_LABEL] = (LLSD::Integer)perm.getMaskNextOwner();
}
LLPermissions ll_permissions_from_sd(const LLSD& sd_perm)
{
LLPermissions rv;
- rv.init(
- sd_perm[PERM_CREATOR_ID_LABEL].asUUID(),
- sd_perm[PERM_OWNER_ID_LABEL].asUUID(),
- sd_perm[PERM_LAST_OWNER_ID_LABEL].asUUID(),
- sd_perm[PERM_GROUP_ID_LABEL].asUUID());
-
- // We do a cast to U32 here since LLSD does not attempt to
- // represent unsigned ints.
- PermissionMask mask;
- mask = (U32)(sd_perm[PERM_BASE_MASK_LABEL].asInteger());
- rv.setMaskBase(mask);
- mask = (U32)(sd_perm[PERM_OWNER_MASK_LABEL].asInteger());
- rv.setMaskOwner(mask);
- mask = (U32)(sd_perm[PERM_EVERYONE_MASK_LABEL].asInteger());
- rv.setMaskEveryone(mask);
- mask = (U32)(sd_perm[PERM_GROUP_MASK_LABEL].asInteger());
- rv.setMaskGroup(mask);
- mask = (U32)(sd_perm[PERM_NEXT_OWNER_MASK_LABEL].asInteger());
- rv.setMaskNext(mask);
- rv.fix();
+ rv.importLLSD(sd_perm);
return rv;
}
diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h
index a68abcfa34..82cdc03727 100644
--- a/indra/llinventory/llpermissions.h
+++ b/indra/llinventory/llpermissions.h
@@ -299,6 +299,8 @@ public:
bool importLegacyStream(std::istream& input_stream);
bool exportLegacyStream(std::ostream& output_stream) const;
+ void importLLSD(const LLSD& sd_perm);
+
bool operator==(const LLPermissions &rhs) const;
bool operator!=(const LLPermissions &rhs) const;
@@ -435,6 +437,7 @@ protected:
// like 'creator_id', 'owner_id', etc, with the value copied from the
// permission object.
LLSD ll_create_sd_from_permissions(const LLPermissions& perm);
+void ll_fill_sd_from_permissions(LLSD& rv, const LLPermissions& perm);
LLPermissions ll_permissions_from_sd(const LLSD& sd_perm);
#endif
diff --git a/indra/llinventory/llsaleinfo.cpp b/indra/llinventory/llsaleinfo.cpp
index 35bbc1dbb1..b4d64bb4fb 100644
--- a/indra/llinventory/llsaleinfo.cpp
+++ b/indra/llinventory/llsaleinfo.cpp
@@ -90,15 +90,20 @@ bool LLSaleInfo::exportLegacyStream(std::ostream& output_stream) const
LLSD LLSaleInfo::asLLSD() const
{
LLSD sd;
+ asLLSD(sd);
+ return sd;
+}
+
+void LLSaleInfo::asLLSD(LLSD& sd) const
+{
const char* type = lookup(mSaleType);
if (!type)
{
LL_WARNS_ONCE() << "Unknown sale type: " << mSaleType << LL_ENDL;
type = lookup(LLSaleInfo::FS_NOT);
}
- sd["sale_type"] = type;
+ sd["sale_type"] = std::string(type);
sd["sale_price"] = mSalePrice;
- return sd;
}
bool LLSaleInfo::fromLLSD(const LLSD& sd, bool& has_perm_mask, U32& perm_mask)
diff --git a/indra/llinventory/llsaleinfo.h b/indra/llinventory/llsaleinfo.h
index 44eb841641..7186e8ab49 100644
--- a/indra/llinventory/llsaleinfo.h
+++ b/indra/llinventory/llsaleinfo.h
@@ -86,6 +86,7 @@ public:
bool exportLegacyStream(std::ostream& output_stream) const;
LLSD asLLSD() const;
+ void asLLSD(LLSD &sd) const;
operator LLSD() const { return asLLSD(); }
bool fromLLSD(const LLSD& sd, bool& has_perm_mask, U32& perm_mask);
bool importLegacyStream(std::istream& input_stream, bool& has_perm_mask, U32& perm_mask);
diff --git a/indra/llinventory/llsettingsbase.cpp b/indra/llinventory/llsettingsbase.cpp
index 97979d64e3..5bd490974b 100644
--- a/indra/llinventory/llsettingsbase.cpp
+++ b/indra/llinventory/llsettingsbase.cpp
@@ -361,14 +361,12 @@ LLSD LLSettingsBase::interpolateSDValue(const std::string& key_name, const LLSD
new_array = q.getValue();
}
else
- { // TODO: We could expand this to inspect the type and do a deep lerp based on type.
- // for now assume a heterogeneous array of reals.
+ {
size_t len = std::max(value.size(), other_value.size());
for (size_t i = 0; i < len; ++i)
{
-
- new_array[i] = lerp((F32)value[i].asReal(), (F32)other_value[i].asReal(), (F32)mix);
+ new_array[i] = interpolateSDValue(key_name, value[i], other_value[i], defaults, mix, skip, slerps);
}
}
diff --git a/indra/llinventory/llsettingsbase.h b/indra/llinventory/llsettingsbase.h
index 7de71588ef..bea6fdec97 100644
--- a/indra/llinventory/llsettingsbase.h
+++ b/indra/llinventory/llsettingsbase.h
@@ -398,7 +398,7 @@ protected:
private:
bool mLLSDDirty;
- bool mDirty;
+ bool mDirty; // gates updateSettings
bool mReplaced; // super dirty!
static LLSD combineSDMaps(const LLSD &first, const LLSD &other);
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index e8ecc94b4b..1e5a2280e3 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -658,15 +658,16 @@ void LLSettingsSky::blend(LLSettingsBase::ptr_t &end, F64 blendf)
mHasLegacyHaze |= lerp_legacy_float(mHazeDensity, mLegacyHazeDensity, other->mHazeDensity, other->mLegacyHazeDensity, 0.7f, (F32)blendf);
mHasLegacyHaze |= lerp_legacy_float(mDistanceMultiplier, mLegacyDistanceMultiplier, other->mDistanceMultiplier, other->mLegacyDistanceMultiplier, 0.8f, (F32)blendf);
mHasLegacyHaze |= lerp_legacy_float(mDensityMultiplier, mLegacyDensityMultiplier, other->mDensityMultiplier, other->mLegacyDensityMultiplier, 0.0001f, (F32)blendf);
+ mHasLegacyHaze |= lerp_legacy_color(mAmbientColor, mLegacyAmbientColor, other->mAmbientColor, other->mLegacyAmbientColor, LLColor3(0.25f, 0.25f, 0.25f), (F32)blendf);
mHasLegacyHaze |= lerp_legacy_color(mBlueHorizon, mLegacyBlueHorizon, other->mBlueHorizon, other->mLegacyBlueHorizon, LLColor3(0.4954f, 0.4954f, 0.6399f), (F32)blendf);
mHasLegacyHaze |= lerp_legacy_color(mBlueDensity, mLegacyBlueDensity, other->mBlueDensity, other->mLegacyBlueDensity, LLColor3(0.2447f, 0.4487f, 0.7599f), (F32)blendf);
parammapping_t defaults = other->getParameterMap();
stringset_t skip = getSkipInterpolateKeys();
stringset_t slerps = getSlerpKeys();
- mAbsorptionConfigs = interpolateSDMap(mAbsorptionConfigs, other->mAbsorptionConfigs, defaults, blendf, skip, slerps);
- mMieConfigs = interpolateSDMap(mMieConfigs, other->mMieConfigs, defaults, blendf, skip, slerps);
- mRayleighConfigs = interpolateSDMap(mRayleighConfigs, other->mRayleighConfigs, defaults, blendf, skip, slerps);
+ mAbsorptionConfigs = interpolateSDValue("absorption_config", mAbsorptionConfigs, other->mAbsorptionConfigs, defaults, blendf, skip, slerps);
+ mMieConfigs = interpolateSDValue("mie_config", mMieConfigs, other->mMieConfigs, defaults, blendf, skip, slerps);
+ mRayleighConfigs = interpolateSDValue("rayleigh_config", mRayleighConfigs, other->mRayleighConfigs, defaults, blendf, skip, slerps);
setDirtyFlag(true);
setReplaced();
@@ -1933,6 +1934,7 @@ LLUUID LLSettingsSky::getCloudNoiseTextureId() const
void LLSettingsSky::setCloudNoiseTextureId(const LLUUID &id)
{
mCloudTextureId = id;
+ setDirtyFlag(true);
setLLSDDirty();
}
@@ -1977,6 +1979,7 @@ LLVector2 LLSettingsSky::getCloudScrollRate() const
void LLSettingsSky::setCloudScrollRate(const LLVector2 &val)
{
mScrollRate = val;
+ setDirtyFlag(true);
setLLSDDirty();
}
@@ -2135,6 +2138,7 @@ LLUUID LLSettingsSky::getMoonTextureId() const
void LLSettingsSky::setMoonTextureId(LLUUID id)
{
mMoonTextureId = id;
+ setDirtyFlag(true);
setLLSDDirty();
}
@@ -2219,6 +2223,7 @@ LLUUID LLSettingsSky::getSunTextureId() const
void LLSettingsSky::setSunTextureId(LLUUID id)
{
mSunTextureId = id;
+ setDirtyFlag(true);
setLLSDDirty();
}
diff --git a/indra/llinventory/tests/inventorymisc_test.cpp b/indra/llinventory/tests/inventorymisc_test.cpp
index 9779cb8fbc..f11a4c3bf7 100644
--- a/indra/llinventory/tests/inventorymisc_test.cpp
+++ b/indra/llinventory/tests/inventorymisc_test.cpp
@@ -39,6 +39,34 @@
#pragma warning(disable: 4702)
#endif
+void set_random_inventory_metadata(LLInventoryObject* obj)
+{
+ S32 extra = rand() % 4;
+ switch (extra)
+ {
+ case 0:
+ {
+ LLUUID thumbnail_id;
+ thumbnail_id.generate();
+ obj->setThumbnailUUID(thumbnail_id);
+ break;
+ }
+ case 1:
+ obj->setFavorite(true);
+ break;
+ case 2:
+ {
+ LLUUID thumbnail_id;
+ thumbnail_id.generate();
+ obj->setThumbnailUUID(thumbnail_id);
+ obj->setFavorite(true);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
LLPointer<LLInventoryItem> create_random_inventory_item()
{
LLUUID item_id;
@@ -75,6 +103,7 @@ LLPointer<LLInventoryItem> create_random_inventory_item()
sale_info,
flags,
creation);
+ set_random_inventory_metadata(item);
return item;
}
@@ -90,6 +119,7 @@ LLPointer<LLInventoryCategory> create_random_inventory_cat()
parent_id,
LLFolderType::FT_NONE,
std::string("Sample category"));
+ set_random_inventory_metadata(cat);
return cat;
}
@@ -290,6 +320,7 @@ namespace tut
src->setCreationDate(new_creation);
// test a save/load cycle to LLSD and back again
+ // Note: ll_create_sd_from_inventory_item does not support metadata
LLSD sd = ll_create_sd_from_inventory_item(src);
LLPointer<LLInventoryItem> dst = new LLInventoryItem;
bool successful_parse = dst->fromLLSD(sd);
@@ -329,7 +360,9 @@ namespace tut
}
LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(src1->asLLSD()) << std::endl;
+ LLSD sd;
+ src1->asLLSD(sd);
+ fileXML << LLSDOStreamer<LLSDNotationFormatter>(sd) << std::endl;
fileXML.close();
@@ -364,13 +397,13 @@ namespace tut
ensure_equals("8.name::getName() failed", src1->getName(), src2->getName());
ensure_equals("9.description::getDescription() failed", src1->getDescription(), src2->getDescription());
ensure_equals("10.creation::getCreationDate() failed", src1->getCreationDate(), src2->getCreationDate());
-
+ ensure_equals("13.thumbnails::getThumbnailUUID() failed", src1->getThumbnailUUID(), src2->getThumbnailUUID());
+ ensure_equals("14.favorites::getIsFavorite() failed", src1->getIsFavorite(), src2->getIsFavorite());
}
template<> template<>
void inventory_object::test<8>()
{
-
LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
std::ostringstream ostream;
@@ -390,8 +423,8 @@ namespace tut
ensure_equals("8.name::getName() failed", src1->getName(), src2->getName());
ensure_equals("9.description::getDescription() failed", src1->getDescription(), src2->getDescription());
ensure_equals("10.creation::getCreationDate() failed", src1->getCreationDate(), src2->getCreationDate());
-
-
+ ensure_equals("11.thumbnails::getThumbnailUUID() failed", src1->getThumbnailUUID(), src2->getThumbnailUUID());
+ ensure_equals("12.favorites::getIsFavorite() failed", false, src2->getIsFavorite()); // not supposed to carry over
}
template<> template<>
@@ -421,6 +454,8 @@ namespace tut
ensure_equals("10.name::getName() failed", src1->getName(), src2->getName());
ensure_equals("11.description::getDescription() failed", src1->getDescription(), src2->getDescription());
ensure_equals("12.creation::getCreationDate() failed", src1->getCreationDate(), src2->getCreationDate());
+ ensure_equals("13.thumbnails::getThumbnailUUID() failed", src1->getThumbnailUUID(), src2->getThumbnailUUID());
+ ensure_equals("14.favorites::getIsFavorite() failed", src1->getIsFavorite(), src2->getIsFavorite());
}
//******class LLInventoryCategory*******//
@@ -458,7 +493,9 @@ namespace tut
}
LLPointer<LLInventoryCategory> src1 = create_random_inventory_cat();
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(src1->exportLLSD()) << std::endl;
+ LLSD sd;
+ src1->exportLLSD(sd);
+ fileXML << LLSDOStreamer<LLSDNotationFormatter>(sd) << std::endl;
fileXML.close();
llifstream file(filename.c_str());
@@ -481,13 +518,15 @@ namespace tut
file.close();
LLPointer<LLInventoryCategory> src2 = new LLInventoryCategory();
- src2->importLLSD(s_item);
+ src2->importLLSDMap(s_item);
ensure_equals("1.item id::getUUID() failed", src1->getUUID(), src2->getUUID());
ensure_equals("2.parent::getParentUUID() failed", src1->getParentUUID(), src2->getParentUUID());
ensure_equals("3.type::getType() failed", src1->getType(), src2->getType());
ensure_equals("4.preferred type::getPreferredType() failed", src1->getPreferredType(), src2->getPreferredType());
ensure_equals("5.name::getName() failed", src1->getName(), src2->getName());
+ ensure_equals("6.thumbnails::getThumbnailUUID() failed", src1->getThumbnailUUID(), src2->getThumbnailUUID());
+ ensure_equals("7.favorites::getIsFavorite() failed", src1->getIsFavorite(), src2->getIsFavorite());
}
template<> template<>
@@ -507,6 +546,7 @@ namespace tut
ensure_equals("3.type::getType() failed", src1->getType(), src2->getType());
ensure_equals("4.preferred type::getPreferredType() failed", src1->getPreferredType(), src2->getPreferredType());
ensure_equals("5.name::getName() failed", src1->getName(), src2->getName());
-
+ ensure_equals("13.thumbnails::getThumbnailUUID() failed", src1->getThumbnailUUID(), src2->getThumbnailUUID());
+ ensure_equals("14.favorites::getIsFavorite() failed", false, src2->getIsFavorite()); // currently not supposed to carry over
}
}
diff --git a/indra/llkdu/CMakeLists.txt b/indra/llkdu/CMakeLists.txt
index 7cd9f5eb24..411fff34ae 100644
--- a/indra/llkdu/CMakeLists.txt
+++ b/indra/llkdu/CMakeLists.txt
@@ -27,14 +27,6 @@ set(llkdu_HEADER_FILES
list(APPEND llkdu_SOURCE_FILES ${llkdu_HEADER_FILES})
-# Our KDU package is built with KDU_X86_INTRINSICS in its .vcxproj file.
-# Unless that macro is also set for every consumer build, KDU freaks out,
-# spamming the viewer log with alignment FUD.
-set_source_files_properties(${llkdu_SOURCE_FILES}
- PROPERTIES
- COMPILE_DEFINITIONS
- "KDU_X86_INTRINSICS")
-
if (USE_KDU)
add_library (llkdu ${llkdu_SOURCE_FILES})
@@ -42,10 +34,7 @@ if (USE_KDU)
target_include_directories( llkdu INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
# Add tests
- # ND: llkdu tests are very strange as they include stubs for KDU classes/methods
- # if not having access to the right KDU version this test will fail to compile, incidentally I do not
- # have access to a matching version of KDU and thus cannot get this tests to compile
- if (LL_TESTS_KDU)
+ if (LL_TESTS)
include(LLAddBuildTest)
include(Tut)
SET(llkdu_TEST_SOURCE_FILES
@@ -62,6 +51,6 @@ if (USE_KDU)
set_property( SOURCE ${llkdu_TEST_SOURCE_FILES} PROPERTY LL_TEST_ADDITIONAL_INCLUDE_DIRS ${llimage_include_dir})
LL_ADD_PROJECT_UNIT_TESTS(llkdu "${llkdu_TEST_SOURCE_FILES}")
- endif (LL_TESTS_KDU)
+ endif (LL_TESTS)
endif (USE_KDU)
diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp
index 0d1f2b3006..7eba9494a6 100644
--- a/indra/llkdu/llimagej2ckdu.cpp
+++ b/indra/llkdu/llimagej2ckdu.cpp
@@ -163,6 +163,7 @@ private:
S32 mNumComponents;
bool mUseYCC;
kdu_dims mDims;
+ kdu_push_pull_params mParams;
kdu_sample_allocator mAllocator;
kdu_tile_comp mComps[4];
kdu_line_buf mLines[4];
@@ -255,7 +256,7 @@ LLImageJ2CKDU::LLImageJ2CKDU() : LLImageJ2CImpl(),
mCodeStreamp(),
mTPosp(),
mTileIndicesp(),
- mRawImagep(NULL),
+ mRawImagep(nullptr),
mDecodeState(),
mBlocksSize(-1),
mPrecinctsSize(-1),
@@ -295,17 +296,17 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECod
// two U32s and a pointer, so it's not as if it would be a huge overhead
// to allocate a new one every time.
// Also -- why is base.getData() tested specifically here? If that returns
- // NULL, shouldn't we bail out of the whole method?
+ // nullptr, shouldn't we bail out of the whole method?
if (!mInputp && base.getData())
{
// The compressed data has been loaded
// Setup the source for the codestream
- mInputp.reset(new LLKDUMemSource(base.getData(), data_size));
+ mInputp = std::make_unique<LLKDUMemSource>(base.getData(), data_size);
}
if (mInputp)
{
- // This is LLKDUMemSource::reset(), not boost::scoped_ptr::reset().
+ // This is LLKDUMemSource::reset(), not std::unique_ptr::reset().
mInputp->reset();
}
@@ -315,7 +316,7 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECod
// *TODO: This seems to be wrong. The base class should have no idea of
// how j2c compression works so no good way of computing what's the byte
// range to be used.
- mCodeStreamp->set_max_bytes(max_bytes, true);
+ mCodeStreamp->set_max_bytes(max_bytes);
// If you want to flip or rotate the image for some reason, change
// the resolution, or identify a restricted region of interest, this is
@@ -461,8 +462,8 @@ bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
mCodeStreamp->change_appearance(false, true, false);
// Apply loading discard level and cropping if required
- kdu_dims* region_kdu = NULL;
- if (region != NULL)
+ kdu_dims* region_kdu = nullptr;
+ if (region != nullptr)
{
region_kdu = new kdu_dims;
region_kdu->pos.x = region[0];
@@ -479,7 +480,7 @@ bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
if (region_kdu)
{
delete region_kdu;
- region_kdu = NULL;
+ region_kdu = nullptr;
}
// Resize raw_image according to the image to be decoded
@@ -490,12 +491,12 @@ bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
if (!mTileIndicesp)
{
- mTileIndicesp.reset(new kdu_dims);
+ mTileIndicesp = std::make_unique<kdu_dims>();
}
mCodeStreamp->get_valid_tiles(*mTileIndicesp);
if (!mTPosp)
{
- mTPosp.reset(new kdu_coords);
+ mTPosp = std::make_unique<kdu_coords>();
mTPosp->y = 0;
mTPosp->x = 0;
}
@@ -505,7 +506,7 @@ bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
base.setLastError(msg.what());
return false;
}
- catch (kdu_exception kdu_value)
+ catch (const kdu_exception& kdu_value)
{
// KDU internally throws kdu_exception. It's possible that such an
// exception might leak out into our code. Catch kdu_exception
@@ -596,8 +597,7 @@ bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
kdu_coords offset = tile_dims.pos - dims.pos;
int row_gap = channels*dims.size.x; // inter-row separation
kdu_byte *buf = buffer + offset.y*row_gap + offset.x*channels;
- mDecodeState.reset(new LLKDUDecodeState(tile, buf, row_gap,
- mCodeStreamp.get()));
+ mDecodeState = std::make_unique<LLKDUDecodeState>(tile, buf, row_gap, mCodeStreamp.get());
}
// Do the actual processing
F32 remaining_time = limit_time ? decode_time - decode_timer.getElapsedTimeF32().value() : 0.0f;
@@ -622,7 +622,7 @@ bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
cleanupCodeStream();
return true; // done
}
- catch (kdu_exception kdu_value)
+ catch (const kdu_exception& kdu_value)
{
// KDU internally throws kdu_exception. It's possible that such an
// exception might leak out into our code. Catch kdu_exception
@@ -662,6 +662,12 @@ bool LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
bool vflip = true;
bool hflip = false;
+ if (raw_image.isBufferInvalid())
+ {
+ base.setLastError("Invalid input, no buffer");
+ return false;
+ }
+
try
{
// Set up input image files
@@ -825,7 +831,7 @@ bool LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
base.setLastError(msg.what());
return false;
}
- catch (kdu_exception kdu_value)
+ catch (const kdu_exception& kdu_value)
{
// KDU internally throws kdu_exception. It's possible that such an
// exception might leak out into our code. Catch kdu_exception
@@ -859,7 +865,7 @@ bool LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
base.setLastError(msg.what());
return false;
}
- catch (kdu_exception kdu_value)
+ catch (const kdu_exception& kdu_value)
{
// KDU internally throws kdu_exception. It's possible that such an
// exception might leak out into our code. Catch kdu_exception
@@ -991,8 +997,8 @@ void LLImageJ2CKDU::findDiscardLevelsBoundaries(LLImageJ2C &base)
//std::cout << "Parsing discard level = " << discard_level << std::endl;
// Create the input codestream object.
setupCodeStream(base, true, MODE_FAST);
- mCodeStreamp->apply_input_restrictions(0, 4, discard_level, 0, NULL);
- mCodeStreamp->set_max_bytes(KDU_LONG_MAX,true);
+ mCodeStreamp->apply_input_restrictions(0, 4, discard_level, 0, nullptr);
+ mCodeStreamp->set_max_bytes(KDU_LONG_MAX,false);
siz_params *siz_in = mCodeStreamp->access_siz();
// Create the output codestream object.
@@ -1088,8 +1094,10 @@ void LLImageJ2CKDU::findDiscardLevelsBoundaries(LLImageJ2C &base)
void set_default_colour_weights(kdu_params *siz)
{
+ kdu_params *enc = siz->access_cluster(ENC_params);
+ assert(enc != nullptr);
kdu_params *cod = siz->access_cluster(COD_params);
- assert(cod != NULL);
+ assert(cod != nullptr);
bool can_use_ycc = true;
bool rev0 = false;
@@ -1126,7 +1134,7 @@ void set_default_colour_weights(kdu_params *siz)
return;
}
float weight;
- if (cod->get(Clev_weights,0,0,weight) || cod->get(Cband_weights,0,0,weight))
+ if (enc->get(Clev_weights,0,0,weight) || enc->get(Cband_weights,0,0,weight))
{
// Weights already specified explicitly -> nothing to do
return;
@@ -1135,17 +1143,16 @@ void set_default_colour_weights(kdu_params *siz)
// These example weights are adapted from numbers generated by Marcus Nadenau
// at EPFL, for a viewing distance of 15 cm and a display resolution of
// 300 DPI.
-
- cod->parse_string("Cband_weights:C0="
+ enc->parse_string("Cband_weights:C0="
"{0.0901},{0.2758},{0.2758},"
"{0.7018},{0.8378},{0.8378},{1}");
- cod->parse_string("Cband_weights:C1="
+ enc->parse_string("Cband_weights:C1="
"{0.0263},{0.0863},{0.0863},"
"{0.1362},{0.2564},{0.2564},"
"{0.3346},{0.4691},{0.4691},"
"{0.5444},{0.6523},{0.6523},"
"{0.7078},{0.7797},{0.7797},{1}");
- cod->parse_string("Cband_weights:C2="
+ enc->parse_string("Cband_weights:C2="
"{0.0773},{0.1835},{0.1835},"
"{0.2598},{0.4130},{0.4130},"
"{0.5040},{0.6464},{0.6464},"
@@ -1164,7 +1171,7 @@ byte buffer, spacing successive output samples apart by `gap' bytes
all necessary level shifting, type conversion, rounding and truncation. */
{
int width = src.get_width();
- if (src.get_buf32() != NULL)
+ if (src.get_buf32() != nullptr)
{ // Decompressed samples have a 32-bit representation (integer or float)
assert(precision >= 8); // Else would have used 16 bit representation
kdu_sample32 *sp = src.get_buf32();
@@ -1327,11 +1334,11 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap,
mLines[c].pre_create(&mAllocator,mDims.size.x,mReversible[c],use_shorts,0,0);
if (res.which() == 0) // No DWT levels used
{
- mEngines[c] = kdu_decoder(res.access_subband(LL_BAND),&mAllocator,use_shorts);
+ mEngines[c] = kdu_decoder(res.access_subband(LL_BAND), &mAllocator, mParams, use_shorts);
}
else
{
- mEngines[c] = kdu_synthesis(res,&mAllocator,use_shorts);
+ mEngines[c] = kdu_synthesis(res, &mAllocator, mParams, use_shorts);
}
}
mAllocator.finalize(*codestreamp); // Actually creates buffering resources
@@ -1409,7 +1416,7 @@ kdc_flow_control::kdc_flow_control (kdu_supp::kdu_image_in_base *img_in, kdu_cod
this->codestream = codestream;
codestream.get_valid_tiles(valid_tile_indices);
tile_idx = valid_tile_indices.pos;
- tile = codestream.open_tile(tile_idx,NULL);
+ tile = codestream.open_tile(tile_idx, nullptr);
// Set up the individual components
num_components = codestream.get_num_components(true);
@@ -1418,7 +1425,7 @@ kdc_flow_control::kdc_flow_control (kdu_supp::kdu_image_in_base *img_in, kdu_cod
kdc_component_flow_control *comp = components;
for (n = 0; n < num_components; n++, comp++)
{
- comp->line = NULL;
+ comp->line = nullptr;
comp->reader = img_in;
kdu_coords subsampling;
codestream.get_subsampling(n,subsampling,true);
@@ -1435,12 +1442,12 @@ kdc_flow_control::kdc_flow_control (kdu_supp::kdu_image_in_base *img_in, kdu_cod
assert(num_components >= 0);
tile.set_components_of_interest(num_components);
- max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false);
+ max_buffer_memory = engine.create(codestream, tile, false, nullptr, false, 1, nullptr, nullptr,false);
}
kdc_flow_control::~kdc_flow_control()
{
- if (components != NULL)
+ if (components != nullptr)
{
delete[] components;
}
@@ -1467,8 +1474,8 @@ bool kdc_flow_control::advance_components()
if (comp->ratio_counter < 0)
{
found_line = true;
- comp->line = engine.exchange_line(n,NULL,NULL);
- assert(comp->line != NULL);
+ comp->line = engine.exchange_line(n,nullptr,nullptr);
+ assert(comp->line != nullptr);
if (comp->line->get_width())
{
comp->reader->get(n,*(comp->line),0);
@@ -1495,9 +1502,9 @@ void kdc_flow_control::process_components()
assert(comp->ratio_counter >= 0);
assert(comp->remaining_lines > 0);
comp->remaining_lines--;
- assert(comp->line != NULL);
- engine.exchange_line(n,comp->line,NULL);
- comp->line = NULL;
+ assert(comp->line != nullptr);
+ engine.exchange_line(n,comp->line,nullptr);
+ comp->line = nullptr;
}
}
}
diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h
index 8037c81868..c9aa0c5250 100644
--- a/indra/llkdu/llimagej2ckdu.h
+++ b/indra/llkdu/llimagej2ckdu.h
@@ -27,12 +27,13 @@
#ifndef LL_LLIMAGEJ2CKDU_H
#define LL_LLIMAGEJ2CKDU_H
+#include "llpreprocessor.h"
+
#include "llimagej2c.h"
//
// KDU core header files
//
-#define KDU_NO_THREADS
#include "kdu_elementary.h"
#include "kdu_messaging.h"
#include "kdu_params.h"
@@ -41,7 +42,6 @@
#include "include_kdu_xxxx.h"
#include "kdu_sample_processing.h"
-#include <boost/scoped_ptr.hpp>
#include <boost/noncopyable.hpp>
class LLKDUDecodeState;
diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h
index 177a8ea976..56aff13c76 100644
--- a/indra/llkdu/llkdumem.h
+++ b/indra/llkdu/llkdumem.h
@@ -27,9 +27,9 @@
#ifndef LL_LLKDUMEM_H
#define LL_LLKDUMEM_H
-// Support classes for reading and writing from memory buffers in KDU
-#define KDU_NO_THREADS
+#include "llpreprocessor.h"
+// Support classes for reading and writing from memory buffers in KDU
#define kdu_xxxx "kdu_image.h"
#include "include_kdu_xxxx.h"
@@ -54,9 +54,7 @@ public:
mCurPos = 0;
}
- ~LLKDUMemSource()
- {
- }
+ ~LLKDUMemSource() = default;
int read(kdu_core::kdu_byte *buf, int num_bytes)
{
@@ -94,9 +92,7 @@ public:
mOutputSize = &output_size;
}
- ~LLKDUMemTarget()
- {
- }
+ ~LLKDUMemTarget() = default;
bool write(const kdu_core::kdu_byte *buf, int num_bytes)
{
diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp
index db81d60d9e..bc52a15c4a 100644
--- a/indra/llkdu/tests/llimagej2ckdu_test.cpp
+++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp
@@ -80,6 +80,7 @@ U8* LLImageBase::getData() { return NULL; }
U8* LLImageBase::reallocateData(S32 ) { return NULL; }
void LLImageBase::sanityCheck() { }
void LLImageBase::setSize(S32 , S32 , S32 ) { }
+bool LLImageBase::isBufferInvalid() const { return false; }
LLImageJ2CImpl::~LLImageJ2CImpl() { }
@@ -139,18 +140,19 @@ int kdu_tile_comp::get_bit_depth(bool ) { return 8; }
bool kdu_tile_comp::get_reversible() { return false; }
int kdu_tile_comp::get_num_resolutions() { return 1; }
kdu_subband kdu_resolution::access_subband(int ) { kdu_subband a; return a; }
-void kdu_resolution::get_dims(kdu_dims& ) { }
-int kdu_resolution::which() { return 0; }
-int kdu_resolution::get_valid_band_indices(int &) { return 1; }
-kdu_synthesis::kdu_synthesis(kdu_resolution, kdu_sample_allocator*, bool, float, kdu_thread_env*, kdu_thread_queue*) { }
+void kdu_resolution::get_dims(kdu_dims& ) const { }
+int kdu_resolution::which() const { return 0; }
+int kdu_resolution::get_valid_band_indices(int &) const { return 1; }
+kdu_synthesis::kdu_synthesis(kdu_resolution, kdu_sample_allocator*, kdu_push_pull_params&, bool, float, kdu_thread_env*, kdu_thread_queue*) { }
//kdu_params::kdu_params(const char*, bool, bool, bool, bool, bool) { }
-kdu_params::kdu_params(const char*, bool, bool, bool, bool, bool, kd_core_local::kd_coremem*) {}
+kdu_params::kdu_params(const char*, bool, bool, bool, bool, bool) {}
kdu_params::~kdu_params() { }
+void kdu_params::destroy() { }
void kdu_params::set(const char* , int , int , bool ) { }
void kdu_params::set(const char* , int , int , int ) { }
void kdu_params::finalize_all(bool ) { }
void kdu_params::finalize_all(int, bool ) { }
-void kdu_params::copy_from(kdu_params*, int, int, int, int, int, bool, bool, bool) { }
+void kdu_params::copy_from(kdu_params*, int, int, int, int, int, bool, bool, bool, bool) { }
bool kdu_params::parse_string(const char*) { return false; }
bool kdu_params::get(const char*, int, int, bool&, bool, bool, bool) { return false; }
bool kdu_params::get(const char*, int, int, float&, bool, bool, bool) { return false; }
@@ -159,13 +161,13 @@ kdu_params* kdu_params::access_relation(int, int, int, bool) { return NULL; }
kdu_params* kdu_params::access_cluster(const char*) { return NULL; }
void kdu_codestream::set_fast() { }
void kdu_codestream::set_fussy() { }
-void kdu_codestream::get_dims(int, kdu_dims&, bool ) { }
+void kdu_codestream::get_dims(int, kdu_dims&, bool ) const { }
int kdu_codestream::get_min_dwt_levels() { return 5; }
int kdu_codestream::get_max_tile_layers() { return 1; }
void kdu_codestream::change_appearance(bool, bool, bool, kdu_thread_env *) {}
void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { }
void kdu_codestream::destroy() { }
-void kdu_codestream::collect_timing_stats(int ) { }
+void kdu_codestream::collect_timing_stats(int ) const { }
void kdu_codestream::set_max_bytes(kdu_long, bool, bool ) { }
void kdu_codestream::get_valid_tiles(kdu_dims& ) { }
void kdu_codestream::create(
@@ -182,19 +184,21 @@ void kdu_codestream::get_subsampling(int , kdu_coords&, bool ) { }
void kdu_codestream::flush(kdu_long *, int, kdu_uint16 *, bool, bool, double, kdu_thread_env*, int) { }
void kdu_codestream::set_resilient(bool ) { }
int kdu_codestream::get_num_components(bool ) { return 0; }
-kdu_long kdu_codestream::get_total_bytes(bool ) { return 0; }
+kdu_long kdu_codestream::get_total_bytes(bool ) const { return 0; }
kdu_long kdu_codestream::get_compressed_data_memory(bool ) const {return 0; }
void kdu_codestream::share_buffering(kdu_codestream ) { }
-int kdu_codestream::get_num_tparts() { return 0; }
+int kdu_codestream::get_num_tparts() const { return 0; }
int kdu_codestream::trans_out(kdu_long, kdu_long*, int, bool, kdu_thread_env* ) { return 0; }
bool kdu_codestream::ready_for_flush(kdu_thread_env*) { return false; }
siz_params* kdu_codestream::access_siz() { return NULL; }
kdu_tile kdu_codestream::open_tile(kdu_coords , kdu_thread_env* ) { kdu_tile a; return a; }
kdu_codestream_comment kdu_codestream::add_comment(kdu_thread_env*) { kdu_codestream_comment a; return a; }
+kdu_codestream_comment kdu_codestream::get_comment(kdu_codestream_comment) { kdu_codestream_comment a; return a; };
void kdu_subband::close_block(kdu_block*, kdu_thread_env*) { }
void kdu_subband::get_valid_blocks(kdu_dims &indices) const { }
kdu_block * kdu_subband::open_block(kdu_coords, int *, kdu_thread_env *, int, bool) { return NULL; }
bool kdu_codestream_comment::put_text(const char*) { return false; }
+const char *kdu_codestream_comment::get_text() { return nullptr; };
void kdu_customize_warnings(kdu_message*) { }
void kdu_customize_errors(kdu_message*) { }
kdu_long kdu_multi_analysis::create(
@@ -209,16 +213,18 @@ kdu_long kdu_multi_analysis::create(
const kdu_push_pull_params*,
kdu_membroker*) { return kdu_long(0); }
void kdu_multi_analysis::destroy(kdu_thread_env *) {}
+siz_params::siz_params() : kdu_params(NULL, false, false, false, false, false) { }
siz_params::siz_params(kd_core_local::kd_coremem*) : kdu_params(NULL, false, false, false, false, false) { }
siz_params::~siz_params() {}
void siz_params::finalize(bool ) { }
void siz_params::copy_with_xforms(kdu_params*, int, int, bool, bool, bool) { }
-int siz_params::write_marker_segment(kdu_output*, kdu_params*, int) { return 0; }
+int siz_params::write_marker_segment(kdu_output*, kdu_params*, int, int&) { return 0; }
bool siz_params::check_marker_segment(kdu_uint16, int, kdu_byte a[], int&) { return false; }
-bool siz_params::read_marker_segment(kdu_uint16, int, kdu_byte a[], int) { return false; }
+int siz_params::read_marker_segment(kdu_uint16 code, int num_bytes, kdu_byte bytes[], int tpart_idx) { return false; }
kdu_decoder::kdu_decoder(
kdu_subband subband,
kdu_sample_allocator*,
+ kdu_push_pull_params&,
bool, float, int,
kdu_thread_env*,
kdu_thread_queue*,
diff --git a/indra/llmath/llbbox.h b/indra/llmath/llbbox.h
index 5617eaebde..3a4e09a598 100644
--- a/indra/llmath/llbbox.h
+++ b/indra/llmath/llbbox.h
@@ -95,6 +95,10 @@ private:
bool mEmpty; // Nothing has been added to this bbox yet
};
+static_assert(std::is_trivially_copyable<LLBBox>::value, "LLBBox must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLBBox>::value, "LLBBox must be trivial move");
+static_assert(std::is_standard_layout<LLBBox>::value, "LLBBox must be a standard layout type");
+
//LLBBox operator*(const LLBBox &a, const LLMatrix4 &b);
diff --git a/indra/llmath/llbboxlocal.h b/indra/llmath/llbboxlocal.h
index e215e55460..f743bc0ee4 100644
--- a/indra/llmath/llbboxlocal.h
+++ b/indra/llmath/llbboxlocal.h
@@ -61,5 +61,8 @@ private:
LLBBoxLocal operator*(const LLBBoxLocal &a, const LLMatrix4 &b);
+static_assert(std::is_trivially_copyable<LLBBoxLocal>::value, "LLBBoxLocal must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLBBoxLocal>::value, "LLBBoxLocal must be trivial move");
+static_assert(std::is_standard_layout<LLBBoxLocal>::value, "LLBBoxLocal must be a standard layout type");
#endif // LL_BBOXLOCAL_H
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index b6e0e4a2be..6201761c46 100644
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -33,23 +33,23 @@
#include "llplane.h"
#include "llvector4a.h"
-const F32 DEFAULT_FIELD_OF_VIEW = 60.f * DEG_TO_RAD;
-const F32 DEFAULT_ASPECT_RATIO = 640.f / 480.f;
-const F32 DEFAULT_NEAR_PLANE = 0.25f;
-const F32 DEFAULT_FAR_PLANE = 64.f; // far reaches across two horizontal, not diagonal, regions
+constexpr F32 DEFAULT_FIELD_OF_VIEW = 60.f * DEG_TO_RAD;
+constexpr F32 DEFAULT_ASPECT_RATIO = 640.f / 480.f;
+constexpr F32 DEFAULT_NEAR_PLANE = 0.25f;
+constexpr F32 DEFAULT_FAR_PLANE = 64.f; // far reaches across two horizontal, not diagonal, regions
-const F32 MAX_ASPECT_RATIO = 50.0f;
-const F32 MAX_NEAR_PLANE = 1023.9f; // Clamp the near plane just before the skybox ends
-const F32 MAX_FAR_PLANE = 100000.0f; //1000000.0f; // Max allowed. Not good Z precision though.
-const F32 MAX_FAR_CLIP = 512.0f;
+constexpr F32 MAX_ASPECT_RATIO = 50.0f;
+constexpr F32 MAX_NEAR_PLANE = 1023.9f; // Clamp the near plane just before the skybox ends
+constexpr F32 MAX_FAR_PLANE = 100000.0f; //1000000.0f; // Max allowed. Not good Z precision though.
+constexpr F32 MAX_FAR_CLIP = 512.0f;
-const F32 MIN_ASPECT_RATIO = 0.02f;
-const F32 MIN_NEAR_PLANE = 0.1f;
-const F32 MIN_FAR_PLANE = 0.2f;
+constexpr F32 MIN_ASPECT_RATIO = 0.02f;
+constexpr F32 MIN_NEAR_PLANE = 0.1f;
+constexpr F32 MIN_FAR_PLANE = 0.2f;
// Min/Max FOV values for square views. Call getMin/MaxView to get extremes based on current aspect ratio.
-static const F32 MIN_FIELD_OF_VIEW = 5.0f * DEG_TO_RAD;
-static const F32 MAX_FIELD_OF_VIEW = 175.f * DEG_TO_RAD;
+constexpr F32 MIN_FIELD_OF_VIEW = 5.0f * DEG_TO_RAD;
+constexpr F32 MAX_FIELD_OF_VIEW = 175.f * DEG_TO_RAD;
// An LLCamera is an LLCoorFrame with a view frustum.
// This means that it has several methods for moving it around
diff --git a/indra/llmath/llcoordframe.cpp b/indra/llmath/llcoordframe.cpp
index 4d6276b2cd..b42541c7c0 100644
--- a/indra/llmath/llcoordframe.cpp
+++ b/indra/llmath/llcoordframe.cpp
@@ -26,7 +26,6 @@
#include "linden_common.h"
-//#include "vmath.h"
#include "v3math.h"
#include "m3math.h"
#include "v4math.h"
@@ -329,28 +328,30 @@ void LLCoordFrame::rotate(const LLMatrix3 &rotation_matrix)
}
+// Rotate 2 normalized orthogonal vectors in direction from `source` to `target`
+static void rotate2(LLVector3& source, LLVector3& target, F32 angle)
+{
+ F32 sx = source[VX], sy = source[VY], sz = source[VZ];
+ F32 tx = target[VX], ty = target[VY], tz = target[VZ];
+ F32 c = cosf(angle), s = sinf(angle);
+
+ source.set(sx * c + tx * s, sy * c + ty * s, sz * c + tz * s);
+ target.set(tx * c - sx * s, ty * c - sy * s, tz * c - sz * s);
+}
+
void LLCoordFrame::roll(F32 angle)
{
- LLQuaternion q(angle, mXAxis);
- LLMatrix3 rotation_matrix(q);
- rotate(rotation_matrix);
- CHECK_FINITE_OBJ();
+ rotate2(mYAxis, mZAxis, angle);
}
void LLCoordFrame::pitch(F32 angle)
{
- LLQuaternion q(angle, mYAxis);
- LLMatrix3 rotation_matrix(q);
- rotate(rotation_matrix);
- CHECK_FINITE_OBJ();
+ rotate2(mZAxis, mXAxis, angle);
}
void LLCoordFrame::yaw(F32 angle)
{
- LLQuaternion q(angle, mZAxis);
- LLMatrix3 rotation_matrix(q);
- rotate(rotation_matrix);
- CHECK_FINITE_OBJ();
+ rotate2(mXAxis, mYAxis, angle);
}
// get*() routines
diff --git a/indra/llmath/llcoordframe.h b/indra/llmath/llcoordframe.h
index aaa701f792..458f6132c9 100644
--- a/indra/llmath/llcoordframe.h
+++ b/indra/llmath/llcoordframe.h
@@ -61,7 +61,7 @@ public:
//LLCoordFrame(const F32 *origin, const F32 *rotation); // Assumes "origin" is 1x3 and "rotation" is 1x9 array
//LLCoordFrame(const F32 *origin_and_rotation); // Assumes "origin_and_rotation" is 1x12 array
- bool isFinite() { return mOrigin.isFinite() && mXAxis.isFinite() && mYAxis.isFinite() && mZAxis.isFinite(); }
+ bool isFinite() const { return mOrigin.isFinite() && mXAxis.isFinite() && mYAxis.isFinite() && mZAxis.isFinite(); }
void reset();
void resetAxes();
diff --git a/indra/llmath/llline.h b/indra/llmath/llline.h
index 33c1eb61a4..fa151f8b20 100644
--- a/indra/llmath/llline.h
+++ b/indra/llmath/llline.h
@@ -33,14 +33,14 @@
#include "stdtypes.h"
#include "v3math.h"
-const F32 DEFAULT_INTERSECTION_ERROR = 0.000001f;
+constexpr F32 DEFAULT_INTERSECTION_ERROR = 0.000001f;
class LLLine
{
public:
LLLine();
LLLine( const LLVector3& first_point, const LLVector3& second_point );
- virtual ~LLLine() {};
+ ~LLLine() = default;
void setPointDirection( const LLVector3& first_point, const LLVector3& second_point );
void setPoints( const LLVector3& first_point, const LLVector3& second_point );
@@ -76,5 +76,8 @@ protected:
LLVector3 mDirection;
};
+static_assert(std::is_trivially_copyable<LLLine>::value, "LLLine must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLLine>::value, "LLLine must be trivial move");
+static_assert(std::is_standard_layout<LLLine>::value, "LLLine must be a standard layout type");
#endif
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index a72993a21a..891f0ffc4c 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -39,18 +39,8 @@
// llcommon depend on llmath.
#include "is_approx_equal_fraction.h"
-// work around for Windows & older gcc non-standard function names.
-#if LL_WINDOWS
-#include <float.h>
-#define llisnan(val) _isnan(val)
-#define llfinite(val) _finite(val)
-#elif (LL_LINUX && __GNUC__ <= 2)
-#define llisnan(val) isnan(val)
-#define llfinite(val) isfinite(val)
-#else
-#define llisnan(val) std::isnan(val)
-#define llfinite(val) std::isfinite(val)
-#endif
+#define llisnan(val) std::isnan(val)
+#define llfinite(val) std::isfinite(val)
// Single Precision Floating Point Routines
// (There used to be more defined here, but they appeared to be redundant and
@@ -75,7 +65,7 @@ constexpr F32 DEG_TO_RAD = 0.017453292519943295769236907684886f;
constexpr F32 RAD_TO_DEG = 57.295779513082320876798154814105f;
constexpr F32 F_APPROXIMATELY_ZERO = 0.00001f;
constexpr F32 F_LN10 = 2.3025850929940456840179914546844f;
-constexpr F32 OO_LN10 = 0.43429448190325182765112891891661;
+constexpr F32 OO_LN10 = 0.43429448190325182765112891891661f;
constexpr F32 F_LN2 = 0.69314718056f;
constexpr F32 OO_LN2 = 1.4426950408889634073599246810019f;
@@ -89,7 +79,7 @@ constexpr F32 GIMBAL_THRESHOLD = 0.000436f; // sets the gimballock threshold 0
constexpr F32 FP_MAG_THRESHOLD = 0.0000001f;
// TODO: Replace with logic like is_approx_equal
-inline bool is_approx_zero( F32 f ) { return (-F_APPROXIMATELY_ZERO < f) && (f < F_APPROXIMATELY_ZERO); }
+constexpr bool is_approx_zero(F32 f) { return (-F_APPROXIMATELY_ZERO < f) && (f < F_APPROXIMATELY_ZERO); }
// These functions work by interpreting sign+exp+mantissa as an unsigned
// integer.
@@ -148,33 +138,17 @@ inline F64 llabs(const F64 a)
return F64(std::fabs(a));
}
-inline S32 lltrunc( F32 f )
+constexpr S32 lltrunc(F32 f)
{
-#if LL_WINDOWS && !defined( __INTEL_COMPILER ) && (ADDRESS_SIZE == 32)
- // Avoids changing the floating point control word.
- // Add or subtract 0.5 - epsilon and then round
- const static U32 zpfp[] = { 0xBEFFFFFF, 0x3EFFFFFF };
- S32 result;
- __asm {
- fld f
- mov eax, f
- shr eax, 29
- and eax, 4
- fadd dword ptr [zpfp + eax]
- fistp result
- }
- return result;
-#else
- return (S32)f;
-#endif
+ return narrow(f);
}
-inline S32 lltrunc( F64 f )
+constexpr S32 lltrunc(F64 f)
{
- return (S32)f;
+ return narrow(f);
}
-inline S32 llfloor( F32 f )
+inline S32 llfloor(F32 f)
{
#if LL_WINDOWS && !defined( __INTEL_COMPILER ) && (ADDRESS_SIZE == 32)
// Avoids changing the floating point control word.
@@ -284,7 +258,7 @@ constexpr F32 FAST_MAG_BETA = 0.397824734759f;
//constexpr F32 FAST_MAG_ALPHA = 0.948059448969f;
//constexpr F32 FAST_MAG_BETA = 0.392699081699f;
-inline F32 fastMagnitude(F32 a, F32 b)
+constexpr F32 fastMagnitude(F32 a, F32 b)
{
a = (a > 0) ? a : -a;
b = (b > 0) ? b : -b;
@@ -342,7 +316,7 @@ inline F32 llfastpow(const F32 x, const F32 y)
}
-inline F32 snap_to_sig_figs(F32 foo, S32 sig_figs)
+constexpr F32 snap_to_sig_figs(F32 foo, S32 sig_figs)
{
// compute the power of ten
F32 bar = 1.f;
@@ -358,16 +332,9 @@ inline F32 snap_to_sig_figs(F32 foo, S32 sig_figs)
return new_foo;
}
-#ifdef __GNUC__
using std::lerp;
-#else
-inline F32 lerp(F32 a, F32 b, F32 u)
-{
- return a + ((b - a) * u);
-}
-#endif
-inline F32 lerp2d(F32 x00, F32 x01, F32 x10, F32 x11, F32 u, F32 v)
+constexpr F32 lerp2d(F32 x00, F32 x01, F32 x10, F32 x11, F32 u, F32 v)
{
F32 a = x00 + (x01-x00)*u;
F32 b = x10 + (x11-x10)*u;
@@ -375,17 +342,17 @@ inline F32 lerp2d(F32 x00, F32 x01, F32 x10, F32 x11, F32 u, F32 v)
return r;
}
-inline F32 ramp(F32 x, F32 a, F32 b)
+constexpr F32 ramp(F32 x, F32 a, F32 b)
{
return (a == b) ? 0.0f : ((a - x) / (a - b));
}
-inline F32 rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2)
+constexpr F32 rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2)
{
return lerp(y1, y2, ramp(x, x1, x2));
}
-inline F32 clamp_rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2)
+constexpr F32 clamp_rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2)
{
if (y1 < y2)
{
@@ -398,7 +365,7 @@ inline F32 clamp_rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2)
}
-inline F32 cubic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )
+constexpr F32 cubic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )
{
if (x <= x0)
return s0;
@@ -411,14 +378,14 @@ inline F32 cubic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )
return s0 + (s1 - s0) * (f * f) * (3.0f - 2.0f * f);
}
-inline F32 cubic_step( F32 x )
+constexpr F32 cubic_step( F32 x )
{
x = llclampf(x);
return (x * x) * (3.0f - 2.0f * x);
}
-inline F32 quadratic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )
+constexpr F32 quadratic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )
{
if (x <= x0)
return s0;
@@ -432,7 +399,7 @@ inline F32 quadratic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )
return (s0 * (1.f - f_squared)) + ((s1 - s0) * f_squared);
}
-inline F32 llsimple_angle(F32 angle)
+constexpr F32 llsimple_angle(F32 angle)
{
while(angle <= -F_PI)
angle += F_TWO_PI;
@@ -442,7 +409,7 @@ inline F32 llsimple_angle(F32 angle)
}
//SDK - Renamed this to get_lower_power_two, since this is what this actually does.
-inline U32 get_lower_power_two(U32 val, U32 max_power_two)
+constexpr U32 get_lower_power_two(U32 val, U32 max_power_two)
{
if(!max_power_two)
{
@@ -464,7 +431,7 @@ inline U32 get_lower_power_two(U32 val, U32 max_power_two)
// number of digits, then add one. We subtract 1 initially to handle
// the case where the number passed in is actually a power of two.
// WARNING: this only works with 32 bit ints.
-inline U32 get_next_power_two(U32 val, U32 max_power_two)
+constexpr U32 get_next_power_two(U32 val, U32 max_power_two)
{
if(!max_power_two)
{
@@ -490,7 +457,7 @@ inline U32 get_next_power_two(U32 val, U32 max_power_two)
//get the gaussian value given the linear distance from axis x and guassian value o
inline F32 llgaussian(F32 x, F32 o)
{
- return 1.f/(F_SQRT_TWO_PI*o)*powf(F_E, -(x*x)/(2*o*o));
+ return 1.f/(F_SQRT_TWO_PI*o)*powf(F_E, -(x*x)/(2.f*o*o));
}
//helper function for removing outliers
@@ -543,7 +510,8 @@ inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)
// Note: in our code, values labeled as sRGB are ALWAYS gamma corrected linear values, NOT linear values with monitor gamma applied
// Note: stored color values should always be gamma corrected linear (i.e. the values returned from an on-screen color swatch)
// Note: DO NOT cache the conversion. This leads to error prone synchronization and is actually slower in the typical case due to cache misses
-inline float linearTosRGB(const float val) {
+inline float linearTosRGB(const float val)
+{
if (val < 0.0031308f) {
return val * 12.92f;
}
@@ -558,7 +526,8 @@ inline float linearTosRGB(const float val) {
// Note: Stored color values should generally be gamma corrected sRGB.
// If you're serializing the return value of this function, you're probably doing it wrong.
// Note: DO NOT cache the conversion. This leads to error prone synchronization and is actually slower in the typical case due to cache misses.
-inline float sRGBtoLinear(const float val) {
+inline float sRGBtoLinear(const float val)
+{
if (val < 0.04045f) {
return val / 12.92f;
}
diff --git a/indra/llmath/llmatrix3a.h b/indra/llmath/llmatrix3a.h
index dff6604ae5..9b173c22ed 100644
--- a/indra/llmath/llmatrix3a.h
+++ b/indra/llmath/llmatrix3a.h
@@ -56,7 +56,7 @@ public:
//////////////////////////
// Ctor
- LLMatrix3a() {}
+ LLMatrix3a() = default;
// Ctor for setting by columns
inline LLMatrix3a( const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2 );
@@ -115,14 +115,18 @@ protected:
};
+static_assert(std::is_trivial<LLMatrix3a>::value, "LLMatrix3a must be a trivial type");
+
class LLRotation : public LLMatrix3a
{
public:
- LLRotation() {}
+ LLRotation() = default;
// Returns true if this rotation is orthonormal with det ~= 1
inline bool isOkRotation() const;
};
+static_assert(std::is_trivial<LLRotation>::value, "LLRotation must be a trivial type");
+
#endif
diff --git a/indra/llmath/llmatrix4a.h b/indra/llmath/llmatrix4a.h
index 3b423f783a..377203098e 100644
--- a/indra/llmath/llmatrix4a.h
+++ b/indra/llmath/llmatrix4a.h
@@ -36,10 +36,7 @@ class LLMatrix4a
public:
LL_ALIGN_16(LLVector4a mMatrix[4]);
- LLMatrix4a()
- {
-
- }
+ LLMatrix4a() = default;
explicit LLMatrix4a(const LLMatrix4& val)
{
@@ -228,6 +225,8 @@ public:
const LLVector4a& getTranslation() const { return mMatrix[3]; }
};
+static_assert(std::is_trivial<LLMatrix4a>::value, "LLMatrix4a must be a trivial type");
+
inline LLVector4a rowMul(const LLVector4a &row, const LLMatrix4a &mat)
{
LLVector4a result;
diff --git a/indra/llmath/llplane.h b/indra/llmath/llplane.h
index 4e8546e32b..832004bb64 100644
--- a/indra/llmath/llplane.h
+++ b/indra/llmath/llplane.h
@@ -43,7 +43,7 @@ class LLPlane
public:
// Constructors
- LLPlane() {}; // no default constructor
+ LLPlane() = default;
LLPlane(const LLVector3 &p0, F32 d) { setVec(p0, d); }
LLPlane(const LLVector3 &p0, const LLVector3 &n) { setVec(p0, n); }
inline void setVec(const LLVector3 &p0, F32 d) { mV.set(p0[0], p0[1], p0[2], d); }
@@ -104,6 +104,7 @@ private:
LLVector4a mV;
} LL_ALIGN_POSTFIX(16);
+static_assert(std::is_trivial<LLPlane>::value, "LLPlane must be a trivial type");
#endif // LL_LLPLANE_H
diff --git a/indra/llmath/llquaternion.cpp b/indra/llmath/llquaternion.cpp
index aefb82b2f0..3a6748bdb3 100644
--- a/indra/llmath/llquaternion.cpp
+++ b/indra/llmath/llquaternion.cpp
@@ -30,7 +30,6 @@
#include "llquaternion.h"
-//#include "vmath.h"
#include "v3math.h"
#include "v3dmath.h"
#include "v4math.h"
@@ -58,7 +57,7 @@ LLQuaternion::LLQuaternion(const LLMatrix3 &mat)
LLQuaternion::LLQuaternion(F32 angle, const LLVector4 &vec)
{
- F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
+ F32 mag = vec.length();
if (mag > FP_MAG_THRESHOLD)
{
angle *= 0.5;
@@ -77,7 +76,7 @@ LLQuaternion::LLQuaternion(F32 angle, const LLVector4 &vec)
LLQuaternion::LLQuaternion(F32 angle, const LLVector3 &vec)
{
- F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
+ F32 mag = vec.length();
if (mag > FP_MAG_THRESHOLD)
{
angle *= 0.5;
diff --git a/indra/llmath/llquaternion.h b/indra/llmath/llquaternion.h
index 762d13eded..472d7ca62d 100644
--- a/indra/llmath/llquaternion.h
+++ b/indra/llmath/llquaternion.h
@@ -174,6 +174,10 @@ public:
//static U32 mMultCount;
};
+static_assert(std::is_trivially_copyable<LLQuaternion>::value, "LLQuaternion must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLQuaternion>::value, "LLQuaternion must be trivial move");
+static_assert(std::is_standard_layout<LLQuaternion>::value, "LLQuaternion must be a standard layout type");
+
inline LLSD LLQuaternion::getValue() const
{
LLSD ret;
diff --git a/indra/llmath/llquaternion2.h b/indra/llmath/llquaternion2.h
index 902bfb7134..c9dcc4573f 100644
--- a/indra/llmath/llquaternion2.h
+++ b/indra/llmath/llquaternion2.h
@@ -49,7 +49,7 @@ public:
//////////////////////////
// Ctor
- LLQuaternion2() {}
+ LLQuaternion2() = default;
// Ctor from LLQuaternion
explicit LLQuaternion2( const class LLQuaternion& quat );
@@ -102,4 +102,6 @@ protected:
};
+static_assert(std::is_trivial<LLQuaternion2>::value, "LLQuaternion2 must be a trivial type");
+
#endif
diff --git a/indra/llmath/llquaternion2.inl b/indra/llmath/llquaternion2.inl
index ce5ed73926..b431d5766c 100644
--- a/indra/llmath/llquaternion2.inl
+++ b/indra/llmath/llquaternion2.inl
@@ -26,8 +26,13 @@
#include "llquaternion2.h"
+#if _M_ARM64
+static const LLQuad LL_V4A_PLUS_ONE = {.n128_f32 = {1.f, 1.f, 1.f, 1.f}};
+static const LLQuad LL_V4A_MINUS_ONE = {.n128_f32 = {-1.f, -1.f, -1.f, -1.f}};
+#else
static const LLQuad LL_V4A_PLUS_ONE = {1.f, 1.f, 1.f, 1.f};
static const LLQuad LL_V4A_MINUS_ONE = {-1.f, -1.f, -1.f, -1.f};
+#endif
// Ctor from LLQuaternion
inline LLQuaternion2::LLQuaternion2( const LLQuaternion& quat )
diff --git a/indra/llmath/llrect.h b/indra/llmath/llrect.h
index 317578da06..0a3da2fee0 100644
--- a/indra/llmath/llrect.h
+++ b/indra/llmath/llrect.h
@@ -51,10 +51,6 @@ public:
LLRectBase(): mLeft(0), mTop(0), mRight(0), mBottom(0)
{}
- LLRectBase(const LLRectBase &r):
- mLeft(r.mLeft), mTop(r.mTop), mRight(r.mRight), mBottom(r.mBottom)
- {}
-
LLRectBase(Type left, Type top, Type right, Type bottom):
mLeft(left), mTop(top), mRight(right), mBottom(bottom)
{}
@@ -295,4 +291,8 @@ template <class Type> LLRectBase<Type> LLRectBase<Type>::null(0,0,0,0);
typedef LLRectBase<S32> LLRect;
typedef LLRectBase<F32> LLRectf;
+static_assert(std::is_trivially_copyable<LLRect>::value, "LLRect must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLRect>::value, "LLRect must be trivial move");
+static_assert(std::is_standard_layout<LLRect>::value, "LLRect must be a standard layout type");
+
#endif
diff --git a/indra/llmath/llsimdmath.h b/indra/llmath/llsimdmath.h
index 6242095456..440561e589 100644
--- a/indra/llmath/llsimdmath.h
+++ b/indra/llmath/llsimdmath.h
@@ -31,8 +31,12 @@
#error "Please include llmath.h before this file."
#endif
-#if ( ( LL_DARWIN || LL_LINUX ) && !(__SSE2__ || __ARM_NEON) ) || ( LL_WINDOWS && ( _M_IX86_FP < 2 && ADDRESS_SIZE == 32 ) )
-#error SSE2 not enabled. LLVector4a and related class will not compile.
+#if ( ( LL_DARWIN || LL_LINUX ) )
+ #if !(__SSE2__ || __ARM_NEON)
+ #error SSE2 not enabled. LLVector4a and related class will not compile.
+ #endif
+#elif ( LL_WINDOWS && ( _M_IX86_FP < 2 && ADDRESS_SIZE == 32 ) )
+ #error SSE2 not enabled. LLVector4a and related class will not compile.
#endif
#if !LL_WINDOWS
diff --git a/indra/llmath/llsimdtypes.h b/indra/llmath/llsimdtypes.h
index a407f51029..6c4f55b0c0 100644
--- a/indra/llmath/llsimdtypes.h
+++ b/indra/llmath/llsimdtypes.h
@@ -36,7 +36,7 @@ typedef __m128 LLQuad;
class LLBool32
{
public:
- inline LLBool32() {}
+ inline LLBool32() = default;
inline LLBool32(int rhs) : m_bool(rhs) {}
inline LLBool32(unsigned int rhs) : m_bool(rhs) {}
inline LLBool32(bool rhs) { m_bool = static_cast<const int>(rhs); }
@@ -46,13 +46,15 @@ public:
inline operator bool() const { return static_cast<const bool&>(m_bool); }
private:
- int m_bool{ 0 };
+ int m_bool;
};
+static_assert(std::is_trivial<LLBool32>::value, "LLBool32 must be a standard layout type");
+
class LLSimdScalar
{
public:
- inline LLSimdScalar() {}
+ inline LLSimdScalar() = default;
inline LLSimdScalar(LLQuad q)
{
mQ = q;
@@ -100,7 +102,9 @@ public:
}
private:
- LLQuad mQ{};
+ LLQuad mQ;
};
+static_assert(std::is_trivial<LLSimdScalar>::value, "LLSimdScalar must be a standard layout type");
+
#endif //LL_SIMD_TYPES_H
diff --git a/indra/llmath/llvector4a.cpp b/indra/llmath/llvector4a.cpp
index b81d50f0f9..df20585d16 100644
--- a/indra/llmath/llvector4a.cpp
+++ b/indra/llmath/llvector4a.cpp
@@ -30,6 +30,15 @@
#include "llmath.h"
#include "llquantize.h"
+#if _M_ARM64
+extern const LLQuad F_ZERO_4A = {.n128_f32 = {0, 0, 0, 0}};
+extern const LLQuad F_APPROXIMATELY_ZERO_4A = {.n128_f32 = {
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO
+}};
+#else
extern const LLQuad F_ZERO_4A = { 0, 0, 0, 0 };
extern const LLQuad F_APPROXIMATELY_ZERO_4A = {
F_APPROXIMATELY_ZERO,
@@ -37,6 +46,7 @@ extern const LLQuad F_APPROXIMATELY_ZERO_4A = {
F_APPROXIMATELY_ZERO,
F_APPROXIMATELY_ZERO
};
+#endif
extern const LLVector4a LL_V4A_ZERO = reinterpret_cast<const LLVector4a&> ( F_ZERO_4A );
extern const LLVector4a LL_V4A_EPSILON = reinterpret_cast<const LLVector4a&> ( F_APPROXIMATELY_ZERO_4A );
diff --git a/indra/llmath/llvector4a.h b/indra/llmath/llvector4a.h
index 4004852e06..764a3b94e6 100644
--- a/indra/llmath/llvector4a.h
+++ b/indra/llmath/llvector4a.h
@@ -95,10 +95,7 @@ public:
////////////////////////////////////
//LLVector4a is plain data which should never have a default constructor or destructor(malloc&free won't trigger it)
- LLVector4a()
- { //DO NOT INITIALIZE -- The overhead is completely unnecessary
- ll_assert_aligned(this,16);
- }
+ LLVector4a() = default;
LLVector4a(F32 x, F32 y, F32 z, F32 w = 0.f)
{
@@ -361,8 +358,6 @@ public:
////////////////////////////////////
// Do NOT add aditional operators without consulting someone with SSE experience
- inline const LLVector4a& operator= ( const LLVector4a& rhs );
-
inline const LLVector4a& operator= ( const LLQuad& rhs );
inline operator LLQuad() const;
@@ -378,9 +373,11 @@ public:
};
private:
- LLQuad mQ{};
+ LLQuad mQ;
};
+static_assert(std::is_trivial<LLVector4a>::value, "LLVector4a must be a trivial type");
+
inline void update_min_max(LLVector4a& min, LLVector4a& max, const LLVector4a& p)
{
min.setMin(min, p);
diff --git a/indra/llmath/llvector4a.inl b/indra/llmath/llvector4a.inl
index 36dbec078c..0f7c4123ac 100644
--- a/indra/llmath/llvector4a.inl
+++ b/indra/llmath/llvector4a.inl
@@ -115,7 +115,7 @@ inline void LLVector4a::set(F32 x, F32 y, F32 z, F32 w)
// Set to all zeros
inline void LLVector4a::clear()
{
- mQ = LLVector4a::getZero().mQ;
+ mQ = _mm_setzero_ps();
}
inline void LLVector4a::splat(const F32 x)
@@ -272,6 +272,9 @@ inline void LLVector4a::setCross3(const LLVector4a& a, const LLVector4a& b)
// Set all elements to the dot product of the x, y, and z elements in a and b
inline void LLVector4a::setAllDot3(const LLVector4a& a, const LLVector4a& b)
{
+#if (defined(__arm64__) || defined(__aarch64__))
+ mQ = _mm_dp_ps(a.mQ, b.mQ, 0x7f);
+#else
// ab = { a[W]*b[W], a[Z]*b[Z], a[Y]*b[Y], a[X]*b[X] }
const LLQuad ab = _mm_mul_ps( a.mQ, b.mQ );
// yzxw = { a[W]*b[W], a[Z]*b[Z], a[X]*b[X], a[Y]*b[Y] }
@@ -284,11 +287,15 @@ inline void LLVector4a::setAllDot3(const LLVector4a& a, const LLVector4a& b)
const __m128i zSplat = _mm_shuffle_epi32(_mm_castps_si128(ab), _MM_SHUFFLE( 2, 2, 2, 2 ));
// mQ = { a[Z] * b[Z] + a[Y] * b[Y] + a[X] * b[X], same, same, same }
mQ = _mm_add_ps(_mm_castsi128_ps(zSplat), xPlusYSplat);
+#endif
}
// Set all elements to the dot product of the x, y, z, and w elements in a and b
inline void LLVector4a::setAllDot4(const LLVector4a& a, const LLVector4a& b)
{
+#if (defined(__arm64__) || defined(__aarch64__))
+ mQ = _mm_dp_ps(a.mQ, b.mQ, 0xff);
+#else
// ab = { a[W]*b[W], a[Z]*b[Z], a[Y]*b[Y], a[X]*b[X] }
const LLQuad ab = _mm_mul_ps( a.mQ, b.mQ );
// yzxw = { a[W]*b[W], a[Z]*b[Z], a[X]*b[X], a[Y]*b[Y] }
@@ -301,21 +308,29 @@ inline void LLVector4a::setAllDot4(const LLVector4a& a, const LLVector4a& b)
// mQ = { a[W]*b[W] + a[Z] * b[Z] + a[Y] * b[Y] + a[X] * b[X], same, same, same }
mQ = _mm_add_ps(xPlusYSplat, zPlusWSplat);
+#endif
}
// Return the 3D dot product of this vector and b
inline LLSimdScalar LLVector4a::dot3(const LLVector4a& b) const
{
+#if (defined(__arm64__) || defined(__aarch64__))
+ return _mm_dp_ps(mQ, b.mQ, 0x7f);
+#else
const LLQuad ab = _mm_mul_ps( mQ, b.mQ );
const LLQuad splatY = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128(ab), _MM_SHUFFLE(1, 1, 1, 1) ) );
const LLQuad splatZ = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128(ab), _MM_SHUFFLE(2, 2, 2, 2) ) );
const LLQuad xPlusY = _mm_add_ps( ab, splatY );
return _mm_add_ps( xPlusY, splatZ );
+#endif
}
// Return the 4D dot product of this vector and b
inline LLSimdScalar LLVector4a::dot4(const LLVector4a& b) const
{
+#if (defined(__arm64__) || defined(__aarch64__))
+ return _mm_dp_ps(mQ, b.mQ, 0xff);
+#else
// ab = { w, z, y, x }
const LLQuad ab = _mm_mul_ps( mQ, b.mQ );
// upperProdsInLowerElems = { y, x, y, x }
@@ -325,6 +340,7 @@ inline LLSimdScalar LLVector4a::dot4(const LLVector4a& b) const
// shuffled = { z+x, z+x, z+x, z+x }
const LLQuad shuffled = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128( sumOfPairs ), _MM_SHUFFLE(1, 1, 1, 1) ) );
return _mm_add_ss( sumOfPairs, shuffled );
+#endif
}
// Normalize this vector with respect to the x, y, and z components only. Accurate to 22 bites of precision. W component is destroyed
@@ -335,8 +351,13 @@ inline void LLVector4a::normalize3()
LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );
// rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+#if _M_ARM64
+ static const LLQuad half = {.n128_f32 = {0.5f, 0.5f, 0.5f, 0.5f}};
+ static const LLQuad three = {.n128_f32 = {3.f, 3.f, 3.f, 3.f }};
+#else
static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+#endif
// Now we do one round of Newton-Raphson approximation to get full accuracy
// According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
// the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
@@ -359,8 +380,13 @@ inline void LLVector4a::normalize4()
LLVector4a lenSqrd; lenSqrd.setAllDot4( *this, *this );
// rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+#if _M_ARM64
+ static const LLQuad half = {.n128_f32 = {0.5f, 0.5f, 0.5f, 0.5f}};
+ static const LLQuad three = {.n128_f32 = {3.f, 3.f, 3.f, 3.f}};
+#else
static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+#endif
// Now we do one round of Newton-Raphson approximation to get full accuracy
// According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
// the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
@@ -383,8 +409,13 @@ inline LLSimdScalar LLVector4a::normalize3withLength()
LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );
// rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+#if _M_ARM64
+ static const LLQuad half = {.n128_f32 = {0.5f, 0.5f, 0.5f, 0.5f}};
+ static const LLQuad three = {.n128_f32 = {3.f, 3.f, 3.f, 3.f}};
+#else
static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+#endif
// Now we do one round of Newton-Raphson approximation to get full accuracy
// According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
// the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
@@ -593,12 +624,6 @@ inline bool LLVector4a::equals3(const LLVector4a& rhs, F32 tolerance ) const
////////////////////////////////////
// Do NOT add aditional operators without consulting someone with SSE experience
-inline const LLVector4a& LLVector4a::operator= ( const LLVector4a& rhs )
-{
- mQ = rhs.mQ;
- return *this;
-}
-
inline const LLVector4a& LLVector4a::operator= ( const LLQuad& rhs )
{
mQ = rhs;
diff --git a/indra/llmath/llvector4logical.h b/indra/llmath/llvector4logical.h
index 70759eef5c..77cb5862e5 100644
--- a/indra/llmath/llvector4logical.h
+++ b/indra/llmath/llvector4logical.h
@@ -61,7 +61,7 @@ public:
};
// Empty default ctor
- LLVector4Logical() {}
+ LLVector4Logical() = default;
LLVector4Logical( const LLQuad& quad )
{
@@ -120,7 +120,9 @@ public:
private:
- LLQuad mQ{};
+ LLQuad mQ;
};
+static_assert(std::is_trivial<LLVector4Logical>::value, "LLVector4Logical must be a standard layout type");
+
#endif //LL_VECTOR4ALOGICAL_H
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 5bc1c3d742..0cf5ecd3d0 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -1294,10 +1294,11 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en
c = cos(ang)*lerp(radius_start, radius_end, t);
- pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s)
+ pt->mPos.set(0 + lerp(0.f, params.getShear().mV[VX], s)
+ lerp(-skew ,skew, t) * 0.5f,
- c + lerp(0,params.getShear().mV[1],s),
+ c + lerp(0.f, params.getShear().mV[VY], s),
s);
+
pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t),
hole_y * lerp(taper_y_begin, taper_y_end, t),
0,1);
@@ -1327,9 +1328,9 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en
c = cos(ang)*lerp(radius_start, radius_end, t);
s = sin(ang)*lerp(radius_start, radius_end, t);
- pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s)
+ pt->mPos.set(0 + lerp(0.f, params.getShear().mV[VX], s)
+ lerp(-skew ,skew, t) * 0.5f,
- c + lerp(0,params.getShear().mV[1],s),
+ c + lerp(0.f, params.getShear().mV[VY], s),
s);
pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t),
@@ -1354,9 +1355,9 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en
c = cos(ang)*lerp(radius_start, radius_end, t);
s = sin(ang)*lerp(radius_start, radius_end, t);
- pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s)
+ pt->mPos.set(0 + lerp(0.f, params.getShear().mV[VX], s)
+ lerp(-skew ,skew, t) * 0.5f,
- c + lerp(0,params.getShear().mV[1],s),
+ c + lerp(0.f, params.getShear().mV[VY], s),
s);
pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t),
hole_y * lerp(taper_y_begin, taper_y_end, t),
@@ -1494,8 +1495,8 @@ bool LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
for (S32 i=0;i<np;i++)
{
F32 t = lerp(params.getBegin(),params.getEnd(),(F32)i * mStep);
- mPath[i].mPos.set(lerp(0,params.getShear().mV[0],t),
- lerp(0,params.getShear().mV[1],t),
+ mPath[i].mPos.set(lerp(0.f, params.getShear().mV[VX], t),
+ lerp(0.f ,params.getShear().mV[VY], t),
t - 0.5f);
LLQuaternion quat;
quat.setQuat(lerp(F_PI * params.getTwistBegin(),F_PI * params.getTwist(),t),0,0,1);
@@ -1559,10 +1560,10 @@ bool LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
{
F32 t = (F32)i * mStep;
mPath[i].mPos.set(0,
- lerp(0, -sin(F_PI*params.getTwist()*t)*0.5f,t),
- lerp(-0.5f, cos(F_PI*params.getTwist()*t)*0.5f,t));
- mPath[i].mScale.set(lerp(1,params.getScale().mV[0],t),
- lerp(1,params.getScale().mV[1],t), 0,1);
+ lerp(0.f, -sin(F_PI*params.getTwist() * t) * 0.5f, t),
+ lerp(-0.5f, cos(F_PI*params.getTwist() * t) * 0.5f, t));
+ mPath[i].mScale.set(lerp(1.f, params.getScale().mV[VX], t),
+ lerp(1.f, params.getScale().mV[VY], t), 0.f, 1.f);
mPath[i].mTexT = t;
LLQuaternion quat;
quat.setQuat(F_PI * params.getTwist() * t,1,0,0);
@@ -5710,13 +5711,29 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)
S32 vert_count = 0;
if (!data.p.empty())
{
- vert_count = static_cast<S32>(meshopt_generateVertexRemapMulti(&remap[0], nullptr, data.p.size(), data.p.size(), mos, stream_count));
+ try
+ {
+ // providing mIndices should help avoid unused vertices
+ // but those should have been filtered out on upload
+ vert_count = static_cast<S32>(meshopt_generateVertexRemapMulti(&remap[0], nullptr, data.p.size(), data.p.size(), mos, stream_count));
+ }
+ catch (std::bad_alloc&)
+ {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS("LLCoros") << "Failed to allocate memory for VertexRemap: " << (S32)data.p.size() << LL_ENDL;
+ }
}
- if (vert_count < 65535 && vert_count != 0)
+ // Probably should be using meshopt_remapVertexBuffer instead of remaping manually
+ if (vert_count < 65535 && vert_count > 0)
{
//copy results back into volume
resizeVertices(vert_count);
+ if (mNumVertices == 0)
+ {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS("LLCoros") << "Failed to allocate memory for resizeVertices(" << vert_count << ")" << LL_ENDL;
+ }
if (!data.w.empty())
{
@@ -5729,13 +5746,27 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)
{
U32 src_idx = i;
U32 dst_idx = remap[i];
- if (dst_idx >= (U32)mNumVertices)
+ if (dst_idx == U32_MAX)
+ {
+ // Unused indices? Probably need to resize mIndices
+ dst_idx = mNumVertices - 1;
+ llassert(false);
+ LL_DEBUGS_ONCE("LLVOLUME") << "U32_MAX destination index, substituting" << LL_ENDL;
+ }
+ else if (dst_idx >= (U32)mNumVertices)
{
dst_idx = mNumVertices - 1;
// Shouldn't happen, figure out what gets returned in remap and why.
llassert(false);
LL_DEBUGS_ONCE("LLVOLUME") << "Invalid destination index, substituting" << LL_ENDL;
}
+ if (src_idx >= (U32)data.p.size())
+ {
+ // data.p.size() is supposed to be equal to mNumIndices
+ src_idx = (U32)(data.p.size() - 1);
+ llassert(false);
+ LL_DEBUGS_ONCE("LLVOLUME") << "Invalid source index, substituting" << LL_ENDL;
+ }
mIndices[i] = dst_idx;
mPositions[dst_idx].load3(data.p[src_idx].mV);
@@ -5769,7 +5800,7 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)
}
else
{
- if (vert_count == 0)
+ if (vert_count <= 0)
{
LL_WARNS_ONCE("LLVOLUME") << "meshopt_generateVertexRemapMulti failed to process a model or model was invalid" << LL_ENDL;
}
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 27c5fc5a49..3496928f7b 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -45,7 +45,6 @@ class LLVolumeOctree;
#include "lluuid.h"
#include "v4color.h"
-//#include "vmath.h"
#include "v2math.h"
#include "v3math.h"
#include "v3dmath.h"
diff --git a/indra/llmath/m3math.cpp b/indra/llmath/m3math.cpp
index 472d340af5..3c2097f947 100644
--- a/indra/llmath/m3math.cpp
+++ b/indra/llmath/m3math.cpp
@@ -26,7 +26,6 @@
#include "linden_common.h"
-//#include "vmath.h"
#include "v3math.h"
#include "v3dmath.h"
#include "v4math.h"
diff --git a/indra/llmath/m3math.h b/indra/llmath/m3math.h
index cd14290246..36661d2cb0 100644
--- a/indra/llmath/m3math.h
+++ b/indra/llmath/m3math.h
@@ -142,6 +142,10 @@ class LLMatrix3
friend std::ostream& operator<<(std::ostream& s, const LLMatrix3 &a); // Stream a
};
+static_assert(std::is_trivially_copyable<LLMatrix3>::value, "LLMatrix3 must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLMatrix3>::value, "LLMatrix3 must be trivial move");
+static_assert(std::is_standard_layout<LLMatrix3>::value, "LLMatrix3 must be a standard layout type");
+
inline LLMatrix3::LLMatrix3(void)
{
mMatrix[0][0] = 1.f;
diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp
index c46ee587cb..1724a50601 100644
--- a/indra/llmath/m4math.cpp
+++ b/indra/llmath/m4math.cpp
@@ -26,7 +26,6 @@
#include "linden_common.h"
-//#include "vmath.h"
#include "v3math.h"
#include "v4math.h"
#include "m4math.h"
@@ -157,10 +156,6 @@ LLMatrix4::LLMatrix4(const F32 roll, const F32 pitch, const F32 yaw)
mMatrix[3][3] = 1.f;
}
-LLMatrix4::~LLMatrix4(void)
-{
-}
-
// Clear and Assignment Functions
const LLMatrix4& LLMatrix4::setZero()
diff --git a/indra/llmath/m4math.h b/indra/llmath/m4math.h
index b0f8c90cdf..f164779283 100644
--- a/indra/llmath/m4math.h
+++ b/indra/llmath/m4math.h
@@ -119,8 +119,6 @@ public:
const LLVector4 &pos); // Initializes Matrix with Euler angles
LLMatrix4(const F32 roll, const F32 pitch, const F32 yaw); // Initializes Matrix with Euler angles
- ~LLMatrix4(void); // Destructor
-
LLSD getValue() const;
void setValue(const LLSD&);
@@ -242,6 +240,10 @@ public:
friend std::ostream& operator<<(std::ostream& s, const LLMatrix4 &a); // Stream a
};
+static_assert(std::is_trivially_copyable<LLMatrix4>::value, "LLMatrix4 must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLMatrix4>::value, "LLMatrix4 must be trivial move");
+static_assert(std::is_standard_layout<LLMatrix4>::value, "LLMatrix4 must be a standard layout type");
+
inline const LLMatrix4& LLMatrix4::setIdentity()
{
mMatrix[0][0] = 1.f;
diff --git a/indra/llmath/raytrace.cpp b/indra/llmath/raytrace.cpp
index 893bf1fc70..c0b5f48f2d 100644
--- a/indra/llmath/raytrace.cpp
+++ b/indra/llmath/raytrace.cpp
@@ -27,7 +27,6 @@
#include "linden_common.h"
#include "math.h"
-//#include "vmath.h"
#include "v3math.h"
#include "llquaternion.h"
#include "m3math.h"
diff --git a/indra/llmath/tests/llquaternion_test.cpp b/indra/llmath/tests/llquaternion_test.cpp
index aa3c0ad843..ba18d54d55 100644
--- a/indra/llmath/tests/llquaternion_test.cpp
+++ b/indra/llmath/tests/llquaternion_test.cpp
@@ -349,9 +349,9 @@ namespace tut
ensure(
"2. LLVector4 operator*(const LLVector4 &a, const LLQuaternion &rot) failed",
is_approx_equal(-58153.5390f, result.mV[0]) &&
- (183787.8125f == result.mV[1]) &&
- (116864.164063f == result.mV[2]) &&
- (78.099998f == result.mV[3]));
+ is_approx_equal(183787.8125f, result.mV[1]) &&
+ is_approx_equal(116864.164063f, result.mV[2]) &&
+ is_approx_equal(78.099998f, result.mV[3]));
}
//test case for LLVector3 operator*(const LLVector3 &a, const LLQuaternion &rot) fn.
diff --git a/indra/llmath/v2math.cpp b/indra/llmath/v2math.cpp
index 4649e13376..175f08df88 100644
--- a/indra/llmath/v2math.cpp
+++ b/indra/llmath/v2math.cpp
@@ -26,7 +26,6 @@
#include "linden_common.h"
-//#include "vmath.h"
#include "v2math.h"
#include "v3math.h"
#include "v4math.h"
@@ -47,8 +46,8 @@ bool LLVector2::abs()
{
bool ret{ false };
- if (mV[0] < 0.f) { mV[0] = -mV[0]; ret = true; }
- if (mV[1] < 0.f) { mV[1] = -mV[1]; ret = true; }
+ if (mV[VX] < 0.f) { mV[VX] = -mV[VX]; ret = true; }
+ if (mV[VY] < 0.f) { mV[VY] = -mV[VY]; ret = true; }
return ret;
}
@@ -67,14 +66,21 @@ F32 angle_between(const LLVector2& a, const LLVector2& b)
return angle;
}
-bool are_parallel(const LLVector2 &a, const LLVector2 &b, float epsilon)
+F32 signed_angle_between(const LLVector2& a, const LLVector2& b)
+{
+ F32 angle = angle_between(a, b);
+ F32 rhombus_square = a[VX] * b[VY] - b[VX] * a[VY];
+ return rhombus_square < 0 ? -angle : angle;
+}
+
+bool are_parallel(const LLVector2& a, const LLVector2& b, F32 epsilon)
{
LLVector2 an = a;
LLVector2 bn = b;
an.normVec();
bn.normVec();
F32 dot = an * bn;
- if ( (1.0f - fabs(dot)) < epsilon)
+ if ((1.0f - fabs(dot)) < epsilon)
{
return true;
}
@@ -82,28 +88,28 @@ bool are_parallel(const LLVector2 &a, const LLVector2 &b, float epsilon)
}
-F32 dist_vec(const LLVector2 &a, const LLVector2 &b)
+F32 dist_vec(const LLVector2& a, const LLVector2& b)
{
- F32 x = a.mV[0] - b.mV[0];
- F32 y = a.mV[1] - b.mV[1];
+ F32 x = a.mV[VX] - b.mV[VX];
+ F32 y = a.mV[VY] - b.mV[VY];
return (F32) sqrt( x*x + y*y );
}
-F32 dist_vec_squared(const LLVector2 &a, const LLVector2 &b)
+F32 dist_vec_squared(const LLVector2& a, const LLVector2& b)
{
- F32 x = a.mV[0] - b.mV[0];
- F32 y = a.mV[1] - b.mV[1];
+ F32 x = a.mV[VX] - b.mV[VX];
+ F32 y = a.mV[VY] - b.mV[VY];
return x*x + y*y;
}
-F32 dist_vec_squared2D(const LLVector2 &a, const LLVector2 &b)
+F32 dist_vec_squared2D(const LLVector2& a, const LLVector2& b)
{
- F32 x = a.mV[0] - b.mV[0];
- F32 y = a.mV[1] - b.mV[1];
+ F32 x = a.mV[VX] - b.mV[VX];
+ F32 y = a.mV[VY] - b.mV[VY];
return x*x + y*y;
}
-LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u)
+LLVector2 lerp(const LLVector2& a, const LLVector2& b, F32 u)
{
return LLVector2(
a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
@@ -113,14 +119,14 @@ LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u)
LLSD LLVector2::getValue() const
{
LLSD ret;
- ret[0] = mV[0];
- ret[1] = mV[1];
+ ret[VX] = mV[VX];
+ ret[VY] = mV[VY];
return ret;
}
void LLVector2::setValue(const LLSD& sd)
{
- mV[0] = (F32) sd[0].asReal();
- mV[1] = (F32) sd[1].asReal();
+ mV[VX] = (F32) sd[0].asReal();
+ mV[VY] = (F32) sd[1].asReal();
}
diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h
index a61c946304..b31e4056a3 100644
--- a/indra/llmath/v2math.h
+++ b/indra/llmath/v2math.h
@@ -36,7 +36,7 @@ class LLQuaternion;
// Llvector2 = |x y z w|
-static const U32 LENGTHOFVECTOR2 = 2;
+static constexpr U32 LENGTHOFVECTOR2 = 2;
class LLVector2
{
@@ -82,7 +82,7 @@ class LLVector2
const LLVector2& scaleVec(const LLVector2& vec); // scales per component by vec
- bool isNull(); // Returns true if vector has a _very_small_ length
+ bool isNull() const; // Returns true if vector has a _very_small_ length
bool isExactlyZero() const { return !mV[VX] && !mV[VY]; }
F32 operator[](int idx) const { return mV[idx]; }
@@ -107,43 +107,43 @@ class LLVector2
friend LLVector2 operator-(const LLVector2 &a); // Return vector -a
- friend std::ostream& operator<<(std::ostream& s, const LLVector2 &a); // Stream a
+ friend std::ostream& operator<<(std::ostream& s, const LLVector2 &a); // Stream a
};
+static_assert(std::is_trivially_copyable<LLVector2>::value, "LLVector2 must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLVector2>::value, "LLVector2 must be trivial move");
+static_assert(std::is_standard_layout<LLVector2>::value, "LLVector2 must be a standard layout type");
// Non-member functions
-F32 angle_between(const LLVector2 &a, const LLVector2 &b); // Returns angle (radians) between a and b
-bool are_parallel(const LLVector2 &a, const LLVector2 &b, F32 epsilon=F_APPROXIMATELY_ZERO); // Returns true if a and b are very close to parallel
-F32 dist_vec(const LLVector2 &a, const LLVector2 &b); // Returns distance between a and b
-F32 dist_vec_squared(const LLVector2 &a, const LLVector2 &b);// Returns distance squared between a and b
-F32 dist_vec_squared2D(const LLVector2 &a, const LLVector2 &b);// Returns distance squared between a and b ignoring Z component
-LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
+F32 angle_between(const LLVector2& a, const LLVector2& b); // Returns angle (radians) between a and b
+F32 signed_angle_between(const LLVector2& a, const LLVector2& b); // Returns signed angle (radians) between a and b
+bool are_parallel(const LLVector2& a, const LLVector2& b, F32 epsilon = F_APPROXIMATELY_ZERO); // Returns true if a and b are very close to parallel
+F32 dist_vec(const LLVector2& a, const LLVector2& b); // Returns distance between a and b
+F32 dist_vec_squared(const LLVector2& a, const LLVector2& b);// Returns distance squared between a and b
+F32 dist_vec_squared2D(const LLVector2& a, const LLVector2& b);// Returns distance squared between a and b ignoring Z component
+LLVector2 lerp(const LLVector2& a, const LLVector2& b, F32 u); // Returns a vector that is a linear interpolation between a and b
// Constructors
-inline LLVector2::LLVector2(void)
+inline LLVector2::LLVector2()
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
+ clear();
}
inline LLVector2::LLVector2(F32 x, F32 y)
{
- mV[VX] = x;
- mV[VY] = y;
+ set(x, y);
}
inline LLVector2::LLVector2(const F32 *vec)
{
- mV[VX] = vec[VX];
- mV[VY] = vec[VY];
+ set(vec);
}
inline LLVector2::LLVector2(const LLVector3 &vec)
{
- mV[VX] = vec.mV[VX];
- mV[VY] = vec.mV[VY];
+ set(vec.mV);
}
inline LLVector2::LLVector2(const LLSD &sd)
@@ -153,30 +153,26 @@ inline LLVector2::LLVector2(const LLSD &sd)
// Clear and Assignment Functions
-inline void LLVector2::clear(void)
+inline void LLVector2::clear()
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
+ mV[VX] = mV[VY] = 0.f;
}
-inline void LLVector2::setZero(void)
+inline void LLVector2::setZero()
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
+ clear();
}
// deprecated
-inline void LLVector2::clearVec(void)
+inline void LLVector2::clearVec()
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
+ clear();
}
// deprecated
-inline void LLVector2::zeroVec(void)
+inline void LLVector2::zeroVec()
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
+ clear();
}
inline void LLVector2::set(F32 x, F32 y)
@@ -187,108 +183,84 @@ inline void LLVector2::set(F32 x, F32 y)
inline void LLVector2::set(const LLVector2 &vec)
{
- mV[VX] = vec.mV[VX];
- mV[VY] = vec.mV[VY];
+ set(vec.mV);
}
inline void LLVector2::set(const F32 *vec)
{
- mV[VX] = vec[VX];
- mV[VY] = vec[VY];
+ set(vec[VX], vec[VY]);
}
// deprecated
inline void LLVector2::setVec(F32 x, F32 y)
{
- mV[VX] = x;
- mV[VY] = y;
+ set(x, y);
}
// deprecated
inline void LLVector2::setVec(const LLVector2 &vec)
{
- mV[VX] = vec.mV[VX];
- mV[VY] = vec.mV[VY];
+ set(vec);
}
// deprecated
inline void LLVector2::setVec(const F32 *vec)
{
- mV[VX] = vec[VX];
- mV[VY] = vec[VY];
+ set(vec);
}
// LLVector2 Magnitude and Normalization Functions
-inline F32 LLVector2::length(void) const
+inline F32 LLVector2::length() const
{
- return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
+ return sqrt(lengthSquared());
}
-inline F32 LLVector2::lengthSquared(void) const
+inline F32 LLVector2::lengthSquared() const
{
- return mV[0]*mV[0] + mV[1]*mV[1];
+ return mV[VX]*mV[VX] + mV[VY]*mV[VY];
}
-inline F32 LLVector2::normalize(void)
+inline F32 LLVector2::normalize()
{
- F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
- F32 oomag;
+ F32 mag = length();
if (mag > FP_MAG_THRESHOLD)
{
- oomag = 1.f/mag;
- mV[0] *= oomag;
- mV[1] *= oomag;
+ *this /= mag;
}
else
{
- mV[0] = 0.f;
- mV[1] = 0.f;
+ clear();
mag = 0;
}
- return (mag);
+ return mag;
}
// checker
inline bool LLVector2::isFinite() const
{
- return (llfinite(mV[VX]) && llfinite(mV[VY]));
+ return llfinite(mV[VX]) && llfinite(mV[VY]);
}
// deprecated
-inline F32 LLVector2::magVec(void) const
+inline F32 LLVector2::magVec() const
{
- return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
+ return length();
}
// deprecated
-inline F32 LLVector2::magVecSquared(void) const
+inline F32 LLVector2::magVecSquared() const
{
- return mV[0]*mV[0] + mV[1]*mV[1];
+ return lengthSquared();
}
// deprecated
-inline F32 LLVector2::normVec(void)
+inline F32 LLVector2::normVec()
{
- F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
- F32 oomag;
-
- if (mag > FP_MAG_THRESHOLD)
- {
- oomag = 1.f/mag;
- mV[0] *= oomag;
- mV[1] *= oomag;
- }
- else
- {
- mV[0] = 0.f;
- mV[1] = 0.f;
- mag = 0;
- }
- return (mag);
+ return normalize();
}
inline const LLVector2& LLVector2::scaleVec(const LLVector2& vec)
@@ -299,22 +271,18 @@ inline const LLVector2& LLVector2::scaleVec(const LLVector2& vec)
return *this;
}
-inline bool LLVector2::isNull()
+inline bool LLVector2::isNull() const
{
- if ( F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY] )
- {
- return true;
- }
- return false;
+ return F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY];
}
// LLVector2 Operators
// For sorting. By convention, x is "more significant" than y.
-inline bool operator<(const LLVector2 &a, const LLVector2 &b)
+inline bool operator<(const LLVector2& a, const LLVector2& b)
{
- if( a.mV[VX] == b.mV[VX] )
+ if (a.mV[VX] == b.mV[VX])
{
return a.mV[VY] < b.mV[VY];
}
@@ -325,95 +293,92 @@ inline bool operator<(const LLVector2 &a, const LLVector2 &b)
}
-inline LLVector2 operator+(const LLVector2 &a, const LLVector2 &b)
+inline LLVector2 operator+(const LLVector2& a, const LLVector2& b)
{
LLVector2 c(a);
return c += b;
}
-inline LLVector2 operator-(const LLVector2 &a, const LLVector2 &b)
+inline LLVector2 operator-(const LLVector2& a, const LLVector2& b)
{
LLVector2 c(a);
return c -= b;
}
-inline F32 operator*(const LLVector2 &a, const LLVector2 &b)
+inline F32 operator*(const LLVector2& a, const LLVector2& b)
{
- return (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1]);
+ return (a.mV[VX]*b.mV[VX] + a.mV[VY]*b.mV[VY]);
}
-inline LLVector2 operator%(const LLVector2 &a, const LLVector2 &b)
+inline LLVector2 operator%(const LLVector2& a, const LLVector2& b)
{
- return LLVector2(a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1], a.mV[1]*b.mV[0] - b.mV[1]*a.mV[0]);
+ return LLVector2(a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY], a.mV[VY]*b.mV[VX] - b.mV[VY]*a.mV[VX]);
}
-inline LLVector2 operator/(const LLVector2 &a, F32 k)
+inline LLVector2 operator/(const LLVector2& a, F32 k)
{
F32 t = 1.f / k;
- return LLVector2( a.mV[0] * t, a.mV[1] * t );
+ return LLVector2( a.mV[VX] * t, a.mV[VY] * t );
}
-inline LLVector2 operator*(const LLVector2 &a, F32 k)
+inline LLVector2 operator*(const LLVector2& a, F32 k)
{
- return LLVector2( a.mV[0] * k, a.mV[1] * k );
+ return LLVector2( a.mV[VX] * k, a.mV[VY] * k );
}
-inline LLVector2 operator*(F32 k, const LLVector2 &a)
+inline LLVector2 operator*(F32 k, const LLVector2& a)
{
- return LLVector2( a.mV[0] * k, a.mV[1] * k );
+ return LLVector2( a.mV[VX] * k, a.mV[VY] * k );
}
-inline bool operator==(const LLVector2 &a, const LLVector2 &b)
+inline bool operator==(const LLVector2& a, const LLVector2& b)
{
- return ( (a.mV[0] == b.mV[0])
- &&(a.mV[1] == b.mV[1]));
+ return ( (a.mV[VX] == b.mV[VX])
+ &&(a.mV[VY] == b.mV[VY]));
}
-inline bool operator!=(const LLVector2 &a, const LLVector2 &b)
+inline bool operator!=(const LLVector2& a, const LLVector2& b)
{
- return ( (a.mV[0] != b.mV[0])
- ||(a.mV[1] != b.mV[1]));
+ return ( (a.mV[VX] != b.mV[VX])
+ ||(a.mV[VY] != b.mV[VY]));
}
-inline const LLVector2& operator+=(LLVector2 &a, const LLVector2 &b)
+inline const LLVector2& operator+=(LLVector2& a, const LLVector2& b)
{
- a.mV[0] += b.mV[0];
- a.mV[1] += b.mV[1];
+ a.mV[VX] += b.mV[VX];
+ a.mV[VY] += b.mV[VY];
return a;
}
-inline const LLVector2& operator-=(LLVector2 &a, const LLVector2 &b)
+inline const LLVector2& operator-=(LLVector2& a, const LLVector2& b)
{
- a.mV[0] -= b.mV[0];
- a.mV[1] -= b.mV[1];
+ a.mV[VX] -= b.mV[VX];
+ a.mV[VY] -= b.mV[VY];
return a;
}
-inline const LLVector2& operator%=(LLVector2 &a, const LLVector2 &b)
+inline const LLVector2& operator%=(LLVector2& a, const LLVector2& b)
{
- LLVector2 ret(a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1], a.mV[1]*b.mV[0] - b.mV[1]*a.mV[0]);
+ LLVector2 ret(a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY], a.mV[VY]*b.mV[VX] - b.mV[VY]*a.mV[VX]);
a = ret;
return a;
}
-inline const LLVector2& operator*=(LLVector2 &a, F32 k)
+inline const LLVector2& operator*=(LLVector2& a, F32 k)
{
- a.mV[0] *= k;
- a.mV[1] *= k;
+ a.mV[VX] *= k;
+ a.mV[VY] *= k;
return a;
}
-inline const LLVector2& operator/=(LLVector2 &a, F32 k)
+inline const LLVector2& operator/=(LLVector2& a, F32 k)
{
- F32 t = 1.f / k;
- a.mV[0] *= t;
- a.mV[1] *= t;
- return a;
+ return a *= 1.f / k;
}
-inline LLVector2 operator-(const LLVector2 &a)
+inline LLVector2 operator-(const LLVector2& a)
{
- return LLVector2( -a.mV[0], -a.mV[1] );
+ return LLVector2( -a.mV[VX], -a.mV[VY] );
}
inline void update_min_max(LLVector2& min, LLVector2& max, const LLVector2& pos)
@@ -431,7 +396,7 @@ inline void update_min_max(LLVector2& min, LLVector2& max, const LLVector2& pos)
}
}
-inline std::ostream& operator<<(std::ostream& s, const LLVector2 &a)
+inline std::ostream& operator<<(std::ostream& s, const LLVector2& a)
{
s << "{ " << a.mV[VX] << ", " << a.mV[VY] << " }";
return s;
diff --git a/indra/llmath/v3color.cpp b/indra/llmath/v3color.cpp
index 4367b993f8..08b3795020 100644
--- a/indra/llmath/v3color.cpp
+++ b/indra/llmath/v3color.cpp
@@ -32,74 +32,79 @@
LLColor3 LLColor3::white(1.0f, 1.0f, 1.0f);
LLColor3 LLColor3::black(0.0f, 0.0f, 0.0f);
-LLColor3 LLColor3::grey (0.5f, 0.5f, 0.5f);
+LLColor3 LLColor3::grey(0.5f, 0.5f, 0.5f);
-LLColor3::LLColor3(const LLColor4 &a)
+LLColor3::LLColor3(const LLColor4& a)
{
- mV[0] = a.mV[0];
- mV[1] = a.mV[1];
- mV[2] = a.mV[2];
+ mV[VRED] = a.mV[VRED];
+ mV[VGREEN] = a.mV[VGREEN];
+ mV[VBLUE] = a.mV[VBLUE];
}
-LLColor3::LLColor3(const LLVector4 &a)
+LLColor3::LLColor3(const LLVector4& a)
{
- mV[0] = a.mV[0];
- mV[1] = a.mV[1];
- mV[2] = a.mV[2];
+ mV[VRED] = a.mV[VRED];
+ mV[VGREEN] = a.mV[VGREEN];
+ mV[VBLUE] = a.mV[VBLUE];
}
-LLColor3::LLColor3(const LLSD &sd)
+LLColor3::LLColor3(const LLSD& sd)
{
setValue(sd);
}
-const LLColor3& LLColor3::operator=(const LLColor4 &a)
+const LLColor3& LLColor3::operator=(const LLColor4& a)
{
- mV[0] = a.mV[0];
- mV[1] = a.mV[1];
- mV[2] = a.mV[2];
+ mV[VRED] = a.mV[VRED];
+ mV[VGREEN] = a.mV[VGREEN];
+ mV[VBLUE] = a.mV[VBLUE];
return (*this);
}
-std::ostream& operator<<(std::ostream& s, const LLColor3 &a)
+std::ostream& operator<<(std::ostream& s, const LLColor3& a)
{
s << "{ " << a.mV[VRED] << ", " << a.mV[VGREEN] << ", " << a.mV[VBLUE] << " }";
return s;
}
-static F32 hueToRgb ( F32 val1In, F32 val2In, F32 valHUeIn )
+static F32 hueToRgb(F32 val1In, F32 val2In, F32 valHUeIn)
{
- if ( valHUeIn < 0.0f ) valHUeIn += 1.0f;
- if ( valHUeIn > 1.0f ) valHUeIn -= 1.0f;
- if ( ( 6.0f * valHUeIn ) < 1.0f ) return ( val1In + ( val2In - val1In ) * 6.0f * valHUeIn );
- if ( ( 2.0f * valHUeIn ) < 1.0f ) return ( val2In );
- if ( ( 3.0f * valHUeIn ) < 2.0f ) return ( val1In + ( val2In - val1In ) * ( ( 2.0f / 3.0f ) - valHUeIn ) * 6.0f );
- return ( val1In );
+ if (valHUeIn < 0.0f)
+ valHUeIn += 1.0f;
+ if (valHUeIn > 1.0f)
+ valHUeIn -= 1.0f;
+ if ((6.0f * valHUeIn) < 1.0f)
+ return (val1In + (val2In - val1In) * 6.0f * valHUeIn);
+ if ((2.0f * valHUeIn) < 1.0f)
+ return (val2In);
+ if ((3.0f * valHUeIn) < 2.0f)
+ return (val1In + (val2In - val1In) * ((2.0f / 3.0f) - valHUeIn) * 6.0f);
+ return (val1In);
}
-void LLColor3::setHSL ( F32 hValIn, F32 sValIn, F32 lValIn)
+void LLColor3::setHSL(F32 hValIn, F32 sValIn, F32 lValIn)
{
- if ( sValIn < 0.00001f )
+ if (sValIn < 0.00001f)
{
- mV[VRED] = lValIn;
+ mV[VRED] = lValIn;
mV[VGREEN] = lValIn;
- mV[VBLUE] = lValIn;
+ mV[VBLUE] = lValIn;
}
else
{
F32 interVal1;
F32 interVal2;
- if ( lValIn < 0.5f )
- interVal2 = lValIn * ( 1.0f + sValIn );
+ if (lValIn < 0.5f)
+ interVal2 = lValIn * (1.0f + sValIn);
else
- interVal2 = ( lValIn + sValIn ) - ( sValIn * lValIn );
+ interVal2 = (lValIn + sValIn) - (sValIn * lValIn);
interVal1 = 2.0f * lValIn - interVal2;
- mV[VRED] = hueToRgb ( interVal1, interVal2, hValIn + ( 1.f / 3.f ) );
- mV[VGREEN] = hueToRgb ( interVal1, interVal2, hValIn );
- mV[VBLUE] = hueToRgb ( interVal1, interVal2, hValIn - ( 1.f / 3.f ) );
+ mV[VRED] = hueToRgb(interVal1, interVal2, hValIn + (1.f / 3.f));
+ mV[VGREEN] = hueToRgb(interVal1, interVal2, hValIn);
+ mV[VBLUE] = hueToRgb(interVal1, interVal2, hValIn - (1.f / 3.f));
}
}
@@ -109,45 +114,48 @@ void LLColor3::calcHSL(F32* hue, F32* saturation, F32* luminance) const
F32 var_G = mV[VGREEN];
F32 var_B = mV[VBLUE];
- F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) );
- F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) );
+ F32 var_Min = (var_R < (var_G < var_B ? var_G : var_B) ? var_R : (var_G < var_B ? var_G : var_B));
+ F32 var_Max = (var_R > (var_G > var_B ? var_G : var_B) ? var_R : (var_G > var_B ? var_G : var_B));
F32 del_Max = var_Max - var_Min;
- F32 L = ( var_Max + var_Min ) / 2.0f;
+ F32 L = (var_Max + var_Min) / 2.0f;
F32 H = 0.0f;
F32 S = 0.0f;
- if ( del_Max == 0.0f )
+ if (del_Max == 0.0f)
{
- H = 0.0f;
- S = 0.0f;
+ H = 0.0f;
+ S = 0.0f;
}
else
{
- if ( L < 0.5 )
- S = del_Max / ( var_Max + var_Min );
+ if (L < 0.5)
+ S = del_Max / (var_Max + var_Min);
else
- S = del_Max / ( 2.0f - var_Max - var_Min );
+ S = del_Max / (2.0f - var_Max - var_Min);
- F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
- F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
- F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
+ F32 del_R = (((var_Max - var_R) / 6.0f) + (del_Max / 2.0f)) / del_Max;
+ F32 del_G = (((var_Max - var_G) / 6.0f) + (del_Max / 2.0f)) / del_Max;
+ F32 del_B = (((var_Max - var_B) / 6.0f) + (del_Max / 2.0f)) / del_Max;
- if ( var_R >= var_Max )
+ if (var_R >= var_Max)
H = del_B - del_G;
- else
- if ( var_G >= var_Max )
- H = ( 1.0f / 3.0f ) + del_R - del_B;
- else
- if ( var_B >= var_Max )
- H = ( 2.0f / 3.0f ) + del_G - del_R;
-
- if ( H < 0.0f ) H += 1.0f;
- if ( H > 1.0f ) H -= 1.0f;
+ else if (var_G >= var_Max)
+ H = (1.0f / 3.0f) + del_R - del_B;
+ else if (var_B >= var_Max)
+ H = (2.0f / 3.0f) + del_G - del_R;
+
+ if (H < 0.0f)
+ H += 1.0f;
+ if (H > 1.0f)
+ H -= 1.0f;
}
- if (hue) *hue = H;
- if (saturation) *saturation = S;
- if (luminance) *luminance = L;
+ if (hue)
+ *hue = H;
+ if (saturation)
+ *saturation = S;
+ if (luminance)
+ *luminance = L;
}
diff --git a/indra/llmath/v3color.h b/indra/llmath/v3color.h
index f7af469e66..7357d93599 100644
--- a/indra/llmath/v3color.h
+++ b/indra/llmath/v3color.h
@@ -33,12 +33,12 @@ class LLVector4;
#include "llerror.h"
#include "llmath.h"
#include "llsd.h"
-#include "v3math.h" // needed for linearColor3v implemtation below
+#include "v3math.h" // needed for linearColor3v implemtation below
#include <string.h>
// LLColor3 = |r g b|
-static const U32 LENGTHOFCOLOR3 = 3;
+static constexpr U32 LENGTHOFCOLOR3 = 3;
class LLColor3
{
@@ -50,44 +50,43 @@ public:
static LLColor3 grey;
public:
- LLColor3(); // Initializes LLColor3 to (0, 0, 0)
- LLColor3(F32 r, F32 g, F32 b); // Initializes LLColor3 to (r, g, b)
- LLColor3(const F32 *vec); // Initializes LLColor3 to (vec[0]. vec[1], vec[2])
- LLColor3(const char *color_string); // html format color ie "#FFDDEE"
- explicit LLColor3(const LLColor4& color4); // "explicit" to avoid automatic conversion
- explicit LLColor3(const LLVector4& vector4); // "explicit" to avoid automatic conversion
+ LLColor3(); // Initializes LLColor3 to (0, 0, 0)
+ LLColor3(F32 r, F32 g, F32 b); // Initializes LLColor3 to (r, g, b)
+ LLColor3(const F32* vec); // Initializes LLColor3 to (vec[0]. vec[1], vec[2])
+ LLColor3(const char* color_string); // html format color ie "#FFDDEE"
+ explicit LLColor3(const LLColor4& color4); // "explicit" to avoid automatic conversion
+ explicit LLColor3(const LLVector4& vector4); // "explicit" to avoid automatic conversion
LLColor3(const LLSD& sd);
-
LLSD getValue() const
{
LLSD ret;
- ret[0] = mV[0];
- ret[1] = mV[1];
- ret[2] = mV[2];
+ ret[VRED] = mV[VRED];
+ ret[VGREEN] = mV[VGREEN];
+ ret[VBLUE] = mV[VBLUE];
return ret;
}
void setValue(const LLSD& sd)
{
- mV[0] = (F32) sd[0].asReal();;
- mV[1] = (F32) sd[1].asReal();;
- mV[2] = (F32) sd[2].asReal();;
+ mV[VRED] = (F32)sd[VRED].asReal();
+ mV[VGREEN] = (F32)sd[VGREEN].asReal();
+ mV[VBLUE] = (F32)sd[VBLUE].asReal();
}
void setHSL(F32 hue, F32 saturation, F32 luminance);
void calcHSL(F32* hue, F32* saturation, F32* luminance) const;
- const LLColor3& setToBlack(); // Clears LLColor3 to (0, 0, 0)
- const LLColor3& setToWhite(); // Zero LLColor3 to (0, 0, 0)
+ const LLColor3& setToBlack(); // Clears LLColor3 to (0, 0, 0)
+ const LLColor3& setToWhite(); // Zero LLColor3 to (0, 0, 0)
- const LLColor3& setVec(F32 x, F32 y, F32 z); // deprecated
- const LLColor3& setVec(const LLColor3 &vec); // deprecated
- const LLColor3& setVec(const F32 *vec); // deprecated
+ const LLColor3& setVec(F32 x, F32 y, F32 z); // deprecated
+ const LLColor3& setVec(const LLColor3& vec); // deprecated
+ const LLColor3& setVec(const F32* vec); // deprecated
- const LLColor3& set(F32 x, F32 y, F32 z); // Sets LLColor3 to (x, y, z)
- const LLColor3& set(const LLColor3 &vec); // Sets LLColor3 to vec
- const LLColor3& set(const F32 *vec); // Sets LLColor3 to vec
+ const LLColor3& set(F32 x, F32 y, F32 z); // Sets LLColor3 to (x, y, z)
+ const LLColor3& set(const LLColor3& vec); // Sets LLColor3 to vec
+ const LLColor3& set(const F32* vec); // Sets LLColor3 to vec
// set from a vector of unknown type and size
// may leave some data unmodified
@@ -99,414 +98,393 @@ public:
template<typename T>
void write(std::vector<T>& v) const;
- F32 magVec() const; // deprecated
- F32 magVecSquared() const; // deprecated
- F32 normVec(); // deprecated
+ F32 magVec() const; // deprecated
+ F32 magVecSquared() const; // deprecated
+ F32 normVec(); // deprecated
- F32 length() const; // Returns magnitude of LLColor3
- F32 lengthSquared() const; // Returns magnitude squared of LLColor3
- F32 normalize(); // Normalizes and returns the magnitude of LLColor3
+ F32 length() const; // Returns magnitude of LLColor3
+ F32 lengthSquared() const; // Returns magnitude squared of LLColor3
+ F32 normalize(); // Normalizes and returns the magnitude of LLColor3
- F32 brightness() const; // Returns brightness of LLColor3
+ F32 brightness() const; // Returns brightness of LLColor3
- const LLColor3& operator=(const LLColor4 &a);
+ const LLColor3& operator=(const LLColor4& a);
- LL_FORCE_INLINE LLColor3 divide(const LLColor3 &col2)
+ LL_FORCE_INLINE LLColor3 divide(const LLColor3& col2) const
{
- return LLColor3(
- mV[0] / col2.mV[0],
- mV[1] / col2.mV[1],
- mV[2] / col2.mV[2] );
+ return LLColor3(mV[VRED] / col2.mV[VRED], mV[VGREEN] / col2.mV[VGREEN], mV[VBLUE] / col2.mV[VBLUE]);
}
- LL_FORCE_INLINE LLColor3 color_norm()
+ LL_FORCE_INLINE LLColor3 color_norm() const
{
F32 l = length();
- return LLColor3(
- mV[0] / l,
- mV[1] / l,
- mV[2] / l );
+ return LLColor3(mV[VRED] / l, mV[VGREEN] / l, mV[VBLUE] / l);
}
- friend std::ostream& operator<<(std::ostream& s, const LLColor3 &a); // Print a
- friend LLColor3 operator+(const LLColor3 &a, const LLColor3 &b); // Return vector a + b
- friend LLColor3 operator-(const LLColor3 &a, const LLColor3 &b); // Return vector a minus b
+ friend std::ostream& operator<<(std::ostream& s, const LLColor3& a); // Print a
+ friend LLColor3 operator+(const LLColor3& a, const LLColor3& b); // Return vector a + b
+ friend LLColor3 operator-(const LLColor3& a, const LLColor3& b); // Return vector a minus b
- friend const LLColor3& operator+=(LLColor3 &a, const LLColor3 &b); // Return vector a + b
- friend const LLColor3& operator-=(LLColor3 &a, const LLColor3 &b); // Return vector a minus b
- friend const LLColor3& operator*=(LLColor3 &a, const LLColor3 &b);
+ friend const LLColor3& operator+=(LLColor3& a, const LLColor3& b); // Return vector a + b
+ friend const LLColor3& operator-=(LLColor3& a, const LLColor3& b); // Return vector a minus b
+ friend const LLColor3& operator*=(LLColor3& a, const LLColor3& b);
- friend LLColor3 operator*(const LLColor3 &a, const LLColor3 &b); // Return component wise a * b
- friend LLColor3 operator*(const LLColor3 &a, F32 k); // Return a times scaler k
- friend LLColor3 operator*(F32 k, const LLColor3 &a); // Return a times scaler k
+ friend LLColor3 operator*(const LLColor3& a, const LLColor3& b); // Return component wise a * b
+ friend LLColor3 operator*(const LLColor3& a, F32 k); // Return a times scaler k
+ friend LLColor3 operator*(F32 k, const LLColor3& a); // Return a times scaler k
- friend bool operator==(const LLColor3 &a, const LLColor3 &b); // Return a == b
- friend bool operator!=(const LLColor3 &a, const LLColor3 &b); // Return a != b
+ friend bool operator==(const LLColor3& a, const LLColor3& b); // Return a == b
+ friend bool operator!=(const LLColor3& a, const LLColor3& b); // Return a != b
- friend const LLColor3& operator*=(LLColor3 &a, F32 k); // Return a times scaler k
+ friend const LLColor3& operator*=(LLColor3& a, F32 k); // Return a times scaler k
- friend LLColor3 operator-(const LLColor3 &a); // Return vector 1-rgb (inverse)
+ friend LLColor3 operator-(const LLColor3& a); // Return vector 1-rgb (inverse)
inline void clamp();
- inline void exp(); // Do an exponential on the color
+ inline void exp(); // Do an exponential on the color
};
-LLColor3 lerp(const LLColor3 &a, const LLColor3 &b, F32 u);
-
+static_assert(std::is_trivially_copyable<LLColor3>::value, "LLColor3 must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLColor3>::value, "LLColor3 must be trivial move");
+static_assert(std::is_standard_layout<LLColor3>::value, "LLColor3 must be a standard layout type");
+LLColor3 lerp(const LLColor3& a, const LLColor3& b, F32 u);
void LLColor3::clamp()
{
// Clamp the color...
- if (mV[0] < 0.f)
+ if (mV[VRED] < 0.f)
{
- mV[0] = 0.f;
+ mV[VRED] = 0.f;
}
- else if (mV[0] > 1.f)
+ else if (mV[VRED] > 1.f)
{
- mV[0] = 1.f;
+ mV[VRED] = 1.f;
}
- if (mV[1] < 0.f)
+ if (mV[VGREEN] < 0.f)
{
- mV[1] = 0.f;
+ mV[VGREEN] = 0.f;
}
- else if (mV[1] > 1.f)
+ else if (mV[VGREEN] > 1.f)
{
- mV[1] = 1.f;
+ mV[VGREEN] = 1.f;
}
- if (mV[2] < 0.f)
+ if (mV[VBLUE] < 0.f)
{
- mV[2] = 0.f;
+ mV[VBLUE] = 0.f;
}
- else if (mV[2] > 1.f)
+ else if (mV[VBLUE] > 1.f)
{
- mV[2] = 1.f;
+ mV[VBLUE] = 1.f;
}
}
// Non-member functions
-F32 distVec(const LLColor3 &a, const LLColor3 &b); // Returns distance between a and b
-F32 distVec_squared(const LLColor3 &a, const LLColor3 &b);// Returns distance squared between a and b
+F32 distVec(const LLColor3& a, const LLColor3& b); // Returns distance between a and b
+F32 distVec_squared(const LLColor3& a, const LLColor3& b); // Returns distance squared between a and b
-inline LLColor3::LLColor3(void)
+inline LLColor3::LLColor3()
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ mV[VRED] = 0.f;
+ mV[VGREEN] = 0.f;
+ mV[VBLUE] = 0.f;
}
inline LLColor3::LLColor3(F32 r, F32 g, F32 b)
{
- mV[VRED] = r;
+ mV[VRED] = r;
mV[VGREEN] = g;
- mV[VBLUE] = b;
+ mV[VBLUE] = b;
}
-
-inline LLColor3::LLColor3(const F32 *vec)
+inline LLColor3::LLColor3(const F32* vec)
{
- mV[VRED] = vec[VRED];
+ mV[VRED] = vec[VRED];
mV[VGREEN] = vec[VGREEN];
- mV[VBLUE] = vec[VBLUE];
+ mV[VBLUE] = vec[VBLUE];
}
inline LLColor3::LLColor3(const char* color_string) // takes a string of format "RRGGBB" where RR is hex 00..FF
{
- if (strlen(color_string) < 6) /* Flawfinder: ignore */
+ if (strlen(color_string) < 6) /* Flawfinder: ignore */
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ mV[VRED] = 0.f;
+ mV[VGREEN] = 0.f;
+ mV[VBLUE] = 0.f;
return;
}
char tempstr[7];
- strncpy(tempstr,color_string,6); /* Flawfinder: ignore */
+ strncpy(tempstr, color_string, 6); /* Flawfinder: ignore */
tempstr[6] = '\0';
- mV[VBLUE] = (F32)strtol(&tempstr[4],NULL,16)/255.f;
+ mV[VBLUE] = (F32)strtol(&tempstr[4], nullptr, 16) / 255.f;
tempstr[4] = '\0';
- mV[VGREEN] = (F32)strtol(&tempstr[2],NULL,16)/255.f;
+ mV[VGREEN] = (F32)strtol(&tempstr[2], nullptr, 16) / 255.f;
tempstr[2] = '\0';
- mV[VRED] = (F32)strtol(&tempstr[0],NULL,16)/255.f;
+ mV[VRED] = (F32)strtol(&tempstr[0], nullptr, 16) / 255.f;
}
-inline const LLColor3& LLColor3::setToBlack(void)
+inline const LLColor3& LLColor3::setToBlack()
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ mV[VRED] = 0.f;
+ mV[VGREEN] = 0.f;
+ mV[VBLUE] = 0.f;
return (*this);
}
-inline const LLColor3& LLColor3::setToWhite(void)
+inline const LLColor3& LLColor3::setToWhite()
{
- mV[0] = 1.f;
- mV[1] = 1.f;
- mV[2] = 1.f;
+ mV[VRED] = 1.f;
+ mV[VGREEN] = 1.f;
+ mV[VBLUE] = 1.f;
return (*this);
}
-inline const LLColor3& LLColor3::set(F32 r, F32 g, F32 b)
+inline const LLColor3& LLColor3::set(F32 r, F32 g, F32 b)
{
- mV[0] = r;
- mV[1] = g;
- mV[2] = b;
+ mV[VRED] = r;
+ mV[VGREEN] = g;
+ mV[VBLUE] = b;
return (*this);
}
-inline const LLColor3& LLColor3::set(const LLColor3 &vec)
+inline const LLColor3& LLColor3::set(const LLColor3& vec)
{
- mV[0] = vec.mV[0];
- mV[1] = vec.mV[1];
- mV[2] = vec.mV[2];
+ mV[VRED] = vec.mV[VRED];
+ mV[VGREEN] = vec.mV[VGREEN];
+ mV[VBLUE] = vec.mV[VBLUE];
return (*this);
}
-inline const LLColor3& LLColor3::set(const F32 *vec)
+inline const LLColor3& LLColor3::set(const F32* vec)
{
- mV[0] = vec[0];
- mV[1] = vec[1];
- mV[2] = vec[2];
+ mV[VRED] = vec[VRED];
+ mV[VGREEN] = vec[VGREEN];
+ mV[VBLUE] = vec[VBLUE];
return (*this);
}
// deprecated
-inline const LLColor3& LLColor3::setVec(F32 r, F32 g, F32 b)
+inline const LLColor3& LLColor3::setVec(F32 r, F32 g, F32 b)
{
- mV[0] = r;
- mV[1] = g;
- mV[2] = b;
+ mV[VRED] = r;
+ mV[VGREEN] = g;
+ mV[VBLUE] = b;
return (*this);
}
// deprecated
-inline const LLColor3& LLColor3::setVec(const LLColor3 &vec)
+inline const LLColor3& LLColor3::setVec(const LLColor3& vec)
{
- mV[0] = vec.mV[0];
- mV[1] = vec.mV[1];
- mV[2] = vec.mV[2];
+ mV[VRED] = vec.mV[VRED];
+ mV[VGREEN] = vec.mV[VGREEN];
+ mV[VBLUE] = vec.mV[VBLUE];
return (*this);
}
// deprecated
-inline const LLColor3& LLColor3::setVec(const F32 *vec)
+inline const LLColor3& LLColor3::setVec(const F32* vec)
{
- mV[0] = vec[0];
- mV[1] = vec[1];
- mV[2] = vec[2];
+ mV[VRED] = vec[VRED];
+ mV[VGREEN] = vec[VGREEN];
+ mV[VBLUE] = vec[VBLUE];
return (*this);
}
-inline F32 LLColor3::brightness(void) const
+inline F32 LLColor3::brightness() const
{
- return (mV[0] + mV[1] + mV[2]) / 3.0f;
+ return (mV[VRED] + mV[VGREEN] + mV[VBLUE]) / 3.0f;
}
-inline F32 LLColor3::length(void) const
+inline F32 LLColor3::length() const
{
- return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);
}
-inline F32 LLColor3::lengthSquared(void) const
+inline F32 LLColor3::lengthSquared() const
{
- return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
+ return mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE];
}
-inline F32 LLColor3::normalize(void)
+inline F32 LLColor3::normalize()
{
- F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);
F32 oomag;
if (mag)
{
- oomag = 1.f/mag;
- mV[0] *= oomag;
- mV[1] *= oomag;
- mV[2] *= oomag;
+ oomag = 1.f / mag;
+ mV[VRED] *= oomag;
+ mV[VGREEN] *= oomag;
+ mV[VBLUE] *= oomag;
}
- return (mag);
+ return mag;
}
// deprecated
-inline F32 LLColor3::magVec(void) const
+inline F32 LLColor3::magVec() const
{
- return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);
}
// deprecated
-inline F32 LLColor3::magVecSquared(void) const
+inline F32 LLColor3::magVecSquared() const
{
- return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
+ return mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE];
}
// deprecated
-inline F32 LLColor3::normVec(void)
+inline F32 LLColor3::normVec()
{
- F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);
F32 oomag;
if (mag)
{
- oomag = 1.f/mag;
- mV[0] *= oomag;
- mV[1] *= oomag;
- mV[2] *= oomag;
+ oomag = 1.f / mag;
+ mV[VRED] *= oomag;
+ mV[VGREEN] *= oomag;
+ mV[VBLUE] *= oomag;
}
- return (mag);
+ return mag;
}
inline void LLColor3::exp()
{
#if 0
- mV[0] = ::exp(mV[0]);
- mV[1] = ::exp(mV[1]);
- mV[2] = ::exp(mV[2]);
+ mV[VRED] = ::exp(mV[VRED]);
+ mV[VGREEN] = ::exp(mV[VGREEN]);
+ mV[VBLUE] = ::exp(mV[VBLUE]);
#else
- mV[0] = (F32)LL_FAST_EXP(mV[0]);
- mV[1] = (F32)LL_FAST_EXP(mV[1]);
- mV[2] = (F32)LL_FAST_EXP(mV[2]);
+ mV[VRED] = (F32)LL_FAST_EXP(mV[VRED]);
+ mV[VGREEN] = (F32)LL_FAST_EXP(mV[VGREEN]);
+ mV[VBLUE] = (F32)LL_FAST_EXP(mV[VBLUE]);
#endif
}
-
-inline LLColor3 operator+(const LLColor3 &a, const LLColor3 &b)
+inline LLColor3 operator+(const LLColor3& a, const LLColor3& b)
{
- return LLColor3(
- a.mV[0] + b.mV[0],
- a.mV[1] + b.mV[1],
- a.mV[2] + b.mV[2]);
+ return LLColor3(a.mV[VRED] + b.mV[VRED], a.mV[VGREEN] + b.mV[VGREEN], a.mV[VBLUE] + b.mV[VBLUE]);
}
-inline LLColor3 operator-(const LLColor3 &a, const LLColor3 &b)
+inline LLColor3 operator-(const LLColor3& a, const LLColor3& b)
{
- return LLColor3(
- a.mV[0] - b.mV[0],
- a.mV[1] - b.mV[1],
- a.mV[2] - b.mV[2]);
+ return LLColor3(a.mV[VRED] - b.mV[VRED], a.mV[VGREEN] - b.mV[VGREEN], a.mV[VBLUE] - b.mV[VBLUE]);
}
-inline LLColor3 operator*(const LLColor3 &a, const LLColor3 &b)
+inline LLColor3 operator*(const LLColor3& a, const LLColor3& b)
{
- return LLColor3(
- a.mV[0] * b.mV[0],
- a.mV[1] * b.mV[1],
- a.mV[2] * b.mV[2]);
+ return LLColor3(a.mV[VRED] * b.mV[VRED], a.mV[VGREEN] * b.mV[VGREEN], a.mV[VBLUE] * b.mV[VBLUE]);
}
-inline LLColor3 operator*(const LLColor3 &a, F32 k)
+inline LLColor3 operator*(const LLColor3& a, F32 k)
{
- return LLColor3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k );
+ return LLColor3(a.mV[VRED] * k, a.mV[VGREEN] * k, a.mV[VBLUE] * k);
}
-inline LLColor3 operator*(F32 k, const LLColor3 &a)
+inline LLColor3 operator*(F32 k, const LLColor3& a)
{
- return LLColor3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k );
+ return LLColor3(a.mV[VRED] * k, a.mV[VGREEN] * k, a.mV[VBLUE] * k);
}
-inline bool operator==(const LLColor3 &a, const LLColor3 &b)
+inline bool operator==(const LLColor3& a, const LLColor3& b)
{
- return ( (a.mV[0] == b.mV[0])
- &&(a.mV[1] == b.mV[1])
- &&(a.mV[2] == b.mV[2]));
+ return ((a.mV[VRED] == b.mV[VRED]) && (a.mV[VGREEN] == b.mV[VGREEN]) && (a.mV[VBLUE] == b.mV[VBLUE]));
}
-inline bool operator!=(const LLColor3 &a, const LLColor3 &b)
+inline bool operator!=(const LLColor3& a, const LLColor3& b)
{
- return ( (a.mV[0] != b.mV[0])
- ||(a.mV[1] != b.mV[1])
- ||(a.mV[2] != b.mV[2]));
+ return ((a.mV[VRED] != b.mV[VRED]) || (a.mV[VGREEN] != b.mV[VGREEN]) || (a.mV[VBLUE] != b.mV[VBLUE]));
}
-inline const LLColor3 &operator*=(LLColor3 &a, const LLColor3 &b)
+inline const LLColor3& operator*=(LLColor3& a, const LLColor3& b)
{
- a.mV[0] *= b.mV[0];
- a.mV[1] *= b.mV[1];
- a.mV[2] *= b.mV[2];
+ a.mV[VRED] *= b.mV[VRED];
+ a.mV[VGREEN] *= b.mV[VGREEN];
+ a.mV[VBLUE] *= b.mV[VBLUE];
return a;
}
-inline const LLColor3& operator+=(LLColor3 &a, const LLColor3 &b)
+inline const LLColor3& operator+=(LLColor3& a, const LLColor3& b)
{
- a.mV[0] += b.mV[0];
- a.mV[1] += b.mV[1];
- a.mV[2] += b.mV[2];
+ a.mV[VRED] += b.mV[VRED];
+ a.mV[VGREEN] += b.mV[VGREEN];
+ a.mV[VBLUE] += b.mV[VBLUE];
return a;
}
-inline const LLColor3& operator-=(LLColor3 &a, const LLColor3 &b)
+inline const LLColor3& operator-=(LLColor3& a, const LLColor3& b)
{
- a.mV[0] -= b.mV[0];
- a.mV[1] -= b.mV[1];
- a.mV[2] -= b.mV[2];
+ a.mV[VRED] -= b.mV[VRED];
+ a.mV[VGREEN] -= b.mV[VGREEN];
+ a.mV[VBLUE] -= b.mV[VBLUE];
return a;
}
-inline const LLColor3& operator*=(LLColor3 &a, F32 k)
+inline const LLColor3& operator*=(LLColor3& a, F32 k)
{
- a.mV[0] *= k;
- a.mV[1] *= k;
- a.mV[2] *= k;
+ a.mV[VRED] *= k;
+ a.mV[VGREEN] *= k;
+ a.mV[VBLUE] *= k;
return a;
}
-inline LLColor3 operator-(const LLColor3 &a)
+inline LLColor3 operator-(const LLColor3& a)
{
- return LLColor3(
- 1.f - a.mV[0],
- 1.f - a.mV[1],
- 1.f - a.mV[2] );
+ return LLColor3(1.f - a.mV[VRED], 1.f - a.mV[VGREEN], 1.f - a.mV[VBLUE]);
}
// Non-member functions
-inline F32 distVec(const LLColor3 &a, const LLColor3 &b)
+inline F32 distVec(const LLColor3& a, const LLColor3& b)
{
- F32 x = a.mV[0] - b.mV[0];
- F32 y = a.mV[1] - b.mV[1];
- F32 z = a.mV[2] - b.mV[2];
- return (F32) sqrt( x*x + y*y + z*z );
+ F32 x = a.mV[VRED] - b.mV[VRED];
+ F32 y = a.mV[VGREEN] - b.mV[VGREEN];
+ F32 z = a.mV[VBLUE] - b.mV[VBLUE];
+ return sqrt(x * x + y * y + z * z);
}
-inline F32 distVec_squared(const LLColor3 &a, const LLColor3 &b)
+inline F32 distVec_squared(const LLColor3& a, const LLColor3& b)
{
- F32 x = a.mV[0] - b.mV[0];
- F32 y = a.mV[1] - b.mV[1];
- F32 z = a.mV[2] - b.mV[2];
- return x*x + y*y + z*z;
+ F32 x = a.mV[VRED] - b.mV[VRED];
+ F32 y = a.mV[VGREEN] - b.mV[VGREEN];
+ F32 z = a.mV[VBLUE] - b.mV[VBLUE];
+ return x * x + y * y + z * z;
}
-inline LLColor3 lerp(const LLColor3 &a, const LLColor3 &b, F32 u)
+inline LLColor3 lerp(const LLColor3& a, const LLColor3& b, F32 u)
{
- return LLColor3(
- a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
- a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u,
- a.mV[VZ] + (b.mV[VZ] - a.mV[VZ]) * u);
+ return LLColor3(a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u, a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u, a.mV[VZ] + (b.mV[VZ] - a.mV[VZ]) * u);
}
-inline const LLColor3 srgbColor3(const LLColor3 &a) {
+inline const LLColor3 srgbColor3(const LLColor3& a)
+{
LLColor3 srgbColor;
- srgbColor.mV[0] = linearTosRGB(a.mV[0]);
- srgbColor.mV[1] = linearTosRGB(a.mV[1]);
- srgbColor.mV[2] = linearTosRGB(a.mV[2]);
+ srgbColor.mV[VRED] = linearTosRGB(a.mV[VRED]);
+ srgbColor.mV[VGREEN] = linearTosRGB(a.mV[VGREEN]);
+ srgbColor.mV[VBLUE] = linearTosRGB(a.mV[VBLUE]);
return srgbColor;
}
-inline const LLColor3 linearColor3p(const F32* v) {
+inline const LLColor3 linearColor3p(const F32* v)
+{
LLColor3 linearColor;
- linearColor.mV[0] = sRGBtoLinear(v[0]);
- linearColor.mV[1] = sRGBtoLinear(v[1]);
- linearColor.mV[2] = sRGBtoLinear(v[2]);
+ linearColor.mV[VRED] = sRGBtoLinear(v[VRED]);
+ linearColor.mV[VGREEN] = sRGBtoLinear(v[VGREEN]);
+ linearColor.mV[VBLUE] = sRGBtoLinear(v[VBLUE]);
return linearColor;
}
template<class T>
-inline const LLColor3 linearColor3(const T& a) {
+inline const LLColor3 linearColor3(const T& a)
+{
return linearColor3p(a.mV);
}
template<class T>
-inline const LLVector3 linearColor3v(const T& a) {
+inline const LLVector3 linearColor3v(const T& a)
+{
return LLVector3(linearColor3p(a.mV).mV);
}
diff --git a/indra/llmath/v3colorutil.h b/indra/llmath/v3colorutil.h
index af8799e42a..4dc3100443 100644
--- a/indra/llmath/v3colorutil.h
+++ b/indra/llmath/v3colorutil.h
@@ -30,59 +30,46 @@
#include "v3color.h"
#include "v4color.h"
-inline LLColor3 componentDiv(LLColor3 const &left, LLColor3 const & right)
+inline LLColor3 componentDiv(const LLColor3& left, const LLColor3& right)
{
- return LLColor3(left.mV[0] / right.mV[0],
- left.mV[1] / right.mV[1],
- left.mV[2] / right.mV[2]);
+ return LLColor3(left.mV[VRED] / right.mV[VRED], left.mV[VGREEN] / right.mV[VGREEN], left.mV[VBLUE] / right.mV[VBLUE]);
}
-
-inline LLColor3 componentMult(LLColor3 const &left, LLColor3 const & right)
+inline LLColor3 componentMult(const LLColor3& left, const LLColor3& right)
{
- return LLColor3(left.mV[0] * right.mV[0],
- left.mV[1] * right.mV[1],
- left.mV[2] * right.mV[2]);
+ return LLColor3(left.mV[VRED] * right.mV[VRED], left.mV[VGREEN] * right.mV[VGREEN], left.mV[VBLUE] * right.mV[VBLUE]);
}
-
-inline LLColor3 componentExp(LLColor3 const &v)
+inline LLColor3 componentExp(const LLColor3& v)
{
- return LLColor3(exp(v.mV[0]),
- exp(v.mV[1]),
- exp(v.mV[2]));
+ return LLColor3(exp(v.mV[VRED]), exp(v.mV[VGREEN]), exp(v.mV[VBLUE]));
}
-inline LLColor3 componentPow(LLColor3 const &v, F32 exponent)
+inline LLColor3 componentPow(const LLColor3& v, F32 exponent)
{
- return LLColor3(pow(v.mV[0], exponent),
- pow(v.mV[1], exponent),
- pow(v.mV[2], exponent));
+ return LLColor3(pow(v.mV[VRED], exponent), pow(v.mV[VGREEN], exponent), pow(v.mV[VBLUE], exponent));
}
-inline LLColor3 componentSaturate(LLColor3 const &v)
+inline LLColor3 componentSaturate(const LLColor3& v)
{
- return LLColor3(std::max(std::min(v.mV[0], 1.f), 0.f),
- std::max(std::min(v.mV[1], 1.f), 0.f),
- std::max(std::min(v.mV[2], 1.f), 0.f));
+ return LLColor3(std::max(std::min(v.mV[VRED], 1.f), 0.f),
+ std::max(std::min(v.mV[VGREEN], 1.f), 0.f),
+ std::max(std::min(v.mV[VBLUE], 1.f), 0.f));
}
-
-inline LLColor3 componentSqrt(LLColor3 const &v)
+inline LLColor3 componentSqrt(const LLColor3& v)
{
- return LLColor3(sqrt(v.mV[0]),
- sqrt(v.mV[1]),
- sqrt(v.mV[2]));
+ return LLColor3(sqrt(v.mV[VRED]), sqrt(v.mV[VGREEN]), sqrt(v.mV[VBLUE]));
}
-inline void componentMultBy(LLColor3 & left, LLColor3 const & right)
+inline void componentMultBy(LLColor3& left, const LLColor3& right)
{
- left.mV[0] *= right.mV[0];
- left.mV[1] *= right.mV[1];
- left.mV[2] *= right.mV[2];
+ left.mV[VRED] *= right.mV[VRED];
+ left.mV[VGREEN] *= right.mV[VGREEN];
+ left.mV[VBLUE] *= right.mV[VBLUE];
}
-inline LLColor3 colorMix(LLColor3 const & left, LLColor3 const & right, F32 amount)
+inline LLColor3 colorMix(const LLColor3& left, const LLColor3& right, F32 amount)
{
return (left + ((right - left) * amount));
}
@@ -92,25 +79,24 @@ inline LLColor3 smear(F32 val)
return LLColor3(val, val, val);
}
-inline F32 color_intens(const LLColor3 &col)
+inline F32 color_intens(const LLColor3& col)
{
- return col.mV[0] + col.mV[1] + col.mV[2];
+ return col.mV[VRED] + col.mV[VGREEN] + col.mV[VBLUE];
}
-inline F32 color_max(const LLColor3 &col)
+inline F32 color_max(const LLColor3& col)
{
- return llmax(col.mV[0], col.mV[1], col.mV[2]);
+ return llmax(col.mV[VRED], col.mV[VGREEN], col.mV[VBLUE]);
}
-inline F32 color_max(const LLColor4 &col)
+inline F32 color_max(const LLColor4& col)
{
- return llmax(col.mV[0], col.mV[1], col.mV[2]);
+ return llmax(col.mV[VRED], col.mV[VGREEN], col.mV[VBLUE]);
}
-
-inline F32 color_min(const LLColor3 &col)
+inline F32 color_min(const LLColor3& col)
{
- return llmin(col.mV[0], col.mV[1], col.mV[2]);
+ return llmin(col.mV[VRED], col.mV[VGREEN], col.mV[VBLUE]);
}
#endif
diff --git a/indra/llmath/v3dmath.cpp b/indra/llmath/v3dmath.cpp
index bb55c812b5..b051303686 100644
--- a/indra/llmath/v3dmath.cpp
+++ b/indra/llmath/v3dmath.cpp
@@ -30,7 +30,6 @@
#include "v3dmath.h"
-//#include "vmath.h"
#include "v4math.h"
#include "m4math.h"
#include "m3math.h"
@@ -57,13 +56,13 @@ bool LLVector3d::clamp(F64 min, F64 max)
{
bool ret{ false };
- if (mdV[0] < min) { mdV[0] = min; ret = true; }
- if (mdV[1] < min) { mdV[1] = min; ret = true; }
- if (mdV[2] < min) { mdV[2] = min; ret = true; }
+ if (mdV[VX] < min) { mdV[VX] = min; ret = true; }
+ if (mdV[VY] < min) { mdV[VY] = min; ret = true; }
+ if (mdV[VZ] < min) { mdV[VZ] = min; ret = true; }
- if (mdV[0] > max) { mdV[0] = max; ret = true; }
- if (mdV[1] > max) { mdV[1] = max; ret = true; }
- if (mdV[2] > max) { mdV[2] = max; ret = true; }
+ if (mdV[VX] > max) { mdV[VX] = max; ret = true; }
+ if (mdV[VY] > max) { mdV[VY] = max; ret = true; }
+ if (mdV[VZ] > max) { mdV[VZ] = max; ret = true; }
return ret;
}
@@ -74,9 +73,9 @@ bool LLVector3d::abs()
{
bool ret{ false };
- if (mdV[0] < 0.0) { mdV[0] = -mdV[0]; ret = true; }
- if (mdV[1] < 0.0) { mdV[1] = -mdV[1]; ret = true; }
- if (mdV[2] < 0.0) { mdV[2] = -mdV[2]; ret = true; }
+ if (mdV[VX] < 0.0) { mdV[VX] = -mdV[VX]; ret = true; }
+ if (mdV[VY] < 0.0) { mdV[VY] = -mdV[VY]; ret = true; }
+ if (mdV[VZ] < 0.0) { mdV[VZ] = -mdV[VZ]; ret = true; }
return ret;
}
@@ -89,37 +88,37 @@ std::ostream& operator<<(std::ostream& s, const LLVector3d &a)
const LLVector3d& LLVector3d::operator=(const LLVector4 &a)
{
- mdV[0] = a.mV[0];
- mdV[1] = a.mV[1];
- mdV[2] = a.mV[2];
+ mdV[VX] = a.mV[VX];
+ mdV[VY] = a.mV[VY];
+ mdV[VZ] = a.mV[VZ];
return *this;
}
-const LLVector3d& LLVector3d::rotVec(const LLMatrix3 &mat)
+const LLVector3d& LLVector3d::rotVec(const LLMatrix3& mat)
{
*this = *this * mat;
return *this;
}
-const LLVector3d& LLVector3d::rotVec(const LLQuaternion &q)
+const LLVector3d& LLVector3d::rotVec(const LLQuaternion& q)
{
*this = *this * q;
return *this;
}
-const LLVector3d& LLVector3d::rotVec(F64 angle, const LLVector3d &vec)
+const LLVector3d& LLVector3d::rotVec(F64 angle, const LLVector3d& vec)
{
- if ( !vec.isExactlyZero() && angle )
+ if (!vec.isExactlyZero() && angle)
{
*this = *this * LLMatrix3((F32)angle, vec);
}
return *this;
}
-const LLVector3d& LLVector3d::rotVec(F64 angle, F64 x, F64 y, F64 z)
+const LLVector3d& LLVector3d::rotVec(F64 angle, F64 x, F64 y, F64 z)
{
LLVector3d vec(x, y, z);
- if ( !vec.isExactlyZero() && angle )
+ if (!vec.isExactlyZero() && angle)
{
*this = *this * LLMatrix3((F32)angle, vec);
}
@@ -129,16 +128,16 @@ const LLVector3d& LLVector3d::rotVec(F64 angle, F64 x, F64 y, F64 z)
bool LLVector3d::parseVector3d(const std::string& buf, LLVector3d* value)
{
- if( buf.empty() || value == nullptr)
+ if (buf.empty() || value == nullptr)
{
return false;
}
LLVector3d v;
- S32 count = sscanf( buf.c_str(), "%lf %lf %lf", v.mdV + 0, v.mdV + 1, v.mdV + 2 );
- if( 3 == count )
+ S32 count = sscanf(buf.c_str(), "%lf %lf %lf", v.mdV + VX, v.mdV + VY, v.mdV + VZ);
+ if (3 == count)
{
- value->setVec( v );
+ value->setVec(v);
return true;
}
diff --git a/indra/llmath/v3dmath.h b/indra/llmath/v3dmath.h
index ece8c54ea4..7c56cf138d 100644
--- a/indra/llmath/v3dmath.h
+++ b/indra/llmath/v3dmath.h
@@ -32,128 +32,131 @@
class LLVector3d
{
- public:
- F64 mdV[3];
-
- const static LLVector3d zero;
- const static LLVector3d x_axis;
- const static LLVector3d y_axis;
- const static LLVector3d z_axis;
- const static LLVector3d x_axis_neg;
- const static LLVector3d y_axis_neg;
- const static LLVector3d z_axis_neg;
-
- inline LLVector3d(); // Initializes LLVector3d to (0, 0, 0)
- inline LLVector3d(const F64 x, const F64 y, const F64 z); // Initializes LLVector3d to (x. y, z)
- inline explicit LLVector3d(const F64 *vec); // Initializes LLVector3d to (vec[0]. vec[1], vec[2])
- inline explicit LLVector3d(const LLVector3 &vec);
- explicit LLVector3d(const LLSD& sd)
- {
- setValue(sd);
- }
-
- void setValue(const LLSD& sd)
- {
- mdV[0] = sd[0].asReal();
- mdV[1] = sd[1].asReal();
- mdV[2] = sd[2].asReal();
- }
-
- LLSD getValue() const
- {
- LLSD ret;
- ret[0] = mdV[0];
- ret[1] = mdV[1];
- ret[2] = mdV[2];
- return ret;
- }
-
- inline bool isFinite() const; // checks to see if all values of LLVector3d are finite
- bool clamp(const F64 min, const F64 max); // Clamps all values to (min,max), returns true if data changed
- bool abs(); // sets all values to absolute value of original value (first octant), returns true if changed
-
- inline const LLVector3d& clear(); // Clears LLVector3d to (0, 0, 0, 1)
- inline const LLVector3d& clearVec(); // deprecated
- inline const LLVector3d& setZero(); // Zero LLVector3d to (0, 0, 0, 0)
- inline const LLVector3d& zeroVec(); // deprecated
- inline const LLVector3d& set(const F64 x, const F64 y, const F64 z); // Sets LLVector3d to (x, y, z, 1)
- inline const LLVector3d& set(const LLVector3d &vec); // Sets LLVector3d to vec
- inline const LLVector3d& set(const F64 *vec); // Sets LLVector3d to vec
- inline const LLVector3d& set(const LLVector3 &vec);
- inline const LLVector3d& setVec(const F64 x, const F64 y, const F64 z); // deprecated
- inline const LLVector3d& setVec(const LLVector3d &vec); // deprecated
- inline const LLVector3d& setVec(const F64 *vec); // deprecated
- inline const LLVector3d& setVec(const LLVector3 &vec); // deprecated
-
- F64 magVec() const; // deprecated
- F64 magVecSquared() const; // deprecated
- inline F64 normVec(); // deprecated
-
- F64 length() const; // Returns magnitude of LLVector3d
- F64 lengthSquared() const; // Returns magnitude squared of LLVector3d
- inline F64 normalize(); // Normalizes and returns the magnitude of LLVector3d
-
- const LLVector3d& rotVec(const F64 angle, const LLVector3d &vec); // Rotates about vec by angle radians
- const LLVector3d& rotVec(const F64 angle, const F64 x, const F64 y, const F64 z); // Rotates about x,y,z by angle radians
- const LLVector3d& rotVec(const LLMatrix3 &mat); // Rotates by LLMatrix4 mat
- const LLVector3d& rotVec(const LLQuaternion &q); // Rotates by LLQuaternion q
-
- bool isNull() const; // Returns true if vector has a _very_small_ length
- bool isExactlyZero() const { return !mdV[VX] && !mdV[VY] && !mdV[VZ]; }
-
- const LLVector3d& operator=(const LLVector4 &a);
-
- F64 operator[](int idx) const { return mdV[idx]; }
- F64 &operator[](int idx) { return mdV[idx]; }
-
- friend LLVector3d operator+(const LLVector3d& a, const LLVector3d& b); // Return vector a + b
- friend LLVector3d operator-(const LLVector3d& a, const LLVector3d& b); // Return vector a minus b
- friend F64 operator*(const LLVector3d& a, const LLVector3d& b); // Return a dot b
- friend LLVector3d operator%(const LLVector3d& a, const LLVector3d& b); // Return a cross b
- friend LLVector3d operator*(const LLVector3d& a, const F64 k); // Return a times scaler k
- friend LLVector3d operator/(const LLVector3d& a, const F64 k); // Return a divided by scaler k
- friend LLVector3d operator*(const F64 k, const LLVector3d& a); // Return a times scaler k
- friend bool operator==(const LLVector3d& a, const LLVector3d& b); // Return a == b
- friend bool operator!=(const LLVector3d& a, const LLVector3d& b); // Return a != b
-
- friend const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b); // Return vector a + b
- friend const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b); // Return vector a minus b
- friend const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b); // Return a cross b
- friend const LLVector3d& operator*=(LLVector3d& a, const F64 k); // Return a times scaler k
- friend const LLVector3d& operator/=(LLVector3d& a, const F64 k); // Return a divided by scaler k
-
- friend LLVector3d operator-(const LLVector3d& a); // Return vector -a
-
- friend std::ostream& operator<<(std::ostream& s, const LLVector3d& a); // Stream a
-
- static bool parseVector3d(const std::string& buf, LLVector3d* value);
+public:
+ F64 mdV[3];
+
+ const static LLVector3d zero;
+ const static LLVector3d x_axis;
+ const static LLVector3d y_axis;
+ const static LLVector3d z_axis;
+ const static LLVector3d x_axis_neg;
+ const static LLVector3d y_axis_neg;
+ const static LLVector3d z_axis_neg;
+
+ inline LLVector3d(); // Initializes LLVector3d to (0, 0, 0)
+ inline LLVector3d(const F64 x, const F64 y, const F64 z); // Initializes LLVector3d to (x. y, z)
+ inline explicit LLVector3d(const F64 *vec); // Initializes LLVector3d to (vec[0]. vec[1], vec[2])
+ inline explicit LLVector3d(const LLVector3 &vec);
+ explicit LLVector3d(const LLSD& sd)
+ {
+ setValue(sd);
+ }
+
+ void setValue(const LLSD& sd)
+ {
+ mdV[VX] = sd[0].asReal();
+ mdV[VY] = sd[1].asReal();
+ mdV[VZ] = sd[2].asReal();
+ }
+ LLSD getValue() const
+ {
+ LLSD ret;
+ ret[0] = mdV[VX];
+ ret[1] = mdV[VY];
+ ret[2] = mdV[VZ];
+ return ret;
+ }
+
+ inline bool isFinite() const; // checks to see if all values of LLVector3d are finite
+ bool clamp(const F64 min, const F64 max); // Clamps all values to (min,max), returns true if data changed
+ bool abs(); // sets all values to absolute value of original value (first octant), returns true if changed
+
+ inline const LLVector3d& clear(); // Clears LLVector3d to (0, 0, 0, 1)
+ inline const LLVector3d& clearVec(); // deprecated
+ inline const LLVector3d& setZero(); // Zero LLVector3d to (0, 0, 0, 0)
+ inline const LLVector3d& zeroVec(); // deprecated
+ inline const LLVector3d& set(const F64 x, const F64 y, const F64 z); // Sets LLVector3d to (x, y, z, 1)
+ inline const LLVector3d& set(const LLVector3d &vec); // Sets LLVector3d to vec
+ inline const LLVector3d& set(const F64 *vec); // Sets LLVector3d to vec
+ inline const LLVector3d& set(const LLVector3 &vec);
+ inline const LLVector3d& setVec(const F64 x, const F64 y, const F64 z); // deprecated
+ inline const LLVector3d& setVec(const LLVector3d &vec); // deprecated
+ inline const LLVector3d& setVec(const F64 *vec); // deprecated
+ inline const LLVector3d& setVec(const LLVector3 &vec); // deprecated
+
+ F64 magVec() const; // deprecated
+ F64 magVecSquared() const; // deprecated
+ inline F64 normVec(); // deprecated
+
+ F64 length() const; // Returns magnitude of LLVector3d
+ F64 lengthSquared() const; // Returns magnitude squared of LLVector3d
+ inline F64 normalize(); // Normalizes and returns the magnitude of LLVector3d
+
+ const LLVector3d& rotVec(const F64 angle, const LLVector3d &vec); // Rotates about vec by angle radians
+ const LLVector3d& rotVec(const F64 angle, const F64 x, const F64 y, const F64 z); // Rotates about x,y,z by angle radians
+ const LLVector3d& rotVec(const LLMatrix3 &mat); // Rotates by LLMatrix4 mat
+ const LLVector3d& rotVec(const LLQuaternion &q); // Rotates by LLQuaternion q
+
+ bool isNull() const; // Returns true if vector has a _very_small_ length
+ bool isExactlyZero() const { return !mdV[VX] && !mdV[VY] && !mdV[VZ]; }
+
+ const LLVector3d& operator=(const LLVector4 &a);
+
+ F64 operator[](int idx) const { return mdV[idx]; }
+ F64 &operator[](int idx) { return mdV[idx]; }
+
+ friend LLVector3d operator+(const LLVector3d& a, const LLVector3d& b); // Return vector a + b
+ friend LLVector3d operator-(const LLVector3d& a, const LLVector3d& b); // Return vector a minus b
+ friend F64 operator*(const LLVector3d& a, const LLVector3d& b); // Return a dot b
+ friend LLVector3d operator%(const LLVector3d& a, const LLVector3d& b); // Return a cross b
+ friend LLVector3d operator*(const LLVector3d& a, const F64 k); // Return a times scaler k
+ friend LLVector3d operator/(const LLVector3d& a, const F64 k); // Return a divided by scaler k
+ friend LLVector3d operator*(const F64 k, const LLVector3d& a); // Return a times scaler k
+ friend bool operator==(const LLVector3d& a, const LLVector3d& b); // Return a == b
+ friend bool operator!=(const LLVector3d& a, const LLVector3d& b); // Return a != b
+
+ friend const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b); // Return vector a + b
+ friend const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b); // Return vector a minus b
+ friend const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b); // Return a cross b
+ friend const LLVector3d& operator*=(LLVector3d& a, const F64 k); // Return a times scaler k
+ friend const LLVector3d& operator/=(LLVector3d& a, const F64 k); // Return a divided by scaler k
+
+ friend LLVector3d operator-(const LLVector3d& a); // Return vector -a
+
+ friend std::ostream& operator<<(std::ostream& s, const LLVector3d& a); // Stream a
+
+ static bool parseVector3d(const std::string& buf, LLVector3d* value);
};
+static_assert(std::is_trivially_copyable<LLVector3d>::value, "LLVector3d must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLVector3d>::value, "LLVector3d must be trivial move");
+static_assert(std::is_standard_layout<LLVector3d>::value, "LLVector3d must be a standard layout type");
+
typedef LLVector3d LLGlobalVec;
inline const LLVector3d &LLVector3d::set(const LLVector3 &vec)
{
- mdV[0] = vec.mV[0];
- mdV[1] = vec.mV[1];
- mdV[2] = vec.mV[2];
+ mdV[VX] = vec.mV[VX];
+ mdV[VY] = vec.mV[VY];
+ mdV[VZ] = vec.mV[VZ];
return *this;
}
inline const LLVector3d &LLVector3d::setVec(const LLVector3 &vec)
{
- mdV[0] = vec.mV[0];
- mdV[1] = vec.mV[1];
- mdV[2] = vec.mV[2];
+ mdV[VX] = vec.mV[VX];
+ mdV[VY] = vec.mV[VY];
+ mdV[VZ] = vec.mV[VZ];
return *this;
}
inline LLVector3d::LLVector3d(void)
{
- mdV[0] = 0.f;
- mdV[1] = 0.f;
- mdV[2] = 0.f;
+ mdV[VX] = 0.f;
+ mdV[VY] = 0.f;
+ mdV[VZ] = 0.f;
}
inline LLVector3d::LLVector3d(const F64 x, const F64 y, const F64 z)
@@ -199,33 +202,33 @@ inline bool LLVector3d::isFinite() const
inline const LLVector3d& LLVector3d::clear(void)
{
- mdV[0] = 0.f;
- mdV[1] = 0.f;
- mdV[2]= 0.f;
+ mdV[VX] = 0.f;
+ mdV[VY] = 0.f;
+ mdV[VZ] = 0.f;
return (*this);
}
inline const LLVector3d& LLVector3d::clearVec(void)
{
- mdV[0] = 0.f;
- mdV[1] = 0.f;
- mdV[2]= 0.f;
+ mdV[VX] = 0.f;
+ mdV[VY] = 0.f;
+ mdV[VZ] = 0.f;
return (*this);
}
inline const LLVector3d& LLVector3d::setZero(void)
{
- mdV[0] = 0.f;
- mdV[1] = 0.f;
- mdV[2] = 0.f;
+ mdV[VX] = 0.f;
+ mdV[VY] = 0.f;
+ mdV[VZ] = 0.f;
return (*this);
}
inline const LLVector3d& LLVector3d::zeroVec(void)
{
- mdV[0] = 0.f;
- mdV[1] = 0.f;
- mdV[2] = 0.f;
+ mdV[VX] = 0.f;
+ mdV[VY] = 0.f;
+ mdV[VZ] = 0.f;
return (*this);
}
@@ -239,17 +242,17 @@ inline const LLVector3d& LLVector3d::set(const F64 x, const F64 y, const F64
inline const LLVector3d& LLVector3d::set(const LLVector3d &vec)
{
- mdV[0] = vec.mdV[0];
- mdV[1] = vec.mdV[1];
- mdV[2] = vec.mdV[2];
+ mdV[VX] = vec.mdV[VX];
+ mdV[VY] = vec.mdV[VY];
+ mdV[VZ] = vec.mdV[VZ];
return (*this);
}
inline const LLVector3d& LLVector3d::set(const F64 *vec)
{
- mdV[0] = vec[0];
- mdV[1] = vec[1];
- mdV[2] = vec[2];
+ mdV[VX] = vec[0];
+ mdV[VY] = vec[1];
+ mdV[VZ] = vec[2];
return (*this);
}
@@ -261,61 +264,62 @@ inline const LLVector3d& LLVector3d::setVec(const F64 x, const F64 y, const F
return (*this);
}
-inline const LLVector3d& LLVector3d::setVec(const LLVector3d &vec)
+inline const LLVector3d& LLVector3d::setVec(const LLVector3d& vec)
{
- mdV[0] = vec.mdV[0];
- mdV[1] = vec.mdV[1];
- mdV[2] = vec.mdV[2];
+ mdV[VX] = vec.mdV[VX];
+ mdV[VY] = vec.mdV[VY];
+ mdV[VZ] = vec.mdV[VZ];
return (*this);
}
-inline const LLVector3d& LLVector3d::setVec(const F64 *vec)
+inline const LLVector3d& LLVector3d::setVec(const F64* vec)
{
- mdV[0] = vec[0];
- mdV[1] = vec[1];
- mdV[2] = vec[2];
+ mdV[VX] = vec[VX];
+ mdV[VY] = vec[VY];
+ mdV[VZ] = vec[VZ];
return (*this);
}
-inline F64 LLVector3d::normVec(void)
+inline F64 LLVector3d::normVec()
{
- F64 mag = (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ F64 mag = (F32)sqrt(mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ]); // This explicit cast to F32 limits the precision for numerical stability.
+ // Without it, Unit test "v3dmath_h" fails at "1:angle_between" on macos.
F64 oomag;
if (mag > FP_MAG_THRESHOLD)
{
- oomag = 1.f/mag;
- mdV[0] *= oomag;
- mdV[1] *= oomag;
- mdV[2] *= oomag;
+ oomag = 1.0/mag;
+ mdV[VX] *= oomag;
+ mdV[VY] *= oomag;
+ mdV[VZ] *= oomag;
}
else
{
- mdV[0] = 0.f;
- mdV[1] = 0.f;
- mdV[2] = 0.f;
+ mdV[VX] = 0.0;
+ mdV[VY] = 0.0;
+ mdV[VZ] = 0.0;
mag = 0;
}
return (mag);
}
-inline F64 LLVector3d::normalize(void)
+inline F64 LLVector3d::normalize()
{
- F64 mag = (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ F64 mag = (F32)sqrt(mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ]); // Same as in normVec() above.
F64 oomag;
if (mag > FP_MAG_THRESHOLD)
{
- oomag = 1.f/mag;
- mdV[0] *= oomag;
- mdV[1] *= oomag;
- mdV[2] *= oomag;
+ oomag = 1.0/mag;
+ mdV[VX] *= oomag;
+ mdV[VY] *= oomag;
+ mdV[VZ] *= oomag;
}
else
{
- mdV[0] = 0.f;
- mdV[1] = 0.f;
- mdV[2] = 0.f;
+ mdV[VX] = 0.0;
+ mdV[VY] = 0.0;
+ mdV[VZ] = 0.0;
mag = 0;
}
return (mag);
@@ -323,24 +327,24 @@ inline F64 LLVector3d::normalize(void)
// LLVector3d Magnitude and Normalization Functions
-inline F64 LLVector3d::magVec(void) const
+inline F64 LLVector3d::magVec() const
{
- return (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ return sqrt(mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ]);
}
-inline F64 LLVector3d::magVecSquared(void) const
+inline F64 LLVector3d::magVecSquared() const
{
- return mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2];
+ return mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ];
}
-inline F64 LLVector3d::length(void) const
+inline F64 LLVector3d::length() const
{
- return (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ return sqrt(mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ]);
}
-inline F64 LLVector3d::lengthSquared(void) const
+inline F64 LLVector3d::lengthSquared() const
{
- return mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2];
+ return mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ];
}
inline LLVector3d operator+(const LLVector3d& a, const LLVector3d& b)
@@ -357,109 +361,109 @@ inline LLVector3d operator-(const LLVector3d& a, const LLVector3d& b)
inline F64 operator*(const LLVector3d& a, const LLVector3d& b)
{
- return (a.mdV[0]*b.mdV[0] + a.mdV[1]*b.mdV[1] + a.mdV[2]*b.mdV[2]);
+ return (a.mdV[VX]*b.mdV[VX] + a.mdV[VY]*b.mdV[VY] + a.mdV[VZ]*b.mdV[VZ]);
}
inline LLVector3d operator%(const LLVector3d& a, const LLVector3d& b)
{
- return LLVector3d( a.mdV[1]*b.mdV[2] - b.mdV[1]*a.mdV[2], a.mdV[2]*b.mdV[0] - b.mdV[2]*a.mdV[0], a.mdV[0]*b.mdV[1] - b.mdV[0]*a.mdV[1] );
+ return LLVector3d( a.mdV[VY]*b.mdV[VZ] - b.mdV[VY]*a.mdV[VZ], a.mdV[VZ]*b.mdV[VX] - b.mdV[VZ]*a.mdV[VX], a.mdV[VX]*b.mdV[VY] - b.mdV[VX]*a.mdV[VY] );
}
inline LLVector3d operator/(const LLVector3d& a, const F64 k)
{
F64 t = 1.f / k;
- return LLVector3d( a.mdV[0] * t, a.mdV[1] * t, a.mdV[2] * t );
+ return LLVector3d( a.mdV[VX] * t, a.mdV[VY] * t, a.mdV[VZ] * t );
}
inline LLVector3d operator*(const LLVector3d& a, const F64 k)
{
- return LLVector3d( a.mdV[0] * k, a.mdV[1] * k, a.mdV[2] * k );
+ return LLVector3d( a.mdV[VX] * k, a.mdV[VY] * k, a.mdV[VZ] * k );
}
inline LLVector3d operator*(F64 k, const LLVector3d& a)
{
- return LLVector3d( a.mdV[0] * k, a.mdV[1] * k, a.mdV[2] * k );
+ return LLVector3d( a.mdV[VX] * k, a.mdV[VY] * k, a.mdV[VZ] * k );
}
inline bool operator==(const LLVector3d& a, const LLVector3d& b)
{
- return ( (a.mdV[0] == b.mdV[0])
- &&(a.mdV[1] == b.mdV[1])
- &&(a.mdV[2] == b.mdV[2]));
+ return ( (a.mdV[VX] == b.mdV[VX])
+ &&(a.mdV[VY] == b.mdV[VY])
+ &&(a.mdV[VZ] == b.mdV[VZ]));
}
inline bool operator!=(const LLVector3d& a, const LLVector3d& b)
{
- return ( (a.mdV[0] != b.mdV[0])
- ||(a.mdV[1] != b.mdV[1])
- ||(a.mdV[2] != b.mdV[2]));
+ return ( (a.mdV[VX] != b.mdV[VX])
+ ||(a.mdV[VY] != b.mdV[VY])
+ ||(a.mdV[VZ] != b.mdV[VZ]));
}
inline const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b)
{
- a.mdV[0] += b.mdV[0];
- a.mdV[1] += b.mdV[1];
- a.mdV[2] += b.mdV[2];
+ a.mdV[VX] += b.mdV[VX];
+ a.mdV[VY] += b.mdV[VY];
+ a.mdV[VZ] += b.mdV[VZ];
return a;
}
inline const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b)
{
- a.mdV[0] -= b.mdV[0];
- a.mdV[1] -= b.mdV[1];
- a.mdV[2] -= b.mdV[2];
+ a.mdV[VX] -= b.mdV[VX];
+ a.mdV[VY] -= b.mdV[VY];
+ a.mdV[VZ] -= b.mdV[VZ];
return a;
}
inline const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b)
{
- LLVector3d ret( a.mdV[1]*b.mdV[2] - b.mdV[1]*a.mdV[2], a.mdV[2]*b.mdV[0] - b.mdV[2]*a.mdV[0], a.mdV[0]*b.mdV[1] - b.mdV[0]*a.mdV[1]);
+ LLVector3d ret( a.mdV[VY]*b.mdV[VZ] - b.mdV[VY]*a.mdV[VZ], a.mdV[VZ]*b.mdV[VX] - b.mdV[VZ]*a.mdV[VX], a.mdV[VX]*b.mdV[VY] - b.mdV[VX]*a.mdV[VY]);
a = ret;
return a;
}
inline const LLVector3d& operator*=(LLVector3d& a, const F64 k)
{
- a.mdV[0] *= k;
- a.mdV[1] *= k;
- a.mdV[2] *= k;
+ a.mdV[VX] *= k;
+ a.mdV[VY] *= k;
+ a.mdV[VZ] *= k;
return a;
}
inline const LLVector3d& operator/=(LLVector3d& a, const F64 k)
{
F64 t = 1.f / k;
- a.mdV[0] *= t;
- a.mdV[1] *= t;
- a.mdV[2] *= t;
+ a.mdV[VX] *= t;
+ a.mdV[VY] *= t;
+ a.mdV[VZ] *= t;
return a;
}
inline LLVector3d operator-(const LLVector3d& a)
{
- return LLVector3d( -a.mdV[0], -a.mdV[1], -a.mdV[2] );
+ return LLVector3d( -a.mdV[VX], -a.mdV[VY], -a.mdV[VZ] );
}
inline F64 dist_vec(const LLVector3d& a, const LLVector3d& b)
{
- F64 x = a.mdV[0] - b.mdV[0];
- F64 y = a.mdV[1] - b.mdV[1];
- F64 z = a.mdV[2] - b.mdV[2];
+ F64 x = a.mdV[VX] - b.mdV[VX];
+ F64 y = a.mdV[VY] - b.mdV[VY];
+ F64 z = a.mdV[VZ] - b.mdV[VZ];
return (F32) sqrt( x*x + y*y + z*z );
}
inline F64 dist_vec_squared(const LLVector3d& a, const LLVector3d& b)
{
- F64 x = a.mdV[0] - b.mdV[0];
- F64 y = a.mdV[1] - b.mdV[1];
- F64 z = a.mdV[2] - b.mdV[2];
+ F64 x = a.mdV[VX] - b.mdV[VX];
+ F64 y = a.mdV[VY] - b.mdV[VY];
+ F64 z = a.mdV[VZ] - b.mdV[VZ];
return x*x + y*y + z*z;
}
inline F64 dist_vec_squared2D(const LLVector3d& a, const LLVector3d& b)
{
- F64 x = a.mdV[0] - b.mdV[0];
- F64 y = a.mdV[1] - b.mdV[1];
+ F64 x = a.mdV[VX] - b.mdV[VX];
+ F64 y = a.mdV[VY] - b.mdV[VY];
return x*x + y*y;
}
diff --git a/indra/llmath/v3math.cpp b/indra/llmath/v3math.cpp
index 73ad2a4ed6..eac95ed023 100644
--- a/indra/llmath/v3math.cpp
+++ b/indra/llmath/v3math.cpp
@@ -28,7 +28,6 @@
#include "v3math.h"
-//#include "vmath.h"
#include "v2math.h"
#include "v4math.h"
#include "m4math.h"
@@ -58,13 +57,13 @@ bool LLVector3::clamp(F32 min, F32 max)
{
bool ret{ false };
- if (mV[0] < min) { mV[0] = min; ret = true; }
- if (mV[1] < min) { mV[1] = min; ret = true; }
- if (mV[2] < min) { mV[2] = min; ret = true; }
+ if (mV[VX] < min) { mV[VX] = min; ret = true; }
+ if (mV[VY] < min) { mV[VY] = min; ret = true; }
+ if (mV[VZ] < min) { mV[VZ] = min; ret = true; }
- if (mV[0] > max) { mV[0] = max; ret = true; }
- if (mV[1] > max) { mV[1] = max; ret = true; }
- if (mV[2] > max) { mV[2] = max; ret = true; }
+ if (mV[VX] > max) { mV[VX] = max; ret = true; }
+ if (mV[VY] > max) { mV[VY] = max; ret = true; }
+ if (mV[VZ] > max) { mV[VZ] = max; ret = true; }
return ret;
}
@@ -85,9 +84,9 @@ bool LLVector3::clampLength( F32 length_limit )
{
length_limit = 0.f;
}
- mV[0] *= length_limit;
- mV[1] *= length_limit;
- mV[2] *= length_limit;
+ mV[VX] *= length_limit;
+ mV[VY] *= length_limit;
+ mV[VZ] *= length_limit;
changed = true;
}
}
@@ -116,35 +115,35 @@ bool LLVector3::clampLength( F32 length_limit )
{
// yes it can be salvaged -->
// bring the components down before we normalize
- mV[0] /= max_abs_component;
- mV[1] /= max_abs_component;
- mV[2] /= max_abs_component;
+ mV[VX] /= max_abs_component;
+ mV[VY] /= max_abs_component;
+ mV[VZ] /= max_abs_component;
normalize();
if (length_limit < 0.f)
{
length_limit = 0.f;
}
- mV[0] *= length_limit;
- mV[1] *= length_limit;
- mV[2] *= length_limit;
+ mV[VX] *= length_limit;
+ mV[VY] *= length_limit;
+ mV[VZ] *= length_limit;
}
}
return changed;
}
-bool LLVector3::clamp(const LLVector3 &min_vec, const LLVector3 &max_vec)
+bool LLVector3::clamp(const LLVector3& min_vec, const LLVector3& max_vec)
{
bool ret{ false };
- if (mV[0] < min_vec[0]) { mV[0] = min_vec[0]; ret = true; }
- if (mV[1] < min_vec[1]) { mV[1] = min_vec[1]; ret = true; }
- if (mV[2] < min_vec[2]) { mV[2] = min_vec[2]; ret = true; }
+ if (mV[VX] < min_vec[0]) { mV[VX] = min_vec[0]; ret = true; }
+ if (mV[VY] < min_vec[1]) { mV[VY] = min_vec[1]; ret = true; }
+ if (mV[VZ] < min_vec[2]) { mV[VZ] = min_vec[2]; ret = true; }
- if (mV[0] > max_vec[0]) { mV[0] = max_vec[0]; ret = true; }
- if (mV[1] > max_vec[1]) { mV[1] = max_vec[1]; ret = true; }
- if (mV[2] > max_vec[2]) { mV[2] = max_vec[2]; ret = true; }
+ if (mV[VX] > max_vec[0]) { mV[VX] = max_vec[0]; ret = true; }
+ if (mV[VY] > max_vec[1]) { mV[VY] = max_vec[1]; ret = true; }
+ if (mV[VZ] > max_vec[2]) { mV[VZ] = max_vec[2]; ret = true; }
return ret;
}
@@ -156,15 +155,15 @@ bool LLVector3::abs()
{
bool ret{ false };
- if (mV[0] < 0.f) { mV[0] = -mV[0]; ret = true; }
- if (mV[1] < 0.f) { mV[1] = -mV[1]; ret = true; }
- if (mV[2] < 0.f) { mV[2] = -mV[2]; ret = true; }
+ if (mV[VX] < 0.f) { mV[VX] = -mV[VX]; ret = true; }
+ if (mV[VY] < 0.f) { mV[VY] = -mV[VY]; ret = true; }
+ if (mV[VZ] < 0.f) { mV[VZ] = -mV[VZ]; ret = true; }
return ret;
}
// Quatizations
-void LLVector3::quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)
+void LLVector3::quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)
{
F32 x = mV[VX];
F32 y = mV[VY];
@@ -179,7 +178,7 @@ void LLVector3::quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)
mV[VZ] = z;
}
-void LLVector3::quantize8(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)
+void LLVector3::quantize8(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)
{
mV[VX] = U8_to_F32(F32_to_U8(mV[VX], lowerxy, upperxy), lowerxy, upperxy);;
mV[VY] = U8_to_F32(F32_to_U8(mV[VY], lowerxy, upperxy), lowerxy, upperxy);
@@ -187,20 +186,20 @@ void LLVector3::quantize8(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)
}
-void LLVector3::snap(S32 sig_digits)
+void LLVector3::snap(S32 sig_digits)
{
mV[VX] = snap_to_sig_figs(mV[VX], sig_digits);
mV[VY] = snap_to_sig_figs(mV[VY], sig_digits);
mV[VZ] = snap_to_sig_figs(mV[VZ], sig_digits);
}
-const LLVector3& LLVector3::rotVec(const LLMatrix3 &mat)
+const LLVector3& LLVector3::rotVec(const LLMatrix3& mat)
{
*this = *this * mat;
return *this;
}
-const LLVector3& LLVector3::rotVec(const LLQuaternion &q)
+const LLVector3& LLVector3::rotVec(const LLQuaternion& q)
{
*this = *this * q;
return *this;
@@ -228,26 +227,26 @@ const LLVector3& LLVector3::transVec(const LLMatrix4& mat)
}
-const LLVector3& LLVector3::rotVec(F32 angle, const LLVector3 &vec)
+const LLVector3& LLVector3::rotVec(F32 angle, const LLVector3& vec)
{
- if ( !vec.isExactlyZero() && angle )
+ if (!vec.isExactlyZero() && angle)
{
*this = *this * LLQuaternion(angle, vec);
}
return *this;
}
-const LLVector3& LLVector3::rotVec(F32 angle, F32 x, F32 y, F32 z)
+const LLVector3& LLVector3::rotVec(F32 angle, F32 x, F32 y, F32 z)
{
LLVector3 vec(x, y, z);
- if ( !vec.isExactlyZero() && angle )
+ if (!vec.isExactlyZero() && angle)
{
*this = *this * LLQuaternion(angle, vec);
}
return *this;
}
-const LLVector3& LLVector3::scaleVec(const LLVector3& vec)
+const LLVector3& LLVector3::scaleVec(const LLVector3& vec)
{
mV[VX] *= vec.mV[VX];
mV[VY] *= vec.mV[VY];
@@ -256,42 +255,42 @@ const LLVector3& LLVector3::scaleVec(const LLVector3& vec)
return *this;
}
-LLVector3 LLVector3::scaledVec(const LLVector3& vec) const
+LLVector3 LLVector3::scaledVec(const LLVector3& vec) const
{
LLVector3 ret = LLVector3(*this);
ret.scaleVec(vec);
return ret;
}
-const LLVector3& LLVector3::set(const LLVector3d &vec)
+const LLVector3& LLVector3::set(const LLVector3d& vec)
{
- mV[0] = (F32)vec.mdV[0];
- mV[1] = (F32)vec.mdV[1];
- mV[2] = (F32)vec.mdV[2];
+ mV[VX] = (F32)vec.mdV[VX];
+ mV[VY] = (F32)vec.mdV[VY];
+ mV[VZ] = (F32)vec.mdV[VZ];
return (*this);
}
-const LLVector3& LLVector3::set(const LLVector4 &vec)
+const LLVector3& LLVector3::set(const LLVector4& vec)
{
- mV[0] = vec.mV[0];
- mV[1] = vec.mV[1];
- mV[2] = vec.mV[2];
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
return (*this);
}
-const LLVector3& LLVector3::setVec(const LLVector3d &vec)
+const LLVector3& LLVector3::setVec(const LLVector3d& vec)
{
- mV[0] = (F32)vec.mdV[0];
- mV[1] = (F32)vec.mdV[1];
- mV[2] = (F32)vec.mdV[2];
+ mV[VX] = (F32)vec.mdV[0];
+ mV[VY] = (F32)vec.mdV[1];
+ mV[VZ] = (F32)vec.mdV[2];
return (*this);
}
-const LLVector3& LLVector3::setVec(const LLVector4 &vec)
+const LLVector3& LLVector3::setVec(const LLVector4& vec)
{
- mV[0] = vec.mV[0];
- mV[1] = vec.mV[1];
- mV[2] = vec.mV[2];
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
return (*this);
}
@@ -299,17 +298,17 @@ LLVector3::LLVector3(const LLVector2 &vec)
{
mV[VX] = (F32)vec.mV[VX];
mV[VY] = (F32)vec.mV[VY];
- mV[VZ] = 0;
+ mV[VZ] = 0.f;
}
-LLVector3::LLVector3(const LLVector3d &vec)
+LLVector3::LLVector3(const LLVector3d& vec)
{
mV[VX] = (F32)vec.mdV[VX];
mV[VY] = (F32)vec.mdV[VY];
mV[VZ] = (F32)vec.mdV[VZ];
}
-LLVector3::LLVector3(const LLVector4 &vec)
+LLVector3::LLVector3(const LLVector4& vec)
{
mV[VX] = (F32)vec.mV[VX];
mV[VY] = (F32)vec.mV[VY];
@@ -319,7 +318,6 @@ LLVector3::LLVector3(const LLVector4 &vec)
LLVector3::LLVector3(const LLVector4a& vec)
: LLVector3(vec.getF32ptr())
{
-
}
LLVector3::LLVector3(const LLSD& sd)
@@ -330,20 +328,20 @@ LLVector3::LLVector3(const LLSD& sd)
LLSD LLVector3::getValue() const
{
LLSD ret;
- ret[0] = mV[0];
- ret[1] = mV[1];
- ret[2] = mV[2];
+ ret[VX] = mV[VX];
+ ret[VY] = mV[VY];
+ ret[VZ] = mV[VZ];
return ret;
}
void LLVector3::setValue(const LLSD& sd)
{
- mV[0] = (F32) sd[0].asReal();
- mV[1] = (F32) sd[1].asReal();
- mV[2] = (F32) sd[2].asReal();
+ mV[VX] = (F32) sd[VX].asReal();
+ mV[VY] = (F32) sd[VY].asReal();
+ mV[VZ] = (F32) sd[VZ].asReal();
}
-const LLVector3& operator*=(LLVector3 &a, const LLQuaternion &rot)
+const LLVector3& operator*=(LLVector3& a, const LLQuaternion& rot)
{
const F32 rw = - rot.mQ[VX] * a.mV[VX] - rot.mQ[VY] * a.mV[VY] - rot.mQ[VZ] * a.mV[VZ];
const F32 rx = rot.mQ[VW] * a.mV[VX] + rot.mQ[VY] * a.mV[VZ] - rot.mQ[VZ] * a.mV[VY];
@@ -360,16 +358,16 @@ const LLVector3& operator*=(LLVector3 &a, const LLQuaternion &rot)
// static
bool LLVector3::parseVector3(const std::string& buf, LLVector3* value)
{
- if( buf.empty() || value == nullptr)
+ if (buf.empty() || value == nullptr)
{
return false;
}
LLVector3 v;
- S32 count = sscanf( buf.c_str(), "%f %f %f", v.mV + 0, v.mV + 1, v.mV + 2 );
- if( 3 == count )
+ S32 count = sscanf(buf.c_str(), "%f %f %f", v.mV + VX, v.mV + VY, v.mV + VZ);
+ if (3 == count)
{
- value->setVec( v );
+ value->setVec(v);
return true;
}
@@ -381,7 +379,7 @@ bool LLVector3::parseVector3(const std::string& buf, LLVector3* value)
LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box)
{
LLVector3 offset;
- for (S32 k=0; k<3; k++)
+ for (S32 k = 0; k < 3; k++)
{
offset[k] = 0;
if (pos[k] < box[0][k])
@@ -410,4 +408,3 @@ bool box_valid_and_non_zero(const LLVector3* box)
}
return false;
}
-
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index a3bfa68060..196ecdcf7d 100644
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -46,7 +46,7 @@ class LLQuaternion;
// LLvector3 = |x y z w|
-static const U32 LENGTHOFVECTOR3 = 3;
+static constexpr U32 LENGTHOFVECTOR3 = 3;
class LLVector3
{
@@ -112,24 +112,24 @@ class LLVector3
const LLVector3& setVec(const LLVector4 &vec); // deprecated
const LLVector3& setVec(const LLVector3d &vec); // deprecated
- F32 length() const; // Returns magnitude of LLVector3
- F32 lengthSquared() const; // Returns magnitude squared of LLVector3
- F32 magVec() const; // deprecated
- F32 magVecSquared() const; // deprecated
+ F32 length() const; // Returns magnitude of LLVector3
+ F32 lengthSquared() const; // Returns magnitude squared of LLVector3
+ F32 magVec() const; // deprecated
+ F32 magVecSquared() const; // deprecated
- inline F32 normalize(); // Normalizes and returns the magnitude of LLVector3
- inline F32 normVec(); // deprecated
+ inline F32 normalize(); // Normalizes and returns the magnitude of LLVector3
+ inline F32 normVec(); // deprecated
- inline bool inRange( F32 min, F32 max ) const; // Returns true if all values of the vector are between min and max
+ inline bool inRange(F32 min, F32 max) const; // Returns true if all values of the vector are between min and max
- const LLVector3& rotVec(F32 angle, const LLVector3 &vec); // Rotates about vec by angle radians
- const LLVector3& rotVec(F32 angle, F32 x, F32 y, F32 z); // Rotates about x,y,z by angle radians
- const LLVector3& rotVec(const LLMatrix3 &mat); // Rotates by LLMatrix4 mat
- const LLVector3& rotVec(const LLQuaternion &q); // Rotates by LLQuaternion q
- const LLVector3& transVec(const LLMatrix4& mat); // Transforms by LLMatrix4 mat (mat * v)
+ const LLVector3& rotVec(F32 angle, const LLVector3 &vec); // Rotates about vec by angle radians
+ const LLVector3& rotVec(F32 angle, F32 x, F32 y, F32 z); // Rotates about x,y,z by angle radians
+ const LLVector3& rotVec(const LLMatrix3 &mat); // Rotates by LLMatrix4 mat
+ const LLVector3& rotVec(const LLQuaternion &q); // Rotates by LLQuaternion q
+ const LLVector3& transVec(const LLMatrix4& mat); // Transforms by LLMatrix4 mat (mat * v)
- const LLVector3& scaleVec(const LLVector3& vec); // scales per component by vec
- LLVector3 scaledVec(const LLVector3& vec) const; // get a copy of this vector scaled by vec
+ const LLVector3& scaleVec(const LLVector3& vec); // scales per component by vec
+ LLVector3 scaledVec(const LLVector3& vec) const; // get a copy of this vector scaled by vec
bool isNull() const; // Returns true if vector has a _very_small_ length
bool isExactlyZero() const { return !mV[VX] && !mV[VY] && !mV[VZ]; }
@@ -164,6 +164,10 @@ class LLVector3
static bool parseVector3(const std::string& buf, LLVector3* value);
};
+static_assert(std::is_trivially_copyable<LLVector3>::value, "LLVector3 must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLVector3>::value, "LLVector3 must be trivial move");
+static_assert(std::is_standard_layout<LLVector3>::value, "LLVector3 must be a standard layout type");
+
typedef LLVector3 LLSimLocalVec;
// Non-member functions
@@ -181,25 +185,19 @@ LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vect
LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box); // Displacement from query point to nearest point on bounding box.
bool box_valid_and_non_zero(const LLVector3* box);
-inline LLVector3::LLVector3(void)
+inline LLVector3::LLVector3()
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ clear();
}
inline LLVector3::LLVector3(const F32 x, const F32 y, const F32 z)
{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
+ set(x, y, z);
}
inline LLVector3::LLVector3(const F32 *vec)
{
- mV[VX] = vec[VX];
- mV[VY] = vec[VY];
- mV[VZ] = vec[VZ];
+ set(vec);
}
inline LLVector3::LLVector3(const glm::vec3& vec)
@@ -230,38 +228,30 @@ inline LLVector3::LLVector3(const LLVector3 &copy)
// checker
inline bool LLVector3::isFinite() const
{
- return (llfinite(mV[VX]) && llfinite(mV[VY]) && llfinite(mV[VZ]));
+ return llfinite(mV[VX]) && llfinite(mV[VY]) && llfinite(mV[VZ]);
}
// Clear and Assignment Functions
-inline void LLVector3::clear(void)
+inline void LLVector3::clear()
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ set(0.f, 0.f, 0.f);
}
-inline void LLVector3::setZero(void)
+inline void LLVector3::setZero()
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ clear();
}
-inline void LLVector3::clearVec(void)
+inline void LLVector3::clearVec()
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ clear();
}
-inline void LLVector3::zeroVec(void)
+inline void LLVector3::zeroVec()
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ clear();
}
inline void LLVector3::set(F32 x, F32 y, F32 z)
@@ -271,18 +261,14 @@ inline void LLVector3::set(F32 x, F32 y, F32 z)
mV[VZ] = z;
}
-inline void LLVector3::set(const LLVector3 &vec)
+inline void LLVector3::set(const LLVector3& vec)
{
- mV[0] = vec.mV[0];
- mV[1] = vec.mV[1];
- mV[2] = vec.mV[2];
+ set(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
}
-inline void LLVector3::set(const F32 *vec)
+inline void LLVector3::set(const F32* vec)
{
- mV[0] = vec[0];
- mV[1] = vec[1];
- mV[2] = vec[2];
+ set(vec[VX], vec[VY], vec[VZ]);
}
inline void LLVector3::set(const glm::vec4& vec)
@@ -302,213 +288,181 @@ inline void LLVector3::set(const glm::vec3& vec)
// deprecated
inline void LLVector3::setVec(F32 x, F32 y, F32 z)
{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
+ set(x, y, z);
}
// deprecated
-inline void LLVector3::setVec(const LLVector3 &vec)
+inline void LLVector3::setVec(const LLVector3& vec)
{
- mV[0] = vec.mV[0];
- mV[1] = vec.mV[1];
- mV[2] = vec.mV[2];
+ set(vec);
}
// deprecated
-inline void LLVector3::setVec(const F32 *vec)
+inline void LLVector3::setVec(const F32* vec)
{
- mV[0] = vec[0];
- mV[1] = vec[1];
- mV[2] = vec[2];
+ set(vec);
}
-inline F32 LLVector3::normalize(void)
+inline F32 LLVector3::normalize()
{
- F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
- F32 oomag;
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
if (mag > FP_MAG_THRESHOLD)
{
- oomag = 1.f/mag;
- mV[0] *= oomag;
- mV[1] *= oomag;
- mV[2] *= oomag;
+ *this /= mag;
}
else
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
+ clear();
mag = 0;
}
- return (mag);
+ return mag;
}
// deprecated
-inline F32 LLVector3::normVec(void)
+inline F32 LLVector3::normVec()
{
- F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
- F32 oomag;
-
- if (mag > FP_MAG_THRESHOLD)
- {
- oomag = 1.f/mag;
- mV[0] *= oomag;
- mV[1] *= oomag;
- mV[2] *= oomag;
- }
- else
- {
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
- mag = 0;
- }
- return (mag);
+ return normalize();
}
// LLVector3 Magnitude and Normalization Functions
-inline F32 LLVector3::length(void) const
+inline F32 LLVector3::length() const
{
- return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return sqrt(lengthSquared());
}
-inline F32 LLVector3::lengthSquared(void) const
+inline F32 LLVector3::lengthSquared() const
{
- return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
+ return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
}
-inline F32 LLVector3::magVec(void) const
+inline F32 LLVector3::magVec() const
{
- return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return length();
}
-inline F32 LLVector3::magVecSquared(void) const
+inline F32 LLVector3::magVecSquared() const
{
- return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
+ return lengthSquared();
}
-inline bool LLVector3::inRange( F32 min, F32 max ) const
+inline bool LLVector3::inRange(F32 min, F32 max) const
{
- return mV[0] >= min && mV[0] <= max &&
- mV[1] >= min && mV[1] <= max &&
- mV[2] >= min && mV[2] <= max;
+ return mV[VX] >= min && mV[VX] <= max &&
+ mV[VY] >= min && mV[VY] <= max &&
+ mV[VZ] >= min && mV[VZ] <= max;
}
-inline LLVector3 operator+(const LLVector3 &a, const LLVector3 &b)
+inline LLVector3 operator+(const LLVector3& a, const LLVector3& b)
{
LLVector3 c(a);
return c += b;
}
-inline LLVector3 operator-(const LLVector3 &a, const LLVector3 &b)
+inline LLVector3 operator-(const LLVector3& a, const LLVector3& b)
{
LLVector3 c(a);
return c -= b;
}
-inline F32 operator*(const LLVector3 &a, const LLVector3 &b)
+inline F32 operator*(const LLVector3& a, const LLVector3& b)
{
- return (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2]);
+ return (a.mV[VX]*b.mV[VX] + a.mV[VY]*b.mV[VY] + a.mV[VZ]*b.mV[VZ]);
}
-inline LLVector3 operator%(const LLVector3 &a, const LLVector3 &b)
+inline LLVector3 operator%(const LLVector3& a, const LLVector3& b)
{
- return LLVector3( a.mV[1]*b.mV[2] - b.mV[1]*a.mV[2], a.mV[2]*b.mV[0] - b.mV[2]*a.mV[0], a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1] );
+ return LLVector3(a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);
}
-inline LLVector3 operator/(const LLVector3 &a, F32 k)
+inline LLVector3 operator/(const LLVector3& a, F32 k)
{
F32 t = 1.f / k;
- return LLVector3( a.mV[0] * t, a.mV[1] * t, a.mV[2] * t );
+ return LLVector3( a.mV[VX] * t, a.mV[VY] * t, a.mV[VZ] * t );
}
-inline LLVector3 operator*(const LLVector3 &a, F32 k)
+inline LLVector3 operator*(const LLVector3& a, F32 k)
{
- return LLVector3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k );
+ return LLVector3( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );
}
-inline LLVector3 operator*(F32 k, const LLVector3 &a)
+inline LLVector3 operator*(F32 k, const LLVector3& a)
{
- return LLVector3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k );
+ return LLVector3( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );
}
-inline bool operator==(const LLVector3 &a, const LLVector3 &b)
+inline bool operator==(const LLVector3& a, const LLVector3& b)
{
- return ( (a.mV[0] == b.mV[0])
- &&(a.mV[1] == b.mV[1])
- &&(a.mV[2] == b.mV[2]));
+ return ( (a.mV[VX] == b.mV[VX])
+ &&(a.mV[VY] == b.mV[VY])
+ &&(a.mV[VZ] == b.mV[VZ]));
}
-inline bool operator!=(const LLVector3 &a, const LLVector3 &b)
+inline bool operator!=(const LLVector3& a, const LLVector3& b)
{
- return ( (a.mV[0] != b.mV[0])
- ||(a.mV[1] != b.mV[1])
- ||(a.mV[2] != b.mV[2]));
+ return ( (a.mV[VX] != b.mV[VX])
+ ||(a.mV[VY] != b.mV[VY])
+ ||(a.mV[VZ] != b.mV[VZ]));
}
-inline bool operator<(const LLVector3 &a, const LLVector3 &b)
+inline bool operator<(const LLVector3& a, const LLVector3& b)
{
- return (a.mV[0] < b.mV[0]
- || (a.mV[0] == b.mV[0]
- && (a.mV[1] < b.mV[1]
- || ((a.mV[1] == b.mV[1])
- && a.mV[2] < b.mV[2]))));
+ return (a.mV[VX] < b.mV[VX]
+ || (a.mV[VX] == b.mV[VX]
+ && (a.mV[VY] < b.mV[VY]
+ || ((a.mV[VY] == b.mV[VY])
+ && a.mV[VZ] < b.mV[VZ]))));
}
-inline const LLVector3& operator+=(LLVector3 &a, const LLVector3 &b)
+inline const LLVector3& operator+=(LLVector3& a, const LLVector3& b)
{
- a.mV[0] += b.mV[0];
- a.mV[1] += b.mV[1];
- a.mV[2] += b.mV[2];
+ a.mV[VX] += b.mV[VX];
+ a.mV[VY] += b.mV[VY];
+ a.mV[VZ] += b.mV[VZ];
return a;
}
-inline const LLVector3& operator-=(LLVector3 &a, const LLVector3 &b)
+inline const LLVector3& operator-=(LLVector3& a, const LLVector3& b)
{
- a.mV[0] -= b.mV[0];
- a.mV[1] -= b.mV[1];
- a.mV[2] -= b.mV[2];
+ a.mV[VX] -= b.mV[VX];
+ a.mV[VY] -= b.mV[VY];
+ a.mV[VZ] -= b.mV[VZ];
return a;
}
-inline const LLVector3& operator%=(LLVector3 &a, const LLVector3 &b)
+inline const LLVector3& operator%=(LLVector3& a, const LLVector3& b)
{
- LLVector3 ret( a.mV[1]*b.mV[2] - b.mV[1]*a.mV[2], a.mV[2]*b.mV[0] - b.mV[2]*a.mV[0], a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1]);
+ LLVector3 ret(a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);
a = ret;
return a;
}
-inline const LLVector3& operator*=(LLVector3 &a, F32 k)
+inline const LLVector3& operator*=(LLVector3& a, F32 k)
{
- a.mV[0] *= k;
- a.mV[1] *= k;
- a.mV[2] *= k;
+ a.mV[VX] *= k;
+ a.mV[VY] *= k;
+ a.mV[VZ] *= k;
return a;
}
-inline const LLVector3& operator*=(LLVector3 &a, const LLVector3 &b)
+inline const LLVector3& operator*=(LLVector3& a, const LLVector3& b)
{
- a.mV[0] *= b.mV[0];
- a.mV[1] *= b.mV[1];
- a.mV[2] *= b.mV[2];
+ a.mV[VX] *= b.mV[VX];
+ a.mV[VY] *= b.mV[VY];
+ a.mV[VZ] *= b.mV[VZ];
return a;
}
-inline const LLVector3& operator/=(LLVector3 &a, F32 k)
+inline const LLVector3& operator/=(LLVector3& a, F32 k)
{
- F32 t = 1.f / k;
- a.mV[0] *= t;
- a.mV[1] *= t;
- a.mV[2] *= t;
+ a *= 1.f / k;
return a;
}
-inline LLVector3 operator-(const LLVector3 &a)
+inline LLVector3 operator-(const LLVector3& a)
{
- return LLVector3( -a.mV[0], -a.mV[1], -a.mV[2] );
+ return LLVector3(-a.mV[VX], -a.mV[VY], -a.mV[VZ]);
}
inline LLVector3::operator glm::vec3() const
@@ -522,40 +476,37 @@ inline LLVector3::operator glm::vec4() const
return glm::vec4(mV[VX], mV[VY], mV[VZ], 1.f);
}
-inline F32 dist_vec(const LLVector3 &a, const LLVector3 &b)
+inline F32 dist_vec(const LLVector3& a, const LLVector3& b)
{
- F32 x = a.mV[0] - b.mV[0];
- F32 y = a.mV[1] - b.mV[1];
- F32 z = a.mV[2] - b.mV[2];
- return (F32) sqrt( x*x + y*y + z*z );
+ F32 x = a.mV[VX] - b.mV[VX];
+ F32 y = a.mV[VY] - b.mV[VY];
+ F32 z = a.mV[VZ] - b.mV[VZ];
+ return sqrt(x*x + y*y + z*z);
}
-inline F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b)
+inline F32 dist_vec_squared(const LLVector3& a, const LLVector3& b)
{
- F32 x = a.mV[0] - b.mV[0];
- F32 y = a.mV[1] - b.mV[1];
- F32 z = a.mV[2] - b.mV[2];
+ F32 x = a.mV[VX] - b.mV[VX];
+ F32 y = a.mV[VY] - b.mV[VY];
+ F32 z = a.mV[VZ] - b.mV[VZ];
return x*x + y*y + z*z;
}
-inline F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b)
+inline F32 dist_vec_squared2D(const LLVector3& a, const LLVector3& b)
{
- F32 x = a.mV[0] - b.mV[0];
- F32 y = a.mV[1] - b.mV[1];
+ F32 x = a.mV[VX] - b.mV[VX];
+ F32 y = a.mV[VY] - b.mV[VY];
return x*x + y*y;
}
-inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
+inline LLVector3 projected_vec(const LLVector3& a, const LLVector3& b)
{
F32 bb = b * b;
if (bb > FP_MAG_THRESHOLD * FP_MAG_THRESHOLD)
{
return ((a * b) / bb) * b;
}
- else
- {
- return b.zero;
- }
+ return b.zero;
}
inline LLVector3 inverse_projected_vec(const LLVector3& a, const LLVector3& b)
@@ -570,18 +521,18 @@ inline LLVector3 inverse_projected_vec(const LLVector3& a, const LLVector3& b)
return normalized_a * (b_length / dot_product);
}
-inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b)
+inline LLVector3 parallel_component(const LLVector3& a, const LLVector3& b)
{
return projected_vec(a, b);
}
-inline LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b)
+inline LLVector3 orthogonal_component(const LLVector3& a, const LLVector3& b)
{
return a - projected_vec(a, b);
}
-inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u)
+inline LLVector3 lerp(const LLVector3& a, const LLVector3& b, F32 u)
{
return LLVector3(
a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
@@ -592,11 +543,7 @@ inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u)
inline bool LLVector3::isNull() const
{
- if ( F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ] )
- {
- return true;
- }
- return false;
+ return F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
}
inline void update_min_max(LLVector3& min, LLVector3& max, const LLVector3& pos)
@@ -637,17 +584,17 @@ inline F32 angle_between(const LLVector3& a, const LLVector3& b)
ab = 0.0f; // get rid of negative zero
}
LLVector3 c = a % b; // crossproduct
- return atan2f(sqrtf(c * c), ab); // return the angle
+ return atan2f(c.length(), ab); // return the angle
}
-inline bool are_parallel(const LLVector3 &a, const LLVector3 &b, F32 epsilon)
+inline bool are_parallel(const LLVector3& a, const LLVector3& b, F32 epsilon)
{
LLVector3 an = a;
LLVector3 bn = b;
an.normalize();
bn.normalize();
F32 dot = an * bn;
- if ( (1.0f - fabs(dot)) < epsilon)
+ if (1.0f - fabs(dot) < epsilon)
{
return true;
}
diff --git a/indra/llmath/v4color.cpp b/indra/llmath/v4color.cpp
index ad13656bbd..1b687642ca 100644
--- a/indra/llmath/v4color.cpp
+++ b/indra/llmath/v4color.cpp
@@ -124,65 +124,64 @@ LLColor4 LLColor4::cyan6(0.2f, 0.6f, 0.6f, 1.0f);
// conversion
LLColor4::operator LLColor4U() const
{
- return LLColor4U(
- (U8)llclampb(ll_round(mV[VRED]*255.f)),
- (U8)llclampb(ll_round(mV[VGREEN]*255.f)),
- (U8)llclampb(ll_round(mV[VBLUE]*255.f)),
- (U8)llclampb(ll_round(mV[VALPHA]*255.f)));
+ return LLColor4U((U8)llclampb(ll_round(mV[VRED] * 255.f)),
+ (U8)llclampb(ll_round(mV[VGREEN] * 255.f)),
+ (U8)llclampb(ll_round(mV[VBLUE] * 255.f)),
+ (U8)llclampb(ll_round(mV[VALPHA] * 255.f)));
}
-LLColor4::LLColor4(const LLColor3 &vec, F32 a)
+LLColor4::LLColor4(const LLColor3& vec, F32 a)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
mV[VALPHA] = a;
}
LLColor4::LLColor4(const LLColor4U& color4u)
{
- const F32 SCALE = 1.f/255.f;
- mV[VRED] = color4u.mV[VRED] * SCALE;
- mV[VGREEN] = color4u.mV[VGREEN] * SCALE;
- mV[VBLUE] = color4u.mV[VBLUE] * SCALE;
- mV[VALPHA] = color4u.mV[VALPHA] * SCALE;
+ constexpr F32 SCALE = 1.f / 255.f;
+ mV[VRED] = color4u.mV[VRED] * SCALE;
+ mV[VGREEN] = color4u.mV[VGREEN] * SCALE;
+ mV[VBLUE] = color4u.mV[VBLUE] * SCALE;
+ mV[VALPHA] = color4u.mV[VALPHA] * SCALE;
}
LLColor4::LLColor4(const LLVector4& vector4)
{
- mV[VRED] = vector4.mV[VRED];
+ mV[VRED] = vector4.mV[VRED];
mV[VGREEN] = vector4.mV[VGREEN];
- mV[VBLUE] = vector4.mV[VBLUE];
+ mV[VBLUE] = vector4.mV[VBLUE];
mV[VALPHA] = vector4.mV[VALPHA];
}
const LLColor4& LLColor4::set(const LLColor4U& color4u)
{
- const F32 SCALE = 1.f/255.f;
- mV[VRED] = color4u.mV[VRED] * SCALE;
- mV[VGREEN] = color4u.mV[VGREEN] * SCALE;
- mV[VBLUE] = color4u.mV[VBLUE] * SCALE;
- mV[VALPHA] = color4u.mV[VALPHA] * SCALE;
+ constexpr F32 SCALE = 1.f / 255.f;
+ mV[VRED] = color4u.mV[VRED] * SCALE;
+ mV[VGREEN] = color4u.mV[VGREEN] * SCALE;
+ mV[VBLUE] = color4u.mV[VBLUE] * SCALE;
+ mV[VALPHA] = color4u.mV[VALPHA] * SCALE;
return (*this);
}
-const LLColor4& LLColor4::set(const LLColor3 &vec)
+const LLColor4& LLColor4::set(const LLColor3& vec)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
-// no change to alpha!
-// mV[VALPHA] = 1.f;
+ // no change to alpha!
+ // mV[VALPHA] = 1.f;
return (*this);
}
-const LLColor4& LLColor4::set(const LLColor3 &vec, F32 a)
+const LLColor4& LLColor4::set(const LLColor3& vec, F32 a)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
mV[VALPHA] = a;
return (*this);
}
@@ -190,33 +189,33 @@ const LLColor4& LLColor4::set(const LLColor3 &vec, F32 a)
// deprecated -- use set()
const LLColor4& LLColor4::setVec(const LLColor4U& color4u)
{
- const F32 SCALE = 1.f/255.f;
- mV[VRED] = color4u.mV[VRED] * SCALE;
- mV[VGREEN] = color4u.mV[VGREEN] * SCALE;
- mV[VBLUE] = color4u.mV[VBLUE] * SCALE;
- mV[VALPHA] = color4u.mV[VALPHA] * SCALE;
+ constexpr F32 SCALE = 1.f / 255.f;
+ mV[VRED] = color4u.mV[VRED] * SCALE;
+ mV[VGREEN] = color4u.mV[VGREEN] * SCALE;
+ mV[VBLUE] = color4u.mV[VBLUE] * SCALE;
+ mV[VALPHA] = color4u.mV[VALPHA] * SCALE;
return (*this);
}
// deprecated -- use set()
-const LLColor4& LLColor4::setVec(const LLColor3 &vec)
+const LLColor4& LLColor4::setVec(const LLColor3& vec)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
-// no change to alpha!
-// mV[VALPHA] = 1.f;
+ // no change to alpha!
+ // mV[VALPHA] = 1.f;
return (*this);
}
// deprecated -- use set()
-const LLColor4& LLColor4::setVec(const LLColor3 &vec, F32 a)
+const LLColor4& LLColor4::setVec(const LLColor3& vec, F32 a)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
mV[VALPHA] = a;
return (*this);
}
@@ -228,110 +227,110 @@ void LLColor4::setValue(const LLSD& sd)
F32 val;
bool out_of_range = false;
val = sd[0].asReal();
- mV[0] = llclamp(val, 0.f, 1.f);
- out_of_range = mV[0] != val;
+ mV[VRED] = llclamp(val, 0.f, 1.f);
+ out_of_range = mV[VRED] != val;
val = sd[1].asReal();
- mV[1] = llclamp(val, 0.f, 1.f);
- out_of_range |= mV[1] != val;
+ mV[VGREEN] = llclamp(val, 0.f, 1.f);
+ out_of_range |= mV[VGREEN] != val;
val = sd[2].asReal();
- mV[2] = llclamp(val, 0.f, 1.f);
- out_of_range |= mV[2] != val;
+ mV[VBLUE] = llclamp(val, 0.f, 1.f);
+ out_of_range |= mV[VBLUE] != val;
val = sd[3].asReal();
- mV[3] = llclamp(val, 0.f, 1.f);
- out_of_range |= mV[3] != val;
+ mV[VALPHA] = llclamp(val, 0.f, 1.f);
+ out_of_range |= mV[VALPHA] != val;
if (out_of_range)
{
LL_WARNS() << "LLSD color value out of range!" << LL_ENDL;
}
#else
- mV[0] = (F32) sd[0].asReal();
- mV[1] = (F32) sd[1].asReal();
- mV[2] = (F32) sd[2].asReal();
- mV[3] = (F32) sd[3].asReal();
+ mV[VRED] = (F32)sd[VRED].asReal();
+ mV[VGREEN] = (F32)sd[VGREEN].asReal();
+ mV[VBLUE] = (F32)sd[VBLUE].asReal();
+ mV[VALPHA] = (F32)sd[VALPHA].asReal();
#endif
}
-const LLColor4& LLColor4::operator=(const LLColor3 &a)
+const LLColor4& LLColor4::operator=(const LLColor3& a)
{
- mV[VRED] = a.mV[VRED];
+ mV[VRED] = a.mV[VRED];
mV[VGREEN] = a.mV[VGREEN];
- mV[VBLUE] = a.mV[VBLUE];
+ mV[VBLUE] = a.mV[VBLUE];
-// converting from an rgb sets a=1 (opaque)
+ // converting from an rgb sets a=1 (opaque)
mV[VALPHA] = 1.f;
return (*this);
}
-
-std::ostream& operator<<(std::ostream& s, const LLColor4 &a)
+std::ostream& operator<<(std::ostream& s, const LLColor4& a)
{
s << "{ " << a.mV[VRED] << ", " << a.mV[VGREEN] << ", " << a.mV[VBLUE] << ", " << a.mV[VALPHA] << " }";
return s;
}
-bool operator==(const LLColor4 &a, const LLColor3 &b)
+bool operator==(const LLColor4& a, const LLColor3& b)
{
- return ( (a.mV[VRED] == b.mV[VRED])
- &&(a.mV[VGREEN] == b.mV[VGREEN])
- &&(a.mV[VBLUE] == b.mV[VBLUE]));
+ return ((a.mV[VRED] == b.mV[VRED]) && (a.mV[VGREEN] == b.mV[VGREEN]) && (a.mV[VBLUE] == b.mV[VBLUE]));
}
-bool operator!=(const LLColor4 &a, const LLColor3 &b)
+bool operator!=(const LLColor4& a, const LLColor3& b)
{
- return ( (a.mV[VRED] != b.mV[VRED])
- ||(a.mV[VGREEN] != b.mV[VGREEN])
- ||(a.mV[VBLUE] != b.mV[VBLUE]));
+ return ((a.mV[VRED] != b.mV[VRED]) || (a.mV[VGREEN] != b.mV[VGREEN]) || (a.mV[VBLUE] != b.mV[VBLUE]));
}
-LLColor3 vec4to3(const LLColor4 &vec)
+LLColor3 vec4to3(const LLColor4& vec)
{
- LLColor3 temp(vec.mV[VRED], vec.mV[VGREEN], vec.mV[VBLUE]);
+ LLColor3 temp(vec.mV[VRED], vec.mV[VGREEN], vec.mV[VBLUE]);
return temp;
}
-LLColor4 vec3to4(const LLColor3 &vec)
+LLColor4 vec3to4(const LLColor3& vec)
{
- LLColor3 temp(vec.mV[VRED], vec.mV[VGREEN], vec.mV[VBLUE]);
+ LLColor3 temp(vec.mV[VRED], vec.mV[VGREEN], vec.mV[VBLUE]);
return temp;
}
-static F32 hueToRgb ( F32 val1In, F32 val2In, F32 valHUeIn )
+static F32 hueToRgb(F32 val1In, F32 val2In, F32 valHUeIn)
{
- if ( valHUeIn < 0.0f ) valHUeIn += 1.0f;
- if ( valHUeIn > 1.0f ) valHUeIn -= 1.0f;
- if ( ( 6.0f * valHUeIn ) < 1.0f ) return ( val1In + ( val2In - val1In ) * 6.0f * valHUeIn );
- if ( ( 2.0f * valHUeIn ) < 1.0f ) return ( val2In );
- if ( ( 3.0f * valHUeIn ) < 2.0f ) return ( val1In + ( val2In - val1In ) * ( ( 2.0f / 3.0f ) - valHUeIn ) * 6.0f );
- return ( val1In );
+ if (valHUeIn < 0.0f)
+ valHUeIn += 1.0f;
+ if (valHUeIn > 1.0f)
+ valHUeIn -= 1.0f;
+ if ((6.0f * valHUeIn) < 1.0f)
+ return (val1In + (val2In - val1In) * 6.0f * valHUeIn);
+ if ((2.0f * valHUeIn) < 1.0f)
+ return (val2In);
+ if ((3.0f * valHUeIn) < 2.0f)
+ return (val1In + (val2In - val1In) * ((2.0f / 3.0f) - valHUeIn) * 6.0f);
+ return (val1In);
}
-void LLColor4::setHSL ( F32 hValIn, F32 sValIn, F32 lValIn)
+void LLColor4::setHSL(F32 hValIn, F32 sValIn, F32 lValIn)
{
- if ( sValIn < 0.00001f )
+ if (sValIn < 0.00001f)
{
- mV[VRED] = lValIn;
+ mV[VRED] = lValIn;
mV[VGREEN] = lValIn;
- mV[VBLUE] = lValIn;
+ mV[VBLUE] = lValIn;
}
else
{
F32 interVal1;
F32 interVal2;
- if ( lValIn < 0.5f )
- interVal2 = lValIn * ( 1.0f + sValIn );
+ if (lValIn < 0.5f)
+ interVal2 = lValIn * (1.0f + sValIn);
else
- interVal2 = ( lValIn + sValIn ) - ( sValIn * lValIn );
+ interVal2 = (lValIn + sValIn) - (sValIn * lValIn);
interVal1 = 2.0f * lValIn - interVal2;
- mV[VRED] = hueToRgb ( interVal1, interVal2, hValIn + ( 1.f / 3.f ) );
- mV[VGREEN] = hueToRgb ( interVal1, interVal2, hValIn );
- mV[VBLUE] = hueToRgb ( interVal1, interVal2, hValIn - ( 1.f / 3.f ) );
+ mV[VRED] = hueToRgb(interVal1, interVal2, hValIn + (1.f / 3.f));
+ mV[VGREEN] = hueToRgb(interVal1, interVal2, hValIn);
+ mV[VBLUE] = hueToRgb(interVal1, interVal2, hValIn - (1.f / 3.f));
}
}
@@ -341,58 +340,61 @@ void LLColor4::calcHSL(F32* hue, F32* saturation, F32* luminance) const
F32 var_G = mV[VGREEN];
F32 var_B = mV[VBLUE];
- F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) );
- F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) );
+ F32 var_Min = (var_R < (var_G < var_B ? var_G : var_B) ? var_R : (var_G < var_B ? var_G : var_B));
+ F32 var_Max = (var_R > (var_G > var_B ? var_G : var_B) ? var_R : (var_G > var_B ? var_G : var_B));
F32 del_Max = var_Max - var_Min;
- F32 L = ( var_Max + var_Min ) / 2.0f;
+ F32 L = (var_Max + var_Min) / 2.0f;
F32 H = 0.0f;
F32 S = 0.0f;
- if ( del_Max == 0.0f )
+ if (del_Max == 0.0f)
{
- H = 0.0f;
- S = 0.0f;
+ H = 0.0f;
+ S = 0.0f;
}
else
{
- if ( L < 0.5 )
- S = del_Max / ( var_Max + var_Min );
+ if (L < 0.5f)
+ S = del_Max / (var_Max + var_Min);
else
- S = del_Max / ( 2.0f - var_Max - var_Min );
+ S = del_Max / (2.0f - var_Max - var_Min);
- F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
- F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
- F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
+ F32 del_R = (((var_Max - var_R) / 6.0f) + (del_Max / 2.0f)) / del_Max;
+ F32 del_G = (((var_Max - var_G) / 6.0f) + (del_Max / 2.0f)) / del_Max;
+ F32 del_B = (((var_Max - var_B) / 6.0f) + (del_Max / 2.0f)) / del_Max;
- if ( var_R >= var_Max )
+ if (var_R >= var_Max)
H = del_B - del_G;
- else
- if ( var_G >= var_Max )
- H = ( 1.0f / 3.0f ) + del_R - del_B;
- else
- if ( var_B >= var_Max )
- H = ( 2.0f / 3.0f ) + del_G - del_R;
-
- if ( H < 0.0f ) H += 1.0f;
- if ( H > 1.0f ) H -= 1.0f;
+ else if (var_G >= var_Max)
+ H = (1.0f / 3.0f) + del_R - del_B;
+ else if (var_B >= var_Max)
+ H = (2.0f / 3.0f) + del_G - del_R;
+
+ if (H < 0.0f)
+ H += 1.0f;
+ if (H > 1.0f)
+ H -= 1.0f;
}
- if (hue) *hue = H;
- if (saturation) *saturation = S;
- if (luminance) *luminance = L;
+ if (hue)
+ *hue = H;
+ if (saturation)
+ *saturation = S;
+ if (luminance)
+ *luminance = L;
}
// static
bool LLColor4::parseColor(const std::string& buf, LLColor4* color)
{
- if( buf.empty() || color == nullptr)
+ if (buf.empty() || color == nullptr)
{
return false;
}
- boost_tokenizer tokens(buf, boost::char_separator<char>(", "));
+ boost_tokenizer tokens(buf, boost::char_separator<char>(", "));
boost_tokenizer::iterator token_iter = tokens.begin();
if (token_iter == tokens.end())
{
@@ -401,16 +403,16 @@ bool LLColor4::parseColor(const std::string& buf, LLColor4* color)
// Grab the first token into a string, since we don't know
// if this is a float or a color name.
- std::string color_name( (*token_iter) );
+ std::string color_name((*token_iter));
++token_iter;
if (token_iter != tokens.end())
{
// There are more tokens to read. This must be a vector.
LLColor4 v;
- LLStringUtil::convertToF32( color_name, v.mV[VRED] );
- LLStringUtil::convertToF32( *token_iter, v.mV[VGREEN] );
- v.mV[VBLUE] = 0.0f;
+ LLStringUtil::convertToF32(color_name, v.mV[VRED]);
+ LLStringUtil::convertToF32(*token_iter, v.mV[VGREEN]);
+ v.mV[VBLUE] = 0.0f;
v.mV[VALPHA] = 1.0f;
++token_iter;
@@ -422,283 +424,284 @@ bool LLColor4::parseColor(const std::string& buf, LLColor4* color)
else
{
// There is a z-component.
- LLStringUtil::convertToF32( *token_iter, v.mV[VBLUE] );
+ LLStringUtil::convertToF32(*token_iter, v.mV[VBLUE]);
++token_iter;
if (token_iter != tokens.end())
{
// There is an alpha component.
- LLStringUtil::convertToF32( *token_iter, v.mV[VALPHA] );
+ LLStringUtil::convertToF32(*token_iter, v.mV[VALPHA]);
}
}
// Make sure all values are between 0 and 1.
if (v.mV[VRED] > 1.f || v.mV[VGREEN] > 1.f || v.mV[VBLUE] > 1.f || v.mV[VALPHA] > 1.f)
{
- v = v * (1.f / 255.f);
+ constexpr F32 SCALE{ 1.f / 255.f };
+ v *= SCALE;
}
- color->set( v );
+ color->set(v);
}
else // Single value. Read as a named color.
{
// We have a color name
- if ( "red" == color_name )
+ if ("red" == color_name)
{
color->set(LLColor4::red);
}
- else if ( "red1" == color_name )
+ else if ("red1" == color_name)
{
color->set(LLColor4::red1);
}
- else if ( "red2" == color_name )
+ else if ("red2" == color_name)
{
color->set(LLColor4::red2);
}
- else if ( "red3" == color_name )
+ else if ("red3" == color_name)
{
color->set(LLColor4::red3);
}
- else if ( "red4" == color_name )
+ else if ("red4" == color_name)
{
color->set(LLColor4::red4);
}
- else if ( "red5" == color_name )
+ else if ("red5" == color_name)
{
color->set(LLColor4::red5);
}
- else if( "green" == color_name )
+ else if ("green" == color_name)
{
color->set(LLColor4::green);
}
- else if( "green1" == color_name )
+ else if ("green1" == color_name)
{
color->set(LLColor4::green1);
}
- else if( "green2" == color_name )
+ else if ("green2" == color_name)
{
color->set(LLColor4::green2);
}
- else if( "green3" == color_name )
+ else if ("green3" == color_name)
{
color->set(LLColor4::green3);
}
- else if( "green4" == color_name )
+ else if ("green4" == color_name)
{
color->set(LLColor4::green4);
}
- else if( "green5" == color_name )
+ else if ("green5" == color_name)
{
color->set(LLColor4::green5);
}
- else if( "green6" == color_name )
+ else if ("green6" == color_name)
{
color->set(LLColor4::green6);
}
- else if( "blue" == color_name )
+ else if ("blue" == color_name)
{
color->set(LLColor4::blue);
}
- else if( "blue1" == color_name )
+ else if ("blue1" == color_name)
{
color->set(LLColor4::blue1);
}
- else if( "blue2" == color_name )
+ else if ("blue2" == color_name)
{
color->set(LLColor4::blue2);
}
- else if( "blue3" == color_name )
+ else if ("blue3" == color_name)
{
color->set(LLColor4::blue3);
}
- else if( "blue4" == color_name )
+ else if ("blue4" == color_name)
{
color->set(LLColor4::blue4);
}
- else if( "blue5" == color_name )
+ else if ("blue5" == color_name)
{
color->set(LLColor4::blue5);
}
- else if( "blue6" == color_name )
+ else if ("blue6" == color_name)
{
color->set(LLColor4::blue6);
}
- else if( "black" == color_name )
+ else if ("black" == color_name)
{
color->set(LLColor4::black);
}
- else if( "white" == color_name )
+ else if ("white" == color_name)
{
color->set(LLColor4::white);
}
- else if( "yellow" == color_name )
+ else if ("yellow" == color_name)
{
color->set(LLColor4::yellow);
}
- else if( "yellow1" == color_name )
+ else if ("yellow1" == color_name)
{
color->set(LLColor4::yellow1);
}
- else if( "yellow2" == color_name )
+ else if ("yellow2" == color_name)
{
color->set(LLColor4::yellow2);
}
- else if( "yellow3" == color_name )
+ else if ("yellow3" == color_name)
{
color->set(LLColor4::yellow3);
}
- else if( "yellow4" == color_name )
+ else if ("yellow4" == color_name)
{
color->set(LLColor4::yellow4);
}
- else if( "yellow5" == color_name )
+ else if ("yellow5" == color_name)
{
color->set(LLColor4::yellow5);
}
- else if( "yellow6" == color_name )
+ else if ("yellow6" == color_name)
{
color->set(LLColor4::yellow6);
}
- else if( "magenta" == color_name )
+ else if ("magenta" == color_name)
{
color->set(LLColor4::magenta);
}
- else if( "magenta1" == color_name )
+ else if ("magenta1" == color_name)
{
color->set(LLColor4::magenta1);
}
- else if( "magenta2" == color_name )
+ else if ("magenta2" == color_name)
{
color->set(LLColor4::magenta2);
}
- else if( "magenta3" == color_name )
+ else if ("magenta3" == color_name)
{
color->set(LLColor4::magenta3);
}
- else if( "magenta4" == color_name )
+ else if ("magenta4" == color_name)
{
color->set(LLColor4::magenta4);
}
- else if( "purple" == color_name )
+ else if ("purple" == color_name)
{
color->set(LLColor4::purple);
}
- else if( "purple1" == color_name )
+ else if ("purple1" == color_name)
{
color->set(LLColor4::purple1);
}
- else if( "purple2" == color_name )
+ else if ("purple2" == color_name)
{
color->set(LLColor4::purple2);
}
- else if( "purple3" == color_name )
+ else if ("purple3" == color_name)
{
color->set(LLColor4::purple3);
}
- else if( "purple4" == color_name )
+ else if ("purple4" == color_name)
{
color->set(LLColor4::purple4);
}
- else if( "purple5" == color_name )
+ else if ("purple5" == color_name)
{
color->set(LLColor4::purple5);
}
- else if( "purple6" == color_name )
+ else if ("purple6" == color_name)
{
color->set(LLColor4::purple6);
}
- else if( "pink" == color_name )
+ else if ("pink" == color_name)
{
color->set(LLColor4::pink);
}
- else if( "pink1" == color_name )
+ else if ("pink1" == color_name)
{
color->set(LLColor4::pink1);
}
- else if( "pink2" == color_name )
+ else if ("pink2" == color_name)
{
color->set(LLColor4::pink2);
}
- else if( "cyan" == color_name )
+ else if ("cyan" == color_name)
{
color->set(LLColor4::cyan);
}
- else if( "cyan1" == color_name )
+ else if ("cyan1" == color_name)
{
color->set(LLColor4::cyan1);
}
- else if( "cyan2" == color_name )
+ else if ("cyan2" == color_name)
{
color->set(LLColor4::cyan2);
}
- else if( "cyan3" == color_name )
+ else if ("cyan3" == color_name)
{
color->set(LLColor4::cyan3);
}
- else if( "cyan4" == color_name )
+ else if ("cyan4" == color_name)
{
color->set(LLColor4::cyan4);
}
- else if( "cyan5" == color_name )
+ else if ("cyan5" == color_name)
{
color->set(LLColor4::cyan5);
}
- else if( "cyan6" == color_name )
+ else if ("cyan6" == color_name)
{
color->set(LLColor4::cyan6);
}
- else if( "smoke" == color_name )
+ else if ("smoke" == color_name)
{
color->set(LLColor4::smoke);
}
- else if( "grey" == color_name )
+ else if ("grey" == color_name)
{
color->set(LLColor4::grey);
}
- else if( "grey1" == color_name )
+ else if ("grey1" == color_name)
{
color->set(LLColor4::grey1);
}
- else if( "grey2" == color_name )
+ else if ("grey2" == color_name)
{
color->set(LLColor4::grey2);
}
- else if( "grey3" == color_name )
+ else if ("grey3" == color_name)
{
color->set(LLColor4::grey3);
}
- else if( "grey4" == color_name )
+ else if ("grey4" == color_name)
{
color->set(LLColor4::grey4);
}
- else if( "orange" == color_name )
+ else if ("orange" == color_name)
{
color->set(LLColor4::orange);
}
- else if( "orange1" == color_name )
+ else if ("orange1" == color_name)
{
color->set(LLColor4::orange1);
}
- else if( "orange2" == color_name )
+ else if ("orange2" == color_name)
{
color->set(LLColor4::orange2);
}
- else if( "orange3" == color_name )
+ else if ("orange3" == color_name)
{
color->set(LLColor4::orange3);
}
- else if( "orange4" == color_name )
+ else if ("orange4" == color_name)
{
color->set(LLColor4::orange4);
}
- else if( "orange5" == color_name )
+ else if ("orange5" == color_name)
{
color->set(LLColor4::orange5);
}
- else if( "orange6" == color_name )
+ else if ("orange6" == color_name)
{
color->set(LLColor4::orange6);
}
- else if ( "clear" == color_name )
+ else if ("clear" == color_name)
{
color->set(0.f, 0.f, 0.f, 0.f);
}
@@ -714,21 +717,21 @@ bool LLColor4::parseColor(const std::string& buf, LLColor4* color)
// static
bool LLColor4::parseColor4(const std::string& buf, LLColor4* value)
{
- if( buf.empty() || value == nullptr)
+ if (buf.empty() || value == nullptr)
{
return false;
}
LLColor4 v;
- S32 count = sscanf( buf.c_str(), "%f, %f, %f, %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3 );
- if (1 == count )
+ S32 count = sscanf(buf.c_str(), "%f, %f, %f, %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3);
+ if (1 == count)
{
// try this format
- count = sscanf( buf.c_str(), "%f %f %f %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3 );
+ count = sscanf(buf.c_str(), "%f %f %f %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3);
}
- if( 4 == count )
+ if (4 == count)
{
- value->setVec( v );
+ value->setVec(v);
return true;
}
diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h
index cafdbd9d7c..d48020c223 100644
--- a/indra/llmath/v4color.h
+++ b/indra/llmath/v4color.h
@@ -28,7 +28,6 @@
#define LL_V4COLOR_H
#include "llerror.h"
-//#include "vmath.h"
#include "llmath.h"
#include "llsd.h"
@@ -38,213 +37,216 @@ class LLVector4;
// LLColor4 = |x y z w|
-static const U32 LENGTHOFCOLOR4 = 4;
+static constexpr U32 LENGTHOFCOLOR4 = 4;
-static const U32 MAX_LENGTH_OF_COLOR_NAME = 15; //Give plenty of room for additional colors...
+static constexpr U32 MAX_LENGTH_OF_COLOR_NAME = 15; // Give plenty of room for additional colors...
class LLColor4
{
- public:
- F32 mV[LENGTHOFCOLOR4];
- LLColor4(); // Initializes LLColor4 to (0, 0, 0, 1)
- LLColor4(F32 r, F32 g, F32 b); // Initializes LLColor4 to (r, g, b, 1)
- LLColor4(F32 r, F32 g, F32 b, F32 a); // Initializes LLColor4 to (r. g, b, a)
- LLColor4(const LLColor3 &vec, F32 a = 1.f); // Initializes LLColor4 to (vec, a)
- explicit LLColor4(const LLSD& sd);
- explicit LLColor4(const F32 *vec); // Initializes LLColor4 to (vec[0]. vec[1], vec[2], 1)
- explicit LLColor4(U32 clr); // Initializes LLColor4 to (r=clr>>24, etc))
- explicit LLColor4(const LLColor4U& color4u); // "explicit" to avoid automatic conversion
- explicit LLColor4(const LLVector4& vector4); // "explicit" to avoid automatic conversion
-
- LLSD getValue() const
- {
- LLSD ret;
- ret[0] = mV[0];
- ret[1] = mV[1];
- ret[2] = mV[2];
- ret[3] = mV[3];
- return ret;
- }
-
- void setValue(const LLSD& sd);
-
- void setHSL(F32 hue, F32 saturation, F32 luminance);
- void calcHSL(F32* hue, F32* saturation, F32* luminance) const;
-
- const LLColor4& setToBlack(); // zero LLColor4 to (0, 0, 0, 1)
- const LLColor4& setToWhite(); // zero LLColor4 to (0, 0, 0, 1)
-
- const LLColor4& setVec(F32 r, F32 g, F32 b, F32 a); // deprecated -- use set()
- const LLColor4& setVec(F32 r, F32 g, F32 b); // deprecated -- use set()
- const LLColor4& setVec(const LLColor4 &vec); // deprecated -- use set()
- const LLColor4& setVec(const LLColor3 &vec); // deprecated -- use set()
- const LLColor4& setVec(const LLColor3 &vec, F32 a); // deprecated -- use set()
- const LLColor4& setVec(const F32 *vec); // deprecated -- use set()
- const LLColor4& setVec(const LLColor4U& color4u); // deprecated -- use set()
-
- const LLColor4& set(F32 r, F32 g, F32 b, F32 a); // Sets LLColor4 to (r, g, b, a)
- const LLColor4& set(F32 r, F32 g, F32 b); // Sets LLColor4 to (r, g, b) (no change in a)
- const LLColor4& set(const LLColor4 &vec); // Sets LLColor4 to vec
- const LLColor4& set(const LLColor3 &vec); // Sets LLColor4 to LLColor3 vec (no change in alpha)
- const LLColor4& set(const LLColor3 &vec, F32 a); // Sets LLColor4 to LLColor3 vec, with alpha specified
- const LLColor4& set(const F32 *vec); // Sets LLColor4 to vec
- const LLColor4& set(const F64 *vec); // Sets LLColor4 to (double)vec
- const LLColor4& set(const LLColor4U& color4u); // Sets LLColor4 to color4u, rescaled.
-
- // set from a vector of unknown type and size
- // may leave some data unmodified
- template<typename T>
- const LLColor4& set(const std::vector<T>& v);
-
- // write to a vector of unknown type and size
- // maye leave some data unmodified
- template<typename T>
- void write(std::vector<T>& v) const;
-
- const LLColor4& setAlpha(F32 a);
-
- F32 magVec() const; // deprecated -- use length()
- F32 magVecSquared() const; // deprecated -- use lengthSquared()
- F32 normVec(); // deprecated -- use normalize()
-
- F32 length() const; // Returns magnitude of LLColor4
- F32 lengthSquared() const; // Returns magnitude squared of LLColor4
- F32 normalize(); // deprecated -- use normalize()
-
- bool isOpaque() { return mV[VALPHA] == 1.f; }
-
- F32 operator[](int idx) const { return mV[idx]; }
- F32 &operator[](int idx) { return mV[idx]; }
-
- const LLColor4& operator=(const LLColor3 &a); // Assigns vec3 to vec4 and returns vec4
-
- bool operator<(const LLColor4& rhs) const;
- friend std::ostream& operator<<(std::ostream& s, const LLColor4 &a); // Print a
- friend LLColor4 operator+(const LLColor4 &a, const LLColor4 &b); // Return vector a + b
- friend LLColor4 operator-(const LLColor4 &a, const LLColor4 &b); // Return vector a minus b
- friend LLColor4 operator*(const LLColor4 &a, const LLColor4 &b); // Return component wise a * b
- friend LLColor4 operator*(const LLColor4 &a, F32 k); // Return rgb times scaler k (no alpha change)
- friend LLColor4 operator/(const LLColor4 &a, F32 k); // Return rgb divided by scalar k (no alpha change)
- friend LLColor4 operator*(F32 k, const LLColor4 &a); // Return rgb times scaler k (no alpha change)
- friend LLColor4 operator%(const LLColor4 &a, F32 k); // Return alpha times scaler k (no rgb change)
- friend LLColor4 operator%(F32 k, const LLColor4 &a); // Return alpha times scaler k (no rgb change)
-
- friend bool operator==(const LLColor4 &a, const LLColor4 &b); // Return a == b
- friend bool operator!=(const LLColor4 &a, const LLColor4 &b); // Return a != b
-
- friend bool operator==(const LLColor4 &a, const LLColor3 &b); // Return a == b
- friend bool operator!=(const LLColor4 &a, const LLColor3 &b); // Return a != b
-
- friend const LLColor4& operator+=(LLColor4 &a, const LLColor4 &b); // Return vector a + b
- friend const LLColor4& operator-=(LLColor4 &a, const LLColor4 &b); // Return vector a minus b
- friend const LLColor4& operator*=(LLColor4 &a, F32 k); // Return rgb times scaler k (no alpha change)
- friend const LLColor4& operator%=(LLColor4 &a, F32 k); // Return alpha times scaler k (no rgb change)
-
- friend const LLColor4& operator*=(LLColor4 &a, const LLColor4 &b); // Doesn't multiply alpha! (for lighting)
-
- // conversion
- operator LLColor4U() const;
-
- // Basic color values.
- static LLColor4 red;
- static LLColor4 green;
- static LLColor4 blue;
- static LLColor4 black;
- static LLColor4 white;
- static LLColor4 yellow;
- static LLColor4 magenta;
- static LLColor4 cyan;
- static LLColor4 smoke;
- static LLColor4 grey;
- static LLColor4 orange;
- static LLColor4 purple;
- static LLColor4 pink;
- static LLColor4 transparent;
-
- // Extra color values.
- static LLColor4 grey1;
- static LLColor4 grey2;
- static LLColor4 grey3;
- static LLColor4 grey4;
-
- static LLColor4 red1;
- static LLColor4 red2;
- static LLColor4 red3;
- static LLColor4 red4;
- static LLColor4 red5;
-
- static LLColor4 green1;
- static LLColor4 green2;
- static LLColor4 green3;
- static LLColor4 green4;
- static LLColor4 green5;
- static LLColor4 green6;
-
- static LLColor4 blue1;
- static LLColor4 blue2;
- static LLColor4 blue3;
- static LLColor4 blue4;
- static LLColor4 blue5;
- static LLColor4 blue6;
-
- static LLColor4 yellow1;
- static LLColor4 yellow2;
- static LLColor4 yellow3;
- static LLColor4 yellow4;
- static LLColor4 yellow5;
- static LLColor4 yellow6;
- static LLColor4 yellow7;
- static LLColor4 yellow8;
- static LLColor4 yellow9;
-
- static LLColor4 orange1;
- static LLColor4 orange2;
- static LLColor4 orange3;
- static LLColor4 orange4;
- static LLColor4 orange5;
- static LLColor4 orange6;
-
- static LLColor4 magenta1;
- static LLColor4 magenta2;
- static LLColor4 magenta3;
- static LLColor4 magenta4;
-
- static LLColor4 purple1;
- static LLColor4 purple2;
- static LLColor4 purple3;
- static LLColor4 purple4;
- static LLColor4 purple5;
- static LLColor4 purple6;
-
- static LLColor4 pink1;
- static LLColor4 pink2;
-
- static LLColor4 cyan1;
- static LLColor4 cyan2;
- static LLColor4 cyan3;
- static LLColor4 cyan4;
- static LLColor4 cyan5;
- static LLColor4 cyan6;
-
- static bool parseColor(const std::string& buf, LLColor4* color);
- static bool parseColor4(const std::string& buf, LLColor4* color);
-
- inline void clamp();
+public:
+ F32 mV[LENGTHOFCOLOR4];
+ LLColor4(); // Initializes LLColor4 to (0, 0, 0, 1)
+ LLColor4(F32 r, F32 g, F32 b); // Initializes LLColor4 to (r, g, b, 1)
+ LLColor4(F32 r, F32 g, F32 b, F32 a); // Initializes LLColor4 to (r. g, b, a)
+ LLColor4(const LLColor3& vec, F32 a = 1.f); // Initializes LLColor4 to (vec, a)
+ explicit LLColor4(const LLSD& sd);
+ explicit LLColor4(const F32* vec); // Initializes LLColor4 to (vec[0]. vec[1], vec[2], 1)
+ explicit LLColor4(U32 clr); // Initializes LLColor4 to (r=clr>>24, etc))
+ explicit LLColor4(const LLColor4U& color4u); // "explicit" to avoid automatic conversion
+ explicit LLColor4(const LLVector4& vector4); // "explicit" to avoid automatic conversion
+
+ LLSD getValue() const
+ {
+ LLSD ret;
+ ret[VRED] = mV[VRED];
+ ret[VGREEN] = mV[VGREEN];
+ ret[VBLUE] = mV[VBLUE];
+ ret[VALPHA] = mV[VALPHA];
+ return ret;
+ }
+
+ void setValue(const LLSD& sd);
+
+ void setHSL(F32 hue, F32 saturation, F32 luminance);
+ void calcHSL(F32* hue, F32* saturation, F32* luminance) const;
+
+ const LLColor4& setToBlack(); // zero LLColor4 to (0, 0, 0, 1)
+ const LLColor4& setToWhite(); // zero LLColor4 to (0, 0, 0, 1)
+
+ const LLColor4& setVec(F32 r, F32 g, F32 b, F32 a); // deprecated -- use set()
+ const LLColor4& setVec(F32 r, F32 g, F32 b); // deprecated -- use set()
+ const LLColor4& setVec(const LLColor4& vec); // deprecated -- use set()
+ const LLColor4& setVec(const LLColor3& vec); // deprecated -- use set()
+ const LLColor4& setVec(const LLColor3& vec, F32 a); // deprecated -- use set()
+ const LLColor4& setVec(const F32* vec); // deprecated -- use set()
+ const LLColor4& setVec(const LLColor4U& color4u); // deprecated -- use set()
+
+ const LLColor4& set(F32 r, F32 g, F32 b, F32 a); // Sets LLColor4 to (r, g, b, a)
+ const LLColor4& set(F32 r, F32 g, F32 b); // Sets LLColor4 to (r, g, b) (no change in a)
+ const LLColor4& set(const LLColor4& vec); // Sets LLColor4 to vec
+ const LLColor4& set(const LLColor3& vec); // Sets LLColor4 to LLColor3 vec (no change in alpha)
+ const LLColor4& set(const LLColor3& vec, F32 a); // Sets LLColor4 to LLColor3 vec, with alpha specified
+ const LLColor4& set(const F32* vec); // Sets LLColor4 to vec
+ const LLColor4& set(const F64* vec); // Sets LLColor4 to (double)vec
+ const LLColor4& set(const LLColor4U& color4u); // Sets LLColor4 to color4u, rescaled.
+
+ // set from a vector of unknown type and size
+ // may leave some data unmodified
+ template<typename T>
+ const LLColor4& set(const std::vector<T>& v);
+
+ // write to a vector of unknown type and size
+ // maye leave some data unmodified
+ template<typename T>
+ void write(std::vector<T>& v) const;
+
+ const LLColor4& setAlpha(F32 a);
+
+ F32 magVec() const; // deprecated -- use length()
+ F32 magVecSquared() const; // deprecated -- use lengthSquared()
+ F32 normVec(); // deprecated -- use normalize()
+
+ F32 length() const; // Returns magnitude of LLColor4
+ F32 lengthSquared() const; // Returns magnitude squared of LLColor4
+ F32 normalize(); // deprecated -- use normalize()
+
+ bool isOpaque() const { return mV[VALPHA] == 1.f; }
+
+ F32 operator[](int idx) const { return mV[idx]; }
+ F32& operator[](int idx) { return mV[idx]; }
+
+ const LLColor4& operator=(const LLColor3& a); // Assigns vec3 to vec4 and returns vec4
+
+ bool operator<(const LLColor4& rhs) const;
+ friend std::ostream& operator<<(std::ostream& s, const LLColor4& a); // Print a
+ friend LLColor4 operator+(const LLColor4& a, const LLColor4& b); // Return vector a + b
+ friend LLColor4 operator-(const LLColor4& a, const LLColor4& b); // Return vector a minus b
+ friend LLColor4 operator*(const LLColor4& a, const LLColor4& b); // Return component wise a * b
+ friend LLColor4 operator*(const LLColor4& a, F32 k); // Return rgb times scaler k (no alpha change)
+ friend LLColor4 operator/(const LLColor4& a, F32 k); // Return rgb divided by scalar k (no alpha change)
+ friend LLColor4 operator*(F32 k, const LLColor4& a); // Return rgb times scaler k (no alpha change)
+ friend LLColor4 operator%(const LLColor4& a, F32 k); // Return alpha times scaler k (no rgb change)
+ friend LLColor4 operator%(F32 k, const LLColor4& a); // Return alpha times scaler k (no rgb change)
+
+ friend bool operator==(const LLColor4& a, const LLColor4& b); // Return a == b
+ friend bool operator!=(const LLColor4& a, const LLColor4& b); // Return a != b
+
+ friend bool operator==(const LLColor4& a, const LLColor3& b); // Return a == b
+ friend bool operator!=(const LLColor4& a, const LLColor3& b); // Return a != b
+
+ friend const LLColor4& operator+=(LLColor4& a, const LLColor4& b); // Return vector a + b
+ friend const LLColor4& operator-=(LLColor4& a, const LLColor4& b); // Return vector a minus b
+ friend const LLColor4& operator*=(LLColor4& a, F32 k); // Return rgb times scaler k (no alpha change)
+ friend const LLColor4& operator%=(LLColor4& a, F32 k); // Return alpha times scaler k (no rgb change)
+
+ friend const LLColor4& operator*=(LLColor4& a, const LLColor4& b); // Doesn't multiply alpha! (for lighting)
+
+ // conversion
+ operator LLColor4U() const;
+
+ // Basic color values.
+ static LLColor4 red;
+ static LLColor4 green;
+ static LLColor4 blue;
+ static LLColor4 black;
+ static LLColor4 white;
+ static LLColor4 yellow;
+ static LLColor4 magenta;
+ static LLColor4 cyan;
+ static LLColor4 smoke;
+ static LLColor4 grey;
+ static LLColor4 orange;
+ static LLColor4 purple;
+ static LLColor4 pink;
+ static LLColor4 transparent;
+
+ // Extra color values.
+ static LLColor4 grey1;
+ static LLColor4 grey2;
+ static LLColor4 grey3;
+ static LLColor4 grey4;
+
+ static LLColor4 red1;
+ static LLColor4 red2;
+ static LLColor4 red3;
+ static LLColor4 red4;
+ static LLColor4 red5;
+
+ static LLColor4 green1;
+ static LLColor4 green2;
+ static LLColor4 green3;
+ static LLColor4 green4;
+ static LLColor4 green5;
+ static LLColor4 green6;
+
+ static LLColor4 blue1;
+ static LLColor4 blue2;
+ static LLColor4 blue3;
+ static LLColor4 blue4;
+ static LLColor4 blue5;
+ static LLColor4 blue6;
+
+ static LLColor4 yellow1;
+ static LLColor4 yellow2;
+ static LLColor4 yellow3;
+ static LLColor4 yellow4;
+ static LLColor4 yellow5;
+ static LLColor4 yellow6;
+ static LLColor4 yellow7;
+ static LLColor4 yellow8;
+ static LLColor4 yellow9;
+
+ static LLColor4 orange1;
+ static LLColor4 orange2;
+ static LLColor4 orange3;
+ static LLColor4 orange4;
+ static LLColor4 orange5;
+ static LLColor4 orange6;
+
+ static LLColor4 magenta1;
+ static LLColor4 magenta2;
+ static LLColor4 magenta3;
+ static LLColor4 magenta4;
+
+ static LLColor4 purple1;
+ static LLColor4 purple2;
+ static LLColor4 purple3;
+ static LLColor4 purple4;
+ static LLColor4 purple5;
+ static LLColor4 purple6;
+
+ static LLColor4 pink1;
+ static LLColor4 pink2;
+
+ static LLColor4 cyan1;
+ static LLColor4 cyan2;
+ static LLColor4 cyan3;
+ static LLColor4 cyan4;
+ static LLColor4 cyan5;
+ static LLColor4 cyan6;
+
+ static bool parseColor(const std::string& buf, LLColor4* color);
+ static bool parseColor4(const std::string& buf, LLColor4* color);
+
+ inline void clamp();
};
+static_assert(std::is_trivially_copyable<LLColor4>::value, "LLColor4 must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLColor4>::value, "LLColor4 must be trivial move");
+static_assert(std::is_standard_layout<LLColor4>::value, "LLColor4 must be a standard layout type");
// Non-member functions
-F32 distVec(const LLColor4 &a, const LLColor4 &b); // Returns distance between a and b
-F32 distVec_squared(const LLColor4 &a, const LLColor4 &b); // Returns distance squared between a and b
-LLColor3 vec4to3(const LLColor4 &vec);
-LLColor4 vec3to4(const LLColor3 &vec);
-LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u);
+F32 distVec(const LLColor4& a, const LLColor4& b); // Returns distance between a and b
+F32 distVec_squared(const LLColor4& a, const LLColor4& b); // Returns distance squared between a and b
+LLColor3 vec4to3(const LLColor4& vec);
+LLColor4 vec3to4(const LLColor3& vec);
+LLColor4 lerp(const LLColor4& a, const LLColor4& b, F32 u);
-inline LLColor4::LLColor4(void)
+inline LLColor4::LLColor4()
{
- mV[VRED] = 0.f;
+ mV[VRED] = 0.f;
mV[VGREEN] = 0.f;
- mV[VBLUE] = 0.f;
+ mV[VBLUE] = 0.f;
mV[VALPHA] = 1.f;
}
@@ -255,149 +257,146 @@ inline LLColor4::LLColor4(const LLSD& sd)
inline LLColor4::LLColor4(F32 r, F32 g, F32 b)
{
- mV[VRED] = r;
+ mV[VRED] = r;
mV[VGREEN] = g;
- mV[VBLUE] = b;
+ mV[VBLUE] = b;
mV[VALPHA] = 1.f;
}
inline LLColor4::LLColor4(F32 r, F32 g, F32 b, F32 a)
{
- mV[VRED] = r;
+ mV[VRED] = r;
mV[VGREEN] = g;
- mV[VBLUE] = b;
+ mV[VBLUE] = b;
mV[VALPHA] = a;
}
inline LLColor4::LLColor4(U32 clr)
{
- mV[VRED] = (clr&0xff) * (1.0f/255.0f);
- mV[VGREEN] = ((clr>>8)&0xff) * (1.0f/255.0f);
- mV[VBLUE] = ((clr>>16)&0xff) * (1.0f/255.0f);
- mV[VALPHA] = (clr>>24) * (1.0f/255.0f);
+ mV[VRED] = (clr & 0xff) * (1.0f / 255.0f);
+ mV[VGREEN] = ((clr >> 8) & 0xff) * (1.0f / 255.0f);
+ mV[VBLUE] = ((clr >> 16) & 0xff) * (1.0f / 255.0f);
+ mV[VALPHA] = (clr >> 24) * (1.0f / 255.0f);
}
-
-inline LLColor4::LLColor4(const F32 *vec)
+inline LLColor4::LLColor4(const F32* vec)
{
- mV[VRED] = vec[VRED];
+ mV[VRED] = vec[VRED];
mV[VGREEN] = vec[VGREEN];
- mV[VBLUE] = vec[VBLUE];
+ mV[VBLUE] = vec[VBLUE];
mV[VALPHA] = vec[VALPHA];
}
-inline const LLColor4& LLColor4::setToBlack(void)
+inline const LLColor4& LLColor4::setToBlack(void)
{
- mV[VRED] = 0.f;
+ mV[VRED] = 0.f;
mV[VGREEN] = 0.f;
- mV[VBLUE] = 0.f;
+ mV[VBLUE] = 0.f;
mV[VALPHA] = 1.f;
return (*this);
}
-inline const LLColor4& LLColor4::setToWhite(void)
+inline const LLColor4& LLColor4::setToWhite(void)
{
- mV[VRED] = 1.f;
+ mV[VRED] = 1.f;
mV[VGREEN] = 1.f;
- mV[VBLUE] = 1.f;
+ mV[VBLUE] = 1.f;
mV[VALPHA] = 1.f;
return (*this);
}
-inline const LLColor4& LLColor4::set(F32 x, F32 y, F32 z)
+inline const LLColor4& LLColor4::set(F32 x, F32 y, F32 z)
{
- mV[VRED] = x;
+ mV[VRED] = x;
mV[VGREEN] = y;
- mV[VBLUE] = z;
+ mV[VBLUE] = z;
-// no change to alpha!
-// mV[VALPHA] = 1.f;
+ // no change to alpha!
+ // mV[VALPHA] = 1.f;
return (*this);
}
-inline const LLColor4& LLColor4::set(F32 x, F32 y, F32 z, F32 a)
+inline const LLColor4& LLColor4::set(F32 x, F32 y, F32 z, F32 a)
{
- mV[VRED] = x;
+ mV[VRED] = x;
mV[VGREEN] = y;
- mV[VBLUE] = z;
+ mV[VBLUE] = z;
mV[VALPHA] = a;
return (*this);
}
-inline const LLColor4& LLColor4::set(const LLColor4 &vec)
+inline const LLColor4& LLColor4::set(const LLColor4& vec)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
mV[VALPHA] = vec.mV[VALPHA];
return (*this);
}
-
-inline const LLColor4& LLColor4::set(const F32 *vec)
+inline const LLColor4& LLColor4::set(const F32* vec)
{
- mV[VRED] = vec[VRED];
+ mV[VRED] = vec[VRED];
mV[VGREEN] = vec[VGREEN];
- mV[VBLUE] = vec[VBLUE];
+ mV[VBLUE] = vec[VBLUE];
mV[VALPHA] = vec[VALPHA];
return (*this);
}
-inline const LLColor4& LLColor4::set(const F64 *vec)
+inline const LLColor4& LLColor4::set(const F64* vec)
{
- mV[VRED] = static_cast<F32>(vec[VRED]);
+ mV[VRED] = static_cast<F32>(vec[VRED]);
mV[VGREEN] = static_cast<F32>(vec[VGREEN]);
- mV[VBLUE] = static_cast<F32>(vec[VBLUE]);
+ mV[VBLUE] = static_cast<F32>(vec[VBLUE]);
mV[VALPHA] = static_cast<F32>(vec[VALPHA]);
return (*this);
}
// deprecated
-inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z)
+inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z)
{
- mV[VRED] = x;
+ mV[VRED] = x;
mV[VGREEN] = y;
- mV[VBLUE] = z;
+ mV[VBLUE] = z;
-// no change to alpha!
-// mV[VALPHA] = 1.f;
+ // no change to alpha!
+ // mV[VALPHA] = 1.f;
return (*this);
}
// deprecated
-inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z, F32 a)
+inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z, F32 a)
{
- mV[VRED] = x;
+ mV[VRED] = x;
mV[VGREEN] = y;
- mV[VBLUE] = z;
+ mV[VBLUE] = z;
mV[VALPHA] = a;
return (*this);
}
// deprecated
-inline const LLColor4& LLColor4::setVec(const LLColor4 &vec)
+inline const LLColor4& LLColor4::setVec(const LLColor4& vec)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
mV[VALPHA] = vec.mV[VALPHA];
return (*this);
}
-
// deprecated
-inline const LLColor4& LLColor4::setVec(const F32 *vec)
+inline const LLColor4& LLColor4::setVec(const F32* vec)
{
- mV[VRED] = vec[VRED];
+ mV[VRED] = vec[VRED];
mV[VGREEN] = vec[VGREEN];
- mV[VBLUE] = vec[VBLUE];
+ mV[VBLUE] = vec[VBLUE];
mV[VALPHA] = vec[VALPHA];
return (*this);
}
-inline const LLColor4& LLColor4::setAlpha(F32 a)
+inline const LLColor4& LLColor4::setAlpha(F32 a)
{
mV[VALPHA] = a;
return (*this);
@@ -405,155 +404,116 @@ inline const LLColor4& LLColor4::setAlpha(F32 a)
// LLColor4 Magnitude and Normalization Functions
-inline F32 LLColor4::length(void) const
+inline F32 LLColor4::length() const
{
- return (F32) sqrt(mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]);
+ return sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);
}
-inline F32 LLColor4::lengthSquared(void) const
+inline F32 LLColor4::lengthSquared() const
{
- return mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE];
+ return mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE];
}
-inline F32 LLColor4::normalize(void)
+inline F32 LLColor4::normalize()
{
- F32 mag = (F32) sqrt(mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]);
+ F32 mag = sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);
F32 oomag;
if (mag)
{
- oomag = 1.f/mag;
+ oomag = 1.f / mag;
mV[VRED] *= oomag;
mV[VGREEN] *= oomag;
mV[VBLUE] *= oomag;
}
- return (mag);
+ return mag;
}
// deprecated
-inline F32 LLColor4::magVec(void) const
+inline F32 LLColor4::magVec() const
{
- return (F32) sqrt(mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]);
+ return sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);
}
// deprecated
-inline F32 LLColor4::magVecSquared(void) const
+inline F32 LLColor4::magVecSquared() const
{
- return mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE];
+ return mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE];
}
// deprecated
-inline F32 LLColor4::normVec(void)
+inline F32 LLColor4::normVec()
{
- F32 mag = (F32) sqrt(mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]);
+ F32 mag = sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);
F32 oomag;
if (mag)
{
- oomag = 1.f/mag;
+ oomag = 1.f / mag;
mV[VRED] *= oomag;
mV[VGREEN] *= oomag;
mV[VBLUE] *= oomag;
}
- return (mag);
+ return mag;
}
// LLColor4 Operators
-
-inline LLColor4 operator+(const LLColor4 &a, const LLColor4 &b)
+inline LLColor4 operator+(const LLColor4& a, const LLColor4& b)
{
- return LLColor4(
- a.mV[VRED] + b.mV[VRED],
- a.mV[VGREEN] + b.mV[VGREEN],
- a.mV[VBLUE] + b.mV[VBLUE],
- a.mV[VALPHA] + b.mV[VALPHA]);
+ return LLColor4(a.mV[VRED] + b.mV[VRED], a.mV[VGREEN] + b.mV[VGREEN], a.mV[VBLUE] + b.mV[VBLUE], a.mV[VALPHA] + b.mV[VALPHA]);
}
-inline LLColor4 operator-(const LLColor4 &a, const LLColor4 &b)
+inline LLColor4 operator-(const LLColor4& a, const LLColor4& b)
{
- return LLColor4(
- a.mV[VRED] - b.mV[VRED],
- a.mV[VGREEN] - b.mV[VGREEN],
- a.mV[VBLUE] - b.mV[VBLUE],
- a.mV[VALPHA] - b.mV[VALPHA]);
+ return LLColor4(a.mV[VRED] - b.mV[VRED], a.mV[VGREEN] - b.mV[VGREEN], a.mV[VBLUE] - b.mV[VBLUE], a.mV[VALPHA] - b.mV[VALPHA]);
}
-inline LLColor4 operator*(const LLColor4 &a, const LLColor4 &b)
+inline LLColor4 operator*(const LLColor4& a, const LLColor4& b)
{
- return LLColor4(
- a.mV[VRED] * b.mV[VRED],
- a.mV[VGREEN] * b.mV[VGREEN],
- a.mV[VBLUE] * b.mV[VBLUE],
- a.mV[VALPHA] * b.mV[VALPHA]);
+ return LLColor4(a.mV[VRED] * b.mV[VRED], a.mV[VGREEN] * b.mV[VGREEN], a.mV[VBLUE] * b.mV[VBLUE], a.mV[VALPHA] * b.mV[VALPHA]);
}
-inline LLColor4 operator*(const LLColor4 &a, F32 k)
+inline LLColor4 operator*(const LLColor4& a, F32 k)
{
// only affects rgb (not a!)
- return LLColor4(
- a.mV[VRED] * k,
- a.mV[VGREEN] * k,
- a.mV[VBLUE] * k,
- a.mV[VALPHA]);
+ return LLColor4(a.mV[VRED] * k, a.mV[VGREEN] * k, a.mV[VBLUE] * k, a.mV[VALPHA]);
}
-inline LLColor4 operator/(const LLColor4 &a, F32 k)
+inline LLColor4 operator/(const LLColor4& a, F32 k)
{
- return LLColor4(
- a.mV[VRED] / k,
- a.mV[VGREEN] / k,
- a.mV[VBLUE] / k,
- a.mV[VALPHA]);
+ return LLColor4(a.mV[VRED] / k, a.mV[VGREEN] / k, a.mV[VBLUE] / k, a.mV[VALPHA]);
}
-inline LLColor4 operator*(F32 k, const LLColor4 &a)
+inline LLColor4 operator*(F32 k, const LLColor4& a)
{
// only affects rgb (not a!)
- return LLColor4(
- a.mV[VRED] * k,
- a.mV[VGREEN] * k,
- a.mV[VBLUE] * k,
- a.mV[VALPHA]);
+ return LLColor4(a.mV[VRED] * k, a.mV[VGREEN] * k, a.mV[VBLUE] * k, a.mV[VALPHA]);
}
-inline LLColor4 operator%(F32 k, const LLColor4 &a)
+inline LLColor4 operator%(F32 k, const LLColor4& a)
{
// only affects alpha (not rgb!)
- return LLColor4(
- a.mV[VRED],
- a.mV[VGREEN],
- a.mV[VBLUE],
- a.mV[VALPHA] * k);
+ return LLColor4(a.mV[VRED], a.mV[VGREEN], a.mV[VBLUE], a.mV[VALPHA] * k);
}
-inline LLColor4 operator%(const LLColor4 &a, F32 k)
+inline LLColor4 operator%(const LLColor4& a, F32 k)
{
// only affects alpha (not rgb!)
- return LLColor4(
- a.mV[VRED],
- a.mV[VGREEN],
- a.mV[VBLUE],
- a.mV[VALPHA] * k);
+ return LLColor4(a.mV[VRED], a.mV[VGREEN], a.mV[VBLUE], a.mV[VALPHA] * k);
}
-inline bool operator==(const LLColor4 &a, const LLColor4 &b)
+inline bool operator==(const LLColor4& a, const LLColor4& b)
{
- return ( (a.mV[VRED] == b.mV[VRED])
- &&(a.mV[VGREEN] == b.mV[VGREEN])
- &&(a.mV[VBLUE] == b.mV[VBLUE])
- &&(a.mV[VALPHA] == b.mV[VALPHA]));
+ return ((a.mV[VRED] == b.mV[VRED]) && (a.mV[VGREEN] == b.mV[VGREEN]) && (a.mV[VBLUE] == b.mV[VBLUE]) && (a.mV[VALPHA] == b.mV[VALPHA]));
}
-inline bool operator!=(const LLColor4 &a, const LLColor4 &b)
+inline bool operator!=(const LLColor4& a, const LLColor4& b)
{
- return ( (a.mV[VRED] != b.mV[VRED])
- ||(a.mV[VGREEN] != b.mV[VGREEN])
- ||(a.mV[VBLUE] != b.mV[VBLUE])
- ||(a.mV[VALPHA] != b.mV[VALPHA]));
+ return ((a.mV[VRED] != b.mV[VRED]) || (a.mV[VGREEN] != b.mV[VGREEN]) || (a.mV[VBLUE] != b.mV[VBLUE]) || (a.mV[VALPHA] != b.mV[VALPHA]));
}
-inline const LLColor4& operator+=(LLColor4 &a, const LLColor4 &b)
+inline const LLColor4& operator+=(LLColor4& a, const LLColor4& b)
{
a.mV[VRED] += b.mV[VRED];
a.mV[VGREEN] += b.mV[VGREEN];
@@ -562,7 +522,7 @@ inline const LLColor4& operator+=(LLColor4 &a, const LLColor4 &b)
return a;
}
-inline const LLColor4& operator-=(LLColor4 &a, const LLColor4 &b)
+inline const LLColor4& operator-=(LLColor4& a, const LLColor4& b)
{
a.mV[VRED] -= b.mV[VRED];
a.mV[VGREEN] -= b.mV[VGREEN];
@@ -571,7 +531,7 @@ inline const LLColor4& operator-=(LLColor4 &a, const LLColor4 &b)
return a;
}
-inline const LLColor4& operator*=(LLColor4 &a, F32 k)
+inline const LLColor4& operator*=(LLColor4& a, F32 k)
{
// only affects rgb (not a!)
a.mV[VRED] *= k;
@@ -580,121 +540,120 @@ inline const LLColor4& operator*=(LLColor4 &a, F32 k)
return a;
}
-inline const LLColor4& operator *=(LLColor4 &a, const LLColor4 &b)
+inline const LLColor4& operator*=(LLColor4& a, const LLColor4& b)
{
a.mV[VRED] *= b.mV[VRED];
a.mV[VGREEN] *= b.mV[VGREEN];
a.mV[VBLUE] *= b.mV[VBLUE];
-// a.mV[VALPHA] *= b.mV[VALPHA];
+ // a.mV[VALPHA] *= b.mV[VALPHA];
return a;
}
-inline const LLColor4& operator%=(LLColor4 &a, F32 k)
+inline const LLColor4& operator%=(LLColor4& a, F32 k)
{
// only affects alpha (not rgb!)
a.mV[VALPHA] *= k;
return a;
}
-
// Non-member functions
-inline F32 distVec(const LLColor4 &a, const LLColor4 &b)
+inline F32 distVec(const LLColor4& a, const LLColor4& b)
{
LLColor4 vec = a - b;
- return (vec.length());
+ return vec.length();
}
-inline F32 distVec_squared(const LLColor4 &a, const LLColor4 &b)
+inline F32 distVec_squared(const LLColor4& a, const LLColor4& b)
{
LLColor4 vec = a - b;
- return (vec.lengthSquared());
+ return vec.lengthSquared();
}
-inline LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u)
+inline LLColor4 lerp(const LLColor4& a, const LLColor4& b, F32 u)
{
- return LLColor4(
- a.mV[VRED] + (b.mV[VRED] - a.mV[VRED]) * u,
- a.mV[VGREEN] + (b.mV[VGREEN] - a.mV[VGREEN]) * u,
- a.mV[VBLUE] + (b.mV[VBLUE] - a.mV[VBLUE]) * u,
- a.mV[VALPHA] + (b.mV[VALPHA] - a.mV[VALPHA]) * u);
+ return LLColor4(a.mV[VRED] + (b.mV[VRED] - a.mV[VRED]) * u,
+ a.mV[VGREEN] + (b.mV[VGREEN] - a.mV[VGREEN]) * u,
+ a.mV[VBLUE] + (b.mV[VBLUE] - a.mV[VBLUE]) * u,
+ a.mV[VALPHA] + (b.mV[VALPHA] - a.mV[VALPHA]) * u);
}
inline bool LLColor4::operator<(const LLColor4& rhs) const
{
- if (mV[0] != rhs.mV[0])
+ if (mV[VRED] != rhs.mV[VRED])
{
- return mV[0] < rhs.mV[0];
+ return mV[VRED] < rhs.mV[VRED];
}
- if (mV[1] != rhs.mV[1])
+ if (mV[VGREEN] != rhs.mV[VGREEN])
{
- return mV[1] < rhs.mV[1];
+ return mV[VGREEN] < rhs.mV[VGREEN];
}
- if (mV[2] != rhs.mV[2])
+ if (mV[VBLUE] != rhs.mV[VBLUE])
{
- return mV[2] < rhs.mV[2];
+ return mV[VBLUE] < rhs.mV[VBLUE];
}
- return mV[3] < rhs.mV[3];
+ return mV[VALPHA] < rhs.mV[VALPHA];
}
void LLColor4::clamp()
{
// Clamp the color...
- if (mV[0] < 0.f)
+ if (mV[VRED] < 0.f)
{
- mV[0] = 0.f;
+ mV[VRED] = 0.f;
}
- else if (mV[0] > 1.f)
+ else if (mV[VRED] > 1.f)
{
- mV[0] = 1.f;
+ mV[VRED] = 1.f;
}
- if (mV[1] < 0.f)
+ if (mV[VGREEN] < 0.f)
{
- mV[1] = 0.f;
+ mV[VGREEN] = 0.f;
}
- else if (mV[1] > 1.f)
+ else if (mV[VGREEN] > 1.f)
{
- mV[1] = 1.f;
+ mV[VGREEN] = 1.f;
}
- if (mV[2] < 0.f)
+ if (mV[VBLUE] < 0.f)
{
- mV[2] = 0.f;
+ mV[VBLUE] = 0.f;
}
- else if (mV[2] > 1.f)
+ else if (mV[VBLUE] > 1.f)
{
- mV[2] = 1.f;
+ mV[VBLUE] = 1.f;
}
- if (mV[3] < 0.f)
+ if (mV[VALPHA] < 0.f)
{
- mV[3] = 0.f;
+ mV[VALPHA] = 0.f;
}
- else if (mV[3] > 1.f)
+ else if (mV[VALPHA] > 1.f)
{
- mV[3] = 1.f;
+ mV[VALPHA] = 1.f;
}
}
// Return the given linear space color value in gamma corrected (sRGB) space
-inline const LLColor4 srgbColor4(const LLColor4 &a) {
+inline const LLColor4 srgbColor4(const LLColor4& a)
+{
LLColor4 srgbColor;
- srgbColor.mV[0] = linearTosRGB(a.mV[0]);
- srgbColor.mV[1] = linearTosRGB(a.mV[1]);
- srgbColor.mV[2] = linearTosRGB(a.mV[2]);
- srgbColor.mV[3] = a.mV[3];
+ srgbColor.mV[VRED] = linearTosRGB(a.mV[VRED]);
+ srgbColor.mV[VGREEN] = linearTosRGB(a.mV[VGREEN]);
+ srgbColor.mV[VBLUE] = linearTosRGB(a.mV[VBLUE]);
+ srgbColor.mV[VALPHA] = a.mV[VALPHA];
return srgbColor;
}
// Return the given gamma corrected (sRGB) color in linear space
-inline const LLColor4 linearColor4(const LLColor4 &a)
+inline const LLColor4 linearColor4(const LLColor4& a)
{
LLColor4 linearColor;
- linearColor.mV[0] = sRGBtoLinear(a.mV[0]);
- linearColor.mV[1] = sRGBtoLinear(a.mV[1]);
- linearColor.mV[2] = sRGBtoLinear(a.mV[2]);
- linearColor.mV[3] = a.mV[3];
+ linearColor.mV[VRED] = sRGBtoLinear(a.mV[VRED]);
+ linearColor.mV[VGREEN] = sRGBtoLinear(a.mV[VGREEN]);
+ linearColor.mV[VBLUE] = sRGBtoLinear(a.mV[VBLUE]);
+ linearColor.mV[VALPHA] = a.mV[VALPHA];
return linearColor;
}
@@ -720,4 +679,3 @@ void LLColor4::write(std::vector<T>& v) const
}
#endif
-
diff --git a/indra/llmath/v4coloru.cpp b/indra/llmath/v4coloru.cpp
index acf349245a..c495ffdb4c 100644
--- a/indra/llmath/v4coloru.cpp
+++ b/indra/llmath/v4coloru.cpp
@@ -26,10 +26,7 @@
#include "linden_common.h"
-//#include "v3coloru.h"
#include "v4coloru.h"
-#include "v4color.h"
-//#include "vmath.h"
#include "llmath.h"
// LLColor4U
@@ -39,49 +36,7 @@ LLColor4U LLColor4U::red (255, 0, 0, 255);
LLColor4U LLColor4U::green( 0, 255, 0, 255);
LLColor4U LLColor4U::blue ( 0, 0, 255, 255);
-// conversion
-/* inlined to fix gcc compile link error
-LLColor4U::operator LLColor4()
-{
- return(LLColor4((F32)mV[VRED]/255.f,(F32)mV[VGREEN]/255.f,(F32)mV[VBLUE]/255.f,(F32)mV[VALPHA]/255.f));
-}
-*/
-
-// Constructors
-
-
-/*
-LLColor4U::LLColor4U(const LLColor3 &vec)
-{
- mV[VRED] = vec.mV[VRED];
- mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
- mV[VALPHA] = 255;
-}
-*/
-
-
-// Clear and Assignment Functions
-
-
-
-// LLColor4U Operators
-
-/*
-LLColor4U LLColor4U::operator=(const LLColor3 &a)
-{
- mV[VRED] = a.mV[VRED];
- mV[VGREEN] = a.mV[VGREEN];
- mV[VBLUE] = a.mV[VBLUE];
-
-// converting from an rgb sets a=1 (opaque)
- mV[VALPHA] = 255;
- return (*this);
-}
-*/
-
-
-std::ostream& operator<<(std::ostream& s, const LLColor4U &a)
+std::ostream& operator<<(std::ostream& s, const LLColor4U& a)
{
s << "{ " << (S32)a.mV[VRED] << ", " << (S32)a.mV[VGREEN] << ", " << (S32)a.mV[VBLUE] << ", " << (S32)a.mV[VALPHA] << " }";
return s;
@@ -90,31 +45,31 @@ std::ostream& operator<<(std::ostream& s, const LLColor4U &a)
// static
bool LLColor4U::parseColor4U(const std::string& buf, LLColor4U* value)
{
- if( buf.empty() || value == nullptr)
+ if (buf.empty() || value == nullptr)
{
return false;
}
- U32 v[4];
- S32 count = sscanf( buf.c_str(), "%u, %u, %u, %u", v + 0, v + 1, v + 2, v + 3 );
- if (1 == count )
+ U32 v[4]{};
+ S32 count = sscanf(buf.c_str(), "%u, %u, %u, %u", v + 0, v + 1, v + 2, v + 3);
+ if (1 == count)
{
// try this format
- count = sscanf( buf.c_str(), "%u %u %u %u", v + 0, v + 1, v + 2, v + 3 );
+ count = sscanf(buf.c_str(), "%u %u %u %u", v + 0, v + 1, v + 2, v + 3);
}
- if( 4 != count )
+ if (4 != count)
{
return false;
}
- for( S32 i = 0; i < 4; i++ )
+ for (S32 i = 0; i < 4; i++)
{
- if( v[i] > U8_MAX )
+ if (v[i] > U8_MAX)
{
return false;
}
}
- value->set( U8(v[0]), U8(v[1]), U8(v[2]), U8(v[3]) );
+ value->set(U8(v[VRED]), U8(v[VGREEN]), U8(v[VBLUE]), U8(v[VALPHA]));
return true;
}
diff --git a/indra/llmath/v4coloru.h b/indra/llmath/v4coloru.h
index 29128a08a7..e495fd3eea 100644
--- a/indra/llmath/v4coloru.h
+++ b/indra/llmath/v4coloru.h
@@ -28,104 +28,93 @@
#define LL_V4COLORU_H
#include "llerror.h"
-//#include "vmath.h"
#include "llmath.h"
-//#include "v4color.h"
#include "v3color.h"
#include "v4color.h"
-//class LLColor3U;
class LLColor4;
// LLColor4U = | red green blue alpha |
-static const U32 LENGTHOFCOLOR4U = 4;
-
+static constexpr U32 LENGTHOFCOLOR4U = 4;
class LLColor4U
{
public:
-
U8 mV[LENGTHOFCOLOR4U];
- LLColor4U(); // Initializes LLColor4U to (0, 0, 0, 1)
- LLColor4U(U8 r, U8 g, U8 b); // Initializes LLColor4U to (r, g, b, 1)
- LLColor4U(U8 r, U8 g, U8 b, U8 a); // Initializes LLColor4U to (r. g, b, a)
- LLColor4U(const U8 *vec); // Initializes LLColor4U to (vec[0]. vec[1], vec[2], 1)
- explicit LLColor4U(const LLSD& sd)
- {
- setValue(sd);
- }
+ LLColor4U(); // Initializes LLColor4U to (0, 0, 0, 1)
+ LLColor4U(U8 r, U8 g, U8 b); // Initializes LLColor4U to (r, g, b, 1)
+ LLColor4U(U8 r, U8 g, U8 b, U8 a); // Initializes LLColor4U to (r. g, b, a)
+ LLColor4U(const U8* vec); // Initializes LLColor4U to (vec[0]. vec[1], vec[2], 1)
+ explicit LLColor4U(const LLSD& sd) { setValue(sd); }
void setValue(const LLSD& sd)
{
- mV[0] = sd[0].asInteger();
- mV[1] = sd[1].asInteger();
- mV[2] = sd[2].asInteger();
- mV[3] = sd[3].asInteger();
+ mV[VRED] = sd[VRED].asInteger();
+ mV[VGREEN] = sd[VGREEN].asInteger();
+ mV[VBLUE] = sd[VBLUE].asInteger();
+ mV[VALPHA] = sd[VALPHA].asInteger();
}
LLSD getValue() const
{
LLSD ret;
- ret[0] = mV[0];
- ret[1] = mV[1];
- ret[2] = mV[2];
- ret[3] = mV[3];
+ ret[VRED] = mV[VRED];
+ ret[VGREEN] = mV[VGREEN];
+ ret[VBLUE] = mV[VBLUE];
+ ret[VALPHA] = mV[VALPHA];
return ret;
}
- const LLColor4U& setToBlack(); // zero LLColor4U to (0, 0, 0, 1)
- const LLColor4U& setToWhite(); // zero LLColor4U to (0, 0, 0, 1)
+ const LLColor4U& setToBlack(); // zero LLColor4U to (0, 0, 0, 1)
+ const LLColor4U& setToWhite(); // zero LLColor4U to (0, 0, 0, 1)
- const LLColor4U& set(U8 r, U8 g, U8 b, U8 a);// Sets LLColor4U to (r, g, b, a)
- const LLColor4U& set(U8 r, U8 g, U8 b); // Sets LLColor4U to (r, g, b) (no change in a)
- const LLColor4U& set(const LLColor4U &vec); // Sets LLColor4U to vec
- const LLColor4U& set(const U8 *vec); // Sets LLColor4U to vec
+ const LLColor4U& set(U8 r, U8 g, U8 b, U8 a); // Sets LLColor4U to (r, g, b, a)
+ const LLColor4U& set(U8 r, U8 g, U8 b); // Sets LLColor4U to (r, g, b) (no change in a)
+ const LLColor4U& set(const LLColor4U& vec); // Sets LLColor4U to vec
+ const LLColor4U& set(const U8* vec); // Sets LLColor4U to vec
- const LLColor4U& setVec(U8 r, U8 g, U8 b, U8 a); // deprecated -- use set()
- const LLColor4U& setVec(U8 r, U8 g, U8 b); // deprecated -- use set()
- const LLColor4U& setVec(const LLColor4U &vec); // deprecated -- use set()
- const LLColor4U& setVec(const U8 *vec); // deprecated -- use set()
+ const LLColor4U& setVec(U8 r, U8 g, U8 b, U8 a); // deprecated -- use set()
+ const LLColor4U& setVec(U8 r, U8 g, U8 b); // deprecated -- use set()
+ const LLColor4U& setVec(const LLColor4U& vec); // deprecated -- use set()
+ const LLColor4U& setVec(const U8* vec); // deprecated -- use set()
- const LLColor4U& setAlpha(U8 a);
+ const LLColor4U& setAlpha(U8 a);
- F32 magVec() const; // deprecated -- use length()
- F32 magVecSquared() const; // deprecated -- use lengthSquared()
+ F32 magVec() const; // deprecated -- use length()
+ F32 magVecSquared() const; // deprecated -- use lengthSquared()
- F32 length() const; // Returns magnitude squared of LLColor4U
- F32 lengthSquared() const; // Returns magnitude squared of LLColor4U
+ F32 length() const; // Returns magnitude squared of LLColor4U
+ F32 lengthSquared() const; // Returns magnitude squared of LLColor4U
- friend std::ostream& operator<<(std::ostream& s, const LLColor4U &a); // Print a
- friend LLColor4U operator+(const LLColor4U &a, const LLColor4U &b); // Return vector a + b
- friend LLColor4U operator-(const LLColor4U &a, const LLColor4U &b); // Return vector a minus b
- friend LLColor4U operator*(const LLColor4U &a, const LLColor4U &b); // Return a * b
- friend bool operator==(const LLColor4U &a, const LLColor4U &b); // Return a == b
- friend bool operator!=(const LLColor4U &a, const LLColor4U &b); // Return a != b
+ friend std::ostream& operator<<(std::ostream& s, const LLColor4U& a); // Print a
+ friend LLColor4U operator+(const LLColor4U& a, const LLColor4U& b); // Return vector a + b
+ friend LLColor4U operator-(const LLColor4U& a, const LLColor4U& b); // Return vector a minus b
+ friend LLColor4U operator*(const LLColor4U& a, const LLColor4U& b); // Return a * b
+ friend bool operator==(const LLColor4U& a, const LLColor4U& b); // Return a == b
+ friend bool operator!=(const LLColor4U& a, const LLColor4U& b); // Return a != b
- friend const LLColor4U& operator+=(LLColor4U &a, const LLColor4U &b); // Return vector a + b
- friend const LLColor4U& operator-=(LLColor4U &a, const LLColor4U &b); // Return vector a minus b
- friend const LLColor4U& operator*=(LLColor4U &a, U8 k); // Return rgb times scaler k (no alpha change)
- friend const LLColor4U& operator%=(LLColor4U &a, U8 k); // Return alpha times scaler k (no rgb change)
+ friend const LLColor4U& operator+=(LLColor4U& a, const LLColor4U& b); // Return vector a + b
+ friend const LLColor4U& operator-=(LLColor4U& a, const LLColor4U& b); // Return vector a minus b
+ friend const LLColor4U& operator*=(LLColor4U& a, U8 k); // Return rgb times scaler k (no alpha change)
+ friend const LLColor4U& operator%=(LLColor4U& a, U8 k); // Return alpha times scaler k (no rgb change)
- LLColor4U addClampMax(const LLColor4U &color); // Add and clamp the max
+ LLColor4U addClampMax(const LLColor4U& color); // Add and clamp the max
- LLColor4U multAll(const F32 k); // Multiply ALL channels by scalar k
+ LLColor4U multAll(const F32 k); // Multiply ALL channels by scalar k
- inline void setVecScaleClamp(const LLColor3 &color);
- inline void setVecScaleClamp(const LLColor4 &color);
+ inline void setVecScaleClamp(const LLColor3& color);
+ inline void setVecScaleClamp(const LLColor4& color);
static bool parseColor4U(const std::string& buf, LLColor4U* value);
// conversion
- operator LLColor4() const
- {
- return LLColor4(*this);
- }
+ operator LLColor4() const { return LLColor4(*this); }
- U32 asRGBA() const;
- void fromRGBA( U32 aVal );
+ U32 asRGBA() const;
+ void fromRGBA(U32 aVal);
static LLColor4U white;
static LLColor4U black;
@@ -134,104 +123,99 @@ public:
static LLColor4U blue;
};
+static_assert(std::is_trivially_copyable<LLColor4U>::value, "LLColor4U must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLColor4U>::value, "LLColor4U must be trivial move");
+static_assert(std::is_standard_layout<LLColor4U>::value, "LLColor4U must be a standard layout type");
// Non-member functions
-F32 distVec(const LLColor4U &a, const LLColor4U &b); // Returns distance between a and b
-F32 distVec_squared(const LLColor4U &a, const LLColor4U &b); // Returns distance squared between a and b
-
+F32 distVec(const LLColor4U& a, const LLColor4U& b); // Returns distance between a and b
+F32 distVec_squared(const LLColor4U& a, const LLColor4U& b); // Returns distance squared between a and b
inline LLColor4U::LLColor4U()
{
- mV[VRED] = 0;
+ mV[VRED] = 0;
mV[VGREEN] = 0;
- mV[VBLUE] = 0;
+ mV[VBLUE] = 0;
mV[VALPHA] = 255;
}
inline LLColor4U::LLColor4U(U8 r, U8 g, U8 b)
{
- mV[VRED] = r;
+ mV[VRED] = r;
mV[VGREEN] = g;
- mV[VBLUE] = b;
+ mV[VBLUE] = b;
mV[VALPHA] = 255;
}
inline LLColor4U::LLColor4U(U8 r, U8 g, U8 b, U8 a)
{
- mV[VRED] = r;
+ mV[VRED] = r;
mV[VGREEN] = g;
- mV[VBLUE] = b;
+ mV[VBLUE] = b;
mV[VALPHA] = a;
}
-inline LLColor4U::LLColor4U(const U8 *vec)
+inline LLColor4U::LLColor4U(const U8* vec)
{
- mV[VRED] = vec[VRED];
+ mV[VRED] = vec[VRED];
mV[VGREEN] = vec[VGREEN];
- mV[VBLUE] = vec[VBLUE];
+ mV[VBLUE] = vec[VBLUE];
mV[VALPHA] = vec[VALPHA];
}
-/*
-inline LLColor4U::operator LLColor4()
-{
- return(LLColor4((F32)mV[VRED]/255.f,(F32)mV[VGREEN]/255.f,(F32)mV[VBLUE]/255.f,(F32)mV[VALPHA]/255.f));
-}
-*/
-
inline const LLColor4U& LLColor4U::setToBlack(void)
{
- mV[VRED] = 0;
+ mV[VRED] = 0;
mV[VGREEN] = 0;
- mV[VBLUE] = 0;
+ mV[VBLUE] = 0;
mV[VALPHA] = 255;
return (*this);
}
inline const LLColor4U& LLColor4U::setToWhite(void)
{
- mV[VRED] = 255;
+ mV[VRED] = 255;
mV[VGREEN] = 255;
- mV[VBLUE] = 255;
+ mV[VBLUE] = 255;
mV[VALPHA] = 255;
return (*this);
}
inline const LLColor4U& LLColor4U::set(const U8 x, const U8 y, const U8 z)
{
- mV[VRED] = x;
+ mV[VRED] = x;
mV[VGREEN] = y;
- mV[VBLUE] = z;
+ mV[VBLUE] = z;
-// no change to alpha!
-// mV[VALPHA] = 255;
+ // no change to alpha!
+ // mV[VALPHA] = 255;
return (*this);
}
inline const LLColor4U& LLColor4U::set(const U8 r, const U8 g, const U8 b, U8 a)
{
- mV[0] = r;
- mV[1] = g;
- mV[2] = b;
- mV[3] = a;
+ mV[VRED] = r;
+ mV[VGREEN] = g;
+ mV[VBLUE] = b;
+ mV[VALPHA] = a;
return (*this);
}
-inline const LLColor4U& LLColor4U::set(const LLColor4U &vec)
+inline const LLColor4U& LLColor4U::set(const LLColor4U& vec)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
mV[VALPHA] = vec.mV[VALPHA];
return (*this);
}
-inline const LLColor4U& LLColor4U::set(const U8 *vec)
+inline const LLColor4U& LLColor4U::set(const U8* vec)
{
- mV[VRED] = vec[VRED];
+ mV[VRED] = vec[VRED];
mV[VGREEN] = vec[VGREEN];
- mV[VBLUE] = vec[VBLUE];
+ mV[VBLUE] = vec[VBLUE];
mV[VALPHA] = vec[VALPHA];
return (*this);
}
@@ -239,12 +223,12 @@ inline const LLColor4U& LLColor4U::set(const U8 *vec)
// deprecated
inline const LLColor4U& LLColor4U::setVec(const U8 x, const U8 y, const U8 z)
{
- mV[VRED] = x;
+ mV[VRED] = x;
mV[VGREEN] = y;
- mV[VBLUE] = z;
+ mV[VBLUE] = z;
-// no change to alpha!
-// mV[VALPHA] = 255;
+ // no change to alpha!
+ // mV[VALPHA] = 255;
return (*this);
}
@@ -252,29 +236,29 @@ inline const LLColor4U& LLColor4U::setVec(const U8 x, const U8 y, const U8 z)
// deprecated
inline const LLColor4U& LLColor4U::setVec(const U8 r, const U8 g, const U8 b, U8 a)
{
- mV[0] = r;
- mV[1] = g;
- mV[2] = b;
- mV[3] = a;
+ mV[VRED] = r;
+ mV[VGREEN] = g;
+ mV[VBLUE] = b;
+ mV[VALPHA] = a;
return (*this);
}
// deprecated
-inline const LLColor4U& LLColor4U::setVec(const LLColor4U &vec)
+inline const LLColor4U& LLColor4U::setVec(const LLColor4U& vec)
{
- mV[VRED] = vec.mV[VRED];
+ mV[VRED] = vec.mV[VRED];
mV[VGREEN] = vec.mV[VGREEN];
- mV[VBLUE] = vec.mV[VBLUE];
+ mV[VBLUE] = vec.mV[VBLUE];
mV[VALPHA] = vec.mV[VALPHA];
return (*this);
}
// deprecated
-inline const LLColor4U& LLColor4U::setVec(const U8 *vec)
+inline const LLColor4U& LLColor4U::setVec(const U8* vec)
{
- mV[VRED] = vec[VRED];
+ mV[VRED] = vec[VRED];
mV[VGREEN] = vec[VGREEN];
- mV[VBLUE] = vec[VBLUE];
+ mV[VBLUE] = vec[VBLUE];
mV[VALPHA] = vec[VALPHA];
return (*this);
}
@@ -287,131 +271,68 @@ inline const LLColor4U& LLColor4U::setAlpha(U8 a)
// LLColor4U Magnitude and Normalization Functions
-inline F32 LLColor4U::length(void) const
+inline F32 LLColor4U::length() const
{
- return (F32) sqrt( ((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE] );
+ return sqrt(((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE]);
}
-inline F32 LLColor4U::lengthSquared(void) const
+inline F32 LLColor4U::lengthSquared() const
{
return ((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE];
}
// deprecated
-inline F32 LLColor4U::magVec(void) const
+inline F32 LLColor4U::magVec() const
{
- return (F32) sqrt( ((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE] );
+ return sqrt(((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE]);
}
// deprecated
-inline F32 LLColor4U::magVecSquared(void) const
+inline F32 LLColor4U::magVecSquared() const
{
return ((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE];
}
-inline LLColor4U operator+(const LLColor4U &a, const LLColor4U &b)
+inline LLColor4U operator+(const LLColor4U& a, const LLColor4U& b)
{
- return LLColor4U(
- a.mV[VRED] + b.mV[VRED],
- a.mV[VGREEN] + b.mV[VGREEN],
- a.mV[VBLUE] + b.mV[VBLUE],
- a.mV[VALPHA] + b.mV[VALPHA]);
+ return LLColor4U(a.mV[VRED] + b.mV[VRED], a.mV[VGREEN] + b.mV[VGREEN], a.mV[VBLUE] + b.mV[VBLUE], a.mV[VALPHA] + b.mV[VALPHA]);
}
-inline LLColor4U operator-(const LLColor4U &a, const LLColor4U &b)
+inline LLColor4U operator-(const LLColor4U& a, const LLColor4U& b)
{
- return LLColor4U(
- a.mV[VRED] - b.mV[VRED],
- a.mV[VGREEN] - b.mV[VGREEN],
- a.mV[VBLUE] - b.mV[VBLUE],
- a.mV[VALPHA] - b.mV[VALPHA]);
+ return LLColor4U(a.mV[VRED] - b.mV[VRED], a.mV[VGREEN] - b.mV[VGREEN], a.mV[VBLUE] - b.mV[VBLUE], a.mV[VALPHA] - b.mV[VALPHA]);
}
-inline LLColor4U operator*(const LLColor4U &a, const LLColor4U &b)
+inline LLColor4U operator*(const LLColor4U& a, const LLColor4U& b)
{
- return LLColor4U(
- a.mV[VRED] * b.mV[VRED],
- a.mV[VGREEN] * b.mV[VGREEN],
- a.mV[VBLUE] * b.mV[VBLUE],
- a.mV[VALPHA] * b.mV[VALPHA]);
+ return LLColor4U(a.mV[VRED] * b.mV[VRED], a.mV[VGREEN] * b.mV[VGREEN], a.mV[VBLUE] * b.mV[VBLUE], a.mV[VALPHA] * b.mV[VALPHA]);
}
-inline LLColor4U LLColor4U::addClampMax(const LLColor4U &color)
+inline LLColor4U LLColor4U::addClampMax(const LLColor4U& color)
{
return LLColor4U(llmin((S32)mV[VRED] + color.mV[VRED], 255),
- llmin((S32)mV[VGREEN] + color.mV[VGREEN], 255),
- llmin((S32)mV[VBLUE] + color.mV[VBLUE], 255),
- llmin((S32)mV[VALPHA] + color.mV[VALPHA], 255));
+ llmin((S32)mV[VGREEN] + color.mV[VGREEN], 255),
+ llmin((S32)mV[VBLUE] + color.mV[VBLUE], 255),
+ llmin((S32)mV[VALPHA] + color.mV[VALPHA], 255));
}
inline LLColor4U LLColor4U::multAll(const F32 k)
{
// Round to nearest
- return LLColor4U(
- (U8)ll_round(mV[VRED] * k),
- (U8)ll_round(mV[VGREEN] * k),
- (U8)ll_round(mV[VBLUE] * k),
- (U8)ll_round(mV[VALPHA] * k));
-}
-/*
-inline LLColor4U operator*(const LLColor4U &a, U8 k)
-{
- // only affects rgb (not a!)
- return LLColor4U(
- a.mV[VRED] * k,
- a.mV[VGREEN] * k,
- a.mV[VBLUE] * k,
- a.mV[VALPHA]);
-}
-
-inline LLColor4U operator*(U8 k, const LLColor4U &a)
-{
- // only affects rgb (not a!)
- return LLColor4U(
- a.mV[VRED] * k,
- a.mV[VGREEN] * k,
- a.mV[VBLUE] * k,
- a.mV[VALPHA]);
-}
-
-inline LLColor4U operator%(U8 k, const LLColor4U &a)
-{
- // only affects alpha (not rgb!)
- return LLColor4U(
- a.mV[VRED],
- a.mV[VGREEN],
- a.mV[VBLUE],
- a.mV[VALPHA] * k );
+ return LLColor4U((U8)ll_round(mV[VRED] * k), (U8)ll_round(mV[VGREEN] * k), (U8)ll_round(mV[VBLUE] * k), (U8)ll_round(mV[VALPHA] * k));
}
-inline LLColor4U operator%(const LLColor4U &a, U8 k)
+inline bool operator==(const LLColor4U& a, const LLColor4U& b)
{
- // only affects alpha (not rgb!)
- return LLColor4U(
- a.mV[VRED],
- a.mV[VGREEN],
- a.mV[VBLUE],
- a.mV[VALPHA] * k );
-}
-*/
-
-inline bool operator==(const LLColor4U &a, const LLColor4U &b)
-{
- return ( (a.mV[VRED] == b.mV[VRED])
- &&(a.mV[VGREEN] == b.mV[VGREEN])
- &&(a.mV[VBLUE] == b.mV[VBLUE])
- &&(a.mV[VALPHA] == b.mV[VALPHA]));
+ return ((a.mV[VRED] == b.mV[VRED]) && (a.mV[VGREEN] == b.mV[VGREEN]) && (a.mV[VBLUE] == b.mV[VBLUE]) && (a.mV[VALPHA] == b.mV[VALPHA]));
}
-inline bool operator!=(const LLColor4U &a, const LLColor4U &b)
+inline bool operator!=(const LLColor4U& a, const LLColor4U& b)
{
- return ( (a.mV[VRED] != b.mV[VRED])
- ||(a.mV[VGREEN] != b.mV[VGREEN])
- ||(a.mV[VBLUE] != b.mV[VBLUE])
- ||(a.mV[VALPHA] != b.mV[VALPHA]));
+ return ((a.mV[VRED] != b.mV[VRED]) || (a.mV[VGREEN] != b.mV[VGREEN]) || (a.mV[VBLUE] != b.mV[VBLUE]) || (a.mV[VALPHA] != b.mV[VALPHA]));
}
-inline const LLColor4U& operator+=(LLColor4U &a, const LLColor4U &b)
+inline const LLColor4U& operator+=(LLColor4U& a, const LLColor4U& b)
{
a.mV[VRED] += b.mV[VRED];
a.mV[VGREEN] += b.mV[VGREEN];
@@ -420,7 +341,7 @@ inline const LLColor4U& operator+=(LLColor4U &a, const LLColor4U &b)
return a;
}
-inline const LLColor4U& operator-=(LLColor4U &a, const LLColor4U &b)
+inline const LLColor4U& operator-=(LLColor4U& a, const LLColor4U& b)
{
a.mV[VRED] -= b.mV[VRED];
a.mV[VGREEN] -= b.mV[VGREEN];
@@ -429,7 +350,7 @@ inline const LLColor4U& operator-=(LLColor4U &a, const LLColor4U &b)
return a;
}
-inline const LLColor4U& operator*=(LLColor4U &a, U8 k)
+inline const LLColor4U& operator*=(LLColor4U& a, U8 k)
{
// only affects rgb (not a!)
a.mV[VRED] *= k;
@@ -438,20 +359,20 @@ inline const LLColor4U& operator*=(LLColor4U &a, U8 k)
return a;
}
-inline const LLColor4U& operator%=(LLColor4U &a, U8 k)
+inline const LLColor4U& operator%=(LLColor4U& a, U8 k)
{
// only affects alpha (not rgb!)
a.mV[VALPHA] *= k;
return a;
}
-inline F32 distVec(const LLColor4U &a, const LLColor4U &b)
+inline F32 distVec(const LLColor4U& a, const LLColor4U& b)
{
LLColor4U vec = a - b;
return (vec.length());
}
-inline F32 distVec_squared(const LLColor4U &a, const LLColor4U &b)
+inline F32 distVec_squared(const LLColor4U& a, const LLColor4U& b)
{
LLColor4U vec = a - b;
return (vec.lengthSquared());
@@ -460,13 +381,13 @@ inline F32 distVec_squared(const LLColor4U &a, const LLColor4U &b)
void LLColor4U::setVecScaleClamp(const LLColor4& color)
{
F32 color_scale_factor = 255.f;
- F32 max_color = llmax(color.mV[0], color.mV[1], color.mV[2]);
+ F32 max_color = llmax(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]);
if (max_color > 1.f)
{
color_scale_factor /= max_color;
}
- const S32 MAX_COLOR = 255;
- S32 r = ll_round(color.mV[0] * color_scale_factor);
+ constexpr S32 MAX_COLOR = 255;
+ S32 r = ll_round(color.mV[VRED] * color_scale_factor);
if (r > MAX_COLOR)
{
r = MAX_COLOR;
@@ -475,9 +396,9 @@ void LLColor4U::setVecScaleClamp(const LLColor4& color)
{
r = 0;
}
- mV[0] = r;
+ mV[VRED] = r;
- S32 g = ll_round(color.mV[1] * color_scale_factor);
+ S32 g = ll_round(color.mV[VGREEN] * color_scale_factor);
if (g > MAX_COLOR)
{
g = MAX_COLOR;
@@ -486,9 +407,9 @@ void LLColor4U::setVecScaleClamp(const LLColor4& color)
{
g = 0;
}
- mV[1] = g;
+ mV[VGREEN] = g;
- S32 b = ll_round(color.mV[2] * color_scale_factor);
+ S32 b = ll_round(color.mV[VBLUE] * color_scale_factor);
if (b > MAX_COLOR)
{
b = MAX_COLOR;
@@ -497,10 +418,10 @@ void LLColor4U::setVecScaleClamp(const LLColor4& color)
{
b = 0;
}
- mV[2] = b;
+ mV[VBLUE] = b;
// Alpha shouldn't be scaled, just clamped...
- S32 a = ll_round(color.mV[3] * MAX_COLOR);
+ S32 a = ll_round(color.mV[VALPHA] * MAX_COLOR);
if (a > MAX_COLOR)
{
a = MAX_COLOR;
@@ -509,44 +430,42 @@ void LLColor4U::setVecScaleClamp(const LLColor4& color)
{
a = 0;
}
- mV[3] = a;
+ mV[VALPHA] = a;
}
void LLColor4U::setVecScaleClamp(const LLColor3& color)
{
F32 color_scale_factor = 255.f;
- F32 max_color = llmax(color.mV[0], color.mV[1], color.mV[2]);
+ F32 max_color = llmax(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]);
if (max_color > 1.f)
{
color_scale_factor /= max_color;
}
const S32 MAX_COLOR = 255;
- S32 r = ll_round(color.mV[0] * color_scale_factor);
+ S32 r = ll_round(color.mV[VRED] * color_scale_factor);
if (r > MAX_COLOR)
{
r = MAX_COLOR;
}
- else
- if (r < 0)
+ else if (r < 0)
{
r = 0;
}
- mV[0] = r;
+ mV[VRED] = r;
- S32 g = ll_round(color.mV[1] * color_scale_factor);
+ S32 g = ll_round(color.mV[VGREEN] * color_scale_factor);
if (g > MAX_COLOR)
{
g = MAX_COLOR;
}
- else
- if (g < 0)
+ else if (g < 0)
{
g = 0;
}
- mV[1] = g;
+ mV[VGREEN] = g;
- S32 b = ll_round(color.mV[2] * color_scale_factor);
+ S32 b = ll_round(color.mV[VBLUE] * color_scale_factor);
if (b > MAX_COLOR)
{
b = MAX_COLOR;
@@ -555,31 +474,29 @@ void LLColor4U::setVecScaleClamp(const LLColor3& color)
{
b = 0;
}
- mV[2] = b;
+ mV[VBLUE] = b;
- mV[3] = 255;
+ mV[VALPHA] = 255;
}
inline U32 LLColor4U::asRGBA() const
{
// Little endian: values are swapped in memory. The original code access the array like a U32, so we need to swap here
- return (mV[3] << 24) | (mV[2] << 16) | (mV[1] << 8) | mV[0];
+ return (mV[VALPHA] << 24) | (mV[VBLUE] << 16) | (mV[VGREEN] << 8) | mV[VRED];
}
-inline void LLColor4U::fromRGBA( U32 aVal )
+inline void LLColor4U::fromRGBA(U32 aVal)
{
// Little endian: values are swapped in memory. The original code access the array like a U32, so we need to swap here
- mV[ 0 ] = aVal & 0xFF;
+ mV[VRED] = aVal & 0xFF;
aVal >>= 8;
- mV[ 1 ] = aVal & 0xFF;
+ mV[VGREEN] = aVal & 0xFF;
aVal >>= 8;
- mV[ 2 ] = aVal & 0xFF;
+ mV[VBLUE] = aVal & 0xFF;
aVal >>= 8;
- mV[ 3 ] = aVal & 0xFF;
+ mV[VALPHA] = aVal & 0xFF;
}
-
#endif
-
diff --git a/indra/llmath/v4math.cpp b/indra/llmath/v4math.cpp
index 0aa6eb09c3..cd475380d6 100644
--- a/indra/llmath/v4math.cpp
+++ b/indra/llmath/v4math.cpp
@@ -26,7 +26,6 @@
#include "linden_common.h"
-//#include "vmath.h"
#include "v3math.h"
#include "v4math.h"
#include "m4math.h"
@@ -36,13 +35,13 @@
// LLVector4
// Axis-Angle rotations
-const LLVector4& LLVector4::rotVec(const LLMatrix4 &mat)
+const LLVector4& LLVector4::rotVec(const LLMatrix4& mat)
{
*this = *this * mat;
return *this;
}
-const LLVector4& LLVector4::rotVec(const LLQuaternion &q)
+const LLVector4& LLVector4::rotVec(const LLQuaternion& q)
{
*this = *this * q;
return *this;
@@ -64,16 +63,16 @@ bool LLVector4::abs()
{
bool ret{ false };
- if (mV[0] < 0.f) { mV[0] = -mV[0]; ret = true; }
- if (mV[1] < 0.f) { mV[1] = -mV[1]; ret = true; }
- if (mV[2] < 0.f) { mV[2] = -mV[2]; ret = true; }
- if (mV[3] < 0.f) { mV[3] = -mV[3]; ret = true; }
+ if (mV[VX] < 0.f) { mV[VX] = -mV[VX]; ret = true; }
+ if (mV[VY] < 0.f) { mV[VY] = -mV[VY]; ret = true; }
+ if (mV[VZ] < 0.f) { mV[VZ] = -mV[VZ]; ret = true; }
+ if (mV[VW] < 0.f) { mV[VW] = -mV[VW]; ret = true; }
return ret;
}
-std::ostream& operator<<(std::ostream& s, const LLVector4 &a)
+std::ostream& operator<<(std::ostream& s, const LLVector4& a)
{
s << "{ " << a.mV[VX] << ", " << a.mV[VY] << ", " << a.mV[VZ] << ", " << a.mV[VW] << " }";
return s;
@@ -108,12 +107,12 @@ bool are_parallel(const LLVector4 &a, const LLVector4 &b, F32 epsilon)
}
-LLVector3 vec4to3(const LLVector4 &vec)
+LLVector3 vec4to3(const LLVector4& vec)
{
return LLVector3( vec.mV[VX], vec.mV[VY], vec.mV[VZ] );
}
-LLVector4 vec3to4(const LLVector3 &vec)
+LLVector4 vec3to4(const LLVector3& vec)
{
return LLVector4(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
}
diff --git a/indra/llmath/v4math.h b/indra/llmath/v4math.h
index a4c9668fdd..edfc2f8592 100644
--- a/indra/llmath/v4math.h
+++ b/indra/llmath/v4math.h
@@ -42,110 +42,114 @@ class LLQuaternion;
// LLVector4 = |x y z w|
-static const U32 LENGTHOFVECTOR4 = 4;
+static constexpr U32 LENGTHOFVECTOR4 = 4;
class LLVector4
{
- public:
- F32 mV[LENGTHOFVECTOR4];
- LLVector4(); // Initializes LLVector4 to (0, 0, 0, 1)
- explicit LLVector4(const F32 *vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2], vec[3])
- explicit LLVector4(const F64 *vec); // Initialized LLVector4 to ((F32) vec[0], (F32) vec[1], (F32) vec[3], (F32) vec[4]);
- explicit LLVector4(const LLVector2 &vec);
- explicit LLVector4(const LLVector2 &vec, F32 z, F32 w);
- explicit LLVector4(const LLVector3 &vec); // Initializes LLVector4 to (vec, 1)
- explicit LLVector4(const LLVector3 &vec, F32 w); // Initializes LLVector4 to (vec, w)
- explicit LLVector4(const LLSD &sd);
- LLVector4(F32 x, F32 y, F32 z); // Initializes LLVector4 to (x. y, z, 1)
- LLVector4(F32 x, F32 y, F32 z, F32 w);
-
- LLSD getValue() const
- {
- LLSD ret;
- ret[0] = mV[0];
- ret[1] = mV[1];
- ret[2] = mV[2];
- ret[3] = mV[3];
- return ret;
- }
-
- void setValue(const LLSD& sd)
- {
- mV[0] = (F32)sd[0].asReal();
- mV[1] = (F32)sd[1].asReal();
- mV[2] = (F32)sd[2].asReal();
- mV[3] = (F32)sd[3].asReal();
- }
-
- // GLM interop
- explicit LLVector4(const glm::vec3& vec); // Initializes LLVector4 to (vec, 1)
- explicit LLVector4(const glm::vec4& vec); // Initializes LLVector4 to vec
- explicit operator glm::vec3() const; // Initializes glm::vec3 to (vec[0]. vec[1], vec[2])
- explicit operator glm::vec4() const; // Initializes glm::vec4 to (vec[0]. vec[1], vec[2], vec[3])
-
- inline bool isFinite() const; // checks to see if all values of LLVector3 are finite
-
- inline void clear(); // Clears LLVector4 to (0, 0, 0, 1)
- inline void clearVec(); // deprecated
- inline void zeroVec(); // deprecated
-
- inline void set(F32 x, F32 y, F32 z); // Sets LLVector4 to (x, y, z, 1)
- inline void set(F32 x, F32 y, F32 z, F32 w); // Sets LLVector4 to (x, y, z, w)
- inline void set(const LLVector4 &vec); // Sets LLVector4 to vec
- inline void set(const LLVector3 &vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec
- inline void set(const F32 *vec); // Sets LLVector4 to vec
- inline void set(const glm::vec4& vec); // Sets LLVector4 to vec
- inline void set(const glm::vec3& vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec with w defaulted to 1
-
- inline void setVec(F32 x, F32 y, F32 z); // deprecated
- inline void setVec(F32 x, F32 y, F32 z, F32 w); // deprecated
- inline void setVec(const LLVector4 &vec); // deprecated
- inline void setVec(const LLVector3 &vec, F32 w = 1.f); // deprecated
- inline void setVec(const F32 *vec); // deprecated
-
- F32 length() const; // Returns magnitude of LLVector4
- F32 lengthSquared() const; // Returns magnitude squared of LLVector4
- F32 normalize(); // Normalizes and returns the magnitude of LLVector4
-
- F32 magVec() const; // deprecated
- F32 magVecSquared() const; // deprecated
- F32 normVec(); // deprecated
-
- // Sets all values to absolute value of their original values
- // Returns true if data changed
- bool abs();
-
- bool isExactlyClear() const { return (mV[VW] == 1.0f) && !mV[VX] && !mV[VY] && !mV[VZ]; }
- bool isExactlyZero() const { return !mV[VW] && !mV[VX] && !mV[VY] && !mV[VZ]; }
-
- const LLVector4& rotVec(const LLMatrix4 &mat); // Rotates by MAT4 mat
- const LLVector4& rotVec(const LLQuaternion &q); // Rotates by QUAT q
-
- const LLVector4& scaleVec(const LLVector4& vec); // Scales component-wise by vec
-
- F32 operator[](int idx) const { return mV[idx]; }
- F32 &operator[](int idx) { return mV[idx]; }
-
- friend std::ostream& operator<<(std::ostream& s, const LLVector4 &a); // Print a
- friend LLVector4 operator+(const LLVector4 &a, const LLVector4 &b); // Return vector a + b
- friend LLVector4 operator-(const LLVector4 &a, const LLVector4 &b); // Return vector a minus b
- friend F32 operator*(const LLVector4 &a, const LLVector4 &b); // Return a dot b
- friend LLVector4 operator%(const LLVector4 &a, const LLVector4 &b); // Return a cross b
- friend LLVector4 operator/(const LLVector4 &a, F32 k); // Return a divided by scaler k
- friend LLVector4 operator*(const LLVector4 &a, F32 k); // Return a times scaler k
- friend LLVector4 operator*(F32 k, const LLVector4 &a); // Return a times scaler k
- friend bool operator==(const LLVector4 &a, const LLVector4 &b); // Return a == b
- friend bool operator!=(const LLVector4 &a, const LLVector4 &b); // Return a != b
-
- friend const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b); // Return vector a + b
- friend const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b); // Return vector a minus b
- friend const LLVector4& operator%=(LLVector4 &a, const LLVector4 &b); // Return a cross b
- friend const LLVector4& operator*=(LLVector4 &a, F32 k); // Return a times scaler k
- friend const LLVector4& operator/=(LLVector4 &a, F32 k); // Return a divided by scaler k
-
- friend LLVector4 operator-(const LLVector4 &a); // Return vector -a
+public:
+ F32 mV[LENGTHOFVECTOR4];
+ LLVector4(); // Initializes LLVector4 to (0, 0, 0, 1)
+ explicit LLVector4(const F32 *vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2], vec[3])
+ explicit LLVector4(const F64 *vec); // Initialized LLVector4 to ((F32) vec[0], (F32) vec[1], (F32) vec[3], (F32) vec[4]);
+ explicit LLVector4(const LLVector2 &vec);
+ explicit LLVector4(const LLVector2 &vec, F32 z, F32 w);
+ explicit LLVector4(const LLVector3 &vec); // Initializes LLVector4 to (vec, 1)
+ explicit LLVector4(const LLVector3 &vec, F32 w); // Initializes LLVector4 to (vec, w)
+ explicit LLVector4(const LLSD &sd);
+ LLVector4(F32 x, F32 y, F32 z); // Initializes LLVector4 to (x. y, z, 1)
+ LLVector4(F32 x, F32 y, F32 z, F32 w);
+
+ LLSD getValue() const
+ {
+ LLSD ret;
+ ret[VX] = mV[VX];
+ ret[VY] = mV[VY];
+ ret[VZ] = mV[VZ];
+ ret[VW] = mV[VW];
+ return ret;
+ }
+
+ void setValue(const LLSD& sd)
+ {
+ mV[VX] = (F32)sd[VX].asReal();
+ mV[VY] = (F32)sd[VY].asReal();
+ mV[VZ] = (F32)sd[VZ].asReal();
+ mV[VW] = (F32)sd[VW].asReal();
+ }
+
+ // GLM interop
+ explicit LLVector4(const glm::vec3& vec); // Initializes LLVector4 to (vec, 1)
+ explicit LLVector4(const glm::vec4& vec); // Initializes LLVector4 to vec
+ explicit operator glm::vec3() const; // Initializes glm::vec3 to (vec[0]. vec[1], vec[2])
+ explicit operator glm::vec4() const; // Initializes glm::vec4 to (vec[0]. vec[1], vec[2], vec[3])
+
+ inline bool isFinite() const; // checks to see if all values of LLVector3 are finite
+
+ inline void clear(); // Clears LLVector4 to (0, 0, 0, 1)
+ inline void clearVec(); // deprecated
+ inline void zeroVec(); // deprecated
+
+ inline void set(F32 x, F32 y, F32 z); // Sets LLVector4 to (x, y, z, 1)
+ inline void set(F32 x, F32 y, F32 z, F32 w); // Sets LLVector4 to (x, y, z, w)
+ inline void set(const LLVector4 &vec); // Sets LLVector4 to vec
+ inline void set(const LLVector3 &vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec
+ inline void set(const F32 *vec); // Sets LLVector4 to vec
+ inline void set(const glm::vec4& vec); // Sets LLVector4 to vec
+ inline void set(const glm::vec3& vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec with w defaulted to 1
+
+ inline void setVec(F32 x, F32 y, F32 z); // deprecated
+ inline void setVec(F32 x, F32 y, F32 z, F32 w); // deprecated
+ inline void setVec(const LLVector4 &vec); // deprecated
+ inline void setVec(const LLVector3 &vec, F32 w = 1.f); // deprecated
+ inline void setVec(const F32 *vec); // deprecated
+
+ F32 length() const; // Returns magnitude of LLVector4
+ F32 lengthSquared() const; // Returns magnitude squared of LLVector4
+ F32 normalize(); // Normalizes and returns the magnitude of LLVector4
+
+ F32 magVec() const; // deprecated
+ F32 magVecSquared() const; // deprecated
+ F32 normVec(); // deprecated
+
+ // Sets all values to absolute value of their original values
+ // Returns true if data changed
+ bool abs();
+
+ bool isExactlyClear() const { return (mV[VW] == 1.0f) && !mV[VX] && !mV[VY] && !mV[VZ]; }
+ bool isExactlyZero() const { return !mV[VW] && !mV[VX] && !mV[VY] && !mV[VZ]; }
+
+ const LLVector4& rotVec(const LLMatrix4 &mat); // Rotates by MAT4 mat
+ const LLVector4& rotVec(const LLQuaternion &q); // Rotates by QUAT q
+
+ const LLVector4& scaleVec(const LLVector4& vec); // Scales component-wise by vec
+
+ F32 operator[](int idx) const { return mV[idx]; }
+ F32 &operator[](int idx) { return mV[idx]; }
+
+ friend std::ostream& operator<<(std::ostream& s, const LLVector4 &a); // Print a
+ friend LLVector4 operator+(const LLVector4 &a, const LLVector4 &b); // Return vector a + b
+ friend LLVector4 operator-(const LLVector4 &a, const LLVector4 &b); // Return vector a minus b
+ friend F32 operator*(const LLVector4 &a, const LLVector4 &b); // Return a dot b
+ friend LLVector4 operator%(const LLVector4 &a, const LLVector4 &b); // Return a cross b
+ friend LLVector4 operator/(const LLVector4 &a, F32 k); // Return a divided by scaler k
+ friend LLVector4 operator*(const LLVector4 &a, F32 k); // Return a times scaler k
+ friend LLVector4 operator*(F32 k, const LLVector4 &a); // Return a times scaler k
+ friend bool operator==(const LLVector4 &a, const LLVector4 &b); // Return a == b
+ friend bool operator!=(const LLVector4 &a, const LLVector4 &b); // Return a != b
+
+ friend const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b); // Return vector a + b
+ friend const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b); // Return vector a minus b
+ friend const LLVector4& operator%=(LLVector4 &a, const LLVector4 &b); // Return a cross b
+ friend const LLVector4& operator*=(LLVector4 &a, F32 k); // Return a times scaler k
+ friend const LLVector4& operator/=(LLVector4 &a, F32 k); // Return a divided by scaler k
+
+ friend LLVector4 operator-(const LLVector4 &a); // Return vector -a
};
+static_assert(std::is_trivially_copyable<LLVector4>::value, "LLVector4 must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLVector4>::value, "LLVector4 must be trivial move");
+static_assert(std::is_standard_layout<LLVector4>::value, "LLVector4 must be a standard layout type");
+
// Non-member functions
F32 angle_between(const LLVector4 &a, const LLVector4 &b); // Returns angle (radians) between a and b
bool are_parallel(const LLVector4 &a, const LLVector4 &b, F32 epsilon = F_APPROXIMATELY_ZERO); // Returns true if a and b are very close to parallel
@@ -159,34 +163,22 @@ LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u); // Returns a vect
inline LLVector4::LLVector4(void)
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
- mV[VZ] = 0.f;
- mV[VW] = 1.f;
+ clear();
}
inline LLVector4::LLVector4(F32 x, F32 y, F32 z)
{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
- mV[VW] = 1.f;
+ set(x, y, z, 1.f);
}
inline LLVector4::LLVector4(F32 x, F32 y, F32 z, F32 w)
{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
- mV[VW] = w;
+ set(x, y, z, w);
}
inline LLVector4::LLVector4(const F32 *vec)
{
- mV[VX] = vec[VX];
- mV[VY] = vec[VY];
- mV[VZ] = vec[VZ];
- mV[VW] = vec[VW];
+ set(vec);
}
inline LLVector4::LLVector4(const F64 *vec)
@@ -215,18 +207,12 @@ inline LLVector4::LLVector4(const LLVector2 &vec, F32 z, F32 w)
inline LLVector4::LLVector4(const LLVector3 &vec)
{
- mV[VX] = vec.mV[VX];
- mV[VY] = vec.mV[VY];
- mV[VZ] = vec.mV[VZ];
- mV[VW] = 1.f;
+ set(vec, 1.f);
}
inline LLVector4::LLVector4(const LLVector3 &vec, F32 w)
{
- mV[VX] = vec.mV[VX];
- mV[VY] = vec.mV[VY];
- mV[VZ] = vec.mV[VZ];
- mV[VW] = w;
+ set(vec, w);
}
inline LLVector4::LLVector4(const LLSD &sd)
@@ -252,43 +238,31 @@ inline LLVector4::LLVector4(const glm::vec4& vec)
inline bool LLVector4::isFinite() const
{
- return (llfinite(mV[VX]) && llfinite(mV[VY]) && llfinite(mV[VZ]) && llfinite(mV[VW]));
+ return llfinite(mV[VX]) && llfinite(mV[VY]) && llfinite(mV[VZ]) && llfinite(mV[VW]);
}
// Clear and Assignment Functions
-inline void LLVector4::clear(void)
+inline void LLVector4::clear()
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
- mV[VZ] = 0.f;
- mV[VW] = 1.f;
+ set(0.f, 0.f, 0.f, 1.f);
}
// deprecated
-inline void LLVector4::clearVec(void)
+inline void LLVector4::clearVec()
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
- mV[VZ] = 0.f;
- mV[VW] = 1.f;
+ clear();
}
// deprecated
-inline void LLVector4::zeroVec(void)
+inline void LLVector4::zeroVec()
{
- mV[VX] = 0.f;
- mV[VY] = 0.f;
- mV[VZ] = 0.f;
- mV[VW] = 0.f;
+ set(0.f, 0.f, 0.f, 0.f);
}
inline void LLVector4::set(F32 x, F32 y, F32 z)
{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
- mV[VW] = 1.f;
+ set(x, y, z, 1.f);
}
inline void LLVector4::set(F32 x, F32 y, F32 z, F32 w)
@@ -299,15 +273,12 @@ inline void LLVector4::set(F32 x, F32 y, F32 z, F32 w)
mV[VW] = w;
}
-inline void LLVector4::set(const LLVector4 &vec)
+inline void LLVector4::set(const LLVector4& vec)
{
- mV[VX] = vec.mV[VX];
- mV[VY] = vec.mV[VY];
- mV[VZ] = vec.mV[VZ];
- mV[VW] = vec.mV[VW];
+ set(vec.mV);
}
-inline void LLVector4::set(const LLVector3 &vec, F32 w)
+inline void LLVector4::set(const LLVector3& vec, F32 w)
{
mV[VX] = vec.mV[VX];
mV[VY] = vec.mV[VY];
@@ -315,14 +286,13 @@ inline void LLVector4::set(const LLVector3 &vec, F32 w)
mV[VW] = w;
}
-inline void LLVector4::set(const F32 *vec)
+inline void LLVector4::set(const F32* vec)
{
mV[VX] = vec[VX];
mV[VY] = vec[VY];
mV[VZ] = vec[VZ];
mV[VW] = vec[VW];
}
-
inline void LLVector4::set(const glm::vec4& vec)
{
mV[VX] = vec.x;
@@ -342,119 +312,104 @@ inline void LLVector4::set(const glm::vec3& vec, F32 w)
// deprecated
inline void LLVector4::setVec(F32 x, F32 y, F32 z)
{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
- mV[VW] = 1.f;
+ set(x, y, z);
}
// deprecated
inline void LLVector4::setVec(F32 x, F32 y, F32 z, F32 w)
{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
- mV[VW] = w;
+ set(x, y, z, w);
}
// deprecated
-inline void LLVector4::setVec(const LLVector4 &vec)
+inline void LLVector4::setVec(const LLVector4& vec)
{
- mV[VX] = vec.mV[VX];
- mV[VY] = vec.mV[VY];
- mV[VZ] = vec.mV[VZ];
- mV[VW] = vec.mV[VW];
+ set(vec);
}
// deprecated
-inline void LLVector4::setVec(const LLVector3 &vec, F32 w)
+inline void LLVector4::setVec(const LLVector3& vec, F32 w)
{
- mV[VX] = vec.mV[VX];
- mV[VY] = vec.mV[VY];
- mV[VZ] = vec.mV[VZ];
- mV[VW] = w;
+ set(vec, w);
}
// deprecated
-inline void LLVector4::setVec(const F32 *vec)
+inline void LLVector4::setVec(const F32* vec)
{
- mV[VX] = vec[VX];
- mV[VY] = vec[VY];
- mV[VZ] = vec[VZ];
- mV[VW] = vec[VW];
+ set(vec);
}
// LLVector4 Magnitude and Normalization Functions
-inline F32 LLVector4::length(void) const
+inline F32 LLVector4::length() const
{
- return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return sqrt(lengthSquared());
}
-inline F32 LLVector4::lengthSquared(void) const
+inline F32 LLVector4::lengthSquared() const
{
return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
}
-inline F32 LLVector4::magVec(void) const
+inline F32 LLVector4::magVec() const
{
- return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return length();
}
-inline F32 LLVector4::magVecSquared(void) const
+inline F32 LLVector4::magVecSquared() const
{
- return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
+ return lengthSquared();
}
// LLVector4 Operators
-inline LLVector4 operator+(const LLVector4 &a, const LLVector4 &b)
+inline LLVector4 operator+(const LLVector4& a, const LLVector4& b)
{
LLVector4 c(a);
return c += b;
}
-inline LLVector4 operator-(const LLVector4 &a, const LLVector4 &b)
+inline LLVector4 operator-(const LLVector4& a, const LLVector4& b)
{
LLVector4 c(a);
return c -= b;
}
-inline F32 operator*(const LLVector4 &a, const LLVector4 &b)
+inline F32 operator*(const LLVector4& a, const LLVector4& b)
{
- return (a.mV[VX]*b.mV[VX] + a.mV[VY]*b.mV[VY] + a.mV[VZ]*b.mV[VZ]);
+ return a.mV[VX]*b.mV[VX] + a.mV[VY]*b.mV[VY] + a.mV[VZ]*b.mV[VZ];
}
-inline LLVector4 operator%(const LLVector4 &a, const LLVector4 &b)
+inline LLVector4 operator%(const LLVector4& a, const LLVector4& b)
{
return LLVector4(a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);
}
-inline LLVector4 operator/(const LLVector4 &a, F32 k)
+inline LLVector4 operator/(const LLVector4& a, F32 k)
{
F32 t = 1.f / k;
return LLVector4( a.mV[VX] * t, a.mV[VY] * t, a.mV[VZ] * t );
}
-inline LLVector4 operator*(const LLVector4 &a, F32 k)
+inline LLVector4 operator*(const LLVector4& a, F32 k)
{
return LLVector4( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );
}
-inline LLVector4 operator*(F32 k, const LLVector4 &a)
+inline LLVector4 operator*(F32 k, const LLVector4& a)
{
return LLVector4( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );
}
-inline bool operator==(const LLVector4 &a, const LLVector4 &b)
+inline bool operator==(const LLVector4& a, const LLVector4& b)
{
return ( (a.mV[VX] == b.mV[VX])
&&(a.mV[VY] == b.mV[VY])
&&(a.mV[VZ] == b.mV[VZ]));
}
-inline bool operator!=(const LLVector4 &a, const LLVector4 &b)
+inline bool operator!=(const LLVector4& a, const LLVector4& b)
{
return ( (a.mV[VX] != b.mV[VX])
||(a.mV[VY] != b.mV[VY])
@@ -462,7 +417,7 @@ inline bool operator!=(const LLVector4 &a, const LLVector4 &b)
||(a.mV[VW] != b.mV[VW]) );
}
-inline const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b)
+inline const LLVector4& operator+=(LLVector4& a, const LLVector4& b)
{
a.mV[VX] += b.mV[VX];
a.mV[VY] += b.mV[VY];
@@ -470,7 +425,7 @@ inline const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b)
return a;
}
-inline const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b)
+inline const LLVector4& operator-=(LLVector4& a, const LLVector4& b)
{
a.mV[VX] -= b.mV[VX];
a.mV[VY] -= b.mV[VY];
@@ -478,14 +433,14 @@ inline const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b)
return a;
}
-inline const LLVector4& operator%=(LLVector4 &a, const LLVector4 &b)
+inline const LLVector4& operator%=(LLVector4& a, const LLVector4& b)
{
LLVector4 ret(a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);
a = ret;
return a;
}
-inline const LLVector4& operator*=(LLVector4 &a, F32 k)
+inline const LLVector4& operator*=(LLVector4& a, F32 k)
{
a.mV[VX] *= k;
a.mV[VY] *= k;
@@ -493,16 +448,12 @@ inline const LLVector4& operator*=(LLVector4 &a, F32 k)
return a;
}
-inline const LLVector4& operator/=(LLVector4 &a, F32 k)
+inline const LLVector4& operator/=(LLVector4& a, F32 k)
{
- F32 t = 1.f / k;
- a.mV[VX] *= t;
- a.mV[VY] *= t;
- a.mV[VZ] *= t;
- return a;
+ return a *= 1.f / k;
}
-inline LLVector4 operator-(const LLVector4 &a)
+inline LLVector4 operator-(const LLVector4& a)
{
return LLVector4( -a.mV[VX], -a.mV[VY], -a.mV[VZ] );
}
@@ -517,19 +468,19 @@ inline LLVector4::operator glm::vec4() const
return glm::make_vec4(mV);
}
-inline F32 dist_vec(const LLVector4 &a, const LLVector4 &b)
+inline F32 dist_vec(const LLVector4& a, const LLVector4& b)
{
LLVector4 vec = a - b;
- return (vec.length());
+ return vec.length();
}
-inline F32 dist_vec_squared(const LLVector4 &a, const LLVector4 &b)
+inline F32 dist_vec_squared(const LLVector4& a, const LLVector4& b)
{
LLVector4 vec = a - b;
- return (vec.lengthSquared());
+ return vec.lengthSquared();
}
-inline LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u)
+inline LLVector4 lerp(const LLVector4& a, const LLVector4& b, F32 u)
{
return LLVector4(
a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
@@ -538,59 +489,39 @@ inline LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u)
a.mV[VW] + (b.mV[VW] - a.mV[VW]) * u);
}
-inline F32 LLVector4::normalize(void)
+inline F32 LLVector4::normalize()
{
- F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
- F32 oomag;
+ F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
if (mag > FP_MAG_THRESHOLD)
{
- oomag = 1.f/mag;
- mV[VX] *= oomag;
- mV[VY] *= oomag;
- mV[VZ] *= oomag;
+ *this /= mag;
}
else
{
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
- mag = 0;
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
+ mag = 0.f;
}
- return (mag);
+ return mag;
}
// deprecated
-inline F32 LLVector4::normVec(void)
+inline F32 LLVector4::normVec()
{
- F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
- F32 oomag;
-
- if (mag > FP_MAG_THRESHOLD)
- {
- oomag = 1.f/mag;
- mV[VX] *= oomag;
- mV[VY] *= oomag;
- mV[VZ] *= oomag;
- }
- else
- {
- mV[0] = 0.f;
- mV[1] = 0.f;
- mV[2] = 0.f;
- mag = 0;
- }
- return (mag);
+ return normalize();
}
// Because apparently some parts of the viewer use this for color info.
-inline const LLVector4 srgbVector4(const LLVector4 &a) {
+inline const LLVector4 srgbVector4(const LLVector4& a)
+{
LLVector4 srgbColor;
- srgbColor.mV[0] = linearTosRGB(a.mV[0]);
- srgbColor.mV[1] = linearTosRGB(a.mV[1]);
- srgbColor.mV[2] = linearTosRGB(a.mV[2]);
- srgbColor.mV[3] = a.mV[3];
+ srgbColor.mV[VX] = linearTosRGB(a.mV[VX]);
+ srgbColor.mV[VY] = linearTosRGB(a.mV[VY]);
+ srgbColor.mV[VZ] = linearTosRGB(a.mV[VZ]);
+ srgbColor.mV[VW] = a.mV[VW];
return srgbColor;
}
diff --git a/indra/llmath/xform.h b/indra/llmath/xform.h
index 7434301670..fa45fffeae 100644
--- a/indra/llmath/xform.h
+++ b/indra/llmath/xform.h
@@ -115,7 +115,7 @@ public:
void clearChanged(U32 bits) { mChanged &= ~bits; }
void setScaleChildOffset(bool scale) { mScaleChildOffset = scale; }
- bool getScaleChildOffset() { return mScaleChildOffset; }
+ bool getScaleChildOffset() const { return mScaleChildOffset; }
LLXform* getParent() const { return mParent; }
LLXform* getRoot() const;
diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index 6a663a8e97..5c7b1c4235 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -50,7 +50,7 @@ static const U32 DEFAULT_POOL_SIZE = 5;
// SL-14399: When we teleport to a brand-new simulator, the coprocedure queue
// gets absolutely slammed with fetch requests. Make this queue effectively
// unlimited.
-const U32 LLCoprocedureManager::DEFAULT_QUEUE_SIZE = 1024*1024;
+const U32 LLCoprocedureManager::DEFAULT_QUEUE_SIZE = 1024*512;
//=========================================================================
class LLCoprocedurePool: private boost::noncopyable
@@ -58,7 +58,7 @@ class LLCoprocedurePool: private boost::noncopyable
public:
typedef LLCoprocedureManager::CoProcedure_t CoProcedure_t;
- LLCoprocedurePool(const std::string &name, size_t size);
+ LLCoprocedurePool(const std::string &name, size_t size, size_t queue_size);
~LLCoprocedurePool();
/// Places the coprocedure on the queue for processing.
@@ -118,7 +118,7 @@ private:
typedef std::shared_ptr<CoprocQueue_t> CoprocQueuePtr;
std::string mPoolName;
- size_t mPoolSize, mActiveCoprocsCount, mPending;
+ size_t mPoolSize, mQueueSize, mActiveCoprocsCount, mPending;
CoprocQueuePtr mPendingCoprocs;
LLTempBoundListener mStatusListener;
@@ -138,10 +138,25 @@ LLCoprocedureManager::LLCoprocedureManager()
LLCoprocedureManager::~LLCoprocedureManager()
{
- close();
+ try
+ {
+ close();
+ }
+ catch (const boost::fibers::fiber_error&)
+ {
+ LL_WARNS() << "Fiber error during ~LLCoprocedureManager()" << LL_ENDL;
+ }
+ catch (const std::exception& e)
+ {
+ // Shutting down, just log it
+ LL_WARNS() << "Exception during ~LLCoprocedureManager(): " << e.what() << LL_ENDL;
+ }
+ mPropertyQueryFn.clear();
+ mPropertyDefineFn.clear();
+ mPoolMap.clear();
}
-void LLCoprocedureManager::initializePool(const std::string &poolName)
+void LLCoprocedureManager::initializePool(const std::string &poolName, size_t queue_size)
{
poolMap_t::iterator it = mPoolMap.find(poolName);
@@ -180,7 +195,7 @@ void LLCoprocedureManager::initializePool(const std::string &poolName)
LL_WARNS("CoProcMgr") << "LLCoprocedureManager: No setting for \"" << keyName << "\" setting pool size to default of " << size << LL_ENDL;
}
- poolPtr_t pool(new LLCoprocedurePool(poolName, size));
+ poolPtr_t pool(new LLCoprocedurePool(poolName, size, queue_size));
LL_ERRS_IF(!pool, "CoprocedureManager") << "Unable to create pool named \"" << poolName << "\" FATAL!" << LL_ENDL;
bool inserted = mPoolMap.emplace(poolName, pool).second;
@@ -212,7 +227,8 @@ void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpd
mPropertyQueryFn = queryfn;
mPropertyDefineFn = updatefn;
- initializePool("Upload");
+ constexpr size_t UPLOAD_QUEUE_SIZE = 2048;
+ initializePool("Upload", UPLOAD_QUEUE_SIZE);
initializePool("AIS"); // it might be better to have some kind of on-demand initialization for AIS
// "ExpCache" pool gets initialized in LLExperienceCache
// asset storage pool gets initialized in LLViewerAssetStorage
@@ -296,17 +312,19 @@ void LLCoprocedureManager::close(const std::string &pool)
}
//=========================================================================
-LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
+LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size, size_t queue_size):
mPoolName(poolName),
mPoolSize(size),
+ mQueueSize(queue_size),
mActiveCoprocsCount(0),
mPending(0),
mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
mCoroMapping()
{
+ llassert_always(mQueueSize > mPoolSize); // queue should be able to fit pool
try
{
- mPendingCoprocs = std::make_shared<CoprocQueue_t>(LLCoprocedureManager::DEFAULT_QUEUE_SIZE);
+ mPendingCoprocs = std::make_shared<CoprocQueue_t>(mQueueSize);
// store in our LLTempBoundListener so that when the LLCoprocedurePool is
// destroyed, we implicitly disconnect from this LLEventPump
// Monitores application status
@@ -357,11 +375,27 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
mCoroMapping.insert(CoroAdapterMap_t::value_type(pooledCoro, httpAdapter));
}
- LL_INFOS("CoProcMgr") << "Created coprocedure pool named \"" << mPoolName << "\" with " << size << " items, queue max " << LLCoprocedureManager::DEFAULT_QUEUE_SIZE << LL_ENDL;
+ LL_INFOS("CoProcMgr") << "Created coprocedure pool named \"" << mPoolName << "\" with " << size << " items, queue max " << mQueueSize << LL_ENDL;
}
LLCoprocedurePool::~LLCoprocedurePool()
{
+ try
+ {
+ close(); // should have been closed already, but shouldn't hurt
+ mStatusListener.disconnect();
+ mPendingCoprocs.reset();
+ mCoroMapping.clear();
+ }
+ catch (const boost::fibers::fiber_error&)
+ {
+ LL_WARNS() << "Fiber error during ~LLCoprocedurePool() " << mPoolName << LL_ENDL;
+ }
+ catch (const std::exception& e)
+ {
+ // Shutting down, just log it
+ LL_WARNS() << "Exception " << e.what() << " during ~LLCoprocedurePool() in " << mPoolName << LL_ENDL;
+ }
}
//-------------------------------------------------------------------------
@@ -376,7 +410,7 @@ LLUUID LLCoprocedurePool::enqueueCoprocedure(const std::string &name, LLCoproced
<< "\" at "
<< mPending << LL_ENDL;
- if (mPending >= (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
+ if (mPending >= (mQueueSize - 1))
{
// If it's all used up (not supposed to happen,
// fetched should cap it), we are going to crash
diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h
index 6c6e506654..485333657c 100644
--- a/indra/llmessage/llcoproceduremanager.h
+++ b/indra/llmessage/llcoproceduremanager.h
@@ -79,7 +79,7 @@ public:
void close();
void close(const std::string &pool);
- void initializePool(const std::string &poolName);
+ void initializePool(const std::string &poolName, size_t queue_size = DEFAULT_QUEUE_SIZE);
private:
diff --git a/indra/llmessage/llexperiencecache.cpp b/indra/llmessage/llexperiencecache.cpp
index 83a070df32..78cca47456 100644
--- a/indra/llmessage/llexperiencecache.cpp
+++ b/indra/llmessage/llexperiencecache.cpp
@@ -110,7 +110,8 @@ void LLExperienceCache::initSingleton()
cache_stream >> (*this);
}
- LLCoprocedureManager::instance().initializePool("ExpCache");
+ constexpr size_t CORO_QUEUE_SIZE = 2048;
+ LLCoprocedureManager::instance().initializePool("ExpCache", CORO_QUEUE_SIZE);
LLCoros::instance().launch("LLExperienceCache::idleCoro",
boost::bind(&LLExperienceCache::idleCoro, this));
diff --git a/indra/llmessage/llpacketring.cpp b/indra/llmessage/llpacketring.cpp
index eb6650c6c5..b8284334ea 100644
--- a/indra/llmessage/llpacketring.cpp
+++ b/indra/llmessage/llpacketring.cpp
@@ -209,8 +209,14 @@ S32 LLPacketRing::receiveOrDropBufferedPacket(char *datap, bool drop)
if (!drop)
{
- assert(packet_size > 0);
- memcpy(datap, packet->getData(), packet_size);
+ if (packet_size > 0)
+ {
+ memcpy(datap, packet->getData(), packet_size);
+ }
+ else
+ {
+ assert(false);
+ }
}
else
{
diff --git a/indra/llmessage/llproxy.cpp b/indra/llmessage/llproxy.cpp
index d713cb20d9..5d105eba34 100644
--- a/indra/llmessage/llproxy.cpp
+++ b/indra/llmessage/llproxy.cpp
@@ -504,6 +504,7 @@ static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataou
rv = apr_socket_recv(apr_socket, datain, &maxinlen);
if (rv != APR_SUCCESS)
{
+ // if rv == 70060 it's WSAETIMEDOUT
char buf[MAX_STRING];
LL_WARNS("Proxy") << "Error receiving data from proxy control channel, status: " << rv << " " << apr_strerror(rv, buf, MAX_STRING) << LL_ENDL;
ll_apr_warn_status(rv);
diff --git a/indra/llmessage/llxfermanager.cpp b/indra/llmessage/llxfermanager.cpp
index f6ed43a4e4..a2d09f4f36 100644
--- a/indra/llmessage/llxfermanager.cpp
+++ b/indra/llmessage/llxfermanager.cpp
@@ -1051,7 +1051,7 @@ void LLXferManager::retransmitUnackedPackets()
// Re-build mOutgoingHosts data
updateHostStatus();
- F32 et;
+ F32 et = 0.f;
iter = mSendList.begin();
while (iter != mSendList.end())
{
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index c264a9f086..21dbf35783 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -1402,3 +1402,4 @@ char const* const _PREHASH_HoverHeight = LLMessageStringTable::getInstance()->ge
char const* const _PREHASH_Experience = LLMessageStringTable::getInstance()->getString("Experience");
char const* const _PREHASH_ExperienceID = LLMessageStringTable::getInstance()->getString("ExperienceID");
char const* const _PREHASH_LargeGenericMessage = LLMessageStringTable::getInstance()->getString("LargeGenericMessage");
+char const* const _PREHASH_MetaData = LLMessageStringTable::getInstance()->getString("MetaData");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index 1d30b69b67..8a2ad1587c 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -1403,5 +1403,6 @@ extern char const* const _PREHASH_HoverHeight;
extern char const* const _PREHASH_Experience;
extern char const* const _PREHASH_ExperienceID;
extern char const* const _PREHASH_LargeGenericMessage;
+extern char const* const _PREHASH_MetaData;
#endif
diff --git a/indra/llmessage/patch_code.cpp b/indra/llmessage/patch_code.cpp
index 489b6ce6a6..9f9f4c852a 100644
--- a/indra/llmessage/patch_code.cpp
+++ b/indra/llmessage/patch_code.cpp
@@ -27,7 +27,6 @@
#include "linden_common.h"
#include "llmath.h"
-//#include "vmath.h"
#include "v3math.h"
#include "patch_dct.h"
#include "patch_code.h"
diff --git a/indra/llmessage/patch_dct.cpp b/indra/llmessage/patch_dct.cpp
index 728fe84537..e74e5fd459 100644
--- a/indra/llmessage/patch_dct.cpp
+++ b/indra/llmessage/patch_dct.cpp
@@ -27,7 +27,6 @@
#include "linden_common.h"
#include "llmath.h"
-//#include "vmath.h"
#include "v3math.h"
#include "patch_dct.h"
diff --git a/indra/llmessage/patch_idct.cpp b/indra/llmessage/patch_idct.cpp
index 5483cf98c0..4bcc439917 100644
--- a/indra/llmessage/patch_idct.cpp
+++ b/indra/llmessage/patch_idct.cpp
@@ -27,7 +27,6 @@
#include "linden_common.h"
#include "llmath.h"
-//#include "vmath.h"
#include "v3math.h"
#include "patch_dct.h"
diff --git a/indra/llphysicsextensionsos/CMakeLists.txt b/indra/llphysicsextensionsos/CMakeLists.txt
new file mode 100644
index 0000000000..c04115ef26
--- /dev/null
+++ b/indra/llphysicsextensionsos/CMakeLists.txt
@@ -0,0 +1,47 @@
+# -*- cmake -*-
+
+project(llphysicsextensionsos)
+
+include(00-Common)
+include(LLCommon)
+include(LLMath)
+include(VHACD)
+
+set(llphysicsextensionsos_SOURCE_FILES
+ llconvexdecomposition.cpp
+ llconvexdecompositionvhacd.cpp
+ llpathinglib.cpp
+ LLPathingLibStubImpl.cpp
+ llphysicsextensions.cpp
+ LLPhysicsExtensionsStubImpl.cpp
+ )
+
+set(llphysicsextensionsos_HEADER_FILES
+ CMakeLists.txt
+ llconvexdecomposition.h
+ llconvexdecompositionvhacd.h
+ llpathinglib.h
+ LLPathingLibStubImpl.h
+ llphysicsextensions.h
+ LLPhysicsExtensionsStubImpl.h
+ )
+
+set_source_files_properties(${llphysicsextensionsos_HEADER_FILES}
+ PROPERTIES HEADER_FILE_ONLY TRUE)
+
+list(APPEND llphysicsextensionsos_SOURCE_FILES ${llphysicsextensionsos_HEADER_FILES})
+
+add_library (llphysicsextensionsos ${llphysicsextensionsos_SOURCE_FILES})
+target_include_directories(llphysicsextensionsos INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
+
+target_link_libraries(llphysicsextensionsos
+ llcommon
+ llmath
+ ll::vhacd)
+
+if(WINDOWS)
+ target_compile_options(llphysicsextensionsos PRIVATE /bigobj)
+endif()
+
+# Add tests
+
diff --git a/indra/llphysicsextensionsos/LLPathingLibStubImpl.cpp b/indra/llphysicsextensionsos/LLPathingLibStubImpl.cpp
new file mode 100644
index 0000000000..9830fd1ad0
--- /dev/null
+++ b/indra/llphysicsextensionsos/LLPathingLibStubImpl.cpp
@@ -0,0 +1,109 @@
+/**
+* @file LLPathingLibStubImpl.cpp
+* @author prep@lindenlab.com
+* @brief A stubbed implementation of LLPathingLib
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 20112010, 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 "linden_common.h"
+
+#include "llpathinglib.h"
+#include "LLPathingLibStubImpl.h"
+
+#include "llsd.h"
+
+//=============================================================================
+LLPathingLibImpl::LLPathingLibImpl()
+{
+}
+
+LLPathingLibImpl::~LLPathingLibImpl()
+{
+
+}
+
+LLPathingLib* LLPathingLibImpl::getInstance()
+{
+ return NULL;
+}
+
+
+LLPathingLib::LLPLResult LLPathingLibImpl::initSystem()
+{
+ return LLPL_NOT_IMPLEMENTED;
+}
+
+LLPathingLib::LLPLResult LLPathingLibImpl::quitSystem()
+{
+ return LLPL_NOT_IMPLEMENTED;
+}
+
+LLPathingLib::LLPLResult LLPathingLibImpl::extractNavMeshSrcFromLLSD( const LLSD::Binary& dataBlock, int dir )
+{
+ return LLPL_NOT_IMPLEMENTED;
+}
+
+void LLPathingLibImpl::processNavMeshData()
+{
+}
+
+LLPathingLibImpl::LLPLResult LLPathingLibImpl::generatePath( const PathingPacket& pathingPacket )
+{
+ return LLPL_NOT_IMPLEMENTED;
+}
+
+void LLPathingLibImpl::setNavMeshMaterialType( LLPLCharacterType materialType )
+{
+}
+
+void LLPathingLibImpl::setNavMeshColors( const NavMeshColors& color )
+{
+}
+
+void LLPathingLibImpl::renderNavMesh()
+{
+}
+
+void LLPathingLibImpl::renderNavMeshEdges()
+{
+}
+
+void LLPathingLibImpl::renderNavMeshShapesVBO( U32 shapeRenderFlags )
+{
+}
+
+void LLPathingLibImpl::renderPath()
+{
+}
+
+void LLPathingLibImpl::renderPathBookend( LLRender& gl, LLPathingLib::LLPLPathBookEnd type )
+{
+}
+
+void LLPathingLibImpl::cleanupVBOManager()
+{
+}
+
+void LLPathingLibImpl::cleanupResidual()
+{
+}
diff --git a/indra/llphysicsextensionsos/LLPathingLibStubImpl.h b/indra/llphysicsextensionsos/LLPathingLibStubImpl.h
new file mode 100644
index 0000000000..8a97566e8c
--- /dev/null
+++ b/indra/llphysicsextensionsos/LLPathingLibStubImpl.h
@@ -0,0 +1,78 @@
+/**
+* @file LLPathingLibSubImpl.h
+* @author prep@lindenlab.com
+* @brief A stubbed implementation of LLPathingLib
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_PATHING_LIB_H
+#define LL_PATHING_LIB_H
+
+#include "llpathinglib.h"
+
+class LLSD;
+
+//=============================================================================
+class LLPathingLibImpl : public LLPathingLib
+{
+public:
+ LLPathingLibImpl();
+ virtual ~LLPathingLibImpl();
+
+ // Obtain a pointer to the actual implementation
+ static LLPathingLib* getInstance();
+ static LLPathingLib::LLPLResult initSystem();
+ static LLPathingLib::LLPLResult quitSystem();
+
+ //Extract and store navmesh data from the llsd datablock sent down by the server
+ virtual LLPLResult extractNavMeshSrcFromLLSD( const LLSD::Binary& dataBlock, int dir );
+ //Stitch any stored navmeshes together
+ virtual void processNavMeshData();
+
+ //Method used to generate and visualize a path on the viewers navmesh
+ virtual LLPLResult generatePath( const PathingPacket& pathingPacket );
+
+ //Set the material type for the heatmap type
+ virtual void setNavMeshMaterialType( LLPLCharacterType materialType );
+ //Set the various navmesh colors
+ virtual void setNavMeshColors( const NavMeshColors& color );
+
+ //The entry method to rendering the client side navmesh
+ virtual void renderNavMesh();
+ //The entry method to rendering the client side navmesh edges
+ virtual void renderNavMeshEdges();
+ //The entry method to render the client navmesh shapes VBO
+ virtual void renderNavMeshShapesVBO( U32 shapeRenderFlags );
+ //The entry method to render the clients designated path
+ virtual void renderPath();
+ //The entry method to render the capsule bookends for the clients designated path
+ virtual void renderPathBookend( LLRender& gl, LLPathingLib::LLPLPathBookEnd type );
+
+ //Method to delete any vbo's that are currently being managed by the pathing library
+ virtual void cleanupVBOManager();
+ //Method to cleanup any allocations within the implementation
+ virtual void cleanupResidual();
+};
+
+#endif //LL_PATHING_LIB_H
+
diff --git a/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.cpp b/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.cpp
new file mode 100644
index 0000000000..8401e16e9c
--- /dev/null
+++ b/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.cpp
@@ -0,0 +1,51 @@
+/**
+* @file LLPhysicsExtensionsStubImpl.cpp
+* @author prep@lindenlab.com
+* @brief A stubbed implementation of LLPhysicsExtensions
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, 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 "linden_common.h"
+
+#include "llphysicsextensions.h"
+#include "LLPhysicsExtensionsStubImpl.h"
+
+//=============================================================================
+LLPhysicsExtensionsImpl::LLPhysicsExtensionsImpl()
+{
+}
+
+LLPhysicsExtensionsImpl::~LLPhysicsExtensionsImpl()
+{
+}
+
+bool LLPhysicsExtensionsImpl::initSystem()
+{
+ return false;
+}
+
+bool LLPhysicsExtensionsImpl::quitSystem()
+{
+ return false;
+}
+
diff --git a/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.h b/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.h
new file mode 100644
index 0000000000..135f92bb88
--- /dev/null
+++ b/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.h
@@ -0,0 +1,46 @@
+/**
+* @file LLPhysicsExtensionsSubImpl.h
+* @author prep@lindenlab.com
+* @brief A stubbed implementation of LLPhysicsExtensions
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_PHYSICS_EXTENSIONS_STUB_IMPL_H
+#define LL_PHYSICS_EXTENSIONS_STUB_IMPL_H
+
+#include "llphysicsextensions.h"
+
+//=============================================================================
+class LLPhysicsExtensionsImpl : public LLPhysicsExtensions
+{
+ public:
+
+ LLPhysicsExtensionsImpl();
+ virtual ~LLPhysicsExtensionsImpl();
+
+ static bool initSystem();
+ static bool quitSystem();
+};
+
+#endif //LL_PHYSICS_EXTENSIONS_STUB_IMPL_H
+
diff --git a/indra/llphysicsextensionsos/llconvexdecomposition.cpp b/indra/llphysicsextensionsos/llconvexdecomposition.cpp
new file mode 100644
index 0000000000..d58c0fec54
--- /dev/null
+++ b/indra/llphysicsextensionsos/llconvexdecomposition.cpp
@@ -0,0 +1,84 @@
+/**
+* @file llconvexdecomposition.cpp
+* @author falcon@lindenlab.com
+* @brief Inner implementation of LLConvexDecomposition interface
+*
+* $LicenseInfo:firstyear=2011&license=lgpl$
+* 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 <unordered_map>
+#include "linden_common.h"
+
+#include "llconvexdecompositionvhacd.h"
+#include "llconvexdecomposition.h"
+
+bool LLConvexDecomposition::s_isInitialized = false;
+
+// static
+bool LLConvexDecomposition::isFunctional()
+{
+ return LLConvexDecompositionVHACD::isFunctional();
+}
+
+// static
+LLConvexDecomposition* LLConvexDecomposition::getInstance()
+{
+ if ( !s_isInitialized )
+ {
+ return nullptr;
+ }
+ else
+ {
+ return LLConvexDecompositionVHACD::getInstance();
+ }
+}
+
+// static
+LLCDResult LLConvexDecomposition::initSystem()
+{
+ LLCDResult result = LLConvexDecompositionVHACD::initSystem();
+ if ( result == LLCD_OK )
+ {
+ s_isInitialized = true;
+ }
+ return result;
+}
+
+// static
+LLCDResult LLConvexDecomposition::initThread()
+{
+ return LLConvexDecompositionVHACD::initThread();
+}
+
+// static
+LLCDResult LLConvexDecomposition::quitThread()
+{
+ return LLConvexDecompositionVHACD::quitThread();
+}
+
+// static
+LLCDResult LLConvexDecomposition::quitSystem()
+{
+ return LLConvexDecompositionVHACD::quitSystem();
+}
+
+
diff --git a/indra/llphysicsextensionsos/llconvexdecomposition.h b/indra/llphysicsextensionsos/llconvexdecomposition.h
new file mode 100644
index 0000000000..8008bc6e12
--- /dev/null
+++ b/indra/llphysicsextensionsos/llconvexdecomposition.h
@@ -0,0 +1,231 @@
+/**
+ * @file llconvexdecomposition.cpp
+ * @brief LLConvexDecomposition interface definition
+ *
+ * $LicenseInfo:firstyear=2011&license=lgpl$
+ * 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$
+ */
+
+#ifndef LL_CONVEX_DECOMPOSITION
+#define LL_CONVEX_DECOMPOSITION
+
+typedef int bool32;
+
+#if defined(_WIN32) || defined(_WIN64)
+#define LLCD_CALL __cdecl
+#else
+#define LLCD_CALL
+#endif
+
+struct LLCDParam
+{
+ enum LLCDParamType
+ {
+ LLCD_INVALID = 0,
+ LLCD_INTEGER,
+ LLCD_FLOAT,
+ LLCD_BOOLEAN,
+ LLCD_ENUM
+ };
+
+ struct LLCDEnumItem
+ {
+ const char* mName;
+ int mValue;
+ };
+
+ union LLCDValue
+ {
+ float mFloat;
+ int mIntOrEnumValue;
+ bool32 mBool;
+ };
+
+ union LLCDParamDetails
+ {
+ struct {
+ LLCDValue mLow;
+ LLCDValue mHigh;
+ LLCDValue mDelta;
+ } mRange;
+
+ struct {
+ int mNumEnums;
+ LLCDEnumItem* mEnumsArray;
+ } mEnumValues;
+ };
+
+ const char* mName;
+ const char* mDescription;
+ LLCDParamType mType;
+ LLCDParamDetails mDetails;
+ LLCDValue mDefault;
+ int mStage;
+
+ // WARNING: Only the LLConvexDecomposition implementation
+ // should change this value
+ int mReserved;
+};
+
+struct LLCDStageData
+{
+ const char* mName;
+ const char* mDescription;
+ bool32 mSupportsCallback;
+};
+
+struct LLCDMeshData
+{
+ enum IndexType
+ {
+ INT_16,
+ INT_32
+ };
+
+ const float* mVertexBase;
+ int mVertexStrideBytes;
+ int mNumVertices;
+ const void* mIndexBase;
+ IndexType mIndexType;
+ int mIndexStrideBytes;
+ int mNumTriangles;
+};
+
+struct LLCDHull
+{
+ const float* mVertexBase;
+ int mVertexStrideBytes;
+ int mNumVertices;
+};
+
+enum LLCDResult
+{
+ LLCD_OK = 0,
+ LLCD_UNKOWN_ERROR,
+ LLCD_NULL_PTR,
+ LLCD_INVALID_STAGE,
+ LLCD_UNKNOWN_PARAM,
+ LLCD_BAD_VALUE,
+ LLCD_REQUEST_OUT_OF_RANGE,
+ LLCD_INVALID_MESH_DATA,
+ LLCD_INVALID_HULL_DATA,
+ LLCD_STAGE_NOT_READY,
+ LLCD_INVALID_THREAD,
+ LLCD_NOT_IMPLEMENTED
+};
+
+// This callback will receive a string describing the current subtask being performed
+// as well as a pair of numbers indicating progress. (The values should not be interpreted
+// as a completion percentage as 'current' may be greater than 'final'.)
+// If the callback returns zero, the decomposition will be terminated
+typedef int (LLCD_CALL *llcdCallbackFunc)(const char* description, int current_progress, int final_progress);
+
+class LLConvexDecomposition
+{
+public:
+ // Obtain a pointer to the actual implementation
+ static LLConvexDecomposition* getInstance();
+
+ /// @returns false if this is the stub
+ static bool isFunctional();
+
+ static LLCDResult initSystem();
+ static LLCDResult initThread();
+ static LLCDResult quitThread();
+ static LLCDResult quitSystem();
+
+ // Generate a decomposition object handle
+ virtual void genDecomposition(int& decomp) = 0;
+ // Delete decomposition object handle
+ virtual void deleteDecomposition(int decomp) = 0;
+ // Bind given decomposition handle
+ // Commands operate on currently bound decomposition
+ virtual void bindDecomposition(int decomp) = 0;
+
+ // Sets *paramsOut to the address of the LLCDParam array and returns
+ // the number of parameters
+ virtual int getParameters(const LLCDParam** paramsOut) = 0;
+
+
+ // Sets *stagesOut to the address of the LLCDStageData array and returns
+ // the number of stages
+ virtual int getStages(const LLCDStageData** stagesOut) = 0;
+
+
+ // Set a parameter by name. Pass enum values as integers.
+ virtual LLCDResult setParam(const char* name, float val) = 0;
+ virtual LLCDResult setParam(const char* name, int val) = 0;
+ virtual LLCDResult setParam(const char* name, bool val) = 0;
+
+
+ // Set incoming mesh data. Data is copied to local buffers and will
+ // persist until the next setMeshData call
+ virtual LLCDResult setMeshData( const LLCDMeshData* data, bool vertex_based ) = 0;
+
+
+ // Register a callback to be called periodically during the specified stage
+ // See the typedef above for more information
+ virtual LLCDResult registerCallback( int stage, llcdCallbackFunc callback ) = 0;
+
+
+ // Execute the specified decomposition stage
+ virtual LLCDResult executeStage(int stage) = 0;
+ virtual LLCDResult buildSingleHull() = 0 ;
+
+
+ // Gets the number of hulls generated by the specified decompositions stage
+ virtual int getNumHullsFromStage(int stage) = 0;
+
+
+ // Populates hullOut to reference the internal copy of the requested hull
+ // The data will persist only until the next executeStage call for that stage.
+ virtual LLCDResult getHullFromStage( int stage, int hull, LLCDHull* hullOut ) = 0;
+
+ virtual LLCDResult getSingleHull( LLCDHull* hullOut ) = 0 ;
+
+
+ // TODO: Implement lock of some kind to disallow this call if data not yet ready
+ // Populates the meshDataOut to reference the utility's copy of the mesh geometry
+ // for the hull and stage specified.
+ // You must copy this data if you want to continue using it after the next executeStage
+ // call
+ virtual LLCDResult getMeshFromStage( int stage, int hull, LLCDMeshData* meshDataOut) = 0;
+
+
+ // Creates a mesh from hullIn and temporarily stores it internally in the utility.
+ // The mesh data persists only until the next call to getMeshFromHull
+ virtual LLCDResult getMeshFromHull( LLCDHull* hullIn, LLCDMeshData* meshOut ) = 0;
+
+ // Takes meshIn, generates a single convex hull from it, converts that to a mesh
+ // stored internally, and populates meshOut to reference the internally stored data.
+ // The data is persistent only until the next call to generateSingleHullMeshFromMesh
+ virtual LLCDResult generateSingleHullMeshFromMesh( LLCDMeshData* meshIn, LLCDMeshData* meshOut) = 0;
+
+ //
+ /// Debug
+ virtual void loadMeshData(const char* fileIn, LLCDMeshData** meshDataOut) = 0;
+
+private:
+ static bool s_isInitialized;
+};
+
+#endif //LL_CONVEX_DECOMPOSITION
+
diff --git a/indra/llphysicsextensionsos/llconvexdecompositionvhacd.cpp b/indra/llphysicsextensionsos/llconvexdecompositionvhacd.cpp
new file mode 100644
index 0000000000..78876f9f36
--- /dev/null
+++ b/indra/llphysicsextensionsos/llconvexdecompositionvhacd.cpp
@@ -0,0 +1,492 @@
+/**
+* @file llconvexdecompositionvhacd.cpp
+* @author rye@alchemyviewer.org
+* @brief A VHACD based implementation of LLConvexDecomposition
+*
+* $LicenseInfo:firstyear=2025&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2025, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "linden_common.h"
+
+#include "llmath.h"
+#include "v3math.h"
+
+#include <string.h>
+#include <memory>
+
+#define ENABLE_VHACD_IMPLEMENTATION 1
+#include "VHACD.h"
+
+#include "llconvexdecompositionvhacd.h"
+
+constexpr S32 MAX_HULLS = 256;
+constexpr S32 MAX_VERTICES_PER_HULL = 256;
+
+bool LLConvexDecompositionVHACD::isFunctional()
+{
+ return true;
+}
+
+LLConvexDecomposition* LLConvexDecompositionVHACD::getInstance()
+{
+ return LLSimpleton::getInstance();
+}
+
+LLCDResult LLConvexDecompositionVHACD::initSystem()
+{
+ createInstance();
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::initThread()
+{
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::quitThread()
+{
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::quitSystem()
+{
+ deleteSingleton();
+ return LLCD_OK;
+}
+
+LLConvexDecompositionVHACD::LLConvexDecompositionVHACD()
+{
+ //Create our vhacd instance and setup default parameters
+ mVHACD = VHACD::CreateVHACD();
+
+ mVHACDParameters.m_callback = &mVHACDCallback;
+ mVHACDParameters.m_logger = &mVHACDLogger;
+
+ mDecompStages[0].mName = "Analyze";
+ mDecompStages[0].mDescription = nullptr;
+
+ LLCDParam param;
+ param.mName = "Fill Mode";
+ param.mDescription = nullptr;
+ param.mType = LLCDParam::LLCD_ENUM;
+ param.mDetails.mEnumValues.mNumEnums = 3;
+
+ static LLCDParam::LLCDEnumItem fill_enums[3];
+ fill_enums[(size_t)VHACD::FillMode::FLOOD_FILL].mName = "Flood";
+ fill_enums[(size_t)VHACD::FillMode::FLOOD_FILL].mValue = (int)VHACD::FillMode::FLOOD_FILL;
+ fill_enums[(size_t)VHACD::FillMode::SURFACE_ONLY].mName = "Surface Only";
+ fill_enums[(size_t)VHACD::FillMode::SURFACE_ONLY].mValue = (int)VHACD::FillMode::SURFACE_ONLY;
+ fill_enums[(size_t)VHACD::FillMode::RAYCAST_FILL].mName = "Raycast";
+ fill_enums[(size_t)VHACD::FillMode::RAYCAST_FILL].mValue = (int)VHACD::FillMode::RAYCAST_FILL;
+
+ param.mDetails.mEnumValues.mEnumsArray = fill_enums;
+ param.mDefault.mIntOrEnumValue = (int)VHACD::FillMode::FLOOD_FILL;
+ param.mStage = 0;
+ param.mReserved = -1;
+ mDecompParams.push_back(param);
+
+ enum EVoxelQualityLevels
+ {
+ E_LOW_QUALITY = 0,
+ E_NORMAL_QUALITY,
+ E_HIGH_QUALITY,
+ E_VERY_HIGH_QUALITY,
+ E_ULTRA_QUALITY,
+ E_MAX_QUALITY,
+ E_NUM_QUALITY_LEVELS
+ };
+
+ param.mName = "Voxel Resolution";
+ param.mDescription = nullptr;
+ param.mType = LLCDParam::LLCD_ENUM;
+ param.mDetails.mEnumValues.mNumEnums = E_NUM_QUALITY_LEVELS;
+
+ static LLCDParam::LLCDEnumItem voxel_quality_enums[E_NUM_QUALITY_LEVELS];
+ voxel_quality_enums[E_LOW_QUALITY].mName = "Low";
+ voxel_quality_enums[E_LOW_QUALITY].mValue = 200000;
+ voxel_quality_enums[E_NORMAL_QUALITY].mName = "Normal";
+ voxel_quality_enums[E_NORMAL_QUALITY].mValue = 400000;
+ voxel_quality_enums[E_HIGH_QUALITY].mName = "High";
+ voxel_quality_enums[E_HIGH_QUALITY].mValue = 800000;
+ voxel_quality_enums[E_VERY_HIGH_QUALITY].mName = "Very High";
+ voxel_quality_enums[E_VERY_HIGH_QUALITY].mValue = 1200000;
+ voxel_quality_enums[E_ULTRA_QUALITY].mName = "Ultra";
+ voxel_quality_enums[E_ULTRA_QUALITY].mValue = 1600000;
+ voxel_quality_enums[E_MAX_QUALITY].mName = "Maximum";
+ voxel_quality_enums[E_MAX_QUALITY].mValue = 2000000;
+
+ param.mDetails.mEnumValues.mEnumsArray = voxel_quality_enums;
+ param.mDefault.mIntOrEnumValue = 400000;
+ param.mStage = 0;
+ param.mReserved = -1;
+ mDecompParams.push_back(param);
+
+ param.mName = "Num Hulls";
+ param.mDescription = nullptr;
+ param.mType = LLCDParam::LLCD_FLOAT;
+ param.mDetails.mRange.mLow.mFloat = 1.f;
+ param.mDetails.mRange.mHigh.mFloat = MAX_HULLS;
+ param.mDetails.mRange.mDelta.mFloat = 1.f;
+ param.mDefault.mFloat = 8.f;
+ param.mStage = 0;
+ param.mReserved = -1;
+ mDecompParams.push_back(param);
+
+ param.mName = "Num Vertices";
+ param.mDescription = nullptr;
+ param.mType = LLCDParam::LLCD_FLOAT;
+ param.mDetails.mRange.mLow.mFloat = 3.f;
+ param.mDetails.mRange.mHigh.mFloat = MAX_VERTICES_PER_HULL;
+ param.mDetails.mRange.mDelta.mFloat = 1.f;
+ param.mDefault.mFloat = 32.f;
+ param.mStage = 0;
+ param.mReserved = -1;
+ mDecompParams.push_back(param);
+
+ param.mName = "Error Tolerance";
+ param.mDescription = nullptr;
+ param.mType = LLCDParam::LLCD_FLOAT;
+ param.mDetails.mRange.mLow.mFloat = 0.0001f;
+ param.mDetails.mRange.mHigh.mFloat = 99.f;
+ param.mDetails.mRange.mDelta.mFloat = 0.001f;
+ param.mDefault.mFloat = 1.f;
+ param.mStage = 0;
+ param.mReserved = -1;
+ mDecompParams.push_back(param);
+
+ for (const LLCDParam& param : mDecompParams)
+ {
+ const char* const name = param.mName;
+
+ switch (param.mType)
+ {
+ case LLCDParam::LLCD_FLOAT:
+ {
+ setParam(name, param.mDefault.mFloat);
+ break;
+ }
+ case LLCDParam::LLCD_ENUM:
+ case LLCDParam::LLCD_INTEGER:
+ {
+ setParam(name, param.mDefault.mIntOrEnumValue);
+ break;
+ }
+ case LLCDParam::LLCD_BOOLEAN:
+ {
+ setParam(name, (param.mDefault.mBool != 0));
+ break;
+ }
+ case LLCDParam::LLCD_INVALID:
+ default:
+ {
+ break;
+ }
+ }
+ }
+}
+
+LLConvexDecompositionVHACD::~LLConvexDecompositionVHACD()
+{
+ mBoundDecomp = nullptr;
+ mDecompData.clear();
+
+ mVHACD->Release();
+}
+
+void LLConvexDecompositionVHACD::genDecomposition(int& decomp)
+{
+ int new_decomp_id = static_cast<int>(mDecompData.size()) + 1;
+ mDecompData[new_decomp_id] = LLDecompData();
+ decomp = new_decomp_id;
+}
+
+void LLConvexDecompositionVHACD::deleteDecomposition(int decomp)
+{
+ auto iter = mDecompData.find(decomp);
+ if (iter != mDecompData.end())
+ {
+ if (mBoundDecomp == &iter->second)
+ {
+ mBoundDecomp = nullptr;
+ }
+ mDecompData.erase(iter);
+ }
+}
+
+void LLConvexDecompositionVHACD::bindDecomposition(int decomp)
+{
+ auto iter = mDecompData.find(decomp);
+ if (iter != mDecompData.end())
+ {
+ mBoundDecomp = &iter->second;
+ }
+ else
+ {
+ LL_WARNS() << "Failed to bind unknown decomposition: " << decomp << LL_ENDL;
+ mBoundDecomp = nullptr;
+ }
+}
+
+LLCDResult LLConvexDecompositionVHACD::setParam(const char* name, float val)
+{
+ if (name == std::string("Num Hulls"))
+ {
+ mVHACDParameters.m_maxConvexHulls = llclamp(ll_round(val), 1, MAX_HULLS);
+ }
+ else if (name == std::string("Num Vertices"))
+ {
+ mVHACDParameters.m_maxNumVerticesPerCH = llclamp(ll_round(val), 3, MAX_VERTICES_PER_HULL);
+ }
+ else if (name == std::string("Error Tolerance"))
+ {
+ mVHACDParameters.m_minimumVolumePercentErrorAllowed = val;
+ }
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::setParam(const char* name, bool val)
+{
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::setParam(const char* name, int val)
+{
+ if (name == std::string("Fill Mode"))
+ {
+ mVHACDParameters.m_fillMode = (VHACD::FillMode)val;
+ }
+ else if (name == std::string("Voxel Resolution"))
+ {
+ mVHACDParameters.m_resolution = val;
+ }
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::setMeshData( const LLCDMeshData* data, bool vertex_based )
+{
+ if (!mBoundDecomp)
+ {
+ return LLCD_NULL_PTR;
+ }
+
+ return mBoundDecomp->mSourceMesh.from(data, vertex_based);
+}
+
+LLCDResult LLConvexDecompositionVHACD::registerCallback(int stage, llcdCallbackFunc callback )
+{
+ if (stage == 0)
+ {
+ mVHACDCallback.setCallbackFunc(callback);
+ return LLCD_OK;
+ }
+ else
+ {
+ return LLCD_INVALID_STAGE;
+ }
+}
+
+LLCDResult LLConvexDecompositionVHACD::executeStage(int stage)
+{
+ if (!mBoundDecomp)
+ {
+ return LLCD_NULL_PTR;
+ }
+
+ if (stage != 0)
+ {
+ return LLCD_INVALID_STAGE;
+ }
+
+ mBoundDecomp->mDecomposedHulls.clear();
+
+ const auto& decomp_mesh = mBoundDecomp->mSourceMesh;
+ if (!mVHACD->Compute((const double* const)decomp_mesh.mVertices.data(), static_cast<uint32_t>(decomp_mesh.mVertices.size()), (const uint32_t* const)decomp_mesh.mIndices.data(), static_cast<uint32_t>(decomp_mesh.mIndices.size()), mVHACDParameters))
+ {
+ return LLCD_INVALID_HULL_DATA;
+ }
+
+ uint32_t num_nulls = mVHACD->GetNConvexHulls();
+ if (num_nulls == 0)
+ {
+ return LLCD_INVALID_HULL_DATA;
+ }
+
+ for (uint32_t i = 0; num_nulls > i; ++i)
+ {
+ VHACD::IVHACD::ConvexHull ch;
+ if (!mVHACD->GetConvexHull(i, ch))
+ continue;
+
+ LLConvexMesh out_mesh;
+ out_mesh.setVertices(ch.m_points);
+ out_mesh.setIndices(ch.m_triangles);
+
+ mBoundDecomp->mDecomposedHulls.push_back(std::move(out_mesh));
+ }
+
+ mVHACD->Clean();
+
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::buildSingleHull()
+{
+ LL_INFOS() << "Building single hull mesh" << LL_ENDL;
+ if (!mBoundDecomp || mBoundDecomp->mSourceMesh.mVertices.empty())
+ {
+ return LLCD_NULL_PTR;
+ }
+
+ mBoundDecomp->mSingleHullMesh.clear();
+
+ VHACD::QuickHull quickhull;
+ uint32_t num_tris = quickhull.ComputeConvexHull(mBoundDecomp->mSourceMesh.mVertices, MAX_VERTICES_PER_HULL);
+ if (num_tris > 0)
+ {
+ mBoundDecomp->mSingleHullMesh.setVertices(quickhull.GetVertices());
+ mBoundDecomp->mSingleHullMesh.setIndices(quickhull.GetIndices());
+
+ return LLCD_OK;
+ }
+
+ return LLCD_INVALID_MESH_DATA;
+}
+
+int LLConvexDecompositionVHACD::getNumHullsFromStage(int stage)
+{
+ if (!mBoundDecomp || stage != 0)
+ {
+ return 0;
+ }
+
+ return narrow(mBoundDecomp->mDecomposedHulls.size());
+}
+
+LLCDResult LLConvexDecompositionVHACD::getSingleHull( LLCDHull* hullOut )
+{
+ memset( hullOut, 0, sizeof(LLCDHull) );
+
+ if (!mBoundDecomp)
+ {
+ return LLCD_NULL_PTR;
+ }
+
+ if (mBoundDecomp->mSingleHullMesh.vertices.empty())
+ {
+ return LLCD_INVALID_HULL_DATA;
+ }
+
+ mBoundDecomp->mSingleHullMesh.to(hullOut);
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::getHullFromStage( int stage, int hull, LLCDHull* hullOut )
+{
+ memset( hullOut, 0, sizeof(LLCDHull) );
+
+ if (!mBoundDecomp)
+ {
+ return LLCD_NULL_PTR;
+ }
+
+ if (stage != 0)
+ {
+ return LLCD_INVALID_STAGE;
+ }
+
+ if (mBoundDecomp->mDecomposedHulls.empty() || mBoundDecomp->mDecomposedHulls.size() <= hull)
+ {
+ return LLCD_REQUEST_OUT_OF_RANGE;
+ }
+
+ mBoundDecomp->mDecomposedHulls[hull].to(hullOut);
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::getMeshFromStage( int stage, int hull, LLCDMeshData* meshDataOut )
+{
+ memset( meshDataOut, 0, sizeof(LLCDMeshData));
+ if (!mBoundDecomp)
+ {
+ return LLCD_NULL_PTR;
+ }
+
+ if (stage != 0)
+ {
+ return LLCD_INVALID_STAGE;
+ }
+
+ if (mBoundDecomp->mDecomposedHulls.empty() || mBoundDecomp->mDecomposedHulls.size() <= hull)
+ {
+ return LLCD_REQUEST_OUT_OF_RANGE;
+ }
+
+ mBoundDecomp->mDecomposedHulls[hull].to(meshDataOut);
+ return LLCD_OK;
+}
+
+LLCDResult LLConvexDecompositionVHACD::getMeshFromHull( LLCDHull* hullIn, LLCDMeshData* meshOut )
+{
+ memset(meshOut, 0, sizeof(LLCDMeshData));
+
+ LLVHACDMesh inMesh(hullIn);
+
+ VHACD::QuickHull quickhull;
+ uint32_t num_tris = quickhull.ComputeConvexHull(inMesh.mVertices, MAX_VERTICES_PER_HULL);
+ if (num_tris > 0)
+ {
+ mMeshFromHullData.setVertices(quickhull.GetVertices());
+ mMeshFromHullData.setIndices(quickhull.GetIndices());
+
+ mMeshFromHullData.to(meshOut);
+ return LLCD_OK;
+ }
+
+ return LLCD_INVALID_HULL_DATA;
+}
+
+LLCDResult LLConvexDecompositionVHACD::generateSingleHullMeshFromMesh(LLCDMeshData* meshIn, LLCDMeshData* meshOut)
+{
+ memset( meshOut, 0, sizeof(LLCDMeshData) );
+
+ LLVHACDMesh inMesh(meshIn, true);
+
+ VHACD::QuickHull quickhull;
+ uint32_t num_tris = quickhull.ComputeConvexHull(inMesh.mVertices, MAX_VERTICES_PER_HULL);
+ if (num_tris > 0)
+ {
+ mSingleHullMeshFromMeshData.setVertices(quickhull.GetVertices());
+ mSingleHullMeshFromMeshData.setIndices(quickhull.GetIndices());
+
+ mSingleHullMeshFromMeshData.to(meshOut);
+ return LLCD_OK;
+ }
+
+ return LLCD_INVALID_MESH_DATA;
+}
+
+void LLConvexDecompositionVHACD::loadMeshData(const char* fileIn, LLCDMeshData** meshDataOut)
+{
+ static LLCDMeshData meshData;
+ memset( &meshData, 0, sizeof(LLCDMeshData) );
+ *meshDataOut = &meshData;
+}
diff --git a/indra/llphysicsextensionsos/llconvexdecompositionvhacd.h b/indra/llphysicsextensionsos/llconvexdecompositionvhacd.h
new file mode 100644
index 0000000000..675356629c
--- /dev/null
+++ b/indra/llphysicsextensionsos/llconvexdecompositionvhacd.h
@@ -0,0 +1,339 @@
+/**
+* @file llconvexdecompositionvhacd.h
+* @author rye@alchemyviewer.org
+* @brief A VHACD based implementation of LLConvexDecomposition
+*
+* $LicenseInfo:firstyear=2025&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2025, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_CONVEX_DECOMP_UTIL_VHACD_H
+#define LL_CONVEX_DECOMP_UTIL_VHACD_H
+
+#include "llconvexdecomposition.h"
+#include "llsingleton.h"
+#include "llmath.h"
+
+#include <vector>
+
+#include "VHACD.h"
+
+class LLDecompDataVHACD;
+
+class LLConvexDecompositionVHACD : public LLSimpleton<LLConvexDecompositionVHACD>, public LLConvexDecomposition
+{
+ class VHACDCallback : public VHACD::IVHACD::IUserCallback
+ {
+ public:
+ void Update(const double overallProgress, const double stageProgress, const char* const stage, const char* operation) override
+ {
+ std::string out_msg = llformat("Stage: %s Operation: %s", stage, operation);
+ if (mCurrentStage != stage && mCurrentOperation != operation)
+ {
+ mCurrentStage = stage;
+ mCurrentOperation = operation;
+ LL_INFOS("VHACD") << out_msg << LL_ENDL;
+ }
+
+ if(mCallbackFunc)
+ {
+ mCallbackFunc(out_msg.c_str(), ll_round(static_cast<F32>(stageProgress)), ll_round(static_cast<F32>(overallProgress)));
+ }
+ }
+
+ void setCallbackFunc(llcdCallbackFunc func)
+ {
+ mCallbackFunc = func;
+ }
+
+ private:
+ std::string mCurrentStage;
+ std::string mCurrentOperation;
+ llcdCallbackFunc mCallbackFunc = nullptr;
+ };
+
+ class VHACDLogger : public VHACD::IVHACD::IUserLogger
+ {
+ void Log(const char* const msg) override
+ {
+ LL_INFOS("VHACD") << msg << LL_ENDL;
+ }
+ };
+
+public:
+
+ LLConvexDecompositionVHACD();
+ virtual ~LLConvexDecompositionVHACD();
+
+ static bool isFunctional();
+ static LLConvexDecomposition* getInstance();
+ static LLCDResult initSystem();
+ static LLCDResult initThread();
+ static LLCDResult quitThread();
+ static LLCDResult quitSystem();
+
+ void genDecomposition(int& decomp);
+ void deleteDecomposition(int decomp);
+ void bindDecomposition(int decomp);
+
+ // Sets *paramsOut to the address of the LLCDParam array and returns
+ // the length of the array
+ int getParameters(const LLCDParam** paramsOut)
+ {
+ *paramsOut = mDecompParams.data();
+ return narrow(mDecompParams.size());
+ }
+
+ int getStages(const LLCDStageData** stagesOut)
+ {
+ *stagesOut = mDecompStages.data();
+ return narrow(mDecompStages.size());
+ }
+
+ // Set a parameter by name. Returns false if out of bounds or unsupported parameter
+ LLCDResult setParam(const char* name, float val);
+ LLCDResult setParam(const char* name, int val);
+ LLCDResult setParam(const char* name, bool val);
+ LLCDResult setMeshData( const LLCDMeshData* data, bool vertex_based );
+ LLCDResult registerCallback(int stage, llcdCallbackFunc callback );
+
+ LLCDResult executeStage(int stage);
+ LLCDResult buildSingleHull();
+
+ int getNumHullsFromStage(int stage);
+
+ LLCDResult getHullFromStage( int stage, int hull, LLCDHull* hullOut );
+ LLCDResult getSingleHull( LLCDHull* hullOut ) ;
+
+ // TODO: Implement lock of some kind to disallow this call if data not yet ready
+ LLCDResult getMeshFromStage( int stage, int hull, LLCDMeshData* meshDataOut);
+ LLCDResult getMeshFromHull( LLCDHull* hullIn, LLCDMeshData* meshOut );
+
+ // For visualizing convex hull shapes in the viewer physics shape display
+ LLCDResult generateSingleHullMeshFromMesh( LLCDMeshData* meshIn, LLCDMeshData* meshOut);
+
+ /// Debug
+ void loadMeshData(const char* fileIn, LLCDMeshData** meshDataOut);
+
+private:
+ std::vector<LLCDParam> mDecompParams;
+ std::array<LLCDStageData, 1> mDecompStages;
+
+ struct LLVHACDMesh
+ {
+ using vertex_type = VHACD::Vertex;
+ using index_type = VHACD::Triangle;
+ using vertex_array_type = std::vector<vertex_type>;
+ using index_array_type = std::vector<index_type>;
+
+ LLVHACDMesh() = default;
+ LLVHACDMesh(const LLCDHull* hullIn)
+ {
+ if (hullIn)
+ {
+ from(hullIn);
+ }
+ };
+
+ LLVHACDMesh(const LLCDMeshData* meshIn, bool vertex_based)
+ {
+ if (meshIn)
+ {
+ from(meshIn, vertex_based);
+ }
+ };
+
+ void clear()
+ {
+ mVertices.clear();
+ mIndices.clear();
+ }
+
+ void setVertices(const float* data, int num_vertices, int vertex_stride_bytes)
+ {
+ vertex_array_type vertices;
+ vertices.reserve(num_vertices);
+
+ const int stride = vertex_stride_bytes / sizeof(float);
+ for (int i = 0; i < num_vertices; ++i)
+ {
+ vertices.emplace_back(data[i * stride + 0],
+ data[i * stride + 1],
+ data[i * stride + 2]);
+ }
+
+ mVertices = std::move(vertices);
+ }
+
+ void setIndices(const void* data, int num_indices, int index_stride_bytes, LLCDMeshData::IndexType type)
+ {
+ index_array_type indices;
+ indices.reserve(num_indices);
+
+ if (type == LLCDMeshData::INT_16)
+ {
+ const U16* index_data = static_cast<const U16*>(data);
+ const int stride = index_stride_bytes / sizeof(U16);
+ for (int i = 0; i < num_indices; ++i)
+ {
+ indices.emplace_back(index_data[i * stride + 0],
+ index_data[i * stride + 1],
+ index_data[i * stride + 2]);
+ }
+ }
+ else
+ {
+ const U32* index_data = static_cast<const U32*>(data);
+ const int stride = index_stride_bytes / sizeof(U32);
+ for (int i = 0; i < num_indices; ++i)
+ {
+ indices.emplace_back(index_data[i * stride + 0],
+ index_data[i * stride + 1],
+ index_data[i * stride + 2]);
+ }
+ }
+
+ mIndices = std::move(indices);
+ }
+
+ LLCDResult from(const LLCDHull* hullIn)
+ {
+ clear();
+
+ if (!hullIn || !hullIn->mVertexBase || (hullIn->mNumVertices < 3) || (hullIn->mVertexStrideBytes != 12 && hullIn->mVertexStrideBytes != 16))
+ {
+ return LLCD_INVALID_HULL_DATA;
+ }
+
+ setVertices(hullIn->mVertexBase, hullIn->mNumVertices, hullIn->mVertexStrideBytes);
+
+ return LLCD_OK;
+ }
+
+ LLCDResult from(const LLCDMeshData* meshIn, bool vertex_based)
+ {
+ clear();
+
+ if (!meshIn || !meshIn->mVertexBase || (meshIn->mNumVertices < 3) || (meshIn->mVertexStrideBytes != 12 && meshIn->mVertexStrideBytes != 16))
+ {
+ return LLCD_INVALID_MESH_DATA;
+ }
+
+ if (!vertex_based && ((meshIn->mNumTriangles < 1) || !meshIn->mIndexBase))
+ {
+ return LLCD_INVALID_MESH_DATA;
+ }
+
+ setVertices(meshIn->mVertexBase, meshIn->mNumVertices, meshIn->mVertexStrideBytes);
+ if(!vertex_based)
+ {
+ setIndices(meshIn->mIndexBase, meshIn->mNumTriangles, meshIn->mIndexStrideBytes, meshIn->mIndexType);
+ }
+
+ return LLCD_OK;
+ }
+
+ vertex_array_type mVertices;
+ index_array_type mIndices;
+ };
+
+ struct LLConvexMesh
+ {
+ using vertex_type = glm::vec3;
+ using index_type = glm::u32vec3;
+ using vertex_array_type = std::vector<vertex_type>;
+ using index_array_type = std::vector<index_type>;
+
+ LLConvexMesh() = default;
+
+ void clear()
+ {
+ vertices.clear();
+ indices.clear();
+ }
+
+ void setVertices(const std::vector<VHACD::Vertex>& in_vertices)
+ {
+ vertices.clear();
+ vertices.reserve(in_vertices.size());
+
+ for (const auto& vertex : in_vertices)
+ {
+ vertices.emplace_back(narrow(vertex.mX), narrow(vertex.mY), narrow(vertex.mZ));
+ }
+ }
+
+ void setIndices(const std::vector<VHACD::Triangle>& in_indices)
+ {
+ indices.clear();
+ indices.reserve(in_indices.size());
+
+ for (const auto& triangle : in_indices)
+ {
+ indices.emplace_back(narrow(triangle.mI0), narrow(triangle.mI1), narrow(triangle.mI2));
+ }
+ }
+
+ void to(LLCDHull* meshOut) const
+ {
+ meshOut->mVertexBase = (float*)vertices.data();
+ meshOut->mVertexStrideBytes = sizeof(vertex_type);
+ meshOut->mNumVertices = (int)vertices.size();
+ }
+
+ void to(LLCDMeshData* meshOut) const
+ {
+ meshOut->mVertexBase = (float*)vertices.data();
+ meshOut->mVertexStrideBytes = sizeof(vertex_type);
+ meshOut->mNumVertices = (int)vertices.size();
+
+ meshOut->mIndexType = LLCDMeshData::INT_32;
+ meshOut->mIndexBase = indices.data();
+ meshOut->mIndexStrideBytes = sizeof(index_type);
+ meshOut->mNumTriangles = (int)indices.size();
+ }
+
+ vertex_array_type vertices;
+ index_array_type indices;
+ };
+
+ struct LLDecompData
+ {
+ LLVHACDMesh mSourceMesh;
+ LLConvexMesh mSingleHullMesh;
+
+ std::vector<LLConvexMesh> mDecomposedHulls;
+ };
+
+ std::unordered_map<int, LLDecompData> mDecompData;
+
+ LLDecompData* mBoundDecomp = nullptr;
+
+ VHACD::IVHACD* mVHACD = nullptr;
+ VHACDCallback mVHACDCallback;
+ VHACDLogger mVHACDLogger;
+ VHACD::IVHACD::Parameters mVHACDParameters;
+
+ LLConvexMesh mMeshFromHullData;
+ LLConvexMesh mSingleHullMeshFromMeshData;
+};
+
+#endif //LL_CONVEX_DECOMP_UTIL_VHACD_H
diff --git a/indra/llphysicsextensionsos/llpathinglib.cpp b/indra/llphysicsextensionsos/llpathinglib.cpp
new file mode 100644
index 0000000000..f41cb9c45f
--- /dev/null
+++ b/indra/llphysicsextensionsos/llpathinglib.cpp
@@ -0,0 +1,83 @@
+/**
+* @file llpathinglib.cpp
+* @author prep@lindenlab.com
+* @brief LLPathingLib core creation methods
+*
+* $LicenseInfo:firstyear=2012&license=lgpl$
+* 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 "linden_common.h"
+
+#include "LLPathingLibStubImpl.h"
+
+#include "llpathinglib.h"
+
+//=============================================================================
+
+/*static */bool LLPathingLib::s_isInitialized = false;
+
+//=============================================================================
+
+
+/*static*/bool LLPathingLib::isFunctional()
+{
+ return false;
+}
+
+/*static*/LLPathingLib* LLPathingLib::getInstance()
+{
+ if ( !s_isInitialized )
+ {
+ return NULL;
+ }
+ else
+ {
+ return LLPathingLibImpl::getInstance();
+ }
+}
+
+//=============================================================================
+
+/*static */LLPathingLib::LLPLResult LLPathingLib::initSystem()
+{
+ if ( LLPathingLibImpl::initSystem() == LLPL_OK )
+ {
+ s_isInitialized = true;
+ return LLPL_OK;
+ }
+ return LLPL_UNKOWN_ERROR;
+}
+//=============================================================================
+/*static */LLPathingLib::LLPLResult LLPathingLib::quitSystem()
+{
+ LLPLResult quitResult = LLPL_UNKOWN_ERROR;
+
+ if (s_isInitialized)
+ {
+ quitResult = LLPathingLibImpl::quitSystem();
+ s_isInitialized = false;
+ }
+
+ return quitResult;
+}
+//=============================================================================
+
diff --git a/indra/llphysicsextensionsos/llpathinglib.h b/indra/llphysicsextensionsos/llpathinglib.h
new file mode 100644
index 0000000000..41583f1fd1
--- /dev/null
+++ b/indra/llphysicsextensionsos/llpathinglib.h
@@ -0,0 +1,187 @@
+/**
+ * @file llpathinglib.cpp
+ * @author prep@lindenlab.com
+ * @brief LLPathingLib interface definition
+ *
+ * $LicenseInfo:firstyear=2012&license=lgpl$
+ * 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$
+ */
+
+#ifndef LL_PATHING_LIBRARY
+#define LL_PATHING_LIBRARY
+
+#include "llpreprocessor.h"
+#include "llsd.h"
+#include "v3dmath.h"
+#include "v4math.h"
+
+#include "v4color.h"
+#include "v4coloru.h"
+#include "llphysicsextensions.h"
+
+typedef int bool32;
+
+#if defined(_WIN32) || defined(_WIN64)
+#define LLCD_CALL __cdecl
+#else
+#define LLCD_CALL
+#endif
+
+class LLRender;
+
+//=============================================================================
+class LLPathingLib
+{
+
+public:
+ enum LLShapeType
+ {
+ LLST_WalkableObjects = 0,
+ LLST_ObstacleObjects,
+ LLST_MaterialPhantoms,
+ LLST_ExclusionPhantoms,
+ LLST_MaxShapeTypes = LLST_ExclusionPhantoms+1,
+ LLST_None = LLST_MaxShapeTypes+2,
+ LLST_SimpleBox = LLST_None+1,
+ LLST_SimpleCapsule = LLST_SimpleBox+1,
+ };
+
+ enum LLShapeTypeFlag
+ {
+ LLSTB_WalkableObjects = 0x1 << 1,
+ LLSTB_ObstacleObjects = 0x1 << 2,
+ LLSTB_MaterialPhantoms = 0x1 << 3,
+ LLSTB_ExclusionPhantoms = 0x1 << 4,
+ LLSTB_None = 0x1 << 5
+ };
+
+ enum LLPLPathBookEnd
+ {
+ LLPL_START = 0,
+ LLPL_END,
+ };
+
+ enum LLPLResult
+ {
+ LLPL_OK = 0,
+ LLPL_NOTSET,
+ LLPL_ERROR,
+ LLPL_NO_NAVMESH,
+ LLPL_UNKOWN_ERROR,
+ LLPL_NO_PATH,
+ LLPL_PATH_GENERATED_OK,
+ LLPL_NOT_IMPLEMENTED,
+ };
+
+ enum LLPLCharacterType
+ {
+ LLPL_CHARACTER_TYPE_A = 4,
+ LLPL_CHARACTER_TYPE_B = 3,
+ LLPL_CHARACTER_TYPE_C = 2,
+ LLPL_CHARACTER_TYPE_D = 1,
+ LLPL_CHARACTER_TYPE_NONE = 0
+ };
+
+ struct PathingPacket
+ {
+ PathingPacket() : mHasPointA(false), mHasPointB(false), mCharacterWidth(0.0f), mCharacterType(LLPL_CHARACTER_TYPE_NONE) {}
+ bool mHasPointA;
+ LLVector3 mStartPointA;
+ LLVector3 mEndPointA;
+ bool mHasPointB;
+ LLVector3 mStartPointB;
+ LLVector3 mEndPointB;
+ F32 mCharacterWidth;
+ LLPLCharacterType mCharacterType;
+ };
+
+ struct NavMeshColors
+ {
+ LLColor4U mWalkable;
+ LLColor4U mObstacle;
+ LLColor4U mMaterial;
+ LLColor4U mExclusion;
+ LLColor4U mConnectedEdge;
+ LLColor4U mBoundaryEdge;
+ LLColor4 mHeatColorBase;
+ LLColor4 mHeatColorMax;
+ LLColor4U mFaceColor;
+ LLColor4U mStarValid;
+ LLColor4U mStarInvalid;
+ LLColor4U mTestPath;
+ LLColor4U mWaterColor;
+ };
+
+public:
+ //Ctor
+ LLPathingLib() {}
+ virtual ~LLPathingLib() {}
+
+ /// @returns false if this is the stub
+ static bool isFunctional();
+
+ // Obtain a pointer to the actual implementation
+ static LLPathingLib* getInstance();
+ static LLPathingLib::LLPLResult initSystem();
+ static LLPathingLib::LLPLResult quitSystem();
+
+ //Extract and store navmesh data from the llsd datablock sent down by the server
+ virtual LLPLResult extractNavMeshSrcFromLLSD( const LLSD::Binary& dataBlock, int dir ) = 0;
+ //Stitch any stored navmeshes together
+ virtual void processNavMeshData( ) = 0;
+
+ //Method used to generate and visualize a path on the viewers navmesh
+ virtual LLPLResult generatePath( const PathingPacket& pathingPacket ) = 0;
+
+ //Set the material type for the heatmap type
+ virtual void setNavMeshMaterialType( LLPLCharacterType materialType ) = 0;
+ //Set the various navmesh colors
+ virtual void setNavMeshColors( const NavMeshColors& color ) = 0;
+
+ //The entry method to rendering the client side navmesh
+ virtual void renderNavMesh() = 0;
+ //The entry method to rendering the client side navmesh edges
+ virtual void renderNavMeshEdges() = 0;
+ //The entry method to render the client navmesh shapes VBO
+ virtual void renderNavMeshShapesVBO( U32 shapeRenderFlags ) = 0;
+ //The entry method to render the clients designated path
+ virtual void renderPath() = 0;
+ //The entry method to render the capsule bookends for the clients designated path
+ virtual void renderPathBookend( LLRender& gl, LLPathingLib::LLPLPathBookEnd type ) = 0;
+ //Renders all of the generated simple shapes (using their default transforms)
+ virtual void renderSimpleShapes( LLRender& gl, F32 regionsWaterHeight ) = 0;
+
+ //Method called from second life to create a capsule from properties of a character
+ virtual void createPhysicsCapsuleRep( F32 length, F32 radius, BOOL horizontal, const LLUUID& id ) = 0;
+ //Removes any cached physics capsule using a list of cached uuids
+ virtual void cleanupPhysicsCapsuleRepResiduals() = 0;
+ //Renders a selected uuids physics rep
+ virtual void renderSimpleShapeCapsuleID( LLRender& gl, const LLUUID& id, const LLVector3& pos, const LLQuaternion& rot ) = 0;
+
+ //Method to delete any vbo's that are currently being managed by the pathing library
+ virtual void cleanupVBOManager( ) = 0;
+ //Method to cleanup any allocations within the implementation
+ virtual void cleanupResidual( ) = 0;
+private:
+ static bool s_isInitialized;
+};
+
+#endif //LL_PATHING_LIBRARY
diff --git a/indra/llphysicsextensionsos/llphysicsextensions.cpp b/indra/llphysicsextensionsos/llphysicsextensions.cpp
new file mode 100644
index 0000000000..3bb8ffbf1a
--- /dev/null
+++ b/indra/llphysicsextensionsos/llphysicsextensions.cpp
@@ -0,0 +1,78 @@
+/**
+* @file llphysicsextensions.cpp
+* @author nyx@lindenlab.com
+* @brief LLPhysicsExtensions core initialization methods
+*
+* $LicenseInfo:firstyear=2012&license=lgpl$
+* 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 "linden_common.h"
+
+#include "llphysicsextensions.h"
+#include "LLPhysicsExtensionsStubImpl.h"
+
+
+//disable the undefined symbol optimization
+//#pragma warning (disable : 4221)
+
+//=============================================================================
+
+/*static */bool LLPhysicsExtensions::s_isInitialized = false;
+
+
+/*static*/bool LLPhysicsExtensions::isFunctional()
+{
+ return false;
+}
+
+//=============================================================================
+
+/*static*/LLPhysicsExtensions* LLPhysicsExtensions::getInstance()
+{
+ if ( !s_isInitialized )
+ {
+ return NULL;
+ }
+ else
+ {
+ return LLPhysicsExtensionsImpl::getInstance();
+ }
+}
+
+//=============================================================================
+
+/*static */bool LLPhysicsExtensions::initSystem()
+{
+ bool result = LLPhysicsExtensionsImpl::initSystem();
+ if ( result )
+ {
+ s_isInitialized = true;
+ }
+ return result;
+}
+//=============================================================================
+/*static */bool LLPhysicsExtensions::quitSystem()
+{
+ return LLPhysicsExtensionsImpl::quitSystem();
+}
+//=============================================================================
+
diff --git a/indra/llphysicsextensionsos/llphysicsextensions.h b/indra/llphysicsextensionsos/llphysicsextensions.h
new file mode 100644
index 0000000000..fa23ebd725
--- /dev/null
+++ b/indra/llphysicsextensionsos/llphysicsextensions.h
@@ -0,0 +1,59 @@
+/**
+* @file llphysicsextensions.h
+* @author nyx@lindenlab.com
+* @brief LLPhysicsExtensions core shared initialization
+* routines
+*
+* $LicenseInfo:firstyear=2012&license=lgpl$
+* 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$
+*/
+
+#ifndef LL_PHYSICS_EXTENSIONS
+#define LL_PHYSICS_EXTENSIONS
+
+#include "llpreprocessor.h"
+#include "llsd.h"
+#include "v3dmath.h"
+
+#define LLPHYSICSEXTENSIONS_VERSION "1.0"
+
+typedef int bool32;
+
+class LLPhysicsExtensions
+{
+
+public:
+ // Obtain a pointer to the actual implementation
+ static LLPhysicsExtensions* getInstance();
+
+ /// @returns false if this is the stub
+ static bool isFunctional();
+
+ static bool initSystem();
+ static bool quitSystem();
+
+private:
+ static bool s_isInitialized;
+};
+
+#endif //LL_PATHING_LIBRARY
+
+
diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt
index 7fa5c957b6..0525e3d9ea 100644
--- a/indra/llplugin/CMakeLists.txt
+++ b/indra/llplugin/CMakeLists.txt
@@ -35,7 +35,7 @@ list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES})
add_library (llplugin ${llplugin_SOURCE_FILES})
target_include_directories( llplugin INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
-target_link_libraries( llplugin llcommon llmath llrender llmessage )
+target_link_libraries( llplugin llcommon llmath llmessage llxml )
add_subdirectory(slplugin)
include(LibraryInstall)
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 17f403e8e8..53a338b3d6 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -33,9 +33,7 @@
#include "llpluginmessageclasses.h"
#include "llcontrol.h"
-#if LL_DARWIN || LL_LINUX || __FreeBSD__
extern LLControlGroup gSavedSettings;
-#endif
#if LL_DARWIN
extern bool gHiDPISupport;
#endif
@@ -134,9 +132,13 @@ void LLPluginClassMedia::reset()
mLastMouseY = 0;
mStatus = LLPluginClassMediaOwner::MEDIA_NONE;
mSleepTime = 1.0f / 100.0f;
+ mCanUndo = false;
+ mCanRedo = false;
mCanCut = false;
mCanCopy = false;
mCanPaste = false;
+ mCanDoDelete = false;
+ mCanSelectAll = false;
mMediaName.clear();
mMediaDescription.clear();
mBackgroundColor = LLColor4(1.0f, 1.0f, 1.0f, 1.0f);
@@ -909,6 +911,18 @@ void LLPluginClassMedia::sendAuthResponse(bool ok, const std::string &username,
sendMessage(message);
}
+void LLPluginClassMedia::undo()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_undo");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::redo()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_redo");
+ sendMessage(message);
+}
+
void LLPluginClassMedia::cut()
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_cut");
@@ -927,6 +941,24 @@ void LLPluginClassMedia::paste()
sendMessage(message);
}
+void LLPluginClassMedia::doDelete()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_delete");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::selectAll()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_select_all");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::showPageSource()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_show_source");
+ sendMessage(message);
+}
+
void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path_cache,
const std::string &username,
const std::string &user_data_path_cef_log)
@@ -936,10 +968,8 @@ void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path_cache
message.setValue("username", username); // cef shares cache between users but creates user-based contexts
message.setValue("cef_log_file", user_data_path_cef_log);
-#if LL_DARWIN || LL_LINUX || __FreeBSD__
bool cef_verbose_log = gSavedSettings.getBOOL("CefVerboseLog");
message.setValueBoolean("cef_verbose_log", cef_verbose_log);
-#endif
sendMessage(message);
}
@@ -1191,6 +1221,14 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
}
else if(message_name == "edit_state")
{
+ if(message.hasValue("undo"))
+ {
+ mCanUndo = message.getValueBoolean("undo");
+ }
+ if(message.hasValue("redo"))
+ {
+ mCanRedo = message.getValueBoolean("redo");
+ }
if(message.hasValue("cut"))
{
mCanCut = message.getValueBoolean("cut");
@@ -1203,6 +1241,14 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
{
mCanPaste = message.getValueBoolean("paste");
}
+ if (message.hasValue("delete"))
+ {
+ mCanDoDelete = message.getValueBoolean("delete");
+ }
+ if (message.hasValue("select_all"))
+ {
+ mCanSelectAll = message.getValueBoolean("select_all");
+ }
}
else if(message_name == "name_text")
{
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 80862284ff..6c512003cc 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -29,7 +29,6 @@
#ifndef LL_LLPLUGINCLASSMEDIA_H
#define LL_LLPLUGINCLASSMEDIA_H
-#include "llgltypes.h"
#include "llpluginprocessparent.h"
#include "llrect.h"
#include "llpluginclassmediaowner.h"
@@ -205,6 +204,12 @@ public:
LLPluginClassMediaOwner::EMediaStatus getStatus() const { return mStatus; }
+ void undo();
+ bool canUndo() const { return mCanUndo; };
+
+ void redo();
+ bool canRedo() const { return mCanRedo; };
+
void cut();
bool canCut() const { return mCanCut; };
@@ -214,6 +219,14 @@ public:
void paste();
bool canPaste() const { return mCanPaste; };
+ void doDelete();
+ bool canDoDelete() const { return mCanDoDelete; };
+
+ void selectAll();
+ bool canSelectAll() const { return mCanSelectAll; };
+
+ void showPageSource();
+
// These can be called before init(), and they will be queued and sent before the media init message.
void setUserDataPath(const std::string &user_data_path_cache, const std::string &username, const std::string &user_data_path_cef_log);
void setLanguageCode(const std::string &language_code);
@@ -357,9 +370,9 @@ protected:
bool mTextureParamsReceived; // the mRequestedTexture* fields are only valid when this is true
S32 mRequestedTextureDepth;
- LLGLenum mRequestedTextureInternalFormat;
- LLGLenum mRequestedTextureFormat;
- LLGLenum mRequestedTextureType;
+ U32 mRequestedTextureInternalFormat;
+ U32 mRequestedTextureFormat;
+ U32 mRequestedTextureType;
bool mRequestedTextureSwapBytes;
bool mRequestedTextureCoordsOpenGL;
@@ -425,9 +438,13 @@ protected:
F64 mSleepTime;
+ bool mCanUndo;
+ bool mCanRedo;
bool mCanCut;
bool mCanCopy;
bool mCanPaste;
+ bool mCanDoDelete;
+ bool mCanSelectAll;
std::string mMediaName;
std::string mMediaTitle;
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 19a0ce639a..3deee2fb3e 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -275,6 +275,9 @@ void LLPluginProcessParent::init(const std::string &launcher_filename, const std
{
mProcessParams.executable = launcher_filename;
mProcessParams.cwd = plugin_dir;
+#if LL_WINDOWS
+ mProcessParams.envs.add(llformat("SYSTEMROOT=%s", getenv("SYSTEMROOT")));
+#endif
mPluginFile = plugin_filename;
mPluginDir = plugin_dir;
mCPUUsage = 0.0f;
@@ -575,7 +578,7 @@ void LLPluginProcessParent::idle(void)
params.args.add("-e");
params.args.add("tell application \"Terminal\"");
params.args.add("-e");
- params.args.add(STRINGIZE("set win to do script \"lldb -pid "
+ params.args.add(STRINGIZE("set win to do script \"lldb -p "
<< mProcess->getProcessID() << "\""));
params.args.add("-e");
params.args.add("do script \"continue\" in win");
@@ -982,14 +985,18 @@ void LLPluginProcessParent::poll(F64 timeout)
}
}
- // Remove instances in the done state from the sInstances map.
- mapInstances_t::iterator itClean = sInstances.begin();
- while (itClean != sInstances.end())
+ if (sInstancesMutex)
{
- if ((*itClean).second->isDone())
- itClean = sInstances.erase(itClean);
- else
- ++itClean;
+ // Remove instances in the done state from the sInstances map.
+ LLCoros::LockType lock(*sInstancesMutex);
+ mapInstances_t::iterator itClean = sInstances.begin();
+ while (itClean != sInstances.end())
+ {
+ if ((*itClean).second->isDone())
+ itClean = sInstances.erase(itClean);
+ else
+ ++itClean;
+ }
}
}
diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt
index d29731894f..38f4c92b09 100644
--- a/indra/llplugin/slplugin/CMakeLists.txt
+++ b/indra/llplugin/slplugin/CMakeLists.txt
@@ -30,18 +30,6 @@ add_executable(SLPlugin
${SLPlugin_SOURCE_FILES}
)
-if (WINDOWS)
-set_target_properties(SLPlugin
- PROPERTIES
- LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMTD\""
- )
-else ()
-set_target_properties(SLPlugin
- PROPERTIES
- MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist
- )
-endif ()
-
target_link_libraries(SLPlugin
llplugin
llmessage
@@ -49,7 +37,20 @@ target_link_libraries(SLPlugin
ll::pluginlibraries
)
-if (DARWIN)
+if (WINDOWS)
+ set_target_properties(SLPlugin
+ PROPERTIES
+ LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMTD\""
+ )
+elseif (DARWIN)
+ set_target_properties(SLPlugin
+ PROPERTIES
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_RPATH "@executable_path/../../../../Frameworks;@executable_path/../Frameworks;@executable_path/../Frameworks/plugins"
+ MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist
+ XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"
+ )
+
# Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later)
add_custom_command(
TARGET SLPlugin POST_BUILD
@@ -58,7 +59,7 @@ if (DARWIN)
-p
${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/SLPlugin.app/Contents/Frameworks
)
-endif (DARWIN)
+endif ()
if (BUILD_SHARED_LIBS)
set_target_properties(SLPlugin PROPERTIES LINK_FLAGS_RELEASE
@@ -66,14 +67,14 @@ if (BUILD_SHARED_LIBS)
endif ()
if (INSTALL)
- if (DARWIN)
+ if (DARWIN OR WINDOWS)
install(TARGETS ${PROJECT_NAME} DESTINATION .)
elseif (${LINUX_DISTRO} MATCHES arch)
install(TARGETS ${PROJECT_NAME} DESTINATION lib/${VIEWER_BINARY_NAME})
- else (DARWIN)
+ else ()
install(TARGETS ${PROJECT_NAME} DESTINATION libexec/${VIEWER_BINARY_NAME})
- endif (DARWIN)
-endif (INSTALL)
+ endif ()
+endif ()
if (LL_TESTS)
ll_deploy_sharedlibs_command(SLPlugin)
diff --git a/indra/llplugin/slplugin/slplugin-objc.mm b/indra/llplugin/slplugin/slplugin-objc.mm
index 68ff196eaf..adde594b59 100644
--- a/indra/llplugin/slplugin/slplugin-objc.mm
+++ b/indra/llplugin/slplugin/slplugin-objc.mm
@@ -7,21 +7,21 @@
* $LicenseInfo:firstyear=2010&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*
@@ -38,51 +38,51 @@
void LLCocoaPlugin::setupCocoa()
{
- static bool inited = false;
-
- if(!inited)
- {
- createAutoReleasePool();
-
- // The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents.
- // ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr'
- // when init'ing the Cocoa App window.
- [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
-
- // This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor":
- // http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html
-
- // Needed for Carbon based applications which call into Cocoa
- NSApplicationLoad();
-
- // Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image
- [[[NSWindow alloc] init] release];
-
+ static bool inited = false;
+
+ if(!inited)
+ {
+ createAutoReleasePool();
+
+ // The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents.
+ // ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr'
+ // when init'ing the Cocoa App window.
+ [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
+
+ // This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor":
+ // http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html
+
+ // Needed for Carbon based applications which call into Cocoa
+ NSApplicationLoad();
+
+ // Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image
+ [[[NSWindow alloc] init] release];
+
mPluginWindow = [NSApp mainWindow];
-
- deleteAutoReleasePool();
-
- inited = true;
- }
+
+ deleteAutoReleasePool();
+
+ inited = true;
+ }
}
static NSAutoreleasePool *sPool = NULL;
void LLCocoaPlugin::createAutoReleasePool()
{
- if(!sPool)
- {
- sPool = [[NSAutoreleasePool alloc] init];
- }
+ if(!sPool)
+ {
+ sPool = [[NSAutoreleasePool alloc] init];
+ }
}
void LLCocoaPlugin::deleteAutoReleasePool()
{
- if(sPool)
- {
- [sPool release];
- sPool = NULL;
- }
+ if(sPool)
+ {
+ [sPool release];
+ sPool = NULL;
+ }
}
LLCocoaPlugin::LLCocoaPlugin():mHackState(0)
@@ -110,12 +110,12 @@ void LLCocoaPlugin::setupGroup()
// {
// // Start out with a window layer that's way out in front (fixes the problem with the menubar not getting hidden on first switch to fullscreen youtube)
// SetWindowGroupName(layer_group, CFSTR("SLPlugin Layer"));
- // SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel);
+ // SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel);
// }
-
+
}
-void LLCocoaPlugin::updateWindows()
+void LLCocoaPlugin::updateWindows()
{
// NSArray* window_list = [NSApp orderedWindows];
// NSWindow* current_window = [window_list objectAtIndex:0];
@@ -123,38 +123,38 @@ void LLCocoaPlugin::updateWindows()
// bool this_is_front_process = false;
// bool parent_is_front_process = false;
//
-//
+//
// // Check for a change in this process's frontmost window.
// if ( current_window != mFrontWindow )
// {
// // and figure out whether this process or its parent are currently frontmost
// if ( current_window == parent_window ) parent_is_front_process = true;
// if ( current_window == mPluginWindow ) this_is_front_process = true;
-//
+//
// if (current_window != NULL && mFrontWindow == NULL)
// {
// // Opening the first window
-//
+//
// if(mHackState == 0)
// {
// // Next time through the event loop, lower the window group layer
// mHackState = 1;
// }
-//
+//
// if(parent_is_front_process)
// {
// // Bring this process's windows to the front.
// [mPluginWindow makeKeyAndOrderFront:NSApp];
// [mPluginWindow setOrderedIndex:0];
// }
-//
+//
// [NSApp activateIgnoringOtherApps:YES];
// }
-//
+//
// else if (( current_window == NULL) && (mFrontWindow != NULL))
// {
// // Closing the last window
-//
+//
// if(this_is_front_process)
// {
// // Try to bring this process's parent to the front
@@ -171,7 +171,7 @@ void LLCocoaPlugin::updateWindows()
//// }
// mHackState = 2;
// }
-//
+//
// mFrontWindow = [window_list objectAtIndex:0];
// }
}
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index 00d821c470..e8a0601852 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -3,7 +3,6 @@
project(llprimitive)
include(00-Common)
-include(Prebuilt)
include(LLCommon)
include(LLCoreHttp)
include(LLPhysicsExtensions)
@@ -11,30 +10,8 @@ include(LLPrimitive)
include(GLM)
include(TinyGLTF)
-if(LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
- set_property(DIRECTORY APPEND
- PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/../patches/collada-dom-v2.3-r8.patch)
- prepare_thirdparty(
- "https://github.com/secondlife/3p-colladadom/archive/refs/tags/v2.3-r8.tar.gz"
- "colladadom-v2.3-r8.tar.gz"
- "3p-colladadom-2.3-r8"
- "collada-dom-v2.3-r8.patch"
- "b36dce3b7be4b49f3c8e4d6c9dbf3529f7ed1f28e64ee45be0e77805f06376b95079798616529302d771ab2b76bf06d2f894ca11e6f7f3097c3f7a05a78c474f"
- )
- set(OPT_COLLADA14 TRUE)
- add_subdirectory(
- "${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8" "colladadom")
- target_include_directories(
- ll::colladadom INTERFACE
- ${colladadom_SOURCE_DIR}/include
- ${colladadom_SOURCE_DIR}/include/1.4
- )
- target_link_libraries( ll::colladadom INTERFACE collada14dom )
-endif(LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
-
set(llprimitive_SOURCE_FILES
lldaeloader.cpp
- llgltfloader.cpp
llgltfmaterial.cpp
llmaterialid.cpp
llmaterial.cpp
@@ -54,7 +31,6 @@ set(llprimitive_SOURCE_FILES
set(llprimitive_HEADER_FILES
CMakeLists.txt
lldaeloader.h
- llgltfloader.h
llgltfmaterial.h
llgltfmaterial_templates.h
legacy_object_types.h
@@ -89,11 +65,20 @@ target_link_libraries(llprimitive
llxml
llcharacter
llrender
- llphysicsextensions_impl
ll::colladadom
ll::glm
)
+if (HAVOK OR HAVOK_TPV)
+ target_link_libraries(llprimitive
+ llphysicsextensions_impl
+ )
+else()
+ target_link_libraries(llprimitive
+ llphysicsextensionsos
+ )
+endif ()
+
include(LibraryInstall)
#add unit tests
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index 0759447902..81ebe631c5 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -204,12 +204,15 @@ LLModel::EModelStatus load_face_from_dom_triangles(
if (idx_stride <= 0
|| (pos_source && pos_offset >= idx_stride)
+ || (pos_source && pos_offset < 0)
|| (tc_source && tc_offset >= idx_stride)
- || (norm_source && norm_offset >= idx_stride))
+ || (tc_source && tc_offset < 0)
+ || (norm_source && norm_offset >= idx_stride)
+ || (norm_source && norm_offset < 0))
{
// Looks like these offsets should fit inside idx_stride
// Might be good idea to also check idx.getCount()%idx_stride != 0
- LL_WARNS() << "Invalid pos_offset " << pos_offset << ", tc_offset " << tc_offset << " or norm_offset " << norm_offset << LL_ENDL;
+ LL_WARNS() << "Invalid idx_stride " << idx_stride << ", pos_offset " << pos_offset << ", tc_offset " << tc_offset << " or norm_offset " << norm_offset << LL_ENDL;
return LLModel::BAD_ELEMENT;
}
@@ -880,9 +883,10 @@ LLDAELoader::LLDAELoader(
void* opaque_userdata,
JointTransformMap& jointTransformMap,
JointNameSet& jointsFromNodes,
- std::map<std::string, std::string>& jointAliasMap,
+ std::map<std::string, std::string, std::less<>>& jointAliasMap,
U32 maxJointsPerMesh,
U32 modelLimit,
+ U32 debugMode,
bool preprocess)
: LLModelLoader(
filename,
@@ -895,8 +899,9 @@ LLDAELoader::LLDAELoader(
jointTransformMap,
jointsFromNodes,
jointAliasMap,
- maxJointsPerMesh),
- mGeneratedModelLimit(modelLimit),
+ maxJointsPerMesh,
+ modelLimit,
+ debugMode),
mPreprocessDAE(preprocess)
{
}
@@ -1314,7 +1319,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
{
//Build a joint for the resolver to work with
char str[64]={0};
- sprintf(str,"./%s",(*jointIt).first.c_str() );
+ snprintf(str, sizeof(str), "./%s",(*jointIt).first.c_str() );
//LL_WARNS()<<"Joint "<< str <<LL_ENDL;
//Setup the resolver
@@ -1680,6 +1685,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
{
materials[model->mMaterialList[i]] = LLImportMaterial();
}
+ // todo: likely a bug here, shouldn't be using suffixed label, see how it gets used in other places.
mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials));
stretch_extents(model, transformation);
}
@@ -2412,7 +2418,7 @@ std::string LLDAELoader::getElementLabel(daeElement *element)
}
// static
-size_t LLDAELoader::getSuffixPosition(std::string label)
+size_t LLDAELoader::getSuffixPosition(const std::string &label)
{
if ((label.find("_LOD") != -1) || (label.find("_PHYS") != -1))
{
diff --git a/indra/llprimitive/lldaeloader.h b/indra/llprimitive/lldaeloader.h
index 92152fb8b8..82eb76c8e9 100644
--- a/indra/llprimitive/lldaeloader.h
+++ b/indra/llprimitive/lldaeloader.h
@@ -49,19 +49,20 @@ public:
dae_model_map mModelsMap;
LLDAELoader(
- std::string filename,
- S32 lod,
- LLModelLoader::load_callback_t load_cb,
- LLModelLoader::joint_lookup_func_t joint_lookup_func,
- LLModelLoader::texture_load_func_t texture_load_func,
- LLModelLoader::state_callback_t state_cb,
- void* opaque_userdata,
- JointTransformMap& jointTransformMap,
- JointNameSet& jointsFromNodes,
- std::map<std::string, std::string>& jointAliasMap,
- U32 maxJointsPerMesh,
- U32 modelLimit,
- bool preprocess);
+ std::string filename,
+ S32 lod,
+ LLModelLoader::load_callback_t load_cb,
+ LLModelLoader::joint_lookup_func_t joint_lookup_func,
+ LLModelLoader::texture_load_func_t texture_load_func,
+ LLModelLoader::state_callback_t state_cb,
+ void* opaque_userdata,
+ JointTransformMap& jointTransformMap,
+ JointNameSet& jointsFromNodes,
+ std::map<std::string, std::string, std::less<>>& jointAliasMap,
+ U32 maxJointsPerMesh,
+ U32 modelLimit,
+ U32 debugMode,
+ bool preprocess);
virtual ~LLDAELoader() ;
virtual bool OpenFile(const std::string& filename);
@@ -99,13 +100,12 @@ protected:
bool loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& models_out, U32 submodel_limit);
static std::string getElementLabel(daeElement *element);
- static size_t getSuffixPosition(std::string label);
+ static size_t getSuffixPosition(const std::string& label);
static std::string getLodlessLabel(daeElement *element);
static std::string preprocessDAE(std::string filename);
private:
- U32 mGeneratedModelLimit; // Attempt to limit amount of generated submodels
bool mPreprocessDAE;
};
diff --git a/indra/llprimitive/llgltfloader.cpp b/indra/llprimitive/llgltfloader.cpp
deleted file mode 100644
index 480012699a..0000000000
--- a/indra/llprimitive/llgltfloader.cpp
+++ /dev/null
@@ -1,404 +0,0 @@
-/**
- * @file LLGLTFLoader.cpp
- * @brief LLGLTFLoader class implementation
- *
- * $LicenseInfo:firstyear=2022&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2022, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llgltfloader.h"
-
-// Import & define single-header gltf import/export lib
-#define TINYGLTF_IMPLEMENTATION
-#define TINYGLTF_USE_CPP14 // default is C++ 11
-
-// tinygltf by default loads image files using STB
-#define STB_IMAGE_IMPLEMENTATION
-// to use our own image loading:
-// 1. replace this definition with TINYGLTF_NO_STB_IMAGE
-// 2. provide image loader callback with TinyGLTF::SetImageLoader(LoadimageDataFunction LoadImageData, void *user_data)
-
-// tinygltf saves image files using STB
-#define STB_IMAGE_WRITE_IMPLEMENTATION
-// similarly, can override with TINYGLTF_NO_STB_IMAGE_WRITE and TinyGLTF::SetImageWriter(fxn, data)
-
-// Additionally, disable inclusion of STB header files entirely with
-// TINYGLTF_NO_INCLUDE_STB_IMAGE
-// TINYGLTF_NO_INCLUDE_STB_IMAGE_WRITE
-#include "tinygltf/tiny_gltf.h"
-
-
-// TODO: includes inherited from dae loader. Validate / prune
-
-#include "llsdserialize.h"
-#include "lljoint.h"
-
-#include "llmatrix4a.h"
-
-#include <boost/regex.hpp>
-#include <boost/algorithm/string/replace.hpp>
-
-static const std::string lod_suffix[LLModel::NUM_LODS] =
-{
- "_LOD0",
- "_LOD1",
- "_LOD2",
- "",
- "_PHYS",
-};
-
-
-LLGLTFLoader::LLGLTFLoader(std::string filename,
- S32 lod,
- LLModelLoader::load_callback_t load_cb,
- LLModelLoader::joint_lookup_func_t joint_lookup_func,
- LLModelLoader::texture_load_func_t texture_load_func,
- LLModelLoader::state_callback_t state_cb,
- void * opaque_userdata,
- JointTransformMap & jointTransformMap,
- JointNameSet & jointsFromNodes,
- std::map<std::string, std::string> &jointAliasMap,
- U32 maxJointsPerMesh,
- U32 modelLimit) //,
- //bool preprocess)
- : LLModelLoader( filename,
- lod,
- load_cb,
- joint_lookup_func,
- texture_load_func,
- state_cb,
- opaque_userdata,
- jointTransformMap,
- jointsFromNodes,
- jointAliasMap,
- maxJointsPerMesh ),
- //mPreprocessGLTF(preprocess),
- mMeshesLoaded(false),
- mMaterialsLoaded(false)
-{
-}
-
-LLGLTFLoader::~LLGLTFLoader() {}
-
-bool LLGLTFLoader::OpenFile(const std::string &filename)
-{
- tinygltf::TinyGLTF loader;
- std::string error_msg;
- std::string warn_msg;
- std::string filename_lc(filename);
- LLStringUtil::toLower(filename_lc);
-
- // Load a tinygltf model fom a file. Assumes that the input filename has already been
- // been sanitized to one of (.gltf , .glb) extensions, so does a simple find to distinguish.
- if (std::string::npos == filename_lc.rfind(".gltf"))
- { // file is binary
- mGltfLoaded = loader.LoadBinaryFromFile(&mGltfModel, &error_msg, &warn_msg, filename);
- }
- else
- { // file is ascii
- mGltfLoaded = loader.LoadASCIIFromFile(&mGltfModel, &error_msg, &warn_msg, filename);
- }
-
- if (!mGltfLoaded)
- {
- if (!warn_msg.empty())
- LL_WARNS("GLTF_IMPORT") << "gltf load warning: " << warn_msg.c_str() << LL_ENDL;
- if (!error_msg.empty())
- LL_WARNS("GLTF_IMPORT") << "gltf load error: " << error_msg.c_str() << LL_ENDL;
- return false;
- }
-
- mMeshesLoaded = parseMeshes();
- if (mMeshesLoaded) uploadMeshes();
-
- mMaterialsLoaded = parseMaterials();
- if (mMaterialsLoaded) uploadMaterials();
-
- return (mMeshesLoaded || mMaterialsLoaded);
-}
-
-bool LLGLTFLoader::parseMeshes()
-{
- if (!mGltfLoaded) return false;
-
- // 2022-04 DJH Volume params from dae example. TODO understand PCODE
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
-
- for (tinygltf::Mesh mesh : mGltfModel.meshes)
- {
- LLModel *pModel = new LLModel(volume_params, 0.f);
-
- if (populateModelFromMesh(pModel, mesh) &&
- (LLModel::NO_ERRORS == pModel->getStatus()) &&
- validate_model(pModel))
- {
- mModelList.push_back(pModel);
- }
- else
- {
- setLoadState(ERROR_MODEL + pModel->getStatus());
- delete(pModel);
- return false;
- }
- }
- return true;
-}
-
-bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const tinygltf::Mesh &mesh)
-{
- pModel->mLabel = mesh.name;
- int pos_idx;
- tinygltf::Accessor indices_a, positions_a, normals_a, uv0_a, color0_a;
-
- auto prims = mesh.primitives;
- for (auto prim : prims)
- {
- if (prim.indices >= 0) indices_a = mGltfModel.accessors[prim.indices];
-
- pos_idx = (prim.attributes.count("POSITION") > 0) ? prim.attributes.at("POSITION") : -1;
- if (pos_idx >= 0)
- {
- positions_a = mGltfModel.accessors[pos_idx];
- if (TINYGLTF_COMPONENT_TYPE_FLOAT != positions_a.componentType)
- continue;
- auto positions_bv = mGltfModel.bufferViews[positions_a.bufferView];
- auto positions_buf = mGltfModel.buffers[positions_bv.buffer];
- //auto type = positions_vb.
- //if (positions_buf.name
- }
-
-#if 0
- int norm_idx, tan_idx, uv0_idx, uv1_idx, color0_idx, color1_idx;
- norm_idx = (prim.attributes.count("NORMAL") > 0) ? prim.attributes.at("NORMAL") : -1;
- tan_idx = (prim.attributes.count("TANGENT") > 0) ? prim.attributes.at("TANGENT") : -1;
- uv0_idx = (prim.attributes.count("TEXCOORDS_0") > 0) ? prim.attributes.at("TEXCOORDS_0") : -1;
- uv1_idx = (prim.attributes.count("TEXCOORDS_1") > 0) ? prim.attributes.at("TEXCOORDS_1") : -1;
- color0_idx = (prim.attributes.count("COLOR_0") > 0) ? prim.attributes.at("COLOR_0") : -1;
- color1_idx = (prim.attributes.count("COLOR_1") > 0) ? prim.attributes.at("COLOR_1") : -1;
-#endif
-
- if (prim.mode == TINYGLTF_MODE_TRIANGLES)
- {
- //auto pos = mesh. TODO resume here DJH 2022-04
- }
- }
-
- //pModel->addFace()
- return false;
-}
-
-bool LLGLTFLoader::parseMaterials()
-{
- if (!mGltfLoaded) return false;
-
- // fill local texture data structures
- mSamplers.clear();
- for (auto in_sampler : mGltfModel.samplers)
- {
- gltf_sampler sampler;
- sampler.magFilter = in_sampler.magFilter > 0 ? in_sampler.magFilter : GL_LINEAR;
- sampler.minFilter = in_sampler.minFilter > 0 ? in_sampler.minFilter : GL_LINEAR;;
- sampler.wrapS = in_sampler.wrapS;
- sampler.wrapT = in_sampler.wrapT;
- sampler.name = in_sampler.name; // unused
- mSamplers.push_back(sampler);
- }
-
- mImages.clear();
- for (auto in_image : mGltfModel.images)
- {
- gltf_image image;
- image.numChannels = in_image.component;
- image.bytesPerChannel = in_image.bits >> 3; // Convert bits to bytes
- image.pixelType = in_image.pixel_type; // Maps exactly, i.e. TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE == GL_UNSIGNED_BYTE, etc
- image.size = static_cast<U32>(in_image.image.size());
- image.height = in_image.height;
- image.width = in_image.width;
- image.data = in_image.image.data();
-
- if (in_image.as_is)
- {
- LL_WARNS("GLTF_IMPORT") << "Unsupported image encoding" << LL_ENDL;
- return false;
- }
-
- if (image.size != image.height * image.width * image.numChannels * image.bytesPerChannel)
- {
- LL_WARNS("GLTF_IMPORT") << "Image size error" << LL_ENDL;
- return false;
- }
-
- mImages.push_back(image);
- }
-
- mTextures.clear();
- for (auto in_tex : mGltfModel.textures)
- {
- gltf_texture tex;
- tex.imageIdx = in_tex.source;
- tex.samplerIdx = in_tex.sampler;
- tex.imageUuid.setNull();
-
- if (tex.imageIdx >= mImages.size() || tex.samplerIdx >= mSamplers.size())
- {
- LL_WARNS("GLTF_IMPORT") << "Texture sampler/image index error" << LL_ENDL;
- return false;
- }
-
- mTextures.push_back(tex);
- }
-
- // parse each material
- for (tinygltf::Material gltf_material : mGltfModel.materials)
- {
- gltf_render_material mat;
- mat.name = gltf_material.name;
-
- tinygltf::PbrMetallicRoughness& pbr = gltf_material.pbrMetallicRoughness;
- mat.hasPBR = true; // Always true, for now
-
- mat.baseColor.set(pbr.baseColorFactor.data());
- mat.hasBaseTex = pbr.baseColorTexture.index >= 0;
- mat.baseColorTexIdx = pbr.baseColorTexture.index;
- mat.baseColorTexCoords = pbr.baseColorTexture.texCoord;
-
- mat.metalness = pbr.metallicFactor;
- mat.roughness = pbr.roughnessFactor;
- mat.hasMRTex = pbr.metallicRoughnessTexture.index >= 0;
- mat.metalRoughTexIdx = pbr.metallicRoughnessTexture.index;
- mat.metalRoughTexCoords = pbr.metallicRoughnessTexture.texCoord;
-
- mat.normalScale = gltf_material.normalTexture.scale;
- mat.hasNormalTex = gltf_material.normalTexture.index >= 0;
- mat.normalTexIdx = gltf_material.normalTexture.index;
- mat.normalTexCoords = gltf_material.normalTexture.texCoord;
-
- mat.occlusionScale = gltf_material.occlusionTexture.strength;
- mat.hasOcclusionTex = gltf_material.occlusionTexture.index >= 0;
- mat.occlusionTexIdx = gltf_material.occlusionTexture.index;
- mat.occlusionTexCoords = gltf_material.occlusionTexture.texCoord;
-
- mat.emissiveColor.set(gltf_material.emissiveFactor.data());
- mat.hasEmissiveTex = gltf_material.emissiveTexture.index >= 0;
- mat.emissiveTexIdx = gltf_material.emissiveTexture.index;
- mat.emissiveTexCoords = gltf_material.emissiveTexture.texCoord;
-
- mat.alphaMode = gltf_material.alphaMode;
- mat.alphaMask = gltf_material.alphaCutoff;
-
- if ((mat.hasNormalTex && (mat.normalTexIdx >= mTextures.size())) ||
- (mat.hasOcclusionTex && (mat.occlusionTexIdx >= mTextures.size())) ||
- (mat.hasEmissiveTex && (mat.emissiveTexIdx >= mTextures.size())) ||
- (mat.hasBaseTex && (mat.baseColorTexIdx >= mTextures.size())) ||
- (mat.hasMRTex && (mat.metalRoughTexIdx >= mTextures.size())))
- {
- LL_WARNS("GLTF_IMPORT") << "Texture resource index error" << LL_ENDL;
- return false;
- }
-
- if ((mat.hasNormalTex && (mat.normalTexCoords > 2)) || // mesh can have up to 3 sets of UV
- (mat.hasOcclusionTex && (mat.occlusionTexCoords > 2)) ||
- (mat.hasEmissiveTex && (mat.emissiveTexCoords > 2)) ||
- (mat.hasBaseTex && (mat.baseColorTexCoords > 2)) ||
- (mat.hasMRTex && (mat.metalRoughTexCoords > 2)))
- {
- LL_WARNS("GLTF_IMPORT") << "Image texcoord index error" << LL_ENDL;
- return false;
- }
-
- mMaterials.push_back(mat);
- }
-
- return true;
-}
-
-// TODO: convert raw vertex buffers to UUIDs
-void LLGLTFLoader::uploadMeshes()
-{
- llassert(0);
-}
-
-// convert raw image buffers to texture UUIDs & assemble into a render material
-void LLGLTFLoader::uploadMaterials()
-{
- for (gltf_render_material mat : mMaterials) // Initially 1 material per gltf file, but design for multiple
- {
- if (mat.hasBaseTex)
- {
- gltf_texture& gtex = mTextures[mat.baseColorTexIdx];
- if (gtex.imageUuid.isNull())
- {
- gtex.imageUuid = imageBufferToTextureUUID(gtex);
- }
- }
-
- if (mat.hasMRTex)
- {
- gltf_texture& gtex = mTextures[mat.metalRoughTexIdx];
- if (gtex.imageUuid.isNull())
- {
- gtex.imageUuid = imageBufferToTextureUUID(gtex);
- }
- }
-
- if (mat.hasNormalTex)
- {
- gltf_texture& gtex = mTextures[mat.normalTexIdx];
- if (gtex.imageUuid.isNull())
- {
- gtex.imageUuid = imageBufferToTextureUUID(gtex);
- }
- }
-
- if (mat.hasOcclusionTex)
- {
- gltf_texture& gtex = mTextures[mat.occlusionTexIdx];
- if (gtex.imageUuid.isNull())
- {
- gtex.imageUuid = imageBufferToTextureUUID(gtex);
- }
- }
-
- if (mat.hasEmissiveTex)
- {
- gltf_texture& gtex = mTextures[mat.emissiveTexIdx];
- if (gtex.imageUuid.isNull())
- {
- gtex.imageUuid = imageBufferToTextureUUID(gtex);
- }
- }
- }
-}
-
-LLUUID LLGLTFLoader::imageBufferToTextureUUID(const gltf_texture& tex)
-{
- //gltf_image& image = mImages[tex.imageIdx];
- //gltf_sampler& sampler = mSamplers[tex.samplerIdx];
-
- // fill an LLSD container with image+sampler data
-
- // upload texture
-
- // retrieve UUID
-
- return LLUUID::null;
-}
diff --git a/indra/llprimitive/llgltfloader.h b/indra/llprimitive/llgltfloader.h
deleted file mode 100644
index 66671d1c5a..0000000000
--- a/indra/llprimitive/llgltfloader.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * @file LLGLTFLoader.h
- * @brief LLGLTFLoader class definition
- *
- * $LicenseInfo:firstyear=2022&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2022, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLGLTFLoader_H
-#define LL_LLGLTFLoader_H
-
-#include "tinygltf/tiny_gltf.h"
-
-#include "llglheaders.h"
-#include "llmodelloader.h"
-
-// gltf_* structs are temporary, used to organize the subset of data that eventually goes into the material LLSD
-
-class gltf_sampler
-{
-public:
- // Uses GL enums
- S32 minFilter; // GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR or GL_LINEAR_MIPMAP_LINEAR
- S32 magFilter; // GL_NEAREST or GL_LINEAR
- S32 wrapS; // GL_CLAMP_TO_EDGE, GL_MIRRORED_REPEAT or GL_REPEAT
- S32 wrapT; // GL_CLAMP_TO_EDGE, GL_MIRRORED_REPEAT or GL_REPEAT
- //S32 wrapR; // Found in some sample files, but not part of glTF 2.0 spec. Ignored.
- std::string name; // optional, currently unused
- // extensions and extras are sampler optional fields that we don't support - at least initially
-};
-
-class gltf_image
-{
-public:// Note that glTF images are defined with row 0 at the top (opposite of OpenGL)
- U8* data; // ptr to decoded image data
- U32 size; // in bytes, regardless of channel width
- U32 width;
- U32 height;
- U32 numChannels; // range 1..4
- U32 bytesPerChannel; // converted from gltf "bits", expects only 8, 16 or 32 as input
- U32 pixelType; // one of (TINYGLTF_COMPONENT_TYPE)_UNSIGNED_BYTE, _UNSIGNED_SHORT, _UNSIGNED_INT, or _FLOAT
-};
-
-class gltf_texture
-{
-public:
- U32 imageIdx;
- U32 samplerIdx;
- LLUUID imageUuid = LLUUID::null;
-};
-
-class gltf_render_material
-{
-public:
- std::string name;
-
- // scalar values
- LLColor4 baseColor; // linear encoding. Multiplied with vertex color, if present.
- double metalness;
- double roughness;
- double normalScale; // scale applies only to X,Y components of normal
- double occlusionScale; // strength multiplier for occlusion
- LLColor4 emissiveColor; // emissive mulitiplier, assumed linear encoding (spec 2.0 is silent)
- std::string alphaMode; // "OPAQUE", "MASK" or "BLEND"
- double alphaMask; // alpha cut-off
-
- // textures
- U32 baseColorTexIdx; // always sRGB encoded
- U32 metalRoughTexIdx; // always linear, roughness in G channel, metalness in B channel
- U32 normalTexIdx; // linear, valid range R[0-1], G[0-1], B[0.5-1]. Normal = texel * 2 - vec3(1.0)
- U32 occlusionTexIdx; // linear, occlusion in R channel, 0 meaning fully occluded, 1 meaning not occluded
- U32 emissiveTexIdx; // always stored as sRGB, in nits (candela / meter^2)
-
- // texture coordinates
- U32 baseColorTexCoords;
- U32 metalRoughTexCoords;
- U32 normalTexCoords;
- U32 occlusionTexCoords;
- U32 emissiveTexCoords;
-
- // TODO: Add traditional (diffuse, normal, specular) UUIDs here, or add this struct to LL_TextureEntry??
-
- bool hasPBR;
- bool hasBaseTex, hasMRTex, hasNormalTex, hasOcclusionTex, hasEmissiveTex;
-
- // This field is populated after upload
- LLUUID material_uuid = LLUUID::null;
-
-};
-
-class gltf_mesh
-{
-public:
- std::string name;
-
- // TODO add mesh import DJH 2022-04
-
-};
-
-class LLGLTFLoader : public LLModelLoader
-{
- public:
- typedef std::map<std::string, LLImportMaterial> material_map;
-
- LLGLTFLoader(std::string filename,
- S32 lod,
- LLModelLoader::load_callback_t load_cb,
- LLModelLoader::joint_lookup_func_t joint_lookup_func,
- LLModelLoader::texture_load_func_t texture_load_func,
- LLModelLoader::state_callback_t state_cb,
- void * opaque_userdata,
- JointTransformMap & jointTransformMap,
- JointNameSet & jointsFromNodes,
- std::map<std::string, std::string> &jointAliasMap,
- U32 maxJointsPerMesh,
- U32 modelLimit); //,
- //bool preprocess );
- virtual ~LLGLTFLoader();
-
- virtual bool OpenFile(const std::string &filename);
-
-protected:
- tinygltf::Model mGltfModel;
- bool mGltfLoaded;
- bool mMeshesLoaded;
- bool mMaterialsLoaded;
-
- std::vector<gltf_mesh> mMeshes;
- std::vector<gltf_render_material> mMaterials;
-
- std::vector<gltf_texture> mTextures;
- std::vector<gltf_image> mImages;
- std::vector<gltf_sampler> mSamplers;
-
-private:
- bool parseMeshes();
- void uploadMeshes();
- bool parseMaterials();
- void uploadMaterials();
- bool populateModelFromMesh(LLModel* pModel, const tinygltf::Mesh &mesh);
- LLUUID imageBufferToTextureUUID(const gltf_texture& tex);
-
- // bool mPreprocessGLTF;
-
- /* Below inherited from dae loader - unknown if/how useful here
-
- void processElement(gltfElement *element, bool &badElement, GLTF *gltf);
- void processGltfModel(LLModel *model, GLTF *gltf, gltfElement *pRoot, gltfMesh *mesh, gltfSkin *skin);
-
- material_map getMaterials(LLModel *model, gltfInstance_geometry *instance_geo, GLTF *gltf);
- LLImportMaterial profileToMaterial(gltfProfile_COMMON *material, GLTF *gltf);
- LLColor4 getGltfColor(gltfElement *element);
-
- gltfElement *getChildFromElement(gltfElement *pElement, std::string const &name);
-
- bool isNodeAJoint(gltfNode *pNode);
- void processJointNode(gltfNode *pNode, std::map<std::string, LLMatrix4> &jointTransforms);
- void extractTranslation(gltfTranslate *pTranslate, LLMatrix4 &transform);
- void extractTranslationViaElement(gltfElement *pTranslateElement, LLMatrix4 &transform);
- void extractTranslationViaSID(gltfElement *pElement, LLMatrix4 &transform);
- void buildJointToNodeMappingFromScene(gltfElement *pRoot);
- void processJointToNodeMapping(gltfNode *pNode);
- void processChildJoints(gltfNode *pParentNode);
-
- bool verifyCount(int expected, int result);
-
- // Verify that a controller matches vertex counts
- bool verifyController(gltfController *pController);
-
- static bool addVolumeFacesFromGltfMesh(LLModel *model, gltfMesh *mesh, LLSD &log_msg);
- static bool createVolumeFacesFromGltfMesh(LLModel *model, gltfMesh *mesh);
-
- static LLModel *loadModelFromGltfMesh(gltfMesh *mesh);
-
- // Loads a mesh breaking it into one or more models as necessary
- // to get around volume face limitations while retaining >8 materials
- //
- bool loadModelsFromGltfMesh(gltfMesh *mesh, std::vector<LLModel *> &models_out, U32 submodel_limit);
-
- static std::string getElementLabel(gltfElement *element);
- static size_t getSuffixPosition(std::string label);
- static std::string getLodlessLabel(gltfElement *element);
-
- static std::string preprocessGLTF(std::string filename);
- */
-
-};
-#endif // LL_LLGLTFLLOADER_H
diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp
index cc4921416f..930222e3db 100644
--- a/indra/llprimitive/llgltfmaterial.cpp
+++ b/indra/llprimitive/llgltfmaterial.cpp
@@ -923,3 +923,34 @@ void LLGLTFMaterial::updateTextureTracking()
// setTEGLTFMaterialOverride is responsible for tracking
// for material overrides editor will set it
}
+
+void LLGLTFMaterial::convertTextureTransformToPBR(
+ F32 tex_scale_s,
+ F32 tex_scale_t,
+ F32 tex_offset_s,
+ F32 tex_offset_t,
+ F32 tex_rotation,
+ LLVector2& pbr_scale,
+ LLVector2& pbr_offset,
+ F32& pbr_rotation)
+{
+ pbr_scale.set(tex_scale_s, tex_scale_t);
+ pbr_rotation = -(tex_rotation) / 2.f;
+ const F32 adjusted_offset_s = tex_offset_s;
+ const F32 adjusted_offset_t = -tex_offset_t;
+ F32 center_adjust_s = 0.5f * (1.0f - tex_scale_s);
+ F32 center_adjust_t = 0.5f * (1.0f - tex_scale_t);
+
+ if (pbr_rotation != 0.0f)
+ {
+ const F32 c = cosf(pbr_rotation);
+ const F32 s = sinf(pbr_rotation);
+ const F32 tmp_s = center_adjust_s * c - center_adjust_t * s;
+ const F32 tmp_t = center_adjust_s * s + center_adjust_t * c;
+ center_adjust_s = tmp_s;
+ center_adjust_t = tmp_t;
+ }
+
+ pbr_offset.set(adjusted_offset_s + center_adjust_s,
+ adjusted_offset_t + center_adjust_t);
+}
diff --git a/indra/llprimitive/llgltfmaterial.h b/indra/llprimitive/llgltfmaterial.h
index b89853c9fd..6bb021254b 100644
--- a/indra/llprimitive/llgltfmaterial.h
+++ b/indra/llprimitive/llgltfmaterial.h
@@ -215,6 +215,14 @@ public:
bool hasLocalTextures() { return !mTrackingIdToLocalTexture.empty(); }
virtual bool replaceLocalTexture(const LLUUID& tracking_id, const LLUUID &old_id, const LLUUID& new_id);
virtual void updateTextureTracking();
+
+ // Convert legacy TE transform values to PBR transform values.
+ static void convertTextureTransformToPBR(F32 tex_scale_s, F32 tex_scale_t,
+ F32 tex_offset_s, F32 tex_offset_t,
+ F32 tex_rotation,
+ LLVector2& pbr_scale,
+ LLVector2& pbr_offset,
+ F32& pbr_rotation);
protected:
static LLVector2 vec2FromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const LLVector2& default_value);
static F32 floatFromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const F32 default_value);
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 6b4bb3a8b0..db752411fc 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -66,7 +66,12 @@ LLModel::~LLModel()
{
if (mDecompID >= 0)
{
- LLConvexDecomposition::getInstance()->deleteDecomposition(mDecompID);
+ // can be null on shutdown
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+ if (decomp)
+ {
+ decomp->deleteDecomposition(mDecompID);
+ }
}
mPhysics.mMesh.clear();
}
@@ -334,6 +339,162 @@ void LLModel::normalizeVolumeFaces()
}
}
+void LLModel::normalizeVolumeFacesAndWeights()
+{
+ if (!mVolumeFaces.empty())
+ {
+ LLVector4a min, max;
+
+ // For all of the volume faces
+ // in the model, loop over
+ // them and see what the extents
+ // of the volume along each axis.
+ min = mVolumeFaces[0].mExtents[0];
+ max = mVolumeFaces[0].mExtents[1];
+
+ for (U32 i = 1; i < mVolumeFaces.size(); ++i)
+ {
+ LLVolumeFace& face = mVolumeFaces[i];
+
+ update_min_max(min, max, face.mExtents[0]);
+ update_min_max(min, max, face.mExtents[1]);
+
+ if (face.mTexCoords)
+ {
+ LLVector2& min_tc = face.mTexCoordExtents[0];
+ LLVector2& max_tc = face.mTexCoordExtents[1];
+
+ min_tc = face.mTexCoords[0];
+ max_tc = face.mTexCoords[0];
+
+ for (S32 j = 1; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_tc, max_tc, face.mTexCoords[j]);
+ }
+ }
+ else
+ {
+ face.mTexCoordExtents[0].set(0, 0);
+ face.mTexCoordExtents[1].set(1, 1);
+ }
+ }
+
+ // Now that we have the extents of the model
+ // we can compute the offset needed to center
+ // the model at the origin.
+
+ // Compute center of the model
+ // and make it negative to get translation
+ // needed to center at origin.
+ LLVector4a trans;
+ trans.setAdd(min, max);
+ trans.mul(-0.5f);
+
+ // Compute the total size along all
+ // axes of the model.
+ LLVector4a size;
+ size.setSub(max, min);
+
+ // Prevent division by zero.
+ F32 x = size[0];
+ F32 y = size[1];
+ F32 z = size[2];
+ F32 w = size[3];
+ if (fabs(x) < F_APPROXIMATELY_ZERO)
+ {
+ x = 1.0;
+ }
+ if (fabs(y) < F_APPROXIMATELY_ZERO)
+ {
+ y = 1.0;
+ }
+ if (fabs(z) < F_APPROXIMATELY_ZERO)
+ {
+ z = 1.0;
+ }
+ size.set(x, y, z, w);
+
+ // Compute scale as reciprocal of size
+ LLVector4a scale;
+ scale.splat(1.f);
+ scale.div(size);
+
+ LLVector4a inv_scale(1.f);
+ inv_scale.div(scale);
+
+ for (U32 i = 0; i < mVolumeFaces.size(); ++i)
+ {
+ LLVolumeFace& face = mVolumeFaces[i];
+
+ // We shrink the extents so
+ // that they fall within
+ // the unit cube.
+ // VFExtents change
+ face.mExtents[0].add(trans);
+ face.mExtents[0].mul(scale);
+
+ face.mExtents[1].add(trans);
+ face.mExtents[1].mul(scale);
+
+ // For all the positions, we scale
+ // the positions to fit within the unit cube.
+ LLVector4a* pos = (LLVector4a*)face.mPositions;
+ LLVector4a* norm = (LLVector4a*)face.mNormals;
+ LLVector4a* t = (LLVector4a*)face.mTangents;
+
+ for (S32 j = 0; j < face.mNumVertices; ++j)
+ {
+ pos[j].add(trans);
+ pos[j].mul(scale);
+ if (norm && !norm[j].equals3(LLVector4a::getZero()))
+ {
+ norm[j].mul(inv_scale);
+ norm[j].normalize3();
+ }
+
+ if (t)
+ {
+ F32 w = t[j].getF32ptr()[3];
+ t[j].mul(inv_scale);
+ t[j].normalize3();
+ t[j].getF32ptr()[3] = w;
+ }
+ }
+ }
+
+ weight_map old_weights = mSkinWeights;
+ mSkinWeights.clear();
+ mPosition.clear();
+
+ for (auto& weights : old_weights)
+ {
+ LLVector4a pos(weights.first.mV[VX], weights.first.mV[VY], weights.first.mV[VZ]);
+ pos.add(trans);
+ pos.mul(scale);
+ LLVector3 scaled_pos(pos.getF32ptr());
+ mPosition.push_back(scaled_pos);
+ mSkinWeights[scaled_pos] = weights.second;
+ }
+
+ // mNormalizedScale is the scale at which
+ // we would need to multiply the model
+ // by to get the original size of the
+ // model instead of the normalized size.
+ LLVector4a normalized_scale;
+ normalized_scale.splat(1.f);
+ normalized_scale.div(scale);
+ mNormalizedScale.set(normalized_scale.getF32ptr());
+ mNormalizedTranslation.set(trans.getF32ptr());
+ mNormalizedTranslation *= -1.f;
+
+ // remember normalized scale so original dimensions can be recovered for mesh processing (i.e. tangent generation)
+ for (auto& face : mVolumeFaces)
+ {
+ face.mNormalizedScale = mNormalizedScale;
+ }
+ }
+}
+
void LLModel::getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out) const
{
scale_out = mNormalizedScale;
@@ -662,7 +823,7 @@ LLSD LLModel::writeModel(
bool upload_skin,
bool upload_joints,
bool lock_scale_if_joint_position,
- bool nowrite,
+ EWriteModelMode write_mode,
bool as_slm,
int submodel_id)
{
@@ -941,10 +1102,10 @@ LLSD LLModel::writeModel(
}
}
- return writeModelToStream(ostr, mdl, nowrite, as_slm);
+ return writeModelToStream(ostr, mdl, write_mode, as_slm);
}
-LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, bool nowrite, bool as_slm)
+LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, EWriteModelMode write_mode, bool as_slm)
{
std::string::size_type cur_offset = 0;
@@ -1006,7 +1167,11 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, bool nowrite, bo
}
}
- if (!nowrite)
+ if (write_mode == WRITE_HUMAN)
+ {
+ ostr << mdl;
+ }
+ else if (write_mode == WRITE_BINARY)
{
LLSDSerialize::toBinary(header, ostr);
@@ -1131,10 +1296,10 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)
}
void LLModel::setConvexHullDecomposition(
- const LLModel::convex_hull_decomposition& decomp)
+ const LLModel::convex_hull_decomposition& decomp, const std::vector<LLModel::PhysicsMesh>& decomp_mesh)
{
mPhysics.mHull = decomp;
- mPhysics.mMesh.clear();
+ mPhysics.mMesh = decomp_mesh;
updateHullCenters();
}
@@ -1561,11 +1726,21 @@ LLSD LLMeshSkinInfo::asLLSD(bool include_joints, bool lock_scale_if_joint_positi
{
ret["joint_names"][i] = mJointNames[i];
+ // For model to work at all there must be a matching bind matrix,
+ // so supply an indentity one if it isn't true
+ // Note: can build an actual bind matrix from joints
+ const LLMatrix4a& inv_bind = mInvBindMatrix.size() > i ? mInvBindMatrix[i] : LLMatrix4a::identity();
+ if (i >= mInvBindMatrix.size())
+ {
+ LL_WARNS("MESHSKININFO") << "Joint index " << i << " (" << mJointNames[i] << ") exceeds inverse bind matrix size "
+ << mInvBindMatrix.size() << LL_ENDL;
+ }
+
for (U32 j = 0; j < 4; j++)
{
for (U32 k = 0; k < 4; k++)
{
- ret["inverse_bind_matrix"][i][j*4+k] = mInvBindMatrix[i].mMatrix[j][k];
+ ret["inverse_bind_matrix"][i][j * 4 + k] = inv_bind.mMatrix[j][k];
}
}
}
@@ -1578,15 +1753,25 @@ LLSD LLMeshSkinInfo::asLLSD(bool include_joints, bool lock_scale_if_joint_positi
}
}
- if ( include_joints && mAlternateBindMatrix.size() > 0 )
+ // optional 'joint overrides'
+ if (include_joints && mAlternateBindMatrix.size() > 0)
{
for (U32 i = 0; i < mJointNames.size(); ++i)
{
+ // If there is not enough to match mJointNames,
+ // either supply no alternate matrixes at all or supply
+ // replacements
+ const LLMatrix4a& alt_bind = mAlternateBindMatrix.size() > i ? mAlternateBindMatrix[i] : LLMatrix4a::identity();
+ if (i >= mAlternateBindMatrix.size())
+ {
+ LL_WARNS("MESHSKININFO") << "Joint index " << i << " (" << mJointNames[i] << ") exceeds alternate bind matrix size "
+ << mAlternateBindMatrix.size() << LL_ENDL;
+ }
for (U32 j = 0; j < 4; j++)
{
for (U32 k = 0; k < 4; k++)
{
- ret["alt_inverse_bind_matrix"][i][j*4+k] = mAlternateBindMatrix[i].mMatrix[j][k];
+ ret["alt_inverse_bind_matrix"][i][j * 4 + k] = alt_bind.mMatrix[j][k];
}
}
}
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index 4b5d079b48..854c77e63a 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -162,6 +162,12 @@ public:
bool loadSkinInfo(LLSD& header, std::istream& is);
bool loadDecomposition(LLSD& header, std::istream& is);
+ enum EWriteModelMode
+ {
+ WRITE_NO = 0,
+ WRITE_BINARY,
+ WRITE_HUMAN,
+ };
static LLSD writeModel(
std::ostream& ostr,
LLModel* physics,
@@ -173,14 +179,14 @@ public:
bool upload_skin,
bool upload_joints,
bool lock_scale_if_joint_position,
- bool nowrite = false,
+ EWriteModelMode write_mode = WRITE_BINARY,
bool as_slm = false,
int submodel_id = 0);
static LLSD writeModelToStream(
std::ostream& ostr,
LLSD& mdl,
- bool nowrite = false, bool as_slm = false);
+ EWriteModelMode write_mode = WRITE_BINARY, bool as_slm = false);
void ClearFacesAndMaterials() { mVolumeFaces.clear(); mMaterialList.clear(); }
@@ -204,6 +210,7 @@ public:
void sortVolumeFacesByMaterialName();
void normalizeVolumeFaces();
+ void normalizeVolumeFacesAndWeights();
void trimVolumeFacesToSize(U32 new_count = LL_SCULPT_MESH_MAX_FACES, LLVolume::face_list_t* remainder = NULL);
void remapVolumeFaces();
void optimizeVolumeFaces();
@@ -300,7 +307,8 @@ public:
S32 mDecompID;
void setConvexHullDecomposition(
- const convex_hull_decomposition& decomp);
+ const convex_hull_decomposition& decomp,
+ const std::vector<LLModel::PhysicsMesh>& decomp_mesh);
void updateHullCenters();
LLVector3 mCenterOfHullCenters;
diff --git a/indra/llprimitive/llmodelloader.cpp b/indra/llprimitive/llmodelloader.cpp
index 84adec4da5..6ff62bc282 100644
--- a/indra/llprimitive/llmodelloader.cpp
+++ b/indra/llprimitive/llmodelloader.cpp
@@ -33,6 +33,7 @@
#include "llmatrix4a.h"
#include <boost/bind.hpp>
+#include <boost/exception/diagnostic_information.hpp>
std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList;
@@ -113,7 +114,9 @@ LLModelLoader::LLModelLoader(
JointTransformMap& jointTransformMap,
JointNameSet& jointsFromNodes,
JointMap& legalJointNamesMap,
- U32 maxJointsPerMesh)
+ U32 maxJointsPerMesh,
+ U32 modelLimit,
+ U32 debugMode)
: mJointList( jointTransformMap )
, mJointsFromNode( jointsFromNodes )
, LLThread("Model Loader")
@@ -121,7 +124,6 @@ LLModelLoader::LLModelLoader(
, mLod(lod)
, mTrySLM(false)
, mFirstTransform(true)
-, mNumOfFetchingTextures(0)
, mLoadCallback(load_cb)
, mJointLookupFunc(joint_lookup_func)
, mTextureLoadFunc(texture_load_func)
@@ -132,7 +134,10 @@ LLModelLoader::LLModelLoader(
, mNoNormalize(false)
, mNoOptimize(false)
, mCacheOnlyHitIfRigged(false)
+, mTexturesNeedScaling(false)
, mMaxJointsPerMesh(maxJointsPerMesh)
+, mGeneratedModelLimit(modelLimit)
+, mDebugMode(debugMode)
, mJointMap(legalJointNamesMap)
{
assert_main_thread();
@@ -149,7 +154,44 @@ LLModelLoader::~LLModelLoader()
void LLModelLoader::run()
{
mWarningsArray.clear();
- doLoadModel();
+ try
+ {
+ doLoadModel();
+ }
+ // Model loader isn't mission critical, so we just log all exceptions
+ catch (const LLException& e)
+ {
+ LL_WARNS("THREAD") << "LLException in model loader: " << e.what() << "" << LL_ENDL;
+ LLSD args;
+ args["Message"] = "UnknownException";
+ args["FILENAME"] = mFilename;
+ args["EXCEPTION"] = e.what();
+ mWarningsArray.append(args);
+ setLoadState(ERROR_PARSING);
+ }
+ catch (const std::exception& e)
+ {
+ LL_WARNS() << "Exception in LLModelLoader::run: " << e.what() << LL_ENDL;
+ LLSD args;
+ args["Message"] = "UnknownException";
+ args["FILENAME"] = mFilename;
+ args["EXCEPTION"] = e.what();
+ mWarningsArray.append(args);
+ setLoadState(ERROR_PARSING);
+ }
+ catch (...)
+ {
+ LOG_UNHANDLED_EXCEPTION("LLModelLoader");
+ LLSD args;
+ args["Message"] = "UnknownException";
+ args["FILENAME"] = mFilename;
+ args["EXCEPTION"] = boost::current_exception_diagnostic_information();
+ mWarningsArray.append(args);
+ setLoadState(ERROR_PARSING);
+ }
+
+ // todo: we are inside of a thread, push this into main thread worker,
+ // not into doOnIdleOneTime that laks tread safety
doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
}
@@ -201,7 +243,9 @@ bool LLModelLoader::doLoadModel()
}
}
- return OpenFile(mFilename);
+ bool res = OpenFile(mFilename);
+ dumpDebugData(); // conditional on mDebugMode
+ return res;
}
void LLModelLoader::setLoadState(U32 state)
@@ -466,6 +510,148 @@ bool LLModelLoader::isRigSuitableForJointPositionUpload( const std::vector<std::
return true;
}
+void LLModelLoader::dumpDebugData()
+{
+ if (mDebugMode == 0)
+ {
+ return;
+ }
+
+ std::string log_file = mFilename + "_importer.txt";
+ LLStringUtil::toLower(log_file);
+ llofstream file;
+ file.open(log_file.c_str());
+ if (!file)
+ {
+ LL_WARNS() << "dumpDebugData failed to open file " << log_file << LL_ENDL;
+ return;
+ }
+ file << "Importing: " << mFilename << "\n";
+
+ std::map<std::string, LLMatrix4a> inv_bind;
+ std::map<std::string, LLMatrix4a> alt_bind;
+ for (LLPointer<LLModel>& mdl : mModelList)
+ {
+
+ file << "Model name: " << mdl->mLabel << "\n";
+ const LLMeshSkinInfo& skin_info = mdl->mSkinInfo;
+ file << "Shape Bind matrix: " << skin_info.mBindShapeMatrix << "\n";
+ file << "Skin Weights count: " << (S32)mdl->mSkinWeights.size() << "\n";
+
+ // some objects might have individual bind matrices,
+ // but for now it isn't accounted for
+ size_t joint_count = skin_info.mJointNames.size();
+ for (size_t i = 0; i< joint_count;i++)
+ {
+ const std::string& joint = skin_info.mJointNames[i];
+ if (skin_info.mInvBindMatrix.size() > i)
+ {
+ inv_bind[joint] = skin_info.mInvBindMatrix[i];
+ }
+ if (skin_info.mAlternateBindMatrix.size() > i)
+ {
+ alt_bind[joint] = skin_info.mAlternateBindMatrix[i];
+ }
+ }
+ }
+
+ file << "\nInv Bind matrices.\n";
+ for (auto& bind : inv_bind)
+ {
+ file << "Joint: " << bind.first << " Matrix: " << bind.second << "\n";
+ }
+
+ file << "\nAlt Bind matrices.\n";
+ for (auto& bind : alt_bind)
+ {
+ file << "Joint: " << bind.first << " Matrix: " << bind.second << "\n";
+ }
+
+ if (mDebugMode == 2)
+ {
+ S32 model_count = 0;
+ for (LLPointer<LLModel>& mdl : mModelList)
+ {
+ const LLVolume::face_list_t &face_list = mdl->getVolumeFaces();
+ for (S32 face = 0; face < face_list.size(); face++)
+ {
+ const LLVolumeFace& vf = face_list[face];
+ file << "\nModel: " << mdl->mLabel
+ << " face " << face
+ << " has " << vf.mNumVertices
+ << " vertices and " << vf.mNumIndices
+ << " indices " << "\n";
+
+ file << "\nPositions for model: " << mdl->mLabel << " face " << face << "\n";
+
+ for (S32 pos = 0; pos < vf.mNumVertices; ++pos)
+ {
+ file << vf.mPositions[pos] << " ";
+ }
+
+ file << "\n\nIndices for model: " << mdl->mLabel << " face " << face << "\n";
+
+ for (S32 ind = 0; ind < vf.mNumIndices; ++ind)
+ {
+ file << vf.mIndices[ind] << " ";
+ }
+ }
+
+ file << "\n\nWeights for model: " << mdl->mLabel;
+ for (auto& weights : mdl->mSkinWeights)
+ {
+ file << "\nVertex: " << weights.first << " Weights: ";
+ for (auto& weight : weights.second)
+ {
+ file << weight.mJointIdx << ":" << weight.mWeight << " ";
+ }
+ }
+
+ file << "\n";
+ model_count++;
+ if (model_count == 5)
+ {
+ file << "Too many models, stopping at 5.\n";
+ break;
+ }
+ }
+ }
+ else if (mDebugMode > 2)
+ {
+ file << "\nModel LLSDs\n";
+ S32 model_count = 0;
+ // some files contain too many models, so stop at 5.
+ for (LLPointer<LLModel>& mdl : mModelList)
+ {
+ const LLMeshSkinInfo& skin_info = mdl->mSkinInfo;
+ size_t joint_count = skin_info.mJointNames.size();
+ size_t alt_count = skin_info.mAlternateBindMatrix.size();
+
+ LLModel::writeModel(
+ file,
+ nullptr,
+ mdl,
+ nullptr,
+ nullptr,
+ nullptr,
+ mdl->mPhysics,
+ joint_count > 0,
+ alt_count > 0,
+ false,
+ LLModel::WRITE_HUMAN,
+ false,
+ mdl->mSubmodelID);
+
+ file << "\n";
+ model_count++;
+ if (model_count == 5)
+ {
+ file << "Too many models, stopping at 5.\n";
+ break;
+ }
+ }
+ }
+}
//called in the main thread
void LLModelLoader::loadTextures()
@@ -484,7 +670,7 @@ void LLModelLoader::loadTextures()
if(!material.mDiffuseMapFilename.empty())
{
- mNumOfFetchingTextures += mTextureLoadFunc(material, mOpaqueData);
+ mTextureLoadFunc(material, mOpaqueData);
}
}
}
diff --git a/indra/llprimitive/llmodelloader.h b/indra/llprimitive/llmodelloader.h
index 530e61e2b8..335d809386 100644
--- a/indra/llprimitive/llmodelloader.h
+++ b/indra/llprimitive/llmodelloader.h
@@ -36,7 +36,7 @@ class LLJoint;
typedef std::map<std::string, LLMatrix4> JointTransformMap;
typedef std::map<std::string, LLMatrix4>::iterator JointTransformMapIt;
-typedef std::map<std::string, std::string> JointMap;
+typedef std::map<std::string, std::string, std::less<>> JointMap;
typedef std::deque<std::string> JointNameSet;
const S32 SLM_SUPPORTED_VERSION = 3;
@@ -109,8 +109,10 @@ public:
bool mTrySLM;
bool mCacheOnlyHitIfRigged; // ignore cached SLM if it does not contain rig info (and we want rig info)
+ bool mTexturesNeedScaling;
model_list mModelList;
+ // The scene is pretty much what ends up getting loaded for upload. Basically assign things to this guy if you want something uploaded.
scene mScene;
typedef std::queue<LLPointer<LLModel> > model_queue;
@@ -119,10 +121,16 @@ public:
model_queue mPhysicsQ;
//map of avatar joints as named in COLLADA assets to internal joint names
+ // Do not use this for anything other than looking up the name of a joint. This is populated elsewhere.
JointMap mJointMap;
+
+ // The joint list is what you want to use to actually setup the specific joint transformations.
JointTransformMap& mJointList;
JointNameSet& mJointsFromNode;
+
+
U32 mMaxJointsPerMesh;
+ U32 mDebugMode; // see dumDebugData() for details
LLModelLoader(
std::string filename,
@@ -135,7 +143,9 @@ public:
JointTransformMap& jointTransformMap,
JointNameSet& jointsFromNodes,
JointMap& legalJointNamesMap,
- U32 maxJointsPerMesh);
+ U32 maxJointsPerMesh,
+ U32 modelLimit,
+ U32 debugMode);
virtual ~LLModelLoader();
virtual void setNoNormalize() { mNoNormalize = true; }
@@ -161,9 +171,6 @@ public:
void stretch_extents(const LLModel* model, const LLMatrix4& mat);
- S32 mNumOfFetchingTextures ; // updated in the main thread
- bool areTexturesReady() { return !mNumOfFetchingTextures; } // called in the main thread.
-
bool verifyCount( int expected, int result );
//Determines the viability of an asset to be used as an avatar rig (w or w/o joint upload caps)
@@ -192,6 +199,7 @@ public:
const LLSD logOut() const { return mWarningsArray; }
void clearLog() { mWarningsArray.clear(); }
+ void dumpDebugData();
protected:
@@ -203,6 +211,7 @@ protected:
bool mRigValidJointUpload;
U32 mLegacyRigFlags;
+ U32 mGeneratedModelLimit; // Attempt to limit amount of generated submodels
bool mNoNormalize;
bool mNoOptimize;
diff --git a/indra/llprimitive/object_flags.h b/indra/llprimitive/object_flags.h
index e2cdba072a..06e216ba49 100644
--- a/indra/llprimitive/object_flags.h
+++ b/indra/llprimitive/object_flags.h
@@ -57,16 +57,16 @@ const U32 FLAGS_CAMERA_SOURCE = (1U << 22);
//const U32 FLAGS_UNUSED_001 = (1U << 23); // was FLAGS_CAST_SHADOWS
-//const U32 FLAGS_UNUSED_002 = (1U << 24);
-//const U32 FLAGS_UNUSED_003 = (1U << 25);
-//const U32 FLAGS_UNUSED_004 = (1U << 26);
-//const U32 FLAGS_UNUSED_005 = (1U << 27);
+const U32 FLAGS_SERVER_AUTOPILOT = (1U << 24); // Update was for an agent AND that agent is being autopiloted from the server
+//const U32 FLAGS_UNUSED_002 = (1U << 25);
+//const U32 FLAGS_UNUSED_003 = (1U << 26);
+//const U32 FLAGS_UNUSED_004 = (1U << 27);
const U32 FLAGS_OBJECT_OWNER_MODIFY = (1U << 28);
const U32 FLAGS_TEMPORARY_ON_REZ = (1U << 29);
-//const U32 FLAGS_UNUSED_006 = (1U << 30); // was FLAGS_TEMPORARY
-//const U32 FLAGS_UNUSED_007 = (1U << 31); // was FLAGS_ZLIB_COMPRESSED
+//const U32 FLAGS_UNUSED_005 = (1U << 30); // was FLAGS_TEMPORARY
+//const U32 FLAGS_UNUSED_006 = (1U << 31); // was FLAGS_ZLIB_COMPRESSED
const U32 FLAGS_LOCAL = FLAGS_ANIM_SOURCE | FLAGS_CAMERA_SOURCE;
const U32 FLAGS_WORLD = FLAGS_USE_PHYSICS | FLAGS_PHANTOM | FLAGS_TEMPORARY_ON_REZ;
diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp
index 53691bafe2..c52f68d298 100644
--- a/indra/llrender/llcubemap.cpp
+++ b/indra/llrender/llcubemap.cpp
@@ -86,7 +86,10 @@ void LLCubeMap::initGL()
#endif
mImages[i]->setTarget(mTargets[i], LLTexUnit::TT_CUBE_MAP);
mRawImages[i] = new LLImageRaw(RESOLUTION, RESOLUTION, 4);
- mImages[i]->createGLTexture(0, mRawImages[i], texname);
+ if (!mImages[i]->createGLTexture(0, mRawImages[i], texname))
+ {
+ LL_WARNS() << "Failed to create GL texture for environment cubemap face " << i << LL_ENDL;
+ }
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_CUBE_MAP, texname);
mImages[i]->setAddressMode(LLTexUnit::TAM_CLAMP);
@@ -203,7 +206,10 @@ void LLCubeMap::initEnvironmentMap(const std::vector<LLPointer<LLImageRaw> >& ra
mImages[i] = new LLImageGL(resolution, resolution, components, true);
mImages[i]->setTarget(mTargets[i], LLTexUnit::TT_CUBE_MAP);
mRawImages[i] = rawimages[i];
- mImages[i]->createGLTexture(0, mRawImages[i], texname);
+ if (!mImages[i]->createGLTexture(0, mRawImages[i], texname))
+ {
+ LL_WARNS() << "Failed to create GL texture for environment cubemap face " << i << LL_ENDL;
+ }
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_CUBE_MAP, texname);
mImages[i]->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/llrender/llcubemaparray.cpp b/indra/llrender/llcubemaparray.cpp
index fb35e002df..e0a8782c33 100644
--- a/indra/llrender/llcubemaparray.cpp
+++ b/indra/llrender/llcubemaparray.cpp
@@ -114,6 +114,8 @@ LLCubeMapArray::LLCubeMapArray(LLCubeMapArray& lhs, U32 width, U32 count) : mTex
allocate(mWidth, lhs.mImage->getComponents(), count, lhs.mImage->getUseMipMaps(), lhs.mHDR);
// Copy each cubemap from the incoming array to the new array
+ // The call to glTexSubImage3D causes an INVALID OPERATION OpenGL error. For now we comment this..
+ /*
U32 min_count = std::min(count, lhs.mCount);
for (U32 i = 0; i < min_count * 6; ++i)
{
@@ -133,6 +135,7 @@ LLCubeMapArray::LLCubeMapArray(LLCubeMapArray& lhs, U32 width, U32 count) : mTex
glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, i, mWidth, mWidth, 1, components, GL_UNSIGNED_BYTE, scaled_image->getData());
}
}
+ */
}
LLCubeMapArray::~LLCubeMapArray()
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index 2d8b8a0fee..9d6773ac5b 100644
--- a/indra/llrender/llfontfreetype.cpp
+++ b/indra/llrender/llfontfreetype.cpp
@@ -32,7 +32,7 @@
// Freetype stuff
#include <ft2build.h>
#ifdef LL_WINDOWS
-#include <freetype2\freetype\ftsystem.h>
+#include <freetype/ftsystem.h>
#endif
#include "llfontfreetypesvg.h"
@@ -58,9 +58,9 @@
FT_Render_Mode gFontRenderMode = FT_RENDER_MODE_NORMAL;
-LLFontManager *gFontManagerp = NULL;
+LLFontManager *gFontManagerp = nullptr;
-FT_Library gFTLibrary = NULL;
+FT_Library gFTLibrary = nullptr;
//static
void LLFontManager::initClass()
@@ -75,7 +75,7 @@ void LLFontManager::initClass()
void LLFontManager::cleanupClass()
{
delete gFontManagerp;
- gFontManagerp = NULL;
+ gFontManagerp = nullptr;
}
LLFontManager::LLFontManager()
@@ -103,6 +103,7 @@ LLFontManager::LLFontManager()
LLFontManager::~LLFontManager()
{
FT_Done_FreeType(gFTLibrary);
+ unloadAllFonts();
}
@@ -141,12 +142,8 @@ LLFontFreetype::LLFontFreetype()
mAscender(0.f),
mDescender(0.f),
mLineHeight(0.f),
-#ifdef LL_WINDOWS
- pFileStream(NULL),
- pFtStream(NULL),
-#endif
mIsFallback(false),
- mFTFace(NULL),
+ mFTFace(nullptr),
mRenderGlyphCount(0),
mStyle(0),
mPointSize(0)
@@ -159,35 +156,16 @@ LLFontFreetype::~LLFontFreetype()
// Clean up freetype libs.
if (mFTFace)
FT_Done_Face(mFTFace);
- mFTFace = NULL;
+ mFTFace = nullptr;
// Delete glyph info
std::for_each(mCharGlyphInfoMap.begin(), mCharGlyphInfoMap.end(), DeletePairedPointer());
mCharGlyphInfoMap.clear();
-#ifdef LL_WINDOWS
- delete pFileStream; // closed by FT_Done_Face
- delete pFtStream;
-#endif
delete mFontBitmapCachep;
// mFallbackFonts cleaned up by LLPointer destructor
}
-#ifdef LL_WINDOWS
-unsigned long ft_read_cb(FT_Stream stream, unsigned long offset, unsigned char *buffer, unsigned long count) {
- if (count <= 0) return count;
- llifstream *file_stream = static_cast<llifstream *>(stream->descriptor.pointer);
- file_stream->seekg(offset, std::ios::beg);
- file_stream->read((char*)buffer, count);
- return (unsigned long)file_stream->gcount();
-}
-
-void ft_close_cb(FT_Stream stream) {
- llifstream *file_stream = static_cast<llifstream *>(stream->descriptor.pointer);
- file_stream->close();
-}
-#endif
-
bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool is_fallback, S32 face_n)
{
// Don't leak face objects. This is also needed to deal with
@@ -195,26 +173,21 @@ bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v
if (mFTFace)
{
FT_Done_Face(mFTFace);
- mFTFace = NULL;
+ mFTFace = nullptr;
}
- int error;
-#ifdef LL_WINDOWS
- error = ftOpenFace(filename, face_n);
-#else
- error = FT_New_Face( gFTLibrary,
- filename.c_str(),
- 0,
- &mFTFace);
-#endif
+ FT_Open_Args openArgs;
+ memset( &openArgs, 0, sizeof( openArgs ) );
+ openArgs.memory_base = gFontManagerp->loadFont( filename, openArgs.memory_size );
+
+ if( !openArgs.memory_base )
+ return false;
+
+ openArgs.flags = FT_OPEN_MEMORY;
+ int error = FT_Open_Face( gFTLibrary, &openArgs, 0, &mFTFace );
if (error)
- {
-#ifdef LL_WINDOWS
- clearFontStreams();
-#endif
return false;
- }
mIsFallback = is_fallback;
F32 pixels_per_em = (point_size / 72.f)*vert_dpi; // Size in inches * dpi
@@ -229,10 +202,8 @@ bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v
{
// Clean up freetype libs.
FT_Done_Face(mFTFace);
-#ifdef LL_WINDOWS
- clearFontStreams();
-#endif
- mFTFace = NULL;
+
+ mFTFace = nullptr;
return false;
}
@@ -288,73 +259,30 @@ S32 LLFontFreetype::getNumFaces(const std::string& filename)
if (mFTFace)
{
FT_Done_Face(mFTFace);
- mFTFace = NULL;
+ mFTFace = nullptr;
}
S32 num_faces = 1;
-#ifdef LL_WINDOWS
- int error = ftOpenFace(filename, 0);
+ FT_Open_Args openArgs;
+ memset( &openArgs, 0, sizeof( openArgs ) );
+ openArgs.memory_base = gFontManagerp->loadFont( filename, openArgs.memory_size );
+ if( !openArgs.memory_base )
+ return 0;
+ openArgs.flags = FT_OPEN_MEMORY;
+ int error = FT_Open_Face( gFTLibrary, &openArgs, 0, &mFTFace );
if (error)
- {
return 0;
- }
else
- {
num_faces = mFTFace->num_faces;
- }
FT_Done_Face(mFTFace);
- clearFontStreams();
- mFTFace = NULL;
-#endif
+ mFTFace = nullptr;
return num_faces;
}
-#ifdef LL_WINDOWS
-S32 LLFontFreetype::ftOpenFace(const std::string& filename, S32 face_n)
-{
- S32 error = -1;
- pFileStream = new llifstream(filename, std::ios::binary);
- if (pFileStream->is_open())
- {
- std::streampos beg = pFileStream->tellg();
- pFileStream->seekg(0, std::ios::end);
- std::streampos end = pFileStream->tellg();
- std::size_t file_size = end - beg;
- pFileStream->seekg(0, std::ios::beg);
-
- pFtStream = new LLFT_Stream();
- pFtStream->base = 0;
- pFtStream->pos = 0;
- pFtStream->size = static_cast<unsigned long>(file_size);
- pFtStream->descriptor.pointer = pFileStream;
- pFtStream->read = ft_read_cb;
- pFtStream->close = ft_close_cb;
-
- FT_Open_Args args;
- args.flags = FT_OPEN_STREAM;
- args.stream = (FT_StreamRec*)pFtStream;
- error = FT_Open_Face(gFTLibrary, &args, face_n, &mFTFace);
- }
- return error;
-}
-
-void LLFontFreetype::clearFontStreams()
-{
- if (pFileStream)
- {
- pFileStream->close();
- }
- delete pFileStream;
- delete pFtStream;
- pFileStream = NULL;
- pFtStream = NULL;
-}
-#endif
-
void LLFontFreetype::addFallbackFont(const LLPointer<LLFontFreetype>& fallback_font,
const char_functor_t& functor)
{
@@ -378,7 +306,7 @@ F32 LLFontFreetype::getDescenderHeight() const
F32 LLFontFreetype::getXAdvance(llwchar wch) const
{
- if (mFTFace == NULL)
+ if (mFTFace == nullptr)
return 0.0;
// Return existing info only if it is current
@@ -402,7 +330,7 @@ F32 LLFontFreetype::getXAdvance(llwchar wch) const
F32 LLFontFreetype::getXAdvance(const LLFontGlyphInfo* glyph) const
{
- if (mFTFace == NULL)
+ if (mFTFace == nullptr)
return 0.0;
return glyph->mXAdvance;
@@ -410,7 +338,7 @@ F32 LLFontFreetype::getXAdvance(const LLFontGlyphInfo* glyph) const
F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const
{
- if (mFTFace == NULL)
+ if (mFTFace == nullptr)
return 0.0;
//llassert(!mIsFallback);
@@ -429,7 +357,7 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const
F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const
{
- if (mFTFace == NULL)
+ if (mFTFace == nullptr)
return 0.0;
U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0;
@@ -452,7 +380,7 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch, EFontGlyphType glyph_type
{
if (!mFTFace)
{
- return NULL;
+ return nullptr;
}
llassert(!mIsFallback);
@@ -543,14 +471,14 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch, EFontGlyphType glyph_type
{
return addGlyphFromFont(this, wch, glyph_index, glyph_type);
}
- return NULL;
+ return nullptr;
}
LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType requested_glyph_type) const
{
LL_PROFILE_ZONE_SCOPED;
- if (mFTFace == NULL)
- return NULL;
+ if (mFTFace == nullptr)
+ return nullptr;
llassert(!mIsFallback);
fontp->renderGlyph(requested_glyph_type, glyph_index, wch);
@@ -602,7 +530,7 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l
{
U8 *buffer_data = fontp->mFTFace->glyph->bitmap.buffer;
S32 buffer_row_stride = fontp->mFTFace->glyph->bitmap.pitch;
- U8 *tmp_graydata = NULL;
+ U8 *tmp_graydata = nullptr;
if (fontp->mFTFace->glyph->bitmap.pixel_mode
== FT_PIXEL_MODE_MONO)
@@ -656,7 +584,14 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l
LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_glyph_type, bitmap_num);
LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_glyph_type, bitmap_num);
- image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight());
+ if (image_gl && image_raw)
+ {
+ image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight());
+ }
+ else
+ {
+ llassert(false); //images were just inserted by nextOpenPos, they shouldn't be missing
+ }
return gi;
}
@@ -699,7 +634,7 @@ void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const
void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, llwchar wch) const
{
- if (mFTFace == NULL)
+ if (mFTFace == nullptr)
return;
FT_Int32 load_flags = FT_LOAD_FORCE_AUTOHINT;
@@ -840,7 +775,12 @@ bool LLFontFreetype::setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U1
{
LLImageRaw* image_raw = mFontBitmapCachep->getImageRaw(EFontGlyphType::Color, bitmap_num);
llassert(!mIsFallback);
- llassert(image_raw && (image_raw->getComponents() == 4));
+ if (!image_raw)
+ {
+ llassert(false);
+ return false;
+ }
+ llassert(image_raw->getComponents() == 4);
// NOTE: inspired by LLImageRaw::setSubImage()
U32* image_data = (U32*)image_raw->getData();
@@ -868,10 +808,17 @@ bool LLFontFreetype::setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U1
void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride) const
{
LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(EFontGlyphType::Grayscale, bitmap_num);
- LLImageDataLock lock(image_raw);
llassert(!mIsFallback);
- llassert(image_raw && (image_raw->getComponents() == 2));
+ if (!image_raw)
+ {
+ llassert(false);
+ return;
+ }
+
+ LLImageDataLock lock(image_raw);
+
+ llassert(image_raw->getComponents() == 2);
U8 *target = image_raw->getData();
llassert(target);
@@ -901,3 +848,58 @@ void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32
}
}
+
+namespace ll
+{
+ namespace fonts
+ {
+ class LoadedFont
+ {
+ public:
+ LoadedFont( std::string aName , std::string const &aAddress, std::size_t aSize )
+ : mAddress( aAddress )
+ {
+ mName = aName;
+ mSize = aSize;
+ mRefs = 1;
+ }
+ std::string mName;
+ std::string mAddress;
+ std::size_t mSize;
+ U32 mRefs;
+ };
+ }
+}
+
+U8 const* LLFontManager::loadFont( std::string const &aFilename, long &a_Size)
+{
+ a_Size = 0;
+ std::map< std::string, std::shared_ptr<ll::fonts::LoadedFont> >::iterator itr = m_LoadedFonts.find( aFilename );
+ if( itr != m_LoadedFonts.end() )
+ {
+ ++itr->second->mRefs;
+ // A possible overflow cannot happen here, as it is asserted that the size is less than std::numeric_limits<long>::max() a few lines below.
+ a_Size = static_cast<long>(itr->second->mSize);
+ return reinterpret_cast<U8 const*>(itr->second->mAddress.c_str());
+ }
+
+ auto strContent = LLFile::getContents(aFilename);
+
+ if( strContent.empty() )
+ return nullptr;
+
+ // For fontconfig a type of long is required, std::string::size() returns size_t. I think it is safe to limit this to 2GiB and not support fonts that huge (can that even be a thing?)
+ llassert_always( strContent.size() < std::numeric_limits<long>::max() );
+
+ a_Size = static_cast<long>(strContent.size());
+
+ auto pCache = std::make_shared<ll::fonts::LoadedFont>( aFilename, strContent, a_Size );
+ itr = m_LoadedFonts.insert( std::make_pair( aFilename, pCache ) ).first;
+
+ return reinterpret_cast<U8 const*>(itr->second->mAddress.c_str());
+}
+
+void LLFontManager::unloadAllFonts()
+{
+ m_LoadedFonts.clear();
+}
diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h
index 783bf4a4b3..a9b3a944ee 100644
--- a/indra/llrender/llfontfreetype.h
+++ b/indra/llrender/llfontfreetype.h
@@ -43,15 +43,28 @@ typedef struct FT_FaceRec_* LLFT_Face;
struct FT_StreamRec_;
typedef struct FT_StreamRec_ LLFT_Stream;
+namespace ll
+{
+ namespace fonts
+ {
+ class LoadedFont;
+ }
+}
+
class LLFontManager
{
public:
static void initClass();
static void cleanupClass();
+ U8 const *loadFont( std::string const &aFilename, long &a_Size );
+
private:
LLFontManager();
~LLFontManager();
+
+ void unloadAllFonts();
+ std::map< std::string, std::shared_ptr<ll::fonts::LoadedFont> > m_LoadedFonts;
};
struct LLFontGlyphInfo
@@ -90,11 +103,6 @@ public:
S32 getNumFaces(const std::string& filename);
-#ifdef LL_WINDOWS
- S32 ftOpenFace(const std::string& filename, S32 face_n);
- void clearFontStreams();
-#endif
-
typedef std::function<bool(llwchar)> char_functor_t;
void addFallbackFont(const LLPointer<LLFontFreetype>& fallback_font, const char_functor_t& functor = nullptr);
@@ -170,11 +178,6 @@ private:
LLFT_Face mFTFace;
-#ifdef LL_WINDOWS
- llifstream *pFileStream;
- LLFT_Stream *pFtStream;
-#endif
-
bool mIsFallback;
typedef std::pair<LLPointer<LLFontFreetype>, char_functor_t> fallback_font_t;
typedef std::vector<fallback_font_t> fallback_font_vector_t;
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 3b506d6965..b002d183ef 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -238,8 +238,6 @@ PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC wglBlitContextFramebufferAMD = n
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = nullptr;
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = nullptr;
-/*
-
// GL_VERSION_1_2
//PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements = nullptr;
//PFNGLTEXIMAGE3DPROC glTexImage3D = nullptr;
@@ -984,7 +982,6 @@ PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glMultiDrawArraysIndirectCount = nullpt
PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glMultiDrawElementsIndirectCount = nullptr;
PFNGLPOLYGONOFFSETCLAMPPROC glPolygonOffsetClamp = nullptr;
-*/
#endif
LLGLManager gGLManager;
@@ -1126,17 +1123,6 @@ bool LLGLManager::initGL()
if (mGLVersion >= 2.f)
{
parse_glsl_version(mGLSLVersionMajor, mGLSLVersionMinor);
-
-#if 0 && LL_DARWIN
- // TODO maybe switch to using a core profile for GL 3.2?
- // https://stackoverflow.com/a/19868861
- //never use GLSL greater than 1.20 on OSX
- if (mGLSLVersionMajor > 1 || mGLSLVersionMinor > 30)
- {
- mGLSLVersionMajor = 1;
- mGLSLVersionMinor = 30;
- }
-#endif
}
#if GL_VERSION_1_3
@@ -1233,28 +1219,9 @@ bool LLGLManager::initGL()
}
#endif
-#if LL_WINDOWS
- if (mVRAM < 256)
- {
- // Something likely went wrong using the above extensions
- // try WMI first and fall back to old method (from dxdiag) if all else fails
- // Function will check all GPUs WMI knows of and will pick up the one with most
- // memory. We need to check all GPUs because system can switch active GPU to
- // weaker one, to preserve power when not under load.
- U32 mem = LLDXHardware::getMBVideoMemoryViaWMI();
- if (mem != 0)
- {
- mVRAM = mem;
- LL_WARNS("RenderInit") << "VRAM Detected (WMI):" << mVRAM<< LL_ENDL;
- }
- }
-#endif
-
if (mVRAM < 256 && old_vram > 0)
{
// fall back to old method
- // Note: on Windows value will be from LLDXHardware.
- // Either received via dxdiag or via WMI by id from dxdiag.
mVRAM = old_vram;
}
@@ -1453,7 +1420,6 @@ void LLGLManager::initExtensions()
mInited = true;
-/*
#if LL_WINDOWS
LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;
@@ -2291,7 +2257,6 @@ void LLGLManager::initExtensions()
glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC)GLH_EXT_GET_PROC_ADDRESS("glPolygonOffsetClamp");
#endif
-*/
}
void rotate_quat(LLQuaternion& rotation)
@@ -2303,26 +2268,28 @@ void rotate_quat(LLQuaternion& rotation)
void flush_glerror()
{
+ if(!gDebugGL) return;
glGetError();
}
-//this function outputs gl error to the log file, does not crash the code.
-void log_glerror()
+void log_glerror(std::string comment)
{
+ if(!gDebugGL) return;
+
if (LL_UNLIKELY(!gGLManager.mInited))
{
return ;
}
- // Create or update texture to be used with this data
+
GLenum error;
error = glGetError();
- while (LL_UNLIKELY(error))
+ if (error != GL_NO_ERROR)
{
#if GLU_VERSION_1_1
GLubyte const * gl_error_msg = gluErrorString(error);
if (NULL != gl_error_msg)
{
- LL_WARNS() << "GL Error: " << error << " GL Error String: " << gl_error_msg << LL_ENDL ;
+ LL_WARNS() << "GL Error (" << comment << ")" << error << ": " << gl_error_msg << LL_ENDL;
}
else
#endif // GLU_VERSION_1_1
@@ -2331,7 +2298,6 @@ void log_glerror()
// you'll probably have to grep for the number in glext.h.
LL_WARNS() << "GL Error: UNKNOWN 0x" << std::hex << error << std::dec << LL_ENDL;
}
- error = glGetError();
}
}
@@ -2409,6 +2375,7 @@ void assert_glerror()
void clear_glerror()
{
+ if(!gDebugGL) return;
glGetError();
glGetError();
}
@@ -2770,7 +2737,7 @@ void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
if(cplane[2] < 0)
cplane *= -1;
- glm::mat4 suffix;
+ glm::mat4 suffix = glm::identity<glm::mat4>();
suffix = glm::row(suffix, 2, cplane);
glm::mat4 newP = suffix * P;
gGL.matrixMode(LLRender::MM_PROJECTION);
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index bf8368a7b3..130b06f9df 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -154,17 +154,20 @@ void rotate_quat(LLQuaternion& rotation);
void flush_glerror(); // Flush GL errors when we know we're handling them correctly.
-void log_glerror();
+void log_glerror(std::string comment);
void assert_glerror();
void clear_glerror();
-#if !LL_RELEASE_FOR_DOWNLOAD
-# define stop_glerror() assert_glerror()
-# define llglassertok() assert_glerror()
-# define STOP_GLERROR stop_glerror()
+//#if !LL_RELEASE_FOR_DOWNLOAD
+#if 1
+# define LOG_GLERROR(COMMENT) log_glerror(COMMENT)
+# define stop_glerror() log_glerror("stop")
+# define llglassertok() log_glerror("ASSERTOK")
+# define STOP_GLERROR log_glerror("STOP")
#else
+# define LOG_GLERROR(COMMENT)
# define stop_glerror()
# define llglassertok()
# define STOP_GLERROR
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 3d7bf500f1..39bd9cbfed 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -57,6 +57,7 @@ S32 LLGLSLShader::sIndexedTextureChannels = 0;
U32 LLGLSLShader::sMaxGLTFMaterials = 0;
U32 LLGLSLShader::sMaxGLTFNodes = 0;
bool LLGLSLShader::sProfileEnabled = false;
+bool LLGLSLShader::sCanProfile = true;
std::set<LLGLSLShader*> LLGLSLShader::sInstances;
LLGLSLShader::defines_map_t LLGLSLShader::sGlobalDefines;
U64 LLGLSLShader::sTotalTimeElapsed = 0;
@@ -273,7 +274,7 @@ void LLGLSLShader::placeProfileQuery(bool for_runtime)
bool LLGLSLShader::readProfileQuery(bool for_runtime, bool force_read)
{
- if (sProfileEnabled || for_runtime)
+ if ((sProfileEnabled || for_runtime) && sCanProfile)
{
if (!mProfilePending)
{
@@ -450,8 +451,11 @@ bool LLGLSLShader::createShader()
llassert_always(!mShaderFiles.empty());
#if LL_DARWIN
- // work-around missing mix(vec3,vec3,bvec3)
- mDefines["OLD_SELECT"] = "1";
+ if(!gGLManager.mIsApple)
+ {
+ // work-around missing mix(vec3,vec3,bvec3)
+ mDefines["OLD_SELECT"] = "1";
+ }
#endif
mShaderHash = hash();
@@ -572,7 +576,7 @@ bool LLGLSLShader::createShader()
}
}
-#ifdef LL_PROFILER_ENABLE_RENDER_DOC
+#if LL_PROFILER_ENABLE_RENDER_DOC
setLabel(mName.c_str());
#endif
@@ -1114,8 +1118,8 @@ void LLGLSLShader::bind()
void LLGLSLShader::bind(U8 variant)
{
- llassert(mGLTFVariants.size() == LLGLSLShader::NUM_GLTF_VARIANTS);
- llassert(variant < LLGLSLShader::NUM_GLTF_VARIANTS);
+ llassert_always(mGLTFVariants.size() == LLGLSLShader::NUM_GLTF_VARIANTS);
+ llassert_always(variant < LLGLSLShader::NUM_GLTF_VARIANTS);
mGLTFVariants[variant].bind();
}
@@ -1123,7 +1127,7 @@ void LLGLSLShader::bind(bool rigged)
{
if (rigged)
{
- llassert(mRiggedVariant);
+ llassert_always(mRiggedVariant);
mRiggedVariant->bind();
}
else
@@ -1190,22 +1194,22 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth,
return -1;
}
- uniform = getTextureChannel(uniform);
+ S32 channel = getTextureChannel(uniform);
- if (uniform > -1)
+ if (channel > -1)
{
if (depth) {
- gGL.getTexUnit(uniform)->bind(texture, true);
+ gGL.getTexUnit(channel)->bind(texture, true);
}
else {
bool has_mips = mode == LLTexUnit::TFO_TRILINEAR || mode == LLTexUnit::TFO_ANISOTROPIC;
- gGL.getTexUnit(uniform)->bindManual(texture->getUsage(), texture->getTexture(index), has_mips);
+ gGL.getTexUnit(channel)->bindManual(texture->getUsage(), texture->getTexture(index), has_mips);
}
- gGL.getTexUnit(uniform)->setTextureFilteringOption(mode);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(mode);
}
- return uniform;
+ return channel;
}
S32 LLGLSLShader::bindTexture(const std::string& uniform, LLRenderTarget* texture, bool depth, LLTexUnit::eTextureFilterOptions mode)
@@ -1285,23 +1289,40 @@ S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode)
llassert(false);
return -1;
}
+
S32 index = mTexture[uniform];
- if (index != -1 && gGL.getTexUnit(index)->getCurrType() != LLTexUnit::TT_NONE)
+ if (index < 0)
{
- if (gDebugGL && gGL.getTexUnit(index)->getCurrType() != mode)
+ // Invalid texture index - nothing to disable
+ return index;
+ }
+
+ LLTexUnit* tex_unit = gGL.getTexUnit(index);
+ if (!tex_unit)
+ {
+ // Invalid texture unit
+ LL_WARNS_ONCE("Shader") << "Invalid texture unit at index: " << index << LL_ENDL;
+ return index;
+ }
+
+ LLTexUnit::eTextureType curr_type = tex_unit->getCurrType();
+ if (curr_type != LLTexUnit::TT_NONE)
+ {
+ if (gDebugGL && curr_type != mode)
{
if (gDebugSession)
{
- gFailLog << "Texture channel " << index << " texture type corrupted." << std::endl;
+ gFailLog << "Texture channel " << index << " texture type corrupted. Expected: " << mode << ", Found: " << curr_type << std::endl;
ll_fail("LLGLSLShader::disableTexture failed");
}
else
{
- LL_ERRS() << "Texture channel " << index << " texture type corrupted." << LL_ENDL;
+ LL_ERRS() << "Texture channel " << index << " texture type corrupted. Expected: " << mode << ", Found: " << curr_type << LL_ENDL;
}
}
- gGL.getTexUnit(index)->disable();
+ tex_unit->disable();
}
+
return index;
}
@@ -2099,7 +2120,7 @@ LLUUID LLGLSLShader::hash()
return hash_obj.digest();
}
-#ifdef LL_PROFILER_ENABLE_RENDER_DOC
+#if LL_PROFILER_ENABLE_RENDER_DOC
void LLGLSLShader::setLabel(const char* label) {
LL_LABEL_OBJECT_GL(GL_PROGRAM, mProgramObject, strlen(label), label);
}
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 873ab0cff5..272a99aaa5 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -160,6 +160,7 @@ public:
static std::set<LLGLSLShader*> sInstances;
static bool sProfileEnabled;
+ static bool sCanProfile;
LLGLSLShader();
~LLGLSLShader();
@@ -361,7 +362,7 @@ public:
// hacky flag used for optimization in LLDrawPoolAlpha
bool mCanBindFast = false;
-#ifdef LL_PROFILER_ENABLE_RENDER_DOC
+#if LL_PROFILER_ENABLE_RENDER_DOC
void setLabel(const char* label);
#endif
@@ -381,7 +382,7 @@ extern LLGLSLShader gSolidColorProgram;
//Alpha mask shader (declared here so llappearance can access properly)
extern LLGLSLShader gAlphaMaskProgram;
-#ifdef LL_PROFILER_ENABLE_RENDER_DOC
+#if LL_PROFILER_ENABLE_RENDER_DOC
#define LL_SET_SHADER_LABEL(shader) shader.setLabel(#shader)
#else
#define LL_SET_SHADER_LABEL(shader, label)
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 0146ed3119..bc80bd9556 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -357,7 +357,10 @@ S32 LLImageGL::dataFormatBits(S32 dataformat)
case GL_BGRA: return 32; // Used for QuickTime media textures on the Mac
#endif
case GL_DEPTH_COMPONENT: return 24;
+ case GL_DEPTH_COMPONENT16: return 16;
case GL_DEPTH_COMPONENT24: return 24;
+ case GL_DEPTH_COMPONENT32: return 32;
+ case GL_RGBA16: return 64;
case GL_R16F: return 16;
case GL_RG16F: return 32;
case GL_RGB16F: return 48;
@@ -1149,6 +1152,8 @@ void sub_image_lines(U32 target, S32 miplevel, S32 x_offset, S32 y_offset, S32 w
// full width texture, do 32 lines at a time
for (U32 y_pos = y_offset; y_pos < y_offset_end; y_pos += batch_size)
{
+ // If this keeps crashing, pass down data_size, looks like it is using
+ // imageraw->getData(); for data, but goes way over allocated size limit
glTexSubImage2D(target, miplevel, x_offset, y_pos, width, batch_size, pixformat, pixtype, src);
src += line_width * batch_size;
}
@@ -1158,6 +1163,8 @@ void sub_image_lines(U32 target, S32 miplevel, S32 x_offset, S32 y_offset, S32 w
// partial width or strange height
for (U32 y_pos = y_offset; y_pos < y_offset_end; y_pos += 1)
{
+ // If this keeps crashing, pass down data_size, looks like it is using
+ // imageraw->getData(); for data, but goes way over allocated size limit
glTexSubImage2D(target, miplevel, x_offset, y_pos, width, 1, pixformat, pixtype, src);
src += line_width;
}
@@ -1290,7 +1297,7 @@ bool LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_
{
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height);
mGLTextureCreated = true;
- stop_glerror();
+ LOG_GLERROR("LLImageGL::setSubImageFromFrameBuffer()");
return true;
}
else
@@ -1632,6 +1639,7 @@ bool LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
llassert(mCurrentDiscardLevel >= 0);
discard_level = mCurrentDiscardLevel;
}
+ discard_level = llmin(discard_level, MAX_DISCARD_LEVEL);
// Actual image width/height = raw image width/height * 2^discard_level
S32 raw_w = imageraw->getWidth() ;
@@ -1738,6 +1746,7 @@ bool LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, bool data_
discard_level = mCurrentDiscardLevel;
}
discard_level = llclamp(discard_level, 0, (S32)mMaxDiscardLevel);
+ discard_level = llmin(discard_level, MAX_DISCARD_LEVEL);
if (main_thread // <--- always force creation of new_texname when not on main thread ...
&& !defer_copy // <--- ... or defer copy is set
@@ -1966,8 +1975,17 @@ bool LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, (GLint*)&glbytes);
if(!imageraw->allocateDataSize(width, height, ncomponents, glbytes))
{
- LL_WARNS() << "Memory allocation failed for reading back texture. Size is: " << glbytes << LL_ENDL ;
- LL_WARNS() << "width: " << width << "height: " << height << "components: " << ncomponents << LL_ENDL ;
+ constexpr S64 MAX_GL_BYTES = 2048 * 2048;
+ if (glbytes > 0 && glbytes <= MAX_GL_BYTES)
+ {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS() << "Memory allocation failed for reading back texture. Data size: " << glbytes << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS() << "Memory allocation failed for reading back texture. Data size is: " << glbytes << LL_ENDL;
+ LL_WARNS() << "width: " << width << "height: " << height << "components: " << ncomponents << LL_ENDL;
+ }
return false ;
}
@@ -1978,8 +1996,18 @@ bool LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
{
if(!imageraw->allocateDataSize(width, height, ncomponents))
{
- LL_WARNS() << "Memory allocation failed for reading back texture." << LL_ENDL ;
- LL_WARNS() << "width: " << width << "height: " << height << "components: " << ncomponents << LL_ENDL ;
+ constexpr F32 MAX_IMAGE_SIZE = 2048 * 2048;
+ F32 size = (F32)width * (F32)height * (F32)ncomponents;
+ if (size > 0 && size <= MAX_IMAGE_SIZE)
+ {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS() << "Memory allocation failed for reading back texture. Data size: " << size << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS() << "Memory allocation failed for reading back texture." << LL_ENDL;
+ LL_WARNS() << "width: " << width << "height: " << height << "components: " << ncomponents << LL_ENDL;
+ }
return false ;
}
@@ -2564,6 +2592,8 @@ bool LLImageGL::scaleDown(S32 desired_discard)
return false;
}
+ //LL_WARNS() << "scaleDown" << LL_ENDL;
+
S32 mip = desired_discard - mCurrentDiscardLevel;
S32 desired_width = getWidth(desired_discard);
@@ -2581,6 +2611,7 @@ bool LLImageGL::scaleDown(S32 desired_discard)
free_tex_image(mTexName);
glTexImage2D(mTarget, 0, mFormatInternal, desired_width, desired_height, 0, mFormatPrimary, mFormatType, nullptr);
glCopyTexSubImage2D(mTarget, 0, 0, 0, 0, 0, desired_width, desired_height);
+ LOG_GLERROR("LLImageGL::scaleDown() - glCopyTexSubImage2D");
alloc_tex_image(desired_width, desired_height, mFormatInternal, 1);
mTexOptionsDirty = true;
@@ -2590,6 +2621,7 @@ bool LLImageGL::scaleDown(S32 desired_discard)
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("scaleDown - glGenerateMipmap");
gGL.getTexUnit(0)->bind(this);
glGenerateMipmap(mTarget);
+ LOG_GLERROR("LLImageGL::scaleDown() - glGenerateMipmap");
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
}
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index cbb178b6f8..658947d531 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -124,7 +124,7 @@ static const GLenum sGLBlendFactor[] =
LLTexUnit::LLTexUnit(S32 index)
: mCurrTexType(TT_NONE),
- mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0),
+ mCurrTexture(0),
mHasMipMaps(false),
mIndex(index)
{
@@ -203,6 +203,7 @@ void LLTexUnit::bindFast(LLTexture* texture)
glActiveTexture(GL_TEXTURE0 + mIndex);
gGL.mCurrTextureUnitIndex = mIndex;
mCurrTexture = gl_tex->getTexName();
+ mCurrTexType = gl_tex->getTarget();
if (!mCurrTexture)
{
LL_PROFILE_ZONE_NAMED("MISSING TEXTURE");
@@ -213,6 +214,14 @@ void LLTexUnit::bindFast(LLTexture* texture)
}
glBindTexture(sGLTextureType[gl_tex->getTarget()], mCurrTexture);
mHasMipMaps = gl_tex->mHasMipMaps;
+/*
+ if (gl_tex->mTexOptionsDirty)
+ {
+ gl_tex->mTexOptionsDirty = false;
+ setTextureAddressModeFast(gl_tex->mAddressMode, gl_tex->getTarget());
+ setTextureFilteringOptionFast(gl_tex->mFilterOption, gl_tex->getTarget());
+ }
+*/
}
bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind)
@@ -467,11 +476,24 @@ void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode)
activate();
- glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]);
- glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_T, sGLAddressMode[mode]);
+/*
+ setTextureAddressModeFast(mode, mCurrTexType);
+}
+
+void LLTexUnit::setTextureAddressModeFast(eTextureAddressMode mode, eTextureType tex_type)
+{
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]);
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_WRAP_T, sGLAddressMode[mode]);
+ if (tex_type == TT_CUBE_MAP || tex_type == TT_CUBE_MAP_ARRAY || tex_type == TT_TEXTURE_3D)
+ {
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_WRAP_R, sGLAddressMode[mode]);
+ }
+*/
+ glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]);
+ glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_T, sGLAddressMode[mode]);
if (mCurrTexType == TT_CUBE_MAP)
{
- glTexParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, sGLAddressMode[mode]);
+ glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_R, sGLAddressMode[mode]);
}
}
@@ -479,41 +501,80 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio
{
if (mIndex < 0 || mCurrTexture == 0 || mCurrTexType == LLTexUnit::TT_MULTISAMPLE_TEXTURE) return;
+ GLenum target = sGLTextureType[mCurrTexType];
+
+ if (mCurrTexType == LLTexUnit::TT_NONE)
+ {
+ LL_WARNS() << "setTextureFilteringOption() Error: mCurrTexType==TT_NONE texture: " << mCurrTexture << LL_ENDL;
+ gGL.debugTexUnits();
+ }
+
gGL.flush();
+/*
+ setTextureFilteringOptionFast(option, mCurrTexType);
+}
+
+void LLTexUnit::setTextureFilteringOptionFast(LLTexUnit::eTextureFilterOptions option, eTextureType tex_type)
+{
+*/
if (option == TFO_POINT)
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+/*
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
else
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+*/
+ glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ }
+ else
+ {
+ glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
if (option >= TFO_TRILINEAR && mHasMipMaps)
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+/*
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+*/
+ glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
}
else if (option >= TFO_BILINEAR)
{
if (mHasMipMaps)
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+/*
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+ }
+ else
+ {
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+*/
+ glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
}
else
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
}
}
else
{
if (mHasMipMaps)
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+/*
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
}
else
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(sGLTextureType[tex_type], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+*/
+ glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+ }
+ else
+ {
+ glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
}
@@ -521,11 +582,20 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio
{
if (LLImageGL::sGlobalUseAnisotropic && option == TFO_ANISOTROPIC)
{
- glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, gGLManager.mMaxAnisotropy);
+/*
+ glTexParameterf(sGLTextureType[tex_type], GL_TEXTURE_MAX_ANISOTROPY, gGLManager.mMaxAnisotropy);
}
else
{
- glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f);
+ glTexParameterf(sGLTextureType[tex_type], GL_TEXTURE_MAX_ANISOTROPY, 1.f);
+*/
+ //glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, gGLManager.mMaxAnisotropy);
+ //We plan to add a setting. For now we stick to a low value.
+ glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, 4.0);
+ }
+ else
+ {
+ glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f);
}
}
}
@@ -610,30 +680,6 @@ GLint LLTexUnit::getTextureSourceType(eTextureBlendSrc src, bool isAlpha)
}
}
-void LLTexUnit::setColorScale(S32 scale)
-{
- if (mCurrColorScale != scale || gGL.mDirty)
- {
- mCurrColorScale = scale;
- gGL.flush();
-#if GL_VERSION_1_1
- glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale );
-#endif
- }
-}
-
-void LLTexUnit::setAlphaScale(S32 scale)
-{
- if (mCurrAlphaScale != scale || gGL.mDirty)
- {
- mCurrAlphaScale = scale;
- gGL.flush();
-#if GL_VERSION_1_1
- glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale );
-#endif
- }
-}
-
// Useful for debugging that you've manually assigned a texture operation to the correct
// texture unit based on the currently set active texture in opengl.
void LLTexUnit::debugTextureUnit(void)
@@ -908,13 +954,12 @@ bool LLRender::init(bool needs_vertex_buffer)
void LLRender::initVertexBuffer()
{
llassert_always(mBuffer.isNull());
- stop_glerror();
mBuffer = new LLVertexBuffer(immediate_mask);
- mBuffer->allocateBuffer(4096, 0);
+ mBuffer->allocateBuffer(16384, 0);
mBuffer->getVertexStrider(mVerticesp);
mBuffer->getTexCoord0Strider(mTexcoordsp);
mBuffer->getColorStrider(mColorsp);
- stop_glerror();
+ LOG_GLERROR("LLRender::initVertexBuffer()");
}
void LLRender::resetVertexBuffer()
@@ -1000,7 +1045,6 @@ void LLRender::syncLightState()
void LLRender::syncMatrices()
{
- STOP_GLERROR;
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
static const U32 name[] =
@@ -1145,7 +1189,7 @@ void LLRender::syncMatrices()
syncLightState();
}
}
- STOP_GLERROR;
+ LOG_GLERROR("LLRender::syncMatrices()");
}
void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
@@ -1299,9 +1343,7 @@ void LLRender::translateUI(F32 x, F32 y, F32 z)
LL_ERRS() << "Need to push a UI translation frame before offsetting" << LL_ENDL;
}
- mUIOffset.back().mV[0] += x;
- mUIOffset.back().mV[1] += y;
- mUIOffset.back().mV[2] += z;
+ mUIOffset.back().add(LLVector4a(x, y, z));
}
void LLRender::scaleUI(F32 x, F32 y, F32 z)
@@ -1311,14 +1353,14 @@ void LLRender::scaleUI(F32 x, F32 y, F32 z)
LL_ERRS() << "Need to push a UI transformation frame before scaling." << LL_ENDL;
}
- mUIScale.back().scaleVec(LLVector3(x,y,z));
+ mUIScale.back().mul(LLVector4a(x, y, z));
}
void LLRender::pushUIMatrix()
{
if (mUIOffset.empty())
{
- mUIOffset.emplace_back(0.f,0.f,0.f);
+ mUIOffset.emplace_back(0.f);
}
else
{
@@ -1327,7 +1369,7 @@ void LLRender::pushUIMatrix()
if (mUIScale.empty())
{
- mUIScale.emplace_back(1.f,1.f,1.f);
+ mUIScale.emplace_back(1.f);
}
else
{
@@ -1349,18 +1391,20 @@ LLVector3 LLRender::getUITranslation()
{
if (mUIOffset.empty())
{
- return LLVector3(0,0,0);
+ return LLVector3::zero;
}
- return mUIOffset.back();
+
+ return LLVector3(mUIOffset.back().getF32ptr());
}
LLVector3 LLRender::getUIScale()
{
if (mUIScale.empty())
{
- return LLVector3(1,1,1);
+ return LLVector3::all_one;
}
- return mUIScale.back();
+
+ return LLVector3(mUIScale.back().getF32ptr());
}
@@ -1370,8 +1414,9 @@ void LLRender::loadUIIdentity()
{
LL_ERRS() << "Need to push UI translation frame before clearing offset." << LL_ENDL;
}
- mUIOffset.back().setVec(0,0,0);
- mUIScale.back().setVec(1,1,1);
+
+ mUIOffset.back().clear();
+ mUIScale.back().splat(1);
}
void LLRender::setColorMask(bool writeColor, bool writeAlpha)
@@ -1555,7 +1600,7 @@ void LLRender::begin(const GLuint& mode)
mMode == LLRender::TRIANGLES ||
mMode == LLRender::POINTS)
{
- flush();
+ flush("LLRender::begin");
}
else if (mCount != 0)
{
@@ -1566,7 +1611,7 @@ void LLRender::begin(const GLuint& mode)
}
}
-void LLRender::end()
+void LLRender::end(std::string comment_)
{
if (mCount == 0)
{
@@ -1579,13 +1624,12 @@ void LLRender::end()
mMode != LLRender::POINTS) ||
mCount > 2048)
{
- flush();
+ flush("from end " + comment_);
}
}
-void LLRender::flush()
+void LLRender::flush(std::string comment_)
{
- STOP_GLERROR;
if (mCount > 0)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
@@ -1654,9 +1698,16 @@ void LLRender::flush()
}
resetStriders(count);
+
+ LOG_GLERROR("LLRender::flush() end " + comment_);
}
}
+void LLRender::flush()
+{
+ flush("");
+}
+
LLVertexBuffer* LLRender::bufferfromCache(U32 attribute_mask, U32 count)
{
LLVertexBuffer *vb = nullptr;
@@ -1751,9 +1802,11 @@ LLVertexBuffer* LLRender::genBuffer(U32 attribute_mask, S32 count)
vb->setColorData(mColorsp.get());
}
-#if LL_DARWIN
+ if(gGLManager.mIsApple && LLVertexBuffer::getVertexBufferMode() == 0)
+ {
vb->unmapBuffer();
-#endif
+ }
+
vb->unbind();
return vb;
@@ -1799,8 +1852,10 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
}
else
{
- LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.back()).scaledVec(mUIScale.back());
- mVerticesp[mCount].set(vert.mV[VX], vert.mV[VY], vert.mV[VZ]);
+ LLVector4a vert(x, y, z);
+ vert.add(mUIOffset.back());
+ vert.mul(mUIScale.back());
+ mVerticesp[mCount] = vert;
}
mCount++;
@@ -2026,7 +2081,8 @@ void LLRender::debugTexUnits(void)
std::string active_enabled = "false";
for (U32 i = 0; i < mTexUnits.size(); i++)
{
- if (getTexUnit(i)->mCurrTexType != LLTexUnit::TT_NONE)
+ //if (getTexUnit(i)->mCurrTexType != LLTexUnit::TT_NONE)
+ if(1)
{
if (i == mCurrTextureUnitIndex) active_enabled = "true";
LL_INFOS("TextureUnit") << "TexUnit: " << i << " Enabled" << LL_ENDL;
@@ -2044,8 +2100,19 @@ void LLRender::debugTexUnits(void)
case LLTexUnit::TT_CUBE_MAP:
LL_CONT << "Cube Map";
break;
+ case LLTexUnit::TT_CUBE_MAP_ARRAY:
+ LL_CONT << "Cube Map Array";
+ break;
+
+ case LLTexUnit::TT_MULTISAMPLE_TEXTURE:
+ LL_CONT << "Multisample Texture";
+ break;
+
+ case LLTexUnit::TT_TEXTURE_3D:
+ LL_CONT << "Texture 3D";
+ break;
default:
- LL_CONT << "ARGH!!! NONE!";
+ LL_CONT << "ARGH!!! NONE! -> type = " << getTexUnit(i)->mCurrTexType;
break;
}
LL_CONT << ", Texture Bound: " << getTexUnit(i)->mCurrTexture << LL_ENDL;
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 97c47bcae9..e6ae3baac6 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -44,6 +44,7 @@
#include "llglheaders.h"
#include "llmatrix4a.h"
#include "glm/mat4x4.hpp"
+#include <boost/align/aligned_allocator.hpp>
#include <array>
#include <list>
@@ -214,11 +215,19 @@ public:
// Warning: this stays set for the bound texture forever,
// make sure you want to permanently change the address mode for the bound texture.
void setTextureAddressMode(eTextureAddressMode mode);
+/*
+ // MUST already be active and bound
+ void setTextureAddressModeFast(eTextureAddressMode mode, eTextureType tex_type);
+*/
// Sets the filtering options used to sample the texture
// Warning: this stays set for the bound texture forever,
// make sure you want to permanently change the filtering for the bound texture.
void setTextureFilteringOption(LLTexUnit::eTextureFilterOptions option);
+/*
+ // MUST already be active and bound
+ void setTextureFilteringOptionFast(LLTexUnit::eTextureFilterOptions option, eTextureType tex_type);
+*/
static U32 getInternalType(eTextureType type);
@@ -234,13 +243,9 @@ protected:
S32 mIndex;
U32 mCurrTexture;
eTextureType mCurrTexType;
- S32 mCurrColorScale;
- S32 mCurrAlphaScale;
bool mHasMipMaps;
void debugTextureUnit(void);
- void setColorScale(S32 scale);
- void setAlphaScale(S32 scale);
GLint getTextureSource(eTextureBlendSrc src);
GLint getTextureSourceType(eTextureBlendSrc src, bool isAlpha = false);
};
@@ -421,6 +426,7 @@ public:
LLVector3 getUITranslation();
LLVector3 getUIScale();
+ void flush(std::string comment_);
void flush();
// if list is set, will store buffers in list for later use, if list isn't set, will use cache
@@ -428,7 +434,7 @@ public:
void endList();
void begin(const GLuint& mode);
- void end();
+ void end(std::string comment_ = "");
U8 getMode() const { return mMode; }
@@ -533,8 +539,8 @@ private:
eBlendFactor mCurrBlendAlphaSFactor;
eBlendFactor mCurrBlendAlphaDFactor;
- std::vector<LLVector3> mUIOffset;
- std::vector<LLVector3> mUIScale;
+ std::vector<LLVector4a, boost::alignment::aligned_allocator<LLVector4a, 16> > mUIOffset;
+ std::vector<LLVector4a, boost::alignment::aligned_allocator<LLVector4a, 16> > mUIScale;
};
extern F32 gGLModelView[16];
diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp
index 9144ce6d62..714df863cd 100644
--- a/indra/llrender/llrender2dutils.cpp
+++ b/indra/llrender/llrender2dutils.cpp
@@ -833,8 +833,7 @@ void gl_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& c
{
gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], color.mV[VALPHA]);
- gGL.flush();
- glLineWidth(2.5f);
+ LLRender2D::setLineWidth(2.5f);
gGL.begin(LLRender::LINES);
{
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 0e4aa2ee7a..ebdc609f94 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -158,6 +158,8 @@ void LLRenderTarget::setColorAttachment(LLImageGL* img, LLGLuint use_name)
llassert(mTex.empty()); // mTex must be empty with this mode (binding target should be done via LLImageGL)
llassert(!isBoundInStack());
+ U32 target = getTarget();
+
if (mFBO == 0)
{
glGenFramebuffers(1, (GLuint*)&mFBO);
@@ -174,14 +176,14 @@ void LLRenderTarget::setColorAttachment(LLImageGL* img, LLGLuint use_name)
mTex.push_back(use_name);
- glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ glBindFramebuffer(target, mFBO);
+ glFramebufferTexture2D(target, GL_COLOR_ATTACHMENT0,
LLTexUnit::getInternalType(mUsage), use_name, 0);
stop_glerror();
check_framebuffer_status();
- glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
+ glBindFramebuffer(target, sCurFBO);
}
void LLRenderTarget::releaseColorAttachment()
@@ -194,6 +196,7 @@ void LLRenderTarget::releaseColorAttachment()
glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, LLTexUnit::getInternalType(mUsage), 0, 0);
glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
+ LOG_GLERROR(mName + " releaseColorAttachment()");
mTex.clear();
}
@@ -208,6 +211,8 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
return true;
}
+ U32 target = getTarget();
+
U32 offset = static_cast<U32>(mTex.size());
if( offset >= 4 )
@@ -226,12 +231,76 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
LLImageGL::generateTextures(1, &tex);
gGL.getTexUnit(0)->bindManual(mUsage, tex);
- stop_glerror();
-
+ U32 miplevel = mMipLevels;
+ U32 intformat = color_fmt;
+ U32 pixformat = GL_RGBA;
+ U32 pixtype = GL_UNSIGNED_BYTE;
{
- clear_glerror();
- LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL, false);
+ //clear_glerror();
+
+ if(color_fmt == GL_RGB10_A2)
+ {
+ pixformat = GL_RGBA;
+ pixtype = GL_UNSIGNED_BYTE;
+ }
+ else if(color_fmt == GL_R11F_G11F_B10F)
+ {
+ pixformat = GL_RGB;
+ pixtype = GL_HALF_FLOAT;
+ }
+ else if(color_fmt == GL_R8)
+ {
+ pixformat = GL_RED;
+ pixtype = GL_UNSIGNED_BYTE;
+ }
+ else if(color_fmt == GL_R16F)
+ {
+ pixformat = GL_RED;
+ pixtype = GL_HALF_FLOAT;
+ }
+ else if(color_fmt == GL_RG16F)
+ {
+ pixformat = GL_RG;
+ pixtype = GL_HALF_FLOAT;
+ }
+ else if(color_fmt == GL_RGBA16F)
+ {
+ pixformat = GL_RGBA;
+ pixtype = GL_HALF_FLOAT;
+ }
+ else if(color_fmt == GL_RGB16F)
+ {
+ pixformat = GL_RGB;
+ pixtype = GL_HALF_FLOAT;
+ }
+ else if(color_fmt == GL_RGB8)
+ {
+ pixformat = GL_RGB;
+ pixtype = GL_UNSIGNED_BYTE;
+ }
+ else if(color_fmt == GL_RGB)
+ {
+ pixformat = GL_RGB;
+ pixtype = GL_UNSIGNED_BYTE;
+ }
+ else if(color_fmt == GL_RGBA)
+ {
+ pixformat = GL_RGBA;
+ pixtype = GL_UNSIGNED_BYTE;
+ }
+ else if(color_fmt == GL_RGBA8)
+ {
+ pixformat = GL_RGBA;
+ pixtype = GL_UNSIGNED_BYTE;
+ }
+ else
+ {
+ pixformat = GL_RGBA;
+ pixtype = GL_UNSIGNED_BYTE;
+ }
+
+ LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, pixformat, pixtype, NULL, false);
if (glGetError() != GL_NO_ERROR)
{
LL_WARNS() << "Could not allocate color buffer for render target." << LL_ENDL;
@@ -241,32 +310,29 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
sBytesAllocated += mResX*mResY*4;
- stop_glerror();
-
-
if (offset == 0)
{ //use bilinear filtering on single texture render targets that aren't multisampled
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- stop_glerror();
+ LOG_GLERROR(mName + " setting filtering to TFO_BILINEAR");
}
else
{ //don't filter data attachments
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- stop_glerror();
+ LOG_GLERROR(mName + " setting filtering to TFO_POINT");
}
#if GL_VERSION_3_1
if (mUsage != LLTexUnit::TT_RECT_TEXTURE)
{
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR);
- stop_glerror();
+ LOG_GLERROR(mName + " setting address mode to TAM_MIRROR");
}
else
#endif
{
// ATI doesn't support mirrored repeat for rectangular textures.
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
- stop_glerror();
+ LOG_GLERROR(mName + " setting address mode to TAM_CLAMP");
}
if (mFBO)
@@ -285,7 +351,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
if (gDebugGL)
{ //bind and unbind to validate target
- bindTarget();
+ bindTarget(mName, mMode);
flush();
}
@@ -300,8 +366,6 @@ bool LLRenderTarget::allocateDepth()
gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
U32 internal_type = LLTexUnit::getInternalType(mUsage);
- stop_glerror();
- clear_glerror();
LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL, false);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
@@ -309,7 +373,7 @@ bool LLRenderTarget::allocateDepth()
if (glGetError() != GL_NO_ERROR)
{
- LL_WARNS() << "Unable to allocate depth buffer for render target." << LL_ENDL;
+ LL_WARNS() << "Unable to allocate depth buffer for render target " << mName << LL_ENDL;
return false;
}
@@ -345,6 +409,8 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)
glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
+ LOG_GLERROR(mName + " shareDepthBuffer()");
+
target.mUseDepth = true;
}
}
@@ -408,19 +474,32 @@ void LLRenderTarget::release()
LLImageGL::deleteTextures(1, &mTex[0]);
}
+ LOG_GLERROR(mName + " release()");
+
mTex.clear();
mInternalFormat.clear();
mResX = mResY = 0;
}
-void LLRenderTarget::bindTarget()
+void LLRenderTarget::bindTarget(std::string name_, U32 mode_)
{
LL_PROFILE_GPU_ZONE("bindTarget");
llassert(mFBO);
llassert(!isBoundInStack());
- glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ //mode_ = 0;
+
+ mMode = mode_;
+ mName = name_;
+
+ U32 target = getTarget();
+
+ glBindFramebuffer(target, mFBO);
+ LOG_GLERROR(mName+" bindTarget()");
+
+ //attach();
+
sCurFBO = mFBO;
//setup multiple render targets
@@ -431,16 +510,32 @@ void LLRenderTarget::bindTarget()
if (mTex.empty())
{ //no color buffer to draw to
+ if(!mUseDepth) LL_WARNS() << mName << " HAS NO COLOR BUFFER AND NO DEPTH!!" << LL_ENDL;
GLenum buffers[] = {GL_NONE};
glDrawBuffers(0, buffers);
glReadBuffer(GL_NONE);
}
- else
+ else if(mMode == 0)
+ {
+ glDrawBuffers(static_cast<GLsizei>(mTex.size()), drawbuffers);
+ glReadBuffer(GL_COLOR_ATTACHMENT0);
+ LOG_GLERROR(mName+" read and write buffers");
+ }
+ else if(mMode == 1)
{
glDrawBuffers(static_cast<GLsizei>(mTex.size()), drawbuffers);
+ //glReadBuffer(GL_NONE);
+ LOG_GLERROR(mName+" draw buffer");
+ }
+ else if(mMode == 2)
+ {
+ //glDrawBuffer(GL_NONE);
glReadBuffer(GL_COLOR_ATTACHMENT0);
+ LOG_GLERROR(mName+" read buffer");
}
+
check_framebuffer_status();
+ LOG_GLERROR(mName+" checked status");
glViewport(0, 0, mResX, mResY);
sCurResX = mResX;
@@ -454,7 +549,9 @@ void LLRenderTarget::clear(U32 mask_in)
{
LL_PROFILE_GPU_ZONE("clear");
llassert(mFBO);
- U32 mask = GL_COLOR_BUFFER_BIT;
+ U32 mask = 0;
+
+ if(!mTex.empty()) mask |= GL_COLOR_BUFFER_BIT;
if (mUseDepth)
{
mask |= GL_DEPTH_BUFFER_BIT;
@@ -463,15 +560,14 @@ void LLRenderTarget::clear(U32 mask_in)
if (mFBO)
{
check_framebuffer_status();
- stop_glerror();
glClear(mask & mask_in);
- stop_glerror();
+ LOG_GLERROR(mName + "clear()");
}
else
{
LLGLEnable scissor(GL_SCISSOR_TEST);
glScissor(0, 0, mResX, mResY);
- stop_glerror();
+ LOG_GLERROR("");
glClear(mask & mask_in);
}
}
@@ -495,48 +591,44 @@ U32 LLRenderTarget::getNumTextures() const
void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilterOptions filter_options)
{
gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index), filter_options == LLTexUnit::TFO_TRILINEAR || filter_options == LLTexUnit::TFO_ANISOTROPIC);
-
- bool isSRGB = false;
- llassert(mInternalFormat.size() > index);
- switch (mInternalFormat[index])
- {
- case GL_SRGB:
- case GL_SRGB8:
-#if GL_VERSION_2_1
- case GL_SRGB_ALPHA:
-#endif
- case GL_SRGB8_ALPHA8:
- isSRGB = true;
- break;
-
- default:
- break;
- }
-
gGL.getTexUnit(channel)->setTextureFilteringOption(filter_options);
+
+ LOG_GLERROR(mName + " bindTexture()");
}
void LLRenderTarget::flush()
{
LL_PROFILE_GPU_ZONE("rt flush");
+
+ LOG_GLERROR(mName+" rt flush() A");
+
gGL.flush();
llassert(mFBO);
llassert(sCurFBO == mFBO);
llassert(sBoundTarget == this);
- if (mGenerateMipMaps == LLTexUnit::TMG_AUTO)
+ if (mGenerateMipMaps == LLTexUnit::TMG_AUTO && mMode != 2)
{
LL_PROFILE_GPU_ZONE("rt generate mipmaps");
- bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR);
+ //bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR);
+ bindTexture(0, 0, LLTexUnit::TFO_ANISOTROPIC);
glGenerateMipmap(GL_TEXTURE_2D);
+ LOG_GLERROR(mName + " glGenerateMipmap()");
}
+ LOG_GLERROR(mName + " rt flush() B");
+
+ unbind();
+}
+
+void LLRenderTarget::unbind()
+{
if (mPreviousRT)
{
// a bit hacky -- pop the RT stack back two frames and push
// the previous frame back on to play nice with the GL state machine
sBoundTarget = mPreviousRT->mPreviousRT;
- mPreviousRT->bindTarget();
+ mPreviousRT->bindTarget(mPreviousRT->mName, mPreviousRT->mMode);
}
else
{
@@ -547,9 +639,10 @@ void LLRenderTarget::flush()
sCurResX = gGLViewport[2];
sCurResY = gGLViewport[3];
glReadBuffer(GL_BACK);
- GLenum drawbuffers[] = {GL_BACK};
- glDrawBuffers(1, drawbuffers);
+ glDrawBuffer(GL_BACK);
}
+
+ LOG_GLERROR(mName + " rt unbind()");
}
bool LLRenderTarget::isComplete() const
@@ -604,3 +697,13 @@ void LLRenderTarget::swapFBORefs(LLRenderTarget& other)
std::swap(mFBO, other.mFBO);
std::swap(mTex, other.mTex);
}
+
+U32 LLRenderTarget::getTarget()
+{
+ U32 target = GL_FRAMEBUFFER;
+
+ if(mMode == 1) target = GL_DRAW_FRAMEBUFFER;
+ else if(mMode == 2) target = GL_READ_FRAMEBUFFER;
+
+ return target;
+}
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index cd3290cf66..ce3025f280 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -126,7 +126,7 @@ public:
// If an LLRenderTarget is currently bound, stores a reference to that LLRenderTarget
// and restores previous binding on flush() (maintains a stack of Render Targets)
// Asserts that this target is not currently bound in the stack
- void bindTarget();
+ void bindTarget(std::string name_ = "nd", U32 mode_ = 0);
//clear render targer, clears depth buffer if present,
//uses scissor rect if in copy-to-texture mode
@@ -158,6 +158,7 @@ public:
// If an LLRenderTarget was bound when bindTarget was called, binds that RenderTarget for rendering (maintains RT stack)
// asserts that this target is currently bound
void flush();
+ void unbind();
//Returns TRUE if target is ready to be rendered into.
//That is, if the target has been allocated with at least
@@ -174,11 +175,15 @@ public:
static LLRenderTarget* sBoundTarget;
+ U32 mMode;
+ std::string mName;
+
protected:
U32 mResX;
U32 mResY;
std::vector<U32> mTex;
std::vector<U32> mInternalFormat;
+ std::vector<U32> mPixFormat;
U32 mFBO;
LLRenderTarget* mPreviousRT = nullptr;
@@ -188,6 +193,10 @@ protected:
U32 mMipLevels;
LLTexUnit::eTextureType mUsage;
+
+private:
+ U32 getTarget();
+
};
#endif
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 4807c12226..ea8530f282 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -263,6 +263,7 @@ bool LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
}
}
+ /*
if (features->hasGamma || features->isDeferred)
{
if (!shader->attachFragmentObject("windlight/gammaF.glsl"))
@@ -270,6 +271,7 @@ bool LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
return false;
}
}
+ */
if (features->hasAtmospherics || features->isDeferred)
{
@@ -458,7 +460,7 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev
// endsure work-around for missing GLSL funcs gets propogated to feature shader files (e.g. srgbF.glsl)
#if LL_DARWIN
- if (defines)
+ if (!gGLManager.mIsApple && defines)
{
(*defines)["OLD_SELECT"] = "1";
}
@@ -571,7 +573,7 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev
}
else
{
- shader_code_text[shader_code_count++] = strdup("#version 400\n");
+ shader_code_text[shader_code_count++] = strdup("#version 410\n");
}
}
else if (major_version == 3)
@@ -989,16 +991,17 @@ bool LLShaderMgr::validateProgramObject(GLuint obj)
return success;
}
-void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version)
+void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version, bool second_instance)
{
- LL_INFOS() << "Initializing shader cache" << LL_ENDL;
+ LL_PROFILE_ZONE_SCOPED;
+ LL_INFOS("ShaderMgr") << "Initializing shader cache" << LL_ENDL;
mShaderCacheEnabled = gGLManager.mGLVersion >= 4.09 && enabled;
- if(!mShaderCacheEnabled || mShaderCacheInitialized)
+ if(!mShaderCacheEnabled || mShaderCacheVersion.notNull())
return;
- mShaderCacheInitialized = true;
+ mShaderCacheVersion = current_cache_version;
mShaderCacheDir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "shader_cache");
LLFile::mkdir(mShaderCacheDir);
@@ -1007,16 +1010,19 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,
std::string meta_out_path = gDirUtilp->add(mShaderCacheDir, "shaderdata.llsd");
if (gDirUtilp->fileExists(meta_out_path))
{
- LL_INFOS() << "Loading shader cache metadata" << LL_ENDL;
+ LL_PROFILE_ZONE_NAMED("shader_cache");
+ LL_INFOS("ShaderMgr") << "Loading shader cache metadata" << LL_ENDL;
- llifstream instream(meta_out_path);
+ llifstream instream(meta_out_path, std::ifstream::in | std::ifstream::binary);
LLSD in_data;
- LLSDSerialize::fromNotation(in_data, instream, LLSDSerialize::SIZE_UNLIMITED);
+ // todo: this is likely very expensive to parse, should use binary
+ LLSDSerialize::fromBinary(in_data, instream, LLSDSerialize::SIZE_UNLIMITED);
instream.close();
- if (old_cache_version == current_cache_version)
+ if (old_cache_version == current_cache_version
+ && in_data["version"].asUUID() == current_cache_version)
{
- for (const auto& data_pair : llsd::inMap(in_data))
+ for (const auto& data_pair : llsd::inMap(in_data["shaders"]))
{
ProgramBinaryData binary_info = ProgramBinaryData();
binary_info.mBinaryFormat = data_pair.second["binary_format"].asInteger();
@@ -1025,11 +1031,15 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,
mShaderBinaryCache.insert_or_assign(LLUUID(data_pair.first), binary_info);
}
}
- else
+ else if (!second_instance)
{
- LL_INFOS() << "Shader cache version mismatch detected. Purging." << LL_ENDL;
+ LL_INFOS("ShaderMgr") << "Shader cache version mismatch detected. Purging." << LL_ENDL;
clearShaderCache();
}
+ else
+ {
+ LL_INFOS("ShaderMgr") << "Shader cache version mismatch detected." << LL_ENDL;
+ }
}
}
}
@@ -1037,19 +1047,32 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,
void LLShaderMgr::clearShaderCache()
{
std::string shader_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "shader_cache");
- LL_INFOS() << "Removing shader cache at " << shader_cache << LL_ENDL;
+ LL_INFOS("ShaderMgr") << "Removing shader cache at " << shader_cache << LL_ENDL;
const std::string mask = "*";
gDirUtilp->deleteFilesInDir(shader_cache, mask);
+ LLFile::rmdir(shader_cache);
mShaderBinaryCache.clear();
}
void LLShaderMgr::persistShaderCacheMetadata()
{
if(!mShaderCacheEnabled) return;
+ if (mShaderCacheVersion.isNull())
+ {
+ LL_WARNS("ShaderMgr") << "Attempted to save shader cache with no version set" << LL_ENDL;
+ return;
+ }
- LL_INFOS() << "Persisting shader cache metadata to disk" << LL_ENDL;
+ LL_INFOS("ShaderMgr") << "Persisting shader cache metadata to disk" << LL_ENDL;
- LLSD out = LLSD::emptyMap();
+ LLSD out;
+ // Settings and shader cache get saved at different time, thus making
+ // RenderShaderCacheVersion unreliable when running multiple viewer
+ // instances, or for cases where viewer crashes before saving settings.
+ // Dupplicate version to the cache itself.
+ out["version"] = mShaderCacheVersion;
+ out["shaders"] = LLSD::emptyMap();
+ LLSD &shaders = out["shaders"];
static const F32 LRU_TIME = (60.f * 60.f) * 24.f * 7.f; // 14 days
const F32 current_time = (F32)LLTimer::getTotalSeconds();
@@ -1068,14 +1091,19 @@ void LLShaderMgr::persistShaderCacheMetadata()
data["binary_format"] = LLSD::Integer(shader_metadata.mBinaryFormat);
data["binary_size"] = LLSD::Integer(shader_metadata.mBinaryLength);
data["last_used"] = LLSD::Real(shader_metadata.mLastUsedTime);
- out[it->first.asString()] = data;
+ shaders[it->first.asString()] = data;
++it;
}
}
std::string meta_out_path = gDirUtilp->add(mShaderCacheDir, "shaderdata.llsd");
- llofstream outstream(meta_out_path);
- LLSDSerialize::toNotation(out, outstream);
+ llofstream outstream(meta_out_path, std::ios_base::out | std::ios_base::binary);
+ if (!outstream.is_open())
+ {
+ LL_WARNS("ShaderMgr") << "Failed to open file. Unable to save shader cache to: " << mShaderCacheDir << LL_ENDL;
+ return;
+ }
+ LLSDSerialize::toBinary(out, outstream);
outstream.close();
}
@@ -1501,6 +1529,20 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("searchTex");
mReservedUniforms.push_back("blendTex");
+ mReservedUniforms.push_back("bloomEMap");
+ mReservedUniforms.push_back("bloomBlurredMap");
+ mReservedUniforms.push_back("bloomHorizontal");
+ mReservedUniforms.push_back("bloomBlurRadius");
+ mReservedUniforms.push_back("bloomExtractBrightness");
+ mReservedUniforms.push_back("bloomStrength");
+ mReservedUniforms.push_back("bloomExtractEmissive");
+ mReservedUniforms.push_back("bloomExtractEmissive2");
+ mReservedUniforms.push_back("bloomExtractORM");
+ mReservedUniforms.push_back("bloomExtractMetal");
+ mReservedUniforms.push_back("bloomExtractNonMetal");
+ mReservedUniforms.push_back("bloomClampValue");
+ mReservedUniforms.push_back("mpHDRBoost");
+
llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);
std::set<std::string> dupe_check;
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index 46788841a5..4cfa78632b 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -341,6 +341,20 @@ public:
SMAA_SEARCH_TEX, // "searchTex"
SMAA_BLEND_TEX, // "blendTex"
+ BLOOM_EMAP, // "bloomEMap"
+ BLOOM_BMAP, // "bloomBlurredMap"
+ BLOOM_BLURH, // "bloomHorizontal"
+ BLOOM_BLUR_RADIUS, // "bloomRadius"
+ BLOOM_EXTRACT_BRIGHTNESS, // "bloomExtractBrightness"
+ BLOOM_STRENGTH, // "bloomStrength"
+ BLOOM_EXTRACT_EMISSIVE, // "bloomExtractEmissive"
+ BLOOM_EXTRACT_EMISSIVE2, // "bloomExtractEmissive2"
+ BLOOM_EXTRACT_ORM, // "bloomExtractORM"
+ BLOOM_EXTRACT_METAL, // "bloomExtractMetal"
+ BLOOM_EXTRACT_NONMETAL, // "bloomExtractNonMetal"
+ BLOOM_CLAMP, // "bloomClampValue"
+ MP_HDR_BOOST, // "mpHDRBoost"
+
END_RESERVED_UNIFORMS
} eGLSLReservedUniforms;
// clang-format on
@@ -363,7 +377,7 @@ public:
// Implemented in the application to actually update out of date uniforms for a particular shader
virtual void updateShaderUniforms(LLGLSLShader * shader) = 0; // Pure Virtual
- void initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version);
+ void initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version, bool second_instance);
void clearShaderCache();
void persistShaderCacheMetadata();
@@ -387,7 +401,7 @@ public:
F32 mLastUsedTime = 0.0;
};
std::map<LLUUID, ProgramBinaryData> mShaderBinaryCache;
- bool mShaderCacheInitialized = false;
+ LLUUID mShaderCacheVersion;
bool mShaderCacheEnabled = false;
std::string mShaderCacheDir;
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index ac6db0b34f..4b62c3476f 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -29,7 +29,6 @@
#include "llfasttimer.h"
#include "llsys.h"
#include "llvertexbuffer.h"
-// #include "llrender.h"
#include "llglheaders.h"
#include "llrender.h"
#include "llvector4a.h"
@@ -272,13 +271,13 @@ static GLuint gen_buffer()
{
LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("gen buffer");
sIndex = pool_size;
-#if !LL_DARWIN
+//#if !LL_DARWIN
if (!gGLManager.mIsAMD)
{
glGenBuffers(pool_size, sNamePool);
}
else
-#endif
+//#endif
{ // work around for AMD driver bug
for (U32 i = 0; i < pool_size; ++i)
{
@@ -345,7 +344,7 @@ public:
void allocate(GLenum type, U32 size, GLuint& name, U8*& data) override
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX;
- STOP_GLERROR;
+
llassert(type == GL_ARRAY_BUFFER || type == GL_ELEMENT_ARRAY_BUFFER);
llassert(name == 0); // non zero name indicates a gl name that wasn't freed
llassert(data == nullptr); // non null data indicates a buffer that wasn't freed
@@ -355,10 +354,18 @@ public:
{ //allocate a new buffer
LL_PROFILE_GPU_ZONE("vbo alloc");
- // ON OS X, we don't allocate a VBO until the last possible moment
- // in unmapBuffer
data = (U8*) ll_aligned_malloc_16(size);
- STOP_GLERROR;
+
+ if (type == GL_ARRAY_BUFFER)
+ {
+ glGenBuffers(1, &name);
+ LLVertexBuffer::sGLRenderBuffer = name;
+ }
+ else
+ {
+ glGenBuffers(1, &name);
+ LLVertexBuffer::sGLRenderIndices = name;
+ }
}
}
@@ -374,12 +381,11 @@ public:
}
mAllocated -= size;
- STOP_GLERROR;
if (name)
{
delete_buffers(1, &name);
}
- STOP_GLERROR;
+ //LOG_GLERROR("LLAppleVBOPool::free()");
}
};
@@ -606,6 +612,8 @@ public:
static LLVBOPool* sVBOPool = nullptr;
+static U32 sMPVertexBufferMode = 0;
+
void LLVertexBufferData::drawWithMatrix()
{
if (!mVB)
@@ -783,16 +791,9 @@ void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVecto
LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX;
llassert(LLGLSLShader::sCurBoundShaderPtr != NULL);
- STOP_GLERROR;
gGL.syncMatrices();
- U32 mask = LLVertexBuffer::MAP_VERTEX;
- if (tc)
- {
- mask = mask | LLVertexBuffer::MAP_TEXCOORD0;
- }
-
unbind();
gGL.begin(mode);
@@ -885,7 +886,7 @@ bool LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_of
return true;
}
-#ifdef LL_PROFILER_ENABLE_RENDER_DOC
+#if LL_PROFILER_ENABLE_RENDER_DOC
void LLVertexBuffer::setLabel(const char* label) {
LL_LABEL_OBJECT_GL(GL_BUFFER, mGLBuffer, strlen(label), label);
}
@@ -909,10 +910,8 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
llassert(mGLBuffer == sGLRenderBuffer);
llassert(mGLIndices == sGLRenderIndices);
gGL.syncMatrices();
- STOP_GLERROR;
glDrawRangeElements(sGLMode[mode], start, end, count, mIndicesType,
(GLvoid*) (indices_offset * (size_t) mIndicesStride));
- STOP_GLERROR;
}
void LLVertexBuffer::drawRangeFast(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
@@ -935,17 +934,18 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
llassert(mGLIndices == sGLRenderIndices);
gGL.syncMatrices();
- STOP_GLERROR;
glDrawArrays(sGLMode[mode], first, count);
- STOP_GLERROR;
+ LOG_GLERROR("LLVertexBuffer::drawArrays()");
}
//static
-void LLVertexBuffer::initClass(LLWindow* window)
+void LLVertexBuffer::initClass(LLWindow* window, U32 mode_)
{
llassert(sVBOPool == nullptr);
- if (gGLManager.mIsApple)
+ sMPVertexBufferMode = mode_;
+
+ if (mode_ == 0 && gGLManager.mIsApple)
{
LL_INFOS() << "VBO Pooling Disabled" << LL_ENDL;
sVBOPool = new LLAppleVBOPool();
@@ -968,12 +968,16 @@ void LLVertexBuffer::initClass(LLWindow* window)
}
//static
+U32 LLVertexBuffer::getVertexBufferMode()
+{
+ return sMPVertexBufferMode;
+}
+
+//static
void LLVertexBuffer::unbind()
{
- STOP_GLERROR;
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- STOP_GLERROR;
sGLRenderBuffer = 0;
sGLRenderIndices = 0;
}
@@ -1288,7 +1292,7 @@ U8* LLVertexBuffer::mapVertexBuffer(LLVertexBuffer::AttributeType type, U32 inde
count = mNumVerts - index;
}
- if (!gGLManager.mIsApple)
+ if (!gGLManager.mIsApple || sMPVertexBufferMode == 1)
{
U32 start = mOffsets[type] + sTypeSize[type] * index;
U32 end = start + sTypeSize[type] * count-1;
@@ -1325,7 +1329,7 @@ U8* LLVertexBuffer::mapIndexBuffer(U32 index, S32 count)
count = mNumIndices-index;
}
- if (!gGLManager.mIsApple)
+ if (!gGLManager.mIsApple || sMPVertexBufferMode == 1)
{
U32 start = sizeof(U16) * index;
U32 end = start + sizeof(U16) * count-1;
@@ -1362,13 +1366,35 @@ void LLVertexBuffer::flush_vbo(GLenum target, U32 start, U32 end, void* data, U8
{
if (gGLManager.mIsApple)
{
+ if(sMPVertexBufferMode == 1)
+ {
+ //LL_WARNS() << "flush_vbo mode 1" << LL_ENDL;
+
+ U32 MapBits = GL_MAP_WRITE_BIT;
+ //U32 MapBits = GL_MAP_READ_BIT;
+ U32 buffer_size = end-start+1;
+
+ U8 * mptr = NULL;
+ mptr = (U8*) glMapBufferRange( target, start, end-start+1, MapBits);
+
+ if (mptr)
+ {
+ std::memcpy(mptr, (U8*) data, buffer_size);
+ if(!glUnmapBuffer(target)) LL_WARNS() << "glUnmapBuffer() failed" << LL_ENDL;
+ }
+ else LL_WARNS() << "glMapBufferRange() returned NULL" << LL_ENDL;
+
+ }
+ else
+ {
+ //LL_WARNS() << "flush_vbo mode 0" << LL_ENDL;
// on OS X, flush_vbo doesn't actually write to the GL buffer, so be sure to call
// _mapBuffer to tag the buffer for flushing to GL
_mapBuffer();
LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("vb memcpy");
- STOP_GLERROR;
// copy into mapped buffer
memcpy(dst+start, data, end-start+1);
+ }
}
else
{
@@ -1412,7 +1438,6 @@ void LLVertexBuffer::_mapBuffer()
void LLVertexBuffer::_unmapBuffer()
{
- STOP_GLERROR;
if (!mMapped)
{
return;
@@ -1426,16 +1451,16 @@ void LLVertexBuffer::_unmapBuffer()
}
};
- if (gGLManager.mIsApple)
+ if (gGLManager.mIsApple && sMPVertexBufferMode == 0)
{
- STOP_GLERROR;
+ LOG_GLERROR("LLVertexBuffer::_unmapBuffer() - apple 1");
if (mMappedData)
{
- if (mGLBuffer)
+ if(mGLBuffer == 0)
{
- delete_buffers(1, &mGLBuffer);
+ LL_WARNS() << "mGLBuffer is ZERO in unmapbuffer" << LL_ENDL;
+ glGenBuffers(1, &mGLBuffer);
}
- mGLBuffer = gen_buffer();
glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer);
sGLRenderBuffer = mGLBuffer;
glBufferData(GL_ARRAY_BUFFER, mSize, mMappedData, GL_STATIC_DRAW);
@@ -1445,16 +1470,16 @@ void LLVertexBuffer::_unmapBuffer()
glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer);
sGLRenderBuffer = mGLBuffer;
}
- STOP_GLERROR;
+ LOG_GLERROR("LLVertexBuffer::_unmapBuffer() - apple 2");
if (mMappedIndexData)
{
- if (mGLIndices)
+ if (mGLIndices == 0)
{
- delete_buffers(1, &mGLIndices);
+ LL_WARNS() << "mGLIndices is ZERO in unmapbuffer" << LL_ENDL;
+ glGenBuffers(1, &mGLIndices);
}
- mGLIndices = gen_buffer();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mGLIndices);
sGLRenderIndices = mGLIndices;
@@ -1465,7 +1490,7 @@ void LLVertexBuffer::_unmapBuffer()
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mGLIndices);
sGLRenderIndices = mGLIndices;
}
- STOP_GLERROR;
+ LOG_GLERROR("LLVertexBuffer::_unmapBuffer() - apple 3");
}
else
{
@@ -1656,11 +1681,10 @@ bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, U32 in
// Set for rendering
void LLVertexBuffer::setBuffer()
{
- STOP_GLERROR;
if (mMapped)
{
- LL_WARNS_ONCE() << "Missing call to unmapBuffer or flushBuffers" << LL_ENDL;
+ LL_WARNS() << "Missing call to unmapBuffer or flushBuffers" << LL_ENDL;
_unmapBuffer();
}
@@ -1680,6 +1704,11 @@ void LLVertexBuffer::setBuffer()
if (sGLRenderBuffer != mGLBuffer)
{
+ if(mGLBuffer == 0)
+ {
+ LL_WARNS() << "mGLBuffer is ZERO: sGLRenderBuffer=" << sGLRenderBuffer << LL_ENDL;
+ }
+
glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer);
sGLRenderBuffer = mGLBuffer;
@@ -1697,113 +1726,141 @@ void LLVertexBuffer::setBuffer()
sGLRenderIndices = mGLIndices;
}
- STOP_GLERROR;
+ LOG_GLERROR("LLVertexBuffer::setBuffer()");
}
// virtual (default)
void LLVertexBuffer::setupVertexBuffer()
{
- STOP_GLERROR;
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer()");
U8* base = nullptr;
- AttributeType loc;
- void* ptr = nullptr;
-
U32 data_mask = LLGLSLShader::sCurBoundShaderPtr->mAttributeMask;
if (data_mask & MAP_NORMAL)
{
- loc = TYPE_NORMAL;
- ptr = (void*)(base + mOffsets[TYPE_NORMAL]);
+ AttributeType loc = TYPE_NORMAL;
+ void* ptr = (void*)(base + mOffsets[TYPE_NORMAL]);
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_NORMAL");
}
if (data_mask & MAP_TEXCOORD3)
{
- loc = TYPE_TEXCOORD3;
- ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]);
+ AttributeType loc = TYPE_TEXCOORD3;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]);
glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD3");
}
if (data_mask & MAP_TEXCOORD2)
{
- loc = TYPE_TEXCOORD2;
- ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]);
+ AttributeType loc = TYPE_TEXCOORD2;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]);
glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD2");
}
if (data_mask & MAP_TEXCOORD1)
{
- loc = TYPE_TEXCOORD1;
- ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]);
+ AttributeType loc = TYPE_TEXCOORD1;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]);
glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD1");
}
if (data_mask & MAP_TANGENT)
{
- loc = TYPE_TANGENT;
- ptr = (void*)(base + mOffsets[TYPE_TANGENT]);
+ AttributeType loc = TYPE_TANGENT;
+ void* ptr = (void*)(base + mOffsets[TYPE_TANGENT]);
glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TANGENT");
}
if (data_mask & MAP_TEXCOORD0)
{
- loc = TYPE_TEXCOORD0;
- ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]);
+ AttributeType loc = TYPE_TEXCOORD0;
+ //glEnableVertexAttribArray(loc);
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]);
glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD0");
}
if (data_mask & MAP_COLOR)
{
- loc = TYPE_COLOR;
+ AttributeType loc = TYPE_COLOR;
//bind emissive instead of color pointer if emissive is present
- ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]);
+ void* ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]);
glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_COLOR");
}
if (data_mask & MAP_EMISSIVE)
{
- loc = TYPE_EMISSIVE;
- ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]);
+ AttributeType loc = TYPE_EMISSIVE;
+ void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]);
glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr);
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_EMISSIVE");
+
if (!(data_mask & MAP_COLOR))
{ //map emissive to color channel when color is not also being bound to avoid unnecessary shader swaps
loc = TYPE_COLOR;
glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_COLOR");
}
}
if (data_mask & MAP_WEIGHT)
{
- loc = TYPE_WEIGHT;
- ptr = (void*)(base + mOffsets[TYPE_WEIGHT]);
+ AttributeType loc = TYPE_WEIGHT;
+ void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT]);
glVertexAttribPointer(loc, 1, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_WEIGHT");
}
if (data_mask & MAP_WEIGHT4)
{
- loc = TYPE_WEIGHT4;
- ptr = (void*)(base + mOffsets[TYPE_WEIGHT4]);
+ AttributeType loc = TYPE_WEIGHT4;
+ void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT4]);
glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_WEIGHT4");
}
if (data_mask & MAP_JOINT)
{
- loc = TYPE_JOINT;
- ptr = (void*)(base + mOffsets[TYPE_JOINT]);
+ AttributeType loc = TYPE_JOINT;
+ void* ptr = (void*)(base + mOffsets[TYPE_JOINT]);
glVertexAttribIPointer(loc, 4, GL_UNSIGNED_SHORT, LLVertexBuffer::sTypeSize[TYPE_JOINT], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_JOINT");
}
if (data_mask & MAP_CLOTHWEIGHT)
{
- loc = TYPE_CLOTHWEIGHT;
- ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]);
+ AttributeType loc = TYPE_CLOTHWEIGHT;
+ void* ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]);
glVertexAttribPointer(loc, 4, GL_FLOAT, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_CLOTHWEIGHT");
}
+
if (data_mask & MAP_TEXTURE_INDEX)
{
- loc = TYPE_TEXTURE_INDEX;
- ptr = (void*)(base + mOffsets[TYPE_VERTEX] + 12);
+ AttributeType loc = TYPE_TEXTURE_INDEX;
+ void* ptr = (void*)(base + mOffsets[TYPE_VERTEX] + 12);
glVertexAttribIPointer(loc, 1, GL_UNSIGNED_INT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXTURE_INDEX");
}
if (data_mask & MAP_VERTEX)
{
- loc = TYPE_VERTEX;
- ptr = (void*)(base + mOffsets[TYPE_VERTEX]);
+ AttributeType loc = TYPE_VERTEX;
+ void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]);
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
+
+ LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_VERTEX");
}
- STOP_GLERROR;
}
void LLVertexBuffer::setPositionData(const LLVector4a* data)
@@ -1917,3 +1974,7 @@ void LLVertexBuffer::setIndexData(const U32* data, U32 offset, U32 count)
}
flush_vbo(GL_ELEMENT_ARRAY_BUFFER, offset * sizeof(U32), (offset + count) * sizeof(U32) - 1, (U8*)data, mMappedIndexData);
}
+
+
+
+
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index 375ad76fb8..b0f6ae7d8d 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -109,7 +109,7 @@ public:
return *this;
}
- static void initClass(LLWindow* window);
+ static void initClass(LLWindow* window, U32 mode_ = 0);
static void cleanupClass();
static void setupClientArrays(U32 data_mask);
static void drawArrays(U32 mode, const std::vector<LLVector3>& pos);
@@ -128,6 +128,8 @@ public:
// flush any pending mapped buffers
static void flushBuffers();
+ static U32 getVertexBufferMode();
+
//WARNING -- when updating these enums you MUST
// 1 - update LLVertexBuffer::sTypeSize
// 2 - update LLVertexBuffer::vb_type_name
@@ -279,7 +281,7 @@ public:
//for debugging, validate data in given range is valid
bool validateRange(U32 start, U32 end, U32 count, U32 offset) const;
- #ifdef LL_PROFILER_ENABLE_RENDER_DOC
+ #if LL_PROFILER_ENABLE_RENDER_DOC
void setLabel(const char* label);
#endif
@@ -340,7 +342,7 @@ public:
static U32 sVertexCount;
};
-#ifdef LL_PROFILER_ENABLE_RENDER_DOC
+#if LL_PROFILER_ENABLE_RENDER_DOC
#define LL_LABEL_VERTEX_BUFFER(buf, name) buf->setLabel(name)
#else
#define LL_LABEL_VERTEX_BUFFER(buf, name)
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 5991a5b35e..83b3a220a0 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -18,6 +18,7 @@ set(llui_SOURCE_FILES
llbadgeowner.cpp
llbutton.cpp
llchatentry.cpp
+ llchatmentionhelper.cpp
llcheckboxctrl.cpp
llclipboard.cpp
llcombobox.cpp
@@ -130,6 +131,7 @@ set(llui_HEADER_FILES
llcallbackmap.h
llchatentry.h
llchat.h
+ llchatmentionhelper.h
llcheckboxctrl.h
llclipboard.h
llcombobox.h
diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 495ba2f40f..2cd394476e 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -494,6 +494,7 @@ void LLAccordionCtrl::arrangeMultiple()
void LLAccordionCtrl::arrange()
{
+ LL_PROFILE_ZONE_SCOPED;
updateNoTabsHelpTextVisibility();
if (mAccordionTabs.empty())
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index ac66525030..828bfb289b 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -248,10 +248,22 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::reshape(S32 width, S32 height, bool called_from_parent /* = true */)
{
S32 header_height = mHeaderTextbox->getTextPixelHeight();
+ LLRect old_header_rect = mHeaderTextbox->getRect();
LLRect textboxRect(HEADER_TEXT_LEFT_OFFSET, (height + header_height) / 2, width, (height - header_height) / 2);
- mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight());
- mHeaderTextbox->setRect(textboxRect);
+ if (old_header_rect.getHeight() != textboxRect.getHeight()
+ || old_header_rect.mLeft != textboxRect.mLeft
+ || old_header_rect.mTop != textboxRect.mTop
+ || old_header_rect.getWidth() > textboxRect.getWidth() // reducing header's width
+ || (old_header_rect.getWidth() < textboxRect.getWidth() && old_header_rect.getWidth() < mHeaderTextbox->getTextPixelWidth()))
+ {
+ // Expensive text reflow
+ // Update if position or height changes
+ // Update if width reduces
+ // But do not update if text already fits and width increases (arguably LLTextBox::reshape should be smarter, not Accordion)
+ mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight());
+ mHeaderTextbox->setRect(textboxRect);
+ }
if (mHeaderTextbox->getTextPixelWidth() > mHeaderTextbox->getRect().getWidth())
{
@@ -416,8 +428,11 @@ void LLAccordionCtrlTab::reshape(S32 width, S32 height, bool called_from_parent
LLRect headerRect;
headerRect.setLeftTopAndSize(0, height, width, HEADER_HEIGHT);
- mHeader->setRect(headerRect);
- mHeader->reshape(headerRect.getWidth(), headerRect.getHeight());
+ if (mHeader->getRect() != headerRect)
+ {
+ mHeader->setRect(headerRect);
+ mHeader->reshape(headerRect.getWidth(), headerRect.getHeight());
+ }
if (!mDisplayChildren)
return;
@@ -464,7 +479,34 @@ void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl)
// Translate to parent coordinatess to check if we are in visible rectangle
rect.translate(getRect().mLeft, getRect().mBottom);
- if (!getRect().contains(rect))
+ bool needs_to_scroll = false;
+ const LLRect &acc_rect = getRect();
+ if (!acc_rect.contains(rect))
+ {
+ if (acc_rect.mTop < rect.mBottom || acc_rect.mBottom > rect.mTop)
+ {
+ // Content fully not in view
+ needs_to_scroll = true;
+ }
+ else if (acc_rect.getHeight() >= rect.getHeight())
+ {
+ // Content can be displayed fully, but only partially in view
+ needs_to_scroll = true;
+ }
+ else if (acc_rect.mTop <= rect.mTop || acc_rect.mBottom >= rect.mBottom)
+ {
+ // Intersects, but too big to be displayed fully
+ S32 covered_height = acc_rect.mTop > rect.mTop ? rect.mTop - acc_rect.mBottom : acc_rect.mTop - rect.mBottom;
+ constexpr F32 covered_ratio = 0.7f;
+ if (covered_height < covered_ratio * acc_rect.getHeight())
+ {
+ // Try to show bigger portion of the content
+ needs_to_scroll = true;
+ }
+ }
+ // else too big and in the middle of the view as is
+ }
+ if (needs_to_scroll)
{
// for accordition's scroll, height is in pixels
// Back to local coords and calculate position for scroller
@@ -932,7 +974,7 @@ void LLAccordionCtrlTab::adjustContainerPanel(const LLRect& child_rect)
show_hide_scrollbar(child_rect);
updateLayout(child_rect);
}
- else
+ else if (mContainerPanel->getRect() != child_rect)
{
mContainerPanel->reshape(child_rect.getWidth(), child_rect.getHeight());
mContainerPanel->setRect(child_rect);
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index cf3569683e..bb0b8ce04f 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -126,7 +126,7 @@ public:
void setSelected(bool is_selected);
- bool getCollapsible() { return mCollapsible; };
+ bool getCollapsible() const { return mCollapsible; };
void setCollapsible(bool collapsible) { mCollapsible = collapsible; };
void changeOpenClose(bool is_open);
@@ -140,7 +140,7 @@ public:
S32 notify(const LLSD& info);
bool notifyChildren(const LLSD& info);
- void draw();
+ virtual void draw();
void storeOpenCloseState();
void restoreOpenCloseState();
@@ -181,7 +181,7 @@ public:
void setHeaderVisible(bool value);
- bool getHeaderVisible() { return mHeaderVisible;}
+ bool getHeaderVisible() const { return mHeaderVisible;}
S32 mExpandedHeight; // Height of expanded ctrl.
// Used to restore height after expand.
diff --git a/indra/llui/llchatentry.cpp b/indra/llui/llchatentry.cpp
index da5afd0386..7506cd99c0 100644
--- a/indra/llui/llchatentry.cpp
+++ b/indra/llui/llchatentry.cpp
@@ -45,12 +45,14 @@ LLChatEntry::LLChatEntry(const Params& p)
mExpandLinesCount(p.expand_lines_count),
mPrevLinesCount(0),
mSingleLineMode(false),
- mPrevExpandedLineCount(S32_MAX)
+ mPrevExpandedLineCount(S32_MAX),
+ mCurrentInput("")
{
// Initialize current history line iterator
mCurrentHistoryLine = mLineHistory.begin();
mAutoIndent = false;
+ mShowChatMentionPicker = true;
keepSelectionOnReturn(true);
}
@@ -189,6 +191,7 @@ bool LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
{
needsReflow();
}
+ mCurrentInput = "";
break;
case KEY_UP:
@@ -196,6 +199,11 @@ bool LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
{
if (!mLineHistory.empty() && mCurrentHistoryLine > mLineHistory.begin())
{
+ if (mCurrentHistoryLine == mLineHistory.end())
+ {
+ mCurrentInput = getText();
+ }
+
setText(*(--mCurrentHistoryLine));
endOfDoc();
}
@@ -210,16 +218,15 @@ bool LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
case KEY_DOWN:
if (mHasHistory && MASK_CONTROL == mask)
{
- if (!mLineHistory.empty() && mCurrentHistoryLine < (mLineHistory.end() - 1) )
+ if (!mLineHistory.empty() && mCurrentHistoryLine < (mLineHistory.end() - 1))
{
setText(*(++mCurrentHistoryLine));
endOfDoc();
}
- else if (!mLineHistory.empty() && mCurrentHistoryLine == (mLineHistory.end() - 1) )
+ else if (!mLineHistory.empty() && mCurrentHistoryLine == (mLineHistory.end() - 1))
{
mCurrentHistoryLine++;
- std::string empty("");
- setText(empty);
+ setText(mCurrentInput);
needsReflow();
endOfDoc();
}
diff --git a/indra/llui/llchatentry.h b/indra/llui/llchatentry.h
index 5621ede1e7..9a0e8ee91e 100644
--- a/indra/llui/llchatentry.h
+++ b/indra/llui/llchatentry.h
@@ -101,6 +101,8 @@ private:
S32 mExpandLinesCount;
S32 mPrevLinesCount;
S32 mPrevExpandedLineCount;
+
+ std::string mCurrentInput;
};
#endif /* LLCHATENTRY_H_ */
diff --git a/indra/llui/llchatmentionhelper.cpp b/indra/llui/llchatmentionhelper.cpp
new file mode 100644
index 0000000000..5745389a58
--- /dev/null
+++ b/indra/llui/llchatmentionhelper.cpp
@@ -0,0 +1,158 @@
+/**
+* @file llchatmentionhelper.cpp
+*
+* $LicenseInfo:firstyear=2025&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2025, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "linden_common.h"
+
+#include "llchatmentionhelper.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "lluictrl.h"
+
+constexpr char CHAT_MENTION_HELPER_FLOATER[] = "chat_mention_picker";
+
+bool LLChatMentionHelper::isActive(const LLUICtrl* ctrl) const
+{
+ return mHostHandle.get() == ctrl;
+}
+
+bool LLChatMentionHelper::isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos) const
+{
+ if (cursor_pos <= 0 || cursor_pos > static_cast<S32>(wtext.size()))
+ return false;
+
+ // Find the beginning of the current word
+ S32 start = cursor_pos - 1;
+ while (start > 0 && wtext[start - 1] != U32(' ') && wtext[start - 1] != U32('\n'))
+ {
+ --start;
+ }
+
+ if (wtext[start] != U32('@'))
+ return false;
+
+ if (mention_start_pos)
+ *mention_start_pos = start;
+
+ S32 word_length = cursor_pos - start;
+
+ if (word_length == 1)
+ {
+ return true;
+ }
+
+ // Get the name after '@'
+ std::string name = wstring_to_utf8str(wtext.substr(start + 1, word_length - 1));
+ LLStringUtil::toLower(name);
+ for (const auto& av_name : mAvatarNames)
+ {
+ if (av_name == name || av_name.find(name) == 0)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void LLChatMentionHelper::showHelper(LLUICtrl* host_ctrl, S32 local_x, S32 local_y, const std::string& av_name, std::function<void(std::string)> cb)
+{
+ if (mHelperHandle.isDead())
+ {
+ LLFloater* av_picker_floater = LLFloaterReg::getInstance(CHAT_MENTION_HELPER_FLOATER);
+ mHelperHandle = av_picker_floater->getHandle();
+ mHelperCommitConn = av_picker_floater->setCommitCallback([&](LLUICtrl* ctrl, const LLSD& param) { onCommitName(param.asString()); });
+ }
+ setHostCtrl(host_ctrl);
+ mNameCommitCb = cb;
+
+ S32 floater_x, floater_y;
+ if (!host_ctrl->localPointToOtherView(local_x, local_y, &floater_x, &floater_y, gFloaterView))
+ {
+ LL_WARNS() << "Cannot show helper for non-floater controls." << LL_ENDL;
+ return;
+ }
+
+ LLFloater* av_picker_floater = mHelperHandle.get();
+ LLRect rect = av_picker_floater->getRect();
+ rect.setLeftTopAndSize(floater_x, floater_y + rect.getHeight(), rect.getWidth(), rect.getHeight());
+ av_picker_floater->setRect(rect);
+ if (av_picker_floater->isShown())
+ {
+ av_picker_floater->onOpen(LLSD().with("av_name", av_name));
+ }
+ else
+ {
+ av_picker_floater->openFloater(LLSD().with("av_name", av_name));
+ }
+}
+
+void LLChatMentionHelper::hideHelper(const LLUICtrl* ctrl)
+{
+ if ((ctrl && !isActive(ctrl)))
+ {
+ return;
+ }
+ setHostCtrl(nullptr);
+}
+
+bool LLChatMentionHelper::handleKey(const LLUICtrl* ctrl, KEY key, MASK mask)
+{
+ if (mHelperHandle.isDead() || !isActive(ctrl))
+ {
+ return false;
+ }
+
+ return mHelperHandle.get()->handleKey(key, mask, true);
+}
+
+void LLChatMentionHelper::onCommitName(std::string name_url)
+{
+ if (!mHostHandle.isDead() && mNameCommitCb)
+ {
+ mNameCommitCb(name_url);
+ }
+}
+
+void LLChatMentionHelper::setHostCtrl(LLUICtrl* host_ctrl)
+{
+ const LLUICtrl* pCurHostCtrl = mHostHandle.get();
+ if (pCurHostCtrl != host_ctrl)
+ {
+ mHostCtrlFocusLostConn.disconnect();
+ mHostHandle.markDead();
+ mNameCommitCb = {};
+
+ if (!mHelperHandle.isDead())
+ {
+ mHelperHandle.get()->closeFloater();
+ }
+
+ if (host_ctrl)
+ {
+ mHostHandle = host_ctrl->getHandle();
+ mHostCtrlFocusLostConn = host_ctrl->setFocusLostCallback(std::bind([&]() { hideHelper(getHostCtrl()); }));
+ }
+ }
+}
diff --git a/indra/llui/llchatmentionhelper.h b/indra/llui/llchatmentionhelper.h
new file mode 100644
index 0000000000..5f95d06f31
--- /dev/null
+++ b/indra/llui/llchatmentionhelper.h
@@ -0,0 +1,66 @@
+/**
+* @file llchatmentionhelper.h
+* @brief Header file for LLChatMentionHelper
+*
+* $LicenseInfo:firstyear=2025&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2025, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#pragma once
+
+#include "llhandle.h"
+#include "llsingleton.h"
+
+#include <boost/signals2.hpp>
+
+class LLFloater;
+class LLUICtrl;
+
+class LLChatMentionHelper : public LLSingleton<LLChatMentionHelper>
+{
+ LLSINGLETON(LLChatMentionHelper) {}
+ ~LLChatMentionHelper() override {}
+
+public:
+
+ bool isActive(const LLUICtrl* ctrl) const;
+ bool isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos = nullptr) const;
+ void showHelper(LLUICtrl* host_ctrl, S32 local_x, S32 local_y, const std::string& av_name, std::function<void(std::string)> commit_cb);
+ void hideHelper(const LLUICtrl* ctrl = nullptr);
+
+ bool handleKey(const LLUICtrl* ctrl, KEY key, MASK mask);
+ void onCommitName(std::string name_url);
+
+ void updateAvatarList(std::vector<std::string> av_names) { mAvatarNames = av_names; }
+
+protected:
+ void setHostCtrl(LLUICtrl* host_ctrl);
+ LLUICtrl* getHostCtrl() const { return mHostHandle.get(); }
+
+private:
+ LLHandle<LLUICtrl> mHostHandle;
+ LLHandle<LLFloater> mHelperHandle;
+ boost::signals2::connection mHostCtrlFocusLostConn;
+ boost::signals2::connection mHelperCommitConn;
+ std::function<void(std::string)> mNameCommitCb;
+
+ std::vector<std::string> mAvatarNames;
+};
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 135f128692..4068741978 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -36,8 +36,8 @@
// Constants
//
-const bool RADIO_STYLE = true;
-const bool CHECK_STYLE = false;
+constexpr bool RADIO_STYLE = true;
+constexpr bool CHECK_STYLE = false;
//
// Classes
@@ -94,7 +94,7 @@ public:
// LLUICtrl interface
virtual void setValue(const LLSD& value );
virtual LLSD getValue() const;
- bool get() { return (bool)getValue().asBoolean(); }
+ bool get() const { return (bool)getValue().asBoolean(); }
void set(bool value) { setValue(value); }
virtual void setTentative(bool b);
@@ -106,7 +106,7 @@ public:
virtual void onCommit();
// LLCheckBoxCtrl interface
- virtual bool toggle() { return mButton->toggleState(); } // returns new state
+ virtual bool toggle() { return mButton->toggleState(); } // returns new state
void setBtnFocus() { mButton->setFocus(true); }
diff --git a/indra/llui/llcontainerview.h b/indra/llui/llcontainerview.h
index c6dd401e85..2675d21c22 100644
--- a/indra/llui/llcontainerview.h
+++ b/indra/llui/llcontainerview.h
@@ -65,21 +65,21 @@ protected:
public:
~LLContainerView();
- /*virtual*/ bool postBuild();
- /*virtual*/ bool addChild(LLView* view, S32 tab_group = 0);
+ bool postBuild() override;
+ bool addChild(LLView* view, S32 tab_group = 0) override;
- /*virtual*/ bool handleDoubleClick(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleMouseUp(S32 x, S32 y, MASK mask);
+ bool handleDoubleClick(S32 x, S32 y, MASK mask) override;
+ bool handleMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleMouseUp(S32 x, S32 y, MASK mask) override;
- /*virtual*/ void draw();
- /*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true);
- /*virtual*/ LLRect getRequiredRect(); // Return the height of this object, given the set options.
+ void draw() override;
+ void reshape(S32 width, S32 height, bool called_from_parent = true) override;
+ LLRect getRequiredRect() override; // Return the height of this object, given the set options.
void setLabel(const std::string& label);
void showLabel(bool show) { mShowLabel = show; }
void setDisplayChildren(bool displayChildren);
- bool getDisplayChildren() { return mDisplayChildren; }
+ bool getDisplayChildren() const { return mDisplayChildren; }
void setScrollContainer(LLScrollContainer* scroll) {mScrollContainer = scroll;}
private:
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 3effc977db..9c516e23a4 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -112,8 +112,8 @@ public:
virtual bool overlapsScreenChannel() { return mOverlapsScreenChannel && getVisible() && isDocked(); }
virtual void setOverlapsScreenChannel(bool overlaps) { mOverlapsScreenChannel = overlaps; }
- bool getUniqueDocking() { return mUniqueDocking; }
- bool getUseTongue() { return mUseTongue; }
+ bool getUniqueDocking() const { return mUniqueDocking; }
+ bool getUseTongue() const { return mUseTongue; }
void setUseTongue(bool use_tongue) { mUseTongue = use_tongue;}
private:
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index 11dbad8c09..1a00c03856 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -156,7 +156,7 @@ void LLDockControl::repositionDockable()
}
}
-bool LLDockControl::isDockVisible()
+bool LLDockControl::isDockVisible() const
{
bool res = true;
diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h
index 7e31330713..b6ac9c19dd 100644
--- a/indra/llui/lldockcontrol.h
+++ b/indra/llui/lldockcontrol.h
@@ -61,19 +61,19 @@ public:
void off();
void forceRecalculatePosition();
void setDock(LLView* dockWidget);
- LLView* getDock()
+ LLView* getDock() const
{
return mDockWidgetHandle.get();
}
void repositionDockable();
void drawToungue();
- bool isDockVisible();
+ bool isDockVisible() const;
// gets a rect that bounds possible positions for a dockable control (EXT-1111)
void getAllowedRect(LLRect& rect);
- S32 getTongueWidth() { return mDockTongue->getWidth(); }
- S32 getTongueHeight() { return mDockTongue->getHeight(); }
+ S32 getTongueWidth() const { return mDockTongue->getWidth(); }
+ S32 getTongueHeight() const { return mDockTongue->getHeight(); }
private:
virtual void moveDockable();
diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h
index a522e63243..73211d5292 100644
--- a/indra/llui/lldraghandle.h
+++ b/indra/llui/lldraghandle.h
@@ -66,7 +66,7 @@ public:
void setMaxTitleWidth(S32 max_width) {mMaxTitleWidth = llmin(max_width, mMaxTitleWidth); }
S32 getMaxTitleWidth() const { return mMaxTitleWidth; }
void setButtonsRect(const LLRect& rect){ mButtonsRect = rect; }
- LLRect getButtonsRect() { return mButtonsRect; }
+ LLRect getButtonsRect() const { return mButtonsRect; }
void setTitleVisible(bool visible);
virtual void setTitle( const std::string& title ) = 0;
diff --git a/indra/llui/llemojidictionary.cpp b/indra/llui/llemojidictionary.cpp
index 925608e47e..16e6f0591a 100644
--- a/indra/llui/llemojidictionary.cpp
+++ b/indra/llui/llemojidictionary.cpp
@@ -390,14 +390,17 @@ void LLEmojiDictionary::loadEmojis()
continue;
}
+ std::string category;
std::list<std::string> categories = loadCategories(sd);
if (categories.empty())
{
- LL_WARNS() << "Skipping invalid emoji descriptor (no categories)" << LL_ENDL;
- continue;
+ // Should already have a localization for "other symbols"
+ category = "other symbols";
+ }
+ else
+ {
+ category = categories.front();
}
-
- std::string category = categories.front();
if (std::find(mSkipCategories.begin(), mSkipCategories.end(), category) != mSkipCategories.end())
{
diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp
index b9441a9c91..7cdd19bebc 100644
--- a/indra/llui/llemojihelper.cpp
+++ b/indra/llui/llemojihelper.cpp
@@ -99,6 +99,7 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c
LLFloater* pHelperFloater = LLFloaterReg::getInstance(DEFAULT_EMOJI_HELPER_FLOATER);
mHelperHandle = pHelperFloater->getHandle();
mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())[0]); }, std::placeholders::_2));
+ mHelperCloseConn = pHelperFloater->setCloseCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCloseHelper(ctrl, param); });
}
setHostCtrl(hostctrl_p);
mEmojiCommitCb = cb;
@@ -116,7 +117,17 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c
S32 top = floater_y - HELPER_FLOATER_OFFSET_Y + rect.getHeight();
rect.setLeftTopAndSize(left, top, rect.getWidth(), rect.getHeight());
pHelperFloater->setRect(rect);
+
+ // Hack: Trying to open floater, search for a match,
+ // and hide floater immediately if no match found,
+ // instead of checking prior to opening
+ //
+ // Supress sounds in case floater won't be shown.
+ // Todo: add some kind of shouldShow(short_code)
+ U8 sound_flags = pHelperFloater->getSoundFlags();
+ pHelperFloater->setSoundFlags(LLView::SILENT);
pHelperFloater->openFloater(LLSD().with("hint", short_code));
+ pHelperFloater->setSoundFlags(sound_flags);
}
void LLEmojiHelper::hideHelper(const LLUICtrl* ctrl_p, bool strict)
@@ -148,6 +159,16 @@ void LLEmojiHelper::onCommitEmoji(llwchar emoji)
}
}
+void LLEmojiHelper::onCloseHelper(LLUICtrl* ctrl, const LLSD& param)
+{
+ mCloseSignal(ctrl, param);
+}
+
+boost::signals2::connection LLEmojiHelper::setCloseCallback(const commit_signal_t::slot_type& cb)
+{
+ return mCloseSignal.connect(cb);
+}
+
void LLEmojiHelper::setHostCtrl(LLUICtrl* hostctrl_p)
{
const LLUICtrl* pCurHostCtrl = mHostHandle.get();
diff --git a/indra/llui/llemojihelper.h b/indra/llui/llemojihelper.h
index 2834b06061..26840eef94 100644
--- a/indra/llui/llemojihelper.h
+++ b/indra/llui/llemojihelper.h
@@ -51,16 +51,23 @@ public:
// Eventing
bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask);
void onCommitEmoji(llwchar emoji);
+ void onCloseHelper(LLUICtrl* ctrl, const LLSD& param);
+
+ typedef boost::signals2::signal<void(LLUICtrl* ctrl, const LLSD& param)> commit_signal_t;
+ boost::signals2::connection setCloseCallback(const commit_signal_t::slot_type& cb);
protected:
LLUICtrl* getHostCtrl() const { return mHostHandle.get(); }
void setHostCtrl(LLUICtrl* hostctrl_p);
private:
+ commit_signal_t mCloseSignal;
+
LLHandle<LLUICtrl> mHostHandle;
LLHandle<LLFloater> mHelperHandle;
boost::signals2::connection mHostCtrlFocusLostConn;
boost::signals2::connection mHelperCommitConn;
+ boost::signals2::connection mHelperCloseConn;
std::function<void(llwchar)> mEmojiCommitCb;
bool mIsHideDisabled;
};
diff --git a/indra/llui/llfiltereditor.h b/indra/llui/llfiltereditor.h
index 686827d94c..685219c9f6 100644
--- a/indra/llui/llfiltereditor.h
+++ b/indra/llui/llfiltereditor.h
@@ -49,7 +49,7 @@ protected:
LLFilterEditor(const Params&);
friend class LLUICtrlFactory;
- /*virtual*/ void handleKeystroke();
+ void handleKeystroke() override;
};
#endif // LL_FILTEREDITOR_H
diff --git a/indra/llui/llflashtimer.cpp b/indra/llui/llflashtimer.cpp
index c3db24c987..54f54653e2 100644
--- a/indra/llui/llflashtimer.cpp
+++ b/indra/llui/llflashtimer.cpp
@@ -85,12 +85,12 @@ void LLFlashTimer::stopFlashing()
mCurrentTickCount = 0;
}
-bool LLFlashTimer::isFlashingInProgress()
+bool LLFlashTimer::isFlashingInProgress() const
{
return mIsFlashingInProgress;
}
-bool LLFlashTimer::isCurrentlyHighlighted()
+bool LLFlashTimer::isCurrentlyHighlighted() const
{
return mIsCurrentlyHighlighted;
}
diff --git a/indra/llui/llflashtimer.h b/indra/llui/llflashtimer.h
index b55ce53fc0..4ef70faf2d 100644
--- a/indra/llui/llflashtimer.h
+++ b/indra/llui/llflashtimer.h
@@ -51,8 +51,8 @@ public:
void startFlashing();
void stopFlashing();
- bool isFlashingInProgress();
- bool isCurrentlyHighlighted();
+ bool isFlashingInProgress() const;
+ bool isCurrentlyHighlighted() const;
/*
* Use this instead of deleting this object.
* The next call to tick() will return true and that will destroy this object.
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 53f39766c6..dfe0a71b74 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -69,7 +69,7 @@ const LLRect& LLFlatListView::getItemsRect() const
bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*/, EAddPosition pos /*= ADD_BOTTOM*/,bool rearrange /*= true*/)
{
if (!item) return false;
- if (value.isUndefined()) return false;
+ if (value.isUndefined()) return false; // item stays an orphan?!!!
//force uniqueness of items, easiest check but unreliable
if (item->getParent() == mItemsPanel) return false;
@@ -459,6 +459,7 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
, mNoItemsCommentTextbox(NULL)
, mIsConsecutiveSelection(false)
, mKeepSelectionVisibleOnReshape(p.keep_selection_visible_on_reshape)
+ , mFocusOnItemClicked(true)
{
mBorderThickness = getBorderWidth();
@@ -610,7 +611,10 @@ void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
return;
}
- setFocus(true);
+ if (mFocusOnItemClicked)
+ {
+ setFocus(true);
+ }
bool select_item = !isSelected(item_pair);
@@ -1337,14 +1341,22 @@ void LLFlatListViewEx::updateNoItemsMessage(const std::string& filter_string)
}
}
-bool LLFlatListViewEx::getForceShowingUnmatchedItems()
+bool LLFlatListViewEx::getForceShowingUnmatchedItems() const
{
return mForceShowingUnmatchedItems;
}
-void LLFlatListViewEx::setForceShowingUnmatchedItems(bool show)
+void LLFlatListViewEx::setForceShowingUnmatchedItems(bool show, bool notify_parent)
+{
+ if (mForceShowingUnmatchedItems != show)
{
mForceShowingUnmatchedItems = show;
+ if (!mFilterSubString.empty())
+ {
+ updateNoItemsMessage(mFilterSubString);
+ filterItems(false, true);
+ }
+ }
}
void LLFlatListViewEx::setFilterSubString(const std::string& filter_str, bool notify_parent)
@@ -1412,6 +1424,7 @@ void LLFlatListViewEx::filterItems(bool re_sort, bool notify_parent)
if (visibility_changed && notify_parent)
{
+ rearrangeItems();
notifyParentItemsRectChanged();
}
}
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 6d75e9f282..1f22360a8a 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -113,7 +113,7 @@ public:
};
// disable traversal when finding widget to hand focus off to
- /*virtual*/ bool canFocusChildren() const { return false; }
+ /*virtual*/ bool canFocusChildren() const override { return false; }
/**
* Connects callback to signal called when Return key is pressed.
@@ -121,15 +121,15 @@ public:
boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); }
/** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */
- virtual void reshape(S32 width, S32 height, bool called_from_parent = true);
+ virtual void reshape(S32 width, S32 height, bool called_from_parent = true) override;
/** Returns full rect of child panel */
const LLRect& getItemsRect() const;
- LLRect getRequiredRect() { return getItemsRect(); }
+ LLRect getRequiredRect() override { return getItemsRect(); }
/** Returns distance between items */
- const S32 getItemsPad() { return mItemPad; }
+ const S32 getItemsPad() const { return mItemPad; }
/**
* Adds and item and LLSD value associated with it to the list at specified position
@@ -264,13 +264,13 @@ public:
void setCommitOnSelectionChange(bool b) { mCommitOnSelectionChange = b; }
/** Get number of selected items in the list */
- U32 numSelected() const {return static_cast<U32>(mSelectedItemPairs.size()); }
+ U32 numSelected() const { return static_cast<U32>(mSelectedItemPairs.size()); }
/** Get number of (visible) items in the list */
U32 size(const bool only_visible_items = true) const;
/** Removes all items from the list */
- virtual void clear();
+ virtual void clear() override;
/**
* Removes all items that can be detached from the list but doesn't destroy
@@ -294,10 +294,12 @@ public:
void scrollToShowFirstSelectedItem();
- void selectFirstItem ();
- void selectLastItem ();
+ void selectFirstItem();
+ void selectLastItem();
- virtual S32 notify(const LLSD& info) ;
+ virtual S32 notify(const LLSD& info) override;
+
+ void setFocusOnItemClicked(bool b) { mFocusOnItemClicked = b; }
virtual ~LLFlatListView();
@@ -346,8 +348,8 @@ protected:
virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection);
- virtual bool canSelectAll() const;
- virtual void selectAll();
+ virtual bool canSelectAll() const override;
+ virtual void selectAll() override;
virtual bool isSelected(item_pair_t* item_pair) const;
@@ -364,15 +366,15 @@ protected:
*/
void notifyParentItemsRectChanged();
- virtual bool handleKeyHere(KEY key, MASK mask);
+ virtual bool handleKeyHere(KEY key, MASK mask) override;
- virtual bool postBuild();
+ virtual bool postBuild() override;
- virtual void onFocusReceived();
+ virtual void onFocusReceived() override;
- virtual void onFocusLost();
+ virtual void onFocusLost() override;
- virtual void draw();
+ virtual void draw() override;
LLRect getLastSelectedItemRect();
@@ -423,6 +425,8 @@ private:
bool mKeepSelectionVisibleOnReshape;
+ bool mFocusOnItemClicked;
+
/** All pairs of the list */
pairs_list_t mItemPairs;
@@ -478,15 +482,19 @@ public:
void setNoItemsMsg(const std::string& msg) { mNoItemsMsg = msg; }
void setNoFilteredItemsMsg(const std::string& msg) { mNoFilteredItemsMsg = msg; }
- bool getForceShowingUnmatchedItems();
+ bool getForceShowingUnmatchedItems() const;
- void setForceShowingUnmatchedItems(bool show);
+ /**
+ * Sets filtered out items to stay visible. Can result in rect changes,
+ * so can notify_parent if rect changes
+ */
+ void setForceShowingUnmatchedItems(bool show, bool notify_parent);
/**
* Sets up new filter string and filters the list.
*/
void setFilterSubString(const std::string& filter_str, bool notify_parent);
- std::string getFilterSubString() { return mFilterSubString; }
+ std::string getFilterSubString() const { return mFilterSubString; }
/**
* Filters the list, rearranges and notifies parent about shape changes.
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 4b904f09e0..52a5e3dbd6 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2165,7 +2165,7 @@ void LLFloater::setCanDrag(bool can_drag)
}
}
-bool LLFloater::getCanDrag()
+bool LLFloater::getCanDrag() const
{
return mDragHandle->getEnabled();
}
@@ -2274,7 +2274,7 @@ void LLFloater::drawConeToOwner(F32 &context_cone_opacity,
LLRect local_rect = getLocalRect();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLGLEnable(GL_CULL_FACE);
+ LLGLEnable cull_face(GL_CULL_FACE);
gGL.begin(LLRender::TRIANGLE_STRIP);
{
gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity);
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 9be2240f6f..9e1594bdd2 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -46,24 +46,24 @@ class LLMultiFloater;
class LLFloater;
-const bool RESIZE_YES = true;
-const bool RESIZE_NO = false;
+constexpr bool RESIZE_YES = true;
+constexpr bool RESIZE_NO = false;
-const bool DRAG_ON_TOP = false;
-const bool DRAG_ON_LEFT = true;
+constexpr bool DRAG_ON_TOP = false;
+constexpr bool DRAG_ON_LEFT = true;
-const bool MINIMIZE_YES = true;
-const bool MINIMIZE_NO = false;
+constexpr bool MINIMIZE_YES = true;
+constexpr bool MINIMIZE_NO = false;
-const bool CLOSE_YES = true;
-const bool CLOSE_NO = false;
+constexpr bool CLOSE_YES = true;
+constexpr bool CLOSE_NO = false;
-const bool ADJUST_VERTICAL_YES = true;
-const bool ADJUST_VERTICAL_NO = false;
+constexpr bool ADJUST_VERTICAL_YES = true;
+constexpr bool ADJUST_VERTICAL_NO = false;
-const F32 CONTEXT_CONE_IN_ALPHA = 0.f;
-const F32 CONTEXT_CONE_OUT_ALPHA = 1.f;
-const F32 CONTEXT_CONE_FADE_TIME = .08f;
+constexpr F32 CONTEXT_CONE_IN_ALPHA = 0.f;
+constexpr F32 CONTEXT_CONE_OUT_ALPHA = 1.f;
+constexpr F32 CONTEXT_CONE_FADE_TIME = .08f;
namespace LLFloaterEnums
{
@@ -228,7 +228,7 @@ public:
/*virtual*/ void setIsChrome(bool is_chrome);
/*virtual*/ void setRect(const LLRect &rect);
void setIsSingleInstance(bool is_single_instance);
- bool getIsSingleInstance() { return mSingleInstance; }
+ bool getIsSingleInstance() const { return mSingleInstance; }
void initFloater(const Params& p);
@@ -274,17 +274,17 @@ public:
static bool isShown(const LLFloater* floater);
static bool isVisible(const LLFloater* floater);
static bool isMinimized(const LLFloater* floater);
- bool isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts
+ bool isFirstLook() const { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts
virtual bool isFrontmost();
- bool isDependent() { return !mDependeeHandle.isDead(); }
+ bool isDependent() const { return !mDependeeHandle.isDead(); }
void setCanMinimize(bool can_minimize);
void setCanClose(bool can_close);
void setCanTearOff(bool can_tear_off);
virtual void setCanResize(bool can_resize);
void setCanDrag(bool can_drag);
- bool getCanDrag();
+ bool getCanDrag() const;
void setHost(LLMultiFloater* host);
- bool isResizable() const { return mResizable; }
+ bool isResizable() const { return mResizable; }
void setResizeLimits( S32 min_width, S32 min_height );
void getResizeLimits( S32* min_width, S32* min_height ) { *min_width = mMinWidth; *min_height = mMinHeight; }
@@ -347,7 +347,7 @@ public:
virtual void setDocked(bool docked, bool pop_on_undock = true);
virtual void setTornOff(bool torn_off) { mTornOff = torn_off; }
- bool isTornOff() {return mTornOff;}
+ bool isTornOff() const { return mTornOff; }
void setOpenPositioning(LLFloaterEnums::EOpenPositioning pos) {mPositioning = pos;}
@@ -377,6 +377,10 @@ public:
void enableResizeCtrls(bool enable, bool width = true, bool height = true);
bool isPositioning(LLFloaterEnums::EOpenPositioning p) const { return (p == mPositioning); }
+
+ void setAutoFocus(bool focus) { mAutoFocus = focus; } // whether to automatically take focus when opened
+ bool getAutoFocus() const { return mAutoFocus; }
+
protected:
void applyControlsAndPosition(LLFloater* other);
@@ -401,8 +405,6 @@ protected:
void setExpandedRect(const LLRect& rect) { mExpandedRect = rect; } // size when not minimized
const LLRect& getExpandedRect() const { return mExpandedRect; }
- void setAutoFocus(bool focus) { mAutoFocus = focus; } // whether to automatically take focus when opened
- bool getAutoFocus() const { return mAutoFocus; }
LLDragHandle* getDragHandle() const { return mDragHandle; }
void destroy(); // Don't call this directly. You probably want to call closeFloater()
@@ -423,7 +425,6 @@ protected:
private:
void setForeground(bool b); // called only by floaterview
void cleanupHandles(); // remove handles to dead floaters
- void createMinimizeButton();
void buildButtons(const Params& p);
// Images and tooltips are named in the XML, but we want to look them
diff --git a/indra/llui/llfloaterreglistener.h b/indra/llui/llfloaterreglistener.h
index a36072892c..28f6e7c66b 100644
--- a/indra/llui/llfloaterreglistener.h
+++ b/indra/llui/llfloaterreglistener.h
@@ -30,7 +30,6 @@
#define LL_LLFLOATERREGLISTENER_H
#include "lleventapi.h"
-#include <string>
class LLSD;
diff --git a/indra/llui/llflyoutbutton.h b/indra/llui/llflyoutbutton.h
index 7a49501318..73190fc984 100644
--- a/indra/llui/llflyoutbutton.h
+++ b/indra/llui/llflyoutbutton.h
@@ -54,7 +54,7 @@ protected:
LLFlyoutButton(const Params&);
friend class LLUICtrlFactory;
public:
- virtual void draw();
+ void draw() override;
void setToggleState(bool state);
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 1fa0ac137e..89fee5c9f1 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -97,7 +97,7 @@ public:
LLFocusableElement* getLastKeyboardFocus() const { return mLastKeyboardFocus; }
bool childHasKeyboardFocus( const LLView* parent ) const;
void removeKeyboardFocusWithoutCallback( const LLFocusableElement* focus );
- bool getKeystrokesOnly() { return mKeystrokesOnly; }
+ bool getKeystrokesOnly() const { return mKeystrokesOnly; }
void setKeystrokesOnly(bool keystrokes_only) { mKeystrokesOnly = keystrokes_only; }
F32 getFocusFlashAmt() const;
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index b664065532..db4ab8487e 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -1510,6 +1510,7 @@ bool LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )
&& ( count > 0 && (hasVisibleChildren()) ))) && // show menu only if selected items are visible
!hide_folder_menu)
{
+ LL_INFOS("Inventory") << "Opening inventory menu from path: " << getPathname() << LL_ENDL;
if (mCallbackRegistrar)
{
mCallbackRegistrar->pushScope();
diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index 7ed10d9223..368a86ea84 100644
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -124,11 +124,11 @@ public:
void setSelectCallback(const signal_t::slot_type& cb) { mSelectSignal.connect(cb); }
void setReshapeCallback(const signal_t::slot_type& cb) { mReshapeSignal.connect(cb); }
- bool getAllowMultiSelect() { return mAllowMultiSelect; }
- bool getAllowDrag() { return mAllowDrag; }
+ bool getAllowMultiSelect() const { return mAllowMultiSelect; }
+ bool getAllowDrag() const { return mAllowDrag; }
void setSingleFolderMode(bool is_single_mode) { mSingleFolderMode = is_single_mode; }
- bool isSingleFolderMode() { return mSingleFolderMode; }
+ bool isSingleFolderMode() const { return mSingleFolderMode; }
// Close all folders in the view
void closeAllFolders();
@@ -142,7 +142,7 @@ public:
virtual S32 getItemHeight() const;
void arrangeAll() { mArrangeGeneration++; }
- S32 getArrangeGeneration() { return mArrangeGeneration; }
+ S32 getArrangeGeneration() const { return mArrangeGeneration; }
// applies filters to control visibility of items
virtual void filter( LLFolderViewFilter& filter);
@@ -221,33 +221,34 @@ public:
void scrollToShowSelection();
void scrollToShowItem(LLFolderViewItem* item, const LLRect& constraint_rect);
void setScrollContainer( LLScrollContainer* parent ) { mScrollContainer = parent; }
+ LLScrollContainer* getScrollContainer() { return mScrollContainer; }
LLRect getVisibleRect();
bool search(LLFolderViewItem* first_item, const std::string &search_string, bool backward);
void setShowSelectionContext(bool show) { mShowSelectionContext = show; }
bool getShowSelectionContext();
void setShowSingleSelection(bool show);
- bool getShowSingleSelection() { return mShowSingleSelection; }
- F32 getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }
- bool getUseEllipses() { return mUseEllipses; }
- S32 getSelectedCount() { return (S32)mSelectedItems.size(); }
+ bool getShowSingleSelection() const { return mShowSingleSelection; }
+ F32 getSelectionFadeElapsedTime() const { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }
+ bool getUseEllipses() const { return mUseEllipses; }
+ S32 getSelectedCount() const { return (S32)mSelectedItems.size(); }
- void update(); // needs to be called periodically (e.g. once per frame)
+ void update(); // needs to be called periodically (e.g. once per frame)
- bool needsAutoSelect() { return mNeedsAutoSelect && !mAutoSelectOverride; }
- bool needsAutoRename() { return mNeedsAutoRename; }
+ bool needsAutoSelect() const { return mNeedsAutoSelect && !mAutoSelectOverride; }
+ bool needsAutoRename() const { return mNeedsAutoRename; }
void setNeedsAutoRename(bool val) { mNeedsAutoRename = val; }
void setPinningSelectedItem(bool val) { mPinningSelectedItem = val; }
void setAutoSelectOverride(bool val) { mAutoSelectOverride = val; }
- bool showItemLinkOverlays() { return mShowItemLinkOverlays; }
+ bool showItemLinkOverlays() const { return mShowItemLinkOverlays; }
void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; }
void setEnableRegistrar(LLUICtrl::EnableCallbackRegistry::ScopedRegistrar* registrar) { mEnableRegistrar = registrar; }
void setForceArrange(bool force) { mForceArrange = force; }
- LLPanel* getParentPanel() { return mParentPanel.get(); }
+ LLPanel* getParentPanel() const { return mParentPanel.get(); }
// DEBUG only
void dumpSelectionInformation();
@@ -255,7 +256,7 @@ public:
void setShowEmptyMessage(bool show_msg) { mShowEmptyMessage = show_msg; }
- bool useLabelSuffix() { return mUseLabelSuffix; }
+ bool useLabelSuffix() const { return mUseLabelSuffix; }
virtual void updateMenu();
void finishRenamingItem( void );
@@ -391,7 +392,7 @@ public:
virtual ~LLSelectFirstFilteredItem() {}
virtual void doFolder(LLFolderViewFolder* folder);
virtual void doItem(LLFolderViewItem* item);
- bool wasItemSelected() { return mItemSelected || mFolderSelected; }
+ bool wasItemSelected() const { return mItemSelected || mFolderSelected; }
protected:
bool mItemSelected;
bool mFolderSelected;
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 6d0cfcba95..878f1cb856 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -31,11 +31,12 @@
#include "llfolderviewitem.h"
#include "llfolderview.h"
#include "llfolderviewmodel.h"
-#include "llpanel.h"
#include "llcallbacklist.h"
#include "llcriticaldamp.h"
#include "llclipboard.h"
#include "llfocusmgr.h" // gFocusMgr
+#include "llnotificationsutil.h"
+#include "llpanel.h"
#include "lltrans.h"
#include "llwindow.h"
@@ -60,7 +61,11 @@ LLUIColor LLFolderViewItem::sSearchStatusColor;
S32 LLFolderViewItem::sTopPad = 0;
LLUIImagePtr LLFolderViewItem::sFolderArrowImg;
LLUIImagePtr LLFolderViewItem::sSelectionImg;
+LLUIImagePtr LLFolderViewItem::sFavoriteImg;
+LLUIImagePtr LLFolderViewItem::sFavoriteContentImg;
LLFontGL* LLFolderViewItem::sSuffixFont = nullptr;
+LLUIColor LLFolderViewItem::sFavoriteColor;
+bool LLFolderViewItem::sColorSetInitialized = false;
// only integers can be initialized in header
const F32 LLFolderViewItem::FOLDER_CLOSE_TIME_CONSTANT = 0.02f;
@@ -68,6 +73,9 @@ const F32 LLFolderViewItem::FOLDER_OPEN_TIME_CONSTANT = 0.03f;
const LLColor4U DEFAULT_WHITE(255, 255, 255);
+constexpr S32 FAVORITE_IMAGE_SIZE = 14;
+constexpr S32 FAVORITE_IMAGE_PAD = 3;
+
//static
LLFontGL* LLFolderViewItem::getLabelFontForStyle(U8 style)
@@ -102,6 +110,8 @@ void LLFolderViewItem::initClass()
sTopPad = default_params.item_top_pad;
sFolderArrowImg = default_params.folder_arrow_image;
sSelectionImg = default_params.selection_image;
+ sFavoriteImg = default_params.favorite_image;
+ sFavoriteContentImg = default_params.favorite_content_image;
sSuffixFont = getLabelFontForStyle(LLFontGL::NORMAL);
sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
@@ -121,6 +131,8 @@ void LLFolderViewItem::cleanupClass()
sFonts.clear();
sFolderArrowImg = nullptr;
sSelectionImg = nullptr;
+ sFavoriteImg = nullptr;
+ sFavoriteContentImg = nullptr;
sSuffixFont = nullptr;
}
@@ -129,13 +141,15 @@ void LLFolderViewItem::cleanupClass()
LLFolderViewItem::Params::Params()
: root(),
listener(),
+ favorite_image("favorite_image"),
+ favorite_content_image("favorite_content_image"),
folder_arrow_image("folder_arrow_image"),
folder_indentation("folder_indentation"),
selection_image("selection_image"),
item_height("item_height"),
item_top_pad("item_top_pad"),
creation_date(),
- allow_wear("allow_wear", true),
+ marketplace_item("marketplace_item", false),
allow_drop("allow_drop", true),
font_color("font_color"),
font_highlight_color("font_highlight_color"),
@@ -155,6 +169,8 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
: LLView(p),
mLabelWidth(0),
mLabelWidthDirty(false),
+ mIsFavorite(false),
+ mHasFavorites(false),
mSuffixNeedsRefresh(false),
mLabelPaddingRight(DEFAULT_LABEL_PADDING_RIGHT),
mParentFolder( NULL ),
@@ -175,7 +191,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mRoot(p.root),
mViewModelItem(p.listener),
mIsMouseOverTitle(false),
- mAllowWear(p.allow_wear),
+ mMarketplaceItem(p.marketplace_item),
mAllowDrop(p.allow_drop),
mFontColor(p.font_color),
mFontHighlightColor(p.font_highlight_color),
@@ -189,6 +205,21 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mMaxFolderItemOverlap(p.max_folder_item_overlap),
mDoubleClickOverride(p.double_click_override)
{
+ if (!sColorSetInitialized)
+ {
+ sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+ sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
+ sFlashBgColor = LLUIColorTable::instance().getColor("MenuItemFlashBgColor", DEFAULT_WHITE);
+ sFocusOutlineColor = LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
+ sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);
+ sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE);
+ sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE);
+ sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
+ sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
+ sFavoriteColor = LLUIColorTable::instance().getColor("InventoryFavoriteColor", DEFAULT_WHITE);
+ sColorSetInitialized = true;
+ }
+
if (mViewModelItem)
{
mViewModelItem->setFolderViewItem(this);
@@ -211,6 +242,7 @@ bool LLFolderViewItem::postBuild()
// getDisplayName() is expensive (due to internal getLabelSuffix() and name building)
// it also sets search strings so it requires a filter reset
mLabel = utf8str_to_wstring(vmi->getDisplayName());
+ mIsFavorite = vmi->isFavorite() && !vmi->isItemInTrash();
setToolTip(vmi->getName());
// Dirty the filter flag of the model from the view (CHUI-849)
@@ -325,6 +357,7 @@ void LLFolderViewItem::refresh()
mLabel = utf8str_to_wstring(vmi.getDisplayName());
mLabelFontBuffer.reset();
+ mIsFavorite = vmi.isFavorite() && !vmi.isItemInTrash();
setToolTip(vmi.getName());
// icons are slightly expensive to get, can be optimized
// see LLInventoryIcon::getIcon()
@@ -359,6 +392,8 @@ void LLFolderViewItem::refreshSuffix()
mIconOpen = vmi->getIconOpen();
mIconOverlay = vmi->getIconOverlay();
+ mIsFavorite = vmi->isFavorite() && !vmi->isItemInTrash();
+
if (mRoot->useLabelSuffix())
{
// Very Expensive!
@@ -428,6 +463,10 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height )
}
mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel.c_str()) + getLabelFontForStyle(LLFontGL::NORMAL)->getWidth(mLabelSuffix.c_str()) + mLabelPaddingRight;
mLabelWidthDirty = false;
+ if (mIsFavorite)
+ {
+ mLabelWidth += FAVORITE_IMAGE_SIZE + FAVORITE_IMAGE_PAD;
+ }
}
*width = llmax(*width, mLabelWidth);
@@ -554,10 +593,15 @@ void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags)
void LLFolderViewItem::openItem( void )
{
- if (mAllowWear || !getViewModelItem()->isItemWearable())
+ if (!mMarketplaceItem || !getViewModelItem()->isItemWearable())
{
getViewModelItem()->openItem();
}
+ else if (mMarketplaceItem)
+ {
+ // Wearing an object from any listing, active or not, is verbotten
+ LLNotificationsUtil::add("AlertMerchantListingCannotWear");
+ }
}
void LLFolderViewItem::rename(const std::string& new_name)
@@ -771,6 +815,45 @@ void LLFolderViewItem::drawOpenFolderArrow()
}
}
+void LLFolderViewItem::drawFavoriteIcon()
+{
+ static LLUICachedControl<bool> draw_star("InventoryFavoritesUseStar", true);
+ static LLUICachedControl<bool> draw_hollow_star("InventoryFavoritesUseHollowStar", true);
+
+ LLUIImage* favorite_image = nullptr;
+ if (draw_star && mIsFavorite)
+ {
+ favorite_image = sFavoriteImg;
+ }
+ else if (draw_hollow_star && mHasFavorites && !isOpen())
+ {
+ favorite_image = sFavoriteContentImg;
+ }
+
+ if (favorite_image)
+ {
+ S32 x_offset = 0;
+ LLScrollContainer* scroll = mRoot->getScrollContainer();
+ if (scroll)
+ {
+ S32 width = scroll->getVisibleContentRect().getWidth();
+ S32 offset = scroll->getDocPosHorizontal();
+ x_offset = width + offset;
+ }
+ else
+ {
+ x_offset = getRect().getWidth();
+ }
+ gl_draw_scaled_image(
+ x_offset - FAVORITE_IMAGE_SIZE - FAVORITE_IMAGE_PAD,
+ getRect().getHeight() - mItemHeight + FAVORITE_IMAGE_PAD,
+ FAVORITE_IMAGE_SIZE,
+ FAVORITE_IMAGE_SIZE,
+ favorite_image->getImage(),
+ sFgColor);
+ }
+}
+
/*virtual*/ bool LLFolderViewItem::isHighlightAllowed()
{
return mIsSelected;
@@ -928,6 +1011,7 @@ void LLFolderViewItem::draw()
{
drawOpenFolderArrow();
}
+ drawFavoriteIcon();
drawHighlight(show_context, filled, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
@@ -999,7 +1083,20 @@ void LLFolderViewItem::draw()
}
}
- LLColor4 color = (mIsSelected && filled) ? mFontHighlightColor : mFontColor;
+ static LLUICachedControl<bool> highlight_color("InventoryFavoritesColorText", true);
+ LLColor4 color;
+ if (mIsSelected && filled)
+ {
+ color = mFontHighlightColor;
+ }
+ else if (mIsFavorite && highlight_color)
+ {
+ color = sFavoriteColor;
+ }
+ else
+ {
+ color = mFontColor;
+ }
if (isFadeItem())
{
@@ -1093,7 +1190,8 @@ LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
mIsFolderComplete(false), // folder might have children that are not loaded yet.
mAreChildrenInited(false), // folder might have children that are not built yet.
mLastArrangeGeneration( -1 ),
- mLastCalculatedWidth(0)
+ mLastCalculatedWidth(0),
+ mFavoritesDirtyFlags(0)
{
}
@@ -1119,6 +1217,11 @@ LLFolderViewFolder::~LLFolderViewFolder( void )
// The LLView base class takes care of object destruction. make sure that we
// don't have mouse or keyboard focus
gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit()
+
+ if (mFavoritesDirtyFlags)
+ {
+ gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, this);
+ }
}
// addToFolder() returns true if it succeeds. false otherwise
@@ -1762,6 +1865,148 @@ bool LLFolderViewFolder::isMovable()
return true;
}
+void LLFolderViewFolder::updateHasFavorites(bool new_childs_value)
+{
+ if (mFavoritesDirtyFlags == 0)
+ {
+ gIdleCallbacks.addFunction(&LLFolderViewFolder::onIdleUpdateFavorites, this);
+ }
+ if (new_childs_value)
+ {
+ mFavoritesDirtyFlags |= FAVORITE_ADDED;
+ }
+ else
+ {
+ mFavoritesDirtyFlags |= FAVORITE_REMOVED;
+ }
+}
+
+void LLFolderViewFolder::onIdleUpdateFavorites(void* data)
+{
+ LLFolderViewFolder* self = reinterpret_cast<LLFolderViewFolder*>(data);
+ if (self->mFavoritesDirtyFlags == FAVORITE_CLEANUP)
+ {
+ // parent or child already processed the update, clean the callback
+ self->mFavoritesDirtyFlags = 0;
+ gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, data);
+ return;
+ }
+
+ if (self->mFavoritesDirtyFlags == 0)
+ {
+ llassert(false); // should not happen, everything that sets to 0 should clean callback
+ gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, data);
+ return;
+ }
+
+ if (self->getViewModelItem()->isItemInTrash())
+ {
+ // do not display favorite-stars in trash
+ self->mFavoritesDirtyFlags = 0;
+ gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, self);
+ return;
+ }
+
+ if (self->mFavoritesDirtyFlags == FAVORITE_ADDED)
+ {
+ if (!self->mHasFavorites)
+ {
+ // propagate up, exclude root
+ LLFolderViewFolder* parent = self;
+ while (parent
+ && (!parent->hasFavorites() || parent->mFavoritesDirtyFlags)
+ && !parent->getViewModelItem()->isAgentInventoryRoot())
+ {
+ parent->setHasFavorites(true);
+ if (parent->mFavoritesDirtyFlags)
+ {
+ // Parent will remove onIdleUpdateFavorites later, don't remove now,
+ // We are inside gIdleCallbacks. Removing 'self' callback is safe,
+ // but removing 'parent' can invalidate following iterator
+ parent->mFavoritesDirtyFlags = FAVORITE_CLEANUP;
+ }
+ parent = parent->getParentFolder();
+ }
+ }
+ else
+ {
+ // already up to date
+ self->mFavoritesDirtyFlags = 0;
+ gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, self);
+ }
+ }
+ else if (self->mFavoritesDirtyFlags > FAVORITE_ADDED)
+ {
+ // full check
+ LLFolderViewFolder* parent = self;
+ while (parent && !parent->getViewModelItem()->isAgentInventoryRoot())
+ {
+ bool has_favorites = false;
+ for (items_t::iterator iter = parent->mItems.begin();
+ iter != parent->mItems.end();)
+ {
+ items_t::iterator iit = iter++;
+ if ((*iit)->isFavorite())
+ {
+ has_favorites = true;
+ break;
+ }
+ }
+
+ for (folders_t::iterator iter = parent->mFolders.begin();
+ iter != parent->mFolders.end() && !has_favorites;)
+ {
+ folders_t::iterator fit = iter++;
+ if ((*fit)->isFavorite() || (*fit)->hasFavorites())
+ {
+ has_favorites = true;
+ break;
+ }
+ }
+
+ if (!has_favorites)
+ {
+ if (parent->hasFavorites())
+ {
+ parent->setHasFavorites(false);
+ }
+ else
+ {
+ // Nothing changed
+ break;
+ }
+ }
+ else
+ {
+ // propagate up, exclude root
+ while (parent
+ && (!parent->hasFavorites() || parent->mFavoritesDirtyFlags)
+ && !parent->getViewModelItem()->isAgentInventoryRoot())
+ {
+ parent->setHasFavorites(true);
+ if (parent->mFavoritesDirtyFlags)
+ {
+ // Parent will remove onIdleUpdateFavorites later, don't remove now,
+ // We are inside gIdleCallbacks. Removing 'self' callback is safe,
+ // but removing 'parent' can invalidate following iterator
+ parent->mFavoritesDirtyFlags = FAVORITE_CLEANUP;
+ }
+ parent = parent->getParentFolder();
+ }
+ break;
+ }
+ if (parent->mFavoritesDirtyFlags)
+ {
+ // Parent will remove onIdleUpdateFavorites later, don't remove now.
+ // We are inside gIdleCallbacks. Removing 'self' callback is safe,
+ // but removing 'parent' can invalidate following iterator
+ parent->mFavoritesDirtyFlags = FAVORITE_CLEANUP;
+ }
+ parent = parent->getParentFolder();
+ }
+ }
+}
+
bool LLFolderViewFolder::isRemovable()
{
@@ -1869,10 +2114,14 @@ void LLFolderViewFolder::setOpen(bool openitem)
{
// navigateToFolder can destroy this view
// delay it in case setOpen was called from click or key processing
- doOnIdleOneTime([this]()
- {
- getViewModelItem()->navigateToFolder();
- });
+ LLPointer<LLFolderViewModelItem> view_model_item = mViewModelItem;
+ doOnIdleOneTime([view_model_item]()
+ {
+ if (view_model_item.notNull())
+ {
+ view_model_item.get()->navigateToFolder();
+ }
+ });
}
else
{
diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h
index cc8a7d934c..23d794bf26 100644
--- a/indra/llui/llfolderviewitem.h
+++ b/indra/llui/llfolderviewitem.h
@@ -50,7 +50,9 @@ class LLFolderViewItem : public LLView
public:
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
- Optional<LLUIImage*> folder_arrow_image,
+ Optional<LLUIImage*> favorite_image,
+ favorite_content_image,
+ folder_arrow_image,
selection_image;
Mandatory<LLFolderView*> root;
Mandatory<LLFolderViewModelItem*> listener;
@@ -60,7 +62,7 @@ public:
item_top_pad;
Optional<time_t> creation_date;
- Optional<bool> allow_wear;
+ Optional<bool> marketplace_item;
Optional<bool> allow_drop;
Optional<LLUIColor> font_color;
@@ -93,6 +95,8 @@ protected:
LLWString mLabel;
S32 mLabelWidth;
bool mLabelWidthDirty;
+ bool mIsFavorite;
+ bool mHasFavorites;
S32 mLabelPaddingRight;
LLFolderViewFolder* mParentFolder;
LLPointer<LLFolderViewModelItem> mViewModelItem;
@@ -122,7 +126,7 @@ protected:
mIsCurSelection,
mDragAndDropTarget,
mIsMouseOverTitle,
- mAllowWear,
+ mMarketplaceItem,
mAllowDrop,
mSingleFolderMode,
mDoubleClickOverride,
@@ -133,6 +137,7 @@ protected:
LLUIColor mFontColor;
LLUIColor mFontHighlightColor;
+ static bool sColorSetInitialized;
// For now assuming all colors are the same in derived classes.
static LLUIColor sFgColor;
@@ -145,6 +150,8 @@ protected:
static LLUIColor sFilterTextColor;
static LLUIColor sSuffixColor;
static LLUIColor sSearchStatusColor;
+ static LLUIColor sFavoriteColor;
+
// this is an internal method used for adding items to folders. A
// no-op at this level, but reimplemented in derived classes.
@@ -154,7 +161,7 @@ protected:
virtual bool isHighlightActive();
virtual bool isFadeItem();
virtual bool isFlashing() { return false; }
- virtual void setFlashState(bool) { }
+ virtual void setFlashState(bool, bool) { }
static LLFontGL* getLabelFontForStyle(U8 style);
const LLFontGL* getLabelFont();
@@ -208,6 +215,8 @@ public:
// Returns true is this object and all of its children can be moved
virtual bool isMovable();
+ bool isFavorite() const { return mIsFavorite; }
+
// destroys this item recursively
virtual void destroyView();
@@ -282,7 +291,7 @@ public:
// Does not need filter update
virtual void refreshSuffix();
- bool isSingleFolderMode() { return mSingleFolderMode; }
+ bool isSingleFolderMode() const { return mSingleFolderMode; }
// LLView functionality
virtual bool handleRightMouseDown( S32 x, S32 y, MASK mask );
@@ -298,6 +307,7 @@ public:
// virtual void handleDropped();
virtual void draw();
void drawOpenFolderArrow();
+ void drawFavoriteIcon();
void drawHighlight(bool showContent, bool hasKeyboardFocus, const LLUIColor& selectColor, const LLUIColor& flashColor, const LLUIColor& outlineColor, const LLUIColor& mouseOverColor);
void drawLabel(const LLFontGL* font, const F32 x, const F32 y, const LLColor4& color, F32 &right_x);
virtual bool handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
@@ -311,6 +321,8 @@ private:
static S32 sTopPad;
static LLUIImagePtr sFolderArrowImg;
static LLUIImagePtr sSelectionImg;
+ static LLUIImagePtr sFavoriteImg;
+ static LLUIImagePtr sFavoriteContentImg;
static LLFontGL* sSuffixFont;
LLFontVertexBuffer mLabelFontBuffer;
@@ -400,6 +412,19 @@ public:
// Returns true is this object and all of its children can be moved
virtual bool isMovable();
+ bool isFavorite() const { return mIsFavorite; }
+ bool hasFavorites() const { return mHasFavorites; }
+ void setHasFavorites(bool val) { mHasFavorites = val; }
+ void updateHasFavorites(bool new_childs_value);
+private:
+ static void onIdleUpdateFavorites(void* data);
+
+ constexpr static S32 FAVORITE_ADDED = 1;
+ constexpr static S32 FAVORITE_REMOVED = 2;
+ constexpr static S32 FAVORITE_CLEANUP = 4;
+ S32 mFavoritesDirtyFlags { 0 };
+public:
+
// destroys this folder, and all children
virtual void destroyView();
void destroyRoot();
@@ -415,9 +440,6 @@ public:
// doesn't delete it.
virtual void extractItem( LLFolderViewItem* item, bool deparent_model = true);
- // This function is called by a child that needs to be resorted.
- void resort(LLFolderViewItem* item);
-
void setAutoOpenCountdown(F32 countdown) { mAutoOpenCountdown = countdown; }
// folders can be opened. This will usually be called by internal
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 9372818ca5..2865b789b9 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -162,6 +162,7 @@ public:
virtual void navigateToFolder(bool new_window = false, bool change_mode = false) = 0;
+ virtual bool isFavorite() const = 0;
virtual bool isItemWearable() const { return false; }
virtual bool isItemRenameable() const = 0;
@@ -170,7 +171,8 @@ public:
virtual bool isItemMovable( void ) const = 0; // Can be moved to another folder
virtual void move( LLFolderViewModelItem* parent_listener ) = 0;
- virtual bool isItemRemovable( bool check_worn = true ) const = 0; // Can be destroyed
+ virtual bool isItemRemovable( bool check_worn = true) const = 0; // Can be destroyed
+ virtual bool isItemInTrash(void) const = 0;
virtual bool removeItem() = 0;
virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) = 0;
@@ -183,6 +185,9 @@ public:
virtual void pasteFromClipboard() = 0;
virtual void pasteLinkFromClipboard() = 0;
+ virtual bool isAgentInventory() const = 0;
+ virtual bool isAgentInventoryRoot() const = 0;
+
virtual void buildContextMenu(LLMenuGL& menu, U32 flags) = 0;
virtual bool potentiallyVisible() = 0; // is the item definitely visible or we haven't made up our minds yet?
@@ -219,6 +224,7 @@ public:
virtual S32 getSortVersion() = 0;
virtual void setSortVersion(S32 version) = 0;
virtual void setParent(LLFolderViewModelItem* parent) = 0;
+ virtual const LLFolderViewModelItem* getParent() = 0;
virtual bool hasParent() = 0;
protected:
@@ -249,14 +255,14 @@ public:
mChildren.clear();
}
- void requestSort() { mSortVersion = -1; }
- S32 getSortVersion() { return mSortVersion; }
- void setSortVersion(S32 version) { mSortVersion = version;}
+ void requestSort() override { mSortVersion = -1; }
+ S32 getSortVersion() override { return mSortVersion; }
+ void setSortVersion(S32 version) override { mSortVersion = version;}
- S32 getLastFilterGeneration() const { return mLastFilterGeneration; }
+ S32 getLastFilterGeneration() const override { return mLastFilterGeneration; }
S32 getLastFolderFilterGeneration() const { return mLastFolderFilterGeneration; }
- S32 getMarkedDirtyGeneration() const { return mMarkedDirtyGeneration; }
- void dirtyFilter()
+ S32 getMarkedDirtyGeneration() const override { return mMarkedDirtyGeneration; }
+ void dirtyFilter() override
{
if(mMarkedDirtyGeneration < 0)
{
@@ -271,7 +277,7 @@ public:
mParent->dirtyFilter();
}
}
- void dirtyDescendantsFilter()
+ void dirtyDescendantsFilter() override
{
mMostFilteredDescendantGeneration = -1;
if (mParent)
@@ -279,13 +285,13 @@ public:
mParent->dirtyDescendantsFilter();
}
}
- bool hasFilterStringMatch();
- std::string::size_type getFilterStringOffset();
- std::string::size_type getFilterStringSize();
+ bool hasFilterStringMatch() override;
+ std::string::size_type getFilterStringOffset() override;
+ std::string::size_type getFilterStringSize() override;
- typedef std::list<LLFolderViewModelItem*> child_list_t;
+ typedef std::list<LLPointer<LLFolderViewModelItem> > child_list_t;
- virtual void addChild(LLFolderViewModelItem* child)
+ virtual void addChild(LLFolderViewModelItem* child) override
{
mChildren.push_back(child);
child->setParent(this);
@@ -293,15 +299,15 @@ public:
requestSort();
}
- virtual void removeChild(LLFolderViewModelItem* child)
+ virtual void removeChild(LLFolderViewModelItem* child) override final
{
- mChildren.remove(child);
child->setParent(NULL);
+ mChildren.remove(child);
dirtyDescendantsFilter();
dirtyFilter();
}
- virtual void clearChildren()
+ virtual void clearChildren() override
{
// We are working with models that belong to views as LLPointers, clean the list, let poiters handle the rest
std::for_each(mChildren.begin(), mChildren.end(), [](LLFolderViewModelItem* c) {c->setParent(NULL); });
@@ -314,7 +320,7 @@ public:
child_list_t::const_iterator getChildrenEnd() const { return mChildren.end(); }
child_list_t::size_type getChildrenCount() const { return mChildren.size(); }
- void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0)
+ void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) override
{
mPassedFilter = passed;
mLastFilterGeneration = filter_generation;
@@ -323,20 +329,20 @@ public:
mMarkedDirtyGeneration = -1;
}
- void setPassedFolderFilter(bool passed, S32 filter_generation)
+ void setPassedFolderFilter(bool passed, S32 filter_generation) override
{
mPassedFolderFilter = passed;
mLastFolderFilterGeneration = filter_generation;
}
- virtual bool potentiallyVisible()
+ virtual bool potentiallyVisible() override
{
return passedFilter() // we've passed the filter
|| (getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration()) // or we don't know yet
|| descendantsPassedFilter();
}
- virtual bool passedFilter(S32 filter_generation = -1)
+ virtual bool passedFilter(S32 filter_generation = -1) override
{
if (filter_generation < 0)
{
@@ -347,7 +353,7 @@ public:
return passed_folder_filter && (passed_filter || descendantsPassedFilter(filter_generation));
}
- virtual bool descendantsPassedFilter(S32 filter_generation = -1)
+ virtual bool descendantsPassedFilter(S32 filter_generation = -1) override
{
if (filter_generation < 0)
{
@@ -356,10 +362,10 @@ public:
return mMostFilteredDescendantGeneration >= filter_generation;
}
-
protected:
- virtual void setParent(LLFolderViewModelItem* parent) { mParent = parent; }
- virtual bool hasParent() { return mParent != NULL; }
+ virtual void setParent(LLFolderViewModelItem* parent) override final { mParent = parent; }
+ virtual const LLFolderViewModelItem* getParent() override { return mParent; };
+ virtual bool hasParent() override { return mParent != NULL; }
S32 mSortVersion;
bool mPassedFilter;
@@ -376,7 +382,7 @@ protected:
LLFolderViewModelItem* mParent;
LLFolderViewModelInterface& mRootViewModel;
- void setFolderViewItem(LLFolderViewItem* folder_view_item) { mFolderViewItem = folder_view_item;}
+ void setFolderViewItem(LLFolderViewItem* folder_view_item) override { mFolderViewItem = folder_view_item;}
LLFolderViewItem* mFolderViewItem;
};
@@ -390,15 +396,15 @@ public:
mFolderView(NULL)
{}
- virtual void requestSortAll()
+ virtual void requestSortAll() override
{
// sort everything
mTargetSortVersion++;
}
- virtual std::string getStatusText(bool is_empty_folder = false);
- virtual void filter();
+ virtual std::string getStatusText(bool is_empty_folder = false) override;
+ virtual void filter() override;
- void setFolderView(LLFolderView* folder_view) { mFolderView = folder_view;}
+ void setFolderView(LLFolderView* folder_view) override { mFolderView = folder_view;}
protected:
bool needsSort(class LLFolderViewModelItem* item);
@@ -428,14 +434,14 @@ public:
virtual const SortType& getSorter() const { return *mSorter; }
virtual void setSorter(const SortType& sorter) { mSorter.reset(new SortType(sorter)); requestSortAll(); }
- virtual FilterType& getFilter() { return *mFilter; }
- virtual const FilterType& getFilter() const { return *mFilter; }
+ virtual FilterType& getFilter() override { return *mFilter; }
+ virtual const FilterType& getFilter() const override { return *mFilter; }
virtual void setFilter(const FilterType& filter) { mFilter.reset(new FilterType(filter)); }
// By default, we assume the content is available. If a network fetch mechanism is implemented for the model,
// this method needs to be overloaded and return the relevant fetch status.
- virtual bool contentsReady() { return true; }
- virtual bool isFolderComplete(LLFolderViewFolder* folder) { return true; }
+ virtual bool contentsReady() override { return true; }
+ virtual bool isFolderComplete(LLFolderViewFolder* folder) override { return true; }
struct ViewModelCompare
{
@@ -456,7 +462,7 @@ public:
const SortType& mSorter;
};
- void sort(LLFolderViewFolder* folder)
+ void sort(LLFolderViewFolder* folder) override
{
if (needsSort(folder->getViewModelItem()))
{
diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index 7bf43c22c1..2bea8fb4ed 100644
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -170,7 +170,7 @@ std::string LLKeywords::getAttribute(std::string_view key)
return (it != mAttributes.end()) ? it->second : "";
}
-LLUIColor LLKeywords::getColorGroup(std::string_view key_in)
+LLUIColor LLKeywords::getColorGroup(std::string_view key_in) const
{
std::string color_group = "ScriptText";
if (key_in == "functions")
diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h
index 328561c92a..5892238593 100644
--- a/indra/llui/llkeywords.h
+++ b/indra/llui/llkeywords.h
@@ -111,8 +111,8 @@ public:
~LLKeywords();
void clearLoaded() { mLoaded = false; }
- LLUIColor getColorGroup(std::string_view key_in);
- bool isLoaded() const { return mLoaded; }
+ LLUIColor getColorGroup(std::string_view key_in) const;
+ bool isLoaded() const { return mLoaded; }
void findSegments(std::vector<LLTextSegmentPtr> *seg_list,
const LLWString& text,
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 1c59938f90..fe0591ce4b 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -36,8 +36,8 @@
#include "lliconctrl.h"
#include "boost/foreach.hpp"
-static const F32 MIN_FRACTIONAL_SIZE = 0.00001f;
-static const F32 MAX_FRACTIONAL_SIZE = 1.f;
+static constexpr F32 MIN_FRACTIONAL_SIZE = 0.00001f;
+static constexpr F32 MAX_FRACTIONAL_SIZE = 1.f;
static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("layout_stack");
static LLLayoutStack::LayoutStackRegistry::Register<LLLayoutPanel> register_layout_panel("layout_panel");
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 8459921c60..9e3536aaff 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -75,9 +75,6 @@ public:
/*virtual*/ bool addChild(LLView* child, S32 tab_group = 0);
/*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true);
-
- static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node = NULL);
-
typedef enum e_animate
{
NO_ANIMATE,
@@ -86,7 +83,7 @@ public:
void addPanel(LLLayoutPanel* panel, EAnimate animate = NO_ANIMATE);
void collapsePanel(LLPanel* panel, bool collapsed = true);
- S32 getNumPanels() { return static_cast<S32>(mPanels.size()); }
+ S32 getNumPanels() const { return static_cast<S32>(mPanels.size()); }
void updateLayout();
@@ -190,7 +187,6 @@ public:
bool isCollapsed() const { return mCollapsed;}
void setOrientation(LLView::EOrientation orientation);
- void storeOriginalDim();
void setIgnoreReshape(bool ignore) { mIgnoreReshape = ignore; }
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 66b274c33f..b534c8d4e8 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -2230,6 +2230,9 @@ void LLLineEditor::clear()
{
mText.clear();
setCursor(0);
+ mFontBufferPreSelection.reset();
+ mFontBufferSelection.reset();
+ mFontBufferPostSelection.reset();
}
//virtual
@@ -2505,9 +2508,24 @@ void LLLineEditor::resetPreedit()
if (hasPreeditString())
{
const S32 preedit_pos = mPreeditPositions.front();
- mText.erase(preedit_pos, mPreeditPositions.back() - preedit_pos);
- mText.insert(preedit_pos, mPreeditOverwrittenWString);
- setCursor(preedit_pos);
+ const S32 end = mPreeditPositions.back();
+ const S32 len = end - preedit_pos;
+ const S32 size = mText.length();
+ if (preedit_pos < size
+ && end <= size
+ && preedit_pos >= 0
+ && len > 0)
+ {
+ mText.erase(preedit_pos, len);
+ mText.insert(preedit_pos, mPreeditOverwrittenWString);
+ setCursor(preedit_pos);
+ }
+ else
+ {
+ LL_WARNS() << "Index out of bounds. Start: " << preedit_pos
+ << ", end:" << end
+ << ", full string length: " << size << LL_ENDL;
+ }
mPreeditWString.clear();
mPreeditOverwrittenWString.clear();
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 12fe800acb..7533f76f1d 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -306,8 +306,6 @@ public:
S32 calcCursorPos(S32 mouse_x);
bool handleSpecialKey(KEY key, MASK mask);
bool handleSelectionKey(KEY key, MASK mask);
- bool handleControlKey(KEY key, MASK mask);
- S32 handleCommitKey(KEY key, MASK mask);
void updateTextPadding();
// Draw the background image depending on enabled/focused state.
@@ -444,7 +442,7 @@ private:
mText = ed->getText();
}
- void doRollback( LLLineEditor* ed )
+ void doRollback(LLLineEditor* ed) const
{
ed->mCursorPos = mCursorPos;
ed->mScrollHPos = mScrollHPos;
@@ -455,7 +453,7 @@ private:
ed->mPrevText = mText;
}
- std::string getText() { return mText; }
+ std::string getText() const { return mText; }
private:
std::string mText;
diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h
index a77ae7dae7..3f96b28246 100644
--- a/indra/llui/llmenubutton.h
+++ b/indra/llui/llmenubutton.h
@@ -65,8 +65,8 @@ public:
boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb );
- /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleKeyHere(KEY key, MASK mask );
+ bool handleMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleKeyHere(KEY key, MASK mask) override;
void hideMenu();
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index c11b42a348..2ca2454040 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -46,6 +46,7 @@
#include "llfocusmgr.h"
#include "llcoord.h"
#include "llwindow.h"
+#include "llemojihelper.h"
#include "llcriticaldamp.h"
#include "lluictrlfactory.h"
@@ -1411,6 +1412,7 @@ void LLMenuItemBranchDownGL::openMenu( void )
}
else
{
+ LLEmojiHelper::instance().hideHelper(nullptr, true);
if (branch->getTornOff())
{
LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent());
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 66f84393fe..ff9456acc6 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -439,8 +439,6 @@ protected:
public:
virtual ~LLMenuGL( void );
- void parseChildXML(LLXMLNodePtr child, LLView* parent);
-
// LLView Functionality
/*virtual*/ bool handleUnicodeCharHere( llwchar uni_char );
/*virtual*/ bool handleHover( S32 x, S32 y, MASK mask );
diff --git a/indra/llui/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp
index c5c31f7252..225ff607ad 100644
--- a/indra/llui/llmodaldialog.cpp
+++ b/indra/llui/llmodaldialog.cpp
@@ -28,6 +28,7 @@
#include "llmodaldialog.h"
+#include "llemojihelper.h"
#include "llfocusmgr.h"
#include "v4color.h"
#include "v2math.h"
@@ -35,6 +36,7 @@
#include "llwindow.h"
#include "llkeyboard.h"
#include "llmenugl.h"
+
// static
std::list<LLModalDialog*> LLModalDialog::sModalStack;
@@ -98,7 +100,7 @@ void LLModalDialog::onOpen(const LLSD& key)
{
if (mModal)
{
- // If Modal, Hide the active modal dialog
+ // If Modal, hide the active modal dialog
if (!sModalStack.empty())
{
LLModalDialog* front = sModalStack.front();
@@ -155,6 +157,12 @@ void LLModalDialog::setVisible( bool visible )
{
if( visible )
{
+ // Hide all menus currently shown
+ LLMenuGL::sMenuContainer->hideMenus();
+
+ // Hide EmojiPicker if it is shown
+ LLEmojiHelper::instance().hideHelper(nullptr, true);
+
// This is a modal dialog. It sucks up all mouse and keyboard operations.
gFocusMgr.setMouseCapture( this );
@@ -301,7 +309,6 @@ void LLModalDialog::centerOnScreen()
centerWithin(LLRect(0, 0, ll_round(window_size.mV[VX]), ll_round(window_size.mV[VY])));
}
-
// static
void LLModalDialog::onAppFocusLost()
{
@@ -333,6 +340,7 @@ void LLModalDialog::onAppFocusGained()
}
}
+// static
void LLModalDialog::shutdownModals()
{
// This method is only for use during app shutdown. ~LLModalDialog()
diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp
index a7f9b8b2d9..f53e22c349 100644
--- a/indra/llui/llmultifloater.cpp
+++ b/indra/llui/llmultifloater.cpp
@@ -390,7 +390,7 @@ LLFloater* LLMultiFloater::getActiveFloater()
return (LLFloater*)mTabContainer->getCurrentPanel();
}
-S32 LLMultiFloater::getFloaterCount()
+S32 LLMultiFloater::getFloaterCount() const
{
return mTabContainer->getTabCount();
}
diff --git a/indra/llui/llmultifloater.h b/indra/llui/llmultifloater.h
index eb0f917695..e0cd58aa3f 100644
--- a/indra/llui/llmultifloater.h
+++ b/indra/llui/llmultifloater.h
@@ -66,7 +66,7 @@ public:
virtual LLFloater* getActiveFloater();
virtual bool isFloaterFlashing(LLFloater* floaterp);
- virtual S32 getFloaterCount();
+ virtual S32 getFloaterCount() const;
virtual void setFloaterFlashing(LLFloater* floaterp, bool flashing);
virtual bool closeAllFloaters(); //Returns false if the floater could not be closed due to pending confirmation dialogs
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index b2bfc8bc84..af255bcc8f 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -117,10 +117,10 @@ public:
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask) override;
/*virtual*/ void draw() override;
- S32 getMaxNumSliders() { return mMaxNumSliders; }
- S32 getCurNumSliders() { return static_cast<S32>(mValue.size()); }
- F32 getOverlapThreshold() { return mOverlapThreshold; }
- bool canAddSliders() { return mValue.size() < mMaxNumSliders; }
+ S32 getMaxNumSliders() const { return mMaxNumSliders; }
+ S32 getCurNumSliders() const { return static_cast<S32>(mValue.size()); }
+ F32 getOverlapThreshold() const { return mOverlapThreshold; }
+ bool canAddSliders() const { return mValue.size() < mMaxNumSliders; }
protected:
diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h
index dec6cb48b9..2c2bc5e4d9 100644
--- a/indra/llui/llmultisliderctrl.h
+++ b/indra/llui/llmultisliderctrl.h
@@ -124,10 +124,10 @@ public:
F32 getMinValue() const { return mMultiSlider->getMinValue(); }
F32 getMaxValue() const { return mMultiSlider->getMaxValue(); }
- S32 getMaxNumSliders() { return mMultiSlider->getMaxNumSliders(); }
- S32 getCurNumSliders() { return mMultiSlider->getCurNumSliders(); }
- F32 getOverlapThreshold() { return mMultiSlider->getOverlapThreshold(); }
- bool canAddSliders() { return mMultiSlider->canAddSliders(); }
+ S32 getMaxNumSliders() const { return mMultiSlider->getMaxNumSliders(); }
+ S32 getCurNumSliders() const { return mMultiSlider->getCurNumSliders(); }
+ F32 getOverlapThreshold() const { return mMultiSlider->getOverlapThreshold(); }
+ bool canAddSliders() const { return mMultiSlider->canAddSliders(); }
void setLabel(const std::string& label) { if (mLabelBox) mLabelBox->setText(label); }
void setLabelColor(const LLUIColor& c) { mTextEnabledColor = c; }
@@ -147,7 +147,6 @@ public:
static void onEditorCommit(LLUICtrl* ctrl, const LLSD& userdata);
static void onEditorGainFocus(LLFocusableElement* caller, void *userdata);
- static void onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);
private:
void updateText();
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 138f1969d5..3c8e1e85fa 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -247,7 +247,6 @@ public:
LLNotificationForm(const LLSD& sd);
LLNotificationForm(const std::string& name, const Params& p);
- void fromLLSD(const LLSD& sd);
LLSD asLLSD() const;
S32 getNumElements() { return static_cast<S32>(mFormData.size()); }
@@ -266,8 +265,8 @@ public:
bool getIgnored();
void setIgnored(bool ignored);
- EIgnoreType getIgnoreType() { return mIgnore; }
- std::string getIgnoreMessage() { return mIgnoreMsg; }
+ EIgnoreType getIgnoreType()const { return mIgnore; }
+ std::string getIgnoreMessage() const { return mIgnoreMsg; }
private:
LLSD mFormData;
@@ -971,8 +970,6 @@ private:
/*virtual*/ void initSingleton() override;
/*virtual*/ void cleanupSingleton() override;
- void loadPersistentNotifications();
-
bool expirationFilter(LLNotificationPtr pNotification);
bool expirationHandler(const LLSD& payload);
bool uniqueFilter(LLNotificationPtr pNotification);
diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h
index 0d5d32cf21..7245bbf1cf 100644
--- a/indra/llui/llprogressbar.h
+++ b/indra/llui/llprogressbar.h
@@ -48,9 +48,9 @@ public:
LLProgressBar(const Params&);
virtual ~LLProgressBar();
- void setValue(const LLSD& value);
+ void setValue(const LLSD& value) override;
- /*virtual*/ void draw();
+ void draw() override;
private:
F32 mPercentDone;
diff --git a/indra/llui/llresizebar.h b/indra/llui/llresizebar.h
index 4b0f435834..68bf0fd95e 100644
--- a/indra/llui/llresizebar.h
+++ b/indra/llui/llresizebar.h
@@ -61,7 +61,7 @@ public:
void setResizeLimits( S32 min_size, S32 max_size ) { mMinSize = min_size; mMaxSize = max_size; }
void setEnableSnapping(bool enable) { mSnappingEnabled = enable; }
void setAllowDoubleClickSnapping(bool allow) { mAllowDoubleClickSnapping = allow; }
- bool canResize() { return getEnabled() && mMaxSize > mMinSize; }
+ bool canResize() const { return getEnabled() && mMaxSize > mMinSize; }
void setResizeListener(boost::function<void(void*)> listener) {mResizeListener = listener;}
void setImagePanel(LLPanel * panelp);
LLPanel * getImagePanel() const;
diff --git a/indra/llui/llresizehandle.h b/indra/llui/llresizehandle.h
index 9cc4123544..caec33405c 100644
--- a/indra/llui/llresizehandle.h
+++ b/indra/llui/llresizehandle.h
@@ -50,10 +50,10 @@ protected:
LLResizeHandle(const LLResizeHandle::Params&);
friend class LLUICtrlFactory;
public:
- virtual void draw();
- virtual bool handleHover(S32 x, S32 y, MASK mask);
- virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
- virtual bool handleMouseUp(S32 x, S32 y, MASK mask);
+ void draw() override;
+ bool handleHover(S32 x, S32 y, MASK mask) override;
+ bool handleMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleMouseUp(S32 x, S32 y, MASK mask) override;
void setResizeLimits( S32 min_width, S32 min_height ) { mMinWidth = min_width; mMinHeight = min_height; }
@@ -71,8 +71,8 @@ private:
const ECorner mCorner;
};
-const S32 RESIZE_HANDLE_HEIGHT = 11;
-const S32 RESIZE_HANDLE_WIDTH = 11;
+constexpr S32 RESIZE_HANDLE_HEIGHT = 11;
+constexpr S32 RESIZE_HANDLE_WIDTH = 11;
#endif // LL_RESIZEHANDLE_H
diff --git a/indra/llui/llrngwriter.h b/indra/llui/llrngwriter.h
index 33ec049a1a..2c39472607 100644
--- a/indra/llui/llrngwriter.h
+++ b/indra/llui/llrngwriter.h
@@ -37,7 +37,7 @@ public:
void writeRNG(const std::string& name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace);
void addDefinition(const std::string& type_name, const LLInitParam::BaseBlock& block);
- /*virtual*/ std::string getCurrentElementName() { return LLStringUtil::null; }
+ std::string getCurrentElementName() override { return LLStringUtil::null; }
LLRNGWriter();
diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h
index e7ff5c8424..7dded3c0b7 100644
--- a/indra/llui/llscrolllistcell.h
+++ b/indra/llui/llscrolllistcell.h
@@ -105,7 +105,7 @@ public:
virtual const LLSD getAltValue() const;
virtual void setValue(const LLSD& value) { }
virtual void setAltValue(const LLSD& value) { }
- virtual const std::string &getToolTip() const { return mToolTip; }
+ virtual const std::string& getToolTip() const { return mToolTip; }
virtual void setToolTip(const std::string &str) { mToolTip = str; }
virtual bool getVisible() const { return true; }
virtual void setWidth(S32 width) { mWidth = width; }
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 245339b107..ff77b4d482 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -1007,7 +1007,7 @@ void LLScrollListCtrl::deleteItems(const LLSD& sd)
void LLScrollListCtrl::deleteSelectedItems()
{
item_list::iterator iter;
- for (iter = mItemList.begin(); iter < mItemList.end(); )
+ for (iter = mItemList.begin(); iter != mItemList.end(); )
{
LLScrollListItem* itemp = *iter;
if (itemp->getSelected())
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index c24784338a..1f04100306 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -165,7 +165,6 @@ public:
void deleteAllItems() { clearRows(); }
// Sets an array of column descriptors
- void setColumnHeadings(const LLSD& headings);
void sortByColumnIndex(U32 column, bool ascending);
// LLCtrlListInterface functions
@@ -318,7 +317,7 @@ public:
void setAllowKeyboardMovement(bool b) { mAllowKeyboardMovement = b; }
void setMaxSelectable(U32 max_selected) { mMaxSelectable = max_selected; }
- S32 getMaxSelectable() { return mMaxSelectable; }
+ S32 getMaxSelectable() const { return mMaxSelectable; }
virtual S32 getScrollPos() const;
@@ -334,7 +333,7 @@ public:
// support right-click context menus for avatar/group lists
enum ContextMenuType { MENU_NONE, MENU_AVATAR, MENU_GROUP };
void setContextMenu(const ContextMenuType &menu) { mContextMenuType = menu; }
- ContextMenuType getContextMenuType() { return mContextMenuType; }
+ ContextMenuType getContextMenuType() const { return mContextMenuType; }
// Overridden from LLView
/*virtual*/ void draw();
@@ -362,7 +361,6 @@ public:
virtual void fitContents(S32 max_width, S32 max_height);
virtual LLRect getRequiredRect();
- static bool rowPreceeds(LLScrollListItem *new_row, LLScrollListItem *test_row);
LLRect getItemListRect() { return mItemListRect; }
@@ -384,7 +382,6 @@ public:
* then display all items.
*/
void setPageLines(S32 page_lines );
- void setCollapseEmptyColumns(bool collapse);
LLScrollListItem* hitItem(S32 x,S32 y);
virtual void scrollToShowSelected();
@@ -401,7 +398,7 @@ public:
void setNumDynamicColumns(S32 num) { mNumDynamicWidthColumns = num; }
void updateStaticColumnWidth(LLScrollListColumn* col, S32 new_width);
- S32 getTotalStaticColumnWidth() { return mTotalStaticColumnWidth; }
+ S32 getTotalStaticColumnWidth() const { return mTotalStaticColumnWidth; }
std::string getSortColumnName();
bool getSortAscending() { return mSortColumns.empty() ? true : mSortColumns.back().second; }
diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h
index 311377a61f..23ce8fd955 100644
--- a/indra/llui/llsliderctrl.h
+++ b/indra/llui/llsliderctrl.h
@@ -132,7 +132,6 @@ public:
static void onEditorCommit(LLUICtrl* ctrl, const LLSD& userdata);
static void onEditorGainFocus(LLFocusableElement* caller, void *userdata);
- static void onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);
protected:
virtual std::string _getSearchText() const
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index 58b38dc630..4ba8c97c63 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -94,7 +94,6 @@ public:
void onEditorCommit(const LLSD& data);
static void onEditorGainFocus(LLFocusableElement* caller, void *userdata);
static void onEditorLostFocus(LLFocusableElement* caller, void *userdata);
- static void onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);
void onUpBtn(const LLSD& data);
void onDownBtn(const LLSD& data);
diff --git a/indra/llui/llstatbar.h b/indra/llui/llstatbar.h
index c36a138566..bbbf0b3a19 100644
--- a/indra/llui/llstatbar.h
+++ b/indra/llui/llstatbar.h
@@ -67,7 +67,7 @@ public:
void setStat(const std::string& stat_name);
void setRange(F32 bar_min, F32 bar_max);
- void getRange(F32& bar_min, F32& bar_max) { bar_min = mTargetMinBar; bar_max = mTargetMaxBar; }
+ void getRange(F32& bar_min, F32& bar_max) const { bar_min = mTargetMinBar; bar_max = mTargetMaxBar; }
/*virtual*/ LLRect getRequiredRect(); // Return the height of this object, given the set options.
diff --git a/indra/llui/llstatgraph.cpp b/indra/llui/llstatgraph.cpp
index d97051247e..0af717d447 100644
--- a/indra/llui/llstatgraph.cpp
+++ b/indra/llui/llstatgraph.cpp
@@ -36,7 +36,6 @@
#include "llglheaders.h"
#include "lltracerecording.h"
#include "lltracethreadrecorder.h"
-//#include "llviewercontrol.h"
///////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/llui/llstatgraph.h b/indra/llui/llstatgraph.h
index c254821870..6d9e3d1064 100644
--- a/indra/llui/llstatgraph.h
+++ b/indra/llui/llstatgraph.h
@@ -99,9 +99,7 @@ public:
void setMin(const F32 min);
void setMax(const F32 max);
- virtual void draw();
-
- /*virtual*/ void setValue(const LLSD& value);
+ void draw() override;
private:
LLTrace::StatType<LLTrace::CountAccumulator>* mNewStatFloatp;
@@ -133,9 +131,6 @@ private:
};
typedef std::vector<Threshold> threshold_vec_t;
threshold_vec_t mThresholds;
- //S32 mNumThresholds;
- //F32 mThresholds[4];
- //LLColor4 mThresholdColors[4];
};
#endif // LL_LLSTATGRAPH_H
diff --git a/indra/llui/llstatview.h b/indra/llui/llstatview.h
index b5187f886d..a396773057 100644
--- a/indra/llui/llstatview.h
+++ b/indra/llui/llstatview.h
@@ -29,7 +29,6 @@
#include "llstatbar.h"
#include "llcontainerview.h"
-#include <vector>
class LLStatBar;
diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp
index 4714665e8b..7a0e620d61 100644
--- a/indra/llui/llstyle.cpp
+++ b/indra/llui/llstyle.cpp
@@ -38,11 +38,13 @@ LLStyle::Params::Params()
color("color", LLColor4::black),
readonly_color("readonly_color", LLColor4::black),
selected_color("selected_color", LLColor4::black),
+ highlight_bg_color("highlight_bg_color", LLColor4::green),
alpha("alpha", 1.f),
font("font", LLStyle::getDefaultFont()),
image("image"),
link_href("href"),
- is_link("is_link")
+ is_link("is_link"),
+ draw_highlight_bg("draw_highlight_bg", false)
{}
@@ -51,12 +53,14 @@ LLStyle::LLStyle(const LLStyle::Params& p)
mColor(p.color),
mReadOnlyColor(p.readonly_color),
mSelectedColor(p.selected_color),
+ mHighlightBgColor(p.highlight_bg_color),
mFont(p.font()),
mLink(p.link_href),
mIsLink(p.is_link.isProvided() ? p.is_link : !p.link_href().empty()),
mDropShadow(p.drop_shadow),
mImagep(p.image()),
- mAlpha(p.alpha)
+ mAlpha(p.alpha),
+ mDrawHighlightBg(p.draw_highlight_bg)
{}
void LLStyle::setFont(const LLFontGL* font)
diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h
index 0c78fe5a9f..71c3f88109 100644
--- a/indra/llui/llstyle.h
+++ b/indra/llui/llstyle.h
@@ -43,15 +43,25 @@ public:
Optional<LLFontGL::ShadowType> drop_shadow;
Optional<LLUIColor> color,
readonly_color,
- selected_color;
+ selected_color,
+ highlight_bg_color;
Optional<F32> alpha;
Optional<const LLFontGL*> font;
Optional<LLUIImage*> image;
Optional<std::string> link_href;
Optional<bool> is_link;
+ Optional<bool> draw_highlight_bg;
Params();
};
LLStyle(const Params& p = Params());
+
+ enum EUnderlineLink
+ {
+ UNDERLINE_ALWAYS = 0,
+ UNDERLINE_ON_HOVER,
+ UNDERLINE_NEVER
+ };
+
public:
const LLUIColor& getColor() const { return mColor; }
void setColor(const LLUIColor &color) { mColor = color; }
@@ -84,6 +94,9 @@ public:
bool isImage() const { return mImagep.notNull(); }
+ bool getDrawHighlightBg() const { return mDrawHighlightBg; }
+ const LLUIColor& getHighlightBgColor() const { return mHighlightBgColor; }
+
bool operator==(const LLStyle &rhs) const
{
return
@@ -91,11 +104,13 @@ public:
&& mColor == rhs.mColor
&& mReadOnlyColor == rhs.mReadOnlyColor
&& mSelectedColor == rhs.mSelectedColor
+ && mHighlightBgColor == rhs.mHighlightBgColor
&& mFont == rhs.mFont
&& mLink == rhs.mLink
&& mImagep == rhs.mImagep
&& mDropShadow == rhs.mDropShadow
- && mAlpha == rhs.mAlpha;
+ && mAlpha == rhs.mAlpha
+ && mDrawHighlightBg == rhs.mDrawHighlightBg;
}
bool operator!=(const LLStyle& rhs) const { return !(*this == rhs); }
@@ -112,11 +127,13 @@ private:
LLUIColor mColor;
LLUIColor mReadOnlyColor;
LLUIColor mSelectedColor;
+ LLUIColor mHighlightBgColor;
const LLFontGL* mFont;
LLPointer<LLUIImage> mImagep;
F32 mAlpha;
bool mVisible;
bool mIsLink;
+ bool mDrawHighlightBg;
};
typedef LLPointer<LLStyle> LLStyleSP;
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 595ab0bd2b..5e0985c79c 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -1370,17 +1370,17 @@ LLPanel* LLTabContainer::getCurrentPanel()
return NULL;
}
-S32 LLTabContainer::getCurrentPanelIndex()
+S32 LLTabContainer::getCurrentPanelIndex() const
{
return mCurrentTabIdx;
}
-S32 LLTabContainer::getTabCount()
+S32 LLTabContainer::getTabCount() const
{
return static_cast<S32>(mTabList.size());
}
-LLPanel* LLTabContainer::getPanelByIndex(S32 index)
+LLPanel* LLTabContainer::getPanelByIndex(S32 index) const
{
if (index >= 0 && index < (S32)mTabList.size())
{
@@ -1389,7 +1389,7 @@ LLPanel* LLTabContainer::getPanelByIndex(S32 index)
return NULL;
}
-S32 LLTabContainer::getIndexForPanel(LLPanel* panel)
+S32 LLTabContainer::getIndexForPanel(LLPanel* panel) const
{
for (S32 index = 0; index < (S32)mTabList.size(); index++)
{
@@ -1401,7 +1401,7 @@ S32 LLTabContainer::getIndexForPanel(LLPanel* panel)
return -1;
}
-S32 LLTabContainer::getPanelIndexByTitle(std::string_view title)
+S32 LLTabContainer::getPanelIndexByTitle(std::string_view title) const
{
for (S32 index = 0 ; index < (S32)mTabList.size(); index++)
{
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index 40f272ffa8..4ac7e73d25 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -182,15 +182,15 @@ public:
void removeTabPanel( LLPanel* child );
void lockTabs(S32 num_tabs = 0);
void unlockTabs();
- S32 getNumLockedTabs() { return mLockedTabCount; }
+ S32 getNumLockedTabs() const { return mLockedTabCount; }
void enableTabButton(S32 which, bool enable);
void deleteAllTabs();
LLPanel* getCurrentPanel();
- S32 getCurrentPanelIndex();
- S32 getTabCount();
- LLPanel* getPanelByIndex(S32 index);
- S32 getIndexForPanel(LLPanel* panel);
- S32 getPanelIndexByTitle(std::string_view title);
+ S32 getCurrentPanelIndex() const;
+ S32 getTabCount() const;
+ LLPanel* getPanelByIndex(S32 index) const;
+ S32 getIndexForPanel(LLPanel* panel) const;
+ S32 getPanelIndexByTitle(std::string_view title) const;
LLPanel* getPanelByName(std::string_view name);
S32 getTotalTabWidth() const;
void setCurrentTabName(const std::string& name);
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 41e7094163..44151a4355 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -185,6 +185,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mURLClickSignal(NULL),
mIsFriendSignal(NULL),
mIsObjectBlockedSignal(NULL),
+ mIsObjectReachableSignal(NULL),
mMaxTextByteLength( p.max_text_length ),
mFont(p.font),
mFontShadow(p.font_shadow),
@@ -290,6 +291,7 @@ LLTextBase::~LLTextBase()
delete mURLClickSignal;
delete mIsFriendSignal;
delete mIsObjectBlockedSignal;
+ delete mIsObjectReachableSignal;
}
void LLTextBase::initFromParams(const LLTextBase::Params& p)
@@ -460,6 +462,62 @@ std::vector<LLRect> LLTextBase::getSelectionRects()
return selection_rects;
}
+std::vector<std::pair<LLRect, LLUIColor>> LLTextBase::getHighlightedBgRects()
+{
+ std::vector<std::pair<LLRect, LLUIColor>> highlight_rects;
+
+ LLRect content_display_rect = getVisibleDocumentRect();
+
+ // binary search for line that starts before top of visible buffer
+ line_list_t::const_iterator line_iter =
+ std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mTop, compare_bottom());
+ line_list_t::const_iterator end_iter =
+ std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top());
+
+ for (; line_iter != end_iter; ++line_iter)
+ {
+ segment_set_t::iterator segment_iter;
+ S32 segment_offset;
+ getSegmentAndOffset(line_iter->mDocIndexStart, &segment_iter, &segment_offset);
+
+ // Use F32 otherwise a string of multiple segments
+ // will accumulate a large error
+ F32 left_precise = (F32)line_iter->mRect.mLeft;
+ F32 right_precise = (F32)line_iter->mRect.mLeft;
+
+ for (; segment_iter != mSegments.end(); ++segment_iter, segment_offset = 0)
+ {
+ LLTextSegmentPtr segmentp = *segment_iter;
+
+ S32 segment_line_start = segmentp->getStart() + segment_offset;
+ S32 segment_line_end = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd);
+
+ if (segment_line_start > segment_line_end)
+ break;
+
+ F32 segment_width = 0;
+ S32 segment_height = 0;
+
+ S32 num_chars = segment_line_end - segment_line_start;
+ segmentp->getDimensionsF32(segment_offset, num_chars, segment_width, segment_height);
+ right_precise += segment_width;
+
+ if (segmentp->getStyle()->getDrawHighlightBg())
+ {
+ LLRect selection_rect;
+ selection_rect.mLeft = (S32)left_precise;
+ selection_rect.mRight = (S32)right_precise;
+ selection_rect.mBottom = line_iter->mRect.mBottom;
+ selection_rect.mTop = line_iter->mRect.mTop;
+
+ highlight_rects.push_back(std::pair(selection_rect, segmentp->getStyle()->getHighlightBgColor()));
+ }
+ left_precise += segment_width;
+ }
+ }
+ return highlight_rects;
+}
+
// Draws the black box behind the selected text
void LLTextBase::drawSelectionBackground()
{
@@ -529,6 +587,71 @@ void LLTextBase::drawSelectionBackground()
}
}
+void LLTextBase::drawHighlightedBackground()
+{
+ if (!mLineInfoList.empty())
+ {
+ std::vector<std::pair<LLRect, LLUIColor>> highlight_rects = getHighlightedBgRects();
+
+ if (highlight_rects.empty())
+ return;
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ LLRect content_display_rect = getVisibleDocumentRect();
+
+ for (std::vector<std::pair<LLRect, LLUIColor>>::iterator rect_it = highlight_rects.begin();
+ rect_it != highlight_rects.end(); ++rect_it)
+ {
+ LLRect selection_rect = rect_it->first;
+ const LLColor4& color = rect_it->second;
+ if (mScroller)
+ {
+ // If scroller is On content_display_rect has correct rect and safe to use as is
+ // Note: we might need to account for border
+ selection_rect.translate(mVisibleTextRect.mLeft - content_display_rect.mLeft, mVisibleTextRect.mBottom - content_display_rect.mBottom);
+ }
+ else
+ {
+ // If scroller is Off content_display_rect will have rect from document, adjusted to text width, heigh and position
+ // and we have to acount for offset depending on position
+ S32 v_delta = 0;
+ S32 h_delta = 0;
+ switch (mVAlign)
+ {
+ case LLFontGL::TOP:
+ v_delta = mVisibleTextRect.mTop - content_display_rect.mTop - mVPad;
+ break;
+ case LLFontGL::VCENTER:
+ v_delta = (llmax(mVisibleTextRect.getHeight() - content_display_rect.mTop, -content_display_rect.mBottom) + (mVisibleTextRect.mBottom - content_display_rect.mBottom)) / 2;
+ break;
+ case LLFontGL::BOTTOM:
+ v_delta = mVisibleTextRect.mBottom - content_display_rect.mBottom;
+ break;
+ default:
+ break;
+ }
+ switch (mHAlign)
+ {
+ case LLFontGL::LEFT:
+ h_delta = mVisibleTextRect.mLeft - content_display_rect.mLeft + mHPad;
+ break;
+ case LLFontGL::HCENTER:
+ h_delta = (llmax(mVisibleTextRect.getWidth() - content_display_rect.mLeft, -content_display_rect.mRight) + (mVisibleTextRect.mRight - content_display_rect.mRight)) / 2;
+ break;
+ case LLFontGL::RIGHT:
+ h_delta = mVisibleTextRect.mRight - content_display_rect.mRight;
+ break;
+ default:
+ break;
+ }
+ selection_rect.translate(h_delta, v_delta);
+ }
+ gl_rect_2d(selection_rect, color);
+ }
+ }
+}
+
void LLTextBase::drawCursor()
{
F32 alpha = getDrawContext().mAlpha;
@@ -915,8 +1038,37 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
{
LLStyleSP emoji_style;
LLEmojiDictionary* ed = LLEmojiDictionary::instanceExists() ? LLEmojiDictionary::getInstance() : NULL;
+ LLTextSegment* segmentp = nullptr;
+ segment_vec_t::iterator seg_iter;
+ if (segments && segments->size() > 0)
+ {
+ seg_iter = segments->begin();
+ segmentp = *seg_iter;
+ }
for (S32 text_kitty = 0, text_len = static_cast<S32>(wstr.size()); text_kitty < text_len; text_kitty++)
{
+ if (segmentp)
+ {
+ if (segmentp->getEnd() <= pos + text_kitty)
+ {
+ seg_iter++;
+ if (seg_iter != segments->end())
+ {
+ segmentp = *seg_iter;
+ }
+ else
+ {
+ segmentp = nullptr;
+ }
+ }
+ if (segmentp && !segmentp->getPermitsEmoji())
+ {
+ // Some segments, like LLInlineViewSegment do not permit splitting
+ // and should not be interrupted by emoji segments
+ continue;
+ }
+ }
+
llwchar code = wstr[text_kitty];
bool isEmoji = ed ? ed->isEmoji(code) : LLStringOps::isEmoji(code);
if (isEmoji)
@@ -948,6 +1100,14 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
{
+ S32 text_length = (S32)getLength();
+ if (pos >= text_length || pos < 0)
+ {
+ return 0; // nothing to remove
+ }
+ // Clamp length to not go past the end of the text
+ length = std::min(length, text_length - pos);
+
beforeValueChange();
segment_set_t::iterator seg_iter = getSegIterContaining(pos);
while(seg_iter != mSegments.end())
@@ -1317,6 +1477,8 @@ void LLTextBase::reshape(S32 width, S32 height, bool called_from_parent)
// up-to-date mVisibleTextRect
updateRects();
+ // Todo: This might be wrong. updateRects already sets needsReflow conditionaly.
+ // Reflow is expensive and doing it at any twith can be too much.
needsReflow();
}
}
@@ -1399,6 +1561,7 @@ void LLTextBase::draw()
drawChild(mDocumentView);
}
+ drawHighlightedBackground();
drawSelectionBackground();
drawText();
drawCursor();
@@ -2105,7 +2268,9 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
registrar.add("Url.RemoveFriend", boost::bind(&LLUrlAction::removeFriend, url));
registrar.add("Url.ReportAbuse", boost::bind(&LLUrlAction::reportAbuse, url));
registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url));
+ registrar.add("Url.ZoomInObject", boost::bind(&LLUrlAction::zoomInObject, url));
registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
+ registrar.add("Url.ShowParcelOnMap", boost::bind(&LLUrlAction::showParcelOnMap, url));
registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url));
@@ -2149,6 +2314,15 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
unblockButton->setVisible(is_blocked);
}
}
+
+ if (mIsObjectReachableSignal)
+ {
+ bool is_reachable = *(*mIsObjectReachableSignal)(LLUUID(LLUrlAction::getObjectId(url)));
+ if (LLView* zoom_btn = menu->getChild<LLView>("zoom_in"))
+ {
+ zoom_btn->setEnabled(is_reachable);
+ }
+ }
menu->show(x, y);
LLMenuGL::showPopup(this, menu, x, y);
}
@@ -2200,20 +2374,20 @@ static LLUIImagePtr image_from_icon_name(const std::string& icon_name)
}
-void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params)
+void LLTextBase::appendTextImpl(const std::string& new_text, const LLStyle::Params& input_params, bool force_slurl)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
LLStyle::Params style_params(getStyleParams());
style_params.overwriteFrom(input_params);
S32 part = (S32)LLTextParser::WHOLE;
- if (mParseHTML && !style_params.is_link) // Don't search for URLs inside a link segment (STORM-358).
+ if ((mParseHTML || force_slurl) && !style_params.is_link) // Don't search for URLs inside a link segment (STORM-358).
{
S32 start=0,end=0;
LLUrlMatch match;
std::string text = new_text;
while (LLUrlRegistry::instance().findUrl(text, match,
- boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3), isContentTrusted() || mAlwaysShowIcons))
+ boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3), isContentTrusted() || mAlwaysShowIcons, force_slurl))
{
start = match.getStart();
end = match.getEnd()+1;
@@ -2245,7 +2419,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
}
// output the styled Url
- appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly());
+ appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.getUnderline());
bool tooltip_required = !match.getTooltip().empty();
// set the tooltip for the Url label
@@ -2260,7 +2434,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
{
link_params.color = LLColor4::grey;
link_params.readonly_color = LLColor4::grey;
- appendAndHighlightTextImpl(label, part, link_params, match.underlineOnHoverOnly());
+ appendAndHighlightTextImpl(label, part, link_params, match.getUnderline());
// set the tooltip for the query part of url
if (tooltip_required)
@@ -2428,7 +2602,7 @@ void LLTextBase::appendWidget(const LLInlineViewSegment::Params& params, const s
insertStringNoUndo(getLength(), widget_wide_text, &segments);
}
-void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only)
+void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, e_underline underline_link)
{
// Save old state
S32 selection_start = mSelectionStart;
@@ -2458,7 +2632,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
S32 cur_length = getLength();
LLStyleConstSP sp(new LLStyle(highlight_params));
LLTextSegmentPtr segmentp;
- if (underline_on_hover_only || mSkipLinkUnderline)
+ if ((underline_link == e_underline::UNDERLINE_ON_HOVER) || mSkipLinkUnderline)
{
highlight_params.font.style("NORMAL");
LLStyleConstSP normal_sp(new LLStyle(highlight_params));
@@ -2482,7 +2656,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
S32 segment_start = old_length;
S32 segment_end = old_length + static_cast<S32>(wide_text.size());
LLStyleConstSP sp(new LLStyle(style_params));
- if (underline_on_hover_only || mSkipLinkUnderline)
+ if ((underline_link == e_underline::UNDERLINE_ON_HOVER) || mSkipLinkUnderline)
{
LLStyle::Params normal_style_params(style_params);
normal_style_params.font.style("NORMAL");
@@ -2516,7 +2690,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
}
}
-void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only)
+void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, e_underline underline_link)
{
if (new_text.empty())
{
@@ -2531,7 +2705,7 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlig
if (pos != start)
{
std::string str = std::string(new_text,start,pos-start);
- appendAndHighlightTextImpl(str, highlight_part, style_params, underline_on_hover_only);
+ appendAndHighlightTextImpl(str, highlight_part, style_params, underline_link);
}
appendLineBreakSegment(style_params);
start = pos+1;
@@ -2539,7 +2713,7 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlig
}
std::string str = std::string(new_text, start, new_text.length() - start);
- appendAndHighlightTextImpl(str, highlight_part, style_params, underline_on_hover_only);
+ appendAndHighlightTextImpl(str, highlight_part, style_params, underline_link);
}
@@ -3255,6 +3429,15 @@ boost::signals2::connection LLTextBase::setIsObjectBlockedCallback(const is_bloc
return mIsObjectBlockedSignal->connect(cb);
}
+boost::signals2::connection LLTextBase::setIsObjectReachableCallback(const is_obj_reachable_signal_t::slot_type& cb)
+{
+ if (!mIsObjectReachableSignal)
+ {
+ mIsObjectReachableSignal = new is_obj_reachable_signal_t();
+ }
+ return mIsObjectReachableSignal->connect(cb);
+}
+
//
// LLTextSegment
//
@@ -3294,6 +3477,7 @@ S32 LLTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offs
void LLTextSegment::updateLayout(const LLTextBase& editor) {}
F32 LLTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect) { return draw_rect.mLeft; }
bool LLTextSegment::canEdit() const { return false; }
+bool LLTextSegment::getPermitsEmoji() const { return true; }
void LLTextSegment::unlinkFromDocument(LLTextBase*) {}
void LLTextSegment::linkToDocument(LLTextBase*) {}
const LLUIColor& LLTextSegment::getColor() const { static const LLUIColor white = LLUIColorTable::instance().getColor("White", LLColor4::white); return white; }
@@ -3336,6 +3520,7 @@ LLNormalTextSegment::LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 e
mLastGeneration(-1)
{
mFontHeight = mStyle->getFont()->getLineHeight();
+ mCanEdit = !mStyle->getDrawHighlightBg();
LLUIImagePtr image = mStyle->getImage();
if (image.notNull())
@@ -3632,7 +3817,7 @@ bool LLNormalTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& w
{
height = 0;
width = 0;
- if (num_chars > 0)
+ if (num_chars > 0 && (mStart + first_char >= 0))
{
height = mFontHeight;
const LLWString &text = getWText();
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 76d4e160af..50767a35b3 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -35,6 +35,7 @@
#include "llstyle.h"
#include "llkeywords.h"
#include "llpanel.h"
+#include "llurlmatch.h"
#include <string>
#include <vector>
@@ -86,6 +87,7 @@ public:
virtual void updateLayout(const class LLTextBase& editor);
virtual F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
virtual bool canEdit() const;
+ virtual bool getPermitsEmoji() const;
virtual void unlinkFromDocument(class LLTextBase* editor);
virtual void linkToDocument(class LLTextBase* editor);
@@ -139,13 +141,12 @@ public:
/*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;
/*virtual*/ void updateLayout(const class LLTextBase& editor);
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
- /*virtual*/ bool canEdit() const { return true; }
+ /*virtual*/ bool canEdit() const { return mCanEdit; }
/*virtual*/ const LLUIColor& getColor() const { return mStyle->getColor(); }
/*virtual*/ LLStyleConstSP getStyle() const { return mStyle; }
/*virtual*/ void setStyle(LLStyleConstSP style) { mStyle = style; }
/*virtual*/ void setToken( LLKeywordToken* token ) { mToken = token; }
/*virtual*/ LLKeywordToken* getToken() const { return mToken; }
- /*virtual*/ bool getToolTip( std::string& msg ) const;
/*virtual*/ void setToolTip(const std::string& tooltip);
/*virtual*/ void dump() const;
@@ -162,6 +163,8 @@ protected:
virtual const LLWString& getWText() const;
virtual const S32 getLength() const;
+ void setAllowEdit(bool can_edit) { mCanEdit = can_edit; }
+
protected:
class LLTextBase& mEditor;
LLStyleConstSP mStyle;
@@ -170,6 +173,8 @@ protected:
std::string mTooltip;
boost::signals2::connection mImageLoadedConnection;
+ bool mCanEdit { true };
+
// font rendering
LLFontVertexBuffer mFontBufferPreSelection;
LLFontVertexBuffer mFontBufferSelection;
@@ -251,6 +256,7 @@ public:
/*virtual*/ void updateLayout(const class LLTextBase& editor);
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
/*virtual*/ bool canEdit() const { return false; }
+ /*virtual*/ bool getPermitsEmoji() const { return false; }
/*virtual*/ void unlinkFromDocument(class LLTextBase* editor);
/*virtual*/ void linkToDocument(class LLTextBase* editor);
@@ -321,6 +327,7 @@ public:
typedef boost::signals2::signal<bool (const LLUUID& user_id)> is_friend_signal_t;
typedef boost::signals2::signal<bool (const LLUUID& blocked_id, const std::string from)> is_blocked_signal_t;
+ typedef boost::signals2::signal<bool (const LLUUID& obj_id)> is_obj_reachable_signal_t;
struct LineSpacingParams : public LLInitParam::ChoiceBlock<LineSpacingParams>
{
@@ -450,7 +457,7 @@ public:
virtual void setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style
/*virtual*/ const std::string& getText() const override;
void setMaxTextLength(S32 length) { mMaxTextByteLength = length; }
- S32 getMaxTextLength() { return mMaxTextByteLength; }
+ S32 getMaxTextLength() const { return mMaxTextByteLength; }
// wide-char versions
void setWText(const LLWString& text);
@@ -489,10 +496,10 @@ public:
LLRect getTextBoundingRect();
LLRect getVisibleDocumentRect() const;
- S32 getVPad() { return mVPad; }
- S32 getHPad() { return mHPad; }
- F32 getLineSpacingMult() { return mLineSpacingMult; }
- S32 getLineSpacingPixels() { return mLineSpacingPixels; } // only for multiline
+ S32 getVPad() const { return mVPad; }
+ S32 getHPad() const { return mHPad; }
+ F32 getLineSpacingMult() const { return mLineSpacingMult; }
+ S32 getLineSpacingPixels() const { return mLineSpacingPixels; } // only for multiline
S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, bool round, bool hit_past_end_of_line = true) const;
LLRect getLocalRectFromDocIndex(S32 pos) const;
@@ -502,7 +509,7 @@ public:
bool getReadOnly() const { return mReadOnly; }
void setSkipLinkUnderline(bool skip_link_underline) { mSkipLinkUnderline = skip_link_underline; }
- bool getSkipLinkUnderline() { return mSkipLinkUnderline; }
+ bool getSkipLinkUnderline() const { return mSkipLinkUnderline; }
void setParseURLs(bool parse_urls) { mParseHTML = parse_urls; }
@@ -516,8 +523,8 @@ public:
void endOfLine();
void startOfDoc();
void endOfDoc();
- void changePage( S32 delta );
- void changeLine( S32 delta );
+ void changePage(S32 delta);
+ void changeLine(S32 delta);
bool scrolledToStart();
bool scrolledToEnd();
@@ -531,6 +538,7 @@ public:
boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);
boost::signals2::connection setIsFriendCallback(const is_friend_signal_t::slot_type& cb);
boost::signals2::connection setIsObjectBlockedCallback(const is_blocked_signal_t::slot_type& cb);
+ boost::signals2::connection setIsObjectReachableCallback(const is_obj_reachable_signal_t::slot_type& cb);
void setWordWrap(bool wrap);
LLScrollContainer* getScrollContainer() const { return mScroller; }
@@ -607,6 +615,7 @@ protected:
bool operator()(const LLTextSegmentPtr& a, const LLTextSegmentPtr& b) const;
};
typedef std::multiset<LLTextSegmentPtr, compare_segment_end> segment_set_t;
+ typedef LLStyle::EUnderlineLink e_underline;
// member functions
LLTextBase(const Params &p);
@@ -620,12 +629,13 @@ protected:
virtual void drawSelectionBackground(); // draws the black box behind the selected text
void drawCursor();
void drawText();
+ void drawHighlightedBackground();
// modify contents
S32 insertStringNoUndo(S32 pos, const LLWString &wstr, segment_vec_t* segments = NULL); // returns num of chars actually inserted
S32 removeStringNoUndo(S32 pos, S32 length);
S32 overwriteCharNoUndo(S32 pos, llwchar wc);
- void appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& stylep, bool underline_on_hover_only = false);
+ void appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& stylep, e_underline underline_link = e_underline::UNDERLINE_ALWAYS);
// manage segments
@@ -673,8 +683,8 @@ protected:
// avatar names are looked up.
void replaceUrl(const std::string &url, const std::string &label, const std::string& icon);
- void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params());
- void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false);
+ void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params(), bool force_slurl = false);
+ void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, e_underline underline_link = e_underline::UNDERLINE_ALWAYS);
S32 normalizeUri(std::string& uri);
protected:
@@ -685,6 +695,7 @@ protected:
}
std::vector<LLRect> getSelectionRects();
+ std::vector<std::pair<LLRect, LLUIColor>> getHighlightedBgRects();
protected:
// text segmentation and flow
@@ -776,6 +787,7 @@ protected:
// Used to check if user with given ID is avatar's friend
is_friend_signal_t* mIsFriendSignal;
is_blocked_signal_t* mIsObjectBlockedSignal;
+ is_obj_reachable_signal_t* mIsObjectReachableSignal;
LLUIString mLabel; // text label that is visible when no user text provided
};
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index 500dc8669f..507d8f3ee6 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -46,39 +46,39 @@ protected:
friend class LLUICtrlFactory;
public:
- virtual ~LLTextBox();
+ ~LLTextBox() override;
- /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleMouseUp(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask);
+ bool handleMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleMouseUp(S32 x, S32 y, MASK mask) override;
+ bool handleHover(S32 x, S32 y, MASK mask) override;
- /*virtual*/ void setEnabled(bool enabled);
+ void setEnabled(bool enabled) override;
- /*virtual*/ void setText( const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params() );
+ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params()) override;
- void setRightAlign() { mHAlign = LLFontGL::RIGHT; }
- void setHAlign( LLFontGL::HAlign align ) { mHAlign = align; }
- void setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL );
+ void setRightAlign() { mHAlign = LLFontGL::RIGHT; }
+ void setHAlign(LLFontGL::HAlign align) { mHAlign = align; }
+ void setClickedCallback(boost::function<void(void*)> cb, void* userdata = NULL);
- void reshapeToFitText(bool called_from_parent = false);
+ void reshapeToFitText(bool called_from_parent = false);
- S32 getTextPixelWidth();
- S32 getTextPixelHeight();
+ S32 getTextPixelWidth();
+ S32 getTextPixelHeight();
- /*virtual*/ LLSD getValue() const;
- /*virtual*/ bool setTextArg( const std::string& key, const LLStringExplicit& text );
+ LLSD getValue() const override;
+ bool setTextArg(const std::string& key, const LLStringExplicit& text) override;
- void setShowCursorHand(bool show_cursor) { mShowCursorHand = show_cursor; }
+ void setShowCursorHand(bool show_cursor) { mShowCursorHand = show_cursor; }
protected:
- void onUrlLabelUpdated(const std::string &url, const std::string &label);
+ void onUrlLabelUpdated(const std::string& url, const std::string& label);
LLUIString mText;
callback_t mClickedCallback;
bool mShowCursorHand;
protected:
- virtual std::string _getSearchText() const
+ virtual std::string _getSearchText() const override
{
return LLTextBase::_getSearchText() + mText.getString();
}
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 77a4976f6b..58b785fcdd 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -60,6 +60,7 @@
#include "llurlregistry.h"
#include "lltooltip.h"
#include "llmenugl.h"
+#include "llchatmentionhelper.h"
#include <queue>
#include "llcombobox.h"
@@ -270,9 +271,12 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mPrevalidator(p.prevalidator()),
mShowContextMenu(p.show_context_menu),
mShowEmojiHelper(p.show_emoji_helper),
+ mShowChatMentionPicker(false),
mEnableTooltipPaste(p.enable_tooltip_paste),
mPassDelete(false),
- mKeepSelectionOnReturn(false)
+ mKeepSelectionOnReturn(false),
+ mSelectAllOnFocusReceived(false),
+ mSelectedOnFocusReceived(false)
{
mSourceID.generate();
@@ -396,6 +400,7 @@ void LLTextEditor::selectNext(const std::string& search_text_in, bool case_insen
setCursorPos(loc);
mIsSelecting = true;
+ mSelectedOnFocusReceived = false;
mSelectionEnd = mCursorPos;
mSelectionStart = llmin((S32)getLength(), (S32)(mCursorPos + search_text.size()));
}
@@ -675,6 +680,13 @@ bool LLTextEditor::canSelectAll() const
return true;
}
+//virtual
+void LLTextEditor::deselect()
+{
+ LLTextBase::deselect();
+ mSelectedOnFocusReceived = false;
+}
+
// virtual
void LLTextEditor::selectAll()
{
@@ -692,6 +704,11 @@ void LLTextEditor::selectByCursorPosition(S32 prev_cursor_pos, S32 next_cursor_p
endSelection();
}
+void LLTextEditor::setSelectAllOnFocusReceived(bool b)
+{
+ mSelectAllOnFocusReceived = b;
+}
+
void LLTextEditor::insertEmoji(llwchar emoji)
{
LL_INFOS() << "LLTextEditor::insertEmoji(" << wchar_utf8_preview(emoji) << ")" << LL_ENDL;
@@ -714,6 +731,30 @@ void LLTextEditor::handleEmojiCommit(llwchar emoji)
}
}
+void LLTextEditor::handleMentionCommit(std::string name_url)
+{
+ S32 mention_start_pos;
+ if (LLChatMentionHelper::instance().isCursorInNameMention(getWText(), mCursorPos, &mention_start_pos))
+ {
+ remove(mention_start_pos, mCursorPos - mention_start_pos, true);
+ insert(mention_start_pos, utf8str_to_wstring(name_url), false, LLTextSegmentPtr());
+
+ std::string new_text(wstring_to_utf8str(getConvertedText()));
+ clear();
+ appendTextImpl(new_text, LLStyle::Params(), true);
+
+ segment_set_t::const_iterator it = getSegIterContaining(mention_start_pos);
+ if (it != mSegments.end())
+ {
+ setCursorPos((*it)->getEnd() + 1);
+ }
+ else
+ {
+ setCursorPos(mention_start_pos);
+ }
+ }
+}
+
bool LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
{
bool handled = false;
@@ -769,8 +810,16 @@ bool LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
// Delay cursor flashing
resetCursorBlink();
+ mSelectedOnFocusReceived = false;
if (handled && !gFocusMgr.getMouseCapture())
{
+ if (!mask && mSelectAllOnFocusReceived)
+ {
+ mIsSelecting = false;
+ mSelectionStart = getLength();
+ mSelectionEnd = 0;
+ mSelectedOnFocusReceived = true;
+ }
gFocusMgr.setMouseCapture( this );
}
return handled;
@@ -1103,6 +1152,7 @@ void LLTextEditor::removeCharOrTab()
}
tryToShowEmojiHelper();
+ tryToShowMentionHelper();
}
else
{
@@ -1128,6 +1178,7 @@ void LLTextEditor::removeChar()
setCursorPos(mCursorPos - 1);
removeChar(mCursorPos);
tryToShowEmojiHelper();
+ tryToShowMentionHelper();
}
else
{
@@ -1189,6 +1240,7 @@ void LLTextEditor::addChar(llwchar wc)
setCursorPos(mCursorPos + addChar( mCursorPos, wc ));
tryToShowEmojiHelper();
+ tryToShowMentionHelper();
if (!mReadOnly && mAutoreplaceCallback != NULL)
{
@@ -1218,6 +1270,14 @@ void LLTextEditor::showEmojiHelper()
LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, LLStringUtil::null, cb);
}
+void LLTextEditor::hideEmojiHelper()
+{
+ if (mShowEmojiHelper)
+ {
+ LLEmojiHelper::instance().hideHelper(this);
+ }
+}
+
void LLTextEditor::tryToShowEmojiHelper()
{
if (mReadOnly || !mShowEmojiHelper)
@@ -1239,6 +1299,31 @@ void LLTextEditor::tryToShowEmojiHelper()
}
}
+void LLTextEditor::tryToShowMentionHelper()
+{
+ if (mReadOnly || !mShowChatMentionPicker)
+ return;
+
+ S32 mention_start_pos;
+ LLWString text(getWText());
+ if (LLChatMentionHelper::instance().isCursorInNameMention(text, mCursorPos, &mention_start_pos))
+ {
+ const LLRect cursor_rect(getLocalRectFromDocIndex(mention_start_pos));
+ std::string name_part(wstring_to_utf8str(text.substr(mention_start_pos, mCursorPos - mention_start_pos)));
+ name_part.erase(0, 1);
+ auto cb = [this](std::string name_url)
+ {
+ handleMentionCommit(name_url);
+ };
+ LLChatMentionHelper::instance().showHelper(this, cursor_rect.mLeft, cursor_rect.mTop, name_part, cb);
+ }
+ else
+ {
+ LLChatMentionHelper::instance().hideHelper();
+ }
+}
+
+
void LLTextEditor::addLineBreakChar(bool group_together)
{
if( !getEnabled() )
@@ -1865,7 +1950,7 @@ bool LLTextEditor::handleKeyHere(KEY key, MASK mask )
// not handled and let the parent take care of field movement.
if (KEY_TAB == key && mTabsToNextField)
{
- return false;
+ return mShowChatMentionPicker && LLChatMentionHelper::instance().handleKey(this, key, mask);
}
if (mReadOnly && mScroller)
@@ -1876,9 +1961,13 @@ bool LLTextEditor::handleKeyHere(KEY key, MASK mask )
}
else
{
- if (!mReadOnly && mShowEmojiHelper && LLEmojiHelper::instance().handleKey(this, key, mask))
+ if (!mReadOnly)
{
- return true;
+ if ((mShowEmojiHelper && LLEmojiHelper::instance().handleKey(this, key, mask)) ||
+ (mShowChatMentionPicker && LLChatMentionHelper::instance().handleKey(this, key, mask)))
+ {
+ return true;
+ }
}
if (mEnableTooltipPaste &&
@@ -2134,6 +2223,11 @@ void LLTextEditor::focusLostHelper()
gEditMenuHandler = NULL;
}
+ if (mSelectedOnFocusReceived)
+ {
+ deselect();
+ }
+
if (mCommitOnFocusLost)
{
onCommit();
@@ -3075,3 +3169,21 @@ S32 LLTextEditor::spacesPerTab()
{
return SPACES_PER_TAB;
}
+
+LLWString LLTextEditor::getConvertedText() const
+{
+ LLWString text = getWText();
+ S32 diff = 0;
+ for (auto segment : mSegments)
+ {
+ if (segment && segment->getStyle() && segment->getStyle()->getDrawHighlightBg())
+ {
+ S32 seg_length = segment->getEnd() - segment->getStart();
+ std::string slurl = segment->getStyle()->getLinkHREF();
+
+ text.replace(segment->getStart() + diff, seg_length, utf8str_to_wstring(slurl));
+ diff += (S32)slurl.size() - seg_length;
+ }
+ }
+ return text;
+}
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index e9e7070414..cdfcbcdd63 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -95,6 +95,8 @@ public:
void insertEmoji(llwchar emoji);
void handleEmojiCommit(llwchar emoji);
+ void handleMentionCommit(std::string name_url);
+
// mousehandler overrides
virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
virtual bool handleMouseUp(S32 x, S32 y, MASK mask);
@@ -142,8 +144,10 @@ public:
virtual bool canDoDelete() const;
virtual void selectAll();
virtual bool canSelectAll() const;
+ virtual void deselect();
void selectByCursorPosition(S32 prev_cursor_pos, S32 next_cursor_pos);
+ void setSelectAllOnFocusReceived(bool b);
virtual bool canLoadOrSaveToFile();
@@ -200,24 +204,24 @@ public:
const LLUUID& getSourceID() const { return mSourceID; }
const LLTextSegmentPtr getPreviousSegment() const;
- const LLTextSegmentPtr getLastSegment() const;
void getSelectedSegments(segment_vec_t& segments) const;
void setShowContextMenu(bool show) { mShowContextMenu = show; }
bool getShowContextMenu() const { return mShowContextMenu; }
void showEmojiHelper();
+ void hideEmojiHelper();
void setShowEmojiHelper(bool show);
bool getShowEmojiHelper() const { return mShowEmojiHelper; }
void setPassDelete(bool b) { mPassDelete = b; }
+ LLWString getConvertedText() const;
+
protected:
void showContextMenu(S32 x, S32 y);
void drawPreeditMarker();
- void assignEmbedded(const std::string &s);
-
void removeCharOrTab();
void indentSelectedLines( S32 spaces );
@@ -237,7 +241,6 @@ protected:
void autoIndent();
- void findEmbeddedItemSegments(S32 start, S32 end);
void getSegmentsInRange(segment_vec_t& segments, S32 start, S32 end, bool include_partial) const;
virtual llwchar pasteEmbeddedItem(llwchar ext_char) { return ext_char; }
@@ -257,6 +260,7 @@ protected:
S32 remove(S32 pos, S32 length, bool group_with_next_op);
void tryToShowEmojiHelper();
+ void tryToShowMentionHelper();
void focusLostHelper();
void updateAllowingLanguageInput();
bool hasPreeditString() const;
@@ -294,6 +298,7 @@ protected:
bool mAutoIndent;
bool mParseOnTheFly;
+ bool mShowChatMentionPicker;
void updateLinkSegments();
void keepSelectionOnReturn(bool keep) { mKeepSelectionOnReturn = keep; }
@@ -304,7 +309,7 @@ private:
// Methods
//
void pasteHelper(bool is_primary);
- void cleanStringForPaste(LLWString & clean_string);
+ void cleanStringForPaste(LLWString& clean_string);
void pasteTextWithLinebreaks(LLWString & clean_string);
void onKeyStroke();
@@ -333,6 +338,8 @@ private:
bool mEnableTooltipPaste;
bool mPassDelete;
bool mKeepSelectionOnReturn; // disabling of removing selected text after pressing of Enter
+ bool mSelectAllOnFocusReceived;
+ bool mSelectedOnFocusReceived;
LLUUID mSourceID;
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 5955a28fa3..56ab6e9bae 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -1054,7 +1054,7 @@ bool LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
// if drop is set, it's time to call the callback to get the operation done
if (handled && drop)
{
- handled = mHandleDropCallback(cargo_data, x, y, this);
+ handled = mHandleDropCallback(cargo_data, cargo_type, x, y, this);
}
// We accept only single tool drop on toolbars
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index c57c979525..a3f044c256 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -41,7 +41,7 @@ class LLIconCtrl;
typedef boost::function<void (S32 x, S32 y, LLToolBarButton* button)> tool_startdrag_callback_t;
typedef boost::function<bool (S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)> tool_handledrag_callback_t;
-typedef boost::function<bool (void* data, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t;
+typedef boost::function<bool (void* data, EDragAndDropType cargo_type, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t;
class LLToolBarButton : public LLButton
{
@@ -68,7 +68,7 @@ public:
void reshape(S32 width, S32 height, bool called_from_parent = true);
void setEnabled(bool enabled);
void setCommandId(const LLCommandId& id) { mId = id; }
- LLCommandId getCommandId() { return mId; }
+ LLCommandId getCommandId() const { return mId; }
void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; }
void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
@@ -256,7 +256,7 @@ public:
// Methods used in loading and saving toolbar settings
void setButtonType(LLToolBarEnums::ButtonType button_type);
- LLToolBarEnums::ButtonType getButtonType() { return mButtonType; }
+ LLToolBarEnums::ButtonType getButtonType() const { return mButtonType; }
command_id_list_t& getCommandsList() { return mButtonCommands; }
void clearCommandsList();
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 86525c2f7e..74f03618cf 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -390,22 +390,22 @@ void LLToolTip::draw()
}
}
-bool LLToolTip::isFading()
+bool LLToolTip::isFading() const
{
return mFadeTimer.getStarted();
}
-F32 LLToolTip::getVisibleTime()
+F32 LLToolTip::getVisibleTime() const
{
return mVisibleTimer.getStarted() ? mVisibleTimer.getElapsedTimeF32() : 0.f;
}
-bool LLToolTip::hasClickCallback()
+bool LLToolTip::hasClickCallback() const
{
return mHasClickCallback;
}
-void LLToolTip::getToolTipMessage(std::string & message)
+void LLToolTip::getToolTipMessage(std::string& message) const
{
if (mTextBox)
{
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 8515504e3b..760acddd6f 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -44,15 +44,15 @@ public:
Params();
};
LLToolTipView(const LLToolTipView::Params&);
- /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleMiddleMouseDown(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleRightMouseDown(S32 x, S32 y, MASK mask);
- /*virtual*/ bool handleScrollWheel( S32 x, S32 y, S32 clicks );
+ bool handleHover(S32 x, S32 y, MASK mask) override;
+ bool handleMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleMiddleMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleRightMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleScrollWheel( S32 x, S32 y, S32 clicks ) override;
void drawStickyRect();
- /*virtual*/ void draw();
+ void draw() override;
};
class LLToolTip : public LLPanel
@@ -98,20 +98,20 @@ public:
Params();
};
- /*virtual*/ void draw();
- /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask);
- /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
- /*virtual*/ void setVisible(bool visible);
+ void draw() override;
+ bool handleHover(S32 x, S32 y, MASK mask) override;
+ void onMouseLeave(S32 x, S32 y, MASK mask) override;
+ void setVisible(bool visible) override;
- bool isFading();
- F32 getVisibleTime();
- bool hasClickCallback();
+ bool isFading() const;
+ F32 getVisibleTime() const;
+ bool hasClickCallback() const;
LLToolTip(const Params& p);
virtual void initFromParams(const LLToolTip::Params& params);
- void getToolTipMessage(std::string & message);
- bool isTooltipPastable() { return mIsTooltipPastable; }
+ void getToolTipMessage(std::string & message) const;
+ bool isTooltipPastable() const { return mIsTooltipPastable; }
protected:
void updateTextBox();
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index e7dea79eaa..179d1dcaff 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -213,13 +213,8 @@ void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& rem
void LLUI::setMousePositionScreen(S32 x, S32 y)
{
-#if defined(LL_DARWIN)
- S32 screen_x = ll_round(((F32)x * getScaleFactor().mV[VX]) / LLView::getWindow()->getSystemUISize());
- S32 screen_y = ll_round(((F32)y * getScaleFactor().mV[VY]) / LLView::getWindow()->getSystemUISize());
-#else
S32 screen_x = ll_round((F32)x * getScaleFactor().mV[VX]);
S32 screen_y = ll_round((F32)y * getScaleFactor().mV[VY]);
-#endif
LLView::getWindow()->setCursorPosition(LLCoordGL(screen_x, screen_y).convert());
}
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 9890d3f7ef..b2dcb6dc88 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -154,7 +154,7 @@ public:
sanitizeRange();
}
- S32 clamp(S32 input)
+ S32 clamp(S32 input) const
{
if (input < mMin) return mMin;
if (input > mMax) return mMax;
@@ -168,8 +168,8 @@ public:
sanitizeRange();
}
- S32 getMin() { return mMin; }
- S32 getMax() { return mMax; }
+ S32 getMin() const { return mMin; }
+ S32 getMax() const { return mMax; }
bool operator==(const RangeS32& other) const
{
@@ -223,7 +223,7 @@ public:
mValue = clamp(value);
}
- S32 get()
+ S32 get() const
{
return mValue;
}
@@ -253,7 +253,7 @@ public:
static std::string getLanguage(); // static for lldateutil_test compatibility
//helper functions (should probably move free standing rendering helper functions here)
- LLView* getRootView() { return mRootView; }
+ LLView* getRootView() const { return mRootView; }
void setRootView(LLView* view) { mRootView = view; }
/**
* Walk the LLView tree to resolve a path
@@ -296,7 +296,7 @@ public:
LLControlGroup& getControlControlGroup (std::string_view controlname);
F32 getMouseIdleTime() { return mMouseIdleTimer.getElapsedTimeF32(); }
void resetMouseIdleTimer() { mMouseIdleTimer.reset(); }
- LLWindow* getWindow() { return mWindow; }
+ LLWindow* getWindow() const { return mWindow; }
void addPopup(LLView*);
void removePopup(LLView*);
diff --git a/indra/llui/lluiconstants.h b/indra/llui/lluiconstants.h
index 5fdfd37c6e..a317c66008 100644
--- a/indra/llui/lluiconstants.h
+++ b/indra/llui/lluiconstants.h
@@ -28,23 +28,23 @@
#define LL_LLUICONSTANTS_H
// spacing for small font lines of text, like LLTextBoxes
-const S32 LINE = 16;
+constexpr S32 LINE = 16;
// spacing for larger lines of text
-const S32 LINE_BIG = 24;
+constexpr S32 LINE_BIG = 24;
// default vertical padding
-const S32 VPAD = 4;
+constexpr S32 VPAD = 4;
// default horizontal padding
-const S32 HPAD = 4;
+constexpr S32 HPAD = 4;
// Account History, how far to look into past
-const S32 SUMMARY_INTERVAL = 7; // one week
-const S32 SUMMARY_MAX = 8; //
-const S32 DETAILS_INTERVAL = 1; // one day
-const S32 DETAILS_MAX = 30; // one month
-const S32 TRANSACTIONS_INTERVAL = 1;// one day
-const S32 TRANSACTIONS_MAX = 30; // one month
+constexpr S32 SUMMARY_INTERVAL = 7; // one week
+constexpr S32 SUMMARY_MAX = 8; //
+constexpr S32 DETAILS_INTERVAL = 1; // one day
+constexpr S32 DETAILS_MAX = 30; // one month
+constexpr S32 TRANSACTIONS_INTERVAL = 1;// one day
+constexpr S32 TRANSACTIONS_MAX = 30; // one month
#endif
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 8cd9950917..bcaf479b0f 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -39,9 +39,9 @@
#include "llviewmodel.h" // *TODO move dependency to .cpp file
#include "llsearchablecontrol.h"
-const bool TAKE_FOCUS_YES = true;
-const bool TAKE_FOCUS_NO = false;
-const S32 DROP_SHADOW_FLOATER = 5;
+constexpr bool TAKE_FOCUS_YES = true;
+constexpr bool TAKE_FOCUS_NO = false;
+constexpr S32 DROP_SHADOW_FLOATER = 5;
class LLUICtrl
: public LLView, public boost::signals2::trackable
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 75e7e396bc..91221dc7f3 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -184,7 +184,7 @@ fail:
template<class T>
static T* getDefaultWidget(std::string_view name)
{
- typename T::Params widget_params;
+ typename T::Params widget_params{};
widget_params.name = std::string(name);
return create<T>(widget_params);
}
diff --git a/indra/llui/llundo.h b/indra/llui/llundo.h
index dc40702be0..990745e530 100644
--- a/indra/llui/llundo.h
+++ b/indra/llui/llundo.h
@@ -42,7 +42,7 @@ public:
LLUndoAction(): mClusterID(0) {};
virtual ~LLUndoAction(){};
private:
- S32 mClusterID;
+ S32 mClusterID;
};
LLUndoBuffer( LLUndoAction (*create_func()), S32 initial_count );
@@ -51,8 +51,8 @@ public:
LLUndoAction *getNextAction(bool setClusterBegin = true);
bool undoAction();
bool redoAction();
- bool canUndo() { return (mNextAction != mFirstAction); }
- bool canRedo() { return (mNextAction != mLastAction); }
+ bool canUndo() const { return (mNextAction != mFirstAction); }
+ bool canRedo() const { return (mNextAction != mLastAction); }
void flushActions();
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index b6b450c2a1..8b320b59cc 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -30,6 +30,7 @@
#include "llview.h"
#include "llwindow.h"
#include "llurlregistry.h"
+#include "v3dmath.h"
// global state for the callback functions
@@ -116,6 +117,16 @@ void LLUrlAction::teleportToLocation(std::string url)
}
}
+void LLUrlAction::zoomInObject(std::string url)
+{
+ LLUrlMatch match;
+ std::string object_id = getObjectId(url);
+ if (LLUUID::validate(object_id) && LLUrlRegistry::instance().findUrl(url, match))
+ {
+ executeSLURL("secondlife:///app/object/" + object_id + "/zoomin/" + match.getLocation());
+ }
+}
+
void LLUrlAction::showLocationOnMap(std::string url)
{
LLUrlMatch match;
@@ -128,6 +139,23 @@ void LLUrlAction::showLocationOnMap(std::string url)
}
}
+void LLUrlAction::showParcelOnMap(std::string url)
+{
+ LLSD path_array = LLURI(url).pathArray();
+ auto path_parts = path_array.size();
+
+ if (path_parts < 3) // no parcel id
+ {
+ LL_WARNS() << "Global coordinates are missing in url: [" << url << "]" << LL_ENDL;
+ return;
+ }
+
+ LLVector3d parcel_pos = LLUrlEntryParcel::getParcelPos(LLUUID(LLURI::unescape(path_array[2])));
+ std::ostringstream pos;
+ pos << parcel_pos.mdV[VX] << '/' << parcel_pos.mdV[VY] << '/' << parcel_pos.mdV[VZ];
+ executeSLURL("secondlife:///app/worldmap_global/" + pos.str());
+}
+
void LLUrlAction::copyURLToClipboard(std::string url)
{
LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(url));
@@ -142,6 +170,16 @@ void LLUrlAction::copyLabelToClipboard(std::string url)
}
}
+std::string LLUrlAction::getURLLabel(std::string url)
+{
+ LLUrlMatch match;
+ if (LLUrlRegistry::instance().findUrl(url, match))
+ {
+ return match.getLabel();
+ }
+ return "";
+}
+
void LLUrlAction::showProfile(std::string url)
{
// Get id from 'secondlife:///app/{cmd}/{id}/{action}'
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 0f54b66299..56d459bb26 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -45,8 +45,6 @@
class LLUrlAction
{
public:
- LLUrlAction();
-
/// load a Url in the user's preferred web browser
static void openURL(std::string url);
@@ -62,9 +60,15 @@ public:
/// if the Url specifies an SL location, teleport there
static void teleportToLocation(std::string url);
+ /// If the Url specifies an object id, attempt to zoom in.
+ /// If not possible to zoom in, show on map
+ static void zoomInObject(std::string url);
+
/// if the Url specifies an SL location, show it on a map
static void showLocationOnMap(std::string url);
+ static void showParcelOnMap(std::string url);
+
/// perform the appropriate action for left-clicking on a Url
static void clickAction(std::string url, bool trusted_content);
@@ -74,6 +78,8 @@ public:
/// copy a Url to the clipboard
static void copyURLToClipboard(std::string url);
+ static std::string getURLLabel(std::string url);
+
/// if the Url specifies an SL command in the form like 'app/{cmd}/{id}/*', show its profile
static void showProfile(std::string url);
static std::string getUserID(std::string url);
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 3cc0c05ffa..95603d7ed5 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -29,7 +29,6 @@
#include "llurlentry.h"
#include "lluictrl.h"
#include "lluri.h"
-#include "llurlmatch.h"
#include "llurlregistry.h"
#include "lluriparser.h"
@@ -42,13 +41,12 @@
#include "lluicolortable.h"
#include "message.h"
#include "llexperiencecache.h"
-
-#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"
+#include "v3dmath.h"
// Utility functions
std::string localize_slapp_label(const std::string& url, const std::string& full_name);
-
+LLUUID LLUrlEntryBase::sAgentID(LLUUID::null);
LLUrlEntryBase::LLUrlEntryBase()
{
}
@@ -68,7 +66,7 @@ std::string LLUrlEntryBase::getIcon(const std::string &url)
return mIcon;
}
-LLStyle::Params LLUrlEntryBase::getStyle() const
+LLStyle::Params LLUrlEntryBase::getStyle(const std::string &url) const
{
LLStyle::Params style_params;
style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
@@ -221,6 +219,16 @@ bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const
},
L'\u002F'); // Solidus
+ std::replace_if(wlabel.begin(),
+ wlabel.end(),
+ [](const llwchar& chr)
+ {
+ return // Not a decomposition, but suficiently similar
+ (chr == L'\u04BA') // "Cyrillic Capital Letter Shha"
+ || (chr == L'\u04BB'); // "Cyrillic Small Letter Shha"
+ },
+ L'\u0068'); // "Latin Small Letter H"
+
std::string label = wstring_to_utf8str(wlabel);
if ((label.find(".com") != std::string::npos
|| label.find("www.") != std::string::npos)
@@ -621,6 +629,11 @@ LLUUID LLUrlEntryAgent::getID(const std::string &string) const
return LLUUID(getIDStringFromUrl(string));
}
+bool LLUrlEntryAgent::isAgentID(const std::string& url) const
+{
+ return sAgentID == getID(url);
+}
+
std::string LLUrlEntryAgent::getTooltip(const std::string &string) const
{
// return a tooltip corresponding to the URL type instead of the generic one
@@ -657,10 +670,14 @@ std::string LLUrlEntryAgent::getTooltip(const std::string &string) const
return LLTrans::getString("TooltipAgentUrl");
}
-bool LLUrlEntryAgent::underlineOnHoverOnly(const std::string &string) const
+LLStyle::EUnderlineLink LLUrlEntryAgent::getUnderline(const std::string& string) const
{
std::string url = getUrl(string);
- return LLStringUtil::endsWith(url, "/about") || LLStringUtil::endsWith(url, "/inspect");
+ if (LLStringUtil::endsWith(url, "/about") || LLStringUtil::endsWith(url, "/inspect"))
+ {
+ return LLStyle::EUnderlineLink::UNDERLINE_ON_HOVER;
+ }
+ return LLStyle::EUnderlineLink::UNDERLINE_ALWAYS;
}
std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
@@ -702,11 +719,12 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa
}
}
-LLStyle::Params LLUrlEntryAgent::getStyle() const
+LLStyle::Params LLUrlEntryAgent::getStyle(const std::string &url) const
{
- LLStyle::Params style_params = LLUrlEntryBase::getStyle();
+ LLStyle::Params style_params = LLUrlEntryBase::getStyle(url);
style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+
return style_params;
}
@@ -741,6 +759,10 @@ std::string localize_slapp_label(const std::string& url, const std::string& full
{
return LLTrans::getString("SLappAgentRemoveFriend") + " " + full_name;
}
+ if (LLStringUtil::endsWith(url, "/mention"))
+ {
+ return "@" + full_name;
+ }
return full_name;
}
@@ -752,6 +774,36 @@ std::string LLUrlEntryAgent::getIcon(const std::string &url)
return mIcon;
}
+///
+/// LLUrlEntryAgentMention Describes a chat mention Url, e.g.,
+/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/mention
+///
+LLUrlEntryAgentMention::LLUrlEntryAgentMention()
+{
+ mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/mention", boost::regex::perl | boost::regex::icase);
+ mMenuName = "menu_url_agent.xml";
+ mIcon = std::string();
+}
+
+LLStyle::EUnderlineLink LLUrlEntryAgentMention::getUnderline(const std::string& string) const
+{
+ return LLStyle::EUnderlineLink::UNDERLINE_NEVER;
+}
+
+LLStyle::Params LLUrlEntryAgentMention::getStyle(const std::string& url) const
+{
+ LLStyle::Params style_params = LLUrlEntryAgent::getStyle(url);
+ style_params.color = LLUIColorTable::instance().getColor("ChatMentionFont");
+ style_params.readonly_color = LLUIColorTable::instance().getColor("ChatMentionFont");
+ style_params.font.style = "NORMAL";
+ style_params.draw_highlight_bg = true;
+
+ LLUUID agent_id(getIDStringFromUrl(url));
+ style_params.highlight_bg_color = LLUIColorTable::instance().getColor((agent_id == sAgentID) ? "ChatSelfMentionHighlight" : "ChatMentionHighlight");
+
+ return style_params;
+}
+
//
// LLUrlEntryAgentName describes a Second Life agent name Url, e.g.,
// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/(completename|displayname|username)
@@ -813,7 +865,7 @@ std::string LLUrlEntryAgentName::getLabel(const std::string &url, const LLUrlLab
}
}
-LLStyle::Params LLUrlEntryAgentName::getStyle() const
+LLStyle::Params LLUrlEntryAgentName::getStyle(const std::string &url) const
{
// don't override default colors
return LLStyle::Params().is_link(false);
@@ -949,9 +1001,9 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa
}
}
-LLStyle::Params LLUrlEntryGroup::getStyle() const
+LLStyle::Params LLUrlEntryGroup::getStyle(const std::string &url) const
{
- LLStyle::Params style_params = LLUrlEntryBase::getStyle();
+ LLStyle::Params style_params = LLUrlEntryBase::getStyle(url);
style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
return style_params;
@@ -1027,11 +1079,11 @@ std::string LLUrlEntryChat::getLabel(const std::string &url, const LLUrlLabelCal
}
// LLUrlEntryParcel statics.
-LLUUID LLUrlEntryParcel::sAgentID(LLUUID::null);
LLUUID LLUrlEntryParcel::sSessionID(LLUUID::null);
LLHost LLUrlEntryParcel::sRegionHost;
bool LLUrlEntryParcel::sDisconnected(false);
std::set<LLUrlEntryParcel*> LLUrlEntryParcel::sParcelInfoObservers;
+std::map<LLUUID, LLVector3d> LLUrlEntryParcel::sParcelPos;
///
/// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
@@ -1124,6 +1176,20 @@ void LLUrlEntryParcel::processParcelInfo(const LLParcelData& parcel_data)
url_entry->onParcelInfoReceived(parcel_data.parcel_id.asString(), label);
}
}
+ if (sParcelPos.find(parcel_data.parcel_id) == sParcelPos.end())
+ {
+ sParcelPos[parcel_data.parcel_id] = LLVector3d(parcel_data.global_x, parcel_data.global_y, parcel_data.global_z);
+ }
+}
+
+// static
+LLVector3d LLUrlEntryParcel::getParcelPos(const LLUUID& parcel_id)
+{
+ if (sParcelPos.find(parcel_id) != sParcelPos.end())
+ {
+ return sParcelPos[parcel_id];
+ }
+ return LLVector3d();
}
//
@@ -1361,17 +1427,17 @@ std::string LLUrlEntrySLLabel::getTooltip(const std::string &string) const
return LLUrlEntryBase::getTooltip(string);
}
-bool LLUrlEntrySLLabel::underlineOnHoverOnly(const std::string &string) const
+LLStyle::EUnderlineLink LLUrlEntrySLLabel::getUnderline(const std::string& string) const
{
std::string url = getUrl(string);
- LLUrlMatch match;
+ LLUrlMatch match;
if (LLUrlRegistry::instance().findUrl(url, match))
{
- return match.underlineOnHoverOnly();
+ return match.getUnderline();
}
// unrecognized URL? should not happen
- return LLUrlEntryBase::underlineOnHoverOnly(string);
+ return LLUrlEntryBase::getUnderline(string);
}
//
@@ -1435,7 +1501,7 @@ std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelC
return getUrl(url);
}
-LLStyle::Params LLUrlEntryNoLink::getStyle() const
+LLStyle::Params LLUrlEntryNoLink::getStyle(const std::string &url) const
{
// Don't render as URL (i.e. no context menu or hand cursor).
return LLStyle::Params().is_link(false);
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index fffee88496..efb5081103 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -41,6 +41,9 @@
#include <map>
class LLAvatarName;
+class LLVector3d;
+
+#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"
typedef boost::signals2::signal<void (const std::string& url,
const std::string& label,
@@ -85,7 +88,7 @@ public:
virtual std::string getIcon(const std::string &url);
/// Return the style to render the displayed text
- virtual LLStyle::Params getStyle() const;
+ virtual LLStyle::Params getStyle(const std::string &url) const;
/// Given a matched Url, return a tooltip string for the hyperlink
virtual std::string getTooltip(const std::string &string) const { return mTooltip; }
@@ -96,12 +99,14 @@ public:
/// Return the name of a SL location described by this Url, if any
virtual std::string getLocation(const std::string &url) const { return ""; }
- /// Should this link text be underlined only when mouse is hovered over it?
- virtual bool underlineOnHoverOnly(const std::string &string) const { return false; }
+ virtual LLStyle::EUnderlineLink getUnderline(const std::string& string) const { return LLStyle::EUnderlineLink::UNDERLINE_ALWAYS; }
virtual bool isTrusted() const { return false; }
+ virtual bool getSkipProfileIcon(const std::string& string) const { return false; }
+
virtual LLUUID getID(const std::string &string) const { return LLUUID::null; }
+ virtual bool isAgentID(const std::string& url) const { return false; }
bool isLinkDisabled() const;
@@ -109,6 +114,8 @@ public:
virtual bool isSLURLvalid(const std::string &url) const { return true; };
+ static void setAgentID(const LLUUID& id) { sAgentID = id; }
+
protected:
std::string getIDStringFromUrl(const std::string &url) const;
std::string escapeUrl(const std::string &url) const;
@@ -130,6 +137,8 @@ protected:
std::string mMenuName;
std::string mTooltip;
std::multimap<std::string, LLUrlEntryObserver> mObservers;
+
+ static LLUUID sAgentID;
};
///
@@ -224,9 +233,13 @@ public:
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
/*virtual*/ std::string getIcon(const std::string &url);
/*virtual*/ std::string getTooltip(const std::string &string) const;
- /*virtual*/ LLStyle::Params getStyle() const;
+ /*virtual*/ LLStyle::Params getStyle(const std::string &url) const;
/*virtual*/ LLUUID getID(const std::string &string) const;
- /*virtual*/ bool underlineOnHoverOnly(const std::string &string) const;
+
+ bool isAgentID(const std::string& url) const;
+
+ LLStyle::EUnderlineLink getUnderline(const std::string& string) const;
+
protected:
/*virtual*/ void callObservers(const std::string &id, const std::string &label, const std::string& icon);
private:
@@ -237,6 +250,19 @@ private:
};
///
+/// LLUrlEntryAgentMention Describes a chat mention Url, e.g.,
+/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/mention
+class LLUrlEntryAgentMention : public LLUrlEntryAgent
+{
+public:
+ LLUrlEntryAgentMention();
+
+ LLStyle::Params getStyle(const std::string& url) const;
+ LLStyle::EUnderlineLink getUnderline(const std::string& string) const;
+ bool getSkipProfileIcon(const std::string& string) const { return true; };
+};
+
+///
/// LLUrlEntryAgentName Describes a Second Life agent name Url, e.g.,
/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/(completename|displayname|username)
/// that displays various forms of user name
@@ -257,7 +283,7 @@ public:
mAvatarNameCacheConnections.clear();
}
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
- /*virtual*/ LLStyle::Params getStyle() const;
+ /*virtual*/ LLStyle::Params getStyle(const std::string &url) const;
protected:
// override this to pull out relevant name fields
virtual std::string getName(const LLAvatarName& avatar_name) = 0;
@@ -339,7 +365,7 @@ class LLUrlEntryGroup : public LLUrlEntryBase
public:
LLUrlEntryGroup();
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
- /*virtual*/ LLStyle::Params getStyle() const;
+ /*virtual*/ LLStyle::Params getStyle(const std::string &url) const;
/*virtual*/ LLUUID getID(const std::string &string) const;
private:
void onGroupNameReceived(const LLUUID& id, const std::string& name, bool is_group);
@@ -411,21 +437,22 @@ public:
// Processes parcel label and triggers notifying observers.
static void processParcelInfo(const LLParcelData& parcel_data);
- // Next 4 setters are used to update agent and viewer connection information
+ static LLVector3d getParcelPos(const LLUUID& parcel_id);
+
+ // Next setters are used to update agent and viewer connection information
// upon events like user login, viewer disconnect and user changing region host.
// These setters are made public to be accessible from newview and should not be
// used in other cases.
- static void setAgentID(const LLUUID& id) { sAgentID = id; }
static void setSessionID(const LLUUID& id) { sSessionID = id; }
static void setRegionHost(const LLHost& host) { sRegionHost = host; }
static void setDisconnected(bool disconnected) { sDisconnected = disconnected; }
private:
- static LLUUID sAgentID;
static LLUUID sSessionID;
static LLHost sRegionHost;
static bool sDisconnected;
static std::set<LLUrlEntryParcel*> sParcelInfoObservers;
+ static std::map<LLUUID, LLVector3d> sParcelPos;
};
///
@@ -486,7 +513,7 @@ public:
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
/*virtual*/ std::string getUrl(const std::string &string) const;
/*virtual*/ std::string getTooltip(const std::string &string) const;
- /*virtual*/ bool underlineOnHoverOnly(const std::string &string) const;
+ LLStyle::EUnderlineLink getUnderline(const std::string& string) const;
};
///
@@ -510,7 +537,7 @@ public:
LLUrlEntryNoLink();
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
/*virtual*/ std::string getUrl(const std::string &string) const;
- /*virtual*/ LLStyle::Params getStyle() const;
+ /*virtual*/ LLStyle::Params getStyle(const std::string &url) const;
};
///
diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp
index bfa3b167b1..f093934ca9 100644
--- a/indra/llui/llurlmatch.cpp
+++ b/indra/llui/llurlmatch.cpp
@@ -37,8 +37,9 @@ LLUrlMatch::LLUrlMatch() :
mIcon(""),
mMenuName(""),
mLocation(""),
- mUnderlineOnHoverOnly(false),
- mTrusted(false)
+ mUnderline(e_underline::UNDERLINE_ALWAYS),
+ mTrusted(false),
+ mSkipProfileIcon(false)
{
}
@@ -46,7 +47,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std
const std::string& query, const std::string &tooltip,
const std::string &icon, const LLStyle::Params& style,
const std::string &menu, const std::string &location,
- const LLUUID& id, bool underline_on_hover_only, bool trusted)
+ const LLUUID& id, e_underline underline, bool trusted, bool skip_icon)
{
mStart = start;
mEnd = end;
@@ -60,6 +61,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std
mMenuName = menu;
mLocation = location;
mID = id;
- mUnderlineOnHoverOnly = underline_on_hover_only;
+ mUnderline = underline;
mTrusted = trusted;
+ mSkipProfileIcon = skip_icon;
}
diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h
index ba822fbda6..418a21f963 100644
--- a/indra/llui/llurlmatch.h
+++ b/indra/llui/llurlmatch.h
@@ -31,7 +31,6 @@
//#include "linden_common.h"
#include <string>
-#include <vector>
#include "llstyle.h"
///
@@ -80,18 +79,20 @@ public:
/// return the SL location that this Url describes, or "" if none.
std::string getLocation() const { return mLocation; }
- /// Should this link text be underlined only when mouse is hovered over it?
- bool underlineOnHoverOnly() const { return mUnderlineOnHoverOnly; }
+ typedef LLStyle::EUnderlineLink e_underline;
+ e_underline getUnderline() const { return mUnderline; }
/// Return true if Url is trusted.
bool isTrusted() const { return mTrusted; }
+ bool getSkipProfileIcon() const { return mSkipProfileIcon; }
+
/// Change the contents of this match object (used by LLUrlRegistry)
void setValues(U32 start, U32 end, const std::string &url, const std::string &label,
const std::string& query, const std::string &tooltip, const std::string &icon,
const LLStyle::Params& style, const std::string &menu,
const std::string &location, const LLUUID& id,
- bool underline_on_hover_only = false, bool trusted = false);
+ e_underline underline = e_underline::UNDERLINE_ALWAYS, bool trusted = false, bool skip_icon = false);
const LLUUID& getID() const { return mID; }
private:
@@ -106,8 +107,9 @@ private:
std::string mLocation;
LLUUID mID;
LLStyle::Params mStyle;
- bool mUnderlineOnHoverOnly;
+ e_underline mUnderline;
bool mTrusted;
+ bool mSkipProfileIcon;
};
#endif
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index cec1ddfc57..cb101d325d 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -62,6 +62,8 @@ LLUrlRegistry::LLUrlRegistry()
registerUrl(new LLUrlEntryAgentUserName());
// LLUrlEntryAgent*Name must appear before LLUrlEntryAgent since
// LLUrlEntryAgent is a less specific (catchall for agent urls)
+ mUrlEntryAgentMention = new LLUrlEntryAgentMention();
+ registerUrl(mUrlEntryAgentMention);
registerUrl(new LLUrlEntryAgent());
registerUrl(new LLUrlEntryChat());
registerUrl(new LLUrlEntryGroup());
@@ -155,7 +157,7 @@ static bool stringHasUrl(const std::string &text)
text.find("@") != std::string::npos);
}
-bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb, bool is_content_trusted)
+bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb, bool is_content_trusted, bool skip_non_mentions)
{
// avoid costly regexes if there is clearly no URL in the text
if (! stringHasUrl(text))
@@ -176,6 +178,11 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL
continue;
}
+ if (skip_non_mentions && (mUrlEntryAgentMention != *it))
+ {
+ continue;
+ }
+
LLUrlEntryBase *url_entry = *it;
U32 start = 0, end = 0;
@@ -233,12 +240,13 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL
match_entry->getQuery(url),
match_entry->getTooltip(url),
match_entry->getIcon(url),
- match_entry->getStyle(),
+ match_entry->getStyle(url),
match_entry->getMenuName(),
match_entry->getLocation(url),
match_entry->getID(url),
- match_entry->underlineOnHoverOnly(url),
- match_entry->isTrusted());
+ match_entry->getUnderline(url),
+ match_entry->isTrusted(),
+ match_entry->getSkipProfileIcon(url));
return true;
}
@@ -274,7 +282,9 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr
match.getMenuName(),
match.getLocation(),
match.getID(),
- match.underlineOnHoverOnly());
+ match.getUnderline(),
+ false,
+ match.getSkipProfileIcon());
return true;
}
return false;
@@ -317,3 +327,30 @@ void LLUrlRegistry::setKeybindingHandler(LLKeyBindingToStringHandler* handler)
LLUrlEntryKeybinding *entry = (LLUrlEntryKeybinding*)mUrlEntryKeybinding;
entry->setHandler(handler);
}
+
+bool LLUrlRegistry::containsAgentMention(const std::string& text)
+{
+ // avoid costly regexes if there is clearly no URL in the text
+ if (!stringHasUrl(text))
+ {
+ return false;
+ }
+
+ try
+ {
+ boost::sregex_iterator it(text.begin(), text.end(), mUrlEntryAgentMention->getPattern());
+ boost::sregex_iterator end;
+ for (; it != end; ++it)
+ {
+ if (mUrlEntryAgentMention->isAgentID(it->str()))
+ {
+ return true;
+ }
+ }
+ }
+ catch (boost::regex_error&)
+ {
+ LL_INFOS() << "Regex error for: " << text << LL_ENDL;
+ }
+ return false;
+}
diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h
index 64cfec3960..592e422487 100644
--- a/indra/llui/llurlregistry.h
+++ b/indra/llui/llurlregistry.h
@@ -34,7 +34,6 @@
#include "llstring.h"
#include <string>
-#include <vector>
class LLKeyBindingToStringHandler;
@@ -76,7 +75,7 @@ public:
/// your callback is invoked if the matched Url's label changes in the future
bool findUrl(const std::string &text, LLUrlMatch &match,
const LLUrlLabelCallback &cb = &LLUrlRegistryNullCallback,
- bool is_content_trusted = false);
+ bool is_content_trusted = false, bool skip_non_mentions = false);
/// a slightly less efficient version of findUrl for wide strings
bool findUrl(const LLWString &text, LLUrlMatch &match,
@@ -93,6 +92,8 @@ public:
// Set handler for url registry to be capable of parsing and populating keybindings
void setKeybindingHandler(LLKeyBindingToStringHandler* handler);
+ bool containsAgentMention(const std::string& text);
+
private:
std::vector<LLUrlEntryBase *> mUrlEntry;
LLUrlEntryBase* mUrlEntryTrusted;
@@ -102,6 +103,7 @@ private:
LLUrlEntryBase* mUrlEntrySLLabel;
LLUrlEntryBase* mUrlEntryNoLink;
LLUrlEntryBase* mUrlEntryKeybinding;
+ LLUrlEntryBase* mUrlEntryAgentMention;
};
#endif
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 710ec3d05e..97212a9d2d 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -54,17 +54,17 @@
class LLSD;
-const U32 FOLLOWS_NONE = 0x00;
-const U32 FOLLOWS_LEFT = 0x01;
-const U32 FOLLOWS_RIGHT = 0x02;
-const U32 FOLLOWS_TOP = 0x10;
-const U32 FOLLOWS_BOTTOM = 0x20;
-const U32 FOLLOWS_ALL = 0x33;
+constexpr U32 FOLLOWS_NONE = 0x00;
+constexpr U32 FOLLOWS_LEFT = 0x01;
+constexpr U32 FOLLOWS_RIGHT = 0x02;
+constexpr U32 FOLLOWS_TOP = 0x10;
+constexpr U32 FOLLOWS_BOTTOM = 0x20;
+constexpr U32 FOLLOWS_ALL = 0x33;
-const bool MOUSE_OPAQUE = true;
-const bool NOT_MOUSE_OPAQUE = false;
+constexpr bool MOUSE_OPAQUE = true;
+constexpr bool NOT_MOUSE_OPAQUE = false;
-const U32 GL_NAME_UI_RESERVED = 2;
+constexpr U32 GL_NAME_UI_RESERVED = 2;
// maintains render state during traversal of UI tree
@@ -241,7 +241,7 @@ public:
void setUseBoundingRect( bool use_bounding_rect );
bool getUseBoundingRect() const;
- ECursorType getHoverCursor() { return mHoverCursor; }
+ ECursorType getHoverCursor() const { return mHoverCursor; }
static F32 getTooltipTimeout();
virtual const std::string getToolTip() const;
@@ -265,7 +265,7 @@ public:
void setDefaultTabGroup(S32 d) { mDefaultTabGroup = d; }
S32 getDefaultTabGroup() const { return mDefaultTabGroup; }
- S32 getLastTabGroup() { return mLastTabGroup; }
+ S32 getLastTabGroup() const { return mLastTabGroup; }
bool isInVisibleChain() const;
bool isInEnabledChain() const;
diff --git a/indra/llui/llviewborder.h b/indra/llui/llviewborder.h
index 1f118a0d20..a4bb748b77 100644
--- a/indra/llui/llviewborder.h
+++ b/indra/llui/llviewborder.h
@@ -92,7 +92,6 @@ public:
private:
void drawOnePixelLines();
void drawTwoPixelLines();
- void drawTextures();
EBevel mBevel;
EStyle mStyle;
diff --git a/indra/llui/llviewereventrecorder.cpp b/indra/llui/llviewereventrecorder.cpp
index 6d907d7e45..9eefba1390 100644
--- a/indra/llui/llviewereventrecorder.cpp
+++ b/indra/llui/llviewereventrecorder.cpp
@@ -34,8 +34,6 @@ LLViewerEventRecorder::LLViewerEventRecorder() {
logEvents = false;
// Remove any previous event log file
std::string old_log_ui_events_to_llsd_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.old");
- LLFile::remove(old_log_ui_events_to_llsd_file, ENOENT);
-
mLogFilename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.llsd");
LLFile::rename(mLogFilename, old_log_ui_events_to_llsd_file, ENOENT);
diff --git a/indra/llui/llviewereventrecorder.h b/indra/llui/llviewereventrecorder.h
index 9e752e8090..5636c068d8 100644
--- a/indra/llui/llviewereventrecorder.h
+++ b/indra/llui/llviewereventrecorder.h
@@ -61,7 +61,7 @@ public:
std::string get_xui();
void update_xui(std::string xui);
- bool getLoggingStatus(){return logEvents;};
+ bool getLoggingStatus() const { return logEvents; }
void setEventLoggingOn();
void setEventLoggingOff();
diff --git a/indra/llui/llvirtualtrackball.h b/indra/llui/llvirtualtrackball.h
index 61a78b2398..fbfda04585 100644
--- a/indra/llui/llvirtualtrackball.h
+++ b/indra/llui/llvirtualtrackball.h
@@ -78,20 +78,20 @@ public:
};
- virtual ~LLVirtualTrackball();
- /*virtual*/ bool postBuild();
+ ~LLVirtualTrackball() override;
+ bool postBuild() override;
- virtual bool handleHover(S32 x, S32 y, MASK mask);
- virtual bool handleMouseUp(S32 x, S32 y, MASK mask);
- virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
- virtual bool handleRightMouseDown(S32 x, S32 y, MASK mask);
- virtual bool handleKeyHere(KEY key, MASK mask);
+ bool handleHover(S32 x, S32 y, MASK mask) override;
+ bool handleMouseUp(S32 x, S32 y, MASK mask) override;
+ bool handleMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleRightMouseDown(S32 x, S32 y, MASK mask) override;
+ bool handleKeyHere(KEY key, MASK mask) override;
- virtual void draw();
+ void draw() override;
- virtual void setValue(const LLSD& value);
- void setValue(F32 x, F32 y, F32 z, F32 w);
- virtual LLSD getValue() const;
+ void setValue(const LLSD& value) override;
+ void setValue(F32 x, F32 y, F32 z, F32 w);
+ LLSD getValue() const override;
void setRotation(const LLQuaternion &value);
LLQuaternion getRotation() const;
@@ -102,7 +102,6 @@ public:
protected:
friend class LLUICtrlFactory;
LLVirtualTrackball(const Params&);
- void onEditChange();
protected:
LLTextBox* mNLabel;
diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h
index da29188943..ee230cd2f6 100644
--- a/indra/llui/llwindowshade.h
+++ b/indra/llui/llwindowshade.h
@@ -49,7 +49,7 @@ public:
};
void show(LLNotificationPtr);
- /*virtual*/ void draw();
+ void draw() override;
void hide();
bool isShown() const;
diff --git a/indra/llui/llxyvector.h b/indra/llui/llxyvector.h
index bc41213c13..646771f387 100644
--- a/indra/llui/llxyvector.h
+++ b/indra/llui/llxyvector.h
@@ -65,18 +65,18 @@ public:
};
- virtual ~LLXYVector();
- /*virtual*/ bool postBuild();
+ ~LLXYVector() override;
+ bool postBuild() override;
- virtual bool handleHover(S32 x, S32 y, MASK mask);
- virtual bool handleMouseUp(S32 x, S32 y, MASK mask);
- virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
+ bool handleHover(S32 x, S32 y, MASK mask) override;
+ bool handleMouseUp(S32 x, S32 y, MASK mask) override;
+ bool handleMouseDown(S32 x, S32 y, MASK mask) override;
- virtual void draw();
+ void draw() override;
- virtual void setValue(const LLSD& value);
- void setValue(F32 x, F32 y);
- virtual LLSD getValue() const;
+ void setValue(const LLSD& value) override;
+ void setValue(F32 x, F32 y);
+ LLSD getValue() const override;
protected:
friend class LLUICtrlFactory;
diff --git a/indra/llwebrtc/CMakeLists.txt b/indra/llwebrtc/CMakeLists.txt
index 6c0216234c..a01d9fc632 100644
--- a/indra/llwebrtc/CMakeLists.txt
+++ b/indra/llwebrtc/CMakeLists.txt
@@ -10,10 +10,6 @@ include(WebRTC)
project(llwebrtc)
-if (LINUX)
- add_compile_options(-Wno-deprecated-declarations) # webrtc::CreateAudioDeviceWithDataObserver is deprecated
-endif (LINUX)
-
set(llwebrtc_SOURCE_FILES
llwebrtc.cpp
)
@@ -46,7 +42,7 @@ if (WINDOWS)
iphlpapi
libcmt)
# as the webrtc libraries are release, build this binary as release as well.
- target_compile_options(llwebrtc PRIVATE "/MT")
+ target_compile_options(llwebrtc PRIVATE "/MT" "/Zc:wchar_t")
if (USE_BUGSPLAT)
set_target_properties(llwebrtc PROPERTIES PDB_OUTPUT_DIRECTORY "${SYMBOLS_STAGING_DIR}")
endif (USE_BUGSPLAT)
@@ -65,6 +61,8 @@ target_include_directories( llwebrtc INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
if (WINDOWS)
set_property(TARGET llwebrtc PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreadedDebug")
+else()
+ target_compile_options(llwebrtc PRIVATE -Wno-deprecated-declarations) # webrtc::CreateAudioDeviceWithDataObserver is deprecated
endif (WINDOWS)
ADD_CUSTOM_COMMAND(TARGET llwebrtc POST_BUILD
@@ -82,8 +80,13 @@ if (INSTALL)
set(_LIB lib/${ARCH}-linux-gnu)
elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed) OR (${LINUX_DISTRO} MATCHES gentoo))
set(_LIB lib${ADDRESS_SIZE})
- else (DARWIN)
+ else ()
set(_LIB lib)
- endif (DARWIN)
- install(TARGETS ${PROJECT_NAME} DESTINATION ${_LIB})
-endif (INSTALL)
+ endif ()
+
+ if (WINDOWS)
+ install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${PROJECT_NAME}.dll DESTINATION .)
+ else ()
+ install(TARGETS ${PROJECT_NAME} DESTINATION ${_LIB})
+ endif ()
+endif ()
diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp
index 9b3dde4d0f..7c2481a94c 100644
--- a/indra/llwebrtc/llwebrtc.cpp
+++ b/indra/llwebrtc/llwebrtc.cpp
@@ -9,7 +9,7 @@
* 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.
+ * 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
@@ -32,41 +32,93 @@
#include "api/audio_codecs/audio_encoder_factory.h"
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
+#include "api/audio/builtin_audio_processing_builder.h"
#include "api/media_stream_interface.h"
#include "api/media_stream_track.h"
#include "modules/audio_processing/audio_buffer.h"
#include "modules/audio_mixer/audio_mixer_impl.h"
+#include "api/environment/environment_factory.h"
+
+#if CM_WEBRTC
+
+#include "modules/congestion_controller/goog_cc/loss_based_bwe_v2.h"
+
+webrtc::RtpStreamConfig::Rtx::Rtx()
+{
+}
+
+webrtc::LossBasedBweV2::Config::Config()
+{
+}
+
+#endif
namespace llwebrtc
{
+#if WEBRTC_WIN
+static int16_t PLAYOUT_DEVICE_DEFAULT = webrtc::AudioDeviceModule::kDefaultDevice;
+static int16_t RECORD_DEVICE_DEFAULT = webrtc::AudioDeviceModule::kDefaultDevice;
+#else
+static int16_t PLAYOUT_DEVICE_DEFAULT = 0;
+static int16_t RECORD_DEVICE_DEFAULT = 0;
+#endif
-static int16_t PLAYOUT_DEVICE_DEFAULT = -1;
-static int16_t PLAYOUT_DEVICE_BAD = -2;
-static int16_t RECORD_DEVICE_DEFAULT = -1;
-static int16_t RECORD_DEVICE_BAD = -2;
-LLAudioDeviceObserver::LLAudioDeviceObserver() : mSumVector {0}, mMicrophoneEnergy(0.0) {}
+//
+// LLWebRTCAudioTransport implementation
+//
-float LLAudioDeviceObserver::getMicrophoneEnergy() { return mMicrophoneEnergy; }
+LLWebRTCAudioTransport::LLWebRTCAudioTransport() : mMicrophoneEnergy(0.0)
+{
+ memset(mSumVector, 0, sizeof(mSumVector));
+}
-// TODO: Pull smoothing/filtering code into a common helper function
-// for LLAudioDeviceObserver and LLCustomProcessor
+void LLWebRTCAudioTransport::SetEngineTransport(webrtc::AudioTransport* t)
+{
+ engine_.store(t, std::memory_order_release);
+}
-void LLAudioDeviceObserver::OnCaptureData(const void *audio_samples,
- const size_t num_samples,
- const size_t bytes_per_sample,
- const size_t num_channels,
- const uint32_t samples_per_sec)
+int32_t LLWebRTCAudioTransport::RecordedDataIsAvailable(const void* audio_data,
+ size_t number_of_frames,
+ size_t bytes_per_frame,
+ size_t number_of_channels,
+ uint32_t samples_per_sec,
+ uint32_t total_delay_ms,
+ int32_t clock_drift,
+ uint32_t current_mic_level,
+ bool key_pressed,
+ uint32_t& new_mic_level)
{
+ auto* engine = engine_.load(std::memory_order_acquire);
+
+ // 1) Deliver to engine (authoritative).
+ int32_t ret = 0;
+ if (engine)
+ {
+ ret = engine->RecordedDataIsAvailable(audio_data,
+ number_of_frames,
+ bytes_per_frame,
+ number_of_channels,
+ samples_per_sec,
+ total_delay_ms,
+ clock_drift,
+ current_mic_level,
+ key_pressed,
+ new_mic_level);
+ }
+
+ // 2) Calculate energy for microphone level monitoring
// calculate the energy
float energy = 0;
- const short *samples = (const short *) audio_samples;
- for (size_t index = 0; index < num_samples * num_channels; index++)
+ const short *samples = (const short *) audio_data;
+
+ for (size_t index = 0; index < number_of_frames * number_of_channels; index++)
{
float sample = (static_cast<float>(samples[index]) / (float) 32767);
energy += sample * sample;
}
-
+ float gain = mGain.load(std::memory_order_relaxed);
+ energy = energy * gain * gain;
// smooth it.
size_t buffer_size = sizeof(mSumVector) / sizeof(mSumVector[0]);
float totalSum = 0;
@@ -78,18 +130,59 @@ void LLAudioDeviceObserver::OnCaptureData(const void *audio_samples,
}
mSumVector[i] = energy;
totalSum += energy;
- mMicrophoneEnergy = std::sqrt(totalSum / (num_samples * buffer_size));
+ mMicrophoneEnergy = std::sqrt(totalSum / (number_of_frames * number_of_channels * buffer_size));
+
+ return ret;
}
-void LLAudioDeviceObserver::OnRenderData(const void *audio_samples,
- const size_t num_samples,
- const size_t bytes_per_sample,
- const size_t num_channels,
- const uint32_t samples_per_sec)
+int32_t LLWebRTCAudioTransport::NeedMorePlayData(size_t number_of_frames,
+ size_t bytes_per_frame,
+ size_t number_of_channels,
+ uint32_t samples_per_sec,
+ void* audio_data,
+ size_t& number_of_samples_out,
+ int64_t* elapsed_time_ms,
+ int64_t* ntp_time_ms)
{
+ auto* engine = engine_.load(std::memory_order_acquire);
+ if (!engine)
+ {
+ // No engine sink; output silence to be safe.
+ const size_t bytes = number_of_frames * bytes_per_frame * number_of_channels;
+ memset(audio_data, 0, bytes);
+ number_of_samples_out = bytes_per_frame;
+ return 0;
+ }
+
+ // Only the engine should fill the buffer.
+ return engine->NeedMorePlayData(number_of_frames,
+ bytes_per_frame,
+ number_of_channels,
+ samples_per_sec,
+ audio_data,
+ number_of_samples_out,
+ elapsed_time_ms,
+ ntp_time_ms);
+}
+
+void LLWebRTCAudioTransport::PullRenderData(int bits_per_sample,
+ int sample_rate,
+ size_t number_of_channels,
+ size_t number_of_frames,
+ void* audio_data,
+ int64_t* elapsed_time_ms,
+ int64_t* ntp_time_ms)
+{
+ auto* engine = engine_.load(std::memory_order_acquire);
+
+ if (engine)
+ {
+ engine
+ ->PullRenderData(bits_per_sample, sample_rate, number_of_channels, number_of_frames, audio_data, elapsed_time_ms, ntp_time_ms);
+ }
}
-LLCustomProcessor::LLCustomProcessor() : mSampleRateHz(0), mNumChannels(0), mMicrophoneEnergy(0.0), mGain(1.0)
+LLCustomProcessor::LLCustomProcessor(LLCustomProcessorStatePtr state) : mSampleRateHz(0), mNumChannels(0), mState(state)
{
memset(mSumVector, 0, sizeof(mSumVector));
}
@@ -101,40 +194,61 @@ void LLCustomProcessor::Initialize(int sample_rate_hz, int num_channels)
memset(mSumVector, 0, sizeof(mSumVector));
}
-void LLCustomProcessor::Process(webrtc::AudioBuffer *audio_in)
+void LLCustomProcessor::Process(webrtc::AudioBuffer *audio)
{
- webrtc::StreamConfig stream_config;
- stream_config.set_sample_rate_hz(mSampleRateHz);
- stream_config.set_num_channels(mNumChannels);
- std::vector<float *> frame;
- std::vector<float> frame_samples;
-
- if (audio_in->num_channels() < 1 || audio_in->num_frames() < 480)
+ if (audio->num_channels() < 1 || audio->num_frames() < 480)
{
return;
}
- // grab the input audio
- frame_samples.resize(stream_config.num_samples());
- frame.resize(stream_config.num_channels());
- for (size_t ch = 0; ch < stream_config.num_channels(); ++ch)
+ // calculate the energy
+
+ float desired_gain = mState->getGain();
+ if (mState->getDirty())
{
- frame[ch] = &(frame_samples)[ch * stream_config.num_frames()];
+ // We'll delay ramping by 30ms in order to clear out buffers that may
+ // have had content before muting. And for the last 20ms, we'll ramp
+ // down or up smoothly.
+ mRampFrames = 5;
+
+ // we've changed our desired gain, so set the incremental
+ // gain change so that we smoothly step over 20ms
+ mGainStep = (desired_gain - mCurrentGain) / (mSampleRateHz / 50);
}
- audio_in->CopyTo(stream_config, &frame[0]);
-
- // calculate the energy
- float energy = 0;
- for (size_t index = 0; index < stream_config.num_samples(); index++)
+ if (mRampFrames)
{
- float sample = frame_samples[index];
- sample = sample * mGain; // apply gain
- frame_samples[index] = sample; // write processed sample back to buffer.
- energy += sample * sample;
+ if (mRampFrames-- > 2)
+ {
+ // don't change the gain if we're still in the 'don't move' phase
+ mGainStep = 0.0f;
+ }
+ }
+ else
+ {
+ // We've ramped all the way down, so don't step the gain any more and
+ // just maintaint he current gain.
+ mGainStep = 0.0f;
+ mCurrentGain = desired_gain;
}
- audio_in->CopyFrom(&frame[0], stream_config);
+ float energy = 0;
+
+ auto chans = audio->channels();
+ for (size_t ch = 0; ch < audio->num_channels(); ch++)
+ {
+ float* frame_samples = chans[ch];
+ float gain = mCurrentGain;
+ for (size_t index = 0; index < audio->num_frames(); index++)
+ {
+ float sample = frame_samples[index];
+ sample = sample * gain; // apply gain
+ frame_samples[index] = sample; // write processed sample back to buffer.
+ energy += sample * sample;
+ gain += mGainStep;
+ }
+ }
+ mCurrentGain += audio->num_frames() * mGainStep;
// smooth it.
size_t buffer_size = sizeof(mSumVector) / sizeof(mSumVector[0]);
@@ -147,7 +261,7 @@ void LLCustomProcessor::Process(webrtc::AudioBuffer *audio_in)
}
mSumVector[i] = energy;
totalSum += energy;
- mMicrophoneEnergy = std::sqrt(totalSum / (stream_config.num_samples() * buffer_size));
+ mState->setMicrophoneEnergy(std::sqrt(totalSum / (audio->num_channels() * audio->num_frames() * buffer_size)));
}
//
@@ -159,91 +273,56 @@ LLWebRTCImpl::LLWebRTCImpl(LLWebRTCLogCallback* logCallback) :
mPeerCustomProcessor(nullptr),
mMute(true),
mTuningMode(false),
- mPlayoutDevice(0),
- mRecordingDevice(0),
- mTuningAudioDeviceObserver(nullptr)
+ mDevicesDeploying(0),
+ mGain(0.0f)
{
}
void LLWebRTCImpl::init()
{
- mPlayoutDevice = 0;
- mRecordingDevice = 0;
- rtc::InitializeSSL();
+ webrtc::InitializeSSL();
// Normal logging is rather spammy, so turn it off.
- rtc::LogMessage::LogToDebug(rtc::LS_NONE);
- rtc::LogMessage::SetLogToStderr(true);
- rtc::LogMessage::AddLogToStream(mLogSink, rtc::LS_VERBOSE);
+ webrtc::LogMessage::LogToDebug(webrtc::LS_NONE);
+ webrtc::LogMessage::SetLogToStderr(true);
+ webrtc::LogMessage::AddLogToStream(mLogSink, webrtc::LS_VERBOSE);
mTaskQueueFactory = webrtc::CreateDefaultTaskQueueFactory();
// Create the native threads.
- mNetworkThread = rtc::Thread::CreateWithSocketServer();
+ mNetworkThread = webrtc::Thread::CreateWithSocketServer();
mNetworkThread->SetName("WebRTCNetworkThread", nullptr);
mNetworkThread->Start();
- mWorkerThread = rtc::Thread::Create();
+ mWorkerThread = webrtc::Thread::Create();
mWorkerThread->SetName("WebRTCWorkerThread", nullptr);
mWorkerThread->Start();
- mSignalingThread = rtc::Thread::Create();
+ mSignalingThread = webrtc::Thread::Create();
mSignalingThread->SetName("WebRTCSignalingThread", nullptr);
mSignalingThread->Start();
- mTuningAudioDeviceObserver = new LLAudioDeviceObserver;
- mWorkerThread->PostTask(
+ mWorkerThread->BlockingCall(
[this]()
{
- // Initialize the audio devices on the Worker Thread
- mTuningDeviceModule =
- webrtc::CreateAudioDeviceWithDataObserver(webrtc::AudioDeviceModule::AudioLayer::kPlatformDefaultAudio,
- mTaskQueueFactory.get(),
- std::unique_ptr<webrtc::AudioDeviceDataObserver>(mTuningAudioDeviceObserver));
-
- mTuningDeviceModule->Init();
- mTuningDeviceModule->SetPlayoutDevice(mPlayoutDevice);
- mTuningDeviceModule->SetRecordingDevice(mRecordingDevice);
- mTuningDeviceModule->EnableBuiltInAEC(false);
+ webrtc::scoped_refptr<webrtc::AudioDeviceModule> realADM =
+ webrtc::AudioDeviceModule::Create(webrtc::AudioDeviceModule::AudioLayer::kPlatformDefaultAudio, mTaskQueueFactory.get());
+ mDeviceModule = webrtc::make_ref_counted<LLWebRTCAudioDeviceModule>(realADM);
#if !CM_WEBRTC
- mTuningDeviceModule->SetAudioDeviceSink(this);
+ mDeviceModule->SetObserver(this);
#endif
- mTuningDeviceModule->InitMicrophone();
- mTuningDeviceModule->InitSpeaker();
- mTuningDeviceModule->SetStereoRecording(false);
- mTuningDeviceModule->SetStereoPlayout(true);
- mTuningDeviceModule->InitRecording();
- mTuningDeviceModule->InitPlayout();
- updateDevices();
- });
-
- mWorkerThread->BlockingCall(
- [this]()
- {
- // the peer device module doesn't need an observer
- // as we pull peer data after audio processing.
- mPeerDeviceModule = webrtc::CreateAudioDeviceWithDataObserver(webrtc::AudioDeviceModule::AudioLayer::kPlatformDefaultAudio,
- mTaskQueueFactory.get(),
- nullptr);
- mPeerDeviceModule->Init();
- mPeerDeviceModule->SetPlayoutDevice(mPlayoutDevice);
- mPeerDeviceModule->SetRecordingDevice(mRecordingDevice);
- mPeerDeviceModule->EnableBuiltInAEC(false);
- mPeerDeviceModule->InitMicrophone();
- mPeerDeviceModule->InitSpeaker();
});
// The custom processor allows us to retrieve audio data (and levels)
// from after other audio processing such as AEC, AGC, etc.
- mPeerCustomProcessor = new LLCustomProcessor;
- webrtc::AudioProcessingBuilder apb;
- apb.SetCapturePostProcessing(std::unique_ptr<webrtc::CustomProcessing>(mPeerCustomProcessor));
- mAudioProcessingModule = apb.Create();
+ mPeerCustomProcessor = std::make_shared<LLCustomProcessorState>();
+ webrtc::BuiltinAudioProcessingBuilder apb;
+ apb.SetCapturePostProcessing(std::make_unique<LLCustomProcessor>(mPeerCustomProcessor));
+ mAudioProcessingModule = apb.Build(webrtc::CreateEnvironment());
webrtc::AudioProcessing::Config apm_config;
apm_config.echo_canceller.enabled = false;
apm_config.echo_canceller.mobile_mode = false;
apm_config.gain_controller1.enabled = false;
- apm_config.gain_controller1.mode = webrtc::AudioProcessing::Config::GainController1::kAdaptiveAnalog;
- apm_config.gain_controller2.enabled = false;
+ apm_config.gain_controller2.enabled = true;
apm_config.high_pass_filter.enabled = true;
apm_config.noise_suppression.enabled = true;
apm_config.noise_suppression.level = webrtc::AudioProcessing::Config::NoiseSuppression::kVeryHigh;
@@ -254,6 +333,7 @@ void LLWebRTCImpl::init()
mAudioProcessingModule->ApplyConfig(apm_config);
webrtc::ProcessingConfig processing_config;
+
processing_config.input_stream().set_num_channels(2);
processing_config.input_stream().set_sample_rate_hz(48000);
processing_config.output_stream().set_num_channels(2);
@@ -268,18 +348,37 @@ void LLWebRTCImpl::init()
mPeerConnectionFactory = webrtc::CreatePeerConnectionFactory(mNetworkThread.get(),
mWorkerThread.get(),
mSignalingThread.get(),
- mPeerDeviceModule,
+ mDeviceModule,
webrtc::CreateBuiltinAudioEncoderFactory(),
webrtc::CreateBuiltinAudioDecoderFactory(),
nullptr /* video_encoder_factory */,
nullptr /* video_decoder_factory */,
nullptr /* audio_mixer */,
mAudioProcessingModule);
+ mWorkerThread->PostTask(
+ [this]()
+ {
+ if (mDeviceModule)
+ {
+ mDeviceModule->EnableBuiltInAEC(false);
+ updateDevices();
+ }
+ });
}
void LLWebRTCImpl::terminate()
{
+ mWorkerThread->BlockingCall(
+ [this]()
+ {
+ if (mDeviceModule)
+ {
+ mDeviceModule->ForceStopRecording();
+ mDeviceModule->StopPlayout();
+ }
+ });
+
for (auto &connection : mPeerConnections)
{
connection->terminate();
@@ -291,69 +390,25 @@ void LLWebRTCImpl::terminate()
mSignalingThread->BlockingCall([this]() { mPeerConnectionFactory = nullptr; });
- mPeerConnections.clear();
-
mWorkerThread->BlockingCall(
[this]()
{
- if (mTuningDeviceModule)
+ if (mDeviceModule)
{
- mTuningDeviceModule->StopRecording();
- mTuningDeviceModule->Terminate();
+ mDeviceModule->Terminate();
}
- if (mPeerDeviceModule)
- {
- mPeerDeviceModule->StopRecording();
- mPeerDeviceModule->Terminate();
- }
- mTuningDeviceModule = nullptr;
- mPeerDeviceModule = nullptr;
- mTaskQueueFactory = nullptr;
+ mDeviceModule = nullptr;
+ mTaskQueueFactory = nullptr;
});
- rtc::LogMessage::RemoveLogToStream(mLogSink);
-}
-//
-// Devices functions
-//
-// Most device-related functionality needs to happen
-// on the worker thread (the audio thread,) so those calls will be
-// proxied over to that thread.
-//
-void LLWebRTCImpl::setRecording(bool recording)
-{
- mWorkerThread->PostTask(
- [this, recording]()
- {
- if (recording)
- {
- mPeerDeviceModule->SetStereoRecording(false);
- mPeerDeviceModule->InitRecording();
- mPeerDeviceModule->StartRecording();
- }
- else
- {
- mPeerDeviceModule->StopRecording();
- }
- });
-}
+ // In case peer connections still somehow have jobs in workers,
+ // only clear connections up after clearing workers.
+ mNetworkThread = nullptr;
+ mWorkerThread = nullptr;
+ mSignalingThread = nullptr;
-void LLWebRTCImpl::setPlayout(bool playing)
-{
- mWorkerThread->PostTask(
- [this, playing]()
- {
- if (playing)
- {
- mPeerDeviceModule->SetStereoPlayout(true);
- mPeerDeviceModule->InitPlayout();
- mPeerDeviceModule->StartPlayout();
- }
- else
- {
- mPeerDeviceModule->StopPlayout();
- }
- });
+ mPeerConnections.clear();
+ webrtc::LogMessage::RemoveLogToStream(mLogSink);
}
void LLWebRTCImpl::setAudioConfig(LLWebRTCDeviceInterface::AudioConfig config)
@@ -361,9 +416,9 @@ void LLWebRTCImpl::setAudioConfig(LLWebRTCDeviceInterface::AudioConfig config)
webrtc::AudioProcessing::Config apm_config;
apm_config.echo_canceller.enabled = config.mEchoCancellation;
apm_config.echo_canceller.mobile_mode = false;
- apm_config.gain_controller1.enabled = config.mAGC;
- apm_config.gain_controller1.mode = webrtc::AudioProcessing::Config::GainController1::kAdaptiveAnalog;
- apm_config.gain_controller2.enabled = false;
+ apm_config.gain_controller1.enabled = false;
+ apm_config.gain_controller2.enabled = config.mAGC;
+ apm_config.gain_controller2.adaptive_digital.enabled = true; // auto-level speech
apm_config.high_pass_filter.enabled = true;
apm_config.transient_suppression.enabled = true;
apm_config.pipeline.multi_channel_render = true;
@@ -416,142 +471,148 @@ void LLWebRTCImpl::unsetDevicesObserver(LLWebRTCDevicesObserver *observer)
}
}
-void ll_set_device_module_capture_device(rtc::scoped_refptr<webrtc::AudioDeviceModule> device_module, int16_t device)
+// must be run in the worker thread.
+void LLWebRTCImpl::workerDeployDevices()
{
-#if WEBRTC_WIN
- if (device < 0)
- {
- device_module->SetRecordingDevice(webrtc::AudioDeviceModule::kDefaultDevice);
- }
- else
+ if (!mDeviceModule)
{
- device_module->SetRecordingDevice(device);
+ return;
}
-#else
- // passed in default is -1, but the device list
- // has it at 0
- device_module->SetRecordingDevice(device + 1);
-#endif
- device_module->SetStereoRecording(false);
- device_module->InitMicrophone();
- device_module->InitRecording();
-}
-void LLWebRTCImpl::setCaptureDevice(const std::string &id)
-{
int16_t recordingDevice = RECORD_DEVICE_DEFAULT;
- if (id != "Default")
+ int16_t recording_device_start = 0;
+
+ if (mRecordingDevice != "Default")
{
- for (int16_t i = 0; i < mRecordingDeviceList.size(); i++)
+ for (int16_t i = recording_device_start; i < mRecordingDeviceList.size(); i++)
{
- if (mRecordingDeviceList[i].mID == id)
+ if (mRecordingDeviceList[i].mID == mRecordingDevice)
{
recordingDevice = i;
+#if !WEBRTC_WIN
+ // linux and mac devices range from 1 to the end of the list, with the index 0 being the
+ // 'default' device. Windows has a special 'default' device and other devices are indexed
+ // from 0
+ recordingDevice++;
+#endif
break;
}
}
}
- if (recordingDevice == mRecordingDevice)
- {
- return;
- }
- mRecordingDevice = recordingDevice;
- if (mTuningMode)
- {
- mWorkerThread->PostTask([this, recordingDevice]()
- {
- ll_set_device_module_capture_device(mTuningDeviceModule, recordingDevice);
- });
- }
- else
- {
- mWorkerThread->PostTask([this, recordingDevice]()
- {
- bool recording = mPeerDeviceModule->Recording();
- if (recording)
- {
- mPeerDeviceModule->StopRecording();
- }
- ll_set_device_module_capture_device(mPeerDeviceModule, recordingDevice);
- if (recording)
- {
- mPeerDeviceModule->StartRecording();
- }
- });
- }
-}
-
-void ll_set_device_module_render_device(rtc::scoped_refptr<webrtc::AudioDeviceModule> device_module, int16_t device)
-{
+ mDeviceModule->StopPlayout();
+ mDeviceModule->ForceStopRecording();
#if WEBRTC_WIN
- if (device < 0)
+ if (recordingDevice < 0)
{
- device_module->SetPlayoutDevice(webrtc::AudioDeviceModule::kDefaultDevice);
+ mDeviceModule->SetRecordingDevice((webrtc::AudioDeviceModule::WindowsDeviceType)recordingDevice);
}
else
{
- device_module->SetPlayoutDevice(device);
+ mDeviceModule->SetRecordingDevice(recordingDevice);
}
#else
- device_module->SetPlayoutDevice(device + 1);
+ mDeviceModule->SetRecordingDevice(recordingDevice);
#endif
- device_module->SetStereoPlayout(true);
- device_module->InitSpeaker();
- device_module->InitPlayout();
-}
+ mDeviceModule->InitMicrophone();
+ mDeviceModule->SetStereoRecording(false);
+ mDeviceModule->InitRecording();
-void LLWebRTCImpl::setRenderDevice(const std::string &id)
-{
int16_t playoutDevice = PLAYOUT_DEVICE_DEFAULT;
- if (id != "Default")
+ int16_t playout_device_start = 0;
+ if (mPlayoutDevice != "Default")
{
- for (int16_t i = 0; i < mPlayoutDeviceList.size(); i++)
+ for (int16_t i = playout_device_start; i < mPlayoutDeviceList.size(); i++)
{
- if (mPlayoutDeviceList[i].mID == id)
+ if (mPlayoutDeviceList[i].mID == mPlayoutDevice)
{
playoutDevice = i;
+#if !WEBRTC_WIN
+ // linux and mac devices range from 1 to the end of the list, with the index 0 being the
+ // 'default' device. Windows has a special 'default' device and other devices are indexed
+ // from 0
+ playoutDevice++;
+#endif
break;
}
}
}
- if (playoutDevice == mPlayoutDevice)
+
+#if WEBRTC_WIN
+ if (playoutDevice < 0)
{
- return;
+ mDeviceModule->SetPlayoutDevice((webrtc::AudioDeviceModule::WindowsDeviceType)playoutDevice);
}
- mPlayoutDevice = playoutDevice;
+ else
+ {
+ mDeviceModule->SetPlayoutDevice(playoutDevice);
+ }
+#else
+ mDeviceModule->SetPlayoutDevice(playoutDevice);
+#endif
+ mDeviceModule->InitSpeaker();
+ mDeviceModule->SetStereoPlayout(true);
+ mDeviceModule->InitPlayout();
- if (mTuningMode)
+ if ((!mMute && mPeerConnections.size()) || mTuningMode)
{
- mWorkerThread->PostTask(
- [this, playoutDevice]()
- {
- ll_set_device_module_render_device(mTuningDeviceModule, playoutDevice);
- });
+ mDeviceModule->ForceStartRecording();
}
- else
+
+ if (!mTuningMode)
{
- mWorkerThread->PostTask(
- [this, playoutDevice]()
+ mDeviceModule->StartPlayout();
+ }
+ mSignalingThread->PostTask(
+ [this]
+ {
+ for (auto& connection : mPeerConnections)
{
- bool playing = mPeerDeviceModule->Playing();
- if (playing)
+ if (mTuningMode)
{
- mPeerDeviceModule->StopPlayout();
+ connection->enableSenderTracks(false);
}
- ll_set_device_module_render_device(mPeerDeviceModule, playoutDevice);
- if (playing)
+ else
{
- mPeerDeviceModule->StartPlayout();
+ connection->resetMute();
}
- });
+ connection->enableReceiverTracks(!mTuningMode);
+ }
+ if (1 < mDevicesDeploying.fetch_sub(1, std::memory_order_relaxed))
+ {
+ mWorkerThread->PostTask([this] { workerDeployDevices(); });
+ }
+ });
+}
+
+void LLWebRTCImpl::setCaptureDevice(const std::string &id)
+{
+
+ if (mRecordingDevice != id)
+ {
+ mRecordingDevice = id;
+ deployDevices();
+ }
+}
+
+void LLWebRTCImpl::setRenderDevice(const std::string &id)
+{
+ if (mPlayoutDevice != id)
+ {
+ mPlayoutDevice = id;
+ deployDevices();
}
}
// updateDevices needs to happen on the worker thread.
void LLWebRTCImpl::updateDevices()
{
- int16_t renderDeviceCount = mTuningDeviceModule->PlayoutDevices();
+ if (!mDeviceModule)
+ {
+ return;
+ }
+
+ int16_t renderDeviceCount = mDeviceModule->PlayoutDevices();
mPlayoutDeviceList.clear();
#if WEBRTC_WIN
@@ -565,11 +626,11 @@ void LLWebRTCImpl::updateDevices()
{
char name[webrtc::kAdmMaxDeviceNameSize];
char guid[webrtc::kAdmMaxGuidSize];
- mTuningDeviceModule->PlayoutDeviceName(index, name, guid);
+ mDeviceModule->PlayoutDeviceName(index, name, guid);
mPlayoutDeviceList.emplace_back(name, guid);
}
- int16_t captureDeviceCount = mTuningDeviceModule->RecordingDevices();
+ int16_t captureDeviceCount = mDeviceModule->RecordingDevices();
mRecordingDeviceList.clear();
#if WEBRTC_WIN
@@ -583,7 +644,7 @@ void LLWebRTCImpl::updateDevices()
{
char name[webrtc::kAdmMaxDeviceNameSize];
char guid[webrtc::kAdmMaxGuidSize];
- mTuningDeviceModule->RecordingDeviceName(index, name, guid);
+ mDeviceModule->RecordingDeviceName(index, name, guid);
mRecordingDeviceList.emplace_back(name, guid);
}
@@ -595,10 +656,6 @@ void LLWebRTCImpl::updateDevices()
void LLWebRTCImpl::OnDevicesUpdated()
{
- // reset these to a bad value so an update is forced
- mRecordingDevice = RECORD_DEVICE_BAD;
- mPlayoutDevice = PLAYOUT_DEVICE_BAD;
-
updateDevices();
}
@@ -606,61 +663,117 @@ void LLWebRTCImpl::OnDevicesUpdated()
void LLWebRTCImpl::setTuningMode(bool enable)
{
mTuningMode = enable;
+ if (!mTuningMode
+ && !mMute
+ && mPeerCustomProcessor
+ && mPeerCustomProcessor->getGain() != mGain)
+ {
+ mPeerCustomProcessor->setGain(mGain);
+ }
mWorkerThread->PostTask(
- [this, enable] {
- if (enable)
- {
- mPeerDeviceModule->StopRecording();
- mPeerDeviceModule->StopPlayout();
- ll_set_device_module_render_device(mTuningDeviceModule, mPlayoutDevice);
- ll_set_device_module_capture_device(mTuningDeviceModule, mRecordingDevice);
- mTuningDeviceModule->InitPlayout();
- mTuningDeviceModule->InitRecording();
- mTuningDeviceModule->StartRecording();
- // TODO: Starting Playout on the TDM appears to create an audio artifact (click)
- // in this case, so disabling it for now. We may have to do something different
- // if we enable 'echo playback' via the TDM when tuning.
- //mTuningDeviceModule->StartPlayout();
- }
- else
- {
- mTuningDeviceModule->StopRecording();
- //mTuningDeviceModule->StopPlayout();
- ll_set_device_module_render_device(mPeerDeviceModule, mPlayoutDevice);
- ll_set_device_module_capture_device(mPeerDeviceModule, mRecordingDevice);
- mPeerDeviceModule->SetStereoPlayout(true);
- mPeerDeviceModule->SetStereoRecording(false);
- mPeerDeviceModule->InitPlayout();
- mPeerDeviceModule->InitRecording();
- mPeerDeviceModule->StartPlayout();
- mPeerDeviceModule->StartRecording();
- }
- }
- );
- mSignalingThread->PostTask(
- [this, enable]
+ [this]
{
- for (auto &connection : mPeerConnections)
- {
- if (enable)
- {
- connection->enableSenderTracks(false);
- }
- else
+ mDeviceModule->SetTuning(mTuningMode, mMute);
+ mSignalingThread->PostTask(
+ [this]
{
- connection->resetMute();
- }
- connection->enableReceiverTracks(!enable);
- }
+ for (auto& connection : mPeerConnections)
+ {
+ if (mTuningMode)
+ {
+ connection->enableSenderTracks(false);
+ }
+ else
+ {
+ connection->resetMute();
+ }
+ connection->enableReceiverTracks(!mTuningMode);
+ }
+ });
+ });
+}
+
+void LLWebRTCImpl::deployDevices()
+{
+ if (0 < mDevicesDeploying.fetch_add(1, std::memory_order_relaxed))
+ {
+ return;
+ }
+ mWorkerThread->PostTask(
+ [this] {
+ workerDeployDevices();
});
}
-float LLWebRTCImpl::getTuningAudioLevel() { return -20 * log10f(mTuningAudioDeviceObserver->getMicrophoneEnergy()); }
+float LLWebRTCImpl::getTuningAudioLevel()
+{
+ return mDeviceModule ? -20 * log10f(mDeviceModule->GetMicrophoneEnergy()) : std::numeric_limits<float>::infinity();
+}
+
+void LLWebRTCImpl::setTuningMicGain(float gain)
+{
+ if (mTuningMode && mDeviceModule)
+ {
+ mDeviceModule->SetTuningMicGain(gain);
+ }
+}
+
+float LLWebRTCImpl::getPeerConnectionAudioLevel()
+{
+ return mTuningMode ? std::numeric_limits<float>::infinity()
+ : (mPeerCustomProcessor ? -20 * log10f(mPeerCustomProcessor->getMicrophoneEnergy())
+ : std::numeric_limits<float>::infinity());
+}
-float LLWebRTCImpl::getPeerConnectionAudioLevel() { return -20 * log10f(mPeerCustomProcessor->getMicrophoneEnergy()); }
+void LLWebRTCImpl::setMicGain(float gain)
+{
+ mGain = gain;
+ if (!mTuningMode && mPeerCustomProcessor)
+ {
+ mPeerCustomProcessor->setGain(gain);
+ }
+}
-void LLWebRTCImpl::setPeerConnectionGain(float gain) { mPeerCustomProcessor->setGain(gain); }
+void LLWebRTCImpl::setMute(bool mute, int delay_ms)
+{
+ if (mMute != mute)
+ {
+ mMute = mute;
+ intSetMute(mute, delay_ms);
+ }
+}
+void LLWebRTCImpl::intSetMute(bool mute, int delay_ms)
+{
+ if (mPeerCustomProcessor)
+ {
+ mPeerCustomProcessor->setGain(mMute ? 0.0f : mGain);
+ }
+ if (mMute)
+ {
+ mWorkerThread->PostDelayedTask(
+ [this]
+ {
+ if (mDeviceModule)
+ {
+ mDeviceModule->ForceStopRecording();
+ }
+ },
+ webrtc::TimeDelta::Millis(delay_ms));
+ }
+ else
+ {
+ mWorkerThread->PostTask(
+ [this]
+ {
+ if (mDeviceModule)
+ {
+ mDeviceModule->InitRecording();
+ mDeviceModule->ForceStartRecording();
+ }
+ });
+ }
+}
//
// Peer Connection Helpers
@@ -668,31 +781,32 @@ void LLWebRTCImpl::setPeerConnectionGain(float gain) { mPeerCustomProcessor->set
LLWebRTCPeerConnectionInterface *LLWebRTCImpl::newPeerConnection()
{
- rtc::scoped_refptr<LLWebRTCPeerConnectionImpl> peerConnection = rtc::scoped_refptr<LLWebRTCPeerConnectionImpl>(new rtc::RefCountedObject<LLWebRTCPeerConnectionImpl>());
+ bool empty = mPeerConnections.empty();
+ webrtc::scoped_refptr<LLWebRTCPeerConnectionImpl> peerConnection = webrtc::scoped_refptr<LLWebRTCPeerConnectionImpl>(new webrtc::RefCountedObject<LLWebRTCPeerConnectionImpl>());
peerConnection->init(this);
-
- mPeerConnections.emplace_back(peerConnection);
- peerConnection->enableSenderTracks(!mMute);
if (mPeerConnections.empty())
{
- setRecording(true);
- setPlayout(true);
+ intSetMute(mMute);
}
+ mPeerConnections.emplace_back(peerConnection);
+
+ peerConnection->enableSenderTracks(false);
+ peerConnection->resetMute();
return peerConnection.get();
}
void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnectionInterface* peer_connection)
{
- std::vector<rtc::scoped_refptr<LLWebRTCPeerConnectionImpl>>::iterator it =
+ std::vector<webrtc::scoped_refptr<LLWebRTCPeerConnectionImpl>>::iterator it =
std::find(mPeerConnections.begin(), mPeerConnections.end(), peer_connection);
if (it != mPeerConnections.end())
{
+ // Todo: make sure conection had no jobs in workers
mPeerConnections.erase(it);
- }
- if (mPeerConnections.empty())
- {
- setRecording(false);
- setPlayout(false);
+ if (mPeerConnections.empty())
+ {
+ intSetMute(true);
+ }
}
}
@@ -706,8 +820,9 @@ void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnectionInterface* peer_conn
LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() :
mWebRTCImpl(nullptr),
mPeerConnection(nullptr),
- mMute(true),
- mAnswerReceived(false)
+ mMute(MUTE_INITIAL),
+ mAnswerReceived(false),
+ mPendingJobs(0)
{
}
@@ -715,6 +830,10 @@ LLWebRTCPeerConnectionImpl::~LLWebRTCPeerConnectionImpl()
{
mSignalingObserverList.clear();
mDataObserverList.clear();
+ if (mPendingJobs > 0)
+ {
+ RTC_LOG(LS_ERROR) << __FUNCTION__ << "Destroying a connection that has " << std::to_string(mPendingJobs) << " unfinished jobs that might cause workers to crash";
+ }
}
//
@@ -726,9 +845,11 @@ void LLWebRTCPeerConnectionImpl::init(LLWebRTCImpl * webrtc_impl)
mWebRTCImpl = webrtc_impl;
mPeerConnectionFactory = mWebRTCImpl->getPeerConnectionFactory();
}
+
void LLWebRTCPeerConnectionImpl::terminate()
{
- mWebRTCImpl->SignalingBlockingCall(
+ mPendingJobs++;
+ mWebRTCImpl->PostSignalingTask(
[this]()
{
if (mPeerConnection)
@@ -741,6 +862,18 @@ void LLWebRTCPeerConnectionImpl::terminate()
}
}
+ // to remove 'Secondlife is recording' icon from taskbar
+ // if user was speaking
+ auto senders = mPeerConnection->GetSenders();
+ for (auto& sender : senders)
+ {
+ auto track = sender->track();
+ if (track)
+ {
+ track->set_enabled(false);
+ }
+ }
+
mPeerConnection->Close();
if (mLocalStream)
{
@@ -758,7 +891,9 @@ void LLWebRTCPeerConnectionImpl::terminate()
observer->OnPeerConnectionClosed();
}
}
+ mPendingJobs--;
});
+ mPeerConnectionFactory.release();
}
void LLWebRTCPeerConnectionImpl::setSignalingObserver(LLWebRTCSignalingObserver *observer) { mSignalingObserverList.emplace_back(observer); }
@@ -779,6 +914,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti
RTC_DCHECK(!mPeerConnection);
mAnswerReceived = false;
+ mPendingJobs++;
mWebRTCImpl->PostSignalingTask(
[this,options]()
{
@@ -800,6 +936,13 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti
config.set_max_port(60100);
webrtc::PeerConnectionDependencies pc_dependencies(this);
+ if (mPeerConnectionFactory == nullptr)
+ {
+ RTC_LOG(LS_ERROR) << __FUNCTION__ << "Error creating peer connection, factory doesn't exist";
+ // Too early?
+ mPendingJobs--;
+ return;
+ }
auto error_or_peer_connection = mPeerConnectionFactory->CreatePeerConnectionOrError(config, std::move(pc_dependencies));
if (error_or_peer_connection.ok())
{
@@ -812,6 +955,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti
{
observer->OnRenegotiationNeeded();
}
+ mPendingJobs--;
return;
}
@@ -826,14 +970,15 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti
mDataChannel->RegisterObserver(this);
}
- cricket::AudioOptions audioOptions;
+ webrtc::AudioOptions audioOptions;
audioOptions.auto_gain_control = true;
audioOptions.echo_cancellation = true;
audioOptions.noise_suppression = true;
+ audioOptions.init_recording_on_send = false;
mLocalStream = mPeerConnectionFactory->CreateLocalMediaStream("SLStream");
- rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
+ webrtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
mPeerConnectionFactory->CreateAudioTrack("SLAudio", mPeerConnectionFactory->CreateAudioSource(audioOptions).get()));
audio_track->set_enabled(false);
mLocalStream->AddTrack(audio_track);
@@ -847,7 +992,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti
webrtc::RtpParameters params;
webrtc::RtpCodecParameters codecparam;
codecparam.name = "opus";
- codecparam.kind = cricket::MEDIA_TYPE_AUDIO;
+ codecparam.kind = webrtc::MediaType::AUDIO;
codecparam.clock_rate = 48000;
codecparam.num_channels = 2;
codecparam.parameters["stereo"] = "1";
@@ -862,7 +1007,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti
webrtc::RtpParameters params;
webrtc::RtpCodecParameters codecparam;
codecparam.name = "opus";
- codecparam.kind = cricket::MEDIA_TYPE_AUDIO;
+ codecparam.kind = webrtc::MediaType::AUDIO;
codecparam.clock_rate = 48000;
codecparam.num_channels = 2;
codecparam.parameters["stereo"] = "1";
@@ -873,6 +1018,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti
webrtc::PeerConnectionInterface::RTCOfferAnswerOptions offerOptions;
mPeerConnection->CreateOffer(this, offerOptions);
+ mPendingJobs--;
});
return true;
@@ -915,6 +1061,7 @@ void LLWebRTCPeerConnectionImpl::AnswerAvailable(const std::string &sdp)
{
RTC_LOG(LS_INFO) << __FUNCTION__ << " Remote SDP: " << sdp;
+ mPendingJobs++;
mWebRTCImpl->PostSignalingTask(
[this, sdp]()
{
@@ -922,8 +1069,9 @@ void LLWebRTCPeerConnectionImpl::AnswerAvailable(const std::string &sdp)
{
RTC_LOG(LS_INFO) << __FUNCTION__ << " " << mPeerConnection->peer_connection_state();
mPeerConnection->SetRemoteDescription(webrtc::CreateSessionDescription(webrtc::SdpType::kAnswer, sdp),
- rtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface>(this));
+ webrtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface>(this));
}
+ mPendingJobs--;
});
}
@@ -934,9 +1082,21 @@ void LLWebRTCPeerConnectionImpl::AnswerAvailable(const std::string &sdp)
void LLWebRTCPeerConnectionImpl::setMute(bool mute)
{
- mMute = mute;
+ EMicMuteState new_state = mute ? MUTE_MUTED : MUTE_UNMUTED;
+
+ // even if mute hasn't changed, we still need to update the mute
+ // state on the connections to handle cases where the 'Default' device
+ // has changed in the OS (unplugged headset, etc.) which messes
+ // with the mute state.
+
+ bool force_reset = mMute == MUTE_INITIAL && mute;
+ bool enable = !mute;
+ mMute = new_state;
+
+
+ mPendingJobs++;
mWebRTCImpl->PostSignalingTask(
- [this]()
+ [this, force_reset, enable]()
{
if (mPeerConnection)
{
@@ -948,20 +1108,39 @@ void LLWebRTCPeerConnectionImpl::setMute(bool mute)
auto track = sender->track();
if (track)
{
- track->set_enabled(!mMute);
+ if (force_reset)
+ {
+ // Force notify observers
+ // Was it disabled too early?
+ // Without this microphone icon in Win's taskbar will stay
+ track->set_enabled(true);
+ }
+ track->set_enabled(enable);
}
}
+ mPendingJobs--;
}
});
}
void LLWebRTCPeerConnectionImpl::resetMute()
{
- setMute(mMute);
+ switch(mMute)
+ {
+ case MUTE_MUTED:
+ setMute(true);
+ break;
+ case MUTE_UNMUTED:
+ setMute(false);
+ break;
+ default:
+ break;
+ }
}
void LLWebRTCPeerConnectionImpl::setReceiveVolume(float volume)
{
+ mPendingJobs++;
mWebRTCImpl->PostSignalingTask(
[this, volume]()
{
@@ -980,11 +1159,13 @@ void LLWebRTCPeerConnectionImpl::setReceiveVolume(float volume)
}
}
}
+ mPendingJobs--;
});
}
void LLWebRTCPeerConnectionImpl::setSendVolume(float volume)
{
+ mPendingJobs++;
mWebRTCImpl->PostSignalingTask(
[this, volume]()
{
@@ -995,6 +1176,7 @@ void LLWebRTCPeerConnectionImpl::setSendVolume(float volume)
track->GetSource()->SetVolume(volume*5.0);
}
}
+ mPendingJobs--;
});
}
@@ -1002,14 +1184,14 @@ void LLWebRTCPeerConnectionImpl::setSendVolume(float volume)
// PeerConnectionObserver implementation.
//
-void LLWebRTCPeerConnectionImpl::OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
- const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> &streams)
+void LLWebRTCPeerConnectionImpl::OnAddTrack(webrtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
+ const std::vector<webrtc::scoped_refptr<webrtc::MediaStreamInterface>> &streams)
{
RTC_LOG(LS_INFO) << __FUNCTION__ << " " << receiver->id();
webrtc::RtpParameters params;
webrtc::RtpCodecParameters codecparam;
codecparam.name = "opus";
- codecparam.kind = cricket::MEDIA_TYPE_AUDIO;
+ codecparam.kind = webrtc::MediaType::AUDIO;
codecparam.clock_rate = 48000;
codecparam.num_channels = 2;
codecparam.parameters["stereo"] = "1";
@@ -1018,12 +1200,12 @@ void LLWebRTCPeerConnectionImpl::OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiv
receiver->SetParameters(params);
}
-void LLWebRTCPeerConnectionImpl::OnRemoveTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver)
+void LLWebRTCPeerConnectionImpl::OnRemoveTrack(webrtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver)
{
RTC_LOG(LS_INFO) << __FUNCTION__ << " " << receiver->id();
}
-void LLWebRTCPeerConnectionImpl::OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface> channel)
+void LLWebRTCPeerConnectionImpl::OnDataChannel(webrtc::scoped_refptr<webrtc::DataChannelInterface> channel)
{
if (mDataChannel)
{
@@ -1071,11 +1253,13 @@ void LLWebRTCPeerConnectionImpl::OnConnectionChange(webrtc::PeerConnectionInterf
{
case webrtc::PeerConnectionInterface::PeerConnectionState::kConnected:
{
+ mPendingJobs++;
mWebRTCImpl->PostWorkerTask([this]() {
for (auto &observer : mSignalingObserverList)
{
observer->OnAudioEstablished(this);
}
+ mPendingJobs--;
});
break;
}
@@ -1110,23 +1294,23 @@ static std::string iceCandidateToTrickleString(const webrtc::IceCandidateInterfa
candidate->candidate().address().ipaddr().ToString() << " " <<
candidate->candidate().address().PortAsString() << " typ ";
- if (candidate->candidate().type() == cricket::LOCAL_PORT_TYPE)
+ if (candidate->candidate().type() == webrtc::IceCandidateType::kHost)
{
candidate_stream << "host";
}
- else if (candidate->candidate().type() == cricket::STUN_PORT_TYPE)
+ else if (candidate->candidate().type() == webrtc::IceCandidateType::kSrflx)
{
candidate_stream << "srflx " <<
"raddr " << candidate->candidate().related_address().ipaddr().ToString() << " " <<
"rport " << candidate->candidate().related_address().PortAsString();
}
- else if (candidate->candidate().type() == cricket::RELAY_PORT_TYPE)
+ else if (candidate->candidate().type() == webrtc::IceCandidateType::kRelay)
{
candidate_stream << "relay " <<
"raddr " << candidate->candidate().related_address().ipaddr().ToString() << " " <<
"rport " << candidate->candidate().related_address().PortAsString();
}
- else if (candidate->candidate().type() == cricket::PRFLX_PORT_TYPE)
+ else if (candidate->candidate().type() == webrtc::IceCandidateType::kPrflx)
{
candidate_stream << "prflx " <<
"raddr " << candidate->candidate().related_address().ipaddr().ToString() << " " <<
@@ -1221,7 +1405,7 @@ void LLWebRTCPeerConnectionImpl::OnSuccess(webrtc::SessionDescriptionInterface *
mPeerConnection->SetLocalDescription(std::unique_ptr<webrtc::SessionDescriptionInterface>(
webrtc::CreateSessionDescription(webrtc::SdpType::kOffer, mangled_sdp)),
- rtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface>(this));
+ webrtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface>(this));
}
@@ -1331,13 +1515,15 @@ void LLWebRTCPeerConnectionImpl::sendData(const std::string& data, bool binary)
{
if (mDataChannel)
{
- rtc::CopyOnWriteBuffer cowBuffer(data.data(), data.length());
+ webrtc::CopyOnWriteBuffer cowBuffer(data.data(), data.length());
webrtc::DataBuffer buffer(cowBuffer, binary);
+ mPendingJobs++;
mWebRTCImpl->PostNetworkTask([this, buffer]() {
if (mDataChannel)
{
mDataChannel->Send(buffer);
}
+ mPendingJobs--;
});
}
}
@@ -1376,6 +1562,10 @@ void freePeerConnection(LLWebRTCPeerConnectionInterface* peer_connection)
void init(LLWebRTCLogCallback* logCallback)
{
+ if (gWebRTCImpl)
+ {
+ return;
+ }
gWebRTCImpl = new LLWebRTCImpl(logCallback);
gWebRTCImpl->init();
}
@@ -1385,6 +1575,7 @@ void terminate()
if (gWebRTCImpl)
{
gWebRTCImpl->terminate();
+ delete gWebRTCImpl;
gWebRTCImpl = nullptr;
}
}
diff --git a/indra/llwebrtc/llwebrtc.h b/indra/llwebrtc/llwebrtc.h
index c6fdb909dd..7d06b7d2b4 100644
--- a/indra/llwebrtc/llwebrtc.h
+++ b/indra/llwebrtc/llwebrtc.h
@@ -159,7 +159,10 @@ class LLWebRTCDeviceInterface
virtual void setTuningMode(bool enable) = 0;
virtual float getTuningAudioLevel() = 0; // for use during tuning
virtual float getPeerConnectionAudioLevel() = 0; // for use when not tuning
- virtual void setPeerConnectionGain(float gain) = 0;
+ virtual void setMicGain(float gain) = 0;
+ virtual void setTuningMicGain(float gain) = 0;
+
+ virtual void setMute(bool mute, int delay_ms = 0) = 0;
};
// LLWebRTCAudioInterface provides the viewer with a way
diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h
index 99accb2c20..9d3af985ef 100644
--- a/indra/llwebrtc/llwebrtc_impl.h
+++ b/indra/llwebrtc/llwebrtc_impl.h
@@ -54,12 +54,12 @@
#include "rtc_base/ref_counted_object.h"
#include "rtc_base/ssl_adapter.h"
#include "rtc_base/thread.h"
+#include "rtc_base/logging.h"
#include "api/peer_connection_interface.h"
#include "api/media_stream_interface.h"
#include "api/create_peerconnection_factory.h"
#include "modules/audio_device/include/audio_device.h"
#include "modules/audio_device/include/audio_device_data_observer.h"
-#include "rtc_base/task_queue.h"
#include "api/task_queue/task_queue_factory.h"
#include "api/task_queue/default_task_queue_factory.h"
#include "modules/audio_device/include/audio_device_defines.h"
@@ -69,35 +69,30 @@ namespace llwebrtc
class LLWebRTCPeerConnectionImpl;
-class LLWebRTCLogSink : public rtc::LogSink {
+class LLWebRTCLogSink : public webrtc::LogSink
+{
public:
- LLWebRTCLogSink(LLWebRTCLogCallback* callback) :
- mCallback(callback)
- {
- }
+ LLWebRTCLogSink(LLWebRTCLogCallback* callback) : mCallback(callback) {}
// Destructor: close the log file
- ~LLWebRTCLogSink() override
- {
- }
+ ~LLWebRTCLogSink() override { mCallback = nullptr; }
- void OnLogMessage(const std::string& msg,
- rtc::LoggingSeverity severity) override
+ void OnLogMessage(const std::string& msg, webrtc::LoggingSeverity severity) override
{
if (mCallback)
{
- switch(severity)
+ switch (severity)
{
- case rtc::LS_VERBOSE:
+ case webrtc::LS_VERBOSE:
mCallback->LogMessage(LLWebRTCLogCallback::LOG_LEVEL_VERBOSE, msg);
break;
- case rtc::LS_INFO:
+ case webrtc::LS_INFO:
mCallback->LogMessage(LLWebRTCLogCallback::LOG_LEVEL_VERBOSE, msg);
break;
- case rtc::LS_WARNING:
+ case webrtc::LS_WARNING:
mCallback->LogMessage(LLWebRTCLogCallback::LOG_LEVEL_VERBOSE, msg);
break;
- case rtc::LS_ERROR:
+ case webrtc::LS_ERROR:
mCallback->LogMessage(LLWebRTCLogCallback::LOG_LEVEL_VERBOSE, msg);
break;
default:
@@ -118,67 +113,305 @@ private:
LLWebRTCLogCallback* mCallback;
};
-// Implements a class allowing capture of audio data
-// to determine audio level of the microphone.
-class LLAudioDeviceObserver : public webrtc::AudioDeviceDataObserver
+// -----------------------------------------------------------------------------
+// A proxy transport that forwards capture data to two AudioTransport sinks:
+// - the "engine" (libwebrtc's VoiceEngine)
+// - the "user" (your app's listener)
+//
+// Playout (NeedMorePlayData) goes only to the engine by default to avoid
+// double-writing into the output buffer. See notes below if you want a tap.
+// -----------------------------------------------------------------------------
+class LLWebRTCAudioTransport : public webrtc::AudioTransport
{
- public:
- LLAudioDeviceObserver();
-
- // Retrieve the RMS audio loudness
- float getMicrophoneEnergy();
-
- // Data retrieved from the caputure device is
- // passed in here for processing.
- void OnCaptureData(const void *audio_samples,
- const size_t num_samples,
- const size_t bytes_per_sample,
- const size_t num_channels,
- const uint32_t samples_per_sec) override;
-
- // This is for data destined for the render device.
- // not currently used.
- void OnRenderData(const void *audio_samples,
- const size_t num_samples,
- const size_t bytes_per_sample,
- const size_t num_channels,
- const uint32_t samples_per_sec) override;
+public:
+ LLWebRTCAudioTransport();
+
+ void SetEngineTransport(webrtc::AudioTransport* t);
+
+ // -------- Capture path: fan out to both sinks --------
+ int32_t RecordedDataIsAvailable(const void* audio_data,
+ size_t number_of_samples,
+ size_t bytes_per_sample,
+ size_t number_of_channels,
+ uint32_t samples_per_sec,
+ uint32_t total_delay_ms,
+ int32_t clock_drift,
+ uint32_t current_mic_level,
+ bool key_pressed,
+ uint32_t& new_mic_level) override;
+
+ // -------- Playout path: delegate to engine only --------
+ int32_t NeedMorePlayData(size_t number_of_samples,
+ size_t bytes_per_sample,
+ size_t number_of_channels,
+ uint32_t samples_per_sec,
+ void* audio_data,
+ size_t& number_of_samples_out,
+ int64_t* elapsed_time_ms,
+ int64_t* ntp_time_ms) override;
+
+ // Method to pull mixed render audio data from all active VoE channels.
+ // The data will not be passed as reference for audio processing internally.
+ void PullRenderData(int bits_per_sample,
+ int sample_rate,
+ size_t number_of_channels,
+ size_t number_of_frames,
+ void* audio_data,
+ int64_t* elapsed_time_ms,
+ int64_t* ntp_time_ms) override;
+
+ float GetMicrophoneEnergy() { return mMicrophoneEnergy.load(std::memory_order_relaxed); }
+ void SetGain(float gain) { mGain.store(gain, std::memory_order_relaxed); }
+
+private:
+ std::atomic<webrtc::AudioTransport*> engine_{ nullptr };
+ static const int NUM_PACKETS_TO_FILTER = 30; // 300 ms of smoothing (30 frames)
+ float mSumVector[NUM_PACKETS_TO_FILTER];
+ std::atomic<float> mMicrophoneEnergy;
+ std::atomic<float> mGain{ 0.0f };
- protected:
- static const int NUM_PACKETS_TO_FILTER = 30; // 300 ms of smoothing (30 frames)
- float mSumVector[NUM_PACKETS_TO_FILTER];
- float mMicrophoneEnergy;
};
+
+// -----------------------------------------------------------------------------
+// LLWebRTCAudioDeviceModule
+// - Wraps a real ADM to provide microphone energy for tuning
+// -----------------------------------------------------------------------------
+class LLWebRTCAudioDeviceModule : public webrtc::AudioDeviceModule
+{
+public:
+ explicit LLWebRTCAudioDeviceModule(webrtc::scoped_refptr<webrtc::AudioDeviceModule> inner) : inner_(std::move(inner)), tuning_(false)
+ {
+ RTC_CHECK(inner_);
+ }
+
+ // ----- AudioDeviceModule interface: we mostly forward to |inner_| -----
+ int32_t ActiveAudioLayer(AudioLayer* audioLayer) const override { return inner_->ActiveAudioLayer(audioLayer); }
+
+ int32_t RegisterAudioCallback(webrtc::AudioTransport* engine_transport) override
+ {
+ // The engine registers its transport here. We put our audio transport between engine and ADM.
+ audio_transport_.SetEngineTransport(engine_transport);
+ // Register our proxy with the real ADM.
+ return inner_->RegisterAudioCallback(&audio_transport_);
+ }
+
+ int32_t Init() override { return inner_->Init(); }
+ int32_t Terminate() override { return inner_->Terminate(); }
+ bool Initialized() const override { return inner_->Initialized(); }
+
+ // --- Device enumeration/selection (forward) ---
+ int16_t PlayoutDevices() override { return inner_->PlayoutDevices(); }
+ int16_t RecordingDevices() override { return inner_->RecordingDevices(); }
+ int32_t PlayoutDeviceName(uint16_t index, char name[webrtc::kAdmMaxDeviceNameSize], char guid[webrtc::kAdmMaxGuidSize]) override
+ {
+ return inner_->PlayoutDeviceName(index, name, guid);
+ }
+ int32_t RecordingDeviceName(uint16_t index, char name[webrtc::kAdmMaxDeviceNameSize], char guid[webrtc::kAdmMaxGuidSize]) override
+ {
+ return inner_->RecordingDeviceName(index, name, guid);
+ }
+ int32_t SetPlayoutDevice(uint16_t index) override { return inner_->SetPlayoutDevice(index); }
+ int32_t SetRecordingDevice(uint16_t index) override { return inner_->SetRecordingDevice(index); }
+
+ // Windows default/communications selectors, if your branch exposes them:
+ int32_t SetPlayoutDevice(WindowsDeviceType type) override { return inner_->SetPlayoutDevice(type); }
+ int32_t SetRecordingDevice(WindowsDeviceType type) override { return inner_->SetRecordingDevice(type); }
+
+ // --- Init/start/stop (forward) ---
+ int32_t InitPlayout() override { return inner_->InitPlayout(); }
+ bool PlayoutIsInitialized() const override { return inner_->PlayoutIsInitialized(); }
+ int32_t StartPlayout() override {
+ if (tuning_) return 0; // For tuning, don't allow playout
+ return inner_->StartPlayout();
+ }
+ int32_t StopPlayout() override { return inner_->StopPlayout(); }
+ bool Playing() const override { return inner_->Playing(); }
+
+ int32_t InitRecording() override { return inner_->InitRecording(); }
+ bool RecordingIsInitialized() const override { return inner_->RecordingIsInitialized(); }
+ int32_t StartRecording() override {
+ // ignore start recording as webrtc.lib will
+ // send one when streams first connect, resulting
+ // in an inadvertant 'recording' when mute is on.
+ // We take full control of StartRecording via
+ // ForceStartRecording below.
+ return 0;
+ }
+ int32_t StopRecording() override {
+ // ignore stop recording as webrtc.lib will send one when streams shut down,
+ // even if there are other streams in place. Start/Stop recording are entirely
+ // controlled by the app
+ return 0;
+ }
+ int32_t ForceStartRecording() { return inner_->StartRecording(); }
+ int32_t ForceStopRecording() { return inner_->StopRecording(); }
+ bool Recording() const override { return inner_->Recording(); }
+
+ // --- Stereo opts (forward if available on your branch) ---
+ int32_t SetStereoPlayout(bool enable) override { return inner_->SetStereoPlayout(enable); }
+ int32_t SetStereoRecording(bool enable) override { return inner_->SetStereoRecording(enable); }
+ int32_t PlayoutIsAvailable(bool* available) override { return inner_->PlayoutIsAvailable(available); }
+ int32_t RecordingIsAvailable(bool* available) override { return inner_->RecordingIsAvailable(available); }
+
+ // --- AGC/Volume/Mute/etc. (forward) ---
+ int32_t SetMicrophoneVolume(uint32_t volume) override { return inner_->SetMicrophoneVolume(volume); }
+ int32_t MicrophoneVolume(uint32_t* volume) const override { return inner_->MicrophoneVolume(volume); }
+
+ // --- Speaker/Microphone init (forward) ---
+ int32_t InitSpeaker() override { return inner_->InitSpeaker(); }
+ bool SpeakerIsInitialized() const override { return inner_->SpeakerIsInitialized(); }
+ int32_t InitMicrophone() override { return inner_->InitMicrophone(); }
+ bool MicrophoneIsInitialized() const override { return inner_->MicrophoneIsInitialized(); }
+
+ // --- Speaker Volume (forward) ---
+ int32_t SpeakerVolumeIsAvailable(bool* available) override { return inner_->SpeakerVolumeIsAvailable(available); }
+ int32_t SetSpeakerVolume(uint32_t volume) override { return inner_->SetSpeakerVolume(volume); }
+ int32_t SpeakerVolume(uint32_t* volume) const override { return inner_->SpeakerVolume(volume); }
+ int32_t MaxSpeakerVolume(uint32_t* maxVolume) const override { return inner_->MaxSpeakerVolume(maxVolume); }
+ int32_t MinSpeakerVolume(uint32_t* minVolume) const override { return inner_->MinSpeakerVolume(minVolume); }
+
+ // --- Microphone Volume (forward) ---
+ int32_t MicrophoneVolumeIsAvailable(bool* available) override { return inner_->MicrophoneVolumeIsAvailable(available); }
+ int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const override { return inner_->MaxMicrophoneVolume(maxVolume); }
+ int32_t MinMicrophoneVolume(uint32_t* minVolume) const override { return inner_->MinMicrophoneVolume(minVolume); }
+
+ // --- Speaker Mute (forward) ---
+ int32_t SpeakerMuteIsAvailable(bool* available) override { return inner_->SpeakerMuteIsAvailable(available); }
+ int32_t SetSpeakerMute(bool enable) override { return inner_->SetSpeakerMute(enable); }
+ int32_t SpeakerMute(bool* enabled) const override { return inner_->SpeakerMute(enabled); }
+
+ // --- Microphone Mute (forward) ---
+ int32_t MicrophoneMuteIsAvailable(bool* available) override { return inner_->MicrophoneMuteIsAvailable(available); }
+ int32_t SetMicrophoneMute(bool enable) override { return inner_->SetMicrophoneMute(enable); }
+ int32_t MicrophoneMute(bool* enabled) const override { return inner_->MicrophoneMute(enabled); }
+
+ // --- Stereo Support (forward) ---
+ int32_t StereoPlayoutIsAvailable(bool* available) const override { return inner_->StereoPlayoutIsAvailable(available); }
+ int32_t StereoPlayout(bool* enabled) const override { return inner_->StereoPlayout(enabled); }
+ int32_t StereoRecordingIsAvailable(bool* available) const override { return inner_->StereoRecordingIsAvailable(available); }
+ int32_t StereoRecording(bool* enabled) const override { return inner_->StereoRecording(enabled); }
+
+ // --- Delay/Timing (forward) ---
+ int32_t PlayoutDelay(uint16_t* delayMS) const override { return inner_->PlayoutDelay(delayMS); }
+
+ // --- Built-in Audio Processing (forward) ---
+ bool BuiltInAECIsAvailable() const override { return inner_->BuiltInAECIsAvailable(); }
+ bool BuiltInAGCIsAvailable() const override { return inner_->BuiltInAGCIsAvailable(); }
+ bool BuiltInNSIsAvailable() const override { return inner_->BuiltInNSIsAvailable(); }
+ int32_t EnableBuiltInAEC(bool enable) override { return inner_->EnableBuiltInAEC(enable); }
+ int32_t EnableBuiltInAGC(bool enable) override { return inner_->EnableBuiltInAGC(enable); }
+ int32_t EnableBuiltInNS(bool enable) override { return inner_->EnableBuiltInNS(enable); }
+
+ // --- Additional AudioDeviceModule methods (forward) ---
+ int32_t GetPlayoutUnderrunCount() const override { return inner_->GetPlayoutUnderrunCount(); }
+
+ // Used to generate RTC stats. If not implemented, RTCAudioPlayoutStats will
+ // not be present in the stats.
+ std::optional<Stats> GetStats() const override { return inner_->GetStats(); }
+
+// Only supported on iOS.
+#if defined(WEBRTC_IOS)
+ virtual int GetPlayoutAudioParameters(AudioParameters* params) const override { return inner_->GetPlayoutAudioParameters(params); }
+ virtual int GetRecordAudioParameters(AudioParameters* params) override { return inner_->GetRecordAudioParameters(params); }
+#endif // WEBRTC_IOS
+
+#if !CM_WEBRTC
+ virtual int32_t GetPlayoutDevice() const override { return inner_->GetPlayoutDevice(); }
+ virtual int32_t GetRecordingDevice() const override { return inner_->GetRecordingDevice(); }
+ virtual int32_t SetObserver(webrtc::AudioDeviceObserver* observer) override { return inner_->SetObserver(observer); }
+#endif
+
+ // tuning microphone energy calculations
+ float GetMicrophoneEnergy() { return audio_transport_.GetMicrophoneEnergy(); }
+ void SetTuningMicGain(float gain) { audio_transport_.SetGain(gain); }
+ void SetTuning(bool tuning, bool mute)
+ {
+ tuning_ = tuning;
+ if (tuning)
+ {
+ inner_->InitRecording();
+ inner_->StartRecording();
+ inner_->StopPlayout();
+ }
+ else
+ {
+ if (mute)
+ {
+ inner_->StopRecording();
+ }
+ else
+ {
+ inner_->InitRecording();
+ inner_->StartRecording();
+ }
+ inner_->StartPlayout();
+ }
+ }
+
+protected:
+ ~LLWebRTCAudioDeviceModule() override = default;
+
+private:
+ webrtc::scoped_refptr<webrtc::AudioDeviceModule> inner_;
+ LLWebRTCAudioTransport audio_transport_;
+
+ bool tuning_;
+};
+
+class LLCustomProcessorState
+{
+
+public:
+ float getMicrophoneEnergy() { return mMicrophoneEnergy.load(std::memory_order_relaxed); }
+ void setMicrophoneEnergy(float energy) { mMicrophoneEnergy.store(energy, std::memory_order_relaxed); }
+
+ void setGain(float gain)
+ {
+ mGain.store(gain, std::memory_order_relaxed);
+ mDirty.store(true, std::memory_order_relaxed);
+ }
+
+ float getGain() { return mGain.load(std::memory_order_relaxed); }
+
+ bool getDirty() { return mDirty.exchange(false, std::memory_order_relaxed); }
+
+ protected:
+ std::atomic<bool> mDirty{ true };
+ std::atomic<float> mMicrophoneEnergy{ 0.0f };
+ std::atomic<float> mGain{ 0.0f };
+};
+
+using LLCustomProcessorStatePtr = std::shared_ptr<LLCustomProcessorState>;
+
// Used to process/retrieve audio levels after
// all of the processing (AGC, AEC, etc.) for display in-world to the user.
class LLCustomProcessor : public webrtc::CustomProcessing
{
- public:
- LLCustomProcessor();
+public:
+ LLCustomProcessor(LLCustomProcessorStatePtr state);
~LLCustomProcessor() override {}
// (Re-) Initializes the submodule.
void Initialize(int sample_rate_hz, int num_channels) override;
// Analyzes the given capture or render signal.
- void Process(webrtc::AudioBuffer *audio) override;
+ void Process(webrtc::AudioBuffer* audio) override;
// Returns a string representation of the module state.
std::string ToString() const override { return ""; }
- float getMicrophoneEnergy() { return mMicrophoneEnergy; }
-
- void setGain(float gain) { mGain = gain; }
-
- protected:
- static const int NUM_PACKETS_TO_FILTER = 30; // 300 ms of smoothing
- int mSampleRateHz;
- int mNumChannels;
+protected:
+ static const int NUM_PACKETS_TO_FILTER = 30; // 300 ms of smoothing
+ int mSampleRateHz{ 48000 };
+ int mNumChannels{ 2 };
+ int mRampFrames{ 2 };
+ float mCurrentGain{ 0.0f };
+ float mGainStep{ 0.0f };
float mSumVector[NUM_PACKETS_TO_FILTER];
- float mMicrophoneEnergy;
- float mGain;
+ friend LLCustomProcessorState;
+ LLCustomProcessorStatePtr mState;
};
@@ -187,7 +420,7 @@ class LLCustomProcessor : public webrtc::CustomProcessing
#if CM_WEBRTC
class LLWebRTCImpl : public LLWebRTCDeviceInterface
#else
-class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceSink
+class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceObserver
#endif
{
public:
@@ -195,6 +428,9 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS
~LLWebRTCImpl()
{
delete mLogSink;
+
+ // Explicit cleanup for the sake of debugging and crash stacks
+ mPeerCustomProcessor = nullptr;
}
void init();
@@ -218,10 +454,15 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS
float getTuningAudioLevel() override;
float getPeerConnectionAudioLevel() override;
- void setPeerConnectionGain(float gain) override;
+ void setMicGain(float gain) override;
+ void setTuningMicGain(float gain) override;
+
+ void setMute(bool mute, int delay_ms = 20) override;
+
+ void intSetMute(bool mute, int delay_ms = 20);
//
- // AudioDeviceSink
+ // AudioDeviceObserver
//
#if CM_WEBRTC
void OnDevicesUpdated();
@@ -254,19 +495,19 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS
mNetworkThread->PostTask(std::move(task), location);
}
- void WorkerBlockingCall(rtc::FunctionView<void()> functor,
+ void WorkerBlockingCall(webrtc::FunctionView<void()> functor,
const webrtc::Location& location = webrtc::Location::Current())
{
mWorkerThread->BlockingCall(std::move(functor), location);
}
- void SignalingBlockingCall(rtc::FunctionView<void()> functor,
+ void SignalingBlockingCall(webrtc::FunctionView<void()> functor,
const webrtc::Location& location = webrtc::Location::Current())
{
mSignalingThread->BlockingCall(std::move(functor), location);
}
- void NetworkBlockingCall(rtc::FunctionView<void()> functor,
+ void NetworkBlockingCall(webrtc::FunctionView<void()> functor,
const webrtc::Location& location = webrtc::Location::Current())
{
mNetworkThread->BlockingCall(std::move(functor), location);
@@ -274,7 +515,7 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS
// Allows the LLWebRTCPeerConnectionImpl class to retrieve the
// native webrtc PeerConnectionFactory.
- rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> getPeerConnectionFactory()
+ webrtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> getPeerConnectionFactory()
{
return mPeerConnectionFactory;
}
@@ -283,49 +524,47 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS
LLWebRTCPeerConnectionInterface* newPeerConnection();
void freePeerConnection(LLWebRTCPeerConnectionInterface* peer_connection);
- // enables/disables capture via the capture device
- void setRecording(bool recording);
-
- void setPlayout(bool playing);
-
protected:
+
+ void workerDeployDevices();
LLWebRTCLogSink* mLogSink;
// The native webrtc threads
- std::unique_ptr<rtc::Thread> mNetworkThread;
- std::unique_ptr<rtc::Thread> mWorkerThread;
- std::unique_ptr<rtc::Thread> mSignalingThread;
+ std::unique_ptr<webrtc::Thread> mNetworkThread;
+ std::unique_ptr<webrtc::Thread> mWorkerThread;
+ std::unique_ptr<webrtc::Thread> mSignalingThread;
// The factory that allows creation of native webrtc PeerConnections.
- rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> mPeerConnectionFactory;
+ webrtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> mPeerConnectionFactory;
- rtc::scoped_refptr<webrtc::AudioProcessing> mAudioProcessingModule;
+ webrtc::scoped_refptr<webrtc::AudioProcessing> mAudioProcessingModule;
// more native webrtc stuff
- std::unique_ptr<webrtc::TaskQueueFactory> mTaskQueueFactory;
+ std::unique_ptr<webrtc::TaskQueueFactory> mTaskQueueFactory;
// Devices
void updateDevices();
- rtc::scoped_refptr<webrtc::AudioDeviceModule> mTuningDeviceModule;
- rtc::scoped_refptr<webrtc::AudioDeviceModule> mPeerDeviceModule;
+ void deployDevices();
+ std::atomic<int> mDevicesDeploying;
+ webrtc::scoped_refptr<LLWebRTCAudioDeviceModule> mDeviceModule;
std::vector<LLWebRTCDevicesObserver *> mVoiceDevicesObserverList;
// accessors in native webrtc for devices aren't apparently implemented yet.
bool mTuningMode;
- int32_t mRecordingDevice;
+ std::string mRecordingDevice;
LLWebRTCVoiceDeviceList mRecordingDeviceList;
- int32_t mPlayoutDevice;
+ std::string mPlayoutDevice;
LLWebRTCVoiceDeviceList mPlayoutDeviceList;
bool mMute;
+ float mGain;
- LLAudioDeviceObserver * mTuningAudioDeviceObserver;
- LLCustomProcessor * mPeerCustomProcessor;
+ LLCustomProcessorStatePtr mPeerCustomProcessor;
// peer connections
- std::vector<rtc::scoped_refptr<LLWebRTCPeerConnectionImpl>> mPeerConnections;
+ std::vector<webrtc::scoped_refptr<LLWebRTCPeerConnectionImpl>> mPeerConnections;
};
@@ -350,7 +589,7 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface,
void terminate();
virtual void AddRef() const override = 0;
- virtual rtc::RefCountReleaseStatus Release() const override = 0;
+ virtual webrtc::RefCountReleaseStatus Release() const override = 0;
//
// LLWebRTCPeerConnection
@@ -381,10 +620,10 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface,
//
void OnSignalingChange(webrtc::PeerConnectionInterface::SignalingState new_state) override {}
- void OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
- const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> &streams) override;
- void OnRemoveTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver) override;
- void OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface> channel) override;
+ void OnAddTrack(webrtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
+ const std::vector<webrtc::scoped_refptr<webrtc::MediaStreamInterface>> &streams) override;
+ void OnRemoveTrack(webrtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver) override;
+ void OnDataChannel(webrtc::scoped_refptr<webrtc::DataChannelInterface> channel) override;
void OnRenegotiationNeeded() override {}
void OnIceConnectionChange(webrtc::PeerConnectionInterface::IceConnectionState new_state) override {};
void OnIceGatheringChange(webrtc::PeerConnectionInterface::IceGatheringState new_state) override;
@@ -423,21 +662,28 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface,
LLWebRTCImpl * mWebRTCImpl;
- rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> mPeerConnectionFactory;
+ webrtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> mPeerConnectionFactory;
- bool mMute;
+ typedef enum {
+ MUTE_INITIAL,
+ MUTE_MUTED,
+ MUTE_UNMUTED,
+ } EMicMuteState;
+ EMicMuteState mMute;
// signaling
std::vector<LLWebRTCSignalingObserver *> mSignalingObserverList;
std::vector<std::unique_ptr<webrtc::IceCandidateInterface>> mCachedIceCandidates;
bool mAnswerReceived;
- rtc::scoped_refptr<webrtc::PeerConnectionInterface> mPeerConnection;
- rtc::scoped_refptr<webrtc::MediaStreamInterface> mLocalStream;
+ webrtc::scoped_refptr<webrtc::PeerConnectionInterface> mPeerConnection;
+ webrtc::scoped_refptr<webrtc::MediaStreamInterface> mLocalStream;
// data
std::vector<LLWebRTCDataObserver *> mDataObserverList;
- rtc::scoped_refptr<webrtc::DataChannelInterface> mDataChannel;
+ webrtc::scoped_refptr<webrtc::DataChannelInterface> mDataChannel;
+
+ std::atomic<int> mPendingJobs;
};
}
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index d139a3373e..69f11991ea 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -55,6 +55,7 @@ set(llwindow_LINK_LIBRARIES
llfilesystem
llxml
ll::glm
+ ll::glext
ll::uilibraries
ll::SDL
)
@@ -63,7 +64,7 @@ include_directories(${CMAKE_SOURCE_DIR}/llrender)
# Libraries on which this library depends, needed for Linux builds
# Sort by high-level to low-level
-if (NOT DARWIN)
+if (NOT (DARWIN OR WINDOWS))
list(APPEND viewer_SOURCE_FILES
llkeyboardsdl.cpp
llwindowsdl.cpp
@@ -107,7 +108,7 @@ if (DARWIN)
llkeyboardmacosx.cpp
llwindowmacosx.cpp
PROPERTIES
- COMPILE_FLAGS "-Wno-deprecated-declarations -fpascal-strings"
+ COMPILE_FLAGS "-fpascal-strings"
)
endif (DARWIN)
@@ -182,8 +183,6 @@ endif (SDL_FOUND)
target_include_directories(llwindow INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
if (DARWIN)
- include(CMakeFindFrameworks)
- find_library(CARBON_LIBRARY Carbon)
target_link_libraries(llwindow ${CARBON_LIBRARY})
endif (DARWIN)
diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp
index 4bc069c5a4..ff85b2cb14 100644
--- a/indra/llwindow/lldxhardware.cpp
+++ b/indra/llwindow/lldxhardware.cpp
@@ -47,7 +47,6 @@
#include "llstl.h"
#include "lltimer.h"
-void (*gWriteDebug)(const char* msg) = NULL;
LLDXHardware gDXHardware;
//-----------------------------------------------------------------------------
@@ -61,170 +60,6 @@ typedef BOOL ( WINAPI* PfnCoSetProxyBlanket )( IUnknown* pProxy, DWORD dwAuthnSv
OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel,
RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities );
-HRESULT GetVideoMemoryViaWMI(WCHAR* strInputDeviceID, DWORD* pdwAdapterRam)
-{
- HRESULT hr;
- bool bGotMemory = false;
- IWbemLocator* pIWbemLocator = nullptr;
- IWbemServices* pIWbemServices = nullptr;
- BSTR pNamespace = nullptr;
-
- *pdwAdapterRam = 0;
- CoInitializeEx(0, COINIT_APARTMENTTHREADED);
-
- hr = CoCreateInstance( CLSID_WbemLocator,
- nullptr,
- CLSCTX_INPROC_SERVER,
- IID_IWbemLocator,
- ( LPVOID* )&pIWbemLocator );
-#ifdef PRINTF_DEBUGGING
- if( FAILED( hr ) ) wprintf( L"WMI: CoCreateInstance failed: 0x%0.8x\n", hr );
-#endif
-
- if( SUCCEEDED( hr ) && pIWbemLocator )
- {
- // Using the locator, connect to WMI in the given namespace.
- pNamespace = SysAllocString( L"\\\\.\\root\\cimv2" );
-
- hr = pIWbemLocator->ConnectServer( pNamespace, nullptr, nullptr, 0L,
- 0L, nullptr, nullptr, &pIWbemServices );
-#ifdef PRINTF_DEBUGGING
- if( FAILED( hr ) ) wprintf( L"WMI: pIWbemLocator->ConnectServer failed: 0x%0.8x\n", hr );
-#endif
- if( SUCCEEDED( hr ) && pIWbemServices != 0 )
- {
- HINSTANCE hinstOle32 = nullptr;
-
- hinstOle32 = LoadLibraryW( L"ole32.dll" );
- if( hinstOle32 )
- {
- PfnCoSetProxyBlanket pfnCoSetProxyBlanket = nullptr;
-
- pfnCoSetProxyBlanket = ( PfnCoSetProxyBlanket )GetProcAddress( hinstOle32, "CoSetProxyBlanket" );
- if( pfnCoSetProxyBlanket != 0 )
- {
- // Switch security level to IMPERSONATE.
- pfnCoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr,
- RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, 0 );
- }
-
- FreeLibrary( hinstOle32 );
- }
-
- IEnumWbemClassObject* pEnumVideoControllers = nullptr;
- BSTR pClassName = nullptr;
-
- pClassName = SysAllocString( L"Win32_VideoController" );
-
- hr = pIWbemServices->CreateInstanceEnum( pClassName, 0,
- nullptr, &pEnumVideoControllers );
-#ifdef PRINTF_DEBUGGING
- if( FAILED( hr ) ) wprintf( L"WMI: pIWbemServices->CreateInstanceEnum failed: 0x%0.8x\n", hr );
-#endif
-
- if( SUCCEEDED( hr ) && pEnumVideoControllers )
- {
- IWbemClassObject* pVideoControllers[10] = {0};
- DWORD uReturned = 0;
- BSTR pPropName = nullptr;
-
- // Get the first one in the list
- pEnumVideoControllers->Reset();
- hr = pEnumVideoControllers->Next( 5000, // timeout in 5 seconds
- 10, // return the first 10
- pVideoControllers,
- &uReturned );
-#ifdef PRINTF_DEBUGGING
- if( FAILED( hr ) ) wprintf( L"WMI: pEnumVideoControllers->Next failed: 0x%0.8x\n", hr );
- if( uReturned == 0 ) wprintf( L"WMI: pEnumVideoControllers uReturned == 0\n" );
-#endif
-
- VARIANT var;
- if( SUCCEEDED( hr ) )
- {
- bool bFound = false;
- for( UINT iController = 0; iController < uReturned; iController++ )
- {
- if ( !pVideoControllers[iController] )
- continue;
-
- // if strInputDeviceID is set find this specific device and return memory or specific device
- // if strInputDeviceID is not set return the best device
- if (strInputDeviceID)
- {
- pPropName = SysAllocString( L"PNPDeviceID" );
- hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
-#ifdef PRINTF_DEBUGGING
- if( FAILED( hr ) )
- wprintf( L"WMI: pVideoControllers[iController]->Get PNPDeviceID failed: 0x%0.8x\n", hr );
-#endif
- if( SUCCEEDED( hr ) && strInputDeviceID)
- {
- if( wcsstr( var.bstrVal, strInputDeviceID ) != 0 )
- bFound = true;
- }
- VariantClear( &var );
- if( pPropName ) SysFreeString( pPropName );
- }
-
- if( bFound || !strInputDeviceID )
- {
- pPropName = SysAllocString( L"AdapterRAM" );
- hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
-#ifdef PRINTF_DEBUGGING
- if( FAILED( hr ) )
- wprintf( L"WMI: pVideoControllers[iController]->Get AdapterRAM failed: 0x%0.8x\n",
- hr );
-#endif
- if( SUCCEEDED( hr ) )
- {
- bGotMemory = true;
- *pdwAdapterRam = llmax(var.ulVal, *pdwAdapterRam);
- }
- VariantClear( &var );
- if( pPropName ) SysFreeString( pPropName );
- }
-
- SAFE_RELEASE( pVideoControllers[iController] );
-
- if (bFound)
- {
- break;
- }
- }
- }
- }
-
- if( pClassName )
- SysFreeString( pClassName );
- SAFE_RELEASE( pEnumVideoControllers );
- }
-
- if( pNamespace )
- SysFreeString( pNamespace );
- SAFE_RELEASE( pIWbemServices );
- }
-
- SAFE_RELEASE( pIWbemLocator );
-
- CoUninitialize();
-
- if( bGotMemory )
- return S_OK;
- else
- return E_FAIL;
-}
-
-//static
-U32 LLDXHardware::getMBVideoMemoryViaWMI()
-{
- DWORD vram = 0;
- if (SUCCEEDED(GetVideoMemoryViaWMI(NULL, &vram)))
- {
- return vram / (1024 * 1024);;
- }
- return 0;
-}
//Getting the version of graphics controller driver via WMI
std::string LLDXHardware::getDriverVersionWMI(EGPUVendor vendor)
@@ -477,498 +312,17 @@ std::string get_string(IDxDiagContainer *containerp, const WCHAR *wszPropName)
WCHAR wszPropValue[256];
get_wstring(containerp, wszPropName, wszPropValue, 256);
- return utf16str_to_utf8str(wszPropValue);
-}
-
-
-LLVersion::LLVersion()
-{
- mValid = false;
- S32 i;
- for (i = 0; i < 4; i++)
- {
- mFields[i] = 0;
- }
-}
-
-bool LLVersion::set(const std::string &version_string)
-{
- S32 i;
- for (i = 0; i < 4; i++)
- {
- mFields[i] = 0;
- }
- // Split the version string.
- std::string str(version_string);
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(".", "", boost::keep_empty_tokens);
- tokenizer tokens(str, sep);
-
- tokenizer::iterator iter = tokens.begin();
- S32 count = 0;
- for (;(iter != tokens.end()) && (count < 4);++iter)
- {
- mFields[count] = atoi(iter->c_str());
- count++;
- }
- if (count < 4)
- {
- //LL_WARNS() << "Potentially bogus version string!" << version_string << LL_ENDL;
- for (i = 0; i < 4; i++)
- {
- mFields[i] = 0;
- }
- mValid = false;
- }
- else
- {
- mValid = true;
- }
- return mValid;
-}
-
-S32 LLVersion::getField(const S32 field_num)
-{
- if (!mValid)
- {
- return -1;
- }
- else
- {
- return mFields[field_num];
- }
-}
-
-std::string LLDXDriverFile::dump()
-{
- if (gWriteDebug)
- {
- gWriteDebug("Filename:");
- gWriteDebug(mName.c_str());
- gWriteDebug("\n");
- gWriteDebug("Ver:");
- gWriteDebug(mVersionString.c_str());
- gWriteDebug("\n");
- gWriteDebug("Date:");
- gWriteDebug(mDateString.c_str());
- gWriteDebug("\n");
- }
- LL_INFOS() << mFilepath << LL_ENDL;
- LL_INFOS() << mName << LL_ENDL;
- LL_INFOS() << mVersionString << LL_ENDL;
- LL_INFOS() << mDateString << LL_ENDL;
-
- return "";
-}
-
-LLDXDevice::~LLDXDevice()
-{
- for_each(mDriverFiles.begin(), mDriverFiles.end(), DeletePairedPointer());
- mDriverFiles.clear();
-}
-
-std::string LLDXDevice::dump()
-{
- if (gWriteDebug)
- {
- gWriteDebug("StartDevice\n");
- gWriteDebug("DeviceName:");
- gWriteDebug(mName.c_str());
- gWriteDebug("\n");
- gWriteDebug("PCIString:");
- gWriteDebug(mPCIString.c_str());
- gWriteDebug("\n");
- }
- LL_INFOS() << LL_ENDL;
- LL_INFOS() << "DeviceName:" << mName << LL_ENDL;
- LL_INFOS() << "PCIString:" << mPCIString << LL_ENDL;
- LL_INFOS() << "Drivers" << LL_ENDL;
- LL_INFOS() << "-------" << LL_ENDL;
- for (driver_file_map_t::iterator iter = mDriverFiles.begin(),
- end = mDriverFiles.end();
- iter != end; iter++)
- {
- LLDXDriverFile *filep = iter->second;
- filep->dump();
- }
- if (gWriteDebug)
- {
- gWriteDebug("EndDevice\n");
- }
-
- return "";
-}
-
-LLDXDriverFile *LLDXDevice::findDriver(const std::string &driver)
-{
- for (driver_file_map_t::iterator iter = mDriverFiles.begin(),
- end = mDriverFiles.end();
- iter != end; iter++)
- {
- LLDXDriverFile *filep = iter->second;
- if (!utf8str_compare_insensitive(filep->mName,driver))
- {
- return filep;
- }
- }
-
- return NULL;
+ return ll_convert<std::string>(std::wstring(wszPropValue));
}
LLDXHardware::LLDXHardware()
{
- mVRAM = 0;
- gWriteDebug = NULL;
}
void LLDXHardware::cleanup()
{
- // for_each(mDevices.begin(), mDevices.end(), DeletePairedPointer());
- // mDevices.clear();
-}
-
-/*
-std::string LLDXHardware::dumpDevices()
-{
- if (gWriteDebug)
- {
- gWriteDebug("\n");
- gWriteDebug("StartAllDevices\n");
- }
- for (device_map_t::iterator iter = mDevices.begin(),
- end = mDevices.end();
- iter != end; iter++)
- {
- LLDXDevice *devicep = iter->second;
- devicep->dump();
- }
- if (gWriteDebug)
- {
- gWriteDebug("EndAllDevices\n\n");
- }
- return "";
}
-LLDXDevice *LLDXHardware::findDevice(const std::string &vendor, const std::string &devices)
-{
- // Iterate through different devices tokenized in devices string
- std::string str(devices);
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
- tokenizer tokens(str, sep);
-
- tokenizer::iterator iter = tokens.begin();
- for (;iter != tokens.end();++iter)
- {
- std::string dev_str = *iter;
- for (device_map_t::iterator iter = mDevices.begin(),
- end = mDevices.end();
- iter != end; iter++)
- {
- LLDXDevice *devicep = iter->second;
- if ((devicep->mVendorID == vendor)
- && (devicep->mDeviceID == dev_str))
- {
- return devicep;
- }
- }
- }
-
- return NULL;
-}
-*/
-
-bool LLDXHardware::getInfo(bool vram_only)
-{
- LLTimer hw_timer;
- bool ok = false;
- HRESULT hr;
-
- // CLSID_DxDiagProvider does not work with Multithreaded?
- CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
-
- IDxDiagProvider *dx_diag_providerp = NULL;
- IDxDiagContainer *dx_diag_rootp = NULL;
- IDxDiagContainer *devices_containerp = NULL;
- // IDxDiagContainer *system_device_containerp= NULL;
- IDxDiagContainer *device_containerp = NULL;
- IDxDiagContainer *file_containerp = NULL;
- IDxDiagContainer *driver_containerp = NULL;
- DWORD dw_device_count;
-
- mVRAM = 0;
-
- // CoCreate a IDxDiagProvider*
- LL_DEBUGS("AppInit") << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL;
- hr = CoCreateInstance(CLSID_DxDiagProvider,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IDxDiagProvider,
- (LPVOID*) &dx_diag_providerp);
-
- if (FAILED(hr))
- {
- LL_WARNS("AppInit") << "No DXDiag provider found! DirectX 9 not installed!" << LL_ENDL;
- gWriteDebug("No DXDiag provider found! DirectX 9 not installed!\n");
- goto LCleanup;
- }
- if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed
- {
- // Fill out a DXDIAG_INIT_PARAMS struct and pass it to IDxDiagContainer::Initialize
- // Passing in TRUE for bAllowWHQLChecks, allows dxdiag to check if drivers are
- // digital signed as logo'd by WHQL which may connect via internet to update
- // WHQL certificates.
- DXDIAG_INIT_PARAMS dx_diag_init_params;
- ZeroMemory(&dx_diag_init_params, sizeof(DXDIAG_INIT_PARAMS));
-
- dx_diag_init_params.dwSize = sizeof(DXDIAG_INIT_PARAMS);
- dx_diag_init_params.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION;
- dx_diag_init_params.bAllowWHQLChecks = TRUE;
- dx_diag_init_params.pReserved = NULL;
-
- LL_DEBUGS("AppInit") << "dx_diag_providerp->Initialize" << LL_ENDL;
- hr = dx_diag_providerp->Initialize(&dx_diag_init_params);
- if(FAILED(hr))
- {
- goto LCleanup;
- }
-
- LL_DEBUGS("AppInit") << "dx_diag_providerp->GetRootContainer" << LL_ENDL;
- hr = dx_diag_providerp->GetRootContainer( &dx_diag_rootp );
- if(FAILED(hr) || !dx_diag_rootp)
- {
- goto LCleanup;
- }
-
- HRESULT hr;
-
- // Get display driver information
- LL_DEBUGS("AppInit") << "dx_diag_rootp->GetChildContainer" << LL_ENDL;
- hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp);
- if(FAILED(hr) || !devices_containerp)
- {
- // do not release 'dirty' devices_containerp at this stage, only dx_diag_rootp
- devices_containerp = NULL;
- goto LCleanup;
- }
-
- // make sure there is something inside
- hr = devices_containerp->GetNumberOfChildContainers(&dw_device_count);
- if (FAILED(hr) || dw_device_count == 0)
- {
- goto LCleanup;
- }
-
- // Get device 0
- // By default 0 device is the primary one, howhever in case of various hybrid graphics
- // like itegrated AMD and PCI AMD GPUs system might switch.
- LL_DEBUGS("AppInit") << "devices_containerp->GetChildContainer" << LL_ENDL;
- hr = devices_containerp->GetChildContainer(L"0", &device_containerp);
- if(FAILED(hr) || !device_containerp)
- {
- goto LCleanup;
- }
-
- DWORD vram = 0;
-
- WCHAR deviceID[512];
-
- get_wstring(device_containerp, L"szDeviceID", deviceID, 512);
- // Example: searches id like 1F06 in pnp string (aka VEN_10DE&DEV_1F06)
- // doesn't seem to work on some systems since format is unrecognizable
- // but in such case keyDeviceID works
- if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID, &vram)))
- {
- mVRAM = vram/(1024*1024);
- }
- else
- {
- get_wstring(device_containerp, L"szKeyDeviceID", deviceID, 512);
- LL_WARNS() << "szDeviceID" << deviceID << LL_ENDL;
- // '+9' to avoid ENUM\\PCI\\ prefix
- // Returns string like Enum\\PCI\\VEN_10DE&DEV_1F06&SUBSYS...
- // and since GetVideoMemoryViaWMI searches by PNPDeviceID it is sufficient
- if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID + 9, &vram)))
- {
- mVRAM = vram / (1024 * 1024);
- }
- }
-
- if (mVRAM == 0)
- { // Get the English VRAM string
- std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish");
-
- // We don't need the device any more
- SAFE_RELEASE(device_containerp);
-
- // Dump the string as an int into the structure
- char *stopstring;
- mVRAM = strtol(ram_str.c_str(), &stopstring, 10);
- LL_INFOS("AppInit") << "VRAM Detected: " << mVRAM << " DX9 string: " << ram_str << LL_ENDL;
- }
-
- if (vram_only)
- {
- ok = true;
- goto LCleanup;
- }
-
-
- /* for now, we ONLY do vram_only the rest of this
- is commented out, to ensure no-one is tempted
- to use it
-
- // Now let's get device and driver information
- // Get the IDxDiagContainer object called "DxDiag_SystemDevices".
- // This call may take some time while dxdiag gathers the info.
- DWORD num_devices = 0;
- WCHAR wszContainer[256];
- LL_DEBUGS("AppInit") << "dx_diag_rootp->GetChildContainer DxDiag_SystemDevices" << LL_ENDL;
- hr = dx_diag_rootp->GetChildContainer(L"DxDiag_SystemDevices", &system_device_containerp);
- if (FAILED(hr))
- {
- goto LCleanup;
- }
-
- hr = system_device_containerp->GetNumberOfChildContainers(&num_devices);
- if (FAILED(hr))
- {
- goto LCleanup;
- }
-
- LL_DEBUGS("AppInit") << "DX9 iterating over devices" << LL_ENDL;
- S32 device_num = 0;
- for (device_num = 0; device_num < (S32)num_devices; device_num++)
- {
- hr = system_device_containerp->EnumChildContainerNames(device_num, wszContainer, 256);
- if (FAILED(hr))
- {
- goto LCleanup;
- }
-
- hr = system_device_containerp->GetChildContainer(wszContainer, &device_containerp);
- if (FAILED(hr) || device_containerp == NULL)
- {
- goto LCleanup;
- }
-
- std::string device_name = get_string(device_containerp, L"szDescription");
-
- std::string device_id = get_string(device_containerp, L"szDeviceID");
-
- LLDXDevice *dxdevicep = new LLDXDevice;
- dxdevicep->mName = device_name;
- dxdevicep->mPCIString = device_id;
- mDevices[dxdevicep->mPCIString] = dxdevicep;
-
- // Split the PCI string based on vendor, device, subsys, rev.
- std::string str(device_id);
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep("&\\", "", boost::keep_empty_tokens);
- tokenizer tokens(str, sep);
-
- tokenizer::iterator iter = tokens.begin();
- S32 count = 0;
- bool valid = true;
- for (;(iter != tokens.end()) && (count < 3);++iter)
- {
- switch (count)
- {
- case 0:
- if (strcmp(iter->c_str(), "PCI"))
- {
- valid = false;
- }
- break;
- case 1:
- dxdevicep->mVendorID = iter->c_str();
- break;
- case 2:
- dxdevicep->mDeviceID = iter->c_str();
- break;
- default:
- // Ignore it
- break;
- }
- count++;
- }
-
-
-
-
- // Now, iterate through the related drivers
- hr = device_containerp->GetChildContainer(L"Drivers", &driver_containerp);
- if (FAILED(hr) || !driver_containerp)
- {
- goto LCleanup;
- }
-
- DWORD num_files = 0;
- hr = driver_containerp->GetNumberOfChildContainers(&num_files);
- if (FAILED(hr))
- {
- goto LCleanup;
- }
-
- S32 file_num = 0;
- for (file_num = 0; file_num < (S32)num_files; file_num++ )
- {
-
- hr = driver_containerp->EnumChildContainerNames(file_num, wszContainer, 256);
- if (FAILED(hr))
- {
- goto LCleanup;
- }
-
- hr = driver_containerp->GetChildContainer(wszContainer, &file_containerp);
- if (FAILED(hr) || file_containerp == NULL)
- {
- goto LCleanup;
- }
-
- std::string driver_path = get_string(file_containerp, L"szPath");
- std::string driver_name = get_string(file_containerp, L"szName");
- std::string driver_version = get_string(file_containerp, L"szVersion");
- std::string driver_date = get_string(file_containerp, L"szDatestampEnglish");
-
- LLDXDriverFile *dxdriverfilep = new LLDXDriverFile;
- dxdriverfilep->mName = driver_name;
- dxdriverfilep->mFilepath= driver_path;
- dxdriverfilep->mVersionString = driver_version;
- dxdriverfilep->mVersion.set(driver_version);
- dxdriverfilep->mDateString = driver_date;
-
- dxdevicep->mDriverFiles[driver_name] = dxdriverfilep;
-
- SAFE_RELEASE(file_containerp);
- }
- SAFE_RELEASE(device_containerp);
- }
- */
- }
-
- // dumpDevices();
- ok = true;
-
-LCleanup:
- if (!ok)
- {
- LL_WARNS("AppInit") << "DX9 probe failed" << LL_ENDL;
- gWriteDebug("DX9 probe failed\n");
- }
-
- SAFE_RELEASE(file_containerp);
- SAFE_RELEASE(driver_containerp);
- SAFE_RELEASE(device_containerp);
- SAFE_RELEASE(devices_containerp);
- SAFE_RELEASE(dx_diag_rootp);
- SAFE_RELEASE(dx_diag_providerp);
-
- CoUninitialize();
-
- return ok;
- }
-
LLSD LLDXHardware::getDisplayInfo()
{
LLTimer hw_timer;
@@ -995,7 +349,6 @@ LLSD LLDXHardware::getDisplayInfo()
if (FAILED(hr))
{
LL_WARNS() << "No DXDiag provider found! DirectX 9 not installed!" << LL_ENDL;
- gWriteDebug("No DXDiag provider found! DirectX 9 not installed!\n");
goto LCleanup;
}
if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed
@@ -1087,7 +440,7 @@ LLSD LLDXHardware::getDisplayInfo()
// print the value
// windows doesn't guarantee to be null terminated
release_version[RV_SIZE - 1] = NULL;
- ret["DriverVersion"] = utf16str_to_utf8str(release_version);
+ ret["DriverVersion"] = ll_convert<std::string>(std::wstring(release_version));
}
RegCloseKey(hKey);
@@ -1111,9 +464,4 @@ LCleanup:
return ret;
}
-void LLDXHardware::setWriteDebugFunc(void (*func)(const char*))
-{
- gWriteDebug = func;
-}
-
#endif
diff --git a/indra/llwindow/lldxhardware.h b/indra/llwindow/lldxhardware.h
index 2b879e021c..8d8a08a4eb 100644
--- a/indra/llwindow/lldxhardware.h
+++ b/indra/llwindow/lldxhardware.h
@@ -30,64 +30,16 @@
#include <map>
#include "stdtypes.h"
-#include "llstring.h"
#include "llsd.h"
-class LLVersion
-{
-public:
- LLVersion();
- bool set(const std::string &version_string);
- S32 getField(const S32 field_num);
-protected:
- std::string mVersionString;
- S32 mFields[4];
- bool mValid;
-};
-
-class LLDXDriverFile
-{
-public:
- std::string dump();
-
-public:
- std::string mFilepath;
- std::string mName;
- std::string mVersionString;
- LLVersion mVersion;
- std::string mDateString;
-};
-
-class LLDXDevice
-{
-public:
- ~LLDXDevice();
- std::string dump();
-
- LLDXDriverFile *findDriver(const std::string &driver);
-public:
- std::string mName;
- std::string mPCIString;
- std::string mVendorID;
- std::string mDeviceID;
-
- typedef std::map<std::string, LLDXDriverFile *> driver_file_map_t;
- driver_file_map_t mDriverFiles;
-};
-
class LLDXHardware
{
public:
LLDXHardware();
- void setWriteDebugFunc(void (*func)(const char*));
void cleanup();
- // Returns true on success.
- // vram_only true does a "light" probe.
- bool getInfo(bool vram_only);
-
// WMI can return multiple GPU drivers
// specify which one to output
typedef enum {
@@ -98,29 +50,9 @@ public:
} EGPUVendor;
std::string getDriverVersionWMI(EGPUVendor vendor);
- S32 getVRAM() const { return mVRAM; }
-
LLSD getDisplayInfo();
-
- // Will get memory of best GPU in MB, return memory on sucsess, 0 on failure
- // Note: WMI is not accurate in some cases
- static U32 getMBVideoMemoryViaWMI();
-
- // Find a particular device that matches the following specs.
- // Empty strings indicate that you don't care.
- // You can separate multiple devices with '|' chars to indicate you want
- // ANY of them to match and return.
- // LLDXDevice *findDevice(const std::string &vendor, const std::string &devices);
-
- // std::string dumpDevices();
-public:
- typedef std::map<std::string, LLDXDevice *> device_map_t;
- // device_map_t mDevices;
-protected:
- S32 mVRAM;
};
-extern void (*gWriteDebug)(const char* msg);
extern LLDXHardware gDXHardware;
#endif // LL_LLDXHARDWARE_H
diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h
index 97f4125484..a2c55a2dd9 100644
--- a/indra/llwindow/llopenglview-objc.h
+++ b/indra/llwindow/llopenglview-objc.h
@@ -42,7 +42,11 @@
unsigned int mMarkedTextLength;
bool mMarkedTextAllowed;
bool mSimulatedRightClick;
- bool mOldResize;
+
+ NSOpenGLPixelFormat *pixelFormat;
+ NSOpenGLContext *glContext;
+
+ bool mHDRDisplay;
}
- (id) initWithSamples:(NSUInteger)samples;
- (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync;
@@ -50,8 +54,6 @@
- (void)commitCurrentPreedit;
-- (void) setOldResize:(bool)oldresize;
-
// rebuildContext
// Destroys and recreates a context with the view's internal format set via setPixelFormat;
// Use this in event of needing to rebuild a context for whatever reason, without needing to assign a new pixel format.
@@ -68,7 +70,6 @@
- (unsigned long) getVramSize;
- (void) allowMarkedTextInput:(bool)allowed;
-- (void) viewDidEndLiveResize;
@end
@@ -88,9 +89,6 @@
@interface LLNSWindow : NSWindow
-- (NSPoint)convertToScreenFromLocalPoint:(NSPoint)point relativeToView:(NSView *)view;
-- (NSPoint)flipPoint:(NSPoint)aPoint;
-
@end
@interface NSScreen (PointConversion)
@@ -100,16 +98,6 @@
*/
+ (NSScreen *)currentScreenForMouseLocation;
-/*
- Allows you to convert a point from global coordinates to the current screen coordinates.
- */
-- (NSPoint)convertPointToScreenCoordinates:(NSPoint)aPoint;
-
-/*
- Allows to flip the point coordinates, so y is 0 at the top instead of the bottom. x remains the same
- */
-- (NSPoint)flipPoint:(NSPoint)aPoint;
-
@end
#endif
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 6177eb4873..bdb5d8def0 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -28,7 +28,10 @@
#import "llwindowmacosx-objc.h"
#import "llappdelegate-objc.h"
+#import <Carbon/Carbon.h>
+
extern BOOL gHiDPISupport;
+extern BOOL gHDRDisplaySupport;
#pragma mark local functions
@@ -105,38 +108,24 @@ attributedStringInfo getSegments(NSAttributedString *str)
return screen;
}
+@end
-- (NSPoint)convertPointToScreenCoordinates:(NSPoint)aPoint
-{
- float normalizedX = fabs(fabs(self.frame.origin.x) - fabs(aPoint.x));
- float normalizedY = aPoint.y - self.frame.origin.y;
-
- return NSMakePoint(normalizedX, normalizedY);
-}
+@implementation LLOpenGLView
-- (NSPoint)flipPoint:(NSPoint)aPoint
+- (NSOpenGLContext*) glContext
{
- return NSMakePoint(aPoint.x, self.frame.size.height - aPoint.y);
+ return glContext;
}
-@end
-
-@implementation LLOpenGLView
-
-// Force a high quality update after live resizing
-- (void) viewDidEndLiveResize
+- (NSOpenGLPixelFormat*) pixelFormat
{
- if (mOldResize) //Maint-3135
- {
- NSSize size = [self frame].size;
- callResize(size.width, size.height);
- }
+ return pixelFormat;
}
- (unsigned long)getVramSize
{
CGLRendererInfoObj info = 0;
- GLint vram_megabytes = 0;
+ GLint vram_megabytes = 0;
int num_renderers = 0;
CGLError the_err = CGLQueryRendererInfo (CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), &info, &num_renderers);
if(0 == the_err)
@@ -154,29 +143,45 @@ attributedStringInfo getSegments(NSAttributedString *str)
vram_megabytes = 256;
}
- return (unsigned long)vram_megabytes; // return value is in megabytes.
+ return (unsigned long)vram_megabytes; // return value is in megabytes.
+}
+
+- (void)viewWillMoveToWindow:(nullable NSWindow *)newWindow
+{
+ if(mHDRDisplay)
+ {
+ self.wantsExtendedDynamicRangeOpenGLSurface = YES;
+ NSLog(@"Wants Extended Dynamic Range OpenGL", nil);
+ }
+ /*
+ else
+ {
+ self.wantsExtendedDynamicRangeOpenGLSurface = NO;
+ NSLog(@"Wants Standard Color Range OpenGL", nil);
+ }
+ */
}
- (void)viewDidMoveToWindow
{
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(windowResized:) name:NSWindowDidResizeNotification
- object:[self window]];
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(windowResized:) name:NSWindowDidResizeNotification
+ object:[self window]];
[[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(windowWillMiniaturize:) name:NSWindowWillMiniaturizeNotification
- object:[self window]];
+ selector:@selector(windowWillMiniaturize:) name:NSWindowWillMiniaturizeNotification
+ object:[self window]];
[[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification
- object:[self window]];
+ selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification
+ object:[self window]];
[[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification
- object:[self window]];
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(windowDidChangeScreen:) name:NSWindowDidChangeScreenNotification
- object:[self window]];
+ selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification
+ object:[self window]];
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(windowDidChangeScreen:) name:NSWindowDidChangeScreenNotification
+ object:[self window]];
NSRect wnd_rect = [[self window] frame];
@@ -187,18 +192,10 @@ attributedStringInfo getSegments(NSAttributedString *str)
}
}
-- (void)setOldResize:(bool)oldresize
-{
- mOldResize = oldresize;
-}
-
- (void)windowResized:(NSNotification *)notification;
{
- if (!mOldResize) //Maint-3288
- {
- NSSize dev_sz = gHiDPISupport ? [self convertSizeToBacking:[self frame].size] : [self frame].size;
- callResize(dev_sz.width, dev_sz.height);
- }
+ NSSize dev_sz = [self convertSizeToBacking:[self frame].size];
+ callResize(dev_sz.width, dev_sz.height);
}
- (void)windowWillMiniaturize:(NSNotification *)notification;
@@ -218,131 +215,183 @@ attributedStringInfo getSegments(NSAttributedString *str)
-(void)windowDidChangeScreen:(NSNotification *)notification;
{
- callWindowDidChangeScreen();
+ callWindowDidChangeScreen();
}
- (void)dealloc
{
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- [super dealloc];
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+ [super dealloc];
}
- (id) init
{
- return [self initWithFrame:[self bounds] withSamples:2 andVsync:TRUE];
+ return [self initWithFrame:[self bounds] withSamples:2 andVsync:TRUE];
}
- (id) initWithSamples:(NSUInteger)samples
{
- return [self initWithFrame:[self bounds] withSamples:samples andVsync:TRUE];
+ return [self initWithFrame:[self bounds] withSamples:samples andVsync:TRUE];
}
- (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync
{
- return [self initWithFrame:[self bounds] withSamples:samples andVsync:vsync];
+ return [self initWithFrame:[self bounds] withSamples:samples andVsync:vsync];
}
+#if LL_DARWIN
+// For setView and opengl deprecation
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
- (id) initWithFrame:(NSRect)frame withSamples:(NSUInteger)samples andVsync:(BOOL)vsync
{
- [self registerForDraggedTypes:[NSArray arrayWithObject:NSURLPboardType]];
- [self initWithFrame:frame];
+ [self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeURL]];
+ [self initWithFrame:frame];
+
+ // Initialize with a default "safe" pixel format that will work with versions dating back to OS X 10.6.
+ // Any specialized pixel formats, i.e. a core profile pixel format, should be initialized through rebuildContextWithFormat.
+ // 10.7 and 10.8 don't really care if we're defining a profile or not. If we don't explicitly request a core or legacy profile, it'll always assume a legacy profile (for compatibility reasons).
+
+ NSOpenGLPixelFormatAttribute SDRAttrs[] = {
+ NSOpenGLPFANoRecovery,
+ NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFAClosestPolicy,
+ NSOpenGLPFAAccelerated,
+ NSOpenGLPFADepthSize, 24,
+ NSOpenGLPFAColorSize, 32,
+ NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core,
+ 0
+ };
- // Initialize with a default "safe" pixel format that will work with versions dating back to OS X 10.6.
- // Any specialized pixel formats, i.e. a core profile pixel format, should be initialized through rebuildContextWithFormat.
- // 10.7 and 10.8 don't really care if we're defining a profile or not. If we don't explicitly request a core or legacy profile, it'll always assume a legacy profile (for compatibility reasons).
- NSOpenGLPixelFormatAttribute attrs[] = {
+ NSOpenGLPixelFormatAttribute HDRAttrs[] = {
NSOpenGLPFANoRecovery,
- NSOpenGLPFADoubleBuffer,
- NSOpenGLPFAClosestPolicy,
- NSOpenGLPFAAccelerated,
- NSOpenGLPFASampleBuffers, 0,
- NSOpenGLPFASamples, 0,
- NSOpenGLPFAStencilSize, 8,
- NSOpenGLPFADepthSize, 24,
- NSOpenGLPFAAlphaSize, 8,
- NSOpenGLPFAColorSize, 24,
- NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core,
- 0
+ NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFAClosestPolicy,
+ NSOpenGLPFAAccelerated,
+ NSOpenGLPFAColorFloat,
+ NSOpenGLPFAColorSize, 64,
+ NSOpenGLPFADepthSize, 24,
+ NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core,
+ 0
};
- NSOpenGLPixelFormat *pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attrs] autorelease];
+ mHDRDisplay = NO;
+
+ if(gHDRDisplaySupport)
+ {
+ pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:HDRAttrs] autorelease];
+ if (pixelFormat == nil)
+ {
+ NSLog(@"Failed to create pixel format for HDR Display!", nil);
+ pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:SDRAttrs] autorelease];
+ }
+ else
+ {
+ NSLog(@"pixel format created successfully for HDR Display", nil);
+ mHDRDisplay = YES;
+ }
+ }
+ else
+ {
+ pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:SDRAttrs] autorelease];
+ }
+
+ if (pixelFormat == nil)
+ {
+ NSLog(@"Failed to create pixel format!", nil);
+ return nil;
+ }
+
+ glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil];
+
+ if (glContext == nil)
+ {
+ NSLog(@"Failed to create OpenGL context!", nil);
+ return nil;
+ }
- if (pixelFormat == nil)
- {
- NSLog(@"Failed to create pixel format!", nil);
- return nil;
- }
+ [self setPixelFormat:pixelFormat];
- NSOpenGLContext *glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil];
+ if(mHDRDisplay)
+ {
+ CGColorSpaceRef color_space = [self.window.colorSpace CGColorSpace];
+ CGColorSpaceRef color_space_extended = CGColorSpaceCreateExtended(color_space);
+ NSColorSpace* extended_ns_color_space
+ = [[NSColorSpace alloc] initWithCGColorSpace:color_space_extended];
- if (glContext == nil)
- {
- NSLog(@"Failed to create OpenGL context!", nil);
- return nil;
- }
+ self.window.colorSpace = extended_ns_color_space;
+ CGColorSpaceRelease(color_space_extended);
- [self setPixelFormat:pixelFormat];
+ NSLog(@"Extended color space applied for HDR Display", nil);
+ }
- //for retina support
- [self setWantsBestResolutionOpenGLSurface:gHiDPISupport];
+ //for retina support
+ [self setWantsBestResolutionOpenGLSurface:gHiDPISupport];
- [self setOpenGLContext:glContext];
+ [self setOpenGLContext:glContext];
- [glContext setView:self];
+ [glContext setView:self];
- [glContext makeCurrentContext];
+ [glContext makeCurrentContext];
- if (vsync)
- {
- GLint value = 1;
- [glContext setValues:&value forParameter:NSOpenGLCPSwapInterval];
- } else {
- // supress this error after move to Xcode 7:
- // error: null passed to a callee that requires a non-null argument [-Werror,-Wnonnull]
- // Tried using ObjC 'nonnull' keyword as per SO article but didn't build
- GLint swapInterval=0;
- [glContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
- }
+ if (vsync)
+ {
+ GLint value = 1;
+ [glContext setValues:&value forParameter:NSOpenGLContextParameterSwapInterval];
+ } else {
+ // supress this error after move to Xcode 7:
+ // error: null passed to a callee that requires a non-null argument [-Werror,-Wnonnull]
+ // Tried using ObjC 'nonnull' keyword as per SO article but didn't build
+ GLint swapInterval=0;
+ [glContext setValues:&swapInterval forParameter:NSOpenGLContextParameterSwapInterval];
+ }
- mOldResize = false;
+ GLint opacity = 1;
+ [glContext setValues:&opacity forParameter:NSOpenGLCPSurfaceOpacity];
- return self;
+ return self;
}
- (BOOL) rebuildContext
{
- return [self rebuildContextWithFormat:[self pixelFormat]];
+ return [self rebuildContextWithFormat:[self pixelFormat]];
}
- (BOOL) rebuildContextWithFormat:(NSOpenGLPixelFormat *)format
{
- NSOpenGLContext *ctx = [self openGLContext];
+ NSOpenGLContext *ctx = [self openGLContext];
- [ctx clearDrawable];
- [ctx initWithFormat:format shareContext:nil];
+ [ctx clearDrawable];
+ [ctx initWithFormat:format shareContext:nil];
- if (ctx == nil)
- {
- NSLog(@"Failed to create OpenGL context!", nil);
- return false;
- }
+ if (ctx == nil)
+ {
+ NSLog(@"Failed to create OpenGL context!", nil);
+ return false;
+ }
- [self setOpenGLContext:ctx];
- [ctx setView:self];
- [ctx makeCurrentContext];
- return true;
+ [self setOpenGLContext:ctx];
+ [ctx setView:self];
+ [ctx makeCurrentContext];
+ return true;
}
+#if LL_DARWIN
+#pragma clang diagnostic pop
+#endif
+
- (CGLContextObj)getCGLContextObj
{
- NSOpenGLContext *ctx = [self openGLContext];
- return (CGLContextObj)[ctx CGLContextObj];
+ NSOpenGLContext *ctx = [self openGLContext];
+ return (CGLContextObj)[ctx CGLContextObj];
}
- (CGLPixelFormatObj*)getCGLPixelFormatObj
{
- NSOpenGLPixelFormat *fmt = [self pixelFormat];
- return (CGLPixelFormatObj*)[fmt CGLPixelFormatObj];
+ NSOpenGLPixelFormat *fmt = [self pixelFormat];
+ return (CGLPixelFormatObj*)[fmt CGLPixelFormatObj];
}
// Various events can be intercepted by our view, thus not reaching our window.
@@ -350,18 +399,14 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) mouseDown:(NSEvent *)theEvent
{
- NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
- mMousePos[0] = mPoint.x;
- mMousePos[1] = mPoint.y;
-
// Apparently people still use this?
- if ([theEvent modifierFlags] & NSCommandKeyMask &&
- !([theEvent modifierFlags] & NSControlKeyMask) &&
- !([theEvent modifierFlags] & NSShiftKeyMask) &&
- !([theEvent modifierFlags] & NSAlternateKeyMask) &&
- !([theEvent modifierFlags] & NSAlphaShiftKeyMask) &&
- !([theEvent modifierFlags] & NSFunctionKeyMask) &&
- !([theEvent modifierFlags] & NSHelpKeyMask))
+ if ([theEvent modifierFlags] & NSEventModifierFlagCommand &&
+ !([theEvent modifierFlags] & NSEventModifierFlagControl) &&
+ !([theEvent modifierFlags] & NSEventModifierFlagShift) &&
+ !([theEvent modifierFlags] & NSEventModifierFlagOption) &&
+ !([theEvent modifierFlags] & NSEventModifierFlagCapsLock) &&
+ !([theEvent modifierFlags] & NSEventModifierFlagFunction) &&
+ !([theEvent modifierFlags] & NSEventModifierFlagHelp))
{
callRightMouseDown(mMousePos, [theEvent modifierFlags]);
mSimulatedRightClick = true;
@@ -382,7 +427,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
callRightMouseUp(mMousePos, [theEvent modifierFlags]);
mSimulatedRightClick = false;
} else {
- NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
+ NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callLeftMouseUp(mMousePos, [theEvent modifierFlags]);
@@ -391,35 +436,29 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) rightMouseDown:(NSEvent *)theEvent
{
- NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
- mMousePos[0] = mPoint.x;
- mMousePos[1] = mPoint.y;
- callRightMouseDown(mMousePos, [theEvent modifierFlags]);
+ callRightMouseDown(mMousePos, [theEvent modifierFlags]);
}
- (void) rightMouseUp:(NSEvent *)theEvent
{
- NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
- mMousePos[0] = mPoint.x;
- mMousePos[1] = mPoint.y;
- callRightMouseUp(mMousePos, [theEvent modifierFlags]);
+ callRightMouseUp(mMousePos, [theEvent modifierFlags]);
}
- (void)mouseMoved:(NSEvent *)theEvent
{
- NSPoint dev_delta = gHiDPISupport ? [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])] : NSMakePoint([theEvent deltaX], [theEvent deltaY]);
+ NSPoint dev_delta = [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])];
- float mouseDeltas[] = {
- float(dev_delta.x),
- float(dev_delta.y)
- };
+ float mouseDeltas[] = {
+ float(dev_delta.x),
+ float(dev_delta.y)
+ };
- callDeltaUpdate(mouseDeltas, 0);
+ callDeltaUpdate(mouseDeltas, 0);
- NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
- mMousePos[0] = mPoint.x;
- mMousePos[1] = mPoint.y;
- callMouseMoved(mMousePos, 0);
+ NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]];
+ mMousePos[0] = mPoint.x;
+ mMousePos[1] = mPoint.y;
+ callMouseMoved(mMousePos, 0);
}
// NSWindow doesn't trigger mouseMoved when the mouse is being clicked and dragged.
@@ -427,66 +466,60 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) mouseDragged:(NSEvent *)theEvent
{
- // Trust the deltas supplied by NSEvent.
- // The old CoreGraphics APIs we previously relied on are now flagged as obsolete.
- // NSEvent isn't obsolete, and provides us with the correct deltas.
+ // Trust the deltas supplied by NSEvent.
+ // The old CoreGraphics APIs we previously relied on are now flagged as obsolete.
+ // NSEvent isn't obsolete, and provides us with the correct deltas.
- NSPoint dev_delta = gHiDPISupport ? [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])] : NSMakePoint([theEvent deltaX], [theEvent deltaY]);
+ NSPoint dev_delta = [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])];
- float mouseDeltas[] = {
- float(dev_delta.x),
- float(dev_delta.y)
- };
+ float mouseDeltas[] = {
+ float(dev_delta.x),
+ float(dev_delta.y)
+ };
- callDeltaUpdate(mouseDeltas, 0);
+ callDeltaUpdate(mouseDeltas, 0);
- NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
- mMousePos[0] = mPoint.x;
- mMousePos[1] = mPoint.y;
- callMouseDragged(mMousePos, 0);
+ NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]];
+ mMousePos[0] = mPoint.x;
+ mMousePos[1] = mPoint.y;
+ callMouseDragged(mMousePos, 0);
}
- (void) otherMouseDown:(NSEvent *)theEvent
{
- NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
- mMousePos[0] = mPoint.x;
- mMousePos[1] = mPoint.y;
callOtherMouseDown(mMousePos, [theEvent modifierFlags], [theEvent buttonNumber]);
}
- (void) otherMouseUp:(NSEvent *)theEvent
{
- NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
- mMousePos[0] = mPoint.x;
- mMousePos[1] = mPoint.y;
callOtherMouseUp(mMousePos, [theEvent modifierFlags], [theEvent buttonNumber]);
}
- (void) rightMouseDragged:(NSEvent *)theEvent
{
- [self mouseDragged:theEvent];
+ [self mouseDragged:theEvent];
}
- (void) otherMouseDragged:(NSEvent *)theEvent
{
- [self mouseDragged:theEvent];
+ [self mouseDragged:theEvent];
}
- (void) scrollWheel:(NSEvent *)theEvent
{
- callScrollMoved(-[theEvent deltaX], -[theEvent deltaY]);
+ callScrollMoved(-[theEvent deltaX], -[theEvent deltaY]);
}
- (void) mouseExited:(NSEvent *)theEvent
{
- callMouseExit();
+ callMouseExit();
}
- (void) keyUp:(NSEvent *)theEvent
{
NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);
eventData.mKeyEvent = NativeKeyEventData::KEYUP;
- callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]);
+ callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]);
}
- (void) keyDown:(NSEvent *)theEvent
@@ -500,7 +533,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
// Because flagsChange event handler misses event when other window is activated,
// e.g. OS Window for upload something or Input Window...
// mModifiers instance variable is for insertText: or insertText:replacementRange: (by Pell Smit)
- mModifiers = [theEvent modifierFlags];
+ mModifiers = [theEvent modifierFlags];
NSString *str_no_modifiers = [theEvent charactersIgnoringModifiers];
unichar ch = 0;
if (str_no_modifiers.length)
@@ -511,7 +544,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
if (acceptsText &&
!mMarkedTextAllowed &&
- !(mModifiers & (NSControlKeyMask | NSCommandKeyMask)) && // commands don't invoke InputWindow
+ !(mModifiers & (NSEventModifierFlagControl | NSEventModifierFlagCommand)) && // commands don't invoke InputWindow
![(LLAppDelegate*)[NSApp delegate] romanScript] &&
ch > ' ' &&
ch != NSDeleteCharacter &&
@@ -528,20 +561,20 @@ attributedStringInfo getSegments(NSAttributedString *str)
{
NativeKeyEventData eventData = extractKeyDataFromModifierEvent(theEvent);
- mModifiers = [theEvent modifierFlags];
- callModifier([theEvent modifierFlags]);
+ mModifiers = [theEvent modifierFlags];
+ callModifier([theEvent modifierFlags]);
NSInteger mask = 0;
switch([theEvent keyCode])
{
- case 56:
- mask = NSShiftKeyMask;
+ case kVK_Shift:
+ mask = NSEventModifierFlagShift;
break;
- case 58:
- mask = NSAlternateKeyMask;
+ case kVK_Option:
+ mask = NSEventModifierFlagOption;
break;
- case 59:
- mask = NSControlKeyMask;
+ case kVK_Control:
+ mask = NSEventModifierFlagControl;
break;
default:
return;
@@ -570,69 +603,69 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (BOOL) acceptsFirstResponder
{
- return YES;
+ return YES;
}
- (NSDragOperation) draggingEntered:(id<NSDraggingInfo>)sender
{
- NSPasteboard *pboard;
+ NSPasteboard *pboard;
NSDragOperation sourceDragMask;
- sourceDragMask = [sender draggingSourceOperationMask];
+ sourceDragMask = [sender draggingSourceOperationMask];
- pboard = [sender draggingPasteboard];
+ pboard = [sender draggingPasteboard];
- if ([[pboard types] containsObject:NSURLPboardType])
- {
- if (sourceDragMask & NSDragOperationLink) {
- NSURL *fileUrl = [[pboard readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] options:[NSDictionary dictionary]] objectAtIndex:0];
- mLastDraggedUrl = [[fileUrl absoluteString] UTF8String];
+ if ([[pboard types] containsObject:NSPasteboardTypeURL])
+ {
+ if (sourceDragMask & NSDragOperationLink) {
+ NSURL *fileUrl = [[pboard readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] options:[NSDictionary dictionary]] objectAtIndex:0];
+ mLastDraggedUrl = [[fileUrl absoluteString] UTF8String];
return NSDragOperationLink;
}
- }
- return NSDragOperationNone;
+ }
+ return NSDragOperationNone;
}
- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
{
- callHandleDragUpdated(mLastDraggedUrl);
+ callHandleDragUpdated(mLastDraggedUrl);
- return NSDragOperationLink;
+ return NSDragOperationLink;
}
- (void) draggingExited:(id<NSDraggingInfo>)sender
{
- callHandleDragExited(mLastDraggedUrl);
+ callHandleDragExited(mLastDraggedUrl);
}
- (BOOL)prepareForDragOperation:(id < NSDraggingInfo >)sender
{
- return YES;
+ return YES;
}
- (BOOL) performDragOperation:(id<NSDraggingInfo>)sender
{
- callHandleDragDropped(mLastDraggedUrl);
- return true;
+ callHandleDragDropped(mLastDraggedUrl);
+ return true;
}
- (BOOL)hasMarkedText
{
- return mHasMarkedText;
+ return mHasMarkedText;
}
- (NSRange)markedRange
{
- int range[2];
- getPreeditMarkedRange(&range[0], &range[1]);
- return NSMakeRange(range[0], range[1]);
+ int range[2];
+ getPreeditMarkedRange(&range[0], &range[1]);
+ return NSMakeRange(range[0], range[1]);
}
- (NSRange)selectedRange
{
- int range[2];
- getPreeditSelectionRange(&range[0], &range[1]);
- return NSMakeRange(range[0], range[1]);
+ int range[2];
+ getPreeditSelectionRange(&range[0], &range[1]);
+ return NSMakeRange(range[0], range[1]);
}
- (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange
@@ -657,7 +690,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
};
int string_length = [aString length];
- unichar text[string_length];
+ unichar *text = new unichar[string_length];
attributedStringInfo segments;
// I used 'respondsToSelector:@selector(string)'
// to judge aString is an attributed string or not.
@@ -685,6 +718,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
// we must clear the marked text when aString is null.
[self unmarkText];
}
+
+ delete [] text;
} else {
if (mHasMarkedText)
{
@@ -693,6 +728,12 @@ attributedStringInfo getSegments(NSAttributedString *str)
}
}
+#if LL_DARWIN
+// For commitEditing deprecation
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
- (void)commitCurrentPreedit
{
if (mHasMarkedText)
@@ -704,23 +745,27 @@ attributedStringInfo getSegments(NSAttributedString *str)
}
}
+#if LL_DARWIN
+#pragma clang diagnostic pop
+#endif
+
- (void)unmarkText
{
- [[self inputContext] discardMarkedText];
- resetPreedit();
- mHasMarkedText = FALSE;
+ [[self inputContext] discardMarkedText];
+ resetPreedit();
+ mHasMarkedText = FALSE;
}
// We don't support attributed strings.
- (NSArray *)validAttributesForMarkedText
{
- return [NSArray array];
+ return [NSArray array];
}
// See above.
- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange
{
- return nil;
+ return nil;
}
- (void)insertText:(id)insertString
@@ -733,9 +778,9 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void)insertText:(id)aString replacementRange:(NSRange)replacementRange
{
- // SL-19801 Special workaround for system emoji picker
- if ([aString length] == 2)
- {
+ // SL-19801 Special workaround for system emoji picker
+ if ([aString length] == 2)
+ {
@try
{
uint32_t b0 = [aString characterAtIndex:0];
@@ -753,7 +798,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
NSLog(@"Encountered an unsupported attributed character. Exception: %@ String: %@", e.name, aString);
return;
}
- }
+ }
@try
{
@@ -783,39 +828,39 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) insertNewline:(id)sender
{
- if (!(mModifiers & NSCommandKeyMask) &&
- !(mModifiers & NSShiftKeyMask) &&
- !(mModifiers & NSAlternateKeyMask))
- {
- callUnicodeCallback(13, 0);
- } else {
- callUnicodeCallback(13, mModifiers);
- }
+ if (!(mModifiers & NSEventModifierFlagCommand) &&
+ !(mModifiers & NSEventModifierFlagShift) &&
+ !(mModifiers & NSEventModifierFlagOption))
+ {
+ callUnicodeCallback(13, 0);
+ } else {
+ callUnicodeCallback(13, mModifiers);
+ }
}
- (NSUInteger)characterIndexForPoint:(NSPoint)aPoint
{
- return NSNotFound;
+ return NSNotFound;
}
- (NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange
{
- float pos[4] = {0, 0, 0, 0};
- getPreeditLocation(pos, mMarkedTextLength);
- return NSMakeRect(pos[0], pos[1], pos[2], pos[3]);
+ float pos[4] = {0, 0, 0, 0};
+ getPreeditLocation(pos, mMarkedTextLength);
+ return NSMakeRect(pos[0], pos[1], pos[2], pos[3]);
}
- (void)doCommandBySelector:(SEL)aSelector
{
- if (aSelector == @selector(insertNewline:))
- {
- [self insertNewline:self];
- }
+ if (aSelector == @selector(insertNewline:))
+ {
+ [self insertNewline:self];
+ }
}
- (BOOL)drawsVerticallyForCharacterAtIndex:(NSUInteger)charIndex
{
- return NO;
+ return NO;
}
- (void) allowMarkedTextInput:(bool)allowed
@@ -850,7 +895,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) setGLView:(LLOpenGLView *)view
{
- glview = view;
+ glview = view;
}
- (void)keyDown:(NSEvent *)theEvent
@@ -901,45 +946,24 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (id) init
{
- return self;
-}
-
-- (NSPoint)convertToScreenFromLocalPoint:(NSPoint)point relativeToView:(NSView *)view
-{
- NSScreen *currentScreen = [NSScreen currentScreenForMouseLocation];
- if(currentScreen)
- {
- NSPoint windowPoint = [view convertPoint:point toView:nil];
- NSPoint screenPoint = [[view window] convertBaseToScreen:windowPoint];
- NSPoint flippedScreenPoint = [currentScreen flipPoint:screenPoint];
- flippedScreenPoint.y += [currentScreen frame].origin.y;
-
- return flippedScreenPoint;
- }
-
- return NSZeroPoint;
-}
-
-- (NSPoint)flipPoint:(NSPoint)aPoint
-{
- return NSMakePoint(aPoint.x, self.frame.size.height - aPoint.y);
+ return self;
}
- (BOOL) becomeFirstResponder
{
- callFocus();
- return true;
+ callFocus();
+ return true;
}
- (BOOL) resignFirstResponder
{
- callFocusLost();
- return true;
+ callFocusLost();
+ return true;
}
- (void) close
{
- callQuitHandler();
+ callQuitHandler();
}
@end
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 4f3cc69c75..935050485f 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -74,12 +74,12 @@ S32 OSMessageBox(const std::string& text, const std::string& caption, U32 type)
LL_WARNS() << "OSMessageBox: " << text << LL_ENDL;
#if LL_MESA_HEADLESS // !!! *FIX: (?)
return OSBTN_OK;
+#elif LL_SDL
+ result = OSMessageBoxSDL(text, caption, type);
#elif LL_WINDOWS
result = OSMessageBoxWin32(text, caption, type);
-#elif LL_DARWIN && !LL_SDL
+#elif LL_DARWIN
result = OSMessageBoxMacOSX(text, caption, type);
-#elif LL_SDL
- result = OSMessageBoxSDL(text, caption, type);
#else
#error("OSMessageBox not implemented for this platform!")
#endif
@@ -103,7 +103,6 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, bool fullscreen, U32 flags)
mFullscreen(fullscreen),
mFullscreenWidth(0),
mFullscreenHeight(0),
- mFullscreenBits(0),
mFullscreenRefresh(0),
mSupportedResolutions(NULL),
mNumSupportedResolutions(0),
@@ -259,12 +258,12 @@ bool LLWindow::copyTextToPrimary(const LLWString &src)
// static
std::vector<std::string> LLWindow::getDynamicFallbackFontList()
{
-#if LL_WINDOWS
+#if LL_SDL
+ return LLWindowSDL::getDynamicFallbackFontList();
+#elif LL_WINDOWS
return LLWindowWin32::getDynamicFallbackFontList();
-#elif LL_DARWIN && !LL_SDL
+#elif LL_DARWIN
return LLWindowMacOSX::getDynamicFallbackFontList();
-#elif LL_SDL
- return LLWindowSDL::getDynamicFallbackFontList();
#else
return std::vector<std::string>();
#endif
@@ -273,12 +272,12 @@ std::vector<std::string> LLWindow::getDynamicFallbackFontList()
// static
std::vector<std::string> LLWindow::getDisplaysResolutionList()
{
-#if LL_WINDOWS
+#if LL_SDL
+ return std::vector<std::string>();
+#elif LL_WINDOWS
return LLWindowWin32::getDisplaysResolutionList();
-#elif LL_DARWIN && !LL_SDL
+#elif LL_DARWIN
return LLWindowMacOSX::getDisplaysResolutionList();
-#else
- return std::vector<std::string>();
#endif
}
@@ -346,7 +345,7 @@ LLSplashScreen *LLSplashScreen::create()
return 0;
#elif LL_WINDOWS
return new LLSplashScreenWin32;
-#elif LL_DARWIN && !LL_SDL
+#elif LL_DARWIN
return new LLSplashScreenMacOSX;
#else
#error("LLSplashScreen not implemented on this platform!")
@@ -359,7 +358,7 @@ void LLSplashScreen::show()
{
if (!gSplashScreenp)
{
-#if LL_WINDOWS && !LL_MESA_HEADLESS
+#if LL_WINDOWS && !LL_MESA_HEADLESS && !LL_SDL
gSplashScreenp = new LLSplashScreenWin32;
#elif LL_DARWIN && !LL_SDL
gSplashScreenp = new LLSplashScreenMacOSX;
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 5e06e665f3..d63927d23d 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -92,9 +92,10 @@ public:
virtual bool setCursorPosition(LLCoordWindow position) = 0;
virtual bool getCursorPosition(LLCoordWindow *position) = 0;
-#if LL_WINDOWS
+#if LL_WINDOWS && !LL_SDL
virtual bool getCursorDelta(LLCoordCommon* delta) = 0;
#endif
+ virtual bool isWrapMouse() const = 0;
virtual void showCursor() = 0;
virtual void hideCursor() = 0;
virtual bool isCursorHidden() = 0;
@@ -147,7 +148,6 @@ public:
virtual void swapBuffers() = 0;
virtual void bringToFront() = 0;
virtual void focusClient() { }; // this may not have meaning or be required on other platforms, therefore, it's not abstract
- virtual void setOldResize(bool oldresize) { };
// handy coordinate space conversion routines
// NB: screen to window and vice verse won't work on width/height coordinate pairs,
// as the conversion must take into account left AND right border widths, etc.
@@ -223,7 +223,6 @@ protected:
bool mFullscreen;
S32 mFullscreenWidth;
S32 mFullscreenHeight;
- S32 mFullscreenBits;
S32 mFullscreenRefresh;
LLWindowResolution* mSupportedResolutions;
S32 mNumSupportedResolutions;
diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp
index 195f68e08b..7331f50ba0 100644
--- a/indra/llwindow/llwindowcallbacks.cpp
+++ b/indra/llwindow/llwindowcallbacks.cpp
@@ -68,7 +68,13 @@ void LLWindowCallbacks::handleMouseLeave(LLWindow *window)
return;
}
-bool LLWindowCallbacks::handleCloseRequest(LLWindow *window)
+bool LLWindowCallbacks::handleCloseRequest(LLWindow *window, bool from_user)
+{
+ //allow the window to close
+ return true;
+}
+
+bool LLWindowCallbacks::handleSessionExit(LLWindow* window)
{
//allow the window to close
return true;
diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h
index d812f93524..59dcdd3ade 100644
--- a/indra/llwindow/llwindowcallbacks.h
+++ b/indra/llwindow/llwindowcallbacks.h
@@ -42,7 +42,8 @@ public:
virtual bool handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
virtual void handleMouseLeave(LLWindow *window);
// return true to allow window to close, which will then cause handleQuit to be called
- virtual bool handleCloseRequest(LLWindow *window);
+ virtual bool handleCloseRequest(LLWindow *window, bool from_user);
+ virtual bool handleSessionExit(LLWindow* window);
// window is about to be destroyed, clean up your business
virtual void handleQuit(LLWindow *window);
virtual bool handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h
index 5696b69a59..0a1ecb05e0 100644
--- a/indra/llwindow/llwindowheadless.h
+++ b/indra/llwindow/llwindowheadless.h
@@ -60,9 +60,10 @@ public:
/*virtual*/ void toggleVSync(bool enable_vsync) override { }
/*virtual*/ bool setCursorPosition(LLCoordWindow position) override {return false;}
/*virtual*/ bool getCursorPosition(LLCoordWindow *position) override {return false;}
-#if LL_WINDOWS
+#if LL_WINDOWS && !LL_SDL
/*virtual*/ bool getCursorDelta(LLCoordCommon* delta) override { return false; }
#endif
+ /*virtual*/ bool isWrapMouse() const override { return true; }
/*virtual*/ void showCursor() override {}
/*virtual*/ void hideCursor() override {}
/*virtual*/ void showCursorFromMouseMove() override {}
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index d9d8bfce1f..b302a705da 100644
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -100,7 +100,6 @@ bool isCGCursorVisible();
void hideNSCursorTillMove(bool hide);
void requestUserAttention();
long showAlert(std::string title, std::string text, int type);
-void setResizeMode(bool oldresize, void* glview);
NSWindowRef createNSWindow(int x, int y, int width, int height);
@@ -111,16 +110,14 @@ void glSwapBuffers(void* context);
CGLContextObj getCGLContextObj(GLViewRef view);
unsigned long getVramSize(GLViewRef view);
float getDeviceUnitSize(GLViewRef view);
-CGPoint getContentViewBoundsPosition(NSWindowRef window);
-CGSize getContentViewBoundsSize(NSWindowRef window);
-CGSize getDeviceContentViewSize(NSWindowRef window, GLViewRef view);
+CGRect getContentViewRect(NSWindowRef window);
+CGRect getBackingViewRect(NSWindowRef window, GLViewRef view);
void getWindowSize(NSWindowRef window, float* size);
void setWindowSize(NSWindowRef window, int width, int height);
void getCursorPos(NSWindowRef window, float* pos);
void makeWindowOrderFront(NSWindowRef window);
void convertScreenToWindow(NSWindowRef window, float *coord);
void convertWindowToScreen(NSWindowRef window, float *coord);
-void convertScreenToView(NSWindowRef window, float *coord);
void convertRectToScreen(NSWindowRef window, float *coord);
void convertRectFromScreen(NSWindowRef window, float *coord);
void setWindowPos(NSWindowRef window, float* pos);
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index 2e75d309ea..d902a82a3c 100644
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -41,15 +41,15 @@
int createNSApp(int argc, const char *argv[])
{
- return NSApplicationMain(argc, argv);
+ return NSApplicationMain(argc, argv);
}
void setupCocoa()
{
- static bool inited = false;
-
- if(!inited)
- {
+ static bool inited = false;
+
+ if(!inited)
+ {
@autoreleasepool {
// The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents.
// ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr'
@@ -57,8 +57,8 @@ void setupCocoa()
[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
}
- inited = true;
- }
+ inited = true;
+ }
}
bool copyToPBoard(const unsigned short *str, unsigned int len)
@@ -66,7 +66,7 @@ bool copyToPBoard(const unsigned short *str, unsigned int len)
@autoreleasepool {
NSPasteboard *pboard = [NSPasteboard generalPasteboard];
[pboard clearContents];
-
+
NSArray *contentsToPaste = [[[NSArray alloc] initWithObjects:[NSString stringWithCharacters:str length:len], nil] autorelease];
return [pboard writeObjects:contentsToPaste];
}
@@ -74,8 +74,8 @@ bool copyToPBoard(const unsigned short *str, unsigned int len)
bool pasteBoardAvailable()
{
- NSArray *classArray = [NSArray arrayWithObject:[NSString class]];
- return [[NSPasteboard generalPasteboard] canReadObjectForClasses:classArray options:[NSDictionary dictionary]];
+ NSArray *classArray = [NSArray arrayWithObject:[NSString class]];
+ return [[NSPasteboard generalPasteboard] canReadObjectForClasses:classArray options:[NSDictionary dictionary]];
}
unsigned short *copyFromPBoard()
@@ -111,100 +111,110 @@ CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)
hotSpot:NSMakePoint(hotspotX, hotspotY)
] retain];
}
-
- return (CursorRef)cursor;
+
+ return (CursorRef)cursor;
}
void setArrowCursor()
{
- NSCursor *cursor = [NSCursor arrowCursor];
- [NSCursor unhide];
- [cursor set];
+ NSCursor *cursor = [NSCursor arrowCursor];
+ [NSCursor unhide];
+ [cursor set];
}
void setIBeamCursor()
{
- NSCursor *cursor = [NSCursor IBeamCursor];
- [cursor set];
+ NSCursor *cursor = [NSCursor IBeamCursor];
+ [cursor set];
}
void setPointingHandCursor()
{
- NSCursor *cursor = [NSCursor pointingHandCursor];
- [cursor set];
+ NSCursor *cursor = [NSCursor pointingHandCursor];
+ [cursor set];
}
void setCopyCursor()
{
- NSCursor *cursor = [NSCursor dragCopyCursor];
- [cursor set];
+ NSCursor *cursor = [NSCursor dragCopyCursor];
+ [cursor set];
}
void setCrossCursor()
{
- NSCursor *cursor = [NSCursor crosshairCursor];
- [cursor set];
+ NSCursor *cursor = [NSCursor crosshairCursor];
+ [cursor set];
}
void setNotAllowedCursor()
{
- NSCursor *cursor = [NSCursor operationNotAllowedCursor];
- [cursor set];
+ NSCursor *cursor = [NSCursor operationNotAllowedCursor];
+ [cursor set];
}
void hideNSCursor()
{
- [NSCursor hide];
+ [NSCursor hide];
}
void showNSCursor()
{
- [NSCursor unhide];
+ [NSCursor unhide];
}
+#if LL_DARWIN
+// For CGCursorIsVisible no replacement in modern API
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
bool isCGCursorVisible()
{
return CGCursorIsVisible();
}
+#if LL_DARWIN
+#pragma clang diagnostic pop
+#endif
+
void hideNSCursorTillMove(bool hide)
{
- [NSCursor setHiddenUntilMouseMoves:hide];
+ [NSCursor setHiddenUntilMouseMoves:hide];
}
// This is currently unused, since we want all our cursors to persist for the life of the app, but I've included it for completeness.
OSErr releaseImageCursor(CursorRef ref)
{
- if( ref != NULL )
- {
+ if( ref != NULL )
+ {
@autoreleasepool {
NSCursor *cursor = (NSCursor*)ref;
[cursor autorelease];
}
- }
- else
- {
- return paramErr;
- }
-
- return noErr;
+ }
+ else
+ {
+ return paramErr;
+ }
+
+ return noErr;
}
OSErr setImageCursor(CursorRef ref)
{
- if( ref != NULL )
- {
+ if( ref != NULL )
+ {
@autoreleasepool {
NSCursor *cursor = (NSCursor*)ref;
[cursor set];
}
- }
- else
- {
- return paramErr;
- }
-
- return noErr;
+ }
+ else
+ {
+ return paramErr;
+ }
+
+ return noErr;
}
// Now for some unholy juggling between generic pointers and casting them to Obj-C objects!
@@ -212,186 +222,155 @@ OSErr setImageCursor(CursorRef ref)
NSWindowRef createNSWindow(int x, int y, int width, int height)
{
- LLNSWindow *window = [[LLNSWindow alloc]initWithContentRect:NSMakeRect(x, y, width, height)
- styleMask:NSTitledWindowMask | NSResizableWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSTexturedBackgroundWindowMask backing:NSBackingStoreBuffered defer:NO];
- [window makeKeyAndOrderFront:nil];
- [window setAcceptsMouseMovedEvents:TRUE];
+ LLNSWindow *window = [[LLNSWindow alloc]initWithContentRect:NSMakeRect(x, y, width, height)
+ styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskResizable | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable
+ backing:NSBackingStoreBuffered defer:NO];
+ [window makeKeyAndOrderFront:nil];
+ [window setAcceptsMouseMovedEvents:TRUE];
[window setRestorable:FALSE]; // Viewer manages state from own settings
- return window;
+ return window;
}
GLViewRef createOpenGLView(NSWindowRef window, unsigned int samples, bool vsync)
{
- LLOpenGLView *glview = [[LLOpenGLView alloc]initWithFrame:[(LLNSWindow*)window frame] withSamples:samples andVsync:vsync];
- [(LLNSWindow*)window setContentView:glview];
- return glview;
-}
-
-void setResizeMode(bool oldresize, void* glview)
-{
- [(LLOpenGLView *)glview setOldResize:oldresize];
+ LLOpenGLView *glview = [[LLOpenGLView alloc]initWithFrame:[(LLNSWindow*)window frame] withSamples:samples andVsync:vsync];
+ [(LLNSWindow*)window setContentView:glview];
+ return glview;
}
void glSwapBuffers(void* context)
{
- [(NSOpenGLContext*)context flushBuffer];
+ [(NSOpenGLContext*)context flushBuffer];
}
CGLContextObj getCGLContextObj(GLViewRef view)
{
- return [(LLOpenGLView *)view getCGLContextObj];
+ return [(LLOpenGLView *)view getCGLContextObj];
}
CGLPixelFormatObj* getCGLPixelFormatObj(NSWindowRef window)
{
- LLOpenGLView *glview = [(LLNSWindow*)window contentView];
- return [glview getCGLPixelFormatObj];
+ LLOpenGLView *glview = [(LLNSWindow*)window contentView];
+ return [glview getCGLPixelFormatObj];
}
unsigned long getVramSize(GLViewRef view)
{
- return [(LLOpenGLView *)view getVramSize];
+ return [(LLOpenGLView *)view getVramSize];
}
float getDeviceUnitSize(GLViewRef view)
{
- return [(LLOpenGLView*)view convertSizeToBacking:NSMakeSize(1, 1)].width;
+ return [(LLOpenGLView*)view convertSizeToBacking:NSMakeSize(1, 1)].width;
}
-CGPoint getContentViewBoundsPosition(NSWindowRef window)
+CGRect getContentViewRect(NSWindowRef window)
{
- return [[(LLNSWindow*)window contentView] bounds].origin;
+ return [[(LLNSWindow*)window contentView] bounds];
}
-CGSize getContentViewBoundsSize(NSWindowRef window)
+CGRect getBackingViewRect(NSWindowRef window, GLViewRef view)
{
- return [[(LLNSWindow*)window contentView] bounds].size;
-}
-
-CGSize getDeviceContentViewSize(NSWindowRef window, GLViewRef view)
-{
- return [(NSOpenGLView*)view convertRectToBacking:[[(LLNSWindow*)window contentView] bounds]].size;
+ return [(NSOpenGLView*)view convertRectToBacking:[[(LLNSWindow*)window contentView] bounds]];
}
void getWindowSize(NSWindowRef window, float* size)
{
- NSRect frame = [(LLNSWindow*)window frame];
- size[0] = frame.origin.x;
- size[1] = frame.origin.y;
- size[2] = frame.size.width;
- size[3] = frame.size.height;
+ NSRect frame = [(LLNSWindow*)window frame];
+ size[0] = frame.origin.x;
+ size[1] = frame.origin.y;
+ size[2] = frame.size.width;
+ size[3] = frame.size.height;
}
void setWindowSize(NSWindowRef window, int width, int height)
{
- NSRect frame = [(LLNSWindow*)window frame];
- frame.size.width = width;
- frame.size.height = height;
- [(LLNSWindow*)window setFrame:frame display:TRUE];
+ NSRect frame = [(LLNSWindow*)window frame];
+ frame.size.width = width;
+ frame.size.height = height;
+ [(LLNSWindow*)window setFrame:frame display:TRUE];
}
void setWindowPos(NSWindowRef window, float* pos)
{
- NSPoint point;
- point.x = pos[0];
- point.y = pos[1];
- [(LLNSWindow*)window setFrameOrigin:point];
+ NSPoint point;
+ point.x = pos[0];
+ point.y = pos[1];
+ [(LLNSWindow*)window setFrameOrigin:point];
}
void getCursorPos(NSWindowRef window, float* pos)
{
- NSPoint mLoc;
- mLoc = [(LLNSWindow*)window mouseLocationOutsideOfEventStream];
- pos[0] = mLoc.x;
- pos[1] = mLoc.y;
+ NSPoint mLoc;
+ mLoc = [(LLNSWindow*)window mouseLocationOutsideOfEventStream];
+ pos[0] = mLoc.x;
+ pos[1] = mLoc.y;
}
void makeWindowOrderFront(NSWindowRef window)
{
- [(LLNSWindow*)window makeKeyAndOrderFront:nil];
+ [(LLNSWindow*)window makeKeyAndOrderFront:nil];
}
void convertScreenToWindow(NSWindowRef window, float *coord)
{
- NSRect point;
- point.origin.x = coord[0];
- point.origin.y = coord[1];
- point = [(LLNSWindow*)window convertRectFromScreen:point];
- coord[0] = point.origin.x;
- coord[1] = point.origin.y;
+ NSRect point = NSMakeRect(coord[0], coord[1], 0,0);
+ point = [(LLNSWindow*)window convertRectFromScreen:point];
+ coord[0] = point.origin.x;
+ coord[1] = point.origin.y;
}
void convertRectToScreen(NSWindowRef window, float *coord)
{
- NSRect point;
- point.origin.x = coord[0];
- point.origin.y = coord[1];
- point.size.width = coord[2];
- point.size.height = coord[3];
-
- point = [(LLNSWindow*)window convertRectToScreen:point];
-
- coord[0] = point.origin.x;
- coord[1] = point.origin.y;
- coord[2] = point.size.width;
- coord[3] = point.size.height;
+ NSRect rect = NSMakeRect(coord[0], coord[1], coord[2], coord[3]);;
+ rect = [(LLNSWindow*)window convertRectToScreen:rect];
+
+ coord[0] = rect.origin.x;
+ coord[1] = rect.origin.y;
+ coord[2] = rect.size.width;
+ coord[3] = rect.size.height;
}
void convertRectFromScreen(NSWindowRef window, float *coord)
{
- NSRect point;
- point.origin.x = coord[0];
- point.origin.y = coord[1];
- point.size.width = coord[2];
- point.size.height = coord[3];
-
- point = [(LLNSWindow*)window convertRectFromScreen:point];
-
- coord[0] = point.origin.x;
- coord[1] = point.origin.y;
- coord[2] = point.size.width;
- coord[3] = point.size.height;
-}
+ NSRect point = NSMakeRect(coord[0], coord[1], coord[2], coord[3]);
+ point = [(LLNSWindow*)window convertRectFromScreen:point];
-void convertScreenToView(NSWindowRef window, float *coord)
-{
- NSRect point;
- point.origin.x = coord[0];
- point.origin.y = coord[1];
- point.origin = [(LLNSWindow*)window convertScreenToBase:point.origin];
- point.origin = [[(LLNSWindow*)window contentView] convertPoint:point.origin fromView:nil];
+ coord[0] = point.origin.x;
+ coord[1] = point.origin.y;
+ coord[2] = point.size.width;
+ coord[3] = point.size.height;
}
void convertWindowToScreen(NSWindowRef window, float *coord)
{
- NSPoint point;
- point.x = coord[0];
- point.y = coord[1];
- point = [(LLNSWindow*)window convertToScreenFromLocalPoint:point relativeToView:[(LLNSWindow*)window contentView]];
- coord[0] = point.x;
- coord[1] = point.y;
+ NSRect rect = NSMakeRect(coord[0], coord[1], 0, 0);
+ rect = [(LLNSWindow*)window convertRectToScreen:rect];
+
+ coord[0] = rect.origin.x;
+ coord[1] = [[NSScreen screens][0] frame].size.height - rect.origin.y;
}
void closeWindow(NSWindowRef window)
{
- [(LLNSWindow*)window close];
- [(LLNSWindow*)window release];
+ [(LLNSWindow*)window close];
+ [(LLNSWindow*)window release];
}
void removeGLView(GLViewRef view)
{
- [(LLOpenGLView*)view clearGLContext];
- [(LLOpenGLView*)view removeFromSuperview];
+ [(LLOpenGLView*)view clearGLContext];
+ [(LLOpenGLView*)view removeFromSuperview];
}
void setupInputWindow(NSWindowRef window, GLViewRef glview)
{
- [[(LLAppDelegate*)[NSApp delegate] inputView] setGLView:(LLOpenGLView*)glview];
+ [[(LLAppDelegate*)[NSApp delegate] inputView] setGLView:(LLOpenGLView*)glview];
}
void commitCurrentPreedit(GLViewRef glView)
{
- [(LLOpenGLView*)glView commitCurrentPreedit];
+ [(LLOpenGLView*)glView commitCurrentPreedit];
}
void allowDirectMarkedTextInput(bool allow, GLViewRef glView)
@@ -401,20 +380,20 @@ void allowDirectMarkedTextInput(bool allow, GLViewRef glView)
NSWindowRef getMainAppWindow()
{
- LLNSWindow *winRef = [(LLAppDelegate*)[[NSApplication sharedApplication] delegate] window];
-
- [winRef setAcceptsMouseMovedEvents:TRUE];
- return winRef;
+ LLNSWindow *winRef = [(LLAppDelegate*)[[NSApplication sharedApplication] delegate] window];
+
+ [winRef setAcceptsMouseMovedEvents:TRUE];
+ return winRef;
}
void makeFirstResponder(NSWindowRef window, GLViewRef view)
{
- [(LLNSWindow*)window makeFirstResponder:(LLOpenGLView*)view];
+ [(LLNSWindow*)window makeFirstResponder:(LLOpenGLView*)view];
}
void requestUserAttention()
{
- [[NSApplication sharedApplication] requestUserAttention:NSInformationalRequest];
+ [[NSApplication sharedApplication] requestUserAttention:NSInformationalRequest];
}
long showAlert(std::string text, std::string title, int type)
@@ -422,7 +401,7 @@ long showAlert(std::string text, std::string title, int type)
long ret = 0;
@autoreleasepool {
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
-
+
[alert setMessageText:[NSString stringWithCString:title.c_str() encoding:[NSString defaultCStringEncoding]]];
[alert setInformativeText:[NSString stringWithCString:text.c_str() encoding:[NSString defaultCStringEncoding]]];
if (type == 0)
@@ -439,7 +418,7 @@ long showAlert(std::string text, std::string title, int type)
}
ret = [alert runModal];
}
-
+
if (ret == NSAlertFirstButtonReturn)
{
if (type == 1)
@@ -459,7 +438,7 @@ long showAlert(std::string text, std::string title, int type)
ret = 1;
}
}
-
+
return ret;
}
@@ -472,5 +451,5 @@ long showAlert(std::string text, std::string title, int type)
unsigned int getModifiers()
{
- return [NSEvent modifierFlags];
+ return [NSEvent modifierFlags];
}
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index c97e014e46..0bf1c4b057 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -38,7 +38,6 @@
#include "lldir.h"
#include "indra_constants.h"
-
#include <OpenGL/OpenGL.h>
#include <Carbon/Carbon.h>
#include <CoreServices/CoreServices.h>
@@ -53,6 +52,7 @@
extern bool gDebugWindowProc;
bool gHiDPISupport = true;
+bool gHDRDisplaySupport = false;
const S32 BITS_PER_PIXEL = 32;
const S32 MAX_NUM_RESOLUTIONS = 32;
@@ -236,6 +236,8 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
allowLanguageTextInput(NULL, false);
}
+ setUseMultGL(sUseMultGL);
+
mCallbacks = callbacks;
stop_glerror();
@@ -611,7 +613,7 @@ void callQuitHandler()
{
if (gWindowImplementation && gWindowImplementation->getCallbacks())
{
- if(gWindowImplementation->getCallbacks()->handleCloseRequest(gWindowImplementation))
+ if(gWindowImplementation->getCallbacks()->handleCloseRequest(gWindowImplementation, true))
{
gWindowImplementation->getCallbacks()->handleQuit(gWindowImplementation);
}
@@ -986,7 +988,7 @@ bool LLWindowMacOSX::getPosition(LLCoordScreen *position)
}
else if(mWindow)
{
- const CGPoint & pos = getContentViewBoundsPosition(mWindow);
+ CGPoint pos = getContentViewRect(mWindow).origin;
position->mX = pos.x;
position->mY = pos.y;
@@ -1013,7 +1015,7 @@ bool LLWindowMacOSX::getSize(LLCoordScreen *size)
}
else if(mWindow)
{
- const CGSize & sz = gHiDPISupport ? getDeviceContentViewSize(mWindow, mGLView) : getContentViewBoundsSize(mWindow);
+ CGSize sz = getBackingViewRect(mWindow, mGLView).size;
size->mX = sz.width;
size->mY = sz.height;
@@ -1039,7 +1041,7 @@ bool LLWindowMacOSX::getSize(LLCoordWindow *size)
}
else if(mWindow)
{
- const CGSize & sz = gHiDPISupport ? getDeviceContentViewSize(mWindow, mGLView) : getContentViewBoundsSize(mWindow);
+ CGSize sz = getBackingViewRect(mWindow, mGLView).size;
size->mX = sz.width;
size->mY = sz.height;
@@ -1225,6 +1227,12 @@ void LLWindowMacOSX::setMouseClipping( bool b )
adjustCursorDecouple();
}
+#if LL_DARWIN
+// For CGSetLocalEventsSuppressionInterval there is no replacement in modern API
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
bool LLWindowMacOSX::setCursorPosition(const LLCoordWindow position)
{
bool result = false;
@@ -1262,6 +1270,10 @@ bool LLWindowMacOSX::setCursorPosition(const LLCoordWindow position)
return result;
}
+#if LL_DARWIN
+#pragma clang diagnostic pop
+#endif
+
bool LLWindowMacOSX::getCursorPosition(LLCoordWindow *position)
{
float cursor_point[2];
@@ -1486,8 +1498,9 @@ bool LLWindowMacOSX::convertCoords(LLCoordScreen from, LLCoordWindow* to)
convertScreenToWindow(mWindow, mouse_point);
- to->mX = mouse_point[0];
- to->mY = mouse_point[1];
+ float scale_factor = getSystemUISize();
+ to->mX = mouse_point[0] * scale_factor;
+ to->mY = mouse_point[1] * scale_factor;
return true;
}
@@ -1499,9 +1512,9 @@ bool LLWindowMacOSX::convertCoords(LLCoordWindow from, LLCoordScreen *to)
if(mWindow)
{
float mouse_point[2];
-
- mouse_point[0] = from.mX;
- mouse_point[1] = from.mY;
+ float scale_factor = getSystemUISize();
+ mouse_point[0] = from.mX / scale_factor;
+ mouse_point[1] = from.mY / scale_factor;
convertWindowToScreen(mWindow, mouse_point);
@@ -2638,7 +2651,7 @@ MASK LLWindowMacOSX::modifiersToMask(S16 modifiers)
F32 LLWindowMacOSX::getSystemUISize()
{
- return gHiDPISupport ? ::getDeviceUnitSize(mGLView) : LLWindow::getSystemUISize();
+ return ::getDeviceUnitSize(mGLView);
}
#if LL_OS_DRAGDROP_ENABLED
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 7de1a40d93..d703a84d02 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -63,6 +63,7 @@ public:
bool switchContext(bool fullscreen, const LLCoordScreen &size, bool enable_vsync, const LLCoordScreen * const posp = NULL) override;
bool setCursorPosition(LLCoordWindow position) override;
bool getCursorPosition(LLCoordWindow *position) override;
+ bool isWrapMouse() const override { return !mCursorDecoupled; };
void showCursor() override;
void hideCursor() override;
void showCursorFromMouseMove() override;
@@ -174,9 +175,6 @@ protected:
bool shouldPostQuit() { return mPostQuit; }
- //Satisfy MAINT-3135 and MAINT-3288 with a flag.
- /*virtual */ void setOldResize(bool oldresize) override {setResizeMode(oldresize, mGLView); }
-
private:
void restoreGLContext();
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 69332e36b6..ad40dea0c3 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -106,6 +106,10 @@ bool hasHIDPI = 0;
# include <X11/Xutil.h>
#endif //LL_X11
+#if LL_WINDOWS && !LL_MESA_HEADLESS
+#pragma comment(lib, "dinput8")
+#endif
+
// TOFU HACK -- (*exactly* the same hack as LLWindowMacOSX for a similar
// set of reasons): Stash a pointer to the LLWindowSDL object here and
// maintain in the constructor and destructor. This assumes that there will
@@ -427,14 +431,12 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b
/*
mFullscreenWidth = mSurface->w;
mFullscreenHeight = mSurface->h;
- mFullscreenBits = mSurface->format->BitsPerPixel;
*/
SDL_GetWindowSize(mWindow, &mFullscreenWidth, &mFullscreenHeight);
mFullscreenRefresh = -1;
LL_INFOS() << "Running at " << mFullscreenWidth
<< "x" << mFullscreenHeight
- << "x" << mFullscreenBits
<< " @ " << mFullscreenRefresh
<< LL_ENDL;
}
@@ -445,7 +447,6 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b
mFullscreen = false;
mFullscreenWidth = -1;
mFullscreenHeight = -1;
- mFullscreenBits = -1;
mFullscreenRefresh = -1;
std::string error = llformat("Unable to run fullscreen at %d x %d.\nRunning in window.", width, height);
@@ -1721,7 +1722,7 @@ void LLWindowSDL::gatherInput()
break;
}
case SDL_QUIT:
- if(mCallbacks->handleCloseRequest(this))
+ if(mCallbacks->handleCloseRequest(this, true))
{
// Get the app to initiate cleanup.
mCallbacks->handleQuit(this);
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index 144216f658..d9b6be5fdc 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -32,7 +32,7 @@
#include "llwindow.h"
#include "lltimer.h"
-#if !defined(__i386__) && !defined(__x86_64__)
+#if !defined(__i386__) && !defined(__x86_64__) && !_M_X64
#define SDL_DISABLE_IMMINTRIN_H
#endif
#include "SDL2/SDL.h"
@@ -91,6 +91,8 @@ public:
bool getCursorPosition(LLCoordWindow *position) override;
+ bool isWrapMouse() const override { return true; }
+
void showCursor() override;
void hideCursor() override;
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 730e658c6a..5471e1c87a 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -76,6 +76,11 @@
#pragma comment(lib, "dxguid.lib") // needed for llurlentry test to build on some systems
#pragma comment(lib, "dinput8")
+#pragma comment(lib, "UxTheme.lib")
+#pragma comment(lib, "Dwmapi.lib")
+#include <Uxtheme.h>
+#include <dwmapi.h> // needed for DwmSetWindowAttribute to set window theme
+
const S32 MAX_MESSAGE_PER_UPDATE = 20;
const S32 BITS_PER_PIXEL = 32;
const S32 MAX_NUM_RESOLUTIONS = 32;
@@ -85,6 +90,10 @@ const F32 ICON_FLASH_TIME = 0.5f;
#define USER_DEFAULT_SCREEN_DPI 96 // Win7
#endif
+#ifndef WM_DWMCOLORIZATIONCOLORCHANGED
+#define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320
+#endif
+
// Claim a couple unused GetMessage() message IDs
const UINT WM_DUMMY_(WM_USER + 0x0017);
const UINT WM_POST_FUNCTION_(WM_USER + 0x0018);
@@ -104,6 +113,7 @@ static std::thread::id sMainThreadId;
LPWSTR gIconResource = IDI_APPLICATION;
+LPWSTR gIconSmallResource = IDI_APPLICATION;
LPDIRECTINPUT8 gDirectInput8;
LLW32MsgCallback gAsyncMsgCallback = NULL;
@@ -137,6 +147,17 @@ typedef HRESULT(STDAPICALLTYPE *GetDpiForMonitorType)(
_Out_ UINT *dpiX,
_Out_ UINT *dpiY);
+typedef enum PREFERRED_APP_MODE
+{
+ DEFAULT,
+ ALLOW_DARK,
+ FORCE_DARK,
+ FORCE_LIGHT,
+ MAX
+} PREFERRED_APP_MODE;
+
+typedef PREFERRED_APP_MODE(WINAPI* fnSetPreferredAppMode)(PREFERRED_APP_MODE mode);
+
//
// LLWindowWin32
//
@@ -160,7 +181,18 @@ HGLRC SafeCreateContext(HDC &hdc)
GLuint SafeChoosePixelFormat(HDC &hdc, const PIXELFORMATDESCRIPTOR *ppfd)
{
- return LL::seh::catcher([hdc, ppfd]{ return ChoosePixelFormat(hdc, ppfd); });
+ __try
+ {
+ return ChoosePixelFormat(hdc, ppfd);
+ }
+ __except (EXCEPTION_EXECUTE_HANDLER)
+ {
+ // convert to C++ styled exception
+ // C exception don't allow classes, so it's a regular char array
+ char integer_string[32];
+ sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());
+ throw std::exception(integer_string);
+ }
}
//static
@@ -339,10 +371,14 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
LLWindowWin32Thread();
void run() override;
- void close() override;
- // closes queue, wakes thread, waits until thread closes
- void wakeAndDestroy();
+ // Detroys handles and window
+ // Either post to or call from window thread
+ void destroyWindow();
+
+ // Closes queue, wakes thread, waits until thread closes.
+ // Call from main thread
+ bool wakeAndDestroy();
void glReady()
{
@@ -399,6 +435,7 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
// until after some graphics setup. See SL-20177. -Cosmic,2023-09-18
bool mGLReady = false;
bool mGotGLBuffer = false;
+ LLAtomicBool mDeleteOnExit = false;
};
@@ -413,6 +450,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
F32 max_gl_version)
:
LLWindow(callbacks, fullscreen, flags),
+ mAbsoluteCursorPosition(false),
mMaxGLVersion(max_gl_version),
mMaxCores(max_cores)
{
@@ -496,6 +534,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
mFSAASamples = fsaa_samples;
mIconResource = gIconResource;
+ mIconSmallResource = gIconSmallResource;
mOverrideAspectRatio = 0.f;
mNativeAspectRatio = 0.f;
mInputProcessingPaused = false;
@@ -565,6 +604,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
// Make an instance of our window then define the window class
mhInstance = GetModuleHandle(NULL);
+#if !_M_ARM64
// Init Direct Input - needed for joystick / Spacemouse
LPDIRECTINPUT8 di8_interface;
@@ -579,6 +619,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
{
gDirectInput8 = di8_interface;
}
+#endif
mSwapMethod = SWAP_METHOD_UNDEFINED;
@@ -684,8 +725,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
}
if (dev_mode.dmPelsWidth == width &&
- dev_mode.dmPelsHeight == height &&
- dev_mode.dmBitsPerPel == BITS_PER_PIXEL)
+ dev_mode.dmPelsHeight == height)
{
success = true;
if ((dev_mode.dmDisplayFrequency - current_refresh)
@@ -725,7 +765,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
// If we found a good resolution, use it.
if (success)
{
- success = setDisplayResolution(width, height, BITS_PER_PIXEL, closest_refresh);
+ success = setDisplayResolution(width, height, closest_refresh);
}
// Keep a copy of the actual current device mode in case we minimize
@@ -738,7 +778,6 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
mFullscreen = true;
mFullscreenWidth = dev_mode.dmPelsWidth;
mFullscreenHeight = dev_mode.dmPelsHeight;
- mFullscreenBits = dev_mode.dmBitsPerPel;
mFullscreenRefresh = dev_mode.dmDisplayFrequency;
LL_INFOS("Window") << "Running at " << dev_mode.dmPelsWidth
@@ -752,7 +791,6 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
mFullscreen = false;
mFullscreenWidth = -1;
mFullscreenHeight = -1;
- mFullscreenBits = -1;
mFullscreenRefresh = -1;
std::map<std::string,std::string> args;
@@ -775,7 +813,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
// }
// SL-12971 dual GPU display
- DISPLAY_DEVICEA display_device;
+ DISPLAY_DEVICE display_device;
int display_index = -1;
DWORD display_flags = 0; // EDD_GET_DEVICE_INTERFACE_NAME ?
const size_t display_bytes = sizeof(display_device);
@@ -786,23 +824,23 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
{
// CHAR DeviceName [ 32] Adapter name
// CHAR DeviceString[128]
- CHAR text[256];
+ WCHAR text[256];
- size_t name_len = strlen(display_device.DeviceName );
- size_t desc_len = strlen(display_device.DeviceString);
+ size_t name_len = lstrlen(display_device.DeviceName );
+ size_t desc_len = lstrlen(display_device.DeviceString);
- const CHAR *name = name_len ? display_device.DeviceName : "???";
- const CHAR *desc = desc_len ? display_device.DeviceString : "???";
+ const WCHAR *name = name_len ? display_device.DeviceName : TEXT("???");
+ const WCHAR *desc = desc_len ? display_device.DeviceString : TEXT("???");
- sprintf(text, "Display Device %d: %s, %s", display_index, name, desc);
- LL_INFOS("Window") << text << LL_ENDL;
+ wsprintf(text, TEXT("Display Device %d: %s, %s"), display_index, name, desc);
+ LL_INFOS("Window") << ll_convert<std::string>(std::wstring(text)) << LL_ENDL;
}
::ZeroMemory(&display_device,display_bytes);
display_device.cb = display_bytes;
display_index++;
- } while( EnumDisplayDevicesA(NULL, display_index, &display_device, display_flags ));
+ } while( EnumDisplayDevices(NULL, display_index, &display_device, display_flags ));
LL_INFOS("Window") << "Total Display Devices: " << display_index << LL_ENDL;
@@ -831,6 +869,8 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
// Initialize (boot strap) the Language text input management,
// based on the system's (or user's) default settings.
allowLanguageTextInput(NULL, false);
+ updateWindowTheme();
+ setCustomIcon();
}
@@ -842,6 +882,7 @@ LLWindowWin32::~LLWindowWin32()
}
delete mDragDrop;
+ mDragDrop = NULL;
delete [] mWindowTitle;
mWindowTitle = NULL;
@@ -853,6 +894,7 @@ LLWindowWin32::~LLWindowWin32()
mWindowClassName = NULL;
delete mWindowThread;
+ mWindowThread = NULL;
}
void LLWindowWin32::show()
@@ -961,7 +1003,7 @@ void LLWindowWin32::close()
// Restore gamma to the system values.
restoreGamma();
- LL_DEBUGS("Window") << "Destroying Window" << LL_ENDL;
+ LL_INFOS("Window") << "Cleanup and destruction of Window Thread" << LL_ENDL;
if (sWindowHandleForMessageBox == mWindowHandle)
{
@@ -971,7 +1013,11 @@ void LLWindowWin32::close()
mhDC = NULL;
mWindowHandle = NULL;
- mWindowThread->wakeAndDestroy();
+ if (mWindowThread->wakeAndDestroy())
+ {
+ // thread will delete itselfs once done
+ mWindowThread = NULL;
+ }
}
bool LLWindowWin32::isValid()
@@ -1174,7 +1220,7 @@ bool LLWindowWin32::switchContext(bool fullscreen, const LLCoordScreen& size, bo
// If we found a good resolution, use it.
if (success)
{
- success = setDisplayResolution(width, height, BITS_PER_PIXEL, closest_refresh);
+ success = setDisplayResolution(width, height, closest_refresh);
}
// Keep a copy of the actual current device mode in case we minimize
@@ -1186,7 +1232,6 @@ bool LLWindowWin32::switchContext(bool fullscreen, const LLCoordScreen& size, bo
mFullscreen = true;
mFullscreenWidth = dev_mode.dmPelsWidth;
mFullscreenHeight = dev_mode.dmPelsHeight;
- mFullscreenBits = dev_mode.dmBitsPerPel;
mFullscreenRefresh = dev_mode.dmDisplayFrequency;
LL_INFOS("Window") << "Running at " << dev_mode.dmPelsWidth
@@ -1212,7 +1257,6 @@ bool LLWindowWin32::switchContext(bool fullscreen, const LLCoordScreen& size, bo
mFullscreen = false;
mFullscreenWidth = -1;
mFullscreenHeight = -1;
- mFullscreenBits = -1;
mFullscreenRefresh = -1;
LL_INFOS("Window") << "Unable to run fullscreen at " << width << "x" << height << LL_ENDL;
@@ -1655,6 +1699,11 @@ const S32 max_format = (S32)num_formats - 1;
return false;
}
+ // Setup Tracy gpu context
+ {
+ LL_PROFILER_GPU_CONTEXT;
+ }
+
// Disable vertical sync for swap
toggleVSync(enable_vsync);
@@ -1686,8 +1735,6 @@ const S32 max_format = (S32)num_formats - 1;
swapBuffers();
}
- LL_PROFILER_GPU_CONTEXT;
-
return true;
}
@@ -1920,7 +1967,7 @@ void LLWindowWin32::setTitle(const std::string title)
// to support non-ascii usernames (and region names?)
mWindowThread->post([=]()
{
- SetWindowTextA(mWindowHandle, title.c_str());
+ SetWindowText(mWindowHandle, ll_convert<std::wstring>(title).c_str());
});
}
@@ -2420,10 +2467,13 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
case WM_CLOSE:
{
LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_CLOSE");
+ // todo: WM_CLOSE can be caused by user and by task manager,
+ // distinguish these cases.
+ // For now assume it is always user.
window_imp->post([=]()
{
// Will the app allow the window to close?
- if (window_imp->mCallbacks->handleCloseRequest(window_imp))
+ if (window_imp->mCallbacks->handleCloseRequest(window_imp, true))
{
// Get the app to initiate cleanup.
window_imp->mCallbacks->handleQuit(window_imp);
@@ -2441,6 +2491,50 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
}
return 0;
}
+ case WM_QUERYENDSESSION:
+ {
+ // Generally means that OS is going to shut down or user is going to log off.
+ // Can use ShutdownBlockReasonCreate here.
+ LL_INFOS("Window") << "Received WM_QUERYENDSESSION with wParam: " << (U32)w_param << " lParam: " << (U32)l_param << LL_ENDL;
+ return TRUE; // 1 = ok to end session. 0 no longer works by itself, use ShutdownBlockReasonCreate
+ }
+ case WM_ENDSESSION:
+ {
+ // OS session is shutting down, initiate cleanup.
+ // Comes after WM_QUERYENDSESSION
+ LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_ENDSESSION");
+ LL_INFOS("Window") << "Received WM_ENDSESSION with wParam: " << (U32)w_param << " lParam: " << (U32)l_param << LL_ENDL;
+ unsigned int end_session_flags = (U32)w_param;
+ if (end_session_flags == 0)
+ {
+ // session is not actually ending
+ return 0;
+ }
+
+ if ((end_session_flags & ENDSESSION_CLOSEAPP)
+ || (end_session_flags & ENDSESSION_CRITICAL)
+ || (end_session_flags & ENDSESSION_LOGOFF))
+ {
+ window_imp->post([=]()
+ {
+ // Check if app needs cleanup or can be closed immediately.
+ if (window_imp->mCallbacks->handleSessionExit(window_imp))
+ {
+ // Get the app to initiate cleanup.
+ window_imp->mCallbacks->handleQuit(window_imp);
+ // The app is responsible for calling destroyWindow when done with GL
+ }
+ });
+ // Give app a second to finish up. That's not enough for a clean exit,
+ // but better than nothing.
+ // Todo: sync this better, some kind of waitForResult? Can't wait forever,
+ // but can potentially use ShutdownBlockReasonCreate for a bigger delay.
+ ms_sleep(1000);
+ }
+ // Don't need to post quit or destroy window,
+ // if session is ending OS is going to take care of it.
+ return 0;
+ }
case WM_COMMAND:
{
LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_COMMAND");
@@ -3001,6 +3095,17 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
WINDOW_IMP_POST(window_imp->mMouseVanish = true);
}
}
+ // Check if theme-related settings changed
+ else if (l_param && (wcscmp((LPCWSTR)l_param, L"ImmersiveColorSet") == 0))
+ {
+ WINDOW_IMP_POST(window_imp->updateWindowTheme());
+ }
+ }
+ break;
+
+ case WM_DWMCOLORIZATIONCOLORCHANGED:
+ {
+ WINDOW_IMP_POST(window_imp->updateWindowTheme());
}
break;
@@ -3054,6 +3159,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
prev_absolute_x = absolute_x;
prev_absolute_y = absolute_y;
+ window_imp->mAbsoluteCursorPosition = true;
}
else
{
@@ -3070,6 +3176,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
window_imp->mRawMouseDelta.mX += (S32)round((F32)raw->data.mouse.lLastX * (F32)speed / DEFAULT_SPEED);
window_imp->mRawMouseDelta.mY -= (S32)round((F32)raw->data.mouse.lLastY * (F32)speed / DEFAULT_SPEED);
}
+ window_imp->mAbsoluteCursorPosition = false;
}
}
}
@@ -3093,10 +3200,14 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
break;
}
}
- else
+ else // (NULL == window_imp)
{
- // (NULL == window_imp)
LL_DEBUGS("Window") << "No window implementation to handle message with, message code: " << U32(u_msg) << LL_ENDL;
+ if (u_msg == WM_DESTROY)
+ {
+ PostQuitMessage(0); // Posts WM_QUIT with an exit code of 0
+ return 0;
+ }
}
// pass unhandled messages down to Windows
@@ -3230,7 +3341,7 @@ bool LLWindowWin32::pasteTextFromClipboard(LLWString &dst)
WCHAR *utf16str = (WCHAR*) GlobalLock(h_data);
if (utf16str)
{
- dst = utf16str_to_wstring(utf16str);
+ dst = ll_convert<LLWString>(std::wstring(utf16str));
LLWStringUtil::removeWindowsCR(dst);
GlobalUnlock(h_data);
success = true;
@@ -3255,8 +3366,8 @@ bool LLWindowWin32::copyTextToClipboard(const LLWString& wstr)
// Provide a copy of the data in Unicode format.
LLWString sanitized_string(wstr);
LLWStringUtil::addCRLF(sanitized_string);
- llutf16string out_utf16 = wstring_to_utf16str(sanitized_string);
- const size_t size_utf16 = (out_utf16.length() + 1) * sizeof(WCHAR);
+ std::wstring out_utf16 = ll_convert<std::wstring>(sanitized_string);
+ const size_t size_utf16 = (out_utf16.length() + 1) * sizeof(wchar_t);
// Memory is allocated and then ownership of it is transfered to the system.
HGLOBAL hglobal_copy_utf16 = GlobalAlloc(GMEM_MOVEABLE, size_utf16);
@@ -3506,7 +3617,7 @@ F32 LLWindowWin32::getPixelAspectRatio()
// Change display resolution. Returns true if successful.
// protected
-bool LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh)
+bool LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 refresh)
{
DEVMODE dev_mode;
::ZeroMemory(&dev_mode, sizeof(DEVMODE));
@@ -3518,7 +3629,6 @@ bool LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 re
{
if (dev_mode.dmPelsWidth == width &&
dev_mode.dmPelsHeight == height &&
- dev_mode.dmBitsPerPel == bits &&
dev_mode.dmDisplayFrequency == refresh )
{
// ...display mode identical, do nothing
@@ -3530,9 +3640,8 @@ bool LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 re
dev_mode.dmSize = sizeof(dev_mode);
dev_mode.dmPelsWidth = width;
dev_mode.dmPelsHeight = height;
- dev_mode.dmBitsPerPel = bits;
dev_mode.dmDisplayFrequency = refresh;
- dev_mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
+ dev_mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
// CDS_FULLSCREEN indicates that this is a temporary change to the device mode.
LONG cds_result = ChangeDisplaySettings(&dev_mode, CDS_FULLSCREEN);
@@ -3542,7 +3651,7 @@ bool LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 re
if (!success)
{
LL_WARNS("Window") << "setDisplayResolution failed, "
- << width << "x" << height << "x" << bits << " @ " << refresh << LL_ENDL;
+ << width << "x" << height << " @ " << refresh << LL_ENDL;
}
return success;
@@ -3553,7 +3662,7 @@ bool LLWindowWin32::setFullscreenResolution()
{
if (mFullscreen)
{
- return setDisplayResolution( mFullscreenWidth, mFullscreenHeight, mFullscreenBits, mFullscreenRefresh);
+ return setDisplayResolution( mFullscreenWidth, mFullscreenHeight, mFullscreenRefresh);
}
else
{
@@ -3618,7 +3727,7 @@ void LLSplashScreenWin32::showImpl()
ShowWindow(mWindow, SW_SHOW);
// Should set taskbar text without creating a header for the window (caption)
- SetWindowTextA(mWindow, "Second Life");
+ SetWindowText(mWindow, TEXT("Second Life"));
}
@@ -3755,8 +3864,7 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url, bool async)
// reliablly on Vista.
// this is madness.. no, this is..
- LLWString url_wstring = utf8str_to_wstring( escaped_url );
- llutf16string url_utf16 = wstring_to_utf16str( url_wstring );
+ std::wstring url_utf16 = ll_convert<std::wstring>(escaped_url);
// let the OS decide what to use to open the URL
SHELLEXECUTEINFO sei = { sizeof( sei ) };
@@ -4044,7 +4152,7 @@ void LLWindowWin32::fillCompositionLogfont(LOGFONT *logfont)
U32 LLWindowWin32::fillReconvertString(const LLWString &text,
S32 focus, S32 focus_length, RECONVERTSTRING *reconvert_string)
{
- const llutf16string text_utf16 = wstring_to_utf16str(text);
+ const std::wstring text_utf16 = ll_convert<std::wstring>(text);
const DWORD required_size = sizeof(RECONVERTSTRING) + (static_cast<DWORD>(text_utf16.length()) + 1) * sizeof(WCHAR);
if (reconvert_string && reconvert_string->dwSize >= required_size)
{
@@ -4144,7 +4252,7 @@ void LLWindowWin32::handleCompositionMessage(const U32 indexes)
size = LLWinImm::getCompositionString(himc, GCS_RESULTSTR, data, size);
if (size > 0)
{
- result_string = utf16str_to_wstring(llutf16string(data, size / sizeof(WCHAR)));
+ result_string = ll_convert_wide_to_wstring(std::wstring(data, size / sizeof(WCHAR)));
}
delete[] data;
needs_update = true;
@@ -4161,7 +4269,7 @@ void LLWindowWin32::handleCompositionMessage(const U32 indexes)
if (size > 0)
{
preedit_string_utf16_length = size / sizeof(WCHAR);
- preedit_string = utf16str_to_wstring(llutf16string(data, size / sizeof(WCHAR)));
+ preedit_string = ll_convert_wide_to_wstring(std::wstring(data, size / sizeof(WCHAR)));
}
delete[] data;
needs_update = true;
@@ -4568,25 +4676,11 @@ std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList()
#endif // LL_WINDOWS
inline LLWindowWin32::LLWindowWin32Thread::LLWindowWin32Thread()
- : LL::ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE, true /*should be false, temporary workaround for SL-18721*/)
+ : LL::ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE, false)
{
LL::ThreadPool::start();
}
-void LLWindowWin32::LLWindowWin32Thread::close()
-{
- if (!mQueue->isClosed())
- {
- LL_WARNS() << "Closing window thread without using destroy_window_handler" << LL_ENDL;
- LL::ThreadPool::close();
-
- // Workaround for SL-18721 in case window closes too early and abruptly
- LLSplashScreen::show();
- LLSplashScreen::update("..."); // will be updated later
- }
-}
-
-
/**
* LogChange is to log changes in status while trying to avoid spamming the
* log with repeated messages, especially in a tight loop. It refuses to log
@@ -4681,9 +4775,18 @@ void LLWindowWin32::LLWindowWin32Thread::checkDXMem()
if (phys_mb > 0)
{
- // Intel uses 'shared' vram, cap it to 25% of total memory
- // Todo: consider caping all adapters at least to 50% ram
- budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.25));
+ if (gGLManager.mIsIntel)
+ {
+ // Intel uses 'shared' vram, cap it to 25% of total memory
+ // Todo: consider a way of detecting integrated Intel and AMD
+ budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.25));
+ }
+ else
+ {
+ // More budget is generally better, but the way viewer
+ // utilizes even dedicated VRAM leaves a footprint in RAM
+ budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.75));
+ }
}
else
{
@@ -4801,108 +4904,102 @@ void LLWindowWin32::LLWindowWin32Thread::run()
}
#endif
}
+
+ destroyWindow();
+
+ if (mDeleteOnExit)
+ {
+ delete this;
+ }
+}
+
+void LLWindowWin32::LLWindowWin32Thread::destroyWindow()
+{
+ if (mWindowHandleThrd != NULL && IsWindow(mWindowHandleThrd))
+ {
+ if (mhDCThrd)
+ {
+ if (!ReleaseDC(mWindowHandleThrd, mhDCThrd))
+ {
+ LL_WARNS("Window") << "Release of ghDC failed!" << LL_ENDL;
+ }
+ mhDCThrd = NULL;
+ }
+
+ // This causes WM_DESTROY to be sent *immediately*
+ if (!destroy_window_handler(mWindowHandleThrd))
+ {
+ LL_WARNS("Window") << "Failed to destroy Window! " << std::hex << GetLastError() << LL_ENDL;
+ }
+ }
+ else
+ {
+ // Something killed the window while we were busy destroying gl or handle somehow got broken
+ LL_WARNS("Window") << "Failed to destroy Window, invalid handle!" << LL_ENDL;
+ }
+ mWindowHandleThrd = NULL;
+ mhDCThrd = NULL;
}
-void LLWindowWin32::LLWindowWin32Thread::wakeAndDestroy()
+bool LLWindowWin32::LLWindowWin32Thread::wakeAndDestroy()
{
if (mQueue->isClosed())
{
- LL_WARNS() << "Tried to close Queue. Win32 thread Queue already closed." << LL_ENDL;
- return;
+ LL_WARNS("Window") << "Tried to close Queue. Win32 thread Queue already closed." << LL_ENDL;
+ return false;
}
- // Make sure we don't leave a blank toolbar button.
- // Also hiding window now prevents user from suspending it
- // via some action (like dragging it around)
- ShowWindow(mWindowHandleThrd, SW_HIDE);
+ // Stop checking budget
+ mGLReady = false;
- // Schedule destruction
+ // Capture current handle before we lose it
HWND old_handle = mWindowHandleThrd;
- post([this]()
- {
- if (IsWindow(mWindowHandleThrd))
- {
- if (mhDCThrd)
- {
- if (!ReleaseDC(mWindowHandleThrd, mhDCThrd))
- {
- LL_WARNS("Window") << "Release of ghDC failed!" << LL_ENDL;
- }
- mhDCThrd = NULL;
- }
-
- // This causes WM_DESTROY to be sent *immediately*
- if (!destroy_window_handler(mWindowHandleThrd))
- {
- LL_WARNS("Window") << "Failed to destroy Window! " << std::hex << GetLastError() << LL_ENDL;
- }
- }
- else
- {
- // Something killed the window while we were busy destroying gl or handle somehow got broken
- LL_WARNS("Window") << "Failed to destroy Window, invalid handle!" << LL_ENDL;
- }
- mWindowHandleThrd = NULL;
- mhDCThrd = NULL;
- mGLReady = false;
- });
-
- LL_DEBUGS("Window") << "Closing window's pool queue" << LL_ENDL;
- mQueue->close();
- // Post a nonsense user message to wake up the thread in
- // case it is waiting for a getMessage()
+ // Clear the user data to prevent callbacks from finding us
if (old_handle)
{
- WPARAM wparam{ 0xB0B0 };
- LL_DEBUGS("Window") << "PostMessage(" << std::hex << old_handle
- << ", " << WM_DUMMY_
- << ", " << wparam << ")" << std::dec << LL_ENDL;
- PostMessage(old_handle, WM_DUMMY_, wparam, 0x1337);
+ SetWindowLongPtr(old_handle, GWLP_USERDATA, NULL);
}
- // There are cases where window will refuse to close,
- // can't wait forever on join, check state instead
- LLTimer timeout;
- timeout.setTimerExpirySec(2.0);
- while (!getQueue().done() && !timeout.hasExpired() && mWindowHandleThrd)
- {
- ms_sleep(100);
- }
+ // Signal thread to clean up when done
+ mDeleteOnExit = true;
- if (getQueue().done() || mWindowHandleThrd == NULL)
+ LL_INFOS("Window") << "Detaching window's thread" << LL_ENDL;
+ // Cleanly detach threads instead of joining them to avoid blocking the main thread
+ // This is acceptable since the thread will self-delete with mDeleteOnExit
+ // Doing it before close() to make sure thread doesn't die before or mid detach.
+ for (auto& pair : mThreads)
{
- // Window is closed, started closing or is cleaning up
- // now wait for our single thread to die.
- if (mWindowHandleThrd)
- {
- LL_INFOS("Window") << "Window is closing, waiting on pool's thread to join, time since post: " << timeout.getElapsedSeconds() << "s" << LL_ENDL;
- }
- else
- {
- LL_DEBUGS("Window") << "Waiting on pool's thread, time since post: " << timeout.getElapsedSeconds() << "s" << LL_ENDL;
+ try {
+ // Only detach if the thread is joinable
+ if (pair.second.joinable())
+ {
+ pair.second.detach();
+ }
}
- for (auto& pair : mThreads)
- {
- pair.second.join();
+ catch (const std::system_error& e) {
+ LL_WARNS("Window") << "Exception detaching thread: " << e.what() << LL_ENDL;
}
}
- else
+
+ // Close the queue.
+ LL_INFOS("Window") << "Closing window's pool queue" << LL_ENDL;
+ mQueue->close();
+
+ // Wake up the thread if it's stuck in GetMessage()
+ if (old_handle)
{
- // Something suspended window thread, can't afford to wait forever
- // so kill thread instead
- // Ex: This can happen if user starts dragging window arround (if it
- // was visible) or a modal notification pops up
- LL_WARNS("Window") << "Window is frozen, couldn't perform clean exit" << LL_ENDL;
+ WPARAM wparam{ 0xB0B0 };
+ LL_DEBUGS("Window") << "PostMessage(" << std::hex << old_handle
+ << ", " << WM_DUMMY_
+ << ", " << wparam << ")" << std::dec << LL_ENDL;
- for (auto& pair : mThreads)
- {
- // very unsafe
- TerminateThread(pair.second.native_handle(), 0);
- pair.second.detach();
- }
+ // Use PostMessage to signal thread to wake up
+ PostMessage(old_handle, WM_DUMMY_, wparam, 0x1337);
}
- LL_DEBUGS("Window") << "thread pool shutdown complete" << LL_ENDL;
+
+ LL_INFOS("Window") << "Thread pool shutdown complete" << LL_ENDL;
+ return true;
}
void LLWindowWin32::post(const std::function<void()>& func)
@@ -4949,3 +5046,69 @@ void LLWindowWin32::updateWindowRect()
});
}
}
+
+bool LLWindowWin32::isSystemAppDarkMode()
+{
+ HKEY hKey;
+ DWORD dwValue = 1; // Default to light theme
+ DWORD dwSize = sizeof(DWORD);
+
+ // Check registry for system theme preference
+ LSTATUS ret_code =
+ RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_READ, &hKey);
+ if (ERROR_SUCCESS == ret_code)
+ {
+ if (RegQueryValueExW(hKey, L"AppsUseLightTheme", NULL, NULL, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
+ {
+ // If AppsUseLightTheme is not found, check SystemUsesLightTheme
+ dwSize = sizeof(DWORD);
+ RegQueryValueExW(hKey, L"SystemUsesLightTheme", NULL, NULL, (LPBYTE)&dwValue, &dwSize);
+ }
+ RegCloseKey(hKey);
+ }
+
+ // Return true if dark mode
+ return dwValue == 0;
+}
+
+void LLWindowWin32::updateWindowTheme()
+{
+ bool use_dark_mode = isSystemAppDarkMode();
+ if (use_dark_mode == mCurrentDarkMode)
+ {
+ return;
+ }
+ mCurrentDarkMode = use_dark_mode;
+
+ HMODULE hUxTheme = LoadLibraryExW(L"uxtheme.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
+ if (hUxTheme)
+ {
+ auto SetPreferredAppMode = (fnSetPreferredAppMode)GetProcAddress(hUxTheme, "SetPreferredAppMode");
+ if (SetPreferredAppMode)
+ {
+ SetPreferredAppMode(use_dark_mode ? ALLOW_DARK : FORCE_LIGHT);
+ }
+ FreeLibrary(hUxTheme);
+ }
+ BOOL dark_mode(use_dark_mode);
+ DwmSetWindowAttribute(mWindowHandle, DWMWA_USE_IMMERSIVE_DARK_MODE, &dark_mode, sizeof(dark_mode));
+
+ LL_INFOS("Window") << "Viewer window theme is set to " << (use_dark_mode ? "dark" : "light") << " mode" << LL_ENDL;
+}
+
+void LLWindowWin32::setCustomIcon()
+{
+ if (mWindowHandle)
+ {
+ HICON hDefaultIcon = LoadIcon(mhInstance, mIconResource);
+ HICON hSmallIcon = LoadIcon(mhInstance, mIconSmallResource);
+ mWindowThread->post([=]()
+ {
+ SendMessage(mWindowHandle, WM_SETICON, ICON_BIG, (LPARAM)hDefaultIcon);
+ SendMessage(mWindowHandle, WM_SETICON, ICON_SMALL, (LPARAM)hSmallIcon);
+
+ SetClassLongPtr(mWindowHandle, GCLP_HICON, (LONG_PTR)hDefaultIcon);
+ SetClassLongPtr(mWindowHandle, GCLP_HICONSM, (LONG_PTR)hSmallIcon);
+ });
+ }
+}
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 36e89e4586..0fc93ad0b1 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -70,6 +70,7 @@ public:
/*virtual*/ bool setCursorPosition(LLCoordWindow position);
/*virtual*/ bool getCursorPosition(LLCoordWindow *position);
/*virtual*/ bool getCursorDelta(LLCoordCommon* delta);
+ /*virtual*/ bool isWrapMouse() const override { return !mAbsoluteCursorPosition; };
/*virtual*/ void showCursor();
/*virtual*/ void hideCursor();
/*virtual*/ void showCursorFromMouseMove();
@@ -150,7 +151,7 @@ protected:
virtual LLSD getNativeKeyData();
// Changes display resolution. Returns true if successful
- bool setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
+ bool setDisplayResolution(S32 width, S32 height, S32 refresh);
// Go back to last fullscreen display resolution.
bool setFullscreenResolution();
@@ -195,6 +196,7 @@ protected:
HCURSOR mCursor[ UI_CURSOR_COUNT ]; // Array of all mouse cursors
LLCoordWindow mCursorPosition; // mouse cursor position, should only be mutated on main thread
+ bool mAbsoluteCursorPosition; // true if last position was received in absolute coordinates.
LLMutex mRawMouseMutex;
RAWINPUTDEVICE mRawMouse;
LLCoordWindow mLastCursorPosition; // mouse cursor position from previous frame
@@ -214,6 +216,7 @@ protected:
bool mCustomGammaSet;
LPWSTR mIconResource;
+ LPWSTR mIconSmallResource;
bool mInputProcessingPaused;
// The following variables are for Language Text Input control.
@@ -246,6 +249,11 @@ protected:
RECT mRect;
RECT mClientRect;
+ void updateWindowTheme();
+ bool isSystemAppDarkMode();
+ void setCustomIcon();
+ bool mCurrentDarkMode { false };
+
struct LLWindowWin32Thread;
LLWindowWin32Thread* mWindowThread = nullptr;
LLThreadSafeQueue<std::function<void()>> mFunctionQueue;
@@ -281,6 +289,7 @@ private:
extern LLW32MsgCallback gAsyncMsgCallback;
extern LPWSTR gIconResource;
+extern LPWSTR gIconSmallResource;
S32 OSMessageBoxWin32(const std::string& text, const std::string& caption, U32 type);
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index bb590ebd76..562a30e8d1 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -157,6 +157,9 @@ LLControlVariable::LLControlVariable(const std::string& name, eControlType type,
{
if ((persist != PERSIST_NO) && mComment.empty())
{
+ // File isn't actually missing, but something is wrong with it
+ // so the main point is to warn user to reinstall
+ LLError::LLUserWarningMsg::showMissingFiles();
LL_ERRS() << "Must supply a comment for control " << mName << LL_ENDL;
}
//Push back versus setValue'ing here, since we don't want to call a signal yet
diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp
index 8a2c36a307..16860ab8b8 100644
--- a/indra/llxml/llxmlnode.cpp
+++ b/indra/llxml/llxmlnode.cpp
@@ -1285,7 +1285,7 @@ bool LLXMLNode::getAttributeU8(const char* name, U8& value )
bool LLXMLNode::getAttributeS8(const char* name, S8& value )
{
LLXMLNodePtr node;
- S32 val;
+ S32 val{};
if (!(getAttribute(name, node) && node->getIntValue(1, &val)))
{
return false;
@@ -1297,7 +1297,7 @@ bool LLXMLNode::getAttributeS8(const char* name, S8& value )
bool LLXMLNode::getAttributeU16(const char* name, U16& value )
{
LLXMLNodePtr node;
- U32 val;
+ U32 val{};
if (!(getAttribute(name, node) && node->getUnsignedValue(1, &val)))
{
return false;
@@ -1309,7 +1309,7 @@ bool LLXMLNode::getAttributeU16(const char* name, U16& value )
bool LLXMLNode::getAttributeS16(const char* name, S16& value )
{
LLXMLNodePtr node;
- S32 val;
+ S32 val{};
if (!(getAttribute(name, node) && node->getIntValue(1, &val)))
{
return false;
diff --git a/indra/media_plugins/base/CMakeLists.txt b/indra/media_plugins/base/CMakeLists.txt
index 57e3782ada..b98617cc4f 100644
--- a/indra/media_plugins/base/CMakeLists.txt
+++ b/indra/media_plugins/base/CMakeLists.txt
@@ -28,5 +28,5 @@ add_library(media_plugin_base
${media_plugin_base_SOURCE_FILES}
)
-target_link_libraries( media_plugin_base llplugin )
+target_link_libraries( media_plugin_base llplugin ll::pluginlibraries)
target_include_directories( media_plugin_base INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp
index d54e67c532..2d55f99dbe 100644
--- a/indra/media_plugins/base/media_plugin_base.cpp
+++ b/indra/media_plugins/base/media_plugin_base.cpp
@@ -220,10 +220,8 @@ void SymbolGrabber::ungrabSymbols()
#if LL_WINDOWS
# define LLSYMEXPORT __declspec(dllexport)
-#elif LL_LINUX || __FreeBSD__
-# define LLSYMEXPORT __attribute__ ((visibility("default")))
#else
-# define LLSYMEXPORT /**/
+# define LLSYMEXPORT __attribute__ ((visibility("default")))
#endif
extern "C"
diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index 9142a4516a..042b658d75 100644
--- a/indra/media_plugins/cef/CMakeLists.txt
+++ b/indra/media_plugins/cef/CMakeLists.txt
@@ -49,7 +49,7 @@ if (LINUX)
linux/volume_catcher_pipewire.cpp
)
- if (NOT (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu)))
+ if (NOT (${LINUX_DISTRO} MATCHES ubuntu))
message( "Building with Linux volume catcher for PulseAudio only and cancelling PipeWire" )
list(REMOVE_ITEM LINUX_VOLUME_CATCHER linux/volume_catcher_pipewire.cpp)
endif ()
@@ -76,7 +76,7 @@ add_library(media_plugin_cef
${media_plugin_cef_SOURCE_FILES}
)
-if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu))
+if (${LINUX_DISTRO} MATCHES ubuntu)
target_compile_definitions(media_plugin_cef PRIVATE USE_VOLUME_CATCHER_PW=1)
endif ()
@@ -90,6 +90,10 @@ target_link_libraries(media_plugin_cef
ll::glib_headers
)
+if (LINUX)
+ target_link_libraries(${PROJECT_NAME} glib-2.0)
+endif ()
+
if (WINDOWS)
set_target_properties(
media_plugin_cef
@@ -105,41 +109,36 @@ if (DARWIN)
PROPERTIES
PREFIX ""
BUILD_WITH_INSTALL_RPATH 1
- INSTALL_NAME_DIR "@executable_path"
+ INSTALL_RPATH "@executable_path/../Frameworks"
LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
)
- add_custom_command(TARGET media_plugin_cef
- POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "@executable_path/Chromium Embedded Framework"
- "@executable_path/../../../../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework"
- -change "/opt/local/lib/libopenjp2.7.dylib" "@loader_path/../../Frameworks/libopenjp2.7.dylib"
- -change "/opt/local/lib/libpng16.16.dylib" "@loader_path/../../Frameworks/libpng16.16.dylib"
- -change "/opt/local/lib/libjpeg.8.dylib" "@loader_path/../../Frameworks/libjpeg.8.dylib"
- -change "/opt/local/lib/libfreetype.6.dylib" "@loader_path/../../Frameworks/libfreetype.6.dylib"
- -change "/opt/local/lib/libaprutil-1.0.dylib" "@loader_path/../../Frameworks/libaprutil-1.0.dylib"
- -change "/opt/local/lib/libiconv.2.dylib" "@loader_path/../../Frameworks/libiconv.2.dylib"
- -change "/opt/local/lib/libapr-1.0.dylib" "@loader_path/../../Frameworks/libapr-1.0.dylib"
- -change "/opt/local/lib/libexpat.1.dylib" "@loader_path/../../Frameworks/libexpat.1.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_context-mt.dylib" "@loader_path/../../Frameworks/libboost_context-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_fiber-mt.dylib" "@loader_path/../../Frameworks/libboost_fiber-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_filesystem-mt.dylib" "@loader_path/../../Frameworks/libboost_filesystem-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_program_options-mt.dylib" "@loader_path/../../Frameworks/libboost_program_options-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_regex-mt.dylib" "@loader_path/../../Frameworks/libboost_regex-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_system-mt.dylib" "@loader_path/../../Frameworks/libboost_system-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_thread-mt.dylib" "@loader_path/../../Frameworks/libboost_thread-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_url-mt.dylib" "@loader_path/../../Frameworks/libboost_url-mt.dylib"
- -change "/opt/local/lib/libz.1.dylib" "@loader_path/../../Frameworks/libz.1.dylib"
- -change "/opt/local/lib/libnghttp2.14.dylib" "@loader_path/../../Frameworks/libnghttp2.14.dylib"
- "$<TARGET_FILE:media_plugin_cef>"
+ add_custom_command(TARGET ${PROJECT_NAME}
+ POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL}
+ -change "/opt/local/lib/libnghttp2.14.dylib" "@loader_path/libnghttp2.14.dylib"
+ -change "/opt/local/lib/libaprutil-1.0.dylib" "@loader_path/libaprutil-1.0.dylib"
+ -change "/opt/local/lib/libiconv.2.dylib" "@loader_path/libiconv.2.dylib"
+ -change "/opt/local/lib/libapr-1.0.dylib" "@loader_path/libapr-1.0.dylib"
+ -change "/opt/local/lib/libz.1.dylib" "@loader_path/libz.1.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_context-mt.dylib" "@loader_path/libboost_context-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_fiber-mt.dylib" "@loader_path/libboost_fiber-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_filesystem-mt.dylib" "@loader_path/libboost_filesystem-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_program_options-mt.dylib" "@loader_path/libboost_program_options-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_thread-mt.dylib" "@loader_path/libboost_thread-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_url-mt.dylib" "@loader_path/libboost_url-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_regex-mt.dylib" "@loader_path/libboost_regex-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_system-mt.dylib" "@loader_path/libboost_system-mt.dylib"
+ -change "/opt/local/lib/libexpat.1.dylib" "@loader_path/libexpat.1.dylib"
+ "$<TARGET_FILE:${PROJECT_NAME}>"
VERBATIM
- COMMENT "Fixing path to CEF Framework"
+ COMMENT "Fixing paths to CEF media plugin dependencies"
)
endif (DARWIN)
if (INSTALL)
if (DARWIN)
- set(_LIB llplugin)
+ set(_LIB SLPlugin.app/Contents/Frameworks)
install(
DIRECTORY "${ARCH_PREBUILT_DIRS_RELEASE}/Chromium Embedded Framework.framework"
DESTINATION ../Frameworks
@@ -147,10 +146,11 @@ if (INSTALL)
install(
DIRECTORY
"${ARCH_PREBUILT_DIRS_RELEASE}/DullahanHelper.app"
+ "${ARCH_PREBUILT_DIRS_RELEASE}/DullahanHelper (Alerts).app"
"${ARCH_PREBUILT_DIRS_RELEASE}/DullahanHelper (GPU).app"
"${ARCH_PREBUILT_DIRS_RELEASE}/DullahanHelper (Plugin).app"
"${ARCH_PREBUILT_DIRS_RELEASE}/DullahanHelper (Renderer).app"
- DESTINATION SLPlugin.app/Contents/Frameworks
+ DESTINATION ${_LIB}
)
elseif (LINUX)
if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu))
@@ -193,8 +193,39 @@ if (INSTALL)
DIRECTORY ${AUTOBUILD_INSTALL_DIR}/resources/locales
DESTINATION ${_LIB}
)
- else (DARWIN)
+ elseif (WINDOWS)
+ set(_LIB llplugin)
+ install(
+ PROGRAMS
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${PROJECT_NAME}.dll
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/chrome_elf.dll
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/d3dcompiler_47.dll
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/dullahan_host.exe
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/libEGL.dll
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/libGLESv2.dll
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/libcef.dll
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/libvlc.dll
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/libvlccore.dll
+ DESTINATION llplugin
+ )
+ install(
+ FILES
+ ${AUTOBUILD_INSTALL_DIR}/resources/chrome_100_percent.pak
+ ${AUTOBUILD_INSTALL_DIR}/resources/chrome_200_percent.pak
+ ${AUTOBUILD_INSTALL_DIR}/resources/icudtl.dat
+ ${AUTOBUILD_INSTALL_DIR}/resources/resources.pak
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/snapshot_blob.bin
+ ${AUTOBUILD_INSTALL_DIR}/bin/release/v8_context_snapshot.bin
+ DESTINATION llplugin
+ )
+ install(
+ DIRECTORY ${AUTOBUILD_INSTALL_DIR}/resources/locales
+ DESTINATION llplugin
+ )
+ else ()
set(_LIB lib)
- endif (DARWIN)
- install(TARGETS ${PROJECT_NAME} DESTINATION ${_LIB})
-endif (INSTALL)
+ endif ()
+ if (NOT WINDOWS)
+ install(TARGETS ${PROJECT_NAME} DESTINATION ${_LIB})
+ endif ()
+endif ()
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 9c205b558c..a2b664c755 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -38,6 +38,13 @@
#include "volume_catcher.h"
#include "media_plugin_base.h"
+// _getpid()/getpid()
+#if LL_WINDOWS
+#include <process.h>
+#else
+#include <unistd.h>
+#endif
+
#include "dullahan.h"
////////////////////////////////////////////////////////////////////////////////
@@ -64,7 +71,7 @@ private:
void onLoadStartCallback();
void onRequestExitCallback();
void onLoadEndCallback(int httpStatusCode, std::string url);
- void onLoadError(int status, const std::string error_text);
+ void onLoadError(int status, const std::string error_text, const std::string error_url);
void onAddressChangeCallback(std::string url);
void onOpenPopupCallback(std::string url, std::string target);
bool onHTTPAuthCallback(const std::string host, const std::string realm, std::string& username, std::string& password);
@@ -99,9 +106,13 @@ private:
std::string mAuthUsername;
std::string mAuthPassword;
bool mAuthOK;
+ bool mCanUndo;
+ bool mCanRedo;
bool mCanCut;
bool mCanCopy;
bool mCanPaste;
+ bool mCanDelete;
+ bool mCanSelectAll;
std::string mRootCachePath;
std::string mCachePath;
std::string mContextCachePath;
@@ -139,10 +150,13 @@ MediaPluginBase(host_send_func, host_user_data)
mAuthUsername = "";
mAuthPassword = "";
mAuthOK = false;
+ mCanUndo = false;
+ mCanRedo = false;
mCanCut = false;
mCanCopy = false;
mCanPaste = false;
- mCachePath = "";
+ mCanDelete = false;
+ mCanSelectAll = false;
mCefLogFile = "";
mCefLogVerbose = false;
mPickedFiles.clear();
@@ -242,15 +256,17 @@ void MediaPluginCEF::onLoadStartCallback()
/////////////////////////////////////////////////////////////////////////////////
//
-void MediaPluginCEF::onLoadError(int status, const std::string error_text)
+void MediaPluginCEF::onLoadError(int status, const std::string error_text, const std::string error_url)
{
std::stringstream msg;
- msg << "<b>Loading error!</b>";
+ msg << "<b>Loading error</b>";
msg << "<p>";
- msg << "Message: " << error_text;
- msg << "<br>";
- msg << "Code: " << status;
+ msg << "Error message: " << error_text;
+ msg << "<p>";
+ msg << "Error URL: <tt>" << error_url << "</tt>";
+ msg << "<p>";
+ msg << "Error code: " << status;
mCEFLib->showBrowserMessage(msg.str());
}
@@ -607,7 +623,12 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
mCEFLib->setOnTooltipCallback(std::bind(&MediaPluginCEF::onTooltipCallback, this, std::placeholders::_1));
mCEFLib->setOnLoadStartCallback(std::bind(&MediaPluginCEF::onLoadStartCallback, this));
mCEFLib->setOnLoadEndCallback(std::bind(&MediaPluginCEF::onLoadEndCallback, this, std::placeholders::_1, std::placeholders::_2));
- mCEFLib->setOnLoadErrorCallback(std::bind(&MediaPluginCEF::onLoadError, this, std::placeholders::_1, std::placeholders::_2));
+
+ // CEF 139 seems to have introduced a loading failure at the login page (only?) I haven't seen it on
+ // any other page and it only happens about 1 in 8 times. Without this handler for the error page
+ // (red box, error message/code/url) the page load recovers after display a brief built in error.
+ // Not ideal but better than stopping altgoether. Will restore this once I discover the error.
+ //mCEFLib->setOnLoadErrorCallback(std::bind(&MediaPluginCEF::onLoadError, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
mCEFLib->setOnAddressChangeCallback(std::bind(&MediaPluginCEF::onAddressChangeCallback, this, std::placeholders::_1));
mCEFLib->setOnOpenPopupCallback(std::bind(&MediaPluginCEF::onOpenPopupCallback, this, std::placeholders::_1, std::placeholders::_2));
mCEFLib->setOnHTTPAuthCallback(std::bind(&MediaPluginCEF::onHTTPAuthCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
@@ -635,10 +656,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
// and set it to white
settings.background_color = 0xffffffff; // white
- settings.cache_enabled = true;
settings.root_cache_path = mRootCachePath;
- settings.cache_path = mCachePath;
- settings.context_cache_path = mContextCachePath;
settings.cookies_enabled = mCookiesEnabled;
// configure proxy argument if enabled and valid
@@ -729,23 +747,32 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
std::string user_data_path_cache = message_in.getValue("cache_path");
std::string subfolder = message_in.getValue("username");
- mRootCachePath = user_data_path_cache + "cef_cache";
- if (!subfolder.empty())
- {
- std::string delim;
+ // media plugin doesn't have access to gDirUtilp
+ std::string path_separator;
#if LL_WINDOWS
- // media plugin doesn't have access to gDirUtilp
- delim = "\\";
+ path_separator = "\\";
#else
- delim = "/";
+ path_separator = "/";
#endif
- mCachePath = mRootCachePath + delim + subfolder;
- }
- else
- {
- mCachePath = mRootCachePath;
- }
- mContextCachePath = ""; // disabled by ""
+
+ mRootCachePath = user_data_path_cache + "cef_cache";
+
+ // Issue #4498 Introduce an additional sub-folder underneath the main cache
+ // folder so that each CEF media instance gets its own (as per the CEF API
+ // official position). These folders will be removed at startup by Viewer code
+ // so that their non-trivial size does not exhaust available disk space. This
+ // begs the question - why turn on the cache at all? There are 2 reasons - firstly
+ // some of the instances will benefit from per Viewer session caching and will
+ // use the injected SL cookie and secondly, it's not clear how having no cache
+ // interacts with the multiple simultaneous paradigm we use.
+ mRootCachePath += path_separator;
+# if LL_WINDOWS
+ mRootCachePath += std::to_string(_getpid());
+# else
+ mRootCachePath += std::to_string(getpid());
+# endif
+
+
mCefLogFile = message_in.getValue("cef_log_file");
mCefLogVerbose = message_in.getValueBoolean("cef_verbose_log");
}
@@ -930,6 +957,16 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
{
authResponse(message_in);
}
+#if !LL_LINUX
+ if (message_name == "edit_undo")
+ {
+ mCEFLib->editUndo();
+ }
+ if (message_name == "edit_redo")
+ {
+ mCEFLib->editRedo();
+ }
+#endif
if (message_name == "edit_cut")
{
mCEFLib->editCut();
@@ -942,6 +979,20 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
{
mCEFLib->editPaste();
}
+#if !LL_LINUX
+ if (message_name == "edit_delete")
+ {
+ mCEFLib->editDelete();
+ }
+ if (message_name == "edit_select_all")
+ {
+ mCEFLib->editSelectAll();
+ }
+ if (message_name == "edit_show_source")
+ {
+ mCEFLib->viewSource();
+ }
+#endif
}
else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
{
@@ -1125,14 +1176,41 @@ void MediaPluginCEF::unicodeInput(std::string event, LLSD native_key_data = LLSD
//
void MediaPluginCEF::checkEditState()
{
+#if !LL_LINUX
+ bool can_undo = mCEFLib->editCanUndo();
+ bool can_redo = mCEFLib->editCanRedo();
+#endif
bool can_cut = mCEFLib->editCanCut();
bool can_copy = mCEFLib->editCanCopy();
bool can_paste = mCEFLib->editCanPaste();
+#if !LL_LINUX
+ bool can_delete = mCEFLib->editCanDelete();
+ bool can_select_all = mCEFLib->editCanSelectAll();
+#endif
+#if LL_LINUX
if ((can_cut != mCanCut) || (can_copy != mCanCopy) || (can_paste != mCanPaste))
+#else
+ if ((can_undo != mCanUndo) || (can_redo != mCanRedo) || (can_cut != mCanCut) || (can_copy != mCanCopy)
+ || (can_paste != mCanPaste) || (can_delete != mCanDelete) || (can_select_all != mCanSelectAll))
+#endif
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_state");
+#if !LL_LINUX
+ if (can_undo != mCanUndo)
+ {
+ mCanUndo = can_undo;
+ message.setValueBoolean("undo", can_undo);
+ }
+
+ if (can_redo != mCanRedo)
+ {
+ mCanRedo = can_redo;
+ message.setValueBoolean("redo", can_redo);
+ }
+#endif
+
if (can_cut != mCanCut)
{
mCanCut = can_cut;
@@ -1151,6 +1229,20 @@ void MediaPluginCEF::checkEditState()
message.setValueBoolean("paste", can_paste);
}
+#if !LL_LINUX
+ if (can_delete != mCanDelete)
+ {
+ mCanDelete = can_delete;
+ message.setValueBoolean("delete", can_delete);
+ }
+
+ if (can_select_all != mCanSelectAll)
+ {
+ mCanSelectAll = can_select_all;
+ message.setValueBoolean("select_all", can_select_all);
+ }
+#endif
+
sendMessage(message);
}
}
diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt
index 71343d5f85..be8ffe5a40 100644
--- a/indra/media_plugins/example/CMakeLists.txt
+++ b/indra/media_plugins/example/CMakeLists.txt
@@ -39,7 +39,7 @@ if (DARWIN)
PROPERTIES
PREFIX ""
BUILD_WITH_INSTALL_RPATH 1
- INSTALL_NAME_DIR "@executable_path"
+ INSTALL_RPATH "@executable_path/../Frameworks"
LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
)
diff --git a/indra/media_plugins/libvlc/CMakeLists.txt b/indra/media_plugins/libvlc/CMakeLists.txt
index e99f25a1df..b8b3bd68f3 100644
--- a/indra/media_plugins/libvlc/CMakeLists.txt
+++ b/indra/media_plugins/libvlc/CMakeLists.txt
@@ -43,33 +43,29 @@ if (DARWIN)
PROPERTIES
PREFIX ""
BUILD_WITH_INSTALL_RPATH 1
- INSTALL_NAME_DIR "@executable_path"
+ INSTALL_RPATH "@executable_path/../Frameworks"
LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
)
add_custom_command(TARGET ${PROJECT_NAME}
POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL}
- -change "/opt/local/lib/libopenjp2.7.dylib" "@loader_path/../../Frameworks/libopenjp2.7.dylib"
- -change "/opt/local/lib/libpng16.16.dylib" "@loader_path/../../Frameworks/libpng16.16.dylib"
- -change "/opt/local/lib/libjpeg.8.dylib" "@loader_path/../../Frameworks/libjpeg.8.dylib"
- -change "/opt/local/lib/libfreetype.6.dylib" "@loader_path/../../Frameworks/libfreetype.6.dylib"
- -change "/opt/local/lib/libaprutil-1.0.dylib" "@loader_path/../../Frameworks/libaprutil-1.0.dylib"
- -change "/opt/local/lib/libiconv.2.dylib" "@loader_path/../../Frameworks/libiconv.2.dylib"
- -change "/opt/local/lib/libapr-1.0.dylib" "@loader_path/../../Frameworks/libapr-1.0.dylib"
- -change "/opt/local/lib/libexpat.1.dylib" "@loader_path/../../Frameworks/libexpat.1.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_context-mt.dylib" "@loader_path/../../Frameworks/libboost_context-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_fiber-mt.dylib" "@loader_path/../../Frameworks/libboost_fiber-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_filesystem-mt.dylib" "@loader_path/../../Frameworks/libboost_filesystem-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_program_options-mt.dylib" "@loader_path/../../Frameworks/libboost_program_options-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_regex-mt.dylib" "@loader_path/../../Frameworks/libboost_regex-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_system-mt.dylib" "@loader_path/../../Frameworks/libboost_system-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_thread-mt.dylib" "@loader_path/../../Frameworks/libboost_thread-mt.dylib"
- -change "/opt/local/libexec/boost/1.87/lib/libboost_url-mt.dylib" "@loader_path/../../Frameworks/libboost_url-mt.dylib"
- -change "/opt/local/lib/libz.1.dylib" "@loader_path/../../Frameworks/libz.1.dylib"
- -change "/opt/local/lib/libnghttp2.14.dylib" "@loader_path/../../Frameworks/libnghttp2.14.dylib"
+ -change "/opt/local/lib/libnghttp2.14.dylib" "@loader_path/libnghttp2.14.dylib"
+ -change "/opt/local/lib/libaprutil-1.0.dylib" "@loader_path/libaprutil-1.0.dylib"
+ -change "/opt/local/lib/libiconv.2.dylib" "@loader_path/libiconv.2.dylib"
+ -change "/opt/local/lib/libapr-1.0.dylib" "@loader_path/libapr-1.0.dylib"
+ -change "/opt/local/lib/libz.1.dylib" "@loader_path/libz.1.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_context-mt.dylib" "@loader_path/libboost_context-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_fiber-mt.dylib" "@loader_path/libboost_fiber-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_filesystem-mt.dylib" "@loader_path/libboost_filesystem-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_program_options-mt.dylib" "@loader_path/libboost_program_options-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_thread-mt.dylib" "@loader_path/libboost_thread-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_url-mt.dylib" "@loader_path/libboost_url-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_regex-mt.dylib" "@loader_path/libboost_regex-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_system-mt.dylib" "@loader_path/libboost_system-mt.dylib"
+ -change "/opt/local/lib/libexpat.1.dylib" "@loader_path/libexpat.1.dylib"
-change "@rpath/libvlc.dylib" "@loader_path/plugins/libvlc.dylib"
-change "@rpath/libvlccore.dylib" "@loader_path/plugins/libvlccore.dylib"
- "$<TARGET_FILE:media_plugin_libvlc>"
+ "$<TARGET_FILE:${PROJECT_NAME}>"
VERBATIM
COMMENT "Fixing paths to LibVLC media plugin dependencies"
)
@@ -78,7 +74,7 @@ endif (DARWIN)
if (INSTALL)
if (DARWIN)
- set(_LIB llplugin)
+ set(_LIB SLPlugin.app/Contents/Frameworks)
install(
DIRECTORY /Volumes/VLC\ media\ player/VLC.app/Contents/MacOS/plugins
DESTINATION ${_LIB}
@@ -95,8 +91,13 @@ if (INSTALL)
set(_LIB lib/${ARCH}-linux-gnu)
elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed) OR (${LINUX_DISTRO} MATCHES gentoo))
set(_LIB lib${ADDRESS_SIZE})
- else (DARWIN)
+ else ()
set(_LIB lib)
- endif (DARWIN)
- install(TARGETS ${PROJECT_NAME} DESTINATION ${_LIB})
-endif (INSTALL)
+ endif ()
+ if (WINDOWS)
+ install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${PROJECT_NAME}.dll DESTINATION llplugin)
+ install(DIRECTORY ${AUTOBUILD_INSTALL_DIR}/bin/release/plugins DESTINATION llplugin)
+ else ()
+ install(TARGETS ${PROJECT_NAME} DESTINATION ${_LIB})
+ endif ()
+endif ()
diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
index e79d474325..3fe2c2b193 100644
--- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
+++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
@@ -174,7 +174,7 @@ void MediaPluginLibVLC::initVLC()
};
#if LL_DARWIN
- setenv("VLC_PLUGIN_PATH", ".", 1);
+ setenv("VLC_PLUGIN_PATH", "./plugins", 1);
#endif
int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8c895246de..a5d949d25b 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -15,6 +15,9 @@ include(CMakeCopyIfDifferent)
include(CubemapToEquirectangularJS)
#include(DBusGlib)
include(DragDrop)
+if (USE_DISCORD)
+ include(Discord)
+endif ()
include(EXPAT)
include(Hunspell)
include(JPEGEncoderBasic)
@@ -46,13 +49,16 @@ include(VisualLeakDetector)
#include(VulkanGltf)
include(ZLIBNG)
include(LLPrimitive)
+if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
+ include(UnixInstall)
+endif ()
if (ENABLE_MEDIA_PLUGINS)
include(LibVLCPlugin)
include(CEFPlugin)
endif ()
-if (NOT HAVOK_TPV)
+if (HAVOK)
# When using HAVOK_TPV, the library is precompiled, so no need for this
# Stub and probably havok lib itself is a hack, autobuild loads a 3p that really is a source tarball
@@ -61,6 +67,11 @@ if (NOT HAVOK_TPV)
# which means we need to duct tape this togther ...
add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions)
+ if (NOT "${LLPHYSICSEXTENSIONS_STUB_DIR}" STREQUAL "")
+ # for darwin universal builds we need both real llphysicsextensions and the stub for aarch64 fallback
+ # this will only be set when HAVOK is ON, otherwise the normal stub fallback will be in effect
+ add_subdirectory(${LLPHYSICSEXTENSIONS_STUB_DIR} llphysicsextensionsstub)
+ endif()
# Another hack that works with newer cmake versions:
cmake_policy( SET CMP0079 NEW)
@@ -73,7 +84,7 @@ if (NOT HAVOK_TPV)
target_compile_options( llphysicsextensions PRIVATE -Wno-unused-local-typedef)
endif (DARWIN)
endif()
-endif (NOT HAVOK_TPV)
+endif ()
set(viewer_SOURCE_FILES
gltfscenemanager.cpp
@@ -81,6 +92,7 @@ set(viewer_SOURCE_FILES
gltf/accessor.cpp
gltf/primitive.cpp
gltf/animation.cpp
+ gltf/llgltfloader.cpp
groupchatlistener.cpp
llaccountingcostmanager.cpp
llaisapi.cpp
@@ -97,6 +109,7 @@ set(viewer_SOURCE_FILES
llagentwearables.cpp
llanimstatelabels.cpp
llappcorehttp.cpp
+ llappearancelistener.cpp
llappearancemgr.cpp
llappviewer.cpp
llappviewerlistener.cpp
@@ -182,11 +195,11 @@ set(viewer_SOURCE_FILES
llflexibleobject.cpp
llfloater360capture.cpp
llfloaterabout.cpp
+ llfloateravatarwelcomepack.cpp
llfloaterbvhpreview.cpp
llfloateraddpaymentmethod.cpp
llfloaterauction.cpp
llfloaterautoreplacesettings.cpp
- llfloateravatar.cpp
llfloateravatarpicker.cpp
llfloateravatarrendersettings.cpp
llfloateravatartextures.cpp
@@ -205,6 +218,7 @@ set(viewer_SOURCE_FILES
llfloatercamera.cpp
llfloatercamerapresets.cpp
llfloaterchangeitemthumbnail.cpp
+ llfloaterchatmentionpicker.cpp
llfloaterchatvoicevolume.cpp
llfloaterclassified.cpp
llfloatercolorpicker.cpp
@@ -343,6 +357,7 @@ set(viewer_SOURCE_FILES
llhudeffectpointat.cpp
llhudeffecttrail.cpp
llhudeffectblob.cpp
+ llhudeffectresetskeleton.cpp
llhudicon.cpp
llhudmanager.cpp
llhudnametag.cpp
@@ -368,6 +383,7 @@ set(viewer_SOURCE_FILES
llinventorygallerymenu.cpp
llinventoryicon.cpp
llinventoryitemslist.cpp
+ llinventorylistener.cpp
llinventorylistitem.cpp
llinventorymodel.cpp
llinventorymodelbackgroundfetch.cpp
@@ -392,6 +408,7 @@ set(viewer_SOURCE_FILES
llmaniprotate.cpp
llmanipscale.cpp
llmaniptranslate.cpp
+ llfloatermarketplace.cpp
llmarketplacefunctions.cpp
llmarketplacenotifications.cpp
llmaterialeditor.cpp
@@ -743,7 +760,7 @@ set(viewer_SOURCE_FILES
rlvhandler.cpp
)
-if (CMAKE_SYSTEM_NAME MATCHES FreeBSD)
+if (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64) OR (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64))
list(REMOVE_ITEM viewer_SOURCE_FILES llvoicewebrtc.cpp)
endif ()
@@ -760,6 +777,7 @@ set(viewer_HEADER_FILES
gltf/buffer_util.h
gltf/primitive.h
gltf/animation.h
+ gltf/llgltfloader.h
llaccountingcost.h
llaccountingcostmanager.h
llaisapi.h
@@ -777,6 +795,7 @@ set(viewer_HEADER_FILES
llanimstatelabels.h
llappcorehttp.h
llappearance.h
+ llappearancelistener.h
llappearancemgr.h
llappviewer.h
llappviewerlistener.h
@@ -862,11 +881,11 @@ set(viewer_HEADER_FILES
llflexibleobject.h
llfloater360capture.h
llfloaterabout.h
+ llfloateravatarwelcomepack.h
llfloaterbvhpreview.h
llfloateraddpaymentmethod.h
llfloaterauction.h
llfloaterautoreplacesettings.h
- llfloateravatar.h
llfloateravatarpicker.h
llfloateravatarrendersettings.h
llfloateravatartextures.h
@@ -884,6 +903,7 @@ set(viewer_HEADER_FILES
llfloaterbuyland.h
llfloatercamerapresets.h
llfloaterchangeitemthumbnail.h
+ llfloaterchatmentionpicker.h
llfloatercamera.h
llfloaterchatvoicevolume.h
llfloaterclassified.h
@@ -937,6 +957,7 @@ set(viewer_HEADER_FILES
llfloaterlinkreplace.h
llfloaterloadprefpreset.h
llfloatermap.h
+ llfloatermarketplace.h
llfloatermarketplacelistings.h
llfloatermediasettings.h
llfloatermemleak.h
@@ -1025,6 +1046,7 @@ set(viewer_HEADER_FILES
llhudeffectpointat.h
llhudeffecttrail.h
llhudeffectblob.h
+ llhudeffectresetskeleton.h
llhudicon.h
llhudmanager.h
llhudnametag.h
@@ -1049,6 +1071,7 @@ set(viewer_HEADER_FILES
llinventorygallerymenu.h
llinventoryicon.h
llinventoryitemslist.h
+ llinventorylistener.h
llinventorylistitem.h
llinventorymodel.h
llinventorymodelbackgroundfetch.h
@@ -1431,7 +1454,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
)
@@ -1475,7 +1498,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
@@ -1488,12 +1511,13 @@ if (DARWIN)
list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES})
endif (DARWIN)
-if (NOT DARWIN)
+if (NOT (DARWIN OR WINDOWS))
LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp)
set_source_files_properties(
llappviewerlinux.cpp
PROPERTIES
COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}"
+ COMPILE_FLAGS "-DAPP_PLUGIN_DIR=\\\"${INSTALL_LIBRARY_DIR}\\\""
)
#LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp)
if (NOT CMAKE_CXX_COMPILER_ID MATCHES AppleClang)
@@ -1588,6 +1612,7 @@ if (WINDOWS)
res-sdl/ll_icon.BMP
res/ll_icon.BMP
res/ll_icon.ico
+ res/ll_icon_small.ico
res/resource.h
res/toolpickobject.cur
res/toolpickobject2.cur
@@ -1647,7 +1672,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})
@@ -1655,7 +1680,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})
@@ -1680,7 +1705,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
@@ -1719,10 +1744,6 @@ if (WINDOWS)
list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES})
endif (WINDOWS)
-if (HAVOK OR HAVOK_TPV)
- set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK")
-endif (HAVOK OR HAVOK_TPV)
-
if( DEFINED LLSTARTUP_COMPILE_FLAGS )
# progress view disables/enables icons based on available packages
set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
@@ -1746,6 +1767,97 @@ list(APPEND EVENT_HOST_SCRIPTS ${EVENT_HOST_SCRIPT_GLOB_LIST})
set(PACKAGE ON CACHE BOOL
"Add a package target that builds an installer package.")
+if (PACKAGE)
+ set(CPACK_PACKAGE_NAME ${VIEWER_BINARY_NAME}
+ CACHE STRING "Viewer binary name.")
+ set(CPACK_PACKAGE_VERSION ${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}
+ CACHE STRING "Viewer major.minor.patch.revision versions.")
+ set(VIEWER_PACKAGE_COMMENT "A fork of the Second Life viewer")
+ set(VIEWER_PACKAGE_DESCRIPTION "An entrance to virtual empires in only megabytes. A shelter for the metaverse refugees, especially those from less supported operating systems.")
+ string(TOLOWER ${VIEWER_BINARY_NAME} DOMAIN_NAME)
+ set(VIEWER_PACKAGE_DOMAIN_NAME ${DOMAIN_NAME}.net)
+endif ()
+
+if (CMAKE_COMMAND MATCHES /usr/bin/cmake)
+ add_custom_command(
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ COMMAND sed
+ ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sort
+ ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND paste
+ ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
+ COMMAND sed
+ ARGS -i 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
+ )
+elseif (WINDOWS)
+ add_custom_command(
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ COMMAND sed
+ ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^ B.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^ C.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^ M.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^ O.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^ S.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^ s.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '/^ V.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sort
+ ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND paste
+ ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
+ COMMAND sed
+ ARGS -i 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
+ )
+else ()
+ add_custom_command(
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ COMMAND sed
+ ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '' -e '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '' -e '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '' -e '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '' -e '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sed
+ ARGS -i '' -e '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND sort
+ ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
+ COMMAND paste
+ ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
+ COMMAND sed
+ ARGS -i '' -e 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
+ )
+endif ()
+
if(USE_PRECOMPILED_HEADERS)
target_precompile_headers( ${VIEWER_BINARY_NAME} PRIVATE llviewerprecompiledheaders.h )
endif(USE_PRECOMPILED_HEADERS)
@@ -1775,8 +1887,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
@@ -1805,6 +1917,12 @@ if (WINDOWS)
)
endif (ADDRESS_SIZE EQUAL 64)
+ if (TARGET ll::discord_sdk)
+ list(APPEND COPY_INPUT_DEPENDENCIES
+ ${SHARED_LIB_STAGING_DIR}/discord_partner_sdk.dll
+ )
+ endif ()
+
if (TARGET ll::openal)
list(APPEND COPY_INPUT_DEPENDENCIES
${SHARED_LIB_STAGING_DIR}/OpenAL32.dll
@@ -1821,6 +1939,7 @@ if (WINDOWS)
--arch=${ARCH}
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
+ "--discord=${USE_DISCORD}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
@@ -1859,6 +1978,7 @@ if (WINDOWS)
--arch=${ARCH}
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
+ "--discord=${USE_DISCORD}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
@@ -1903,6 +2023,17 @@ if (WINDOWS)
endif (NOT UNATTENDED)
if (PACKAGE)
+
+ set(CPACK_NSIS_DISPLAY_NAME ${VIEWER_BINARY_NAME})
+ set(CPACK_NSIS_PACKAGE_NAME ${VIEWER_BINARY_NAME})
+ set(CPACK_NSIS_HELP_LINK https://${VIEWER_PACKAGE_DOMAIN_NAME})
+ set(CPACK_NSIS_URL_INFO_ABOUT https://${VIEWER_PACKAGE_DOMAIN_NAME})
+ set(CPACK_NSIS_CONTACT $ENV{USERNAME}@${VIEWER_PACKAGE_DOMAIN_NAME})
+ set(CPACK_NSIS_WELCOME_TITLE "Welcome to ${VIEWER_BINARY_NAME}!")
+ set(CPACK_NSIS_MENU_LINKS ${VIEWER_BINARY_NAME}.exe "${VIEWER_BINARY_NAME} Viewer")
+ set(CPACK_PACKAGE_INSTALL_DIRECTORY ${VIEWER_BINARY_NAME})
+
+ if (FALSE)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.xz
COMMAND ${PYTHON_EXECUTABLE}
@@ -1925,6 +2056,7 @@ if (WINDOWS)
--arch=${ARCH}
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
+ "--discord=${USE_DISCORD}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
@@ -1949,13 +2081,38 @@ if (WINDOWS)
# temporarily disable packaging of event_host until hg subrepos get
# sorted out on the parabuild cluster...
#${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.xz)
+ endif (FALSE)
endif (PACKAGE)
elseif (DARWIN)
set_target_properties(${VIEWER_BINARY_NAME}
PROPERTIES
- LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP"
+ RESOURCE SecondLife.xib
+ LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip"
)
+ if(HAVOK)
+ set_target_properties(${VIEWER_BINARY_NAME}
+ PROPERTIES
+ # arch specific flags for universal builds: https://stackoverflow.com/a/77942065
+ XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=x86_64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_FULL -DLL_HAVOK=1"
+ XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=arm64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_STUB"
+ # only generate the .MAP file for llphysicsextensions_tpv on x86_64
+ XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=x86_64] "$(inherited) -L${CMAKE_CURRENT_BINARY_DIR}/llphysicsextensions/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensions -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP"
+ XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=arm64] "$(inherited) -L${CMAKE_BINARY_DIR}/llphysicsextensionsos/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensionsos"
+ )
+ elseif(HAVOK_TPV)
+ set_target_properties(${VIEWER_BINARY_NAME}
+ PROPERTIES
+ # arch specific flags for universal builds: https://stackoverflow.com/a/77942065
+ XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=x86_64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_FULL -DLL_HAVOK=1"
+ XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=arm64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_STUB"
+ # only generate the .MAP file for llphysicsextensions_tpv on x86_64
+ XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=x86_64] "$(inherited) -L${ARCH_PREBUILT_DIRS}/ -lllphysicsextensions_tpv"
+ XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=arm64] "$(inherited) -L${CMAKE_BINARY_DIR}/llphysicsextensionsos/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensionsos"
+ )
+ else()
+ target_link_libraries(${VIEWER_BINARY_NAME} llphysicsextensionsos)
+ endif()
else (WINDOWS)
# Linux
set_target_properties(${VIEWER_BINARY_NAME}
@@ -1977,7 +2134,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
@@ -2015,11 +2172,12 @@ target_link_libraries(${VIEWER_BINARY_NAME}
llappearance
${LLPHYSICSEXTENSIONS_LIBRARIES}
ll::bugsplat
+ ll::ndof
ll::tracy
ll::openxr
)
-if (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD)
+if (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64) OR (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)))
target_link_libraries(${VIEWER_BINARY_NAME} llwebrtc )
endif ()
@@ -2030,6 +2188,10 @@ if (ENABLE_MEDIA_PLUGINS)
endif ()
endif ()
+if (USE_DISCORD)
+ target_link_libraries(${VIEWER_BINARY_NAME} ll::discord_sdk )
+endif ()
+
if( TARGET ll::intel_memops )
target_link_libraries(${VIEWER_BINARY_NAME} ll::intel_memops )
endif()
@@ -2038,11 +2200,16 @@ if( TARGET ll::nvapi )
target_link_libraries(${VIEWER_BINARY_NAME} ll::nvapi )
endif()
+if ( TARGET llconvexdecomposition )
+ target_link_libraries(${VIEWER_BINARY_NAME} llconvexdecomposition )
+endif ()
+
set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
"Path to artwork files.")
-set_source_files_properties(llinventorygallery.cpp PROPERTIES COMPILE_FLAGS
- -Wno-unused-but-set-variable)
+if (NOT WINDOWS)
+ set_source_files_properties(llinventorygallery.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-but-set-variable)
+endif ()
if (CMAKE_CXX_COMPILER_ID MATCHES Clang)
set_source_files_properties(llappviewerlinux.cpp PROPERTIES
COMPILE_FLAGS -Wno-dangling-gsl
@@ -2064,6 +2231,7 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES GNU)
set_source_files_properties(llviewerstats.cpp PROPERTIES
COMPILE_FLAGS -Wno-unused-value)
set_source_files_properties(
+ gltf/llgltfloader.cpp
llaisapi.cpp
llconversationlog.cpp
llconversationmodel.cpp
@@ -2115,42 +2283,52 @@ foreach(elem ${country_codes})
set(emoji_mapping_src_file
"${emoji_mapping_src_folder}/${elem}/emoji_characters.xml")
set(emoji_mapping_dst_file
- "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml")
+ "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml")
configure_file(${emoji_mapping_src_file} ${emoji_mapping_dst_file} COPYONLY)
endforeach()
-if (PACKAGE)
- set(CPACK_PACKAGE_NAME ${VIEWER_BINARY_NAME}
- CACHE STRING "Viewer binary name.")
- set(CPACK_PACKAGE_VERSION ${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}
- CACHE STRING "Viewer major.minor.patch.revision versions.")
- set(VIEWER_PACKAGE_COMMENT "A fork of the Second Life viewer")
- set(VIEWER_PACKAGE_DESCRIPTION "An entrance to virtual empires in only megabytes. A shelter for the metaverse refugees, especially those from less supported operating systems.")
- set(VIEWER_PACKAGE_DOMAIN_NAME ${VIEWER_BINARY_NAME}.net)
-endif ()
-
if (LINUX)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_SYSROOT}/usr/bin/sed
- ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND ${CMAKE_SYSROOT}/usr/bin/sed
- ARGS -i '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND ${CMAKE_SYSROOT}/usr/bin/sed
- ARGS -i '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND ${CMAKE_SYSROOT}/usr/bin/sed
- ARGS -i '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND ${CMAKE_SYSROOT}/usr/bin/sed
- ARGS -i '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND ${CMAKE_SYSROOT}/usr/bin/sed
- ARGS -i '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND sort
- ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND paste
- ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
- COMMAND ${CMAKE_SYSROOT}/usr/bin/sed
- ARGS -i 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
+ if (FALSE)
+ set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION})
+
+ # These are the generated targets that are copied to package/
+ set(COPY_INPUT_DEPENDENCIES
+ ${VIEWER_BINARY_NAME}
+ SLPlugin
+ #media_plugin_gstreamer010
+ llcommon
)
+
+ #if (NOT USE_BUGSPLAT)
+ # LIST(APPEND COPY_INPUT_DEPENDENCIES linux-crash-logger)
+ #endif (NOT USE_BUGSPLAT)
+
+ add_custom_command(
+ OUTPUT ${product}.tar.xz
+ COMMAND ${PYTHON_EXECUTABLE}
+ ARGS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ --arch=${ARCH}
+ --artwork=${ARTWORK_DIR}
+ "--bugsplat=${BUGSPLAT_DB}"
+ "--discord=${USE_DISCORD}"
+ "--openal=${USE_OPENAL}"
+ "--tracy=${USE_TRACY}"
+ --build=${CMAKE_CURRENT_BINARY_DIR}
+ --buildtype=${CMAKE_BUILD_TYPE}
+ "--channel=${VIEWER_CHANNEL}"
+ --configuration=${CMAKE_CFG_INTDIR}
+ --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
+ --grid=${GRID}
+ --source=${CMAKE_CURRENT_SOURCE_DIR}
+ --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
+ --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ ${COPY_INPUT_DEPENDENCIES}
+ )
+ endif (FALSE)
+
if (PACKAGE)
if (${LINUX_DISTRO} MATCHES arch)
configure_file(
@@ -2159,8 +2337,11 @@ if (LINUX)
)
elseif (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu)
set(CPACK_BINARY_DEB ON CACHE BOOL "Able to package Debian DEB.")
- set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64
- CACHE STRING "Debian package architecture.")
+ if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
+ set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64 CACHE STRING "Debian package architecture.")
+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES x86_64)
+ set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64 CACHE STRING "Debian package architecture.")
+ endif ()
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_COMMENT}
CACHE STRING "Debian package description.")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME}
@@ -2168,10 +2349,15 @@ if (LINUX)
set(CPACK_DEBIAN_PACKAGE_SECTION net
CACHE STRING "Debian package section.")
if (${LINUX_DISTRO} MATCHES debian)
- set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1, libboost-fiber1.81.0, libboost-filesystem1.81.0, libboost-program-options1.81.0, libboost-regex1.81.0, libboost-thread1.81.0, libboost-url1.81.0, libexpat1, libfltk1.3, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
- CACHE STRING "Debian package dependencies.")
+ if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
+ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.4, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libopenjp2-7, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
+ CACHE STRING "Debian package dependencies.")
+ else ()
+ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.4, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libopenjp2-7, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
+ CACHE STRING "Debian package dependencies.")
+ endif ()
else ()
- set(CPACK_DEBIAN_PACKAGE_DEPENDS "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.3t64, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
+ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.3t64, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
CACHE STRING "Debian package dependencies.")
endif ()
elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed))
@@ -2192,54 +2378,13 @@ if (LINUX)
set(CPACK_RPM_PACKAGE_REQUIRES "apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, expat, fltk, mesa-libGLU, hunspell, libnghttp2, openjpeg2, SDL2, vlc-libs, vlc-plugins-base, libvorbis"
CACHE STRING "RPM package requirements.")
else ()
- set(CPACK_RPM_PACKAGE_REQUIRES "libapr-util1-0, libboost_fiber1_87_0, libboost_program_options1_87_0, libboost_regex1_87_0, libboost_thread1_87_0, libboost_url1_87_0, libboost_url1_87_0-x86-64-v3, expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, openjpeg2, libSDL2-2_0-0, libvlc5, vlc-codecs, libvorbis0"
+ set(CPACK_RPM_PACKAGE_REQUIRES "libapr-util1-0, libboost_fiber1_90_0, libboost_program_options1_90_0, libboost_regex1_90_0, libboost_thread1_90_0, libboost_url1_90_0, libboost_url1_90_0-x86-64-v3, libpng16-16 expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, openjpeg2, libSDL2-2_0-0, libvlc5, vlc-codecs, libvorbis0"
CACHE STRING "RPM package requirements.")
endif ()
endif ()
endif (PACKAGE)
if (FALSE)
- set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION})
-
- # These are the generated targets that are copied to package/
- set(COPY_INPUT_DEPENDENCIES
- ${VIEWER_BINARY_NAME}
- SLPlugin
- #media_plugin_gstreamer010
- llcommon
- )
-
- #if (NOT USE_BUGSPLAT)
- # LIST(APPEND COPY_INPUT_DEPENDENCIES linux-crash-logger)
- #endif (NOT USE_BUGSPLAT)
-
- add_custom_command(
- OUTPUT ${product}.tar.xz
- COMMAND ${PYTHON_EXECUTABLE}
- ARGS
- ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
- --arch=${ARCH}
- --artwork=${ARTWORK_DIR}
- "--bugsplat=${BUGSPLAT_DB}"
- "--openal=${USE_OPENAL}"
- "--tracy=${USE_TRACY}"
- --build=${CMAKE_CURRENT_BINARY_DIR}
- --buildtype=${CMAKE_BUILD_TYPE}
- "--channel=${VIEWER_CHANNEL}"
- --configuration=${CMAKE_CFG_INTDIR}
- --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
- --grid=${GRID}
- --source=${CMAKE_CURRENT_SOURCE_DIR}
- --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
- --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
- DEPENDS
- ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
- ${COPY_INPUT_DEPENDENCIES}
- )
-
- if (PACKAGE)
- endif (PACKAGE)
-
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched
COMMAND ${PYTHON_EXECUTABLE}
@@ -2249,6 +2394,7 @@ if (LINUX)
--arch=${ARCH}
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
+ "--discord=${USE_DISCORD}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
@@ -2275,49 +2421,31 @@ if (LINUX)
endif (PACKAGE)
endif (FALSE)
-else (LINUX)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND sed
- ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND sed
- ARGS -i '' -e '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND sed
- ARGS -i '' -e '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND sed
- ARGS -i '' -e '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND sed
- ARGS -i '' -e '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND sed
- ARGS -i '' -e '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND sort
- ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt
- COMMAND paste
- ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
- COMMAND sed
- ARGS -i '' -e 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
- )
- if (CMAKE_SYSTEM_NAME MATCHES FreeBSD AND PACKAGE)
- set(CPACK_BINARY_FREEBSD ON CACHE BOOL "Able to package FreeBSD PKG.")
- set(CPACK_FREEBSD_PACKAGE_COMMENT ${VIEWER_PACKAGE_COMMENT}
- CACHE STRING "FreeBSD package comment.")
- set(CPACK_FREEBSD_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION}
- CACHE STRING "FreeBSD package description.")
- set(CPACK_FREEBSD_PACKAGE_WWW https://${VIEWER_PACKAGE_DOMAIN_NAME}
- CACHE STRING "FreeBSD package WWW.")
- set(CPACK_FREEBSD_PACKAGE_LICENSE LGPL21
- CACHE STRING "FreeBSD package license.")
- set(CPACK_FREEBSD_PACKAGE_MAINTAINER $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME}
- CACHE STRING "FreeBSD package maintainer.")
- set(CPACK_FREEBSD_PACKAGE_ORIGIN net/${VIEWER_BINARY_NAME}
- CACHE STRING "FreeBSD package origin.")
- set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;devel/apr;devel/boost-libs;x11-toolkits/fltk;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;graphics/openjpeg;devel/sdl2;multimedia/vlc;audio/libvorbis"
- CACHE STRING "FreeBSD package dependencies.")
- endif ()
+elseif (CMAKE_SYSTEM_NAME MATCHES FreeBSD AND PACKAGE)
+ set(CPACK_BINARY_FREEBSD ON CACHE BOOL "Able to package FreeBSD PKG.")
+ set(CPACK_FREEBSD_PACKAGE_COMMENT ${VIEWER_PACKAGE_COMMENT}
+ CACHE STRING "FreeBSD package comment.")
+ set(CPACK_FREEBSD_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION}
+ CACHE STRING "FreeBSD package description.")
+ set(CPACK_FREEBSD_PACKAGE_WWW https://${VIEWER_PACKAGE_DOMAIN_NAME}
+ CACHE STRING "FreeBSD package WWW.")
+ set(CPACK_FREEBSD_PACKAGE_LICENSE LGPL21
+ CACHE STRING "FreeBSD package license.")
+ set(CPACK_FREEBSD_PACKAGE_MAINTAINER $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME}
+ CACHE STRING "FreeBSD package maintainer.")
+ set(CPACK_FREEBSD_PACKAGE_ORIGIN net/${VIEWER_BINARY_NAME}
+ CACHE STRING "FreeBSD package origin.")
+ set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;devel/apr;devel/boost-libs;x11-toolkits/fltk;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;graphics/openjpeg;devel/sdl2;multimedia/vlc;audio/libvorbis"
+ CACHE STRING "FreeBSD package dependencies.")
endif (LINUX)
if (DARWIN)
+ execute_process(
+ COMMAND ibtool --compile
+ ${CMAKE_CURRENT_BINARY_DIR}/SecondLife.nib
+ ${CMAKE_CURRENT_SOURCE_DIR}/SecondLife.xib
+ )
# These all get set with PROPERTIES. It's not that the property names are
# magically known to CMake -- it's that these names are referenced in the
# Info-SecondLife.plist file in the configure_file() directive below.
@@ -2330,22 +2458,18 @@ if (DARWIN)
set(MACOSX_BUNDLE_BUNDLE_NAME "Megapahit")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}")
- set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Megapahit 2025")
+ set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Megapahit 2026")
set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "SecondLife.nib")
set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "LLApplication")
# https://blog.kitware.com/upcoming-in-cmake-2-8-12-osx-rpath-support/
set(CMAKE_MACOSX_RPATH 1)
-
+
set_target_properties(
${VIEWER_BINARY_NAME}
PROPERTIES
OUTPUT_NAME "${product}"
# From Contents/MacOS/SecondLife, look in Contents/Frameworks
- INSTALL_RPATH "@loader_path/../Frameworks"
- # SIGH, as of 2018-05-24 (cmake 3.11.1) the INSTALL_RPATH property simply
- # does not work. Try this:
- LINK_FLAGS "-rpath @loader_path/../Frameworks"
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist"
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_BUNDLE_GUI_IDENTIFIER}"
MACOSX_BUNDLE TRUE
@@ -2374,6 +2498,7 @@ if (DARWIN)
--arch=${ARCH}
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
+ "--discord=${USE_DISCORD}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
@@ -2385,9 +2510,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
)
endif ()
@@ -2428,6 +2550,7 @@ if (DARWIN)
--arch=${ARCH}
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
+ "--discord=${USE_DISCORD}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
@@ -2440,8 +2563,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 ()
endif (PACKAGE)
@@ -2485,7 +2606,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
@@ -2520,7 +2641,7 @@ if (LL_TESTS)
# llremoteparcelrequest.cpp
llviewerhelputil.cpp
llversioninfo.cpp
-# llvocache.cpp
+# llvocache.cpp
llworldmap.cpp
llworldmipmap.cpp
)
@@ -2529,7 +2650,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
)
@@ -2563,7 +2684,7 @@ if (LL_TESTS)
llworldmap.cpp
llworldmipmap.cpp
PROPERTIES
- LL_TEST_ADDITIONAL_SOURCE_FILES
+ LL_TEST_ADDITIONAL_SOURCE_FILES
tests/llviewertexture_stub.cpp
)
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 25f517d364..8a053f87c3 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -3,5 +3,5 @@
CFBundleName = "Megapahit";
CFBundleShortVersionString = "Megapahit version ${MACOSX_BUNDLE_SHORT_VERSION_STRING}";
-CFBundleGetInfoString = "Megapahit version ${MACOSX_BUNDLE_SHORT_VERSION_STRING}, Copyright 2025 Megapahit.";
+CFBundleGetInfoString = "Megapahit version ${MACOSX_BUNDLE_SHORT_VERSION_STRING}, Copyright 2026 Megapahit.";
diff --git a/indra/newview/FixBundle.cmake.in b/indra/newview/FixBundle.cmake.in
index 829c19e5e4..fbeea05359 100644
--- a/indra/newview/FixBundle.cmake.in
+++ b/indra/newview/FixBundle.cmake.in
@@ -10,21 +10,6 @@ file(CREATE_LINK
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libopenjp2.7.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libopenjp2.7.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libpng16.16.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libpng16.16.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libjpeg.8.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libjpeg.8.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
"../../../../Frameworks/libaprutil-1.0.dylib"
"${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libaprutil-1.0.dylib"
SYMBOLIC
@@ -70,16 +55,6 @@ file(CREATE_LINK
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libboost_regex-mt.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex-mt.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libboost_system-mt.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_system-mt.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
"../../../../Frameworks/libboost_thread-mt.dylib"
"${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_thread-mt.dylib"
SYMBOLIC
@@ -90,28 +65,18 @@ file(CREATE_LINK
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libexpat.1.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libexpat.1.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libfreetype.6.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libfreetype.6.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libbz2.1.0.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbz2.1.0.dylib"
+ "../../../../Frameworks/libboost_regex-mt.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex-mt.dylib"
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libbrotlidec.1.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbrotlidec.1.dylib"
+ "../../../../Frameworks/libboost_system-mt.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_system-mt.dylib"
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libbrotlicommon.1.dylib"
- "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbrotlicommon.1.dylib"
+ "../../../../Frameworks/libexpat.1.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libexpat.1.dylib"
SYMBOLIC
)
file(CREATE_LINK
@@ -139,6 +104,7 @@ fixup_bundle(${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/MacOS/${VIEWER_
file(CHMOD
"${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Alerts).app/Contents/MacOS/DullahanHelper (Alerts)"
"${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (GPU).app/Contents/MacOS/DullahanHelper (GPU)"
"${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Plugin).app/Contents/MacOS/DullahanHelper (Plugin)"
"${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Renderer).app/Contents/MacOS/DullahanHelper (Renderer)"
@@ -183,18 +149,18 @@ execute_process(
COMMAND lipo libboost_url-mt.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libboost_url-mt.dylib
- COMMAND lipo libbrotlicommon.1.1.0.dylib
+ COMMAND lipo libbrotlicommon.1.2.0.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
- -output libbrotlicommon.1.1.0.dylib
- COMMAND lipo libbrotlidec.1.1.0.dylib
+ -output libbrotlicommon.1.2.0.dylib
+ COMMAND lipo libbrotlidec.1.2.0.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
- -output libbrotlidec.1.1.0.dylib
+ -output libbrotlidec.1.2.0.dylib
COMMAND lipo libbz2.1.0.8.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libbz2.1.0.8.dylib
- COMMAND lipo libexpat.1.10.0.dylib
+ COMMAND lipo libexpat.1.11.1.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
- -output libexpat.1.10.0.dylib
+ -output libexpat.1.11.1.dylib
COMMAND lipo libfreetype.6.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libfreetype.6.dylib
@@ -240,9 +206,9 @@ execute_process(
COMMAND lipo libopenal.1.24.2.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libopenal.1.24.2.dylib
- COMMAND lipo libopenjp2.2.5.3.dylib
+ COMMAND lipo libopenjp2.2.5.4.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
- -output libopenjp2.2.5.3.dylib
+ -output libopenjp2.2.5.4.dylib
COMMAND lipo libpng16.16.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libpng16.16.dylib
@@ -276,6 +242,7 @@ execute_process(
COMMAND sudo codesign -f -s ${SIGNING_IDENTITY} --timestamp -o runtime --runtime-version ${CMAKE_OSX_DEPLOYMENT_TARGET}
Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libEGL.dylib
Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libGLESv2.dylib
+ Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libcef_sandbox.dylib
Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libvk_swiftshader.dylib
Frameworks/Chromium\ Embedded\ Framework.framework
Frameworks/libalut.0.dylib
@@ -290,10 +257,11 @@ execute_process(
Frameworks/libboost_system-mt.dylib
Frameworks/libboost_thread-mt.dylib
Frameworks/libboost_url-mt.dylib
- Frameworks/libbrotlicommon.1.1.0.dylib
- Frameworks/libbrotlidec.1.1.0.dylib
+ Frameworks/libbrotlicommon.1.2.0.dylib
+ Frameworks/libbrotlidec.1.2.0.dylib
Frameworks/libbz2.1.0.8.dylib
- Frameworks/libexpat.1.10.0.dylib
+ Frameworks/libdiscord_partner_sdk.dylib
+ Frameworks/libexpat.1.11.1.dylib
Frameworks/libfreetype.6.dylib
Frameworks/libhunspell-1.7.0.dylib
Frameworks/libiconv.2.dylib
@@ -309,7 +277,7 @@ execute_process(
Frameworks/libnghttp2.14.dylib
Frameworks/libogg.0.dylib
Frameworks/libopenal.1.24.2.dylib
- Frameworks/libopenjp2.2.5.3.dylib
+ Frameworks/libopenjp2.2.5.4.dylib
Frameworks/libpng16.16.dylib
Frameworks/libvlc.5.dylib
Frameworks/libvlccore.9.dylib
@@ -319,357 +287,356 @@ execute_process(
Frameworks/libxml2.2.dylib
Frameworks/libz.1.3.1.dylib
Resources/libndofdev.dylib
- Resources/llplugin/media_plugin_cef.dylib
- Resources/llplugin/media_plugin_libvlc.dylib
- Resources/llplugin/plugins/liba52_plugin.dylib
- Resources/llplugin/plugins/libaccess_concat_plugin.dylib
- Resources/llplugin/plugins/libaccess_imem_plugin.dylib
- Resources/llplugin/plugins/libaccess_mms_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_dummy_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_file_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_http_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_livehttp_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_rist_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_shout_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_srt_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_udp_plugin.dylib
- Resources/llplugin/plugins/libaccess_realrtsp_plugin.dylib
- Resources/llplugin/plugins/libaccess_srt_plugin.dylib
- Resources/llplugin/plugins/libadaptive_plugin.dylib
- Resources/llplugin/plugins/libaddonsfsstorage_plugin.dylib
- Resources/llplugin/plugins/libaddonsvorepository_plugin.dylib
- Resources/llplugin/plugins/libadf_plugin.dylib
- Resources/llplugin/plugins/libadjust_plugin.dylib
- Resources/llplugin/plugins/libadpcm_plugin.dylib
- Resources/llplugin/plugins/libadummy_plugin.dylib
- Resources/llplugin/plugins/libaes3_plugin.dylib
- Resources/llplugin/plugins/libafile_plugin.dylib
- Resources/llplugin/plugins/libaiff_plugin.dylib
- Resources/llplugin/plugins/libalphamask_plugin.dylib
- Resources/llplugin/plugins/libamem_plugin.dylib
- Resources/llplugin/plugins/libanaglyph_plugin.dylib
- Resources/llplugin/plugins/libantiflicker_plugin.dylib
- Resources/llplugin/plugins/libaom_plugin.dylib
- Resources/llplugin/plugins/libaraw_plugin.dylib
- Resources/llplugin/plugins/libarchive_plugin.dylib
- Resources/llplugin/plugins/libaribsub_plugin.dylib
- Resources/llplugin/plugins/libasf_plugin.dylib
- Resources/llplugin/plugins/libattachment_plugin.dylib
- Resources/llplugin/plugins/libau_plugin.dylib
- Resources/llplugin/plugins/libaudio_format_plugin.dylib
- Resources/llplugin/plugins/libaudiobargraph_a_plugin.dylib
- Resources/llplugin/plugins/libaudiobargraph_v_plugin.dylib
- Resources/llplugin/plugins/libaudioscrobbler_plugin.dylib
- Resources/llplugin/plugins/libaudiotoolboxmidi_plugin.dylib
- Resources/llplugin/plugins/libauhal_plugin.dylib
- Resources/llplugin/plugins/libavaudiocapture_plugin.dylib
- Resources/llplugin/plugins/libavcapture_plugin.dylib
- Resources/llplugin/plugins/libavcodec_plugin.dylib
- Resources/llplugin/plugins/libavi_plugin.dylib
- Resources/llplugin/plugins/libball_plugin.dylib
- Resources/llplugin/plugins/libblend_plugin.dylib
- Resources/llplugin/plugins/libblendbench_plugin.dylib
- Resources/llplugin/plugins/libbluescreen_plugin.dylib
- Resources/llplugin/plugins/libbluray-awt-j2se-1.3.2.jar
- Resources/llplugin/plugins/libbluray-j2se-1.3.2.jar
- Resources/llplugin/plugins/libbonjour_plugin.dylib
- Resources/llplugin/plugins/libcache_block_plugin.dylib
- Resources/llplugin/plugins/libcache_read_plugin.dylib
- Resources/llplugin/plugins/libcaf_plugin.dylib
- Resources/llplugin/plugins/libcanvas_plugin.dylib
- Resources/llplugin/plugins/libcaopengllayer_plugin.dylib
- Resources/llplugin/plugins/libcc_plugin.dylib
- Resources/llplugin/plugins/libcdda_plugin.dylib
- Resources/llplugin/plugins/libcdg_plugin.dylib
- Resources/llplugin/plugins/libchain_plugin.dylib
- Resources/llplugin/plugins/libchorus_flanger_plugin.dylib
- Resources/llplugin/plugins/libci_filters_plugin.dylib
- Resources/llplugin/plugins/libclone_plugin.dylib
- Resources/llplugin/plugins/libcolorthres_plugin.dylib
- Resources/llplugin/plugins/libcompressor_plugin.dylib
- Resources/llplugin/plugins/libconsole_logger_plugin.dylib
- Resources/llplugin/plugins/libcroppadd_plugin.dylib
- Resources/llplugin/plugins/libcvdsub_plugin.dylib
- Resources/llplugin/plugins/libcvpx_plugin.dylib
- Resources/llplugin/plugins/libdav1d_plugin.dylib
- Resources/llplugin/plugins/libdca_plugin.dylib
- Resources/llplugin/plugins/libdcp_plugin.dylib
- Resources/llplugin/plugins/libddummy_plugin.dylib
- Resources/llplugin/plugins/libdecomp_plugin.dylib
- Resources/llplugin/plugins/libdeinterlace_plugin.dylib
- Resources/llplugin/plugins/libdemux_cdg_plugin.dylib
- Resources/llplugin/plugins/libdemux_chromecast_plugin.dylib
- Resources/llplugin/plugins/libdemux_stl_plugin.dylib
- Resources/llplugin/plugins/libdemuxdump_plugin.dylib
- Resources/llplugin/plugins/libdiracsys_plugin.dylib
- Resources/llplugin/plugins/libdirectory_demux_plugin.dylib
- Resources/llplugin/plugins/libdolby_surround_decoder_plugin.dylib
- Resources/llplugin/plugins/libdummy_plugin.dylib
- Resources/llplugin/plugins/libdvbsub_plugin.dylib
- Resources/llplugin/plugins/libdvdnav_plugin.dylib
- Resources/llplugin/plugins/libdvdread_plugin.dylib
- Resources/llplugin/plugins/libdynamicoverlay_plugin.dylib
- Resources/llplugin/plugins/libedgedetection_plugin.dylib
- Resources/llplugin/plugins/libedummy_plugin.dylib
- Resources/llplugin/plugins/libequalizer_plugin.dylib
- Resources/llplugin/plugins/liberase_plugin.dylib
- Resources/llplugin/plugins/libes_plugin.dylib
- Resources/llplugin/plugins/libexport_plugin.dylib
- Resources/llplugin/plugins/libextract_plugin.dylib
- Resources/llplugin/plugins/libfaad_plugin.dylib
- Resources/llplugin/plugins/libfile_keystore_plugin.dylib
- Resources/llplugin/plugins/libfile_logger_plugin.dylib
- Resources/llplugin/plugins/libfilesystem_plugin.dylib
- Resources/llplugin/plugins/libfingerprinter_plugin.dylib
- Resources/llplugin/plugins/libflac_plugin.dylib
- Resources/llplugin/plugins/libflacsys_plugin.dylib
- Resources/llplugin/plugins/libflaschen_plugin.dylib
- Resources/llplugin/plugins/libfloat_mixer_plugin.dylib
- Resources/llplugin/plugins/libfolder_plugin.dylib
- Resources/llplugin/plugins/libfps_plugin.dylib
- Resources/llplugin/plugins/libfreetype_plugin.dylib
- Resources/llplugin/plugins/libfreeze_plugin.dylib
- Resources/llplugin/plugins/libftp_plugin.dylib
- Resources/llplugin/plugins/libg711_plugin.dylib
- Resources/llplugin/plugins/libgain_plugin.dylib
- Resources/llplugin/plugins/libgaussianblur_plugin.dylib
- Resources/llplugin/plugins/libgestures_plugin.dylib
- Resources/llplugin/plugins/libglconv_cvpx_plugin.dylib
- Resources/llplugin/plugins/libgme_plugin.dylib
- Resources/llplugin/plugins/libgnutls_plugin.dylib
- Resources/llplugin/plugins/libgoom_plugin.dylib
- Resources/llplugin/plugins/libgradfun_plugin.dylib
- Resources/llplugin/plugins/libgradient_plugin.dylib
- Resources/llplugin/plugins/libgrain_plugin.dylib
- Resources/llplugin/plugins/libgrey_yuv_plugin.dylib
- Resources/llplugin/plugins/libh26x_plugin.dylib
- Resources/llplugin/plugins/libhds_plugin.dylib
- Resources/llplugin/plugins/libheadphone_channel_mixer_plugin.dylib
- Resources/llplugin/plugins/libhotkeys_plugin.dylib
- Resources/llplugin/plugins/libhqdn3d_plugin.dylib
- Resources/llplugin/plugins/libhttp_plugin.dylib
- Resources/llplugin/plugins/libhttps_plugin.dylib
- Resources/llplugin/plugins/libi420_10_p010_plugin.dylib
- Resources/llplugin/plugins/libi420_nv12_plugin.dylib
- Resources/llplugin/plugins/libi420_rgb_mmx_plugin.dylib
- Resources/llplugin/plugins/libi420_rgb_plugin.dylib
- Resources/llplugin/plugins/libi420_rgb_sse2_plugin.dylib
- Resources/llplugin/plugins/libi420_yuy2_mmx_plugin.dylib
- Resources/llplugin/plugins/libi420_yuy2_plugin.dylib
- Resources/llplugin/plugins/libi420_yuy2_sse2_plugin.dylib
- Resources/llplugin/plugins/libi422_i420_plugin.dylib
- Resources/llplugin/plugins/libi422_yuy2_mmx_plugin.dylib
- Resources/llplugin/plugins/libi422_yuy2_plugin.dylib
- Resources/llplugin/plugins/libi422_yuy2_sse2_plugin.dylib
- Resources/llplugin/plugins/libidummy_plugin.dylib
- Resources/llplugin/plugins/libimage_plugin.dylib
- Resources/llplugin/plugins/libimem_plugin.dylib
- Resources/llplugin/plugins/libinflate_plugin.dylib
- Resources/llplugin/plugins/libinteger_mixer_plugin.dylib
- Resources/llplugin/plugins/libinvert_plugin.dylib
- Resources/llplugin/plugins/libjpeg_plugin.dylib
- Resources/llplugin/plugins/libkaraoke_plugin.dylib
- Resources/llplugin/plugins/libkate_plugin.dylib
- Resources/llplugin/plugins/libkeychain_plugin.dylib
- Resources/llplugin/plugins/liblibass_plugin.dylib
- Resources/llplugin/plugins/liblibbluray_plugin.dylib
- Resources/llplugin/plugins/liblibmpeg2_plugin.dylib
- Resources/llplugin/plugins/liblive555_plugin.dylib
- Resources/llplugin/plugins/liblogger_plugin.dylib
- Resources/llplugin/plugins/liblogo_plugin.dylib
- Resources/llplugin/plugins/liblpcm_plugin.dylib
- Resources/llplugin/plugins/liblua_plugin.dylib
- Resources/llplugin/plugins/libmacosx_plugin.dylib
- Resources/llplugin/plugins/libmad_plugin.dylib
- Resources/llplugin/plugins/libmagnify_plugin.dylib
- Resources/llplugin/plugins/libmarq_plugin.dylib
- Resources/llplugin/plugins/libmediadirs_plugin.dylib
- Resources/llplugin/plugins/libmemory_keystore_plugin.dylib
- Resources/llplugin/plugins/libmirror_plugin.dylib
- Resources/llplugin/plugins/libmjpeg_plugin.dylib
- Resources/llplugin/plugins/libmkv_plugin.dylib
- Resources/llplugin/plugins/libmod_plugin.dylib
- Resources/llplugin/plugins/libmono_plugin.dylib
- Resources/llplugin/plugins/libmosaic_plugin.dylib
- Resources/llplugin/plugins/libmotion_plugin.dylib
- Resources/llplugin/plugins/libmotionblur_plugin.dylib
- Resources/llplugin/plugins/libmotiondetect_plugin.dylib
- Resources/llplugin/plugins/libmp4_plugin.dylib
- Resources/llplugin/plugins/libmpc_plugin.dylib
- Resources/llplugin/plugins/libmpg123_plugin.dylib
- Resources/llplugin/plugins/libmpgv_plugin.dylib
- Resources/llplugin/plugins/libmux_asf_plugin.dylib
- Resources/llplugin/plugins/libmux_avi_plugin.dylib
- Resources/llplugin/plugins/libmux_dummy_plugin.dylib
- Resources/llplugin/plugins/libmux_mp4_plugin.dylib
- Resources/llplugin/plugins/libmux_mpjpeg_plugin.dylib
- Resources/llplugin/plugins/libmux_ogg_plugin.dylib
- Resources/llplugin/plugins/libmux_ps_plugin.dylib
- Resources/llplugin/plugins/libmux_ts_plugin.dylib
- Resources/llplugin/plugins/libmux_wav_plugin.dylib
- Resources/llplugin/plugins/libncurses_plugin.dylib
- Resources/llplugin/plugins/libnetsync_plugin.dylib
- Resources/llplugin/plugins/libnfs_plugin.dylib
- Resources/llplugin/plugins/libnormvol_plugin.dylib
- Resources/llplugin/plugins/libnoseek_plugin.dylib
- Resources/llplugin/plugins/libnsc_plugin.dylib
- Resources/llplugin/plugins/libnsspeechsynthesizer_plugin.dylib
- Resources/llplugin/plugins/libnsv_plugin.dylib
- Resources/llplugin/plugins/libnuv_plugin.dylib
- Resources/llplugin/plugins/libogg_plugin.dylib
- Resources/llplugin/plugins/liboggspots_plugin.dylib
- Resources/llplugin/plugins/liboldmovie_plugin.dylib
- Resources/llplugin/plugins/liboldrc_plugin.dylib
- Resources/llplugin/plugins/libopus_plugin.dylib
- Resources/llplugin/plugins/libosx_notifications_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_a52_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_av1_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_copy_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_dirac_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_dts_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_flac_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_h264_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_hevc_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mlp_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mpeg4audio_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mpeg4video_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mpegaudio_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mpegvideo_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_vc1_plugin.dylib
- Resources/llplugin/plugins/libparam_eq_plugin.dylib
- Resources/llplugin/plugins/libplaylist_plugin.dylib
- Resources/llplugin/plugins/libpng_plugin.dylib
- Resources/llplugin/plugins/libpodcast_plugin.dylib
- Resources/llplugin/plugins/libposterize_plugin.dylib
- Resources/llplugin/plugins/libpostproc_plugin.dylib
- Resources/llplugin/plugins/libprefetch_plugin.dylib
- Resources/llplugin/plugins/libps_plugin.dylib
- Resources/llplugin/plugins/libpsychedelic_plugin.dylib
- Resources/llplugin/plugins/libpuzzle_plugin.dylib
- Resources/llplugin/plugins/libpva_plugin.dylib
- Resources/llplugin/plugins/librawaud_plugin.dylib
- Resources/llplugin/plugins/librawdv_plugin.dylib
- Resources/llplugin/plugins/librawvid_plugin.dylib
- Resources/llplugin/plugins/librawvideo_plugin.dylib
- Resources/llplugin/plugins/libreal_plugin.dylib
- Resources/llplugin/plugins/librecord_plugin.dylib
- Resources/llplugin/plugins/libremap_plugin.dylib
- Resources/llplugin/plugins/libremoteosd_plugin.dylib
- Resources/llplugin/plugins/libripple_plugin.dylib
- Resources/llplugin/plugins/librist_plugin.dylib
- Resources/llplugin/plugins/librotate_plugin.dylib
- Resources/llplugin/plugins/librss_plugin.dylib
- Resources/llplugin/plugins/librtp_plugin.dylib
- Resources/llplugin/plugins/librtpvideo_plugin.dylib
- Resources/llplugin/plugins/librv32_plugin.dylib
- Resources/llplugin/plugins/libsamplerate_plugin.dylib
- Resources/llplugin/plugins/libsap_plugin.dylib
- Resources/llplugin/plugins/libsatip_plugin.dylib
- Resources/llplugin/plugins/libscale_plugin.dylib
- Resources/llplugin/plugins/libscaletempo_pitch_plugin.dylib
- Resources/llplugin/plugins/libscaletempo_plugin.dylib
- Resources/llplugin/plugins/libscene_plugin.dylib
- Resources/llplugin/plugins/libschroedinger_plugin.dylib
- Resources/llplugin/plugins/libscreen_plugin.dylib
- Resources/llplugin/plugins/libscte18_plugin.dylib
- Resources/llplugin/plugins/libscte27_plugin.dylib
- Resources/llplugin/plugins/libsdp_plugin.dylib
- Resources/llplugin/plugins/libsecuretransport_plugin.dylib
- Resources/llplugin/plugins/libsepia_plugin.dylib
- Resources/llplugin/plugins/libsftp_plugin.dylib
- Resources/llplugin/plugins/libsharpen_plugin.dylib
- Resources/llplugin/plugins/libshm_plugin.dylib
- Resources/llplugin/plugins/libsid_plugin.dylib
- Resources/llplugin/plugins/libsimple_channel_mixer_plugin.dylib
- Resources/llplugin/plugins/libskiptags_plugin.dylib
- Resources/llplugin/plugins/libsmf_plugin.dylib
- Resources/llplugin/plugins/libspatialaudio_plugin.dylib
- Resources/llplugin/plugins/libspatializer_plugin.dylib
- Resources/llplugin/plugins/libspdif_plugin.dylib
- Resources/llplugin/plugins/libspeex_plugin.dylib
- Resources/llplugin/plugins/libspeex_resampler_plugin.dylib
- Resources/llplugin/plugins/libspudec_plugin.dylib
- Resources/llplugin/plugins/libstats_plugin.dylib
- Resources/llplugin/plugins/libstereo_widen_plugin.dylib
- Resources/llplugin/plugins/libstl_plugin.dylib
- Resources/llplugin/plugins/libstream_out_autodel_plugin.dylib
- Resources/llplugin/plugins/libstream_out_bridge_plugin.dylib
- Resources/llplugin/plugins/libstream_out_chromaprint_plugin.dylib
- Resources/llplugin/plugins/libstream_out_chromecast_plugin.dylib
- Resources/llplugin/plugins/libstream_out_cycle_plugin.dylib
- Resources/llplugin/plugins/libstream_out_delay_plugin.dylib
- Resources/llplugin/plugins/libstream_out_description_plugin.dylib
- Resources/llplugin/plugins/libstream_out_display_plugin.dylib
- Resources/llplugin/plugins/libstream_out_dummy_plugin.dylib
- Resources/llplugin/plugins/libstream_out_duplicate_plugin.dylib
- Resources/llplugin/plugins/libstream_out_es_plugin.dylib
- Resources/llplugin/plugins/libstream_out_gather_plugin.dylib
- Resources/llplugin/plugins/libstream_out_mosaic_bridge_plugin.dylib
- Resources/llplugin/plugins/libstream_out_record_plugin.dylib
- Resources/llplugin/plugins/libstream_out_rtp_plugin.dylib
- Resources/llplugin/plugins/libstream_out_setid_plugin.dylib
- Resources/llplugin/plugins/libstream_out_smem_plugin.dylib
- Resources/llplugin/plugins/libstream_out_standard_plugin.dylib
- Resources/llplugin/plugins/libstream_out_stats_plugin.dylib
- Resources/llplugin/plugins/libstream_out_transcode_plugin.dylib
- Resources/llplugin/plugins/libsubsdec_plugin.dylib
- Resources/llplugin/plugins/libsubsdelay_plugin.dylib
- Resources/llplugin/plugins/libsubstx3g_plugin.dylib
- Resources/llplugin/plugins/libsubsusf_plugin.dylib
- Resources/llplugin/plugins/libsubtitle_plugin.dylib
- Resources/llplugin/plugins/libsvcdsub_plugin.dylib
- Resources/llplugin/plugins/libswscale_plugin.dylib
- Resources/llplugin/plugins/libsyslog_plugin.dylib
- Resources/llplugin/plugins/libt140_plugin.dylib
- Resources/llplugin/plugins/libtaglib_plugin.dylib
- Resources/llplugin/plugins/libtcp_plugin.dylib
- Resources/llplugin/plugins/libtdummy_plugin.dylib
- Resources/llplugin/plugins/libtelx_plugin.dylib
- Resources/llplugin/plugins/libtextst_plugin.dylib
- Resources/llplugin/plugins/libtheora_plugin.dylib
- Resources/llplugin/plugins/libtimecode_plugin.dylib
- Resources/llplugin/plugins/libtospdif_plugin.dylib
- Resources/llplugin/plugins/libtransform_plugin.dylib
- Resources/llplugin/plugins/libtrivial_channel_mixer_plugin.dylib
- Resources/llplugin/plugins/libts_plugin.dylib
- Resources/llplugin/plugins/libtta_plugin.dylib
- Resources/llplugin/plugins/libttml_plugin.dylib
- Resources/llplugin/plugins/libtwolame_plugin.dylib
- Resources/llplugin/plugins/libty_plugin.dylib
- Resources/llplugin/plugins/libudp_plugin.dylib
- Resources/llplugin/plugins/libugly_resampler_plugin.dylib
- Resources/llplugin/plugins/libuleaddvaudio_plugin.dylib
- Resources/llplugin/plugins/libupnp_plugin.dylib
- Resources/llplugin/plugins/libvc1_plugin.dylib
- Resources/llplugin/plugins/libvcd_plugin.dylib
- Resources/llplugin/plugins/libvdr_plugin.dylib
- Resources/llplugin/plugins/libvdummy_plugin.dylib
- Resources/llplugin/plugins/libvhs_plugin.dylib
- Resources/llplugin/plugins/libvideotoolbox_plugin.dylib
- Resources/llplugin/plugins/libvisual_plugin.dylib
- Resources/llplugin/plugins/libvlc.5.dylib
- Resources/llplugin/plugins/libvlccore.9.dylib
- Resources/llplugin/plugins/libvmem_plugin.dylib
- Resources/llplugin/plugins/libvobsub_plugin.dylib
- Resources/llplugin/plugins/libvoc_plugin.dylib
- Resources/llplugin/plugins/libvod_rtsp_plugin.dylib
- Resources/llplugin/plugins/libvorbis_plugin.dylib
- Resources/llplugin/plugins/libvout_macosx_plugin.dylib
- Resources/llplugin/plugins/libvpx_plugin.dylib
- Resources/llplugin/plugins/libwall_plugin.dylib
- Resources/llplugin/plugins/libwav_plugin.dylib
- Resources/llplugin/plugins/libwave_plugin.dylib
- Resources/llplugin/plugins/libwebvtt_plugin.dylib
- Resources/llplugin/plugins/libx26410b_plugin.dylib
- Resources/llplugin/plugins/libx264_plugin.dylib
- Resources/llplugin/plugins/libx265_plugin.dylib
- Resources/llplugin/plugins/libxa_plugin.dylib
- Resources/llplugin/plugins/libxml_plugin.dylib
- Resources/llplugin/plugins/libyuv_plugin.dylib
- Resources/llplugin/plugins/libyuvp_plugin.dylib
- Resources/llplugin/plugins/libyuy2_i420_plugin.dylib
- Resources/llplugin/plugins/libyuy2_i422_plugin.dylib
- Resources/llplugin/plugins/libzvbi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/media_plugin_cef.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/media_plugin_libvlc.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_concat_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_imem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_mms_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_dummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_file_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_http_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_livehttp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_rist_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_shout_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_srt_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_udp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_realrtsp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_srt_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadaptive_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaddonsfsstorage_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaddonsvorepository_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadjust_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadpcm_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaes3_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libafile_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaiff_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libalphamask_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libamem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libanaglyph_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libantiflicker_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaom_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaraw_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libarchive_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaribsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libasf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libattachment_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libau_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudio_format_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiobargraph_a_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiobargraph_v_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudioscrobbler_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiotoolboxmidi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libauhal_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libavaudiocapture_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libavcapture_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libavcodec_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libavi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libball_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libblend_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libblendbench_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluescreen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluray-awt-j2se-1.4.0.jar
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluray-j2se-1.4.0.jar
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libbonjour_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcache_block_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcache_read_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcaf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcanvas_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcaopengllayer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcdda_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcdg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libchain_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libchorus_flanger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libci_filters_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libclone_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcolorthres_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcompressor_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libconsole_logger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcroppadd_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcvdsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcvpx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdav1d_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdcp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libddummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdecomp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdeinterlace_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_cdg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_chromecast_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_stl_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemuxdump_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdiracsys_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdirectory_demux_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdmxmus_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdolby_surround_decoder_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvbsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvdnav_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvdread_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdynamicoverlay_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libedgedetection_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libedummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libequalizer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liberase_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libes_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libexport_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libextract_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfaad_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfile_keystore_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfile_logger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfilesystem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfingerprinter_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libflac_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libflacsys_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libflaschen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfloat_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfolder_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfps_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfreetype_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfreeze_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libftp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libg711_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgain_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgaussianblur_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgestures_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libglconv_cvpx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgme_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgnutls_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgoom_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgradfun_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgradient_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgrain_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgrey_yuv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libh26x_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhds_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libheadphone_channel_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhotkeys_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhqdn3d_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhttp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhttps_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_10_p010_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_nv12_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_mmx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_sse2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_mmx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_sse2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_i420_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_mmx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_sse2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libidummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libimage_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libimem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libinflate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libinteger_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libinvert_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libjpeg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libkaraoke_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libkate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libkeychain_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblibass_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblibbluray_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblive555_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblogger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblogo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblpcm_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblua_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmacosx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmad_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmagnify_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmarq_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmediadirs_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmemory_keystore_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmirror_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmjpeg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmkv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmod_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmono_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmosaic_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotion_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotionblur_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotiondetect_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmp4_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpg123_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpgv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_asf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_avi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_dummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_mp4_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_mpjpeg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ogg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ps_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ts_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_wav_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libncurses_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnetsync_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnfs_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnormvol_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnoseek_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsspeechsynthesizer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnuv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libogg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liboggspots_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liboldmovie_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liboldrc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libopus_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libosx_notifications_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_a52_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_av1_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_copy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_dirac_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_dts_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_flac_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_h264_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_hevc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mlp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpeg4audio_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpeg4video_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpegaudio_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpegvideo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_vc1_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libparam_eq_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libplaylist_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpng_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpodcast_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libposterize_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpostproc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libprefetch_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libps_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpsychedelic_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpuzzle_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpva_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librawaud_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librawdv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librawvid_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librawvideo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libreal_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librecord_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libremap_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libremoteosd_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libripple_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librist_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librotate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librss_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librtp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librtpvideo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librv32_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsamplerate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsap_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsatip_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscale_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscaletempo_pitch_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscaletempo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscene_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libschroedinger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscreen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscte18_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscte27_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsdp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsecuretransport_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsepia_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsftp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsharpen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libshm_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsid_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsimple_channel_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libskiptags_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsmf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspatialaudio_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspatializer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspdif_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspeex_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspeex_resampler_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspudec_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstats_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstereo_widen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstl_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_autodel_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_bridge_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_chromaprint_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_chromecast_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_cycle_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_delay_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_description_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_display_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_dummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_duplicate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_es_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_gather_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_mosaic_bridge_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_record_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_rtp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_setid_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_smem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_standard_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_stats_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_transcode_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsdec_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsdelay_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubstx3g_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsusf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubtitle_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsvcdsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libswscale_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsyslog_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libt140_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtaglib_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtcp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtdummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtelx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtextst_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtheora_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtimecode_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtospdif_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtransform_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtrivial_channel_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libts_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtta_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libttml_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtwolame_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libty_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libudp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libugly_resampler_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libuleaddvaudio_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libupnp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvc1_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvcd_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvdr_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvdummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvhs_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvideotoolbox_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvisual_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvlc.5.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvlccore.9.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvmem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvobsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvoc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvod_rtsp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvorbis_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvout_macosx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvpx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libwall_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libwav_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libwave_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libwebvtt_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libx26410b_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libx264_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libx265_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libxa_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libxml_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuvp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuy2_i420_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuy2_i422_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libzvbi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(Alerts\).app/Contents/MacOS/DullahanHelper\ \(Alerts\)
Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(GPU\).app/Contents/MacOS/DullahanHelper\ \(GPU\)
Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(Plugin\).app/Contents/MacOS/DullahanHelper\ \(Plugin\)
WORKING_DIRECTORY ${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents
@@ -682,6 +649,7 @@ execute_process(
DullahanHelper\ \(Renderer\).app/Contents/MacOS/DullahanHelper\ \(Renderer\)
COMMAND sudo codesign -f -s ${SIGNING_IDENTITY} --timestamp -o runtime --runtime-version ${CMAKE_OSX_DEPLOYMENT_TARGET}
--deep
+ DullahanHelper\ \(Alerts\).app
DullahanHelper\ \(GPU\).app
DullahanHelper\ \(Plugin\).app
WORKING_DIRECTORY ${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks
diff --git a/indra/newview/FixPackage.cmake.in b/indra/newview/FixPackage.cmake.in
index 49f7b75b4d..17272f5881 100644
--- a/indra/newview/FixPackage.cmake.in
+++ b/indra/newview/FixPackage.cmake.in
@@ -10,21 +10,6 @@ file(CREATE_LINK
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libopenjp2.7.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libopenjp2.7.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libpng16.16.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libpng16.16.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libjpeg.8.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libjpeg.8.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
"../../../../Frameworks/libaprutil-1.0.dylib"
"${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libaprutil-1.0.dylib"
SYMBOLIC
@@ -70,16 +55,6 @@ file(CREATE_LINK
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libboost_regex-mt.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex-mt.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libboost_system-mt.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_system-mt.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
"../../../../Frameworks/libboost_thread-mt.dylib"
"${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_thread-mt.dylib"
SYMBOLIC
@@ -90,28 +65,18 @@ file(CREATE_LINK
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libexpat.1.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libexpat.1.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libfreetype.6.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libfreetype.6.dylib"
- SYMBOLIC
- )
-file(CREATE_LINK
- "../../../../Frameworks/libbz2.1.0.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbz2.1.0.dylib"
+ "../../../../Frameworks/libboost_regex-mt.dylib"
+ "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex-mt.dylib"
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libbrotlidec.1.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbrotlidec.1.dylib"
+ "../../../../Frameworks/libboost_system-mt.dylib"
+ "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_system-mt.dylib"
SYMBOLIC
)
file(CREATE_LINK
- "../../../../Frameworks/libbrotlicommon.1.dylib"
- "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbrotlicommon.1.dylib"
+ "../../../../Frameworks/libexpat.1.dylib"
+ "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libexpat.1.dylib"
SYMBOLIC
)
file(CREATE_LINK
@@ -139,6 +104,7 @@ fixup_bundle(${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/
file(CHMOD
"${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper"
+ "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Alerts).app/Contents/MacOS/DullahanHelper (Alerts)"
"${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (GPU).app/Contents/MacOS/DullahanHelper (GPU)"
"${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Plugin).app/Contents/MacOS/DullahanHelper (Plugin)"
"${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Renderer).app/Contents/MacOS/DullahanHelper (Renderer)"
@@ -183,18 +149,18 @@ execute_process(
COMMAND lipo libboost_url-mt.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libboost_url-mt.dylib
- COMMAND lipo libbrotlicommon.1.1.0.dylib
+ COMMAND lipo libbrotlicommon.1.2.0.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
- -output libbrotlicommon.1.1.0.dylib
- COMMAND lipo libbrotlidec.1.1.0.dylib
+ -output libbrotlicommon.1.2.0.dylib
+ COMMAND lipo libbrotlidec.1.2.0.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
- -output libbrotlidec.1.1.0.dylib
+ -output libbrotlidec.1.2.0.dylib
COMMAND lipo libbz2.1.0.8.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libbz2.1.0.8.dylib
- COMMAND lipo libexpat.1.10.0.dylib
+ COMMAND lipo libexpat.1.11.1.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
- -output libexpat.1.10.0.dylib
+ -output libexpat.1.11.1.dylib
COMMAND lipo libfreetype.6.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libfreetype.6.dylib
@@ -240,9 +206,9 @@ execute_process(
COMMAND lipo libopenal.1.24.2.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libopenal.1.24.2.dylib
- COMMAND lipo libopenjp2.2.5.3.dylib
+ COMMAND lipo libopenjp2.2.5.4.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
- -output libopenjp2.2.5.3.dylib
+ -output libopenjp2.2.5.4.dylib
COMMAND lipo libpng16.16.dylib
-thin ${CMAKE_OSX_ARCHITECTURES}
-output libpng16.16.dylib
@@ -276,6 +242,7 @@ execute_process(
COMMAND sudo codesign -f -s ${SIGNING_IDENTITY} --timestamp -o runtime --runtime-version ${CMAKE_OSX_DEPLOYMENT_TARGET}
Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libEGL.dylib
Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libGLESv2.dylib
+ Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libcef_sandbox.dylib
Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libvk_swiftshader.dylib
Frameworks/Chromium\ Embedded\ Framework.framework
Frameworks/libalut.0.dylib
@@ -290,10 +257,11 @@ execute_process(
Frameworks/libboost_system-mt.dylib
Frameworks/libboost_thread-mt.dylib
Frameworks/libboost_url-mt.dylib
- Frameworks/libbrotlicommon.1.1.0.dylib
- Frameworks/libbrotlidec.1.1.0.dylib
+ Frameworks/libbrotlicommon.1.2.0.dylib
+ Frameworks/libbrotlidec.1.2.0.dylib
Frameworks/libbz2.1.0.8.dylib
- Frameworks/libexpat.1.10.0.dylib
+ Frameworks/libdiscord_partner_sdk.dylib
+ Frameworks/libexpat.1.11.1.dylib
Frameworks/libfreetype.6.dylib
Frameworks/libhunspell-1.7.0.dylib
Frameworks/libiconv.2.dylib
@@ -309,7 +277,7 @@ execute_process(
Frameworks/libnghttp2.14.dylib
Frameworks/libogg.0.dylib
Frameworks/libopenal.1.24.2.dylib
- Frameworks/libopenjp2.2.5.3.dylib
+ Frameworks/libopenjp2.2.5.4.dylib
Frameworks/libpng16.16.dylib
Frameworks/libvlc.5.dylib
Frameworks/libvlccore.9.dylib
@@ -319,358 +287,357 @@ execute_process(
Frameworks/libxml2.2.dylib
Frameworks/libz.1.3.1.dylib
Resources/libndofdev.dylib
- Resources/llplugin/media_plugin_cef.dylib
- Resources/llplugin/media_plugin_libvlc.dylib
- Resources/llplugin/plugins/liba52_plugin.dylib
- Resources/llplugin/plugins/libaccess_concat_plugin.dylib
- Resources/llplugin/plugins/libaccess_imem_plugin.dylib
- Resources/llplugin/plugins/libaccess_mms_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_dummy_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_file_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_http_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_livehttp_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_rist_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_shout_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_srt_plugin.dylib
- Resources/llplugin/plugins/libaccess_output_udp_plugin.dylib
- Resources/llplugin/plugins/libaccess_realrtsp_plugin.dylib
- Resources/llplugin/plugins/libaccess_srt_plugin.dylib
- Resources/llplugin/plugins/libadaptive_plugin.dylib
- Resources/llplugin/plugins/libaddonsfsstorage_plugin.dylib
- Resources/llplugin/plugins/libaddonsvorepository_plugin.dylib
- Resources/llplugin/plugins/libadf_plugin.dylib
- Resources/llplugin/plugins/libadjust_plugin.dylib
- Resources/llplugin/plugins/libadpcm_plugin.dylib
- Resources/llplugin/plugins/libadummy_plugin.dylib
- Resources/llplugin/plugins/libaes3_plugin.dylib
- Resources/llplugin/plugins/libafile_plugin.dylib
- Resources/llplugin/plugins/libaiff_plugin.dylib
- Resources/llplugin/plugins/libalphamask_plugin.dylib
- Resources/llplugin/plugins/libamem_plugin.dylib
- Resources/llplugin/plugins/libanaglyph_plugin.dylib
- Resources/llplugin/plugins/libantiflicker_plugin.dylib
- Resources/llplugin/plugins/libaom_plugin.dylib
- Resources/llplugin/plugins/libaraw_plugin.dylib
- Resources/llplugin/plugins/libarchive_plugin.dylib
- Resources/llplugin/plugins/libaribsub_plugin.dylib
- Resources/llplugin/plugins/libasf_plugin.dylib
- Resources/llplugin/plugins/libattachment_plugin.dylib
- Resources/llplugin/plugins/libau_plugin.dylib
- Resources/llplugin/plugins/libaudio_format_plugin.dylib
- Resources/llplugin/plugins/libaudiobargraph_a_plugin.dylib
- Resources/llplugin/plugins/libaudiobargraph_v_plugin.dylib
- Resources/llplugin/plugins/libaudioscrobbler_plugin.dylib
- Resources/llplugin/plugins/libaudiotoolboxmidi_plugin.dylib
- Resources/llplugin/plugins/libauhal_plugin.dylib
- Resources/llplugin/plugins/libavaudiocapture_plugin.dylib
- Resources/llplugin/plugins/libavcapture_plugin.dylib
- Resources/llplugin/plugins/libavcodec_plugin.dylib
- Resources/llplugin/plugins/libavi_plugin.dylib
- Resources/llplugin/plugins/libball_plugin.dylib
- Resources/llplugin/plugins/libblend_plugin.dylib
- Resources/llplugin/plugins/libblendbench_plugin.dylib
- Resources/llplugin/plugins/libbluescreen_plugin.dylib
- Resources/llplugin/plugins/libbluray-awt-j2se-1.3.2.jar
- Resources/llplugin/plugins/libbluray-j2se-1.3.2.jar
- Resources/llplugin/plugins/libbonjour_plugin.dylib
- Resources/llplugin/plugins/libcache_block_plugin.dylib
- Resources/llplugin/plugins/libcache_read_plugin.dylib
- Resources/llplugin/plugins/libcaf_plugin.dylib
- Resources/llplugin/plugins/libcanvas_plugin.dylib
- Resources/llplugin/plugins/libcaopengllayer_plugin.dylib
- Resources/llplugin/plugins/libcc_plugin.dylib
- Resources/llplugin/plugins/libcdda_plugin.dylib
- Resources/llplugin/plugins/libcdg_plugin.dylib
- Resources/llplugin/plugins/libchain_plugin.dylib
- Resources/llplugin/plugins/libchorus_flanger_plugin.dylib
- Resources/llplugin/plugins/libci_filters_plugin.dylib
- Resources/llplugin/plugins/libclone_plugin.dylib
- Resources/llplugin/plugins/libcolorthres_plugin.dylib
- Resources/llplugin/plugins/libcompressor_plugin.dylib
- Resources/llplugin/plugins/libconsole_logger_plugin.dylib
- Resources/llplugin/plugins/libcroppadd_plugin.dylib
- Resources/llplugin/plugins/libcvdsub_plugin.dylib
- Resources/llplugin/plugins/libcvpx_plugin.dylib
- Resources/llplugin/plugins/libdav1d_plugin.dylib
- Resources/llplugin/plugins/libdca_plugin.dylib
- Resources/llplugin/plugins/libdcp_plugin.dylib
- Resources/llplugin/plugins/libddummy_plugin.dylib
- Resources/llplugin/plugins/libdecomp_plugin.dylib
- Resources/llplugin/plugins/libdeinterlace_plugin.dylib
- Resources/llplugin/plugins/libdemux_cdg_plugin.dylib
- Resources/llplugin/plugins/libdemux_chromecast_plugin.dylib
- Resources/llplugin/plugins/libdemux_stl_plugin.dylib
- Resources/llplugin/plugins/libdemuxdump_plugin.dylib
- Resources/llplugin/plugins/libdiracsys_plugin.dylib
- Resources/llplugin/plugins/libdirectory_demux_plugin.dylib
- Resources/llplugin/plugins/libdolby_surround_decoder_plugin.dylib
- Resources/llplugin/plugins/libdummy_plugin.dylib
- Resources/llplugin/plugins/libdvbsub_plugin.dylib
- Resources/llplugin/plugins/libdvdnav_plugin.dylib
- Resources/llplugin/plugins/libdvdread_plugin.dylib
- Resources/llplugin/plugins/libdynamicoverlay_plugin.dylib
- Resources/llplugin/plugins/libedgedetection_plugin.dylib
- Resources/llplugin/plugins/libedummy_plugin.dylib
- Resources/llplugin/plugins/libequalizer_plugin.dylib
- Resources/llplugin/plugins/liberase_plugin.dylib
- Resources/llplugin/plugins/libes_plugin.dylib
- Resources/llplugin/plugins/libexport_plugin.dylib
- Resources/llplugin/plugins/libextract_plugin.dylib
- Resources/llplugin/plugins/libfaad_plugin.dylib
- Resources/llplugin/plugins/libfile_keystore_plugin.dylib
- Resources/llplugin/plugins/libfile_logger_plugin.dylib
- Resources/llplugin/plugins/libfilesystem_plugin.dylib
- Resources/llplugin/plugins/libfingerprinter_plugin.dylib
- Resources/llplugin/plugins/libflac_plugin.dylib
- Resources/llplugin/plugins/libflacsys_plugin.dylib
- Resources/llplugin/plugins/libflaschen_plugin.dylib
- Resources/llplugin/plugins/libfloat_mixer_plugin.dylib
- Resources/llplugin/plugins/libfolder_plugin.dylib
- Resources/llplugin/plugins/libfps_plugin.dylib
- Resources/llplugin/plugins/libfreetype_plugin.dylib
- Resources/llplugin/plugins/libfreeze_plugin.dylib
- Resources/llplugin/plugins/libftp_plugin.dylib
- Resources/llplugin/plugins/libg711_plugin.dylib
- Resources/llplugin/plugins/libgain_plugin.dylib
- Resources/llplugin/plugins/libgaussianblur_plugin.dylib
- Resources/llplugin/plugins/libgestures_plugin.dylib
- Resources/llplugin/plugins/libglconv_cvpx_plugin.dylib
- Resources/llplugin/plugins/libgme_plugin.dylib
- Resources/llplugin/plugins/libgnutls_plugin.dylib
- Resources/llplugin/plugins/libgoom_plugin.dylib
- Resources/llplugin/plugins/libgradfun_plugin.dylib
- Resources/llplugin/plugins/libgradient_plugin.dylib
- Resources/llplugin/plugins/libgrain_plugin.dylib
- Resources/llplugin/plugins/libgrey_yuv_plugin.dylib
- Resources/llplugin/plugins/libh26x_plugin.dylib
- Resources/llplugin/plugins/libhds_plugin.dylib
- Resources/llplugin/plugins/libheadphone_channel_mixer_plugin.dylib
- Resources/llplugin/plugins/libhotkeys_plugin.dylib
- Resources/llplugin/plugins/libhqdn3d_plugin.dylib
- Resources/llplugin/plugins/libhttp_plugin.dylib
- Resources/llplugin/plugins/libhttps_plugin.dylib
- Resources/llplugin/plugins/libi420_10_p010_plugin.dylib
- Resources/llplugin/plugins/libi420_nv12_plugin.dylib
- Resources/llplugin/plugins/libi420_rgb_mmx_plugin.dylib
- Resources/llplugin/plugins/libi420_rgb_plugin.dylib
- Resources/llplugin/plugins/libi420_rgb_sse2_plugin.dylib
- Resources/llplugin/plugins/libi420_yuy2_mmx_plugin.dylib
- Resources/llplugin/plugins/libi420_yuy2_plugin.dylib
- Resources/llplugin/plugins/libi420_yuy2_sse2_plugin.dylib
- Resources/llplugin/plugins/libi422_i420_plugin.dylib
- Resources/llplugin/plugins/libi422_yuy2_mmx_plugin.dylib
- Resources/llplugin/plugins/libi422_yuy2_plugin.dylib
- Resources/llplugin/plugins/libi422_yuy2_sse2_plugin.dylib
- Resources/llplugin/plugins/libidummy_plugin.dylib
- Resources/llplugin/plugins/libimage_plugin.dylib
- Resources/llplugin/plugins/libimem_plugin.dylib
- Resources/llplugin/plugins/libinflate_plugin.dylib
- Resources/llplugin/plugins/libinteger_mixer_plugin.dylib
- Resources/llplugin/plugins/libinvert_plugin.dylib
- Resources/llplugin/plugins/libjpeg_plugin.dylib
- Resources/llplugin/plugins/libkaraoke_plugin.dylib
- Resources/llplugin/plugins/libkate_plugin.dylib
- Resources/llplugin/plugins/libkeychain_plugin.dylib
- Resources/llplugin/plugins/liblibass_plugin.dylib
- Resources/llplugin/plugins/liblibbluray_plugin.dylib
- Resources/llplugin/plugins/liblibmpeg2_plugin.dylib
- Resources/llplugin/plugins/liblive555_plugin.dylib
- Resources/llplugin/plugins/liblogger_plugin.dylib
- Resources/llplugin/plugins/liblogo_plugin.dylib
- Resources/llplugin/plugins/liblpcm_plugin.dylib
- Resources/llplugin/plugins/liblua_plugin.dylib
- Resources/llplugin/plugins/libmacosx_plugin.dylib
- Resources/llplugin/plugins/libmad_plugin.dylib
- Resources/llplugin/plugins/libmagnify_plugin.dylib
- Resources/llplugin/plugins/libmarq_plugin.dylib
- Resources/llplugin/plugins/libmediadirs_plugin.dylib
- Resources/llplugin/plugins/libmemory_keystore_plugin.dylib
- Resources/llplugin/plugins/libmirror_plugin.dylib
- Resources/llplugin/plugins/libmjpeg_plugin.dylib
- Resources/llplugin/plugins/libmkv_plugin.dylib
- Resources/llplugin/plugins/libmod_plugin.dylib
- Resources/llplugin/plugins/libmono_plugin.dylib
- Resources/llplugin/plugins/libmosaic_plugin.dylib
- Resources/llplugin/plugins/libmotion_plugin.dylib
- Resources/llplugin/plugins/libmotionblur_plugin.dylib
- Resources/llplugin/plugins/libmotiondetect_plugin.dylib
- Resources/llplugin/plugins/libmp4_plugin.dylib
- Resources/llplugin/plugins/libmpc_plugin.dylib
- Resources/llplugin/plugins/libmpg123_plugin.dylib
- Resources/llplugin/plugins/libmpgv_plugin.dylib
- Resources/llplugin/plugins/libmux_asf_plugin.dylib
- Resources/llplugin/plugins/libmux_avi_plugin.dylib
- Resources/llplugin/plugins/libmux_dummy_plugin.dylib
- Resources/llplugin/plugins/libmux_mp4_plugin.dylib
- Resources/llplugin/plugins/libmux_mpjpeg_plugin.dylib
- Resources/llplugin/plugins/libmux_ogg_plugin.dylib
- Resources/llplugin/plugins/libmux_ps_plugin.dylib
- Resources/llplugin/plugins/libmux_ts_plugin.dylib
- Resources/llplugin/plugins/libmux_wav_plugin.dylib
- Resources/llplugin/plugins/libncurses_plugin.dylib
- Resources/llplugin/plugins/libnetsync_plugin.dylib
- Resources/llplugin/plugins/libnfs_plugin.dylib
- Resources/llplugin/plugins/libnormvol_plugin.dylib
- Resources/llplugin/plugins/libnoseek_plugin.dylib
- Resources/llplugin/plugins/libnsc_plugin.dylib
- Resources/llplugin/plugins/libnsspeechsynthesizer_plugin.dylib
- Resources/llplugin/plugins/libnsv_plugin.dylib
- Resources/llplugin/plugins/libnuv_plugin.dylib
- Resources/llplugin/plugins/libogg_plugin.dylib
- Resources/llplugin/plugins/liboggspots_plugin.dylib
- Resources/llplugin/plugins/liboldmovie_plugin.dylib
- Resources/llplugin/plugins/liboldrc_plugin.dylib
- Resources/llplugin/plugins/libopus_plugin.dylib
- Resources/llplugin/plugins/libosx_notifications_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_a52_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_av1_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_copy_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_dirac_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_dts_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_flac_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_h264_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_hevc_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mlp_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mpeg4audio_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mpeg4video_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mpegaudio_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_mpegvideo_plugin.dylib
- Resources/llplugin/plugins/libpacketizer_vc1_plugin.dylib
- Resources/llplugin/plugins/libparam_eq_plugin.dylib
- Resources/llplugin/plugins/libplaylist_plugin.dylib
- Resources/llplugin/plugins/libpng_plugin.dylib
- Resources/llplugin/plugins/libpodcast_plugin.dylib
- Resources/llplugin/plugins/libposterize_plugin.dylib
- Resources/llplugin/plugins/libpostproc_plugin.dylib
- Resources/llplugin/plugins/libprefetch_plugin.dylib
- Resources/llplugin/plugins/libps_plugin.dylib
- Resources/llplugin/plugins/libpsychedelic_plugin.dylib
- Resources/llplugin/plugins/libpuzzle_plugin.dylib
- Resources/llplugin/plugins/libpva_plugin.dylib
- Resources/llplugin/plugins/librawaud_plugin.dylib
- Resources/llplugin/plugins/librawdv_plugin.dylib
- Resources/llplugin/plugins/librawvid_plugin.dylib
- Resources/llplugin/plugins/librawvideo_plugin.dylib
- Resources/llplugin/plugins/libreal_plugin.dylib
- Resources/llplugin/plugins/librecord_plugin.dylib
- Resources/llplugin/plugins/libremap_plugin.dylib
- Resources/llplugin/plugins/libremoteosd_plugin.dylib
- Resources/llplugin/plugins/libripple_plugin.dylib
- Resources/llplugin/plugins/librist_plugin.dylib
- Resources/llplugin/plugins/librotate_plugin.dylib
- Resources/llplugin/plugins/librss_plugin.dylib
- Resources/llplugin/plugins/librtp_plugin.dylib
- Resources/llplugin/plugins/librtpvideo_plugin.dylib
- Resources/llplugin/plugins/librv32_plugin.dylib
- Resources/llplugin/plugins/libsamplerate_plugin.dylib
- Resources/llplugin/plugins/libsap_plugin.dylib
- Resources/llplugin/plugins/libsatip_plugin.dylib
- Resources/llplugin/plugins/libscale_plugin.dylib
- Resources/llplugin/plugins/libscaletempo_pitch_plugin.dylib
- Resources/llplugin/plugins/libscaletempo_plugin.dylib
- Resources/llplugin/plugins/libscene_plugin.dylib
- Resources/llplugin/plugins/libschroedinger_plugin.dylib
- Resources/llplugin/plugins/libscreen_plugin.dylib
- Resources/llplugin/plugins/libscte18_plugin.dylib
- Resources/llplugin/plugins/libscte27_plugin.dylib
- Resources/llplugin/plugins/libsdp_plugin.dylib
- Resources/llplugin/plugins/libsecuretransport_plugin.dylib
- Resources/llplugin/plugins/libsepia_plugin.dylib
- Resources/llplugin/plugins/libsftp_plugin.dylib
- Resources/llplugin/plugins/libsharpen_plugin.dylib
- Resources/llplugin/plugins/libshm_plugin.dylib
- Resources/llplugin/plugins/libsid_plugin.dylib
- Resources/llplugin/plugins/libsimple_channel_mixer_plugin.dylib
- Resources/llplugin/plugins/libskiptags_plugin.dylib
- Resources/llplugin/plugins/libsmf_plugin.dylib
- Resources/llplugin/plugins/libspatialaudio_plugin.dylib
- Resources/llplugin/plugins/libspatializer_plugin.dylib
- Resources/llplugin/plugins/libspdif_plugin.dylib
- Resources/llplugin/plugins/libspeex_plugin.dylib
- Resources/llplugin/plugins/libspeex_resampler_plugin.dylib
- Resources/llplugin/plugins/libspudec_plugin.dylib
- Resources/llplugin/plugins/libstats_plugin.dylib
- Resources/llplugin/plugins/libstereo_widen_plugin.dylib
- Resources/llplugin/plugins/libstl_plugin.dylib
- Resources/llplugin/plugins/libstream_out_autodel_plugin.dylib
- Resources/llplugin/plugins/libstream_out_bridge_plugin.dylib
- Resources/llplugin/plugins/libstream_out_chromaprint_plugin.dylib
- Resources/llplugin/plugins/libstream_out_chromecast_plugin.dylib
- Resources/llplugin/plugins/libstream_out_cycle_plugin.dylib
- Resources/llplugin/plugins/libstream_out_delay_plugin.dylib
- Resources/llplugin/plugins/libstream_out_description_plugin.dylib
- Resources/llplugin/plugins/libstream_out_display_plugin.dylib
- Resources/llplugin/plugins/libstream_out_dummy_plugin.dylib
- Resources/llplugin/plugins/libstream_out_duplicate_plugin.dylib
- Resources/llplugin/plugins/libstream_out_es_plugin.dylib
- Resources/llplugin/plugins/libstream_out_gather_plugin.dylib
- Resources/llplugin/plugins/libstream_out_mosaic_bridge_plugin.dylib
- Resources/llplugin/plugins/libstream_out_record_plugin.dylib
- Resources/llplugin/plugins/libstream_out_rtp_plugin.dylib
- Resources/llplugin/plugins/libstream_out_setid_plugin.dylib
- Resources/llplugin/plugins/libstream_out_smem_plugin.dylib
- Resources/llplugin/plugins/libstream_out_standard_plugin.dylib
- Resources/llplugin/plugins/libstream_out_stats_plugin.dylib
- Resources/llplugin/plugins/libstream_out_transcode_plugin.dylib
- Resources/llplugin/plugins/libsubsdec_plugin.dylib
- Resources/llplugin/plugins/libsubsdelay_plugin.dylib
- Resources/llplugin/plugins/libsubstx3g_plugin.dylib
- Resources/llplugin/plugins/libsubsusf_plugin.dylib
- Resources/llplugin/plugins/libsubtitle_plugin.dylib
- Resources/llplugin/plugins/libsvcdsub_plugin.dylib
- Resources/llplugin/plugins/libswscale_plugin.dylib
- Resources/llplugin/plugins/libsyslog_plugin.dylib
- Resources/llplugin/plugins/libt140_plugin.dylib
- Resources/llplugin/plugins/libtaglib_plugin.dylib
- Resources/llplugin/plugins/libtcp_plugin.dylib
- Resources/llplugin/plugins/libtdummy_plugin.dylib
- Resources/llplugin/plugins/libtelx_plugin.dylib
- Resources/llplugin/plugins/libtextst_plugin.dylib
- Resources/llplugin/plugins/libtheora_plugin.dylib
- Resources/llplugin/plugins/libtimecode_plugin.dylib
- Resources/llplugin/plugins/libtospdif_plugin.dylib
- Resources/llplugin/plugins/libtransform_plugin.dylib
- Resources/llplugin/plugins/libtrivial_channel_mixer_plugin.dylib
- Resources/llplugin/plugins/libts_plugin.dylib
- Resources/llplugin/plugins/libtta_plugin.dylib
- Resources/llplugin/plugins/libttml_plugin.dylib
- Resources/llplugin/plugins/libtwolame_plugin.dylib
- Resources/llplugin/plugins/libty_plugin.dylib
- Resources/llplugin/plugins/libudp_plugin.dylib
- Resources/llplugin/plugins/libugly_resampler_plugin.dylib
- Resources/llplugin/plugins/libuleaddvaudio_plugin.dylib
- Resources/llplugin/plugins/libupnp_plugin.dylib
- Resources/llplugin/plugins/libvc1_plugin.dylib
- Resources/llplugin/plugins/libvcd_plugin.dylib
- Resources/llplugin/plugins/libvdr_plugin.dylib
- Resources/llplugin/plugins/libvdummy_plugin.dylib
- Resources/llplugin/plugins/libvhs_plugin.dylib
- Resources/llplugin/plugins/libvideotoolbox_plugin.dylib
- Resources/llplugin/plugins/libvisual_plugin.dylib
- Resources/llplugin/plugins/libvlc.5.dylib
- Resources/llplugin/plugins/libvlccore.9.dylib
- Resources/llplugin/plugins/libvmem_plugin.dylib
- Resources/llplugin/plugins/libvobsub_plugin.dylib
- Resources/llplugin/plugins/libvoc_plugin.dylib
- Resources/llplugin/plugins/libvod_rtsp_plugin.dylib
- Resources/llplugin/plugins/libvorbis_plugin.dylib
- Resources/llplugin/plugins/libvout_macosx_plugin.dylib
- Resources/llplugin/plugins/libvpx_plugin.dylib
- Resources/llplugin/plugins/libwall_plugin.dylib
- Resources/llplugin/plugins/libwav_plugin.dylib
- Resources/llplugin/plugins/libwave_plugin.dylib
- Resources/llplugin/plugins/libwebvtt_plugin.dylib
- Resources/llplugin/plugins/libx26410b_plugin.dylib
- Resources/llplugin/plugins/libx264_plugin.dylib
- Resources/llplugin/plugins/libx265_plugin.dylib
- Resources/llplugin/plugins/libxa_plugin.dylib
- Resources/llplugin/plugins/libxml_plugin.dylib
- Resources/llplugin/plugins/libyuv_plugin.dylib
- Resources/llplugin/plugins/libyuvp_plugin.dylib
- Resources/llplugin/plugins/libyuy2_i420_plugin.dylib
- Resources/llplugin/plugins/libyuy2_i422_plugin.dylib
- Resources/llplugin/plugins/libzvbi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/media_plugin_cef.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/media_plugin_libvlc.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_concat_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_imem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_mms_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_dummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_file_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_http_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_livehttp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_rist_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_shout_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_srt_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_udp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_realrtsp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_srt_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadaptive_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaddonsfsstorage_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaddonsvorepository_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadjust_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadpcm_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libadummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaes3_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libafile_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaiff_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libalphamask_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libamem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libanaglyph_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libantiflicker_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaom_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaraw_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libarchive_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaribsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libasf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libattachment_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libau_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudio_format_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiobargraph_a_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiobargraph_v_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudioscrobbler_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiotoolboxmidi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libauhal_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libavaudiocapture_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libavcapture_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libavcodec_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libavi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libball_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libblend_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libblendbench_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluescreen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluray-awt-j2se-1.4.0.jar
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluray-j2se-1.4.0.jar
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libbonjour_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcache_block_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcache_read_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcaf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcanvas_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcaopengllayer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcdda_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcdg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libchain_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libchorus_flanger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libci_filters_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libclone_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcolorthres_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcompressor_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libconsole_logger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcroppadd_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcvdsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libcvpx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdav1d_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdcp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libddummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdecomp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdeinterlace_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_cdg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_chromecast_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_stl_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemuxdump_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdiracsys_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdirectory_demux_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdmxmus_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdolby_surround_decoder_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvbsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvdnav_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvdread_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libdynamicoverlay_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libedgedetection_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libedummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libequalizer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liberase_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libes_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libexport_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libextract_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfaad_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfile_keystore_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfile_logger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfilesystem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfingerprinter_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libflac_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libflacsys_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libflaschen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfloat_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfolder_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfps_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfreetype_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libfreeze_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libftp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libg711_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgain_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgaussianblur_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgestures_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libglconv_cvpx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgme_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgnutls_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgoom_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgradfun_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgradient_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgrain_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libgrey_yuv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libh26x_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhds_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libheadphone_channel_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhotkeys_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhqdn3d_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhttp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libhttps_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_10_p010_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_nv12_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_mmx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_sse2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_mmx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_sse2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_i420_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_mmx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_sse2_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libidummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libimage_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libimem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libinflate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libinteger_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libinvert_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libjpeg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libkaraoke_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libkate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libkeychain_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblibass_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblibbluray_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblive555_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblogger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblogo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblpcm_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liblua_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmacosx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmad_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmagnify_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmarq_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmediadirs_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmemory_keystore_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmirror_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmjpeg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmkv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmod_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmono_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmosaic_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotion_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotionblur_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotiondetect_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmp4_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpg123_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpgv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_asf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_avi_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_dummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_mp4_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_mpjpeg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ogg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ps_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ts_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_wav_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libncurses_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnetsync_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnfs_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnormvol_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnoseek_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsspeechsynthesizer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libnuv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libogg_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liboggspots_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liboldmovie_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/liboldrc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libopus_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libosx_notifications_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_a52_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_av1_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_copy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_dirac_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_dts_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_flac_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_h264_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_hevc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mlp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpeg4audio_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpeg4video_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpegaudio_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpegvideo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_vc1_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libparam_eq_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libplaylist_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpng_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpodcast_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libposterize_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpostproc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libprefetch_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libps_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpsychedelic_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpuzzle_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libpva_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librawaud_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librawdv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librawvid_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librawvideo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libreal_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librecord_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libremap_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libremoteosd_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libripple_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librist_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librotate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librss_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librtp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librtpvideo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/librv32_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsamplerate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsap_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsatip_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscale_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscaletempo_pitch_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscaletempo_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscene_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libschroedinger_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscreen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscte18_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libscte27_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsdp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsecuretransport_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsepia_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsftp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsharpen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libshm_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsid_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsimple_channel_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libskiptags_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsmf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspatialaudio_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspatializer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspdif_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspeex_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspeex_resampler_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libspudec_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstats_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstereo_widen_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstl_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_autodel_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_bridge_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_chromaprint_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_chromecast_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_cycle_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_delay_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_description_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_display_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_dummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_duplicate_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_es_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_gather_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_mosaic_bridge_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_record_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_rtp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_setid_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_smem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_standard_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_stats_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_transcode_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsdec_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsdelay_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubstx3g_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsusf_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubtitle_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsvcdsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libswscale_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libsyslog_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libt140_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtaglib_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtcp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtdummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtelx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtextst_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtheora_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtimecode_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtospdif_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtransform_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtrivial_channel_mixer_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libts_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtta_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libttml_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libtwolame_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libty_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libudp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libugly_resampler_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libuleaddvaudio_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libupnp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvc1_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvcd_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvdr_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvdummy_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvhs_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvideotoolbox_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvisual_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvlc.5.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvlccore.9.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvmem_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvobsub_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvoc_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvod_rtsp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvorbis_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvout_macosx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libvpx_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libwall_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libwav_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libwave_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libwebvtt_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libx26410b_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libx264_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libx265_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libxa_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libxml_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuv_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuvp_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuy2_i420_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuy2_i422_plugin.dylib
+ Resources/SLPlugin.app/Contents/Frameworks/plugins/libzvbi_plugin.dylib
Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper.app
+ Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(Alerts\).app/Contents/MacOS/DullahanHelper\ \(Alerts\)
Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(GPU\).app/Contents/MacOS/DullahanHelper\ \(GPU\)
Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(Plugin\).app/Contents/MacOS/DullahanHelper\ \(Plugin\)
WORKING_DIRECTORY ${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents
@@ -681,6 +648,7 @@ execute_process(
DullahanHelper\ \(Renderer\).app/Contents/MacOS/DullahanHelper\ \(Renderer\)
COMMAND sudo codesign -f -s ${SIGNING_IDENTITY} --timestamp -o runtime --runtime-version ${CMAKE_OSX_DEPLOYMENT_TARGET}
--deep
+ DullahanHelper\ \(Alerts\).app
DullahanHelper\ \(GPU\).app
DullahanHelper\ \(Plugin\).app
WORKING_DIRECTORY ${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks
diff --git a/indra/newview/PKGBUILD.in b/indra/newview/PKGBUILD.in
index 1f0c83cc41..3310c6c601 100644
--- a/indra/newview/PKGBUILD.in
+++ b/indra/newview/PKGBUILD.in
@@ -6,7 +6,7 @@ pkgdesc="${VIEWER_PACKAGE_COMMENT}"
arch=('${CMAKE_SYSTEM_PROCESSOR}')
url="https://${VIEWER_PACKAGE_DOMAIN_NAME}"
license=('LGPL-2.1')
-depends=(apr-util boost-libs fltk glu hunspell libnghttp2 openjpeg2 sdl2 vlc libvorbis)
+depends=(apr-util at-spi2-core boost-libs fltk glu hunspell libnghttp2 openjpeg2 sdl2 vlc libvorbis)
package() {
cd "$startdir"
diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nib
deleted file mode 100644
index ef0fa80b12..0000000000
--- a/indra/newview/SecondLife.nib
+++ /dev/null
Binary files differ
diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib
index 8302392f5d..d123eee79e 100644
--- a/indra/newview/SecondLife.xib
+++ b/indra/newview/SecondLife.xib
@@ -1,1136 +1,193 @@
<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
- <data>
- <int key="IBDocument.SystemTarget">1060</int>
- <string key="IBDocument.SystemVersion">12E55</string>
- <string key="IBDocument.InterfaceBuilderVersion">4457.6</string>
- <string key="IBDocument.AppKitVersion">1187.39</string>
- <string key="IBDocument.HIToolboxVersion">626.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">4457.6</string>
- </object>
- <array key="IBDocument.IntegratedClassDependencies">
- <string>NSCustomObject</string>
- <string>NSMenu</string>
- <string>NSMenuItem</string>
- <string>NSScrollView</string>
- <string>NSScroller</string>
- <string>NSTextView</string>
- <string>NSView</string>
- <string>NSWindowTemplate</string>
- </array>
- <array key="IBDocument.PluginDependencies">
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- </array>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
- <integer value="1" key="NS.object.0"/>
- </object>
- <array class="NSMutableArray" key="IBDocument.RootObjects" id="1048">
- <object class="NSCustomObject" id="1021">
- <string key="NSClassName">NSApplication</string>
- </object>
- <object class="NSCustomObject" id="1014">
- <string key="NSClassName">FirstResponder</string>
- </object>
- <object class="NSCustomObject" id="1050">
- <string key="NSClassName">NSApplication</string>
- </object>
- <object class="NSMenu" id="649796088">
- <string key="NSTitle">Main Menu</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="694149608">
- <reference key="NSMenu" ref="649796088"/>
- <string key="NSTitle">Megapahit</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <object class="NSCustomResource" key="NSOnImage" id="353210768">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuCheckmark</string>
- </object>
- <object class="NSCustomResource" key="NSMixedImage" id="549394948">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuMixedState</string>
- </object>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="110575045">
- <string key="NSTitle">Megapahit</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="238522557">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">About Megapahit</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="304266470">
- <reference key="NSMenu" ref="110575045"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="609285721">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Preferences…</string>
- <string key="NSKeyEquiv">,</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="481834944">
- <reference key="NSMenu" ref="110575045"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="1046388886">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Services</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="752062318">
- <string key="NSTitle">Services</string>
- <array class="NSMutableArray" key="NSMenuItems"/>
- <string key="NSName">_NSServicesMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="646227648">
- <reference key="NSMenu" ref="110575045"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="755159360">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Hide Megapahit</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="342932134">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Hide Others</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1572864</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="908899353">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Show All</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="1056857174">
- <reference key="NSMenu" ref="110575045"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="632727374">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Quit Megapahit</string>
- <string key="NSKeyEquiv">q</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- </array>
- <string key="NSName">_NSAppleMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="725688984">
- <reference key="NSMenu" ref="649796088"/>
- <string key="NSTitle">Edit</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="701759256">
- <string key="NSTitle">Edit</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="521487141">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Undo</string>
- <string key="NSKeyEquiv">z</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="668936019">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Redo</string>
- <string key="NSKeyEquiv">Z</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="383018193">
- <reference key="NSMenu" ref="701759256"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="984623395">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Cut</string>
- <string key="NSKeyEquiv">x</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="656529582">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Copy</string>
- <string key="NSKeyEquiv">c</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="1032676691">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Paste</string>
- <string key="NSKeyEquiv">v</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="538907583">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Select All</string>
- <string key="NSKeyEquiv">a</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- </array>
- </object>
- </object>
- <object class="NSMenuItem" id="713487014">
- <reference key="NSMenu" ref="649796088"/>
- <string key="NSTitle">Window</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="835318025">
- <string key="NSTitle">Window</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="1011231497">
- <reference key="NSMenu" ref="835318025"/>
- <string key="NSTitle">Minimize</string>
- <string key="NSKeyEquiv">m</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="575023229">
- <reference key="NSMenu" ref="835318025"/>
- <string key="NSTitle">Zoom</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="86356408">
- <reference key="NSMenu" ref="835318025"/>
- <string key="NSTitle">Enter Full Screen</string>
- <string key="NSKeyEquiv">f</string>
- <int key="NSKeyEquivModMask">1310720</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="299356726">
- <reference key="NSMenu" ref="835318025"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="625202149">
- <reference key="NSMenu" ref="835318025"/>
- <string key="NSTitle">Bring All to Front</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- </array>
- <string key="NSName">_NSWindowsMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="391199113">
- <reference key="NSMenu" ref="649796088"/>
- <string key="NSTitle">Help</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- </array>
- <string key="NSName">_NSMainMenu</string>
- </object>
- <object class="NSCustomObject" id="756173070">
- <string key="NSClassName">LLAppDelegate</string>
- </object>
- <object class="NSWindowTemplate" id="110292814">
- <int key="NSWindowStyleMask">15</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{196, 240}, {1024, 600}}</string>
- <int key="NSWTFlags">74974208</int>
- <string key="NSWindowTitle">Megapahit</string>
- <string key="NSWindowClass">LLNSWindow</string>
- <nil key="NSViewClass"/>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <object class="NSView" key="NSWindowView" id="305280978">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews"/>
- <string key="NSFrameSize">{1024, 600}</string>
- <reference key="NSSuperview"/>
- <reference key="NSWindow"/>
- <string key="NSReuseIdentifierKey">_NS:20</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
- <string key="NSMaxSize">{10000000000000, 10000000000000}</string>
- <string key="NSFrameAutosaveName">Megapahit</string>
- <int key="NSWindowCollectionBehavior">128</int>
- <bool key="NSWindowIsRestorable">NO</bool>
- </object>
- <object class="NSWindowTemplate" id="979091056">
- <int key="NSWindowStyleMask">31</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{272, 176}, {938, 42}}</string>
- <int key="NSWTFlags">-1535638528</int>
- <string key="NSWindowTitle">Input Window</string>
- <string key="NSWindowClass">LLUserInputWindow</string>
- <nil key="NSViewClass"/>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <object class="NSView" key="NSWindowView" id="1044753903">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSScrollView" id="238626476">
- <reference key="NSNextResponder" ref="1044753903"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSClipView" id="871543330">
- <reference key="NSNextResponder" ref="238626476"/>
- <int key="NSvFlags">2322</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSTextView" id="395788163">
- <reference key="NSNextResponder" ref="871543330"/>
- <int key="NSvFlags">2322</int>
- <set class="NSMutableSet" key="NSDragTypes">
- <string>Apple HTML pasteboard type</string>
- <string>Apple PDF pasteboard type</string>
- <string>Apple PICT pasteboard type</string>
- <string>Apple PNG pasteboard type</string>
- <string>Apple URL pasteboard type</string>
- <string>CorePasteboardFlavorType 0x6D6F6F76</string>
- <string>NSColor pasteboard type</string>
- <string>NSFilenamesPboardType</string>
- <string>NSStringPboardType</string>
- <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
- <string>NeXT RTFD pasteboard type</string>
- <string>NeXT Rich Text Format v1.0 pasteboard type</string>
- <string>NeXT TIFF v4.0 pasteboard type</string>
- <string>NeXT font pasteboard type</string>
- <string>NeXT ruler pasteboard type</string>
- <string>WebURLsWithTitlesPboardType</string>
- <string>public.url</string>
- </set>
- <string key="NSFrameSize">{938, 42}</string>
- <reference key="NSSuperview" ref="871543330"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="339833963"/>
- <string key="NSReuseIdentifierKey">_NS:13</string>
- <object class="NSTextContainer" key="NSTextContainer" id="648552009">
- <object class="NSLayoutManager" key="NSLayoutManager">
- <object class="NSTextStorage" key="NSTextStorage">
- <object class="NSMutableString" key="NSString">
- <characters key="NS.bytes"/>
- </object>
- <nil key="NSDelegate"/>
- </object>
- <array class="NSMutableArray" key="NSTextContainers">
- <reference ref="648552009"/>
- </array>
- <int key="NSLMFlags">166</int>
- <nil key="NSDelegate"/>
- </object>
- <reference key="NSTextView" ref="395788163"/>
- <double key="NSWidth">938</double>
- <int key="NSTCFlags">1</int>
- </object>
- <object class="NSTextViewSharedData" key="NSSharedData">
- <int key="NSFlags">67121127</int>
- <int key="NSTextCheckingTypes">0</int>
- <nil key="NSMarkedAttributes"/>
- <object class="NSColor" key="NSBackgroundColor" id="535647664">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <dictionary key="NSSelectedAttributes">
- <object class="NSColor" key="NSBackgroundColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">selectedTextBackgroundColor</string>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
- </object>
- </object>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">selectedTextColor</string>
- <object class="NSColor" key="NSColor" id="835883401">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MAA</bytes>
- </object>
- </object>
- </dictionary>
- <reference key="NSInsertionColor" ref="835883401"/>
- <dictionary key="NSLinkAttributes">
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MCAwIDEAA</bytes>
- </object>
- <object class="NSCursor" key="NSCursor">
- <string key="NSHotSpot">{8, -8}</string>
- <int key="NSCursorType">13</int>
- </object>
- <integer value="1" key="NSUnderline"/>
- </dictionary>
- <nil key="NSDefaultParagraphStyle"/>
- <nil key="NSTextFinder"/>
- <int key="NSPreferredTextFinderStyle">1</int>
- </object>
- <int key="NSTVFlags">6</int>
- <string key="NSMaxSize">{939, 10000000}</string>
- <nil key="NSDelegate"/>
- </object>
- </array>
- <string key="NSFrame">{{1, 1}, {938, 42}}</string>
- <reference key="NSSuperview" ref="238626476"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="395788163"/>
- <string key="NSReuseIdentifierKey">_NS:11</string>
- <reference key="NSDocView" ref="395788163"/>
- <reference key="NSBGColor" ref="535647664"/>
- <object class="NSCursor" key="NSCursor">
- <string key="NSHotSpot">{4, 5}</string>
- <object class="NSImage" key="NSImage">
- <int key="NSImageFlags">79691776</int>
- <array key="NSReps">
- <array>
- <integer value="5"/>
- <object class="NSURL">
- <nil key="NS.base"/>
- <string key="NS.relative">file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff</string>
- </object>
- </array>
- </array>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MCAwAA</bytes>
- </object>
- </object>
- </object>
- <int key="NScvFlags">4</int>
- </object>
- <object class="NSScroller" id="339833963">
- <reference key="NSNextResponder" ref="238626476"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{923, 1}, {16, 42}}</string>
- <reference key="NSSuperview" ref="238626476"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView"/>
- <string key="NSReuseIdentifierKey">_NS:83</string>
- <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
- <reference key="NSTarget" ref="238626476"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSPercent">0.96666666666666667</double>
- </object>
- <object class="NSScroller" id="1067057765">
- <reference key="NSNextResponder" ref="238626476"/>
- <int key="NSvFlags">-2147483392</int>
- <string key="NSFrame">{{-100, -100}, {87, 18}}</string>
- <reference key="NSSuperview" ref="238626476"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="871543330"/>
- <string key="NSReuseIdentifierKey">_NS:33</string>
- <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
- <int key="NSsFlags">1</int>
- <reference key="NSTarget" ref="238626476"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSCurValue">1</double>
- <double key="NSPercent">0.94565218687057495</double>
- </object>
- </array>
- <string key="NSFrame">{{-1, -1}, {940, 44}}</string>
- <reference key="NSSuperview" ref="1044753903"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="1067057765"/>
- <string key="NSReuseIdentifierKey">_NS:9</string>
- <int key="NSsFlags">133138</int>
- <reference key="NSVScroller" ref="339833963"/>
- <reference key="NSHScroller" ref="1067057765"/>
- <reference key="NSContentView" ref="871543330"/>
- <double key="NSMinMagnification">0.25</double>
- <double key="NSMaxMagnification">4</double>
- <double key="NSMagnification">1</double>
- </object>
- </array>
- <string key="NSFrameSize">{938, 42}</string>
- <reference key="NSSuperview"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="238626476"/>
- <string key="NSReuseIdentifierKey">_NS:21</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
- <string key="NSMaxSize">{10000000000000, 10000000000000}</string>
- <bool key="NSWindowIsRestorable">YES</bool>
- </object>
- </array>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <array class="NSMutableArray" key="connectionRecords">
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">terminate:</string>
- <reference key="source" ref="1050"/>
- <reference key="destination" ref="632727374"/>
- </object>
- <int key="connectionID">823</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">orderFrontStandardAboutPanel:</string>
- <reference key="source" ref="1021"/>
- <reference key="destination" ref="238522557"/>
- </object>
- <int key="connectionID">142</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">delegate</string>
- <reference key="source" ref="1021"/>
- <reference key="destination" ref="756173070"/>
- </object>
- <int key="connectionID">845</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">performMiniaturize:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="1011231497"/>
- </object>
- <int key="connectionID">37</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">arrangeInFront:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="625202149"/>
- </object>
- <int key="connectionID">39</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">performZoom:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="575023229"/>
- </object>
- <int key="connectionID">240</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hide:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="755159360"/>
- </object>
- <int key="connectionID">369</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hideOtherApplications:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="342932134"/>
- </object>
- <int key="connectionID">370</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">unhideAllApplications:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="908899353"/>
- </object>
- <int key="connectionID">372</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">cut:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="984623395"/>
- </object>
- <int key="connectionID">768</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">paste:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="1032676691"/>
- </object>
- <int key="connectionID">769</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">undo:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="521487141"/>
- </object>
- <int key="connectionID">776</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">copy:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="656529582"/>
- </object>
- <int key="connectionID">782</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">selectAll:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="538907583"/>
- </object>
- <int key="connectionID">785</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">toggleFullScreen:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="86356408"/>
- </object>
- <int key="connectionID">842</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">window</string>
- <reference key="source" ref="756173070"/>
- <reference key="destination" ref="110292814"/>
- </object>
- <int key="connectionID">850</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">inputWindow</string>
- <reference key="source" ref="756173070"/>
- <reference key="destination" ref="979091056"/>
- </object>
- <int key="connectionID">953</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">inputView</string>
- <reference key="source" ref="756173070"/>
- <reference key="destination" ref="395788163"/>
- </object>
- <int key="connectionID">954</int>
- </object>
- </array>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <array key="orderedObjects">
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <array key="object" id="0"/>
- <reference key="children" ref="1048"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="1021"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="1014"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">First Responder</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-3</int>
- <reference key="object" ref="1050"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">Application</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">29</int>
- <reference key="object" ref="649796088"/>
- <array class="NSMutableArray" key="children">
- <reference ref="713487014"/>
- <reference ref="694149608"/>
- <reference ref="391199113"/>
- <reference ref="725688984"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">Main Menu</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">19</int>
- <reference key="object" ref="713487014"/>
- <array class="NSMutableArray" key="children">
- <reference ref="835318025"/>
- </array>
- <reference key="parent" ref="649796088"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">56</int>
- <reference key="object" ref="694149608"/>
- <array class="NSMutableArray" key="children">
- <reference ref="110575045"/>
- </array>
- <reference key="parent" ref="649796088"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">103</int>
- <reference key="object" ref="391199113"/>
- <array class="NSMutableArray" key="children"/>
- <reference key="parent" ref="649796088"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">57</int>
- <reference key="object" ref="110575045"/>
- <array class="NSMutableArray" key="children">
- <reference ref="238522557"/>
- <reference ref="755159360"/>
- <reference ref="908899353"/>
- <reference ref="632727374"/>
- <reference ref="646227648"/>
- <reference ref="609285721"/>
- <reference ref="481834944"/>
- <reference ref="304266470"/>
- <reference ref="1046388886"/>
- <reference ref="1056857174"/>
- <reference ref="342932134"/>
- </array>
- <reference key="parent" ref="694149608"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">58</int>
- <reference key="object" ref="238522557"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">134</int>
- <reference key="object" ref="755159360"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">150</int>
- <reference key="object" ref="908899353"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">136</int>
- <reference key="object" ref="632727374"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">144</int>
- <reference key="object" ref="646227648"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">129</int>
- <reference key="object" ref="609285721"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">143</int>
- <reference key="object" ref="481834944"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">236</int>
- <reference key="object" ref="304266470"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">131</int>
- <reference key="object" ref="1046388886"/>
- <array class="NSMutableArray" key="children">
- <reference ref="752062318"/>
- </array>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">149</int>
- <reference key="object" ref="1056857174"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">145</int>
- <reference key="object" ref="342932134"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">130</int>
- <reference key="object" ref="752062318"/>
- <reference key="parent" ref="1046388886"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">24</int>
- <reference key="object" ref="835318025"/>
- <array class="NSMutableArray" key="children">
- <reference ref="299356726"/>
- <reference ref="625202149"/>
- <reference ref="575023229"/>
- <reference ref="1011231497"/>
- <reference ref="86356408"/>
- </array>
- <reference key="parent" ref="713487014"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">92</int>
- <reference key="object" ref="299356726"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">5</int>
- <reference key="object" ref="625202149"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">239</int>
- <reference key="object" ref="575023229"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">23</int>
- <reference key="object" ref="1011231497"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">711</int>
- <reference key="object" ref="725688984"/>
- <array class="NSMutableArray" key="children">
- <reference ref="701759256"/>
- </array>
- <reference key="parent" ref="649796088"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">712</int>
- <reference key="object" ref="701759256"/>
- <array class="NSMutableArray" key="children">
- <reference ref="521487141"/>
- <reference ref="668936019"/>
- <reference ref="383018193"/>
- <reference ref="984623395"/>
- <reference ref="656529582"/>
- <reference ref="1032676691"/>
- <reference ref="538907583"/>
- </array>
- <reference key="parent" ref="725688984"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">716</int>
- <reference key="object" ref="984623395"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">717</int>
- <reference key="object" ref="656529582"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">718</int>
- <reference key="object" ref="1032676691"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">721</int>
- <reference key="object" ref="538907583"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">824</int>
- <reference key="object" ref="756173070"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">841</int>
- <reference key="object" ref="86356408"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">828</int>
- <reference key="object" ref="110292814"/>
- <array class="NSMutableArray" key="children">
- <reference ref="305280978"/>
- </array>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">829</int>
- <reference key="object" ref="305280978"/>
- <array class="NSMutableArray" key="children"/>
- <reference key="parent" ref="110292814"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">713</int>
- <reference key="object" ref="521487141"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">714</int>
- <reference key="object" ref="668936019"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">715</int>
- <reference key="object" ref="383018193"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">941</int>
- <reference key="object" ref="979091056"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1044753903"/>
- </array>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">942</int>
- <reference key="object" ref="1044753903"/>
- <array class="NSMutableArray" key="children">
- <reference ref="238626476"/>
- </array>
- <reference key="parent" ref="979091056"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">943</int>
- <reference key="object" ref="238626476"/>
- <array class="NSMutableArray" key="children">
- <reference ref="395788163"/>
- <reference ref="1067057765"/>
- <reference ref="339833963"/>
- </array>
- <reference key="parent" ref="1044753903"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">944</int>
- <reference key="object" ref="395788163"/>
- <reference key="parent" ref="238626476"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">945</int>
- <reference key="object" ref="1067057765"/>
- <reference key="parent" ref="238626476"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">946</int>
- <reference key="object" ref="339833963"/>
- <reference key="parent" ref="238626476"/>
- </object>
- </array>
- </object>
- <dictionary class="NSMutableDictionary" key="flattenedProperties">
- <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="103.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="236.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="239.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="711.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="712.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="713.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="714.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="715.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="716.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="717.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="718.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="721.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="824.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <boolean value="YES" key="828.IBNSWindowAutoPositionCentersHorizontal"/>
- <boolean value="YES" key="828.IBNSWindowAutoPositionCentersVertical"/>
- <string key="828.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <boolean value="YES" key="828.NSWindowTemplate.visibleAtLaunch"/>
- <string key="829.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="841.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="941.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <boolean value="NO" key="941.NSWindowTemplate.visibleAtLaunch"/>
- <string key="942.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="943.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="944.CustomClassName">LLNonInlineTextView</string>
- <string key="944.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="945.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="946.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
- <nil key="activeLocalization"/>
- <dictionary class="NSMutableDictionary" key="localizations"/>
- <nil key="sourceID"/>
- <int key="maxID">954</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <array class="NSMutableArray" key="referencedPartialClassDescriptions">
- <object class="IBPartialClassDescription">
- <string key="className">LLAppDelegate</string>
- <string key="superclassName">NSObject</string>
- <dictionary class="NSMutableDictionary" key="outlets">
- <string key="inputView">LLNonInlineTextView</string>
- <string key="inputWindow">NSWindow</string>
- <string key="window">LLNSWindow</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
- <object class="IBToOneOutletInfo" key="inputView">
- <string key="name">inputView</string>
- <string key="candidateClassName">LLNonInlineTextView</string>
- </object>
- <object class="IBToOneOutletInfo" key="inputWindow">
- <string key="name">inputWindow</string>
- <string key="candidateClassName">NSWindow</string>
- </object>
- <object class="IBToOneOutletInfo" key="window">
- <string key="name">window</string>
- <string key="candidateClassName">LLNSWindow</string>
- </object>
- </dictionary>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/LLAppDelegate.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">LLNSWindow</string>
- <string key="superclassName">NSWindow</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/LLNSWindow.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">LLNonInlineTextView</string>
- <string key="superclassName">NSTextView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/LLNonInlineTextView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">LLUserInputWindow</string>
- <string key="superclassName">NSPanel</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/LLUserInputWindow.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSTextView</string>
- <dictionary class="NSMutableDictionary" key="actions">
- <string key="orderFrontSharingServicePicker:">id</string>
- <string key="toggleQuickLookPreviewPanel:">id</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="actionInfosByName">
- <object class="IBActionInfo" key="orderFrontSharingServicePicker:">
- <string key="name">orderFrontSharingServicePicker:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="toggleQuickLookPreviewPanel:">
- <string key="name">toggleQuickLookPreviewPanel:</string>
- <string key="candidateClassName">id</string>
- </object>
- </dictionary>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/NSTextView.h</string>
- </object>
- </object>
- </array>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
- <real value="1060" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
- <integer value="4600" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <string key="NSMenuCheckmark">{11, 11}</string>
- <string key="NSMenuMixedState">{10, 3}</string>
- </dictionary>
- </data>
-</archive>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23727" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+ <dependencies>
+ <deployment version="110000" identifier="macosx"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23727"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
+ <connections>
+ <outlet property="delegate" destination="824" id="845"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+ <menu title="Main Menu" systemMenu="main" id="29" userLabel="Main Menu">
+ <items>
+ <menuItem title="Megapahit" id="56">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Megapahit" systemMenu="apple" id="57">
+ <items>
+ <menuItem title="About Megapahit" id="58">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="236"/>
+ <menuItem title="Preferences…" keyEquivalent="," id="129"/>
+ <menuItem isSeparatorItem="YES" id="143"/>
+ <menuItem title="Services" id="131">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Services" systemMenu="services" id="130"/>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="144"/>
+ <menuItem title="Hide Megapahit" keyEquivalent="h" id="134">
+ <connections>
+ <action selector="hide:" target="-1" id="369"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Hide Others" keyEquivalent="h" id="145">
+ <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+ <connections>
+ <action selector="hideOtherApplications:" target="-1" id="370"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Show All" id="150">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="unhideAllApplications:" target="-1" id="372"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="149"/>
+ <menuItem title="Quit Megapahit" keyEquivalent="q" id="136">
+ <connections>
+ <action selector="terminate:" target="-3" id="823"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Edit" id="711">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Edit" id="712">
+ <items>
+ <menuItem title="Undo" keyEquivalent="z" id="713">
+ <connections>
+ <action selector="undo:" target="-1" id="776"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Redo" keyEquivalent="Z" id="714"/>
+ <menuItem isSeparatorItem="YES" id="715"/>
+ <menuItem title="Cut" keyEquivalent="x" id="716">
+ <connections>
+ <action selector="cut:" target="-1" id="768"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Copy" keyEquivalent="c" id="717">
+ <connections>
+ <action selector="copy:" target="-1" id="782"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Paste" keyEquivalent="v" id="718">
+ <connections>
+ <action selector="paste:" target="-1" id="769"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Select All" keyEquivalent="a" id="721">
+ <connections>
+ <action selector="selectAll:" target="-1" id="785"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Window" id="19">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Window" systemMenu="window" id="24">
+ <items>
+ <menuItem title="Minimize" keyEquivalent="m" id="23">
+ <connections>
+ <action selector="performMiniaturize:" target="-1" id="37"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Zoom" id="239">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="performZoom:" target="-1" id="240"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Enter Full Screen" keyEquivalent="f" id="841">
+ <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
+ <connections>
+ <action selector="toggleFullScreen:" target="-1" id="842"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="92"/>
+ <menuItem title="Bring All to Front" id="5">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="arrangeInFront:" target="-1" id="39"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Help" id="103">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ </menuItem>
+ </items>
+ <point key="canvasLocation" x="87" y="149"/>
+ </menu>
+ <customObject id="824" customClass="LLAppDelegate">
+ <connections>
+ <outlet property="inputView" destination="944" id="954"/>
+ <outlet property="inputWindow" destination="941" id="953"/>
+ <outlet property="window" destination="828" id="850"/>
+ </connections>
+ </customObject>
+ <window title="Megapahit" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" deferred="NO" frameAutosaveName="Megapahit" animationBehavior="default" id="828" customClass="LLNSWindow">
+ <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+ <windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
+ <rect key="contentRect" x="196" y="240" width="1024" height="600"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
+ <view key="contentView" id="829">
+ <rect key="frame" x="0.0" y="0.0" width="1024" height="600"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </view>
+ <point key="canvasLocation" x="-48" y="-285"/>
+ </window>
+ <window title="Input Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" visibleAtLaunch="NO" animationBehavior="default" id="941" customClass="LLUserInputWindow">
+ <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" utility="YES"/>
+ <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+ <rect key="contentRect" x="272" y="176" width="938" height="42"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
+ <view key="contentView" id="942">
+ <rect key="frame" x="0.0" y="0.0" width="938" height="42"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <scrollView fixedFrame="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="943">
+ <rect key="frame" x="-1" y="-1" width="940" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <clipView key="contentView" id="Mvi-Vb-2zK">
+ <rect key="frame" x="1" y="1" width="938" height="42"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <textView importsGraphics="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" spellingCorrection="YES" smartInsertDelete="YES" id="944" customClass="LLNonInlineTextView">
+ <rect key="frame" x="0.0" y="0.0" width="938" height="42"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+ <size key="minSize" width="938" height="42"/>
+ <size key="maxSize" width="940" height="10000000"/>
+ <color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
+ </textView>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </clipView>
+ <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="945">
+ <rect key="frame" x="-100" y="-100" width="87" height="18"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </scroller>
+ <scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="946">
+ <rect key="frame" x="924" y="1" width="15" height="42"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </scroller>
+ </scrollView>
+ </subviews>
+ </view>
+ <point key="canvasLocation" x="87" y="144"/>
+ </window>
+ </objects>
+</document>
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 991d8e5c5f..429dc57af3 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-7.1.13
+7.2.3
diff --git a/indra/newview/ViewerInstall.cmake b/indra/newview/ViewerInstall.cmake
index 1281136cef..5aadc51869 100644
--- a/indra/newview/ViewerInstall.cmake
+++ b/indra/newview/ViewerInstall.cmake
@@ -31,7 +31,7 @@ if (DARWIN)
)
install(FILES
- SecondLife.nib
+ ${CMAKE_CURRENT_BINARY_DIR}/SecondLife.nib
${AUTOBUILD_INSTALL_DIR}/ca-bundle.crt
cube.dae
featuretable_mac.txt
@@ -54,7 +54,6 @@ if (DARWIN)
install(FILES
${SCRIPTS_DIR}/messages/message_template.msg
- ${SCRIPTS_DIR}/../etc/message.xml
${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
DESTINATION app_settings
)
@@ -84,22 +83,113 @@ if (DARWIN)
endif (PACKAGE)
install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/FixBundle.cmake)
+elseif (WINDOWS)
+
+ install(DIRECTORY
+ app_settings
+ character
+ fonts
+ skins
+ DESTINATION .
+ )
+
+ install(FILES
+ ${AUTOBUILD_INSTALL_DIR}/ca-bundle.crt
+ cube.dae
+ featuretable.txt
+ DESTINATION .
+ )
+
+ install(FILES
+ licenses-win32.txt
+ RENAME licenses.txt
+ DESTINATION .
+ )
+
+ install(FILES
+ ${SCRIPTS_DIR}/messages/message_template.msg
+ ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
+ DESTINATION app_settings
+ )
+
+ install(DIRECTORY
+ ${AUTOBUILD_INSTALL_DIR}/dictionaries
+ DESTINATION app_settings
+ )
+
+ if ($ENV{MSYSTEM_CARCH} MATCHES aarch64)
+ install(
+ PROGRAMS
+ ${prefix_result}/../bin/libcrypto-3-arm64.dll
+ ${prefix_result}/../bin/libssl-3-arm64.dll
+ ${prefix_result}/../bin/libcurl.dll
+ DESTINATION .
+ )
+ set(BOOST_PLATFORM a${ADDRESS_SIZE})
+ else ()
+ set(BOOST_PLATFORM x${ADDRESS_SIZE})
+ endif ()
+
+ install(
+ PROGRAMS
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${VIEWER_BINARY_NAME}.exe
+ ${prefix_result}/../bin/OpenAL32.dll
+ ${prefix_result}/../bin/alut.dll
+ ${prefix_result}/../bin/boost_context-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/boost_fiber-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/boost_filesystem-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/boost_json-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/boost_program_options-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/boost_thread-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/boost_url-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/brotlicommon.dll
+ ${prefix_result}/../bin/brotlidec.dll
+ ${prefix_result}/../bin/bz2.dll
+ ${prefix_result}/../bin/fmt.dll
+ ${prefix_result}/../bin/freetype.dll
+ ${prefix_result}/../bin/hunspell-1.7-0.dll
+ ${prefix_result}/../bin/iconv-2.dll
+ ${prefix_result}/../bin/jpeg62.dll
+ ${prefix_result}/../bin/libapr-1.dll
+ ${prefix_result}/../bin/libaprutil-1.dll
+ ${prefix_result}/../bin/libexpat.dll
+ ${prefix_result}/../bin/libpng16.dll
+ ${prefix_result}/../bin/libxml2.dll
+ ${prefix_result}/../bin/meshoptimizer.dll
+ ${prefix_result}/../bin/minizip.dll
+ ${prefix_result}/../bin/nghttp2.dll
+ ${prefix_result}/../bin/ogg.dll
+ ${prefix_result}/../bin/openjp2.dll
+ ${prefix_result}/../bin/vorbis.dll
+ ${prefix_result}/../bin/vorbisenc.dll
+ ${prefix_result}/../bin/vorbisfile.dll
+ ${prefix_result}/../bin/zlib1.dll
+ DESTINATION .
+ )
+
+ if (USE_DISCORD)
+ install(
+ PROGRAMS ${LIBS_PREBUILT_DIR}/bin/release/discord_partner_sdk.dll
+ DESTINATION .
+ )
+ endif ()
+
+ install(
+ PROGRAMS
+ ${prefix_result}/../bin/boost_context-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/boost_fiber-vc143-mt-${BOOST_PLATFORM}-1_90.dll
+ ${prefix_result}/../bin/libapr-1.dll
+ ${prefix_result}/../bin/libaprutil-1.dll
+ ${prefix_result}/../bin/libexpat.dll
+ DESTINATION llplugin
+ )
+
else (DARWIN)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}
DESTINATION bin
)
-if (${LINUX_DISTRO} MATCHES arch)
- install(PROGRAMS linux_tools/launch_url.sh
- DESTINATION lib/${VIEWER_BINARY_NAME}
- )
-else (${LINUX_DISTRO} MATCHES arch)
- install(PROGRAMS linux_tools/launch_url.sh
- DESTINATION libexec/${VIEWER_BINARY_NAME}
- )
-endif (${LINUX_DISTRO} MATCHES arch)
-
if (LINUX)
if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu))
set(_LIB lib/${ARCH}-linux-gnu)
@@ -108,11 +198,17 @@ if (LINUX)
else ()
set(_LIB lib)
endif ()
+ if (USE_DISCORD)
+ install(
+ FILES ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscord_partner_sdk.so
+ DESTINATION ${_LIB}
+ )
+ endif ()
if (USE_FMODSTUDIO)
install(FILES
${ARCH_PREBUILT_DIRS_RELEASE}/libfmod.so
${ARCH_PREBUILT_DIRS_RELEASE}/libfmod.so.13
- ${ARCH_PREBUILT_DIRS_RELEASE}/libfmod.so.13.28
+ ${ARCH_PREBUILT_DIRS_RELEASE}/libfmod.so.13.33
DESTINATION ${_LIB})
endif (USE_FMODSTUDIO)
endif (LINUX)
@@ -152,7 +248,6 @@ endif (IS_ARTWORK_PRESENT)
)
install(FILES ${SCRIPTS_DIR}/messages/message_template.msg
- ${SCRIPTS_DIR}/../etc/message.xml
${CMAKE_CURRENT_BINARY_DIR}/contributors.txt
DESTINATION share/${VIEWER_BINARY_NAME}/app_settings
)
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 635e5e40f5..6a05466e06 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -26,9 +26,9 @@
label_ref="Command_Avatar_Label"
tooltip_ref="Command_Avatar_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
- execute_parameters="avatar"
+ execute_parameters="avatar_welcome_pack"
is_running_function="Floater.IsOpen"
- is_running_parameters="avatar"
+ is_running_parameters="avatar_welcome_pack"
/>
<command name="build"
available_in_toybox="true"
diff --git a/indra/newview/app_settings/message.xml b/indra/newview/app_settings/message.xml
new file mode 100755
index 0000000000..dee3fd72dd
--- /dev/null
+++ b/indra/newview/app_settings/message.xml
@@ -0,0 +1,751 @@
+<?xml version="1.0"?>
+<llsd>
+ <map>
+ <key>serverDefaults</key>
+ <!--
+ a map of server names to default message transport
+ -->
+ <map>
+ <key>simulator</key>
+ <string>template</string>
+
+ <key>spaceserver</key>
+ <string>template</string>
+
+ <key>dataserver</key>
+ <string>template</string>
+
+ <key>logDataserver</key>
+ <string>template</string>
+
+ <key>inventoryDataserver</key>
+ <string>template</string>
+
+ <key>rpcserver</key>
+ <string>template</string>
+
+ <key>mapserver</key>
+ <string>template</string>
+
+ <key>viewer</key>
+ <string>template</string>
+
+ </map>
+ <key>messages</key>
+ <!--
+ a map of individual message names that override defaults
+ -->
+ <map>
+ <!--
+ Circuit related messages
+ -->
+ <key>PacketAck</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>OpenCircuit</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>CloseCircuit</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>StartPingCheck</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>CompletePingCheck</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>AddCircuitCode</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>UseCircuitCode</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>CreateTrustedCircuit</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>RequestTrustedCircuit</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <!--
+ Simulator to Launcher
+ until we get a HTTP server in the launcher
+ -->
+ <key>ReportAutosaveCrash</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>SetCPURatio</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!--
+ Viewer to simulator messages sent before UntrustedSimulatorMessage cap received.
+ -->
+ <key>CompleteAgentMovement</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>EconomyDataRequest</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ViewerEffect</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>RegionHandshakeReply</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!--
+ Viewer to simulator messages sent unreliably.
+ -->
+ <key>AgentUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!--
+ Messages created by LLThrottleGroup clients
+ -->
+ <key>ImagePacket</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>LayerData</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectUpdateCached</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectUpdateCompressed</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ImprovedTerseObjectUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>AvatarAnimation</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectAnimation</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>AvatarAppearance</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!-- Simulator to simulator reliable messages -->
+ <key>GodKickUser</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>RoutedMoneyBalanceReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!-- Simulator to simulator unreliable messages -->
+ <key>EdgeDataPacket</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>CoarseLocationUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ <key>only-send-latest</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>SimulatorLoad</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>EstablishAgentCommunication</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>AgentGroupDataUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>AgentDropGroup</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxSessionStartReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxSessionEventReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ForceCloseChatterBoxSession</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxSessionAgentListUpdates</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxSessionUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxInvitation</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <!-- Client to server -->
+ <key>ParcelVoiceInfoRequest</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!-- Server to client -->
+ <key>DisplayNameUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ParcelVoiceInfo</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ParcelNavigateMedia</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ParcelObjectOwnersReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ParcelProperties</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>LandStatReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>PlacesReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>SetDisplayNameReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>SimConsoleResponse</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>DirLandReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>avatarnotesrequest</key>
+ <map>
+ <key>service_name</key>
+ <string>avatar-notes</string>
+ <key>builder</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>avatarclassifiedsrequest</key>
+ <map>
+ <key>service_name</key>
+ <string>avatar-classifieds</string>
+ <key>builder</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>avatarpicksrequest</key>
+ <map>
+ <key>service_name</key>
+ <string>avatar-pick</string>
+ <key>builder</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>pickinforequest</key>
+ <map>
+ <key>service_name</key>
+ <string>pick-info</string>
+ <key>builder</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ProvisionVoiceAccountRequest</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>VoiceSignalingRequest</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+ <!-- Server to client -->
+ <key>RequiredVoiceVersion</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>EnableSimulator</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>TeleportFinish</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>TeleportFailed</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>CrossedRegion</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>NavMeshStatusUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>AgentStateUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <!-- UDPDeprecated Messages -->
+ <key>ScriptRunningReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>LandStatReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>StartGroupProposal</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>FetchInventoryDescendents</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>GroupProposalBallot</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>RpcScriptRequestInboundForward</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectPhysicsProperties</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ </map>
+ <key>capBans</key>
+ <map>
+ <key>MapLayer</key>
+ <boolean>false</boolean>
+
+ <key>MapLayerGod</key>
+ <boolean>false</boolean>
+
+ <key>NewFileAgentInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateGestureAgentInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateNotecardAgentInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateScriptAgentInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateGestureTaskInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateNotecardTaskInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateScriptTaskInventory</key>
+ <boolean>false</boolean>
+
+ <key>ViewerStartAuction</key>
+ <boolean>true</boolean>
+
+ <key>ParcelGodReserveForNewbie</key>
+ <boolean>true</boolean>
+
+ <key>SendUserReport</key>
+ <boolean>false</boolean>
+
+ <key>SendUserReportWithScreenshot</key>
+ <boolean>false</boolean>
+
+ <key>RequestTextureDownload</key>
+ <boolean>true</boolean>
+
+ <key>EventQueueGet</key>
+ <boolean>false</boolean>
+
+ <key>UntrustedSimulatorMessage</key>
+ <boolean>false</boolean>
+
+ <key>SendPostcard</key>
+ <boolean>false</boolean>
+
+ <key>SendPostcard2</key>
+ <boolean>true</boolean>
+
+ <key>SendPostcard3</key>
+ <boolean>true</boolean>
+
+ <key>ParcelVoiceInfoRequest</key>
+ <boolean>false</boolean>
+
+ <key>ChatSessionRequest</key>
+ <boolean>false</boolean>
+
+ <key>ProvisionVoiceAccountRequest</key>
+ <boolean>false</boolean>
+
+ <key>VoiceSignalingRequest</key>
+ <boolean>false</boolean>
+
+ <key>RemoteParcelRequest</key>
+ <boolean>false</boolean>
+
+ <key>SearchStatTracking</key>
+ <boolean>false</boolean>
+
+ <key>ParcelPropertiesUpdate</key>
+ <boolean>false</boolean>
+
+ <key>EstateChangeInfo</key>
+ <boolean>true</boolean>
+
+ <key>FetchInventoryDescendents2</key>
+ <boolean>false</boolean>
+
+ <key>FetchInventory2</key>
+ <boolean>false</boolean>
+
+ <key>FetchLibDescendents2</key>
+ <boolean>false</boolean>
+
+ <key>FetchLib2</key>
+ <boolean>false</boolean>
+
+ <key>UploadBakedTexture</key>
+ <boolean>true</boolean>
+
+ <key>ObjectMedia</key>
+ <boolean>false</boolean>
+
+ <key>ObjectMediaNavigate</key>
+ <boolean>false</boolean>
+
+ </map>
+
+ <key>messageBans</key>
+ <map>
+ <key>trusted</key>
+ <map>
+ </map>
+
+ <key>untrusted</key>
+ <map>
+ </map>
+ </map>
+
+ <key>maxQueuedEvents</key>
+ <integer>100</integer>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 9ade1d8cc0..ecea9a3238 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2,7 +2,7 @@
<llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="llsd.xsd">
<map>
- <key>ImporterDebug</key>
+ <key>ImporterDebugVerboseLogging</key>
<map>
<key>Comment</key>
<string>Enable debug output to more precisely identify sources of import errors. Warning: the output can slow down import on many machines.</string>
@@ -27,7 +27,7 @@
<key>ImporterModelLimit</key>
<map>
<key>Comment</key>
- <string>Limits amount of importer generated models for dae files</string>
+ <string>Limits amount of importer generated (when over 8 faces) models for dae and gltf files</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -35,6 +35,17 @@
<key>Value</key>
<integer>768</integer>
</map>
+ <key>ImporterDebugMode</key>
+ <map>
+ <key>Comment</key>
+ <string>At 0 does nothing, at 1 dumps skinning data near orifinal file, at 2 dumps skining data and positions/weights of first 5 models, at 3 dumps skinning data and models as llsd</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>ImporterPreprocessDAE</key>
<map>
<key>Comment</key>
@@ -113,7 +124,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>300.0</real>
+ <real>300</real>
</map>
<key>AckCollectTime</key>
<map>
@@ -368,6 +379,17 @@
<key>Value</key>
<real>0.5</real>
</map>
+ <key>AudioLevelWind</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio level of wind noise when standing still</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
<key>AudioStreamingMedia</key>
<map>
<key>Comment</key>
@@ -632,16 +654,16 @@
<key>Value</key>
<real>16.0</real>
</map>
- <key>AvatarPickerURL</key>
+ <key>AvatarWelcomePack</key>
<map>
- <key>Comment</key>
- <string>Avatar picker contents</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/avatars.html</string>
+ <key>Comment</key>
+ <string>Avatar Welcome Pack contents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/vawp/index.html</string>
</map>
<!--AvatarBakedTextureUploadTimeout is in use by QA-->
<key>AvatarBakedTextureUploadTimeout</key>
@@ -1150,6 +1172,39 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>EnableDiscord</key>
+ <map>
+ <key>Comment</key>
+ <string>When set, connect to Discord to enable Rich Presence</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowDiscordActivityDetails</key>
+ <map>
+ <key>Comment</key>
+ <string>When set, show avatar name on Discord Rich Presence</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowDiscordActivityState</key>
+ <map>
+ <key>Comment</key>
+ <string>When set, show location on Discord Rich Presence</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>EnableDiskCacheDebugInfo</key>
<map>
<key>Comment</key>
@@ -1164,13 +1219,13 @@
<key>DiskCachePercentOfTotal</key>
<map>
<key>Comment</key>
- <string>The percent of total cache size (defined by CacheSize) to use for the disk cache</string>
+ <string>The percent of total cache size (defined by CacheSize) to use for the disk cache (ex: asset storage, excludes textures)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>40.0</real>
+ <real>35.0</real>
</map>
<key>DiskCacheDirName</key>
<map>
@@ -1214,7 +1269,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>4096</integer>
+ <integer>6144</integer>
</map>
<key>CacheValidateCounter</key>
<map>
@@ -1875,6 +1930,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DebugSelectionLODs</key>
+ <map>
+ <key>Comment</key>
+ <string>Force selection to show specific LOD, -1 for off, 0 - lowest, 4 - high.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
<key>AnimatedObjectsAllowLeftClick</key>
<map>
<key>Comment</key>
@@ -2425,16 +2491,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>DisableMouseWarp</key>
+ <key>MouseWarpMode</key>
<map>
<key>Comment</key>
- <string>Disable warping of the mouse to the center of the screen during alt-zoom and mouse look. Useful with certain input devices, mouse sharing programs like Synergy, or running under Parallels.</string>
+ <string>Controls warping of the mouse to the center of the screen during alt-zoom and mouse look. Useful with certain input devices, mouse sharing programs like Synergy, or running under Parallels. 0 - automatic, 1 - on, 2 - off</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>S32</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>DisableExternalBrowser</key>
<map>
@@ -2546,7 +2612,7 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>DoubleClickTeleport</key>
+ <key>DoubleClickTeleport</key>
<map>
<key>Comment</key>
<string>Enable double-click to teleport where allowed (afects minimap and people panel)</string>
@@ -4347,7 +4413,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>40.0</real>
+ <real>90.0</real>
</map>
<key>LogMessages</key>
<map>
@@ -6416,6 +6482,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>PlaySoundChatMention</key>
+ <map>
+ <key>Comment</key>
+ <string>Plays a sound when got mentioned in a chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>PluginAttachDebuggerToPlugins</key>
<map>
<key>Comment</key>
@@ -7852,7 +7929,7 @@
<key>RenderMaxOpenGLVersion</key>
<map>
<key>Comment</key>
- <string>Maximum OpenGL version to attempt use (minimum 3.1 maximum 4.6). Requires restart.</string>
+ <string>Maximum OpenGL version to attempt use (minimum 3.1 maximum 4.6). Requires restart. Windows only.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -7885,13 +7962,13 @@
<key>RenderMinFreeMainMemoryThreshold</key>
<map>
<key>Comment</key>
- <string>Minimum of available physical memory in MB before textures get scaled down</string>
+ <string>If available free physical memory is below this value textures get agresively scaled down</string>
<key>Persist</key>
- <integer>0</integer>
+ <integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>512</integer>
+ <integer>256</integer>
</map>
<key>RenderLowMemMinDiscardIncrement</key>
<map>
@@ -8492,7 +8569,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.4</real>
+ <real>1.0</real>
</map>
<key>RenderShadowBlurSamples</key>
<map>
@@ -9100,7 +9177,7 @@
<key>RenderQualityPerformance</key>
<map>
<key>Comment</key>
- <string>Which graphics settings you've chosen</string>
+ <string>Which graphics settings you've chosen. Don't use this setting to change quality directly from debug settings.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9108,6 +9185,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>DebugQualityPerformance</key>
+ <map>
+ <key>Comment</key>
+ <string>Allows to change performance quality directly from debug settings.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>RenderReflectionDetail</key>
<map>
@@ -9197,7 +9285,7 @@
<key>Value</key>
<real>1.0</real>
</map>
-
+
<key>RenderReflectionProbeDrawDistance</key>
<map>
<key>Comment</key>
@@ -9271,9 +9359,9 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>U32</string>
+ <string>F32</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>1.0</integer>
</map>
<key>RenderShaderLightingMaxLevel</key>
<map>
@@ -9396,7 +9484,7 @@
<key>Value</key>
<real>1.0</real>
</map>
-
+
<key>RenderReflectionProbeMaxLocalLightAmbiance</key>
<map>
<key>Comment</key>
@@ -9628,6 +9716,28 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderBalanceInSnapshot</key>
+ <map>
+ <key>Comment</key>
+ <string>Display L$ balance in snapshot</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ObscureBalanceInStatusBar</key>
+ <map>
+ <key>Comment</key>
+ <string>If true, balance will be shows as '*'</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderUIBuffer</key>
<map>
<key>Comment</key>
@@ -10374,13 +10484,13 @@
<key>SceneLoadRearMaxRadiusFraction</key>
<map>
<key>Comment</key>
- <string>a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold</string>
+ <string>a fraction of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>75.0</real>
+ <real>0.75</real>
</map>
<key>SceneLoadRearPixelThreshold</key>
<map>
@@ -10975,7 +11085,7 @@
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
- </map>
+ </map>
<key>NearbyListShowMap</key>
<map>
<key>Comment</key>
@@ -11488,6 +11598,17 @@
<key>Value</key>
<integer>75</integer>
</map>
+ <key>SnapshotTimestamp</key>
+ <map>
+ <key>Comment</key>
+ <string>Add timestamp to snapshot file names</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>AbuseReportScreenshotDelay</key>
<map>
<key>Comment</key>
@@ -11598,6 +11719,28 @@
<key>Value</key>
<string>fss.txt</string>
</map>
+ <key>StatsFrametimeSampleSeconds</key>
+ <map>
+ <key>Comment</key>
+ <string>The number of seconds to sample extended frametime data (percentiles, stddev).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>5</integer>
+ </map>
+ <key>StatsFrametimeEventThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>The percentage that the frametime difference must exceed in order to register a frametime event. 0.1 = 10%, 0.25 = 25%, etc.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1</real>
+ </map>
<key>SystemLanguage</key>
<map>
<key>Comment</key>
@@ -12516,6 +12659,28 @@
<key>Value</key>
<string>2ca849ba-2885-4bc3-90ef-d4987a5b983a</string>
</map>
+ <key>UISndChatMention</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for chat mention(uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>03e77cb5-592c-5b33-d271-2e46497c3fb3</string>
+ </map>
+ <key>UISndChatPing</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for chat ping(uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7dd36df6-2624-5438-f988-fdf8588a0ad9</string>
+ </map>
<key>UISndClick</key>
<map>
<key>Comment</key>
@@ -13036,9 +13201,9 @@
<key>Use24HourClock</key>
<map>
<key>Comment</key>
- <string>12 vs 24. At the moment only for region restart schedule floater</string>
+ <string>12 vs 24. At the moment coverage is partial</string>
<key>Persist</key>
- <integer>0</integer>
+ <integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@@ -13808,7 +13973,7 @@
<key>FullScreen</key>
<map>
<key>Comment</key>
- <string>run a fullscreen session</string>
+ <string>Run a fullscreen session. MacOS not supported</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -14231,7 +14396,133 @@
<!-- megapahit settings -->
- <key>MPVBufferOptiMode</key>
+
+ <key>MPVertexBufferMode</key>
+ <map>
+ <key>Comment</key>
+ <string>Vertex Buffer Mode for Mac (0=LL, 1=MP)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MPHDRDisplay</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable HDR Display Support (Mac)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MPHDRBoost</key>
+ <map>
+ <key>Comment</key>
+ <string>HDR Boost</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>1.0</integer>
+ </map>
+ <key>MPHDRGamma</key>
+ <map>
+ <key>Comment</key>
+ <string>HDR Gamma</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>2.4</integer>
+ </map>
+ <key>MPHDRUIBoost</key>
+ <map>
+ <key>Comment</key>
+ <string>HDR UI Boost</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>1.0</integer>
+ </map>
+ <key>MPColorPrecision</key>
+ <map>
+ <key>Comment</key>
+ <string>Color buffers precision</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MPNoGLDebug</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable GL Debug</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPGamma</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable Gamma</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPTone</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable Tonemap</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPGlow</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable Glow</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPLuminanceMipmap</key>
+ <map>
+ <key>Comment</key>
+ <string>
+ Luminance Map Mipmaps:
+ (set to 0 to fix post-processing slowdowns)
+ 0:no
+ 1:yes
+ </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<map>
<key>Comment</key>
<string>
@@ -14247,39 +14538,138 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>MPRenderShadowOpti</key>
+ <key>MPRenderShadowMaxDist</key>
<map>
<key>Comment</key>
- <string>Shadows Optimisations</string>
+ <string>Shadows Max Draw distance</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>F32</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>64</integer>
</map>
- <key>MPVCameraCollapsed</key>
+ <key>MPRenderBloom</key>
<map>
<key>Comment</key>
- <string>
- Camera floater collapsed</string>
+ <string>Automatic bloom (n blur iterations, 0: Disable)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>U32</string>
<key>Value</key>
<integer>0</integer>
</map>
- <key>MPVNearMeRange</key>
+ <key>MPBloomExtractBrightness</key>
<map>
<key>Comment</key>
- <string>Search radius in the people panel</string>
+ <string>Auto bloom: Min extracted brightness</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>4096</integer>
+ <real>0.20</real>
+ </map>
+ <key>MPBloomExtractMetal</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Metal roughness limit filter</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.40</real>
+ </map>
+ <key>MPBloomExtractNonMetal</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Non Metal roughness limit filter</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.0</real>
+ </map>
+ <key>MPBloomStrength</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom Strength (0.1 to 1.5)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>MPBloomBlurRadius</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Radius</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.5</real>
+ </map>
+ <key>MPBloomBlurRadiusAdd</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Radius add</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.9</real>
+ </map>
+ <key>MPRenderProbeUpdatePeriod</key>
+ <map>
+ <key>Comment</key>
+ <string>Delay between probes updates</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>15.0</real>
+ </map>
+ <key>MPRenderProbeSlowDown</key>
+ <map>
+ <key>Comment</key>
+ <string>Slow down probes updates</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.05</real>
+ </map>
+ <key>MPRenderProbeProgressive</key>
+ <map>
+ <key>Comment</key>
+ <string>Calculate Radiance progressively</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>MPVCameraCollapsed</key>
+ <map>
+ <key>Comment</key>
+ <string>
+ Camera floater collapsed</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
</map>
<key>RenderVSyncEnabled</key>
<map>
@@ -14656,10 +15046,32 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>OutfitGallerySortByName</key>
+ <key>OutfitGallerySortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Gallery sorting: 0 - sort outfits by name, 1 - images frst, 2 - favorites first</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>OutfitListSortOrder</key>
<map>
<key>Comment</key>
- <string>Always sort outfits by name in Outfit Gallery</string>
+ <string>How outfit list in Avatar's floater is sorted. 0 - by name 1 - favorites to top</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>OutfitListFilterFullList</key>
+ <map>
+ <key>Comment</key>
+ <string> 0 - show only matches. 1 - show all items in outfit as long as outfit or item inside matches.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -14925,7 +15337,7 @@
<key>Comment</key>
<string>Avatar follows cursor with avatars eyes, when disabled, avatar will look forward</string>
<key>Persist</key>
- <integer>0</integer>
+ <integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@@ -16540,6 +16952,50 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>InventoryFavoritesUseStar</key>
+ <map>
+ <key>Comment</key>
+ <string>Show star near favorited items in inventory</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>InventoryFavoritesUseHollowStar</key>
+ <map>
+ <key>Comment</key>
+ <string>Show star near folders that contain favorites</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>InventoryFavoritesColorText</key>
+ <map>
+ <key>Comment</key>
+ <string>render favorite items using InventoryFavoriteText as color</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>InventoryAddAttachmentBehavior</key>
+ <map>
+ <key>Comment</key>
+ <string>Defines behavior when hitting return on an inventory item</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>StatsReportMaxDuration</key>
<map>
<key>Comment</key>
@@ -16628,5 +17084,71 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>MediaAutoPlayHuds</key>
+ <map>
+ <key>Comment</key>
+ <string>Automatically play HUD media</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MediaFirstClickInteract</key>
+ <map>
+ <key>Comment</key>
+ <string>This setting controls which media (once loaded) does not require a first click to focus before interaction can begin. This allows clicks to be passed directly to media bypassing the focus click requirement. This setting is a bitfield, precomputed values are as follows: Disabled=0; Worn HUDs only=1; Owned objects=2; Friend objects=4; Group objects=8; Landowner objects=16; Any object=32767; All MOAP=32768. For complete details see lltoolpie.h enum MediaFirstClickTypes.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>31</integer>
+ </map>
+ <key>EnableSelectionHints</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to send editing hints to animate the arm when editing an object.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableLookAtTarget</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to animate the avatar head and send look at targets when moving the cursor or focusing on objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LimitLookAtTarget</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to clamp the look at targets around the avatar head before sending</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LimitLookAtTargetDistance</key>
+ <map>
+ <key>Comment</key>
+ <string>Distance to limit look at target to</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 80a4bec57f..8361a50b6c 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -329,7 +329,7 @@
<key>KeepConversationLogTranscripts</key>
<map>
<key>Comment</key>
- <string>Keep a conversation log and transcripts</string>
+ <string>Keep a conversation log and transcripts 2 - both, 1 - logs, 0 - none</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl b/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl
index 017855325c..8e12d09443 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl
@@ -2545,12 +2545,31 @@ A_STATIC void CasSetup(
#endif
#ifdef A_GPU
+
+#ifdef LEGACY_GAMMA
+uniform float gamma;
+
+vec3 legacyGamma(vec3 color)
+{
+ vec3 c = 1. - clamp(color, vec3(0.), vec3(1.));
+ c = 1. - pow(c, vec3(gamma)); // s/b inverted already CPU-side
+
+ return c;
+}
+#endif
+
void main()
{
vec4 diff = vec4(0.f);
uvec2 point = uvec2(vary_fragcoord * out_screen_res.xy);
CasFilter(diff.r, diff.g, diff.b, point, cas_param_0, cas_param_1, true);
diff.a = texture(diffuseRect, vary_fragcoord).a;
+ diff.rgb = linear_to_srgb(diff.rgb);
+
+#ifdef LEGACY_GAMMA
+ diff.rgb = legacyGamma(diff.rgb);
+#endif
+
frag_color = diff;
}
#endif
diff --git a/indra/newview/app_settings/shaders/class1/deferred/MPHDRDisplayGammaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/MPHDRDisplayGammaF.glsl
new file mode 100644
index 0000000000..503974cb7c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/MPHDRDisplayGammaF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file postDeferredGammaCorrect.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/*[EXTRA_CODE_HERE]*/
+
+out vec4 frag_color;
+
+uniform sampler2D diffuseRect;
+
+uniform float gamma = 2.2;
+uniform float mpHDRBoost = 1.0;
+
+in vec2 vary_fragcoord;
+
+vec3 clampHDRRange(vec3 color);
+
+vec3 HDRDisplayGamma(vec3 linearRGB)
+{
+ bvec3 cutoff = lessThan(linearRGB, vec3(0.0031308));
+ vec3 higher = vec3(1.055)*pow(linearRGB, vec3(1.0/gamma)) - vec3(0.055);
+ vec3 lower = linearRGB * vec3(12.92);
+
+ return mix(higher, lower, cutoff);
+}
+
+void main()
+{
+ vec4 diff = texture(diffuseRect, vary_fragcoord);
+ diff.rgb = mpHDRBoost * HDRDisplayGamma(diff.rgb);
+ diff.rgb = clampHDRRange(diff.rgb);
+ frag_color = diff;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
index fdb77cce6e..10a48f1e01 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
@@ -1351,6 +1351,10 @@ float4 SMAABlendingWeightCalculationPS(float2 texcoord,
//-----------------------------------------------------------------------------
// Neighborhood Blending Pixel Shader (Third Pass)
+vec3 srgb_to_linear(vec3 cs);
+vec4 srgb_to_linear4(vec4 cs);
+vec3 linear_to_srgb(vec3 cl);
+
float4 SMAANeighborhoodBlendingPS(float2 texcoord,
float4 offset,
SMAATexture2D(colorTex),
@@ -1369,6 +1373,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
SMAA_BRANCH
if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5) {
float4 color = SMAASampleLevelZero(colorTex, texcoord);
+ //color.rgb = srgb_to_linear(color.rgb);
#if SMAA_REPROJECTION
float2 velocity = SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, texcoord));
@@ -1377,6 +1382,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
color.a = sqrt(5.0 * length(velocity));
#endif
+ //color.rgb = linear_to_srgb(color.rgb);
return color;
} else {
bool h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical)
@@ -1393,8 +1399,13 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
// We exploit bilinear filtering to mix current pixel with the chosen
// neighbor:
- float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy);
- color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw);
+ float4 color = SMAASampleLevelZero(colorTex, blendingCoord.xy);
+ //color.rgb = srgb_to_linear(color.rgb);
+ color = blendingWeight.x * color;
+
+ float4 color2 = SMAASampleLevelZero(colorTex, blendingCoord.zw);
+ //color2.rgb = srgb_to_linear(color2.rgb);
+ color += blendingWeight.y * color2;
#if SMAA_REPROJECTION
// Antialias velocity for proper reprojection in a later stage:
@@ -1405,6 +1416,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
color.a = sqrt(5.0 * length(velocity));
#endif
+ //color.rgb = linear_to_srgb(color.rgb);
return color;
}
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl
index f1e0295859..084a334346 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl
@@ -23,7 +23,7 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform float minimum_alpha;
uniform sampler2D diffuseMap;
@@ -49,5 +49,5 @@ void main()
}
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl
index 18ce998cb6..5986e8e462 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl
@@ -23,7 +23,7 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform float minimum_alpha;
@@ -51,5 +51,5 @@ void main()
}
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
index 37dcbbd328..4396ae89a4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
@@ -25,10 +25,10 @@
/*[EXTRA_CODE_HERE]*/
-out vec4 frag_color;
+//out vec4 frag_color;
void main()
{
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl
index dbaab9bbda..90d81ab6b2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl
@@ -23,7 +23,7 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform sampler2D diffuseMap;
@@ -52,5 +52,5 @@ void main()
}
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl
index 07a2218db2..2b314db51a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl
@@ -23,7 +23,7 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform sampler2D diffuseMap;
@@ -42,5 +42,5 @@ void main()
discard;
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
index 4ccc6f54a8..a24e7c0b90 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
@@ -30,7 +30,7 @@ out vec4 frag_color;
uniform sampler2D diffuseRect;
uniform float gamma;
-uniform vec2 screen_res;
+//uniform vec2 screen_res;
in vec2 vary_fragcoord;
vec3 linear_to_srgb(vec3 cl);
@@ -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/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
index f208ac746b..a37e970feb 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
@@ -25,7 +25,7 @@
/*[EXTRA_CODE_HERE]*/
-out vec4 frag_color;
+//out vec4 frag_color;
in vec4 post_pos;
in float target_pos_x;
@@ -59,5 +59,5 @@ void main()
}
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
index b55d769fd6..c4e4c4d051 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
@@ -23,9 +23,9 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
void main()
{
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl
index 6f7bd2bf3c..033c2f924a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl
@@ -113,8 +113,8 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen)
if (spos.z > -shadow_clip.w)
{
vec4 lpos;
- vec4 near_split = shadow_clip*-0.75;
- vec4 far_split = shadow_clip*-1.25;
+ vec4 near_split = shadow_clip*-0.9;
+ vec4 far_split = shadow_clip*-1.1;
vec4 transition_domain = near_split-far_split;
float weight = 0.0;
@@ -131,7 +131,10 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen)
shadow += contrib;
weight += w;
}
- shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
+
+ //shadow += max( (pos.z+shadow_clip.z) / (shadow_clip.z-shadow_clip.w) * 2.0 - 1.0, 0.0);
+ shadow += max( (pos.z+shadow_clip.z) / (shadow_clip.z-shadow_clip.w) * 1.0, 0.0);
+ //shadow -= max( (shadow_clip.z + pos.z) / (shadow_clip.z - shadow_clip.w) , 0.0);
}
if (spos.z < near_split.y && spos.z > far_split.z)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl b/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl
index a63b8d7c2b..774ccb6baf 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl
@@ -117,27 +117,34 @@ uniform float exposure;
uniform float tonemap_mix;
uniform int tonemap_type;
+
vec3 toneMap(vec3 color)
{
#ifndef NO_POST
- float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r;
-
- color *= exposure * exp_scale;
+ vec3 linear_input_color = color;
- vec3 clamped_color = clamp(color.rgb, vec3(0.0), vec3(1.0));
+ float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r;
+ float final_exposure = exposure * exp_scale;
+ vec3 exposed_color = color * final_exposure;
+ vec3 tonemapped_color = exposed_color;
switch(tonemap_type)
{
case 0:
- color = PBRNeutralToneMapping(color);
+ tonemapped_color = PBRNeutralToneMapping(exposed_color);
break;
case 1:
- color = toneMapACES_Hill(color);
+ tonemapped_color = toneMapACES_Hill(exposed_color);
break;
}
- // mix tonemapped and linear here to provide adjustment
- color = mix(clamped_color, color, tonemap_mix);
+ vec3 exposed_linear_input = linear_input_color * final_exposure;
+ color = mix(exposed_linear_input, tonemapped_color, tonemap_mix);
+
+ color = clamp(color, 0.0, 1.0);
+#else
+ color *= exposure * texture(exposureMap, vec2(0.5,0.5)).r;
+ color = clamp(color, 0.0, 1.0);
#endif
return color;
@@ -147,20 +154,24 @@ vec3 toneMap(vec3 color)
vec3 toneMapNoExposure(vec3 color)
{
#ifndef NO_POST
- vec3 clamped_color = clamp(color.rgb, vec3(0.0), vec3(1.0));
+ vec3 linear_input_color = color;
+ vec3 tonemapped_color = color;
switch(tonemap_type)
{
case 0:
- color = PBRNeutralToneMapping(color);
+ tonemapped_color = PBRNeutralToneMapping(color);
break;
case 1:
- color = toneMapACES_Hill(color);
+ tonemapped_color = toneMapACES_Hill(color);
break;
}
- // mix tonemapped and linear here to provide adjustment
- color = mix(clamped_color, color, tonemap_mix);
+ color = mix(linear_input_color, tonemapped_color, tonemap_mix);
+
+ color = clamp(color, 0.0, 1.0);
+#else
+ color = clamp(color, 0.0, 1.0);
#endif
return color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
index 33a5efa45d..4579d4fbe0 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
@@ -26,7 +26,7 @@
/*[EXTRA_CODE_HERE]*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform float minimum_alpha;
@@ -43,5 +43,5 @@ void main()
discard;
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl
new file mode 100644
index 0000000000..0efbbdce96
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl
@@ -0,0 +1,37 @@
+out vec4 frag_color;
+
+in vec2 vary_texcoord0;
+
+uniform sampler2D bloomEMap;
+
+uniform bool bloomHorizontal;
+uniform float bloomBlurRadius = 1.5;
+
+uniform float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);
+
+void main()
+{
+ vec2 size = vec2(bloomBlurRadius, bloomBlurRadius);
+
+ vec2 tex_offset = size / textureSize(bloomEMap, 0); // gets size of single texel
+ vec3 result = texture(bloomEMap, vary_texcoord0).rgb * weight[0]; // current fragment's contribution
+
+ if(bloomHorizontal)
+ {
+ for(int i = 1; i < 5; i++)
+ {
+ result += texture(bloomEMap, vary_texcoord0 + vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
+ result += texture(bloomEMap, vary_texcoord0 - vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
+ }
+ }
+ else
+ {
+ for(int i = 1; i < 5; i++)
+ {
+ result += texture(bloomEMap, vary_texcoord0 + vec2(0.0, tex_offset.y * i)).rgb * weight[i];
+ result += texture(bloomEMap, vary_texcoord0 - vec2(0.0, tex_offset.y * i)).rgb * weight[i];
+ }
+ }
+
+ frag_color = vec4(result, 1.0);
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl
new file mode 100644
index 0000000000..e40b60ed3c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl
@@ -0,0 +1,8 @@
+in vec3 position;
+out vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = vec4(position, 1.0);
+ vary_texcoord0.xy = position.xy * 0.5 + 0.5;
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl
new file mode 100644
index 0000000000..40cfdd6bff
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl
@@ -0,0 +1,21 @@
+out vec4 frag_color;
+
+in vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+uniform sampler2D bloomBlurredMap;
+
+uniform float bloomStrength;
+uniform float bloomClampValue;
+
+void main()
+{
+ vec4 hdrColor = texture(diffuseMap, vary_texcoord0);
+ vec4 bloomColor = texture(bloomBlurredMap, vary_texcoord0);
+ vec4 result = hdrColor;
+
+ result.rgb += bloomStrength * bloomColor.rgb;
+ result.rgb = clamp(result.rgb, vec3(0.0), vec3(bloomClampValue));
+
+ frag_color = result;
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl
new file mode 100644
index 0000000000..e40b60ed3c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl
@@ -0,0 +1,8 @@
+in vec3 position;
+out vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = vec4(position, 1.0);
+ vary_texcoord0.xy = position.xy * 0.5 + 0.5;
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl
new file mode 100644
index 0000000000..66d86eec1f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl
@@ -0,0 +1,89 @@
+out vec4 frag_color;
+
+uniform sampler2D diffuseMap;
+uniform sampler2D bloomExtractORM; // orm
+//uniform sampler2D bloomExtractEmissive; // emissive
+uniform sampler2D bloomExtractEmissive2; // emissive 2
+
+uniform float bloomExtractBrightness = 0.9;
+uniform float bloomExtractMetal = 0.20;
+uniform float bloomExtractNonMetal = 0.20;
+
+in vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 col = texture(diffuseMap, vary_texcoord0.xy);
+
+ if(col.a > 0.001)
+ {
+ discard;
+ return;
+ }
+
+ //int valid = 0;
+ //float brightness = dot(col.rgb, vec3(0.2126, 0.7152, 0.0722));
+ float brightness = dot(col.rgb, vec3(0.3, 0.5, 0.2));
+
+ if(brightness < bloomExtractBrightness)
+ {
+ discard;
+ return;
+ }
+
+ /*
+ vec3 emi = texture(bloomExtractEmissive, vary_texcoord0.xy).rgb;
+ if(emi.r + emi.g + emi.b > 0.01)
+ {
+ discard;
+ return;
+ }
+ */
+
+ vec3 emi = texture(bloomExtractEmissive2, vary_texcoord0.xy).rgb;
+ if(emi.r + emi.g + emi.b > 0.01)
+ {
+ discard;
+ return;
+ }
+
+ vec4 orm = texture(bloomExtractORM, vary_texcoord0.xy);
+
+ if(orm.r < 0.7)
+ {
+ discard;
+ return;
+ }
+
+ if(bloomExtractMetal == 1.0 && bloomExtractNonMetal == 1.0)
+ {
+ frag_color = vec4(col.rgb, 0.0);
+ return;
+ }
+
+ if(orm.b < 0.15)
+ {
+ // non metal
+ if(orm.g >= bloomExtractNonMetal)
+ {
+ discard;
+ return;
+ }
+ }
+ else if(orm.b > 0.8)
+ {
+ // metal
+ if(orm.g >= bloomExtractMetal)
+ {
+ discard;
+ return;
+ }
+ }
+ else
+ {
+ discard;
+ return;
+ }
+
+ frag_color = vec4(col.rgb, 0.0);
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl
new file mode 100644
index 0000000000..e40b60ed3c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl
@@ -0,0 +1,8 @@
+in vec3 position;
+out vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = vec4(position, 1.0);
+ vary_texcoord0.xy = position.xy * 0.5 + 0.5;
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
index c7cb076099..ffc5d86d9d 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
@@ -28,7 +28,6 @@ out vec4 frag_color;
uniform float minimum_alpha;
vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
in vec4 vertex_color;
in vec2 vary_texcoord0;
@@ -45,7 +44,6 @@ void default_lighting()
color *= vertex_color;
color.rgb = atmosLighting(color.rgb);
- color.rgb = scaleSoftClip(color.rgb);
frag_color = max(color, vec4(0));
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
index 77324edcff..0519ae1090 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
@@ -30,7 +30,6 @@ uniform float minimum_alpha;
uniform sampler2D diffuseMap;
vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
in vec4 vertex_color;
in vec2 vary_texcoord0;
@@ -48,7 +47,6 @@ void default_lighting()
color.rgb = atmosLighting(color.rgb);
- color.rgb = scaleSoftClip(color.rgb);
frag_color = max(color, vec4(0));
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
index e8523935ed..2d43ef60be 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
@@ -29,7 +29,6 @@ in vec4 vertex_color;
in vec2 vary_texcoord0;
vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
void default_lighting()
{
@@ -37,7 +36,6 @@ void default_lighting()
color.rgb = atmosLighting(color.rgb);
- color.rgb = scaleSoftClip(color.rgb);
frag_color = max(color, vec4(0));
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
index 95200444b9..83c36dea6d 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
@@ -31,7 +31,7 @@ in vec2 vary_texcoord0;
uniform sampler2D diffuseMap;
vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
+//vec3 scaleSoftClip(vec3 light);
void default_lighting()
{
@@ -39,7 +39,7 @@ void default_lighting()
color.rgb = atmosLighting(color.rgb);
- color.rgb = scaleSoftClip(color.rgb);
+ //color.rgb = scaleSoftClip(color.rgb);
frag_color = max(color, vec4(0));
}
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
index a892ff9cdc..6fc1747089 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
@@ -25,7 +25,6 @@
vec3 getAdditiveColor();
vec3 getAtmosAttenuation();
-vec3 scaleSoftClipFrag(vec3 light);
vec3 srgb_to_linear(vec3 col);
vec3 linear_to_srgb(vec3 col);
diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
index f8803f1a29..9b6b2e5b33 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
@@ -39,7 +39,6 @@ uniform int sun_up_factor;
uniform int classic_mode;
vec4 applySkyAndWaterFog(vec3 pos, vec3 additive, vec3 atten, vec4 color);
-vec3 scaleSoftClipFragLinear(vec3 l);
void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive);
void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist);
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index 6cec65ad83..2b42d757cb 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -64,7 +64,6 @@ vec4 getPositionWithDepth(vec2 pos_screen, float depth);
void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive);
vec3 atmosFragLightingLinear(vec3 l, vec3 additive, vec3 atten);
-vec3 scaleSoftClipFragLinear(vec3 l);
// reflection probe interface
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
index b9de4edc67..c2167dfcba 100644
--- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
@@ -33,7 +33,6 @@ out vec4 frag_color;
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
#endif
-vec3 scaleSoftClipFragLinear(vec3 l);
void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive);
vec4 applyWaterFogViewLinear(vec3 pos, vec4 color);
@@ -119,7 +118,6 @@ vec3 srgb_to_linear(vec3 col);
vec3 linear_to_srgb(vec3 col);
vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
vec3 toneMapNoExposure(vec3 color);
vec3 vN, vT, vB;
@@ -328,7 +326,7 @@ void main()
radiance *= df2.y;
//radiance = toneMapNoExposure(radiance);
vec3 color = vec3(0);
- color = mix(fb.rgb, radiance, min(1.0, df2.x)) + punctual.rgb;
+ color = mix(fb.rgb, radiance, min(5.0, df2.x)) + punctual.rgb;
float water_haze_scale = 4.0;
@@ -346,6 +344,5 @@ void main()
float spec = min(max(max(punctual.r, punctual.g), punctual.b), 0.0);
- frag_color = min(vec4(1),max(vec4(color.rgb, spec * water_mask), vec4(0)));
+ frag_color = min(vec4(5),max(vec4(color.rgb, spec * water_mask), vec4(0)));
}
-
diff --git a/indra/newview/character/attentions.xml b/indra/newview/character/attentions.xml
index 9bda3309ac..be9a2b28fc 100644
--- a/indra/newview/character/attentions.xml
+++ b/indra/newview/character/attentions.xml
@@ -33,7 +33,7 @@ MOUSELOOK: Tracks center of view when in mouselook view mode.
<param attention="hover" priority="4.0" timeout="1.0" />
<param attention="conversation" priority="0.0" timeout="-1" />
<param attention="select" priority="6.0" timeout="-1" />
- <param attention="focus" priority="0.0" timeout="-1" />
+ <param attention="focus" priority="6.0" timeout="-1" />
<param attention="mouselook" priority="7.0" timeout="-1" />
</gender>
<gender name="Feminine">
@@ -44,7 +44,7 @@ MOUSELOOK: Tracks center of view when in mouselook view mode.
<param attention="hover" priority="4.0" timeout="1.0" />
<param attention="conversation" priority="0.0" timeout="-1" />
<param attention="select" priority="6.0" timeout="-1" />
- <param attention="focus" priority="0.0" timeout="-1" />
+ <param attention="focus" priority="6.0" timeout="-1" />
<param attention="mouselook" priority="7.0" timeout="-1" />
</gender>
</linden_attentions>
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 3233afc28d..396ece9dc1 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -69,7 +69,7 @@ RenderMaxTextureIndex 1 16
RenderGLContextCoreProfile 1 1
RenderGLMultiThreadedTextures 1 1
RenderGLMultiThreadedMedia 1 1
-RenderAppleUseMultGL 1 1
+RenderAppleUseMultGL 1 0
RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 2
RenderScreenSpaceReflections 1 1
@@ -129,7 +129,8 @@ RenderTonemapType 1 1
RenderTonemapMix 1 0.7
RenderDisableVintageMode 1 0
RenderMaxTextureResolution 1 512
-RenderReflectionProbeCount 1 8
+RenderReflectionProbeCount 1 4
+RenderReflectionProbeDrawDistance 1 16.0
//
@@ -152,7 +153,7 @@ RenderTerrainPBRDetail 1 -1
RenderTerrainPBRPlanarSampleCount 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.125
+RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
@@ -173,7 +174,8 @@ RenderTonemapType 1 1
RenderTonemapMix 1 0.7
RenderDisableVintageMode 1 0
RenderMaxTextureResolution 1 1024
-RenderReflectionProbeCount 1 32
+RenderReflectionProbeCount 1 16
+RenderReflectionProbeDrawDistance 1 24.0
//
// Medium Graphics Settings (standard)
@@ -195,7 +197,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.25
+RenderVolumeLODFactor 1 2.5
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
@@ -216,6 +218,7 @@ RenderTonemapType 1 1
RenderTonemapMix 1 0.7
RenderMaxTextureResolution 1 2048
RenderReflectionProbeCount 1 64
+RenderReflectionProbeDrawDistance 1 32.0
//
// Medium High Graphics Settings
@@ -237,7 +240,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.375
+RenderVolumeLODFactor 1 3.5
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
@@ -279,7 +282,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 3
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.5
+RenderVolumeLODFactor 1 3.8
RenderDeferredSSAO 1 1
RenderShadowDetail 1 1
WLSkyDetail 1 96
@@ -321,7 +324,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 3
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.75
+RenderVolumeLODFactor 1 4.0
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WLSkyDetail 1 96
@@ -362,7 +365,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 3
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderVolumeLODFactor 1 2.0
+RenderVolumeLODFactor 1 4.0
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferredSSAO 1 1
@@ -406,7 +409,7 @@ RenderCompressTextures 1 0
//
list safe
RenderAnisotropic 1 0
-RenderAvatarMaxNonImpostors 1 16
+RenderAvatarMaxNonImpostors 1 3
RenderAvatarMaxComplexity 1 80000
RenderLocalLightCount 1 0
RenderMaxPartCount 1 1024
diff --git a/indra/newview/gltf/accessor.cpp b/indra/newview/gltf/accessor.cpp
index d1845605d4..f0ad3fa594 100644
--- a/indra/newview/gltf/accessor.cpp
+++ b/indra/newview/gltf/accessor.cpp
@@ -158,8 +158,13 @@ bool Buffer::prep(Asset& asset)
{
std::string dir = gDirUtilp->getDirName(asset.mFilename);
std::string bin_file = dir + gDirUtilp->getDirDelimiter() + mUri;
+ if (!gDirUtilp->fileExists(bin_file))
+ {
+ // Characters might be escaped in the URI
+ bin_file = dir + gDirUtilp->getDirDelimiter() + LLURI::unescape(mUri);
+ }
- std::ifstream file(bin_file, std::ios::binary);
+ llifstream file(bin_file.c_str(), std::ios::binary);
if (!file.is_open())
{
LL_WARNS("GLTF") << "Failed to open file: " << bin_file << LL_ENDL;
diff --git a/indra/newview/gltf/asset.cpp b/indra/newview/gltf/asset.cpp
index a399a59f40..f7a5a20872 100644
--- a/indra/newview/gltf/asset.cpp
+++ b/indra/newview/gltf/asset.cpp
@@ -50,6 +50,10 @@ namespace LL
"KHR_texture_transform"
};
+ static std::unordered_set<std::string> ExtensionsIgnored = {
+ "KHR_materials_pbrSpecularGlossiness"
+ };
+
Material::AlphaMode gltf_alpha_mode_to_enum(const std::string& alpha_mode)
{
if (alpha_mode == "OPAQUE")
@@ -472,11 +476,14 @@ void Asset::update()
for (auto& image : mImages)
{
- if (image.mTexture.notNull())
- { // HACK - force texture to be loaded full rez
- // TODO: calculate actual vsize
- image.mTexture->addTextureStats(2048.f * 2048.f);
- image.mTexture->setBoostLevel(LLViewerTexture::BOOST_HIGH);
+ if (image.mLoadIntoTexturePipe)
+ {
+ if (image.mTexture.notNull())
+ { // HACK - force texture to be loaded full rez
+ // TODO: calculate actual vsize
+ image.mTexture->addTextureStats(2048.f * 2048.f);
+ image.mTexture->setBoostLevel(LLViewerTexture::BOOST_HIGH);
+ }
}
}
}
@@ -486,18 +493,23 @@ void Asset::update()
bool Asset::prep()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_GLTF;
- // check required extensions and fail if not supported
- bool unsupported = false;
+ // check required extensions
for (auto& extension : mExtensionsRequired)
{
if (ExtensionsSupported.find(extension) == ExtensionsSupported.end())
{
- LL_WARNS() << "Unsupported extension: " << extension << LL_ENDL;
- unsupported = true;
+ if (ExtensionsIgnored.find(extension) == ExtensionsIgnored.end())
+ {
+ LL_WARNS() << "Unsupported extension: " << extension << LL_ENDL;
+ mUnsupportedExtensions.push_back(extension);
+ }
+ else
+ {
+ mIgnoredExtensions.push_back(extension);
+ }
}
}
-
- if (unsupported)
+ if (mUnsupportedExtensions.size() > 0)
{
return false;
}
@@ -513,7 +525,7 @@ bool Asset::prep()
for (auto& image : mImages)
{
- if (!image.prep(*this))
+ if (!image.prep(*this, mLoadIntoVRAM))
{
return false;
}
@@ -542,102 +554,110 @@ bool Asset::prep()
return false;
}
}
+ if (mLoadIntoVRAM)
+ {
+ // prepare vertex buffers
- // prepare vertex buffers
-
- // material count is number of materials + 1 for default material
- U32 mat_count = (U32) mMaterials.size() + 1;
-
- if (LLGLSLShader::sCurBoundShaderPtr == nullptr)
- { // make sure a shader is bound to satisfy mVertexBuffer->setBuffer
- gDebugProgram.bind();
- }
+ // material count is number of materials + 1 for default material
+ U32 mat_count = (U32) mMaterials.size() + 1;
- for (S32 double_sided = 0; double_sided < 2; ++double_sided)
- {
- RenderData& rd = mRenderData[double_sided];
- for (U32 i = 0; i < LLGLSLShader::NUM_GLTF_VARIANTS; ++i)
- {
- rd.mBatches[i].resize(mat_count);
+ if (LLGLSLShader::sCurBoundShaderPtr == nullptr)
+ { // make sure a shader is bound to satisfy mVertexBuffer->setBuffer
+ gDebugProgram.bind();
}
- // for each material
- for (S32 mat_id = -1; mat_id < (S32)mMaterials.size(); ++mat_id)
+ for (S32 double_sided = 0; double_sided < 2; ++double_sided)
{
- // for each shader variant
- U32 vertex_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 };
- U32 index_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 };
-
- S32 ds_mat = mat_id == -1 ? 0 : mMaterials[mat_id].mDoubleSided;
- if (ds_mat != double_sided)
+ RenderData& rd = mRenderData[double_sided];
+ for (U32 i = 0; i < LLGLSLShader::NUM_GLTF_VARIANTS; ++i)
{
- continue;
+ rd.mBatches[i].resize(mat_count);
}
- for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant)
+ // for each material
+ for (S32 mat_id = -1; mat_id < (S32)mMaterials.size(); ++mat_id)
{
- U32 attribute_mask = 0;
- // for each mesh
- for (auto& mesh : mMeshes)
- {
- // for each primitive
- for (auto& primitive : mesh.mPrimitives)
- {
- if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant)
- {
- // accumulate vertex and index counts
- primitive.mVertexOffset = vertex_count[variant];
- primitive.mIndexOffset = index_count[variant];
-
- vertex_count[variant] += primitive.getVertexCount();
- index_count[variant] += primitive.getIndexCount();
+ // for each shader variant
+ U32 vertex_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 };
+ U32 index_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 };
- // all primitives of a given variant and material should all have the same attribute mask
- llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask);
- attribute_mask |= primitive.mAttributeMask;
- }
- }
+ S32 ds_mat = mat_id == -1 ? 0 : mMaterials[mat_id].mDoubleSided;
+ if (ds_mat != double_sided)
+ {
+ continue;
}
- // allocate vertex buffer and pack it
- if (vertex_count[variant] > 0)
+ for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant)
{
- U32 mat_idx = mat_id + 1;
- LLVertexBuffer* vb = new LLVertexBuffer(attribute_mask);
-
- rd.mBatches[variant][mat_idx].mVertexBuffer = vb;
- vb->allocateBuffer(vertex_count[variant],
- index_count[variant] * 2); // hack double index count... TODO: find a better way to indicate 32-bit indices will be used
- vb->setBuffer();
-
+#ifdef SHOW_ASSERT
+ U32 attribute_mask = 0;
+#endif
+ // for each mesh
for (auto& mesh : mMeshes)
{
+ // for each primitive
for (auto& primitive : mesh.mPrimitives)
{
if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant)
{
- primitive.upload(vb);
+ // accumulate vertex and index counts
+ primitive.mVertexOffset = vertex_count[variant];
+ primitive.mIndexOffset = index_count[variant];
+
+ vertex_count[variant] += primitive.getVertexCount();
+ index_count[variant] += primitive.getIndexCount();
+
+ // 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
}
}
}
- vb->unmapBuffer();
+ // allocate vertex buffer and pack it
+ if (vertex_count[variant] > 0)
+ {
+ U32 mat_idx = mat_id + 1;
+ #if 0
+ LLVertexBuffer* vb = new LLVertexBuffer(attribute_mask);
+
+ rd.mBatches[variant][mat_idx].mVertexBuffer = vb;
+ vb->allocateBuffer(vertex_count[variant],
+ index_count[variant] * 2); // hack double index count... TODO: find a better way to indicate 32-bit indices will be used
+ vb->setBuffer();
+
+ for (auto& mesh : mMeshes)
+ {
+ for (auto& primitive : mesh.mPrimitives)
+ {
+ if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant)
+ {
+ primitive.upload(vb);
+ }
+ }
+ }
+
+ vb->unmapBuffer();
- vb->unbind();
+ vb->unbind();
+ #endif
+ }
}
}
}
- }
- // sanity check that all primitives have a vertex buffer
- for (auto& mesh : mMeshes)
- {
- for (auto& primitive : mesh.mPrimitives)
+ // sanity check that all primitives have a vertex buffer
+ for (auto& mesh : mMeshes)
{
- llassert(primitive.mVertexBuffer.notNull());
+ for (auto& primitive : mesh.mPrimitives)
+ {
+ //llassert(primitive.mVertexBuffer.notNull());
+ }
}
}
-
+ #if 0
// build render batches
for (S32 node_id = 0; node_id < mNodes.size(); ++node_id)
{
@@ -664,6 +684,7 @@ bool Asset::prep()
}
}
}
+ #endif
return true;
}
@@ -672,13 +693,14 @@ Asset::Asset(const Value& src)
*this = src;
}
-bool Asset::load(std::string_view filename)
+bool Asset::load(std::string_view filename, bool loadIntoVRAM)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_GLTF;
+ mLoadIntoVRAM = loadIntoVRAM;
mFilename = filename;
std::string ext = gDirUtilp->getExtension(mFilename);
- std::ifstream file(filename.data(), std::ios::binary);
+ llifstream file(filename.data(), std::ios::binary);
if (file.is_open())
{
std::string str((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
@@ -692,7 +714,7 @@ bool Asset::load(std::string_view filename)
}
else if (ext == "glb")
{
- return loadBinary(str);
+ return loadBinary(str, mLoadIntoVRAM);
}
else
{
@@ -709,8 +731,9 @@ bool Asset::load(std::string_view filename)
return false;
}
-bool Asset::loadBinary(const std::string& data)
+bool Asset::loadBinary(const std::string& data, bool loadIntoVRAM)
{
+ mLoadIntoVRAM = loadIntoVRAM;
// load from binary gltf
const U8* ptr = (const U8*)data.data();
const U8* end = ptr + data.size();
@@ -935,8 +958,9 @@ void Asset::eraseBufferView(S32 bufferView)
LLViewerFetchedTexture* fetch_texture(const LLUUID& id);
-bool Image::prep(Asset& asset)
+bool Image::prep(Asset& asset, bool loadIntoVRAM)
{
+ mLoadIntoTexturePipe = loadIntoVRAM;
LLUUID id;
if (mUri.size() == UUID_STR_SIZE && LLUUID::parseUUID(mUri, &id) && id.notNull())
{ // loaded from an asset, fetch the texture from the asset system
@@ -951,12 +975,12 @@ bool Image::prep(Asset& asset)
{ // embedded in a buffer, load the texture from the buffer
BufferView& bufferView = asset.mBufferViews[mBufferView];
Buffer& buffer = asset.mBuffers[bufferView.mBuffer];
-
- U8* data = buffer.mData.data() + bufferView.mByteOffset;
-
- mTexture = LLViewerTextureManager::getFetchedTextureFromMemory(data, bufferView.mByteLength, mMimeType);
-
- if (mTexture.isNull())
+ if (mLoadIntoTexturePipe)
+ {
+ U8* data = buffer.mData.data() + bufferView.mByteOffset;
+ mTexture = LLViewerTextureManager::getFetchedTextureFromMemory(data, bufferView.mByteLength, mMimeType);
+ }
+ else if (mTexture.isNull() && mLoadIntoTexturePipe)
{
LL_WARNS("GLTF") << "Failed to load image from buffer:" << LL_ENDL;
LL_WARNS("GLTF") << " image: " << mName << LL_ENDL;
@@ -971,12 +995,12 @@ bool Image::prep(Asset& asset)
std::string img_file = dir + gDirUtilp->getDirDelimiter() + mUri;
LLUUID tracking_id = LLLocalBitmapMgr::getInstance()->addUnit(img_file);
- if (tracking_id.notNull())
+ if (tracking_id.notNull() && mLoadIntoTexturePipe)
{
LLUUID world_id = LLLocalBitmapMgr::getInstance()->getWorldID(tracking_id);
mTexture = LLViewerTextureManager::getFetchedTexture(world_id);
}
- else
+ else if (mLoadIntoTexturePipe)
{
LL_WARNS("GLTF") << "Failed to load image from file:" << LL_ENDL;
LL_WARNS("GLTF") << " image: " << mName << LL_ENDL;
@@ -991,7 +1015,7 @@ bool Image::prep(Asset& asset)
return false;
}
- if (!asset.mFilename.empty())
+ if (!asset.mFilename.empty() && mLoadIntoTexturePipe)
{ // local preview, boost image so it doesn't discard and force to save raw image in case we save out or upload
mTexture->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
mTexture->forceToSaveRawImage(0, F32_MAX);
diff --git a/indra/newview/gltf/asset.h b/indra/newview/gltf/asset.h
index 27821659db..b9554d753c 100644
--- a/indra/newview/gltf/asset.h
+++ b/indra/newview/gltf/asset.h
@@ -286,6 +286,7 @@ namespace LL
void serialize(boost::json::object& dst) const;
};
+ // Image is for images that we want to load for the given asset. This acts as an interface into the viewer's texture pipe.
class Image
{
public:
@@ -301,6 +302,8 @@ namespace LL
S32 mBits = -1;
S32 mPixelType = -1;
+ bool mLoadIntoTexturePipe = false;
+
LLPointer<LLViewerFetchedTexture> mTexture;
const Image& operator=(const Value& src);
@@ -316,7 +319,7 @@ namespace LL
// preserve only uri and name
void clearData(Asset& asset);
- bool prep(Asset& asset);
+ bool prep(Asset& asset, bool loadIntoVRAM);
};
// Render Batch -- vertex buffer and list of primitives to render using
@@ -391,6 +394,10 @@ namespace LL
// UBO for storing material data
U32 mMaterialsUBO = 0;
+ bool mLoadIntoVRAM = false;
+
+ std::vector<std::string> mUnsupportedExtensions;
+ std::vector<std::string> mIgnoredExtensions;
// prepare for first time use
bool prep();
@@ -428,12 +435,12 @@ namespace LL
// accepts .gltf and .glb files
// Any existing data will be lost
// returns result of prep() on success
- bool load(std::string_view filename);
+ bool load(std::string_view filename, bool loadIntoVRAM);
// load .glb contents from memory
// data - binary contents of .glb file
// returns result of prep() on success
- bool loadBinary(const std::string& data);
+ bool loadBinary(const std::string& data, bool loadIntoVRAM);
const Asset& operator=(const Value& src);
void serialize(boost::json::object& dst) const;
diff --git a/indra/newview/gltf/buffer_util.h b/indra/newview/gltf/buffer_util.h
index ef9bba8128..c231443a9e 100644
--- a/indra/newview/gltf/buffer_util.h
+++ b/indra/newview/gltf/buffer_util.h
@@ -147,6 +147,12 @@ namespace LL
}
template<>
+ inline void copyVec3<F32, LLVector2>(F32* src, LLVector2& dst)
+ {
+ dst.set(src[0], src[1]);
+ }
+
+ template<>
inline void copyVec3<F32, vec3>(F32* src, vec3& dst)
{
dst = vec3(src[0], src[1], src[2]);
@@ -159,6 +165,12 @@ namespace LL
}
template<>
+ inline void copyVec3<F32, LLColor4U>(F32* src, LLColor4U& dst)
+ {
+ dst.set((U8)(src[0] * 255.f), (U8)(src[1] * 255.f), (U8)(src[2] * 255.f), 255);
+ }
+
+ template<>
inline void copyVec3<U16, LLColor4U>(U16* src, LLColor4U& dst)
{
dst.set((U8)(src[0]), (U8)(src[1]), (U8)(src[2]), 255);
@@ -369,7 +381,18 @@ namespace LL
template<class T>
inline void copy(Asset& asset, Accessor& accessor, LLStrider<T>& dst)
{
+ if (accessor.mBufferView == INVALID_INDEX
+ || accessor.mBufferView >= asset.mBufferViews.size())
+ {
+ LL_WARNS("GLTF") << "Invalid buffer" << LL_ENDL;
+ return;
+ }
const BufferView& bufferView = asset.mBufferViews[accessor.mBufferView];
+ if (bufferView.mBuffer >= asset.mBuffers.size())
+ {
+ LL_WARNS("GLTF") << "Invalid buffer view" << LL_ENDL;
+ return;
+ }
const Buffer& buffer = asset.mBuffers[bufferView.mBuffer];
const U8* src = buffer.mData.data() + bufferView.mByteOffset + accessor.mByteOffset;
diff --git a/indra/newview/gltf/llgltfloader.cpp b/indra/newview/gltf/llgltfloader.cpp
new file mode 100644
index 0000000000..4f8f80129d
--- /dev/null
+++ b/indra/newview/gltf/llgltfloader.cpp
@@ -0,0 +1,1833 @@
+/**
+ * @file LLGLTFLoader.cpp
+ * @brief LLGLTFLoader class implementation
+ *
+ * $LicenseInfo:firstyear=2022&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2022, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llgltfloader.h"
+#include "meshoptimizer.h"
+#include <glm/gtc/packing.hpp>
+
+// Import & define single-header gltf import/export lib
+#define TINYGLTF_IMPLEMENTATION
+#define TINYGLTF_USE_CPP14 // default is C++ 11
+
+// tinygltf by default loads image files using STB
+#define STB_IMAGE_IMPLEMENTATION
+// to use our own image loading:
+// 1. replace this definition with TINYGLTF_NO_STB_IMAGE
+// 2. provide image loader callback with TinyGLTF::SetImageLoader(LoadimageDataFunction LoadImageData, void *user_data)
+
+// tinygltf saves image files using STB
+#define STB_IMAGE_WRITE_IMPLEMENTATION
+// similarly, can override with TINYGLTF_NO_STB_IMAGE_WRITE and TinyGLTF::SetImageWriter(fxn, data)
+
+// Additionally, disable inclusion of STB header files entirely with
+// TINYGLTF_NO_INCLUDE_STB_IMAGE
+// TINYGLTF_NO_INCLUDE_STB_IMAGE_WRITE
+#include "tinygltf/tiny_gltf.h"
+
+
+// TODO: includes inherited from dae loader. Validate / prune
+
+#include "llsdserialize.h"
+#include "lljoint.h"
+#include "llbase64.h"
+#include "lldir.h"
+
+#include "llmatrix4a.h"
+
+#include <boost/regex.hpp>
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/exception/diagnostic_information.hpp>
+#include <fstream>
+
+static const std::string lod_suffix[LLModel::NUM_LODS] =
+{
+ "_LOD0",
+ "_LOD1",
+ "_LOD2",
+ "",
+ "_PHYS",
+};
+
+// Premade rotation matrix, GLTF is Y-up while SL is Z-up
+static const glm::mat4 coord_system_rotation(
+ 1.f, 0.f, 0.f, 0.f,
+ 0.f, 0.f, 1.f, 0.f,
+ 0.f, -1.f, 0.f, 0.f,
+ 0.f, 0.f, 0.f, 1.f
+);
+
+
+static const glm::mat4 coord_system_rotationxy(
+ 0.f, 1.f, 0.f, 0.f,
+ -1.f, 0.f, 0.f, 0.f,
+ 0.f, 0.f, 1.f, 0.f,
+ 0.f, 0.f, 0.f, 1.f
+);
+
+static const S32 VERTEX_SPLIT_SAFETY_MARGIN = 3 * 3 + 1; // 10 vertices: 3 complete triangles plus remapping overhead
+static const S32 VERTEX_LIMIT = USHRT_MAX - VERTEX_SPLIT_SAFETY_MARGIN;
+
+LLGLTFLoader::LLGLTFLoader(std::string filename,
+ S32 lod,
+ LLModelLoader::load_callback_t load_cb,
+ LLModelLoader::joint_lookup_func_t joint_lookup_func,
+ LLModelLoader::texture_load_func_t texture_load_func,
+ LLModelLoader::state_callback_t state_cb,
+ void * opaque_userdata,
+ JointTransformMap & jointTransformMap,
+ JointNameSet & jointsFromNodes,
+ std::map<std::string, std::string, std::less<>> & jointAliasMap,
+ U32 maxJointsPerMesh,
+ U32 modelLimit,
+ U32 debugMode,
+ std::vector<LLJointData> viewer_skeleton) //,
+ //bool preprocess)
+ : LLModelLoader( filename,
+ lod,
+ load_cb,
+ joint_lookup_func,
+ texture_load_func,
+ state_cb,
+ opaque_userdata,
+ jointTransformMap,
+ jointsFromNodes,
+ jointAliasMap,
+ maxJointsPerMesh,
+ modelLimit,
+ debugMode)
+ , mViewerJointData(viewer_skeleton)
+ , mGltfLoaded(false)
+ , mApplyXYRotation(false)
+{
+}
+
+LLGLTFLoader::~LLGLTFLoader() {}
+
+bool LLGLTFLoader::OpenFile(const std::string &filename)
+{
+ // Clear the material cache for new file
+ mMaterialCache.clear();
+
+ tinygltf::TinyGLTF loader;
+ std::string filename_lc(filename);
+ LLStringUtil::toLower(filename_lc);
+
+ try
+ {
+ mGltfLoaded = mGLTFAsset.load(filename, false);
+ }
+ catch (const std::exception& e)
+ {
+ LL_WARNS() << "Exception in LLModelLoader::run: " << e.what() << LL_ENDL;
+ LLSD args;
+ args["Message"] = "ParsingErrorException";
+ args["FILENAME"] = filename;
+ args["EXCEPTION"] = e.what();
+ mWarningsArray.append(args);
+ setLoadState(ERROR_PARSING);
+ return false;
+ }
+ catch (...)
+ {
+ LOG_UNHANDLED_EXCEPTION("LLGLTFLoader");
+ LLSD args;
+ args["Message"] = "ParsingErrorException";
+ args["FILENAME"] = filename;
+ args["EXCEPTION"] = boost::current_exception_diagnostic_information();
+ mWarningsArray.append(args);
+ setLoadState(ERROR_PARSING);
+ return false;
+ }
+
+ if (!mGltfLoaded)
+ {
+ notifyUnsupportedExtension(true);
+
+ for (const auto& buffer : mGLTFAsset.mBuffers)
+ {
+ if (buffer.mByteLength > 0 && buffer.mData.empty())
+ {
+ bool bin_file = buffer.mUri.ends_with(".bin");
+ LLSD args;
+ args["Message"] = bin_file ? "ParsingErrorMissingBufferBin" : "ParsingErrorMissingBuffer";
+ args["BUFFER_NAME"] = buffer.mName;
+ args["BUFFER_URI"] = buffer.mUri;
+ mWarningsArray.append(args);
+ }
+ }
+ setLoadState(ERROR_PARSING);
+ return false;
+ }
+
+ notifyUnsupportedExtension(false);
+
+ bool meshesLoaded = parseMeshes();
+
+ setLoadState(DONE);
+
+ return meshesLoaded;
+}
+
+void LLGLTFLoader::addModelToScene(
+ LLModel* pModel,
+ const std::string& model_name,
+ U32 submodel_limit,
+ const LLMatrix4& transformation,
+ const LLVolumeParams& volume_params,
+ const material_map& mats)
+{
+ U32 volume_faces = pModel->getNumVolumeFaces();
+
+ // Side-steps all manner of issues when splitting models
+ // and matching lower LOD materials to base models
+ //
+ pModel->sortVolumeFacesByMaterialName();
+
+ int submodelID = 0;
+
+ // remove all faces that definitely won't fit into one model and submodel limit
+ U32 face_limit = (submodel_limit + 1) * LL_SCULPT_MESH_MAX_FACES;
+ if (face_limit < volume_faces)
+ {
+ LL_WARNS("GLTF_IMPORT") << "Model contains " << volume_faces
+ << " faces, exceeding the limit of " << face_limit << LL_ENDL;
+
+ LLSD args;
+ args["Message"] = "ModelTooManySubmodels";
+ args["MODEL_NAME"] = pModel->mLabel;
+ args["SUBMODEL_COUNT"] = static_cast<S32>(llfloor((F32)volume_faces / LL_SCULPT_MESH_MAX_FACES));
+ args["SUBMODEL_LIMIT"] = static_cast<S32>(submodel_limit);
+ mWarningsArray.append(args);
+
+ pModel->setNumVolumeFaces(face_limit);
+ }
+
+ LLVolume::face_list_t remainder;
+ std::vector<LLModel*> ready_models;
+ LLModel* current_model = pModel;
+
+ do
+ {
+ current_model->trimVolumeFacesToSize(LL_SCULPT_MESH_MAX_FACES, &remainder);
+
+ volume_faces = static_cast<U32>(remainder.size());
+
+ // Don't add to scene yet because weights and materials aren't ready.
+ // Just save it
+ ready_models.push_back(current_model);
+
+ // If we have left-over volume faces, create another model
+ // to absorb them.
+ if (volume_faces)
+ {
+ LLModel* next = new LLModel(volume_params, 0.f);
+ next->ClearFacesAndMaterials();
+ next->mSubmodelID = ++submodelID;
+
+ std::string instance_name = model_name;
+ if (next->mSubmodelID > 0)
+ {
+ instance_name += (char)((int)'a' + next->mSubmodelID);
+ }
+ // Check for duplicates and add copy suffix if needed
+ int duplicate_count = 0;
+ for (const auto& inst : mScene[transformation])
+ {
+ if (inst.mLabel == instance_name)
+ {
+ ++duplicate_count;
+ }
+ }
+ if (duplicate_count > 0) {
+ instance_name += "_copy_" + std::to_string(duplicate_count);
+ }
+ next->mLabel = instance_name;
+
+ next->getVolumeFaces() = remainder;
+ next->mNormalizedScale = current_model->mNormalizedScale;
+ next->mNormalizedTranslation = current_model->mNormalizedTranslation;
+ next->mSkinWeights = current_model->mSkinWeights;
+ next->mPosition = current_model->mPosition;
+
+ const LLMeshSkinInfo& current_skin_info = current_model->mSkinInfo;
+ LLMeshSkinInfo& next_skin_info = next->mSkinInfo;
+ next_skin_info.mJointNames = current_skin_info.mJointNames;
+ next_skin_info.mJointNums = current_skin_info.mJointNums;
+ next_skin_info.mBindShapeMatrix = current_skin_info.mBindShapeMatrix;
+ next_skin_info.mInvBindMatrix = current_skin_info.mInvBindMatrix;
+ next_skin_info.mAlternateBindMatrix = current_skin_info.mAlternateBindMatrix;
+ next_skin_info.mPelvisOffset = current_skin_info.mPelvisOffset;
+
+
+ if (current_model->mMaterialList.size() > LL_SCULPT_MESH_MAX_FACES)
+ {
+ next->mMaterialList.assign(current_model->mMaterialList.begin() + LL_SCULPT_MESH_MAX_FACES, current_model->mMaterialList.end());
+ current_model->mMaterialList.resize(LL_SCULPT_MESH_MAX_FACES);
+ }
+
+ current_model = next;
+ }
+
+ remainder.clear();
+
+ } while (volume_faces);
+
+ for (auto model : ready_models)
+ {
+ // remove unused/redundant vertices
+ model->remapVolumeFaces();
+
+ mModelList.push_back(model);
+
+ std::map<std::string, LLImportMaterial> materials;
+ for (U32 i = 0; i < (U32)model->mMaterialList.size(); ++i)
+ {
+ material_map::const_iterator found = mats.find(model->mMaterialList[i]);
+ if (found != mats.end())
+ {
+ materials[model->mMaterialList[i]] = found->second;
+ }
+ else
+ {
+ materials[model->mMaterialList[i]] = LLImportMaterial();
+ }
+ }
+ // Keep base name for scene instance.
+ std::string instance_name = model->mLabel;
+ // Add suffix. Suffix is nessesary for model matching logic
+ // because sometimes higher lod can be used as a lower one, so models
+ // need unique names not just in scope of one lod, but across lods.
+ model->mLabel += lod_suffix[mLod];
+ mScene[transformation].push_back(LLModelInstance(model, instance_name, transformation, materials));
+ stretch_extents(model, transformation);
+ }
+}
+
+bool LLGLTFLoader::parseMeshes()
+{
+ if (!mGltfLoaded) return false;
+
+ // 2022-04 DJH Volume params from dae example. TODO understand PCODE
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+
+ mTransform.setIdentity();
+
+ for (auto& node : mGLTFAsset.mNodes)
+ {
+ // Make node matrix valid for correct transformation
+ node.makeMatrixValid();
+ }
+
+ if (mGLTFAsset.mSkins.size() > 0)
+ {
+ checkForXYrotation(mGLTFAsset.mSkins[0]);
+ populateJointGroups();
+ }
+
+ // Populate the joints from skins first.
+ // Multiple meshes can share the same skin, so preparing skins beforehand.
+ for (S32 i = 0; i < mGLTFAsset.mSkins.size(); i++)
+ {
+ populateJointsFromSkin(i);
+ }
+
+ // Track how many times each mesh name has been used
+ std::map<std::string, S32> mesh_name_counts;
+
+ // For now use mesh count, but might be better to do 'mNodes.size() - joints count'.
+ U32 submodel_limit = mGLTFAsset.mMeshes.size() > 0 ? mGeneratedModelLimit / (U32)mGLTFAsset.mMeshes.size() : 0;
+
+ // Check if we have scenes defined
+ if (!mGLTFAsset.mScenes.empty())
+ {
+ // Process the default scene (or first scene if no default)
+ S32 scene_idx = mGLTFAsset.mScene >= 0 ? mGLTFAsset.mScene : 0;
+
+ if (scene_idx < mGLTFAsset.mScenes.size())
+ {
+ const LL::GLTF::Scene& scene = mGLTFAsset.mScenes[scene_idx];
+
+ LL_INFOS("GLTF_IMPORT") << "Processing scene " << scene_idx << " with " << scene.mNodes.size() << " root nodes" << LL_ENDL;
+
+ // Process all root nodes defined in the scene
+ for (S32 root_idx : scene.mNodes)
+ {
+ if (root_idx >= 0 && root_idx < static_cast<S32>(mGLTFAsset.mNodes.size()))
+ {
+ processNodeHierarchy(root_idx, mesh_name_counts, submodel_limit, volume_params);
+ }
+ }
+ }
+ }
+ else
+ {
+ LL_WARNS("GLTF_IMPORT") << "No scenes defined in GLTF file" << LL_ENDL;
+
+ LLSD args;
+ args["Message"] = "NoScenesFound";
+ mWarningsArray.append(args);
+ return false;
+ }
+
+ checkGlobalJointUsage();
+
+ return true;
+}
+
+void LLGLTFLoader::processNodeHierarchy(S32 node_idx, std::map<std::string, S32>& mesh_name_counts, U32 submodel_limit, const LLVolumeParams& volume_params)
+{
+ if (node_idx < 0 || node_idx >= static_cast<S32>(mGLTFAsset.mNodes.size()))
+ return;
+
+ const LL::GLTF::Node& node = mGLTFAsset.mNodes[node_idx];
+
+ LL_DEBUGS("GLTF_IMPORT") << "Processing node " << node_idx << " (" << node.mName << ")"
+ << " - has mesh: " << (node.mMesh >= 0 ? "yes" : "no")
+ << " - children: " << node.mChildren.size() << LL_ENDL;
+
+ // Process this node's mesh if it has one
+ if (node.mMesh >= 0 && node.mMesh < mGLTFAsset.mMeshes.size())
+ {
+ // Get base node name and track usage
+ // Potentially multiple nodes can reuse the same mesh and Collada used
+ // node name instead of mesh name, so for consistency use node name if
+ // avaliable, node index otherwise.
+ std::string base_name = getLodlessLabel(node);
+ if (base_name.empty())
+ {
+ base_name = "node_" + std::to_string(node_idx);
+ }
+
+ S32 instance_count = mesh_name_counts[base_name]++;
+
+ // make name unique
+ if (instance_count > 0)
+ {
+ base_name = base_name + "_copy_" + std::to_string(instance_count);
+ }
+
+ LLMatrix4 transformation;
+ material_map mats;
+
+ LLModel* pModel = new LLModel(volume_params, 0.f);
+ const LL::GLTF::Mesh& mesh = mGLTFAsset.mMeshes[node.mMesh];
+
+ if (populateModelFromMesh(pModel, base_name, mesh, node, mats) &&
+ (LLModel::NO_ERRORS == pModel->getStatus()) &&
+ validate_model(pModel))
+ {
+ mTransform.setIdentity();
+ transformation = mTransform;
+
+ // adjust the transformation to compensate for mesh normalization
+ LLVector3 mesh_scale_vector;
+ LLVector3 mesh_translation_vector;
+ pModel->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
+
+ LLMatrix4 mesh_translation;
+ mesh_translation.setTranslation(mesh_translation_vector);
+ mesh_translation *= transformation;
+ transformation = mesh_translation;
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= transformation;
+ transformation = mesh_scale;
+
+ if (node.mSkin >= 0)
+ {
+ // "Bind Shape Matrix" is supposed to transform the geometry of the skinned mesh
+ // into the coordinate space of the joints.
+ // In GLTF, this matrix is omitted, and it is assumed that this transform is either
+ // premultiplied with the mesh data, or postmultiplied to the inverse bind matrices.
+ //
+ // TODO: There appears to be missing rotation when joints rotate the model
+ // or inverted bind matrices are missing inherited rotation
+ // (based of values the 'bento shoes' mesh might be missing 90 degrees horizontaly
+ // prior to skinning)
+
+ pModel->mSkinInfo.mBindShapeMatrix.loadu(mesh_scale);
+ LL_INFOS("GLTF_DEBUG") << "Model: " << pModel->mLabel << " mBindShapeMatrix: " << pModel->mSkinInfo.mBindShapeMatrix << LL_ENDL;
+ }
+
+ if (transformation.determinant() < 0)
+ { // negative scales are not supported
+ LL_INFOS("GLTF_IMPORT") << "Negative scale detected, unsupported post-normalization transform. domInstance_geometry: "
+ << pModel->mLabel << LL_ENDL;
+ LLSD args;
+ args["Message"] = "NegativeScaleNormTrans";
+ args["LABEL"] = pModel->mLabel;
+ mWarningsArray.append(args);
+ }
+
+ addModelToScene(pModel, base_name, submodel_limit, transformation, volume_params, mats);
+ mats.clear();
+ }
+ else
+ {
+ setLoadState(ERROR_MODEL + pModel->getStatus());
+ delete pModel;
+ return;
+ }
+ }
+ else if (node.mMesh >= 0)
+ {
+ // Log invalid mesh reference
+ LL_WARNS("GLTF_IMPORT") << "Node " << node_idx << " (" << node.mName
+ << ") references invalid mesh " << node.mMesh
+ << " (total meshes: " << mGLTFAsset.mMeshes.size() << ")" << LL_ENDL;
+
+ LLSD args;
+ args["Message"] = "InvalidMeshReference";
+ args["NODE_NAME"] = node.mName;
+ args["MESH_INDEX"] = node.mMesh;
+ args["TOTAL_MESHES"] = static_cast<S32>(mGLTFAsset.mMeshes.size());
+ mWarningsArray.append(args);
+ }
+
+ // Process all children recursively
+ for (S32 child_idx : node.mChildren)
+ {
+ processNodeHierarchy(child_idx, mesh_name_counts, submodel_limit, volume_params);
+ }
+}
+
+void LLGLTFLoader::computeCombinedNodeTransform(const LL::GLTF::Asset& asset, S32 node_index, glm::mat4& combined_transform) const
+{
+ if (node_index < 0 || node_index >= static_cast<S32>(asset.mNodes.size()))
+ {
+ combined_transform = glm::mat4(1.0f);
+ return;
+ }
+
+ const auto& node = asset.mNodes[node_index];
+
+ // Ensure the node's matrix is valid
+ const_cast<LL::GLTF::Node&>(node).makeMatrixValid();
+
+ // Start with this node's transform
+ combined_transform = node.mMatrix;
+
+ // Find and apply parent transform if it exists
+ for (size_t i = 0; i < asset.mNodes.size(); ++i)
+ {
+ const auto& potential_parent = asset.mNodes[i];
+ auto it = std::find(potential_parent.mChildren.begin(), potential_parent.mChildren.end(), node_index);
+
+ if (it != potential_parent.mChildren.end())
+ {
+ // Found parent - recursively get its combined transform and apply it
+ glm::mat4 parent_transform;
+ computeCombinedNodeTransform(asset, static_cast<S32>(i), parent_transform);
+ combined_transform = parent_transform * combined_transform;
+ return; // Early exit - a node can only have one parent
+ }
+ }
+}
+
+bool LLGLTFLoader::addJointToModelSkin(LLMeshSkinInfo& skin_info, S32 gltf_skin_idx, size_t gltf_joint_idx)
+{
+ const std::string& legal_name = mJointNames[gltf_skin_idx][gltf_joint_idx];
+ if (legal_name.empty())
+ {
+ llassert(false); // should have been stopped by gltf_joint_index_use[i] == -1
+ return false;
+ }
+ skin_info.mJointNames.push_back(legal_name);
+ skin_info.mJointNums.push_back(-1);
+
+ // In scope of same skin multiple meshes reuse same bind matrices
+ skin_info.mInvBindMatrix.push_back(mInverseBindMatrices[gltf_skin_idx][gltf_joint_idx]);
+ skin_info.mAlternateBindMatrix.push_back(mAlternateBindMatrices[gltf_skin_idx][gltf_joint_idx]);
+
+ // Track joint usage for this skin, for the sake of unused joints detection
+ mJointUsage[gltf_skin_idx][gltf_joint_idx]++;
+
+ return true;
+}
+
+LLGLTFLoader::LLGLTFImportMaterial LLGLTFLoader::processMaterial(S32 material_index, S32 fallback_index)
+{
+ // Check cache first
+ auto cached = mMaterialCache.find(material_index);
+ if (cached != mMaterialCache.end())
+ {
+ return cached->second;
+ }
+
+ LLImportMaterial impMat;
+ impMat.mDiffuseColor = LLColor4::white; // Default color
+
+ // Generate material name
+ std::string materialName = generateMaterialName(material_index, fallback_index);
+
+ // Process material if available
+ if (material_index >= 0 && material_index < mGLTFAsset.mMaterials.size())
+ {
+ LL::GLTF::Material* material = &mGLTFAsset.mMaterials[material_index];
+
+ // Set diffuse color from base color factor
+ impMat.mDiffuseColor = LLColor4(
+ material->mPbrMetallicRoughness.mBaseColorFactor[0],
+ material->mPbrMetallicRoughness.mBaseColorFactor[1],
+ material->mPbrMetallicRoughness.mBaseColorFactor[2],
+ material->mPbrMetallicRoughness.mBaseColorFactor[3]
+ );
+
+ // Process base color texture if it exists
+ if (material->mPbrMetallicRoughness.mBaseColorTexture.mIndex >= 0)
+ {
+ S32 texIndex = material->mPbrMetallicRoughness.mBaseColorTexture.mIndex;
+ std::string filename = processTexture(texIndex, "base_color", material->mName);
+
+ if (!filename.empty())
+ {
+ impMat.mDiffuseMapFilename = filename;
+ impMat.mDiffuseMapLabel = material->mName.empty() ? filename : material->mName;
+
+ // Check if the texture is already loaded
+ S32 sourceIndex;
+ if (validateTextureIndex(texIndex, sourceIndex))
+ {
+ LL::GLTF::Image& image = mGLTFAsset.mImages[sourceIndex];
+ if (image.mTexture.notNull())
+ {
+ mTexturesNeedScaling |= image.mHeight > LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT || image.mWidth > LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT;
+ impMat.setDiffuseMap(image.mTexture->getID());
+ LL_INFOS("GLTF_IMPORT") << "Using existing texture ID: " << image.mTexture->getID().asString() << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("GLTF_IMPORT") << "Texture needs loading: " << impMat.mDiffuseMapFilename << LL_ENDL;
+ }
+ }
+ }
+ }
+ }
+
+ // Create cached material with both material and name
+ LLGLTFImportMaterial cachedMat(impMat, materialName);
+
+ // Cache the processed material
+ mMaterialCache[material_index] = cachedMat;
+ return cachedMat;
+}
+
+std::string LLGLTFLoader::processTexture(S32 texture_index, const std::string& texture_type, const std::string& material_name)
+{
+ S32 sourceIndex;
+ if (!validateTextureIndex(texture_index, sourceIndex))
+ return "";
+
+ LL::GLTF::Image& image = mGLTFAsset.mImages[sourceIndex];
+
+ // Process URI-based textures
+ if (!image.mUri.empty())
+ {
+ std::string filename = image.mUri;
+ size_t pos = filename.find_last_of("/\\");
+ if (pos != std::string::npos)
+ {
+ filename = filename.substr(pos + 1);
+ }
+
+ std::string dir = gDirUtilp->getDirName(mFilename);
+ std::string full_path = dir + gDirUtilp->getDirDelimiter() + filename;
+ if (!gDirUtilp->fileExists(full_path) && filename.find("data:") == std::string::npos)
+ {
+ // Uri might be escaped
+ filename = LLURI::unescape(filename);
+ }
+
+ LL_INFOS("GLTF_IMPORT") << "Found texture: " << filename << " for material: " << material_name << LL_ENDL;
+
+ LLSD args;
+ args["Message"] = "TextureFound";
+ args["TEXTURE_NAME"] = filename;
+ args["MATERIAL_NAME"] = material_name;
+ mWarningsArray.append(args);
+
+ return filename;
+ }
+
+ // Process embedded textures
+ if (image.mBufferView >= 0)
+ {
+ return extractTextureToTempFile(texture_index, texture_type);
+ }
+
+ return "";
+}
+
+bool LLGLTFLoader::validateTextureIndex(S32 texture_index, S32& source_index)
+{
+ if (texture_index < 0 || texture_index >= mGLTFAsset.mTextures.size())
+ return false;
+
+ source_index = mGLTFAsset.mTextures[texture_index].mSource;
+ if (source_index < 0 || source_index >= mGLTFAsset.mImages.size())
+ return false;
+
+ return true;
+}
+
+std::string LLGLTFLoader::generateMaterialName(S32 material_index, S32 fallback_index)
+{
+ if (material_index >= 0 && material_index < mGLTFAsset.mMaterials.size())
+ {
+ LL::GLTF::Material* material = &mGLTFAsset.mMaterials[material_index];
+ std::string materialName = material->mName;
+
+ if (materialName.empty())
+ {
+ materialName = "mat" + std::to_string(material_index);
+ }
+ return materialName;
+ }
+ else
+ {
+ return fallback_index >= 0 ? "mat_default" + std::to_string(fallback_index) : "mat_default";
+ }
+}
+
+bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const std::string& base_name, const LL::GLTF::Mesh& mesh, const LL::GLTF::Node& nodeno, material_map& mats)
+{
+ // Set the requested label for the floater display and uploading
+ pModel->mRequestedLabel = gDirUtilp->getBaseFileName(mFilename, true);
+ // Set only name, suffix will be added later
+ pModel->mLabel = base_name;
+
+ LL_DEBUGS("GLTF_DEBUG") << "Processing model " << pModel->mLabel << LL_ENDL;
+
+ pModel->ClearFacesAndMaterials();
+
+ S32 skinIdx = nodeno.mSkin;
+
+ // Compute final combined transform matrix (hierarchy + coordinate rotation)
+ S32 node_index = static_cast<S32>(&nodeno - &mGLTFAsset.mNodes[0]);
+ glm::mat4 hierarchy_transform;
+ computeCombinedNodeTransform(mGLTFAsset, node_index, hierarchy_transform);
+
+ // Combine transforms: coordinate rotation applied to hierarchy transform
+ glm::mat4 final_transform = coord_system_rotation * hierarchy_transform;
+ if (mApplyXYRotation)
+ {
+ final_transform = coord_system_rotationxy * final_transform;
+ }
+
+ // Check if we have a negative scale (flipped coordinate system)
+ bool hasNegativeScale = glm::determinant(final_transform) < 0.0f;
+
+ // Pre-compute normal transform matrix (transpose of inverse of upper-left 3x3)
+ const glm::mat3 normal_transform = glm::transpose(glm::inverse(glm::mat3(final_transform)));
+
+ // Mark unsuported joints with '-1' so that they won't get added into weights
+ // GLTF maps all joints onto all meshes. Gather use count per mesh to cut unused ones.
+ std::vector<S32> gltf_joint_index_use;
+ if (skinIdx >= 0 && mGLTFAsset.mSkins.size() > skinIdx)
+ {
+ LL::GLTF::Skin& gltf_skin = mGLTFAsset.mSkins[skinIdx];
+
+ size_t jointCnt = gltf_skin.mJoints.size();
+ gltf_joint_index_use.resize(jointCnt, 0);
+
+ for (size_t i = 0; i < jointCnt; ++i)
+ {
+ if (mJointNames[skinIdx][i].empty())
+ {
+ // This might need to hold a substitute index
+ gltf_joint_index_use[i] = -1; // mark as unsupported
+ }
+ }
+ }
+
+ for (size_t prim_idx = 0; prim_idx < mesh.mPrimitives.size(); ++prim_idx)
+ {
+ const LL::GLTF::Primitive& prim = mesh.mPrimitives[prim_idx];
+
+ // So primitives already have all of the data we need for a given face in SL land.
+ // Primitives may only ever have a single material assigned to them - as the relation is 1:1 in terms of intended draw call
+ // count. Just go ahead and populate faces direct from the GLTF primitives here. -Geenz 2025-04-07
+ LLVolumeFace face;
+ std::vector<GLTFVertex> vertices;
+
+ // Use cached material processing
+ LLGLTFImportMaterial cachedMat = processMaterial(prim.mMaterial, pModel->getNumVolumeFaces() - 1);
+ LLImportMaterial impMat = cachedMat;
+ std::string materialName = cachedMat.name;
+ mats[materialName] = impMat;
+
+ if (prim.getIndexCount() % 3 != 0)
+ {
+ LL_WARNS("GLTF_IMPORT") << "Mesh '" << mesh.mName << "' primitive " << prim_idx
+ << ": Invalid index count " << prim.getIndexCount()
+ << " (not divisible by 3). GLTF files must contain triangulated geometry." << LL_ENDL;
+
+ LLSD args;
+ args["Message"] = "InvalidGeometryNonTriangulated";
+ args["MESH_NAME"] = mesh.mName;
+ args["PRIMITIVE_INDEX"] = static_cast<S32>(prim_idx);
+ args["INDEX_COUNT"] = static_cast<S32>(prim.getIndexCount());
+ mWarningsArray.append(args);
+ return false; // Skip this primitive
+ }
+
+ // Apply the global scale and center offset to all vertices
+ for (U32 i = 0; i < prim.getVertexCount(); i++)
+ {
+ // Use pre-computed final_transform
+ glm::vec4 pos(prim.mPositions[i][0], prim.mPositions[i][1], prim.mPositions[i][2], 1.0f);
+ glm::vec4 transformed_pos = final_transform * pos;
+
+ GLTFVertex vert;
+ vert.position = glm::vec3(transformed_pos);
+
+ if (!prim.mNormals.empty())
+ {
+ // Use pre-computed normal_transform
+ glm::vec3 normal_vec(prim.mNormals[i][0], prim.mNormals[i][1], prim.mNormals[i][2]);
+ vert.normal = glm::normalize(normal_transform * normal_vec);
+ }
+ else
+ {
+ // Use default normal (pointing up in model space)
+ vert.normal = glm::normalize(normal_transform * glm::vec3(0.0f, 0.0f, 1.0f));
+ LL_DEBUGS("GLTF_IMPORT") << "No normals found for primitive, using default normal." << LL_ENDL;
+ }
+
+ vert.uv0 = glm::vec2(prim.mTexCoords0[i][0], -prim.mTexCoords0[i][1]);
+
+ if (skinIdx >= 0)
+ {
+ vert.weights = glm::vec4(prim.mWeights[i]);
+
+ auto accessorIdx = prim.mAttributes.at("JOINTS_0");
+ LL::GLTF::Accessor::ComponentType componentType = LL::GLTF::Accessor::ComponentType::UNSIGNED_BYTE;
+ if (accessorIdx >= 0)
+ {
+ auto accessor = mGLTFAsset.mAccessors[accessorIdx];
+ componentType = accessor.mComponentType;
+ }
+
+ // The GLTF spec allows for either an unsigned byte for joint indices, or an unsigned short.
+ // Detect and unpack accordingly.
+ if (componentType == LL::GLTF::Accessor::ComponentType::UNSIGNED_BYTE)
+ {
+ auto ujoint = glm::unpackUint4x8((U32)(prim.mJoints[i] & 0xFFFFFFFF));
+ vert.joints = glm::u16vec4(ujoint.x, ujoint.y, ujoint.z, ujoint.w);
+ }
+ else if (componentType == LL::GLTF::Accessor::ComponentType::UNSIGNED_SHORT)
+ {
+ vert.joints = glm::unpackUint4x16(prim.mJoints[i]);
+ }
+ else
+ {
+ vert.joints = glm::zero<glm::u16vec4>();
+ vert.weights = glm::zero<glm::vec4>();
+ }
+ }
+ vertices.push_back(vert);
+ }
+
+ // Check for empty vertex array before processing
+ if (vertices.empty())
+ {
+ LL_WARNS("GLTF_IMPORT") << "Empty vertex array for primitive " << prim_idx << " in model " << mesh.mName << LL_ENDL;
+ LLSD args;
+ args["Message"] = "EmptyVertexArray";
+ args["MESH_NAME"] = mesh.mName;
+ args["PRIMITIVE_INDEX"] = static_cast<S32>(prim_idx);
+ args["INDEX_COUNT"] = static_cast<S32>(prim.getIndexCount());
+ mWarningsArray.append(args);
+ return false; // Skip this primitive
+ }
+
+ std::vector<LLVolumeFace::VertexData> faceVertices;
+ glm::vec3 min = glm::vec3(FLT_MAX);
+ glm::vec3 max = glm::vec3(-FLT_MAX);
+
+ for (U32 i = 0; i < vertices.size(); i++)
+ {
+ LLVolumeFace::VertexData vert;
+
+ // Update min/max bounds
+ if (i == 0)
+ {
+ min = max = vertices[i].position;
+ }
+ else
+ {
+ min.x = std::min(min.x, vertices[i].position.x);
+ min.y = std::min(min.y, vertices[i].position.y);
+ min.z = std::min(min.z, vertices[i].position.z);
+ max.x = std::max(max.x, vertices[i].position.x);
+ max.y = std::max(max.y, vertices[i].position.y);
+ max.z = std::max(max.z, vertices[i].position.z);
+ }
+
+ LLVector4a position = LLVector4a(vertices[i].position.x, vertices[i].position.y, vertices[i].position.z);
+ LLVector4a normal = LLVector4a(vertices[i].normal.x, vertices[i].normal.y, vertices[i].normal.z);
+ vert.setPosition(position);
+ vert.setNormal(normal);
+ vert.mTexCoord = LLVector2(vertices[i].uv0.x, vertices[i].uv0.y);
+ faceVertices.push_back(vert);
+
+ if (skinIdx >= 0)
+ {
+ // create list of weights that influence this vertex
+ LLModel::weight_list weight_list;
+
+ // Drop joints that viewer doesn't support (negative in gltf_joint_index_use_count)
+ // don't reindex them yet, more indexes will be removed
+ // Also drop joints that have no weight. GLTF stores 4 per vertex, so there might be
+ // 'empty' ones
+ if (gltf_joint_index_use[vertices[i].joints.x] >= 0
+ && vertices[i].weights.x > 0.f)
+ {
+ weight_list.push_back(LLModel::JointWeight(vertices[i].joints.x, vertices[i].weights.x));
+ gltf_joint_index_use[vertices[i].joints.x]++;
+ }
+ if (gltf_joint_index_use[vertices[i].joints.y] >= 0
+ && vertices[i].weights.y > 0.f)
+ {
+ weight_list.push_back(LLModel::JointWeight(vertices[i].joints.y, vertices[i].weights.y));
+ gltf_joint_index_use[vertices[i].joints.y]++;
+ }
+ if (gltf_joint_index_use[vertices[i].joints.z] >= 0
+ && vertices[i].weights.z > 0.f)
+ {
+ weight_list.push_back(LLModel::JointWeight(vertices[i].joints.z, vertices[i].weights.z));
+ gltf_joint_index_use[vertices[i].joints.z]++;
+ }
+ if (gltf_joint_index_use[vertices[i].joints.w] >= 0
+ && vertices[i].weights.w > 0.f)
+ {
+ weight_list.push_back(LLModel::JointWeight(vertices[i].joints.w, vertices[i].weights.w));
+ gltf_joint_index_use[vertices[i].joints.w]++;
+ }
+
+ std::sort(weight_list.begin(), weight_list.end(), LLModel::CompareWeightGreater());
+
+ std::vector<LLModel::JointWeight> wght;
+ F32 total = 0.f;
+
+ for (U32 j = 0; j < llmin((U32)4, (U32)weight_list.size()); ++j)
+ {
+ // take up to 4 most significant weights
+ // Ported from the DAE loader - however, GLTF right now only supports up to four weights per vertex.
+ wght.push_back(weight_list[j]);
+ total += weight_list[j].mWeight;
+ }
+
+ if (total != 0.f)
+ {
+ F32 scale = 1.f / total;
+ if (scale != 1.f)
+ { // normalize weights
+ for (U32 j = 0; j < wght.size(); ++j)
+ {
+ wght[j].mWeight *= scale;
+ }
+ }
+ }
+
+ if (wght.size() > 0)
+ {
+ pModel->mSkinWeights[LLVector3(vertices[i].position)] = wght;
+ }
+ }
+ }
+
+ // Indices handling
+ if (faceVertices.size() >= VERTEX_LIMIT)
+ {
+ // Will have to remap 32 bit indices into 16 bit indices
+ // For the sake of simplicity build vector of 32 bit indices first
+ std::vector<U32> indices_32;
+ for (U32 i = 0; i < prim.getIndexCount(); i += 3)
+ {
+ // When processing indices, flip winding order if needed
+ if (hasNegativeScale)
+ {
+ // Flip winding order for negative scale
+ indices_32.push_back(prim.mIndexArray[i]);
+ indices_32.push_back(prim.mIndexArray[i + 2]); // Swap these two
+ indices_32.push_back(prim.mIndexArray[i + 1]);
+ }
+ else
+ {
+ indices_32.push_back(prim.mIndexArray[i]);
+ indices_32.push_back(prim.mIndexArray[i + 1]);
+ indices_32.push_back(prim.mIndexArray[i + 2]);
+ }
+ }
+
+ // Generates a vertex remap table with no gaps in the resulting sequence
+ std::vector<U32> remap(faceVertices.size());
+ size_t vertex_count = meshopt_generateVertexRemap(&remap[0], &indices_32[0], indices_32.size(), &faceVertices[0], faceVertices.size(), sizeof(LLVolumeFace::VertexData));
+
+ // Manually remap vertices
+ std::vector<LLVolumeFace::VertexData> optimized_vertices(vertex_count);
+ for (size_t i = 0; i < vertex_count; ++i)
+ {
+ optimized_vertices[i] = faceVertices[remap[i]];
+ }
+
+ std::vector<U32> optimized_indices(indices_32.size());
+ meshopt_remapIndexBuffer(&optimized_indices[0], &indices_32[0], indices_32.size(), &remap[0]);
+
+ // Sort indices to improve mesh splits (reducing amount of duplicated indices)
+ meshopt_optimizeVertexCache(&optimized_indices[0], &optimized_indices[0], indices_32.size(), vertex_count);
+
+ std::vector<U16> indices_16;
+ std::vector<S64> vertices_remap;
+ vertices_remap.resize(vertex_count, -1);
+ S32 created_faces = 0;
+ std::vector<LLVolumeFace::VertexData> face_verts;
+ min = glm::vec3(FLT_MAX);
+ max = glm::vec3(-FLT_MAX);
+
+ for (size_t idx = 0; idx < optimized_indices.size(); idx++)
+ {
+ size_t vert_index = optimized_indices[idx];
+ if (vertices_remap[vert_index] == -1)
+ {
+ // First encounter, add it
+ size_t new_vert_idx = face_verts.size();
+ vertices_remap[vert_index] = (S64)new_vert_idx;
+ face_verts.push_back(optimized_vertices[vert_index]);
+ vert_index = new_vert_idx;
+
+ // Update min/max bounds
+ const LLVector4a& vec = face_verts[new_vert_idx].getPosition();
+ if (new_vert_idx == 0)
+ {
+ min.x = vec[0];
+ min.y = vec[1];
+ min.z = vec[2];
+ max = min;
+ }
+ else
+ {
+ min.x = std::min(min.x, vec[0]);
+ min.y = std::min(min.y, vec[1]);
+ min.z = std::min(min.z, vec[2]);
+ max.x = std::max(max.x, vec[0]);
+ max.y = std::max(max.y, vec[1]);
+ max.z = std::max(max.z, vec[2]);
+ }
+ }
+ else
+ {
+ // already in vector, get position
+ vert_index = (size_t)vertices_remap[vert_index];
+ }
+ indices_16.push_back((U16)vert_index);
+
+ if (indices_16.size() % 3 == 0 && face_verts.size() >= VERTEX_LIMIT)
+ {
+ LLVolumeFace face;
+ face.fillFromLegacyData(face_verts, indices_16);
+ face.mExtents[0] = LLVector4a(min.x, min.y, min.z, 0);
+ face.mExtents[1] = LLVector4a(max.x, max.y, max.z, 0);
+ pModel->getVolumeFaces().push_back(face);
+ pModel->getMaterialList().push_back(materialName);
+ created_faces++;
+
+ std::fill(vertices_remap.begin(), vertices_remap.end(), -1);
+ indices_16.clear();
+ face_verts.clear();
+
+ min = glm::vec3(FLT_MAX);
+ max = glm::vec3(-FLT_MAX);
+ }
+ }
+ if (indices_16.size() > 0 && face_verts.size() > 0)
+ {
+ LLVolumeFace face;
+ face.fillFromLegacyData(face_verts, indices_16);
+ face.mExtents[0] = LLVector4a(min.x, min.y, min.z, 0);
+ face.mExtents[1] = LLVector4a(max.x, max.y, max.z, 0);
+ pModel->getVolumeFaces().push_back(face);
+ pModel->getMaterialList().push_back(materialName);
+ created_faces++;
+ }
+
+ LL_INFOS("GLTF_IMPORT") << "Primitive " << (S32)prim_idx << " from model " << pModel->mLabel
+ << " is over vertices limit, it was split into " << created_faces
+ << " faces" << LL_ENDL;
+ LLSD args;
+ args["Message"] = "ModelSplitPrimitive";
+ args["MODEL_NAME"] = pModel->mLabel;
+ args["FACE_COUNT"] = created_faces;
+ mWarningsArray.append(args);
+ }
+ else
+ {
+ // can use indices directly
+ std::vector<U16> indices;
+ for (U32 i = 0; i < prim.getIndexCount(); i += 3)
+ {
+ // When processing indices, flip winding order if needed
+ if (hasNegativeScale)
+ {
+ // Flip winding order for negative scale
+ indices.push_back(prim.mIndexArray[i]);
+ indices.push_back(prim.mIndexArray[i + 2]); // Swap these two
+ indices.push_back(prim.mIndexArray[i + 1]);
+ }
+ else
+ {
+ indices.push_back(prim.mIndexArray[i]);
+ indices.push_back(prim.mIndexArray[i + 1]);
+ indices.push_back(prim.mIndexArray[i + 2]);
+ }
+ }
+
+ face.fillFromLegacyData(faceVertices, indices);
+ face.mExtents[0] = LLVector4a(min.x, min.y, min.z, 0);
+ face.mExtents[1] = LLVector4a(max.x, max.y, max.z, 0);
+
+ pModel->getVolumeFaces().push_back(face);
+ pModel->getMaterialList().push_back(materialName);
+ }
+ }
+
+ // Call normalizeVolumeFacesAndWeights to compute proper extents
+ pModel->normalizeVolumeFacesAndWeights();
+
+ // Fill joint names, bind matrices and remap weight indices
+ if (skinIdx >= 0)
+ {
+ LL::GLTF::Skin& gltf_skin = mGLTFAsset.mSkins[skinIdx];
+ LLMeshSkinInfo& skin_info = pModel->mSkinInfo;
+ S32 valid_joints_count = mValidJointsCount[skinIdx];
+
+ S32 replacement_index = 0;
+ std::vector<S32> gltfindex_to_joitindex_map;
+ size_t jointCnt = gltf_skin.mJoints.size();
+ gltfindex_to_joitindex_map.resize(jointCnt, -1);
+
+ if (valid_joints_count > (S32)mMaxJointsPerMesh)
+ {
+ std::map<std::string, S32> goup_use_count;
+
+ for (const auto& elem : mJointGroups)
+ {
+ goup_use_count[elem.second.mGroup] = 0;
+ goup_use_count[elem.second.mParentGroup] = 0;
+ }
+
+ // Assume that 'Torso' group is always in use since that's what everything else is attached to
+ goup_use_count["Torso"] = 1;
+ // Note that Collisions and Extra groups are all over the place, might want to include them from the start
+ // or add individual when parents are added
+
+ // Check which groups are in use
+ for (size_t i = 0; i < jointCnt; ++i)
+ {
+ std::string& joint_name = mJointNames[skinIdx][i];
+ if (!joint_name.empty())
+ {
+ if (gltf_joint_index_use[i] > 0)
+ {
+ const JointGroups &group = mJointGroups[joint_name];
+ // Joint in use, increment it's groups
+ goup_use_count[group.mGroup]++;
+ goup_use_count[group.mParentGroup]++;
+ }
+ }
+ }
+
+ // 1. add joints that are in use directly
+ for (size_t i = 0; i < jointCnt; ++i)
+ {
+ // Process joint name and idnex
+ S32 joint = gltf_skin.mJoints[i];
+ if (gltf_joint_index_use[i] <= 0)
+ {
+ // unsupported (-1) joint, drop it
+ // unused (0) joint, drop it
+ continue;
+ }
+
+ if (addJointToModelSkin(skin_info, skinIdx, i))
+ {
+ gltfindex_to_joitindex_map[i] = replacement_index++;
+ }
+ }
+
+ // 2. add joints from groups that this model's joints belong to
+ // It's perfectly valid to have more joints than is in use
+ // Ex: sandals that make your legs digitigrade despite not skining to
+ // knees or the like.
+ // Todo: sort and add by usecount
+ for (size_t i = 0; i < jointCnt; ++i)
+ {
+ S32 joint = gltf_skin.mJoints[i];
+ if (gltf_joint_index_use[i] != 0)
+ {
+ // this step needs only joints that have zero uses
+ continue;
+ }
+ if (skin_info.mInvBindMatrix.size() > mMaxJointsPerMesh)
+ {
+ break;
+ }
+ const std::string& legal_name = mJointNames[skinIdx][i];
+ std::string group_name = mJointGroups[legal_name].mGroup;
+ if (goup_use_count[group_name] > 0)
+ {
+ if (addJointToModelSkin(skin_info, skinIdx, i))
+ {
+ gltfindex_to_joitindex_map[i] = replacement_index++;
+ }
+ }
+ }
+ }
+ else
+ {
+ // Less than 110, just add every valid joint
+ for (size_t i = 0; i < jointCnt; ++i)
+ {
+ // Process joint name and idnex
+ S32 joint = gltf_skin.mJoints[i];
+ if (gltf_joint_index_use[i] < 0)
+ {
+ // unsupported (-1) joint, drop it
+ continue;
+ }
+
+ if (addJointToModelSkin(skin_info, skinIdx, i))
+ {
+ gltfindex_to_joitindex_map[i] = replacement_index++;
+ }
+ }
+ }
+
+ if (skin_info.mInvBindMatrix.size() > mMaxJointsPerMesh)
+ {
+ // mMaxJointsPerMesh ususlly is equal to LL_MAX_JOINTS_PER_MESH_OBJECT
+ // and is 110.
+ LL_WARNS("GLTF_IMPORT") << "Too many jonts in " << pModel->mLabel
+ << " Count: " << (S32)skin_info.mInvBindMatrix.size()
+ << " Limit:" << (S32)mMaxJointsPerMesh << LL_ENDL;
+ LLSD args;
+ args["Message"] = "ModelTooManyJoints";
+ args["MODEL_NAME"] = pModel->mLabel;
+ args["JOINT_COUNT"] = (S32)skin_info.mInvBindMatrix.size();
+ args["MAX"] = (S32)mMaxJointsPerMesh;
+ mWarningsArray.append(args);
+ }
+
+ // Remap indices for pModel->mSkinWeights
+ for (auto& weights : pModel->mSkinWeights)
+ {
+ for (auto& weight : weights.second)
+ {
+ weight.mJointIdx = gltfindex_to_joitindex_map[weight.mJointIdx];
+ }
+ }
+ }
+
+ return true;
+}
+
+void LLGLTFLoader::populateJointsFromSkin(S32 skin_idx)
+{
+ const LL::GLTF::Skin& skin = mGLTFAsset.mSkins[skin_idx];
+
+ LL_INFOS("GLTF_DEBUG") << "populateJointFromSkin: Processing skin " << skin_idx << " with " << skin.mJoints.size() << " joints" << LL_ENDL;
+
+ if (skin.mInverseBindMatrices > 0 && skin.mJoints.size() != skin.mInverseBindMatricesData.size())
+ {
+ LL_INFOS("GLTF_IMPORT") << "Bind matrices count mismatch joints count" << LL_ENDL;
+ LLSD args;
+ args["Message"] = "InvBindCountMismatch";
+ mWarningsArray.append(args);
+ }
+
+ S32 joint_count = (S32)skin.mJoints.size();
+ S32 inverse_count = (S32)skin.mInverseBindMatricesData.size();
+ if (mInverseBindMatrices.size() <= skin_idx)
+ {
+ mInverseBindMatrices.resize(skin_idx + 1);
+ mAlternateBindMatrices.resize(skin_idx + 1);
+ mJointNames.resize(skin_idx + 1);
+ mJointUsage.resize(skin_idx + 1);
+ mValidJointsCount.resize(skin_idx + 1, 0);
+ }
+
+ // fill up joints related data
+ joints_data_map_t joints_data;
+ joints_name_to_node_map_t names_to_nodes;
+ for (S32 i = 0; i < joint_count; i++)
+ {
+ S32 joint = skin.mJoints[i];
+ const LL::GLTF::Node &jointNode = mGLTFAsset.mNodes[joint];
+ JointNodeData& data = joints_data[joint];
+ data.mNodeIdx = joint;
+ data.mJointListIdx = i;
+ data.mGltfRestMatrix = buildGltfRestMatrix(joint, skin);
+ data.mGltfMatrix = jointNode.mMatrix;
+ data.mOverrideMatrix = glm::mat4(1.f);
+
+ if (mJointMap.find(jointNode.mName) != mJointMap.end())
+ {
+ data.mName = mJointMap[jointNode.mName];
+ data.mIsValidViewerJoint = true;
+ mValidJointsCount[skin_idx]++;
+ }
+ else
+ {
+ data.mName = jointNode.mName;
+ data.mIsValidViewerJoint = false;
+ }
+ names_to_nodes[data.mName] = joint;
+
+ for (S32 child : jointNode.mChildren)
+ {
+ JointNodeData& child_data = joints_data[child];
+ child_data.mParentNodeIdx = joint;
+ child_data.mIsParentValidViewerJoint = data.mIsValidViewerJoint;
+ }
+ }
+
+ // Go over viewer joints and build overrides
+ // This is needed because gltf skeleton doesn't necessarily match viewer's skeleton.
+ glm::mat4 ident(1.0);
+ for (auto &viewer_data : mViewerJointData)
+ {
+ buildOverrideMatrix(viewer_data, joints_data, names_to_nodes, ident, ident);
+ }
+
+ for (S32 i = 0; i < joint_count; i++)
+ {
+ S32 joint = skin.mJoints[i];
+ const LL::GLTF::Node &jointNode = mGLTFAsset.mNodes[joint];
+ std::string legal_name(jointNode.mName);
+
+ // Viewer supports a limited set of joints, mark them as legal
+ bool legal_joint = false;
+ if (mJointMap.find(legal_name) != mJointMap.end())
+ {
+ legal_name = mJointMap[legal_name];
+ legal_joint = true;
+ mJointNames[skin_idx].push_back(legal_name);
+ }
+ else
+ {
+ mJointNames[skin_idx].emplace_back();
+ }
+ mJointUsage[skin_idx].push_back(0);
+
+ // Compute bind matrices
+
+ if (!legal_joint)
+ {
+ // Add placeholder to not break index.
+ // Not going to be used by viewer, will be stripped from skin_info.
+ LLMatrix4 gltf_transform;
+ gltf_transform.setIdentity();
+ mInverseBindMatrices[skin_idx].push_back(LLMatrix4a(gltf_transform));
+ }
+ else if (inverse_count > i)
+ {
+ // Transalte existing bind matrix to viewer's overriden skeleton
+ glm::mat4 original_bind_matrix = glm::inverse(skin.mInverseBindMatricesData[i]);
+ glm::mat4 rotated_original = coord_system_rotation * original_bind_matrix;
+ glm::mat4 skeleton_transform = computeGltfToViewerSkeletonTransform(joints_data, joint, legal_name);
+ glm::mat4 tranlated_original = skeleton_transform * rotated_original;
+ glm::mat4 final_inverse_bind_matrix = glm::inverse(tranlated_original);
+
+ LLMatrix4 gltf_transform = LLMatrix4(glm::value_ptr(final_inverse_bind_matrix));
+ LL_DEBUGS("GLTF_DEBUG") << "mInvBindMatrix name: " << legal_name << " Translated val: " << gltf_transform << LL_ENDL;
+ mInverseBindMatrices[skin_idx].push_back(LLMatrix4a(gltf_transform));
+ }
+ else
+ {
+ // If bind matrices aren't present (they are optional in gltf),
+ // assume an identy matrix
+ // todo: find a model with this, might need to use YZ rotated matrix
+ glm::mat4 inv_bind(1.0f);
+ glm::mat4 skeleton_transform = computeGltfToViewerSkeletonTransform(joints_data, joint, legal_name);
+ inv_bind = glm::inverse(skeleton_transform * inv_bind);
+
+ LLMatrix4 gltf_transform = LLMatrix4(glm::value_ptr(inv_bind));
+ LL_DEBUGS("GLTF_DEBUG") << "mInvBindMatrix name: " << legal_name << " Generated val: " << gltf_transform << LL_ENDL;
+ mInverseBindMatrices[skin_idx].push_back(LLMatrix4a(gltf_transform));
+ }
+
+ // Compute Alternative matrices also known as overrides
+ LLMatrix4 original_joint_transform(glm::value_ptr(joints_data[joint].mOverrideMatrix));
+
+ // Viewer seems to care only about translation part,
+ // but for parity with collada taking original value
+ LLMatrix4 newInverse = LLMatrix4(mInverseBindMatrices[skin_idx].back().getF32ptr());
+ newInverse.setTranslation(original_joint_transform.getTranslation());
+
+ LL_DEBUGS("GLTF_DEBUG") << "mAlternateBindMatrix name: " << legal_name << " val: " << newInverse << LL_ENDL;
+ mAlternateBindMatrices[skin_idx].push_back(LLMatrix4a(newInverse));
+
+ if (legal_joint)
+ {
+ // Might be needed for uploader UI to correctly identify overriden joints
+ // but going to be incorrect if multiple skins are present
+ mJointList[legal_name] = newInverse;
+ mJointsFromNode.push_front(legal_name);
+ }
+ }
+
+ S32 valid_joints = mValidJointsCount[skin_idx];
+ if (valid_joints < joint_count)
+ {
+ LL_INFOS("GLTF_IMPORT") << "Skin " << skin_idx
+ << " defines " << joint_count
+ << " joints, but only " << valid_joints
+ << " were recognized and are compatible." << LL_ENDL;
+ LLSD args;
+ args["Message"] = "SkinUsupportedJoints";
+ args["SKIN_INDEX"] = skin_idx;
+ args["JOINT_COUNT"] = joint_count;
+ args["LEGAL_COUNT"] = valid_joints;
+ mWarningsArray.append(args);
+ }
+}
+
+void LLGLTFLoader::populateJointGroups()
+{
+ std::string parent;
+ for (auto& viewer_data : mViewerJointData)
+ {
+ buildJointGroup(viewer_data, parent);
+ }
+}
+
+void LLGLTFLoader::buildJointGroup(LLJointData& viewer_data, const std::string &parent_group)
+{
+ JointGroups& jount_group_data = mJointGroups[viewer_data.mName];
+ jount_group_data.mGroup = viewer_data.mGroup;
+ jount_group_data.mParentGroup = parent_group;
+
+ for (LLJointData& child_data : viewer_data.mChildren)
+ {
+ buildJointGroup(child_data, viewer_data.mGroup);
+ }
+}
+
+void LLGLTFLoader::buildOverrideMatrix(LLJointData& viewer_data, joints_data_map_t &gltf_nodes, joints_name_to_node_map_t &names_to_nodes, glm::mat4& parent_rest, glm::mat4& parent_support_rest) const
+{
+ glm::mat4 rest(1.f);
+ joints_name_to_node_map_t::iterator found_node = names_to_nodes.find(viewer_data.mName);
+ if (found_node != names_to_nodes.end())
+ {
+ S32 gltf_node_idx = found_node->second;
+ JointNodeData& node = gltf_nodes[gltf_node_idx];
+ node.mIsOverrideValid = true;
+ node.mViewerRestMatrix = viewer_data.mRestMatrix;
+
+ glm::mat4 gltf_joint_rest_pose = coord_system_rotation * node.mGltfRestMatrix;
+ if (mApplyXYRotation)
+ {
+ gltf_joint_rest_pose = coord_system_rotationxy * gltf_joint_rest_pose;
+ }
+
+ glm::mat4 translated_joint;
+ // Example:
+ // Viewer has pelvis->spine1->spine2->torso.
+ // gltf example model has pelvis->torso
+ // By doing glm::inverse(transalted_rest_spine2) * gltf_rest_torso
+ // We get what torso would have looked like if gltf had a spine2
+ if (viewer_data.mIsJoint)
+ {
+ translated_joint = glm::inverse(parent_rest) * gltf_joint_rest_pose;
+ }
+ else
+ {
+ translated_joint = glm::inverse(parent_support_rest) * gltf_joint_rest_pose;
+ }
+
+ glm::vec3 translation_override;
+ glm::vec3 skew;
+ glm::vec3 scale;
+ glm::vec4 perspective;
+ glm::quat rotation;
+ glm::decompose(translated_joint, scale, rotation, translation_override, skew, perspective);
+
+ // Viewer allows overrides, which are base joint with applied translation override.
+ // fortunately normal bones use only translation, without rotation or scale
+ node.mOverrideMatrix = glm::recompose(glm::vec3(1, 1, 1), glm::identity<glm::quat>(), translation_override, glm::vec3(0, 0, 0), glm::vec4(0, 0, 0, 1));
+
+ glm::mat4 overriden_joint = node.mOverrideMatrix;
+
+ // todo: if gltf bone had rotation or scale, they probably should be saved here
+ // then applied to bind matrix
+ rest = parent_rest * overriden_joint;
+ if (viewer_data.mIsJoint)
+ {
+ node.mOverrideRestMatrix = rest;
+ }
+ else
+ {
+ // This is likely incomplete or even wrong.
+ // Viewer Collision bones specify rotation and scale.
+ // Importer should apply rotation and scale to this matrix and save as needed
+ // then subsctruct them from bind matrix
+ // Todo: get models that use collision bones, made by different programs
+
+ overriden_joint = glm::scale(overriden_joint, viewer_data.mScale);
+ node.mOverrideRestMatrix = parent_support_rest * overriden_joint;
+ }
+ }
+ else
+ {
+ // No override for this joint
+ rest = parent_rest * viewer_data.mJointMatrix;
+ }
+
+ glm::mat4 support_rest(1.f);
+ if (viewer_data.mSupport == LLJointData::SUPPORT_BASE)
+ {
+ support_rest = rest;
+ }
+ else
+ {
+ support_rest = parent_support_rest;
+ }
+
+ for (LLJointData& child_data : viewer_data.mChildren)
+ {
+ buildOverrideMatrix(child_data, gltf_nodes, names_to_nodes, rest, support_rest);
+ }
+}
+
+glm::mat4 LLGLTFLoader::buildGltfRestMatrix(S32 joint_node_index, const LL::GLTF::Skin& gltf_skin) const
+{
+ // This is inefficient since we are recalculating some joints multiple times over
+ // Todo: cache it?
+
+ if (joint_node_index < 0 || joint_node_index >= static_cast<S32>(mGLTFAsset.mNodes.size()))
+ {
+ return glm::mat4(1.0f);
+ }
+
+ const auto& node = mGLTFAsset.mNodes[joint_node_index];
+
+ // Find and apply parent transform if it exists
+ for (size_t i = 0; i < mGLTFAsset.mNodes.size(); ++i)
+ {
+ const auto& potential_parent = mGLTFAsset.mNodes[i];
+ auto it = std::find(potential_parent.mChildren.begin(), potential_parent.mChildren.end(), joint_node_index);
+
+ if (it != potential_parent.mChildren.end())
+ {
+ // Found parent
+ if (std::find(gltf_skin.mJoints.begin(), gltf_skin.mJoints.end(), joint_node_index) != gltf_skin.mJoints.end())
+ {
+ // parent is a joint - recursively combine transform
+ // assumes that matrix is already valid
+ return buildGltfRestMatrix(static_cast<S32>(i), gltf_skin) * node.mMatrix;
+ }
+ }
+ }
+ // Should we return armature or stop earlier?
+ return node.mMatrix;
+}
+
+glm::mat4 LLGLTFLoader::buildGltfRestMatrix(S32 joint_node_index, const joints_data_map_t& joint_data) const
+{
+ // This is inefficient since we are recalculating some joints multiple times over
+ // Todo: cache it?
+
+ if (joint_node_index < 0 || joint_node_index >= static_cast<S32>(mGLTFAsset.mNodes.size()))
+ {
+ return glm::mat4(1.0f);
+ }
+
+ auto& data = joint_data.at(joint_node_index);
+
+ if (data.mParentNodeIdx >=0)
+ {
+ return buildGltfRestMatrix(data.mParentNodeIdx, joint_data) * data.mGltfMatrix;
+ }
+ // Should we return armature or stop earlier?
+ return data.mGltfMatrix;
+}
+
+// This function computes the transformation matrix needed to convert from GLTF skeleton space
+// to viewer skeleton space for a specific joint
+
+glm::mat4 LLGLTFLoader::computeGltfToViewerSkeletonTransform(const joints_data_map_t& joints_data_map, S32 gltf_node_index, const std::string& joint_name) const
+{
+ const JointNodeData& node_data = joints_data_map.at(gltf_node_index);
+ if (!node_data.mIsOverrideValid)
+ {
+ // For now assume they are identical and return an identity (for ease of debuging)
+ return glm::mat4(1.0f);
+ }
+
+ // Get the GLTF joint's rest pose (in GLTF coordinate system)
+ const glm::mat4 &gltf_joint_rest_pose = node_data.mGltfRestMatrix;
+ glm::mat4 rest_pose = coord_system_rotation * gltf_joint_rest_pose;
+
+ LL_INFOS("GLTF_DEBUG") << "rest matrix for joint " << joint_name << ": ";
+
+ LLMatrix4 transform(glm::value_ptr(rest_pose));
+
+ LL_CONT << transform << LL_ENDL;
+
+ // Compute transformation from GLTF space to viewer space
+ // This assumes both skeletons are in rest pose initially
+ return node_data.mOverrideRestMatrix * glm::inverse(rest_pose);
+}
+
+bool LLGLTFLoader::checkForXYrotation(const LL::GLTF::Skin& gltf_skin, S32 joint_idx, S32 bind_indx)
+{
+ glm::mat4 gltf_joint_rest = buildGltfRestMatrix(joint_idx, gltf_skin);
+ glm::mat4 test_mat = glm::inverse(gltf_joint_rest) * gltf_skin.mInverseBindMatricesData[bind_indx];
+ // Normally for shoulders it should be something close to
+ // {1,0,0,0;0,-1,0,0;0,0,-1,0;0,0,0,1}
+ // rotated one will look like
+ // {0,0,0,-1;1,0,0,0;0,-1,0,0;0,0,0,1}
+ // Todo: This is a cheap hack,
+ // figure out how rotation is supposed to work
+ return abs(test_mat[0][0]) < 0.5 && abs(test_mat[1][1]) < 0.5 && abs(test_mat[2][2]) < 0.5;
+}
+
+void LLGLTFLoader::checkForXYrotation(const LL::GLTF::Skin& gltf_skin)
+{
+ // HACK: figure out model's rotation from shoulders' matrix.
+ // This is wrong on many levels:
+ // Too limited (only models that have shoulders),
+ // Will not work well with things that emulate 3 hands in some manner
+ // Only supports xy 90 degree rotation
+ // Todo: figure out how to find skeleton's orientation Correctly
+ // when model is rotated at a triangle level
+ constexpr char right_shoulder_str[] = "mShoulderRight";
+ constexpr char left_shoulder_str[] = "mShoulderLeft";
+
+ S32 size = (S32)gltf_skin.mJoints.size();
+ S32 joints_found = 0;
+ for (S32 i= 0; i < size; i++)
+ {
+ S32 joint = gltf_skin.mJoints[i];
+ const LL::GLTF::Node &joint_node = mGLTFAsset.mNodes[joint];
+
+ // todo: we are doing this search thing everywhere,
+ // just pre-translate every joint
+ JointMap::iterator found = mJointMap.find(joint_node.mName);
+ if (found == mJointMap.end())
+ {
+ // unsupported joint
+ continue;
+ }
+ if (found->second == right_shoulder_str || found->second == left_shoulder_str)
+ {
+ if (checkForXYrotation(gltf_skin, joint, i))
+ {
+ joints_found++;
+ }
+ else
+ {
+ return;
+ }
+ }
+ }
+
+ if (joints_found == 2)
+ {
+ // Both joints in a weird position/rotation, assume rotated model
+ mApplyXYRotation = true;
+ }
+}
+
+void LLGLTFLoader::checkGlobalJointUsage()
+{
+ // Check if some joints remained unused
+ for (S32 skin_idx = 0; skin_idx < (S32)mGLTFAsset.mSkins.size(); ++skin_idx)
+ {
+ const LL::GLTF::Skin& gltf_skin = mGLTFAsset.mSkins[skin_idx];
+ S32 joint_count = (S32)gltf_skin.mJoints.size();
+ S32 used_joints = 0;
+ for (S32 i = 0; i < joint_count; ++i)
+ {
+ S32 joint = gltf_skin.mJoints[i];
+ if (mJointUsage[skin_idx][i] == 0)
+ {
+ // Joint is unused, log it
+ LL_INFOS("GLTF_DEBUG") << "Joint " << mJointNames[skin_idx][i]
+ << " in skin " << skin_idx << " is unused." << LL_ENDL;
+ }
+ else
+ {
+ used_joints++;
+ }
+ }
+
+ S32 valid_joints = mValidJointsCount[skin_idx];
+ if (valid_joints > used_joints)
+ {
+ S32 unsed_joints = valid_joints - used_joints;
+ LL_INFOS("GLTF_IMPORT") << "Skin " << skin_idx
+ << " declares " << valid_joints
+ << " valid joints, of them " << unsed_joints
+ << " remained unused" << LL_ENDL;
+ LLSD args;
+ args["Message"] = "SkinUnusedJoints";
+ args["SKIN_INDEX"] = (S32)skin_idx;
+ args["JOINT_COUNT"] = valid_joints;
+ args["USED_COUNT"] = used_joints;
+ mWarningsArray.append(args);
+ }
+ }
+}
+
+std::string LLGLTFLoader::extractTextureToTempFile(S32 textureIndex, const std::string& texture_type)
+{
+ if (textureIndex < 0 || textureIndex >= mGLTFAsset.mTextures.size())
+ return "";
+
+ S32 sourceIndex = mGLTFAsset.mTextures[textureIndex].mSource;
+ if (sourceIndex < 0 || sourceIndex >= mGLTFAsset.mImages.size())
+ return "";
+
+ LL::GLTF::Image& image = mGLTFAsset.mImages[sourceIndex];
+
+ // Handle URI-based textures
+ if (!image.mUri.empty())
+ {
+ return image.mUri; // Return URI directly
+ }
+
+ // Handle embedded textures
+ if (image.mBufferView >= 0)
+ {
+ if (image.mBufferView < mGLTFAsset.mBufferViews.size())
+ {
+ const LL::GLTF::BufferView& buffer_view = mGLTFAsset.mBufferViews[image.mBufferView];
+ if (buffer_view.mBuffer < mGLTFAsset.mBuffers.size())
+ {
+ const LL::GLTF::Buffer& buffer = mGLTFAsset.mBuffers[buffer_view.mBuffer];
+
+ if (buffer_view.mByteOffset + buffer_view.mByteLength <= buffer.mData.size())
+ {
+ // Extract image data
+ const U8* data_ptr = &buffer.mData[buffer_view.mByteOffset];
+ U32 data_size = buffer_view.mByteLength;
+
+ // Determine the file extension
+ std::string extension = ".png"; // Default
+ if (!image.mMimeType.empty())
+ {
+ if (image.mMimeType == "image/jpeg")
+ extension = ".jpg";
+ else if (image.mMimeType == "image/png")
+ extension = ".png";
+ }
+ else if (data_size >= 4)
+ {
+ if (data_ptr[0] == 0xFF && data_ptr[1] == 0xD8)
+ extension = ".jpg"; // JPEG magic bytes
+ else if (data_ptr[0] == 0x89 && data_ptr[1] == 0x50 && data_ptr[2] == 0x4E && data_ptr[3] == 0x47)
+ extension = ".png"; // PNG magic bytes
+ }
+
+ // Create a temporary file
+ std::string temp_dir = gDirUtilp->getTempDir();
+ std::string temp_filename = temp_dir + gDirUtilp->getDirDelimiter() +
+ "gltf_embedded_" + texture_type + "_" + std::to_string(sourceIndex) + extension;
+
+ // Write the image data to the temporary file
+ std::ofstream temp_file(temp_filename, std::ios::binary);
+ if (temp_file.is_open())
+ {
+ temp_file.write(reinterpret_cast<const char*>(data_ptr), data_size);
+ temp_file.close();
+
+ LL_INFOS("GLTF_IMPORT") << "Extracted embedded " << texture_type << " texture to: " << temp_filename << LL_ENDL;
+ return temp_filename;
+ }
+ else
+ {
+ LL_WARNS("GLTF_IMPORT") << "Failed to create temporary file for " << texture_type << " texture: " << temp_filename << LL_ENDL;
+
+ LLSD args;
+ args["Message"] = "FailedToCreateTempFile";
+ args["TEXTURE_INDEX"] = sourceIndex;
+ args["TEXTURE_TYPE"] = texture_type;
+ args["TEMP_FILE"] = temp_filename;
+ mWarningsArray.append(args);
+ }
+ }
+ }
+ }
+ }
+
+ return "";
+}
+
+void LLGLTFLoader::notifyUnsupportedExtension(bool unsupported)
+{
+ std::vector<std::string> extensions = unsupported ? mGLTFAsset.mUnsupportedExtensions : mGLTFAsset.mIgnoredExtensions;
+ if (extensions.size() > 0)
+ {
+ LLSD args;
+ args["Message"] = unsupported ? "UnsupportedExtension" : "IgnoredExtension";
+ std::string del;
+ std::string ext;
+ for (auto& extension : extensions)
+ {
+ ext += del;
+ ext += extension;
+ del = ",";
+ }
+ args["EXT"] = ext;
+ mWarningsArray.append(args);
+
+ LL_WARNS("GLTF_IMPORT") << "Model uses unsupported extension: " << ext << LL_ENDL;
+ }
+}
+
+size_t LLGLTFLoader::getSuffixPosition(const std::string &label)
+{
+ if ((label.find("_LOD") != -1) || (label.find("_PHYS") != -1))
+ {
+ return label.rfind('_');
+ }
+ return -1;
+}
+
+std::string LLGLTFLoader::getLodlessLabel(const LL::GLTF::Node& node)
+{
+ size_t ext_pos = getSuffixPosition(node.mName);
+ if (ext_pos != -1)
+ {
+ return node.mName.substr(0, ext_pos);
+ }
+ return node.mName;
+}
+
diff --git a/indra/newview/gltf/llgltfloader.h b/indra/newview/gltf/llgltfloader.h
new file mode 100644
index 0000000000..7aa1a94c20
--- /dev/null
+++ b/indra/newview/gltf/llgltfloader.h
@@ -0,0 +1,216 @@
+/**
+ * @file LLGLTFLoader.h
+ * @brief LLGLTFLoader class definition
+ *
+ * $LicenseInfo:firstyear=2022&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2022, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLGLTFLoader_H
+#define LL_LLGLTFLoader_H
+
+#include "tinygltf/tiny_gltf.h"
+
+#include "asset.h"
+
+#include "llglheaders.h"
+#include "lljointdata.h"
+#include "llmodelloader.h"
+
+class LLGLTFLoader : public LLModelLoader
+{
+ public:
+ typedef std::map<std::string, LLImportMaterial> material_map;
+ typedef std::map<std::string, std::string> joint_viewer_parent_map_t;
+ typedef std::map<std::string, glm::mat4> joint_viewer_rest_map_t;
+ typedef std::map<S32, glm::mat4> joint_node_mat4_map_t;
+
+ struct JointNodeData
+ {
+ JointNodeData()
+ : mJointListIdx(-1)
+ , mNodeIdx(-1)
+ , mParentNodeIdx(-1)
+ , mIsValidViewerJoint(false)
+ , mIsParentValidViewerJoint(false)
+ , mIsOverrideValid(false)
+ {
+
+ }
+ S32 mJointListIdx;
+ S32 mNodeIdx;
+ S32 mParentNodeIdx;
+ glm::mat4 mGltfRestMatrix;
+ glm::mat4 mViewerRestMatrix;
+ glm::mat4 mOverrideRestMatrix;
+ glm::mat4 mGltfMatrix;
+ glm::mat4 mOverrideMatrix;
+ std::string mName;
+ bool mIsValidViewerJoint;
+ bool mIsParentValidViewerJoint;
+ bool mIsOverrideValid;
+ };
+ typedef std::map <S32, JointNodeData> joints_data_map_t;
+ typedef std::map <std::string, S32> joints_name_to_node_map_t;
+
+ class LLGLTFImportMaterial : public LLImportMaterial
+ {
+ public:
+ std::string name;
+ LLGLTFImportMaterial() = default;
+ LLGLTFImportMaterial(const LLImportMaterial& mat, const std::string& n) : LLImportMaterial(mat), name(n) {}
+ };
+
+ LLGLTFLoader(std::string filename,
+ S32 lod,
+ LLModelLoader::load_callback_t load_cb,
+ LLModelLoader::joint_lookup_func_t joint_lookup_func,
+ LLModelLoader::texture_load_func_t texture_load_func,
+ LLModelLoader::state_callback_t state_cb,
+ void * opaque_userdata,
+ JointTransformMap & jointTransformMap,
+ JointNameSet & jointsFromNodes,
+ std::map<std::string, std::string, std::less<>> & jointAliasMap,
+ U32 maxJointsPerMesh,
+ U32 modelLimit,
+ U32 debugMode,
+ std::vector<LLJointData> viewer_skeleton); //,
+ //bool preprocess );
+ virtual ~LLGLTFLoader();
+
+ virtual bool OpenFile(const std::string &filename);
+
+ struct GLTFVertex
+ {
+ glm::vec3 position;
+ glm::vec3 normal;
+ glm::vec2 uv0;
+ glm::u16vec4 joints;
+ glm::vec4 weights;
+ };
+
+protected:
+ LL::GLTF::Asset mGLTFAsset;
+ tinygltf::Model mGltfModel;
+ bool mGltfLoaded = false;
+ bool mApplyXYRotation = false;
+
+ // GLTF isn't aware of viewer's skeleton and uses it's own,
+ // so need to take viewer's joints and use them to
+ // recalculate iverse bind matrices
+ std::vector<LLJointData> mViewerJointData;
+
+ // vector of vectors because of a posibility of having more than one skin
+ typedef std::vector<LLMeshSkinInfo::matrix_list_t> bind_matrices_t;
+ typedef std::vector<std::vector<std::string> > joint_names_t;
+ bind_matrices_t mInverseBindMatrices;
+ bind_matrices_t mAlternateBindMatrices;
+ joint_names_t mJointNames; // empty string when no legal name for a given idx
+ std::vector<std::vector<S32>> mJointUsage; // detect and warn about unsed joints
+
+ // what group a joint belongs to.
+ // For purpose of stripping unused groups when joints are over limit.
+ struct JointGroups
+ {
+ std::string mGroup;
+ std::string mParentGroup;
+ };
+ typedef std::map<std::string, JointGroups, std::less<> > joint_to_group_map_t;
+ joint_to_group_map_t mJointGroups;
+
+ // per skin joint count, needs to be tracked for the sake of limits check.
+ std::vector<S32> mValidJointsCount;
+
+ // Cached material information
+ typedef std::map<S32, LLGLTFImportMaterial> MaterialCache;
+ MaterialCache mMaterialCache;
+
+private:
+ bool parseMeshes();
+ void computeCombinedNodeTransform(const LL::GLTF::Asset& asset, S32 node_index, glm::mat4& combined_transform) const;
+ void processNodeHierarchy(S32 node_idx, std::map<std::string, S32>& mesh_name_counts, U32 submodel_limit, const LLVolumeParams& volume_params);
+ bool addJointToModelSkin(LLMeshSkinInfo& skin_info, S32 gltf_skin_idx, size_t gltf_joint_idx);
+ LLGLTFImportMaterial processMaterial(S32 material_index, S32 fallback_index);
+ std::string processTexture(S32 texture_index, const std::string& texture_type, const std::string& material_name);
+ bool validateTextureIndex(S32 texture_index, S32& source_index);
+ std::string generateMaterialName(S32 material_index, S32 fallback_index = -1);
+ bool populateModelFromMesh(LLModel* pModel, const std::string& base_name, const LL::GLTF::Mesh &mesh, const LL::GLTF::Node &node, material_map& mats);
+ void populateJointsFromSkin(S32 skin_idx);
+ void populateJointGroups();
+ void addModelToScene(LLModel* pModel, const std::string& model_name, U32 submodel_limit, const LLMatrix4& transformation, const LLVolumeParams& volume_params, const material_map& mats);
+ void buildJointGroup(LLJointData& viewer_data, const std::string& parent_group);
+ void buildOverrideMatrix(LLJointData& data, joints_data_map_t &gltf_nodes, joints_name_to_node_map_t &names_to_nodes, glm::mat4& parent_rest, glm::mat4& support_rest) const;
+ glm::mat4 buildGltfRestMatrix(S32 joint_node_index, const LL::GLTF::Skin& gltf_skin) const;
+ glm::mat4 buildGltfRestMatrix(S32 joint_node_index, const joints_data_map_t& joint_data) const;
+ glm::mat4 computeGltfToViewerSkeletonTransform(const joints_data_map_t& joints_data_map, S32 gltf_node_index, const std::string& joint_name) const;
+ bool checkForXYrotation(const LL::GLTF::Skin& gltf_skin, S32 joint_idx, S32 bind_indx);
+ void checkForXYrotation(const LL::GLTF::Skin& gltf_skin);
+ void checkGlobalJointUsage();
+
+ std::string extractTextureToTempFile(S32 textureIndex, const std::string& texture_type);
+
+ void notifyUnsupportedExtension(bool unsupported);
+
+ static size_t getSuffixPosition(const std::string& label);
+ static std::string getLodlessLabel(const LL::GLTF::Node& mesh);
+
+ // bool mPreprocessGLTF;
+
+ /* Below inherited from dae loader - unknown if/how useful here
+
+ void processElement(gltfElement *element, bool &badElement, GLTF *gltf);
+ void processGltfModel(LLModel *model, GLTF *gltf, gltfElement *pRoot, gltfMesh *mesh, gltfSkin *skin);
+
+ material_map getMaterials(LLModel *model, gltfInstance_geometry *instance_geo, GLTF *gltf);
+ LLImportMaterial profileToMaterial(gltfProfile_COMMON *material, GLTF *gltf);
+ LLColor4 getGltfColor(gltfElement *element);
+
+ gltfElement *getChildFromElement(gltfElement *pElement, std::string const &name);
+
+ bool isNodeAJoint(gltfNode *pNode);
+ void processJointNode(gltfNode *pNode, std::map<std::string, LLMatrix4> &jointTransforms);
+ void extractTranslation(gltfTranslate *pTranslate, LLMatrix4 &transform);
+ void extractTranslationViaElement(gltfElement *pTranslateElement, LLMatrix4 &transform);
+ void extractTranslationViaSID(gltfElement *pElement, LLMatrix4 &transform);
+ void buildJointToNodeMappingFromScene(gltfElement *pRoot);
+ void processJointToNodeMapping(gltfNode *pNode);
+ void processChildJoints(gltfNode *pParentNode);
+
+ bool verifyCount(int expected, int result);
+
+ // Verify that a controller matches vertex counts
+ bool verifyController(gltfController *pController);
+
+ static bool addVolumeFacesFromGltfMesh(LLModel *model, gltfMesh *mesh, LLSD &log_msg);
+ static bool createVolumeFacesFromGltfMesh(LLModel *model, gltfMesh *mesh);
+
+ static LLModel *loadModelFromGltfMesh(gltfMesh *mesh);
+
+ // Loads a mesh breaking it into one or more models as necessary
+ // to get around volume face limitations while retaining >8 materials
+ //
+ bool loadModelsFromGltfMesh(gltfMesh *mesh, std::vector<LLModel *> &models_out, U32 submodel_limit);
+
+ static std::string preprocessGLTF(std::string filename);
+ */
+
+};
+#endif // LL_LLGLTFLLOADER_H
diff --git a/indra/newview/gltfscenemanager.cpp b/indra/newview/gltfscenemanager.cpp
index bf3fada3bd..6a5dfd445e 100644
--- a/indra/newview/gltfscenemanager.cpp
+++ b/indra/newview/gltfscenemanager.cpp
@@ -220,6 +220,7 @@ void GLTFSceneManager::uploadSelection()
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost,
+ LLUUID::null,
false,
finish,
failure));
@@ -283,6 +284,7 @@ void GLTFSceneManager::uploadSelection()
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost,
+ LLUUID::null,
false,
finish,
failure));
@@ -317,7 +319,7 @@ void GLTFSceneManager::load(const std::string& filename)
{
std::shared_ptr<Asset> asset = std::make_shared<Asset>();
- if (asset->load(filename))
+ if (asset->load(filename, true))
{
gDebugProgram.bind(); // bind a shader to satisfy LLVertexBuffer assertions
asset->updateTransforms();
@@ -559,6 +561,7 @@ void GLTFSceneManager::update()
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost,
+ LLUUID::null,
false,
finish,
failure));
@@ -643,6 +646,12 @@ void GLTFSceneManager::render(Asset& asset, U8 variant)
return;
}
+ if (gGLTFPBRMetallicRoughnessProgram.mGLTFVariants.size() <= variant)
+ {
+ llassert(false); // mGLTFVariants should have been initialized
+ return;
+ }
+
for (U32 ds = 0; ds < 2; ++ds)
{
RenderData& rd = asset.mRenderData[ds];
diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp
index 43507f13e9..ed9e34d1bf 100644
--- a/indra/newview/groupchatlistener.cpp
+++ b/indra/newview/groupchatlistener.cpp
@@ -2,11 +2,11 @@
* @file groupchatlistener.cpp
* @author Nat Goodspeed
* @date 2011-04-11
- * @brief Implementation for groupchatlistener.
+ * @brief Implementation for LLGroupChatListener.
*
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
+ * Copyright (C) 2024, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,43 +34,69 @@
// std headers
// external library headers
// other Linden headers
+#include "llchat.h"
#include "llgroupactions.h"
#include "llimview.h"
+LLGroupChatListener::LLGroupChatListener():
+ LLEventAPI("GroupChat",
+ "API to enter, leave, send and intercept group chat messages")
+{
+ add("startGroupChat",
+ "Enter a group chat in group with UUID [\"group_id\"]\n"
+ "Assumes the logged-in agent is already a member of this group.",
+ &LLGroupChatListener::startGroupChat,
+ llsd::map("group_id", LLSD()));
+ add("leaveGroupChat",
+ "Leave a group chat in group with UUID [\"group_id\"]\n"
+ "Assumes a prior successful startIM request.",
+ &LLGroupChatListener::leaveGroupChat,
+ llsd::map("group_id", LLSD()));
+ add("sendGroupIM",
+ "send a [\"message\"] to group with UUID [\"group_id\"]",
+ &LLGroupChatListener::sendGroupIM,
+ llsd::map("message", LLSD(), "group_id", LLSD()));
+}
-namespace {
- void startIm_wrapper(LLSD const & event)
+bool is_in_group(LLEventAPI::Response &response, const LLSD &data)
+{
+ if (!LLGroupActions::isInGroup(data["group_id"]))
{
- LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID());
- sendReply(LLSDMap("session_id", LLSD(session_id)), event);
+ response.error(stringize("You are not the member of the group:", std::quoted(data["group_id"].asString())));
+ return false;
}
+ return true;
+}
- void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id)
+void LLGroupChatListener::startGroupChat(LLSD const &data)
+{
+ Response response(LLSD(), data);
+ if (!is_in_group(response, data))
+ {
+ return;
+ }
+ if (LLGroupActions::startIM(data["group_id"]).isNull())
{
- LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START);
+ return response.error(stringize("Failed to start group chat session ", std::quoted(data["group_id"].asString())));
}
}
+void LLGroupChatListener::leaveGroupChat(LLSD const &data)
+{
+ Response response(LLSD(), data);
+ if (is_in_group(response, data))
+ {
+ LLGroupActions::endIM(data["group_id"].asUUID());
+ }
+}
-GroupChatListener::GroupChatListener():
- LLEventAPI("GroupChat",
- "API to enter, leave, send and intercept group chat messages")
+void LLGroupChatListener::sendGroupIM(LLSD const &data)
{
- add("startIM",
- "Enter a group chat in group with UUID [\"id\"]\n"
- "Assumes the logged-in agent is already a member of this group.",
- &startIm_wrapper);
- add("endIM",
- "Leave a group chat in group with UUID [\"id\"]\n"
- "Assumes a prior successful startIM request.",
- &LLGroupActions::endIM,
- llsd::array("id"));
- add("sendIM",
- "send a groupchat IM",
- &send_message_wrapper,
- llsd::array("text", "session_id", "group_id"));
+ Response response(LLSD(), data);
+ if (!is_in_group(response, data))
+ {
+ return;
+ }
+ LLUUID group_id(data["group_id"]);
+ LLIMModel::sendMessage(data["message"], gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id), group_id, IM_SESSION_SEND);
}
-/*
- static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
- const LLUUID& other_participant_id, EInstantMessage dialog);
-*/
diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h
index 3819ac59b7..14cd7266a3 100644
--- a/indra/newview/groupchatlistener.h
+++ b/indra/newview/groupchatlistener.h
@@ -26,15 +26,20 @@
* $/LicenseInfo$
*/
-#if ! defined(LL_GROUPCHATLISTENER_H)
-#define LL_GROUPCHATLISTENER_H
+#if ! defined(LL_LLGROUPCHATLISTENER_H)
+#define LL_LLGROUPCHATLISTENER_H
#include "lleventapi.h"
-class GroupChatListener: public LLEventAPI
+class LLGroupChatListener: public LLEventAPI
{
public:
- GroupChatListener();
+ LLGroupChatListener();
+
+private:
+ void startGroupChat(LLSD const &data);
+ void leaveGroupChat(LLSD const &data);
+ void sendGroupIM(LLSD const &data);
};
-#endif /* ! defined(LL_GROUPCHATLISTENER_H) */
+#endif /* ! defined(LL_LLGROUPCHATLISTENER_H) */
diff --git a/indra/newview/icons/release/secondlife.icns b/indra/newview/icons/release/secondlife.icns
index a30b51b67a..00d9867814 100644
--- a/indra/newview/icons/release/secondlife.icns
+++ b/indra/newview/icons/release/secondlife.icns
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_128x128.png b/indra/newview/icons/release/secondlife.iconset/icon_128x128.png
new file mode 100644
index 0000000000..4c519db265
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_128x128.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png
new file mode 100644
index 0000000000..2a3a0092b2
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_16x16.png b/indra/newview/icons/release/secondlife.iconset/icon_16x16.png
new file mode 100644
index 0000000000..fda2f276ee
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_16x16.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png
new file mode 100644
index 0000000000..aa4a74f204
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_256x256.png b/indra/newview/icons/release/secondlife.iconset/icon_256x256.png
new file mode 100644
index 0000000000..2a3a0092b2
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_256x256.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png
new file mode 100644
index 0000000000..4c28add76c
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_32x32.png b/indra/newview/icons/release/secondlife.iconset/icon_32x32.png
new file mode 100644
index 0000000000..aa4a74f204
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_32x32.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png
new file mode 100644
index 0000000000..23a36f66cb
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_512x512.png b/indra/newview/icons/release/secondlife.iconset/icon_512x512.png
new file mode 100644
index 0000000000..4c28add76c
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_512x512.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png
new file mode 100644
index 0000000000..a53a6697f1
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_1024.png b/indra/newview/icons/release/secondlife_1024.png
new file mode 100644
index 0000000000..a53a6697f1
--- /dev/null
+++ b/indra/newview/icons/release/secondlife_1024.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_128.png b/indra/newview/icons/release/secondlife_128.png
deleted file mode 100644
index 2f21c1c7fc..0000000000
--- a/indra/newview/icons/release/secondlife_128.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_16.png b/indra/newview/icons/release/secondlife_16.png
deleted file mode 100644
index 68f1427309..0000000000
--- a/indra/newview/icons/release/secondlife_16.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_256.png b/indra/newview/icons/release/secondlife_256.png
deleted file mode 100644
index 8f324910e7..0000000000
--- a/indra/newview/icons/release/secondlife_256.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_32.png b/indra/newview/icons/release/secondlife_32.png
deleted file mode 100644
index 2b7cdef03d..0000000000
--- a/indra/newview/icons/release/secondlife_32.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_48.png b/indra/newview/icons/release/secondlife_48.png
deleted file mode 100644
index c2ef372dd7..0000000000
--- a/indra/newview/icons/release/secondlife_48.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/icons/test/secondlife.ico b/indra/newview/icons/test/secondlife.ico
index ceb8e8e6eb..c8430a6bd3 100644
--- a/indra/newview/icons/test/secondlife.ico
+++ b/indra/newview/icons/test/secondlife.ico
Binary files differ
diff --git a/indra/newview/icons/test/secondlife_256.BMP b/indra/newview/icons/test/secondlife_256.BMP
index e23fcfdbe9..829db82c52 100644
--- a/indra/newview/icons/test/secondlife_256.BMP
+++ b/indra/newview/icons/test/secondlife_256.BMP
Binary files differ
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 77f24ac6a6..0e36698018 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -164,6 +164,74 @@ Var DO_UNINSTALL_V2 # If non-null, path to a previous Viewer 2 installation
!include "x64.nsh" # for 64bit detection
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Substring function
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+!define StrStr "!insertmacro StrStr"
+
+!macro StrStr ResultVar String SubString
+ Push `${String}`
+ Push `${SubString}`
+ Call StrStr
+ Pop `${ResultVar}`
+!macroend
+
+Function StrStr
+
+# After this point:
+# ------------------------------------------
+# $R0 = SubString (input)
+# $R1 = String (input)
+# $R2 = SubStringLen (temp)
+# $R3 = StrLen (temp)
+# $R4 = StartCharPos (temp)
+# $R5 = TempStr (temp)
+# function from nsis.sourceforge.io/StrStr
+
+ ;Get input from user
+ Exch $R0
+ Exch
+ Exch $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+
+ ;Get "String" and "SubString" length
+ StrLen $R2 $R0
+ StrLen $R3 $R1
+ ;Start "StartCharPos" counter
+ StrCpy $R4 0
+
+ ;Loop until "SubString" is found or "String" reaches its end
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $R5 $R1 $R2 $R4
+
+ ;Compare "TempStr" with "SubString"
+ ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|}
+ ;If not "SubString", this could be "String"'s end
+ ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|}
+ ;If not, continue the loop
+ IntOp $R4 $R4 + 1
+ ${Loop}
+
+# After this point:
+# ------------------------------------------
+# $R0 = ResultVar (output)
+
+ ;Remove part before "SubString" on "String" (if there has one)
+ StrCpy $R0 $R1 `` $R4
+
+ ;Return output to user
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Exch $R0
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Pre-directory page callback
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function dirPre
@@ -190,15 +258,31 @@ Function .onInit
# However, SL-10506 complains about the resulting behavior, so the logic below
# is adapted from before we introduced MultiUser.nsh.
+# Check if user specified /D= on the command line
+System::Call 'kernel32::GetCommandLine()t .r0'
+Push $0
+Push " /D="
+Call StrStr
+Pop $1
+${If} $1 != ""
+ # /D= was specified, extract the path
+ # spaces are allowed in path after /D=, it's expected to be the last parameter
+ StrLen $2 $1
+ StrCpy $INSTDIR $1 $2 4 # Skip over " /D="
+ Goto after_instdir
+${EndIf}
+
# if $0 is empty, this is the first time for this viewer name
ReadRegStr $0 SHELL_CONTEXT "${INSTNAME_KEY}" ""
# viewer with this name was installed before
${If} $0 != ""
- # use the value we got from registry as install location
+ # use the value we got from registry as install location
StrCpy $INSTDIR $0
${EndIf}
+after_instdir:
+
Call CheckCPUFlags # Make sure we have SSE2 support
Call CheckWindowsVersion # Don't install On unsupported systems
Push $0
diff --git a/indra/newview/licenses-linux.txt b/indra/newview/licenses-linux.txt
index 23dace4de0..e83989b4a7 100644
--- a/indra/newview/licenses-linux.txt
+++ b/indra/newview/licenses-linux.txt
@@ -51,6 +51,7 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
OR OTHER DEALINGS IN THE SOFTWARE.
+
===========
CEF License
===========
@@ -405,6 +406,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+========
+sse2neon
+========
+/*
+ * sse2neon is freely redistributable under the MIT License.
+ *
+ * Copyright (c) 2015-2026 SSE2NEON Contributors.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
============
tinygltf
@@ -431,3 +458,35 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+======
+V-HACD
+======
+BSD 3-Clause License
+
+Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt
index a3792f0b6b..b1336f1bc4 100644
--- a/indra/newview/licenses-mac.txt
+++ b/indra/newview/licenses-mac.txt
@@ -48,7 +48,6 @@ Base32 License
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
-
===========
CEF License
===========
@@ -83,7 +82,6 @@ CEF License
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
============
cURL License
============
@@ -135,7 +133,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-
=============
expat License
=============
@@ -336,30 +333,6 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-===========
-SDL License
-===========
-
-SDL - Simple DirectMedia Layer
-Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
-
-This software is provided 'as-is', without any express or implied
-warranty. In no event will the authors be held liable for any damages
-arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it
-freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-3. This notice may not be removed or altered from any source distribution.
-
-
===============
OpenSSL License
===============
@@ -477,21 +450,6 @@ copied and put under another distribution licence
[including the GNU Public Licence.]
-==================
-xmlrpc-epi License
-==================
-
-Copyright 2000 Epinions, Inc.
-
-Subject to the following 3 conditions, Epinions, Inc. permits you, free of charge, to (a) use, copy, distribute, modify, perform and display this software and associated documentation files (the "Software"), and (b) permit others to whom the Software is furnished to do so as well.
-
-1) The above copyright notice and this permission notice shall be included without modification in all copies or substantial portions of the Software.
-
-2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
-
-3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH DAMAGES.
-
-
============
zlib License
============
@@ -687,6 +645,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+========
+sse2neon
+========
+/*
+ * sse2neon is freely redistributable under the MIT License.
+ *
+ * Copyright (c) 2015-2026 SSE2NEON Contributors.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
============
tinygltf
@@ -738,47 +722,35 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-========
-sse2neon
-========
-/*
- * sse2neon is freely redistributable under the MIT License.
- *
- * Copyright (c) 2015-2024 SSE2NEON Contributors.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
+======
+V-HACD
+======
+BSD 3-Clause License
-===============================
-libwebrtc binaries (unofficial)
-===============================
+Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com)
+All rights reserved.
-Copyright 2019 Zenichi Amano
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
- http://www.apache.org/licenses/LICENSE-2.0
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt
index eddc9a4475..946743f789 100644
--- a/indra/newview/licenses-win32.txt
+++ b/indra/newview/licenses-win32.txt
@@ -239,32 +239,48 @@ JPEG Library 6b License
This software is based in part on the work of the Independent JPEG Group
================
-JPEG2000 License
+OpenJPEG License
================
-Copyright 2001, David Taubman, The University of New South Wales (UNSW)
-The copyright owner is Unisearch Ltd, Australia (commercial arm of UNSW)
-Neither this copyright statement, nor the licensing details below
-may be removed from this file or dissociated from its contents.
-
-Licensee: Linden Research, Inc.
-License number: 00024
-The licensee has been granted a COMMERCIAL license to the contents of
-this source file. A brief summary of this license appears below. This
-summary is not to be relied upon in preference to the full text of the
-license agreement, accepted at purchase of the license.
-1. The Licensee has the right to Commercial Use of the Kakadu software,
- including distribution of one or more Applications built using the
- software.
-2. The Licensee has the right to Internal Use of the Kakadu software,
- including use by employees of the Licensee or an Affiliate for the
- purpose of performing services on behalf of the Licensee or Affiliate,
- or in the performance of services for Third Parties who engage Licensee
- or an Affiliate for such services.
-3. The Licensee has the right to distribute Reusable Code (including
- source code and dynamically or statically linked libraries) to a Third
- Party, provided the Third Party possesses a license to use the Kakadu
- software.
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2003-2009, Francois-Olivier Devaux
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
==================
ogg/vorbis License
@@ -418,21 +434,6 @@ copied and put under another distribution licence
[including the GNU Public Licence.]
-==================
-xmlrpc-epi License
-==================
-
-Copyright 2000 Epinions, Inc.
-
-Subject to the following 3 conditions, Epinions, Inc. permits you, free of charge, to (a) use, copy, distribute, modify, perform and display this software and associated documentation files (the "Software"), and (b) permit others to whom the Software is furnished to do so as well.
-
-1) The above copyright notice and this permission notice shall be included without modification in all copies or substantial portions of the Software.
-
-2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
-
-3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH DAMAGES.
-
-
============
zlib License
============
@@ -558,218 +559,6 @@ supporting the PNG file format in commercial products. If you use this
source code in a product, acknowledgment is not required but would be
appreciated.
-=================
-Vivox SDK License
-=================
-
-RSA Data Security, Inc. MD5 Message-Digest Algorithm
-
-Audio coding: Polycom(R) Siren14TM (ITU-T Rec. G.722.1 Annex C)
-
-Open Source Software Licensing
-Each open source software component utilized by this product is subject to its own copyright and licensing terms, as listed below.
-
-
-*************************************************************
-*************************************************************
-
-/**
- * OpenAL cross platform audio library
- * Copyright (C) 1999-2000 by authors.
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- * Or go to http://www.gnu.org/copyleft/lgpl.html
- */
-
-*************************************************************
-*************************************************************
-RTP code under Lesser General Public License
-
-/*
- The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.
- Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-************************************************************
-*************************************************************
-
-/*
- * The Vovida Software License, Version 1.0
- *
- * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The names "VOCAL", "Vovida Open Communication Application Library",
- * and "Vovida Open Communication Application Library (VOCAL)" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact vocal@vovida.org.
- *
- * 4. Products derived from this software may not be called "VOCAL", nor
- * may "VOCAL" appear in their name, without prior written
- * permission of Vovida Networks, Inc.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
- * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
- * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
- * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- *
- * This software consists of voluntary contributions made by Vovida
- * Networks, Inc. and many individuals on behalf of Vovida Networks,
- * Inc. For more information on Vovida Networks, Inc., please see
- *
- *
- */
-*************************************************************
-*************************************************************
-
-Internet Software Consortium code
-
-/* This is from the BIND 4.9.4 release, modified to compile by itself */
-/* Copyright (c) 1996 by Internet Software Consortium.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-*************************************************************
-
-*************************************************************
-
-************************************************************
-
-http://tinyxpath.sourceforge.net/
-
-TinyXPath is covered by the zlib license :
-
- www.sourceforge.net/projects/tinyxpath
- Copyright (c) 2002-2006 Yves Berquin (yvesb@users.sourceforge.net)
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any
- damages arising from the use of this software.
-
- Permission is granted to anyone to use this software for any
- purpose, including commercial applications, and to alter it and
- redistribute it freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product documentation
- would be appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and
- must not be misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source distribution.
-
-
-************************************************************
-************************************************************
-
-THE FREE SOFTWARE FOUNDATION
-
-Any customer may request the source code for all open source portions of this product which are covered by the Free Software Foundation's General Public License (GPL), for a period of three years from purchase. Please contact the vendor from whom you obtained this product for instructions. A fee equivalent to the cost of making the code available may be charged. Alternatively, customers may choose to download desired GPL components directly from their original vendors. Specifically, this product contains the following GPL-licensed components:
-
-
-From Vivox:
- - Assorted software components. To request source, contact Vivox at:
- Vivox, Inc.
- Attn: customer support
- 40 Speen Street Suite 402
- Framingham, MA 01701
-
-
-========================
-google-perftools license
-========================
-
-Copyright (c) 2005, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
=============
meshoptimizer
=============
@@ -795,6 +584,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+========
+sse2neon
+========
+/*
+ * sse2neon is freely redistributable under the MIT License.
+ *
+ * Copyright (c) 2015-2026 SSE2NEON Contributors.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
============
tinygltf
@@ -821,6 +636,39 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+======
+V-HACD
+======
+BSD 3-Clause License
+
+Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
==============
Vulkan GLTF
==============
diff --git a/indra/newview/linux_tools/launch_url.sh b/indra/newview/linux_tools/launch_url.sh
index 7c4ebf2291..404ea36f26 100755
--- a/indra/newview/linux_tools/launch_url.sh
+++ b/indra/newview/linux_tools/launch_url.sh
@@ -61,7 +61,6 @@ fi
# will be tried first, which is a debian alternative.
BROWSER_COMMANDS=" \
x-www-browser \
- chrome \
firefox \
mozilla-firefox \
iceweasel \
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 2161dbe19e..abea7926ee 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -121,8 +121,8 @@ const F32 MIN_FIDGET_TIME = 8.f; // seconds
const F32 MAX_FIDGET_TIME = 20.f; // seconds
const S32 UI_FEATURE_VERSION = 1;
-// For version 1: 1 - inventory, 2 - gltf
-const S32 UI_FEATURE_FLAGS = 3;
+// For version 1, flag holds: 1 - inventory thumbnails, 2 - gltf, 4 - inventory favorites
+const S32 UI_FEATURE_FLAGS = 7;
// The agent instance.
LLAgent gAgent;
@@ -167,7 +167,7 @@ std::map<S32, std::string> LLTeleportRequest::sTeleportStatusName = { { kPending
class LLTeleportRequestViaLandmark : public LLTeleportRequest
{
public:
- LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId);
+ LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId, bool log = true);
virtual ~LLTeleportRequestViaLandmark();
virtual void toOstream(std::ostream& os) const;
@@ -179,6 +179,7 @@ public:
protected:
inline const LLUUID &getLandmarkId() const {return mLandmarkId;};
+ bool mLogOnDestruction = true;
private:
LLUUID mLandmarkId;
@@ -223,7 +224,6 @@ private:
LLVector3d mPosGlobal;
};
-
class LLTeleportRequestViaLocationLookAt : public LLTeleportRequestViaLocation
{
public:
@@ -386,6 +386,10 @@ LLAgent::LLAgent() :
mbRunning(false),
mbTeleportKeepsLookAt(false),
+ mAllowedToStand(true),
+ mAllowedToSit(true),
+ mSitObjectID(LLUUID::null),
+
mAgentAccess(new LLAgentAccess(gSavedSettings)),
mGodLevelChangeSignal(),
mCanEditParcel(false),
@@ -604,7 +608,7 @@ void LLAgent::getFeatureVersionAndFlags(S32& version, S32& flags)
if (feature_version.isInteger())
{
version = feature_version.asInteger();
- flags = 1; // inventory flag
+ flags = 3; // show 'favorites' notification
}
else if (feature_version.isMap())
{
@@ -630,13 +634,8 @@ void LLAgent::showLatestFeatureNotification(const std::string key)
if (key == "inventory")
{
- // Notify user about new thumbnail support
- flag = 1;
- }
-
- if (key == "gltf")
- {
- flag = 2;
+ // Notify user about new favorites support
+ flag = 4;
}
if ((flags & flag) == 0)
@@ -843,7 +842,6 @@ void LLAgent::movePitch(F32 mag)
}
}
-
// Does this parcel allow you to fly?
bool LLAgent::canFly()
{
@@ -923,7 +921,6 @@ void LLAgent::setFlying(bool fly, bool fail_sound)
LLFloaterMove::setFlyingMode(fly);
}
-
// UI based mechanism of setting fly state
//-----------------------------------------------------------------------------
// toggleFlying()
@@ -969,7 +966,11 @@ bool LLAgent::isSitting()
void LLAgent::standUp()
{
- setControlFlags(AGENT_CONTROL_STAND_UP);
+ if (mAllowedToStand)
+ {
+ setControlFlags(AGENT_CONTROL_STAND_UP);
+ mSitObjectID = LLUUID::null;
+ }
}
void LLAgent::changeParcels()
@@ -1002,7 +1003,6 @@ void LLAgent::capabilityReceivedCallback(const LLUUID &region_id, LLViewerRegion
}
}
-
//-----------------------------------------------------------------------------
// setRegion()
//-----------------------------------------------------------------------------
@@ -1108,7 +1108,6 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
mRegionChangedSignal();
}
-
//-----------------------------------------------------------------------------
// getRegion()
//-----------------------------------------------------------------------------
@@ -1117,7 +1116,6 @@ LLViewerRegion *LLAgent::getRegion() const
return mRegionp;
}
-
LLHost LLAgent::getRegionHost() const
{
if (mRegionp)
@@ -1148,7 +1146,6 @@ bool LLAgent::inPrelude()
return mRegionp && mRegionp->isPrelude();
}
-
std::string LLAgent::getRegionCapability(const std::string &name)
{
if (!mRegionp)
@@ -1157,7 +1154,6 @@ std::string LLAgent::getRegionCapability(const std::string &name)
return mRegionp->getCapability(name);
}
-
//-----------------------------------------------------------------------------
// canManageEstate()
//-----------------------------------------------------------------------------
@@ -1185,7 +1181,6 @@ void LLAgent::sendMessage()
gMessageSystem->sendMessage(mRegionp->getHost());
}
-
//-----------------------------------------------------------------------------
// sendReliableMessage()
//-----------------------------------------------------------------------------
@@ -1219,7 +1214,6 @@ LLVector3 LLAgent::getVelocity() const
}
}
-
//-----------------------------------------------------------------------------
// setPositionAgent()
//-----------------------------------------------------------------------------
@@ -1293,16 +1287,20 @@ const LLVector3 &LLAgent::getPositionAgent()
}
}
-
return mFrameAgent.getOrigin();
}
+void LLAgent::setAvatarsPositions(const std::map<LLUUID, LLVector3d>& avatarsPositions)
+{
+ mAvatarsPositions.clear();
+ mAvatarsPositions = avatarsPositions;
+}
+
boost::signals2::connection LLAgent::whenPositionChanged(position_signal_t::slot_type fn)
{
return mOnPositionChanged.connect(fn);
}
-
//-----------------------------------------------------------------------------
// getRegionsVisited()
//-----------------------------------------------------------------------------
@@ -1319,7 +1317,6 @@ F64 LLAgent::getDistanceTraveled() const
return mDistanceTraveled;
}
-
//-----------------------------------------------------------------------------
// getPosAgentFromGlobal()
//-----------------------------------------------------------------------------
@@ -1330,7 +1327,6 @@ LLVector3 LLAgent::getPosAgentFromGlobal(const LLVector3d &pos_global) const
return pos_agent;
}
-
//-----------------------------------------------------------------------------
// getPosGlobalFromAgent()
//-----------------------------------------------------------------------------
@@ -1343,10 +1339,9 @@ LLVector3d LLAgent::getPosGlobalFromAgent(const LLVector3 &pos_agent) const
void LLAgent::sitDown()
{
- setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
+ if (mAllowedToSit) setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
}
-
//-----------------------------------------------------------------------------
// resetAxes()
//-----------------------------------------------------------------------------
@@ -1355,7 +1350,6 @@ void LLAgent::resetAxes()
mFrameAgent.resetAxes();
}
-
// Copied from LLCamera::setOriginAndLookAt
// Look_at must be unit vector
//-----------------------------------------------------------------------------
@@ -1384,7 +1378,6 @@ void LLAgent::resetAxes(const LLVector3 &look_at)
mFrameAgent.setAxes(look_at, left, up);
}
-
//-----------------------------------------------------------------------------
// rotate()
//-----------------------------------------------------------------------------
@@ -1393,7 +1386,6 @@ void LLAgent::rotate(F32 angle, const LLVector3 &axis)
mFrameAgent.rotate(angle, axis);
}
-
//-----------------------------------------------------------------------------
// rotate()
//-----------------------------------------------------------------------------
@@ -1402,7 +1394,6 @@ void LLAgent::rotate(F32 angle, F32 x, F32 y, F32 z)
mFrameAgent.rotate(angle, x, y, z);
}
-
//-----------------------------------------------------------------------------
// rotate()
//-----------------------------------------------------------------------------
@@ -1411,7 +1402,6 @@ void LLAgent::rotate(const LLMatrix3 &matrix)
mFrameAgent.rotate(matrix);
}
-
//-----------------------------------------------------------------------------
// rotate()
//-----------------------------------------------------------------------------
@@ -1420,7 +1410,6 @@ void LLAgent::rotate(const LLQuaternion &quaternion)
mFrameAgent.rotate(quaternion);
}
-
//-----------------------------------------------------------------------------
// getReferenceUpVector()
//-----------------------------------------------------------------------------
@@ -1449,7 +1438,6 @@ LLVector3 LLAgent::getReferenceUpVector()
return up_vector;
}
-
// Radians, positive is forward into ground
//-----------------------------------------------------------------------------
// pitch()
@@ -1493,7 +1481,6 @@ void LLAgent::pitch(F32 angle)
}
}
-
//-----------------------------------------------------------------------------
// roll()
//-----------------------------------------------------------------------------
@@ -1502,7 +1489,6 @@ void LLAgent::roll(F32 angle)
mFrameAgent.roll(angle);
}
-
//-----------------------------------------------------------------------------
// yaw()
//-----------------------------------------------------------------------------
@@ -1514,7 +1500,6 @@ void LLAgent::yaw(F32 angle)
}
}
-
// Returns a quat that represents the rotation of the agent in the absolute frame
//-----------------------------------------------------------------------------
// getQuat()
@@ -1540,7 +1525,6 @@ void LLAgent::setControlFlags(U32 mask)
mControlFlags |= mask;
}
-
//-----------------------------------------------------------------------------
// clearControlFlags()
//-----------------------------------------------------------------------------
@@ -1628,7 +1612,6 @@ bool LLAgent::isDoNotDisturb() const
return mIsDoNotDisturb;
}
-
//-----------------------------------------------------------------------------
// startAutoPilotGlobal()
//-----------------------------------------------------------------------------
@@ -1734,7 +1717,6 @@ void LLAgent::startAutoPilotGlobal(
mAutoPilotNoProgressFrameCount = 0;
}
-
//-----------------------------------------------------------------------------
// setAutoPilotTargetGlobal
//-----------------------------------------------------------------------------
@@ -1788,7 +1770,6 @@ void LLAgent::startFollowPilot(const LLUUID &leader_id, bool allow_flying, F32 s
allow_flying);
}
-
//-----------------------------------------------------------------------------
// stopAutoPilot()
//-----------------------------------------------------------------------------
@@ -1830,7 +1811,6 @@ void LLAgent::stopAutoPilot(bool user_cancel)
}
}
-
// Returns necessary agent pitch and yaw changes, radians.
//-----------------------------------------------------------------------------
// autoPilot()
@@ -2019,7 +1999,6 @@ void LLAgent::autoPilot(F32 *delta_yaw)
}
}
-
//-----------------------------------------------------------------------------
// propagate()
//-----------------------------------------------------------------------------
@@ -2040,18 +2019,19 @@ void LLAgent::propagate(const F32 dt)
}
// handle rotation based on keyboard levels
- constexpr F32 YAW_RATE = 90.f * DEG_TO_RAD; // radians per second
- F32 angle = YAW_RATE * gAgentCamera.getYawKey() * dt;
- if (fabs(angle) > 0.0f)
+ if (fabs(dt) > 1e-6)
{
- yaw(angle);
- }
+ if (fabs(gAgentCamera.getYawKey()) > 1e-6)
+ {
+ static const F32 YAW_RATE = 90.f * DEG_TO_RAD; // radians per second
+ yaw(YAW_RATE * gAgentCamera.getYawKey() * dt);
+ }
- constexpr F32 PITCH_RATE = 90.f * DEG_TO_RAD; // radians per second
- angle = PITCH_RATE * gAgentCamera.getPitchKey() * dt;
- if (fabs(angle) > 0.0f)
- {
- pitch(angle);
+ if (fabs(gAgentCamera.getPitchKey()) > 1e-6)
+ {
+ static const F32 PITCH_RATE = 90.f * DEG_TO_RAD; // radians per second
+ pitch(PITCH_RATE * gAgentCamera.getPitchKey() * dt);
+ }
}
// handle auto-land behavior
@@ -2213,7 +2193,6 @@ void LLAgent::clearRenderState(U8 clearstate)
mRenderState &= ~clearstate;
}
-
//-----------------------------------------------------------------------------
// getRenderState()
//-----------------------------------------------------------------------------
@@ -2255,6 +2234,7 @@ void LLAgent::endAnimationUpdateUI()
{
return;
}
+
if (gAgentCamera.getCameraMode() == gAgentCamera.getLastCameraMode())
{
// We're already done endAnimationUpdateUI for this transition.
@@ -2320,7 +2300,6 @@ void LLAgent::endAnimationUpdateUI()
mViewsPushed = false;
}
-
gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
if( gMorphView )
{
@@ -2952,7 +2931,6 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity)
}
}
-
void LLAgent::processMaturityPreferenceFromServer(const LLSD &result, U8 perferredMaturity)
{
U8 maturity = SIM_ACCESS_MIN;
@@ -3022,7 +3000,6 @@ void LLAgent::changeInterestListMode(const std::string &new_mode)
}
}
-
bool LLAgent::requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess, httpCallback_t cbFailure)
{
if (getRegion())
@@ -3349,7 +3326,6 @@ void LLAgent::sendAnimationStateReset()
sendReliableMessage();
}
-
// Send a message to the region to revoke sepecified permissions on ALL scripts in the region
// If the target is an object in the region, permissions in scripts on that object are cleared.
// If it is the region ID, all scripts clear the permissions for this agent
@@ -4279,7 +4255,6 @@ void LLAgent::onCapabilitiesReceivedAfterTeleport()
check_merchant_status();
}
-
void LLAgent::teleportRequest(
const U64& region_handle,
const LLVector3& pos_local,
@@ -4393,7 +4368,6 @@ void LLAgent::doTeleportViaLure(const LLUUID& lure_id, bool godlike)
}
}
-
// James Cook, July 28, 2005
void LLAgent::teleportCancel()
{
@@ -4518,7 +4492,6 @@ LLAgent::ETeleportState LLAgent::getTeleportState() const
TELEPORT_NONE : mTeleportState;
}
-
void LLAgent::setTeleportState(ETeleportState state)
{
if (mTeleportRequest && (state != TELEPORT_NONE) && (mTeleportRequest->getStatus() == LLTeleportRequest::kFailed))
@@ -4563,7 +4536,6 @@ void LLAgent::setTeleportState(ETeleportState state)
}
}
-
void LLAgent::stopCurrentAnimations()
{
LL_DEBUGS("Avatar") << "Stopping current animations" << LL_ENDL;
@@ -4678,7 +4650,6 @@ void LLAgent::stopFidget()
gAgent.sendAnimationRequests(anims, ANIM_REQUEST_STOP);
}
-
void LLAgent::requestEnterGodMode()
{
LLMessageSystem* msg = gMessageSystem;
@@ -4799,7 +4770,6 @@ void LLAgent::sendAgentUpdateUserInfo(const std::string& directory_visibility)
}
}
-
void LLAgent::updateAgentUserInfoCoro(std::string capurl, std::string directory_visibility)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
@@ -5053,16 +5023,25 @@ void LLTeleportRequest::toOstream(std::ostream& os) const
//-----------------------------------------------------------------------------
// LLTeleportRequestViaLandmark
//-----------------------------------------------------------------------------
-LLTeleportRequestViaLandmark::LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId)
- : LLTeleportRequest(),
- mLandmarkId(pLandmarkId)
+LLTeleportRequestViaLandmark::LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId, bool log)
+ : LLTeleportRequest()
+ , mLandmarkId(pLandmarkId)
+ , mLogOnDestruction(true)
{
- LL_INFOS("Teleport") << "LLTeleportRequestViaLandmark created, " << *this << LL_ENDL;
+ if (log)
+ {
+ // Workaround to not log twice for LLTeleportRequestViaLure, besides this wouldn't have logged fully.
+ LL_INFOS("Teleport") << "LLTeleportRequestViaLandmark created, " << *this << LL_ENDL;
+ }
}
LLTeleportRequestViaLandmark::~LLTeleportRequestViaLandmark()
{
- LL_INFOS("Teleport") << "~LLTeleportRequestViaLandmark, " << *this << LL_ENDL;
+ if (mLogOnDestruction)
+ {
+ // Workaround to not crash on toOstream for derived classes and to not log twice.
+ LL_INFOS("Teleport") << "~LLTeleportRequestViaLandmark, " << *this << LL_ENDL;
+ }
}
void LLTeleportRequestViaLandmark::toOstream(std::ostream& os) const
@@ -5092,16 +5071,20 @@ void LLTeleportRequestViaLandmark::restartTeleport()
// LLTeleportRequestViaLure
//-----------------------------------------------------------------------------
-LLTeleportRequestViaLure::LLTeleportRequestViaLure(const LLUUID &pLureId, bool pIsLureGodLike)
- : LLTeleportRequestViaLandmark(pLureId),
+LLTeleportRequestViaLure::LLTeleportRequestViaLure(const LLUUID& pLureId, bool pIsLureGodLike)
+ : LLTeleportRequestViaLandmark(pLureId, false),
mIsLureGodLike(pIsLureGodLike)
{
- LL_INFOS("Teleport") << "LLTeleportRequestViaLure created" << LL_ENDL;
+ LL_INFOS("Teleport") << "LLTeleportRequestViaLure created: " << *this << LL_ENDL;
}
LLTeleportRequestViaLure::~LLTeleportRequestViaLure()
{
- LL_INFOS("Teleport") << "~LLTeleportRequestViaLure" << LL_ENDL;
+ if (mLogOnDestruction)
+ {
+ LL_INFOS("Teleport") << "~LLTeleportRequestViaLure: " << *this << LL_ENDL;
+ mLogOnDestruction = false;
+ }
}
void LLTeleportRequestViaLure::toOstream(std::ostream& os) const
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index c1d3c6c14b..a2d2ecea9f 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -195,6 +195,8 @@ public:
// Call once per frame to update position, angles (radians).
void updateAgentPosition(const F32 dt, const F32 yaw, const S32 mouse_x, const S32 mouse_y);
void setPositionAgent(const LLVector3 &center);
+ void setAvatarsPositions(const std::map<LLUUID, LLVector3d>& avatarsPositions);
+ const std::map<LLUUID, LLVector3d>& getAvatarsPositions() const { return mAvatarsPositions;}
boost::signals2::connection whenPositionChanged(position_signal_t::slot_type fn);
@@ -205,6 +207,7 @@ private:
position_signal_t mOnPositionChanged;
LLVector3d mLastTestGlobal;
+ std::map<LLUUID, LLVector3d> mAvatarsPositions;
//--------------------------------------------------------------------
// Velocity
@@ -446,6 +449,16 @@ public:
void standUp();
/// @brief ground-sit at agent's current position
void sitDown();
+ bool isAllowedToStand() const { return mAllowedToStand; }
+ void setAllowedToStand(bool allow) { mAllowedToStand = allow; }
+ bool isAllowedToSit() const { return mAllowedToSit; }
+ void setAllowedToSit(bool allow) { mAllowedToSit = allow; }
+ const LLUUID& getSitObjectID() const { return mSitObjectID; }
+ void setSitObjectID(const LLUUID& objectID) { mSitObjectID = objectID; }
+private:
+ bool mAllowedToStand;
+ bool mAllowedToSit;
+ LLUUID mSitObjectID;
//--------------------------------------------------------------------
// Do Not Disturb
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 4856eb1199..b6d31c0cae 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -1462,13 +1462,12 @@ void LLAgentCamera::updateCamera()
// LL_INFOS() << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << LL_ENDL;
LLVector3 focus_agent = gAgent.getPosAgentFromGlobal(mFocusGlobal);
+ LLVector3 position_agent = gAgent.getPosAgentFromGlobal(camera_pos_global);
- mCameraPositionAgent = gAgent.getPosAgentFromGlobal(camera_pos_global);
+ // Try to move the camera
- // Move the camera
-
- LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, mCameraUpVector, focus_agent);
- //LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, camera_skyward, focus_agent);
+ if (!LLViewerCamera::getInstance()->updateCameraLocation(position_agent, mCameraUpVector, focus_agent))
+ return;
// Change FOV
LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / (1.f + mCameraCurrentFOVZoomFactor));
@@ -1476,7 +1475,7 @@ void LLAgentCamera::updateCamera()
// follow camera when in customize mode
if (cameraCustomizeAvatar())
{
- setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent);
+ setLookAt(LOOKAT_TARGET_FOCUS, NULL, position_agent);
}
// update the travel distance stat
@@ -1495,8 +1494,8 @@ void LLAgentCamera::updateCamera()
LLVector3 head_pos = gAgentAvatarp->mHeadp->getWorldPosition() +
LLVector3(0.08f, 0.f, 0.05f) * gAgentAvatarp->mHeadp->getWorldRotation() +
LLVector3(0.1f, 0.f, 0.f) * gAgentAvatarp->mPelvisp->getWorldRotation();
- LLVector3 diff = mCameraPositionAgent - head_pos;
- diff = diff * ~gAgentAvatarp->mRoot->getWorldRotation();
+ LLVector3 diff = position_agent - head_pos;
+ diff *= ~gAgentAvatarp->mRoot->getWorldRotation();
LLJoint* torso_joint = gAgentAvatarp->mTorsop;
LLJoint* chest_joint = gAgentAvatarp->mChestp;
@@ -1755,7 +1754,6 @@ F32 LLAgentCamera::calcCameraFOVZoomFactor()
LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
{
// Compute base camera position and look-at points.
- F32 camera_land_height;
LLVector3d frame_center_global = !isAgentAvatarValid() ?
gAgent.getPositionGlobal() :
gAgent.getPosGlobalFromAgent(getAvatarRootPosition());
@@ -1990,22 +1988,13 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
isConstrained = true;
}
}
-
-// JC - Could constrain camera based on parcel stuff here.
-// LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global);
-//
-// if (regionp && !regionp->mParcelOverlay->isBuildCameraAllowed(regionp->getPosRegionFromGlobal(camera_position_global)))
-// {
-// camera_position_global = last_position_global;
-//
-// isConstrained = true;
-// }
}
- // Don't let camera go underground
- F32 camera_min_off_ground = getCameraMinOffGround();
- camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
- F32 minZ = llmax(F_ALMOST_ZERO, camera_land_height + camera_min_off_ground);
+ // Don't let camera go underground if constrained
+ // If not constrained, permit going 1000m below 0, use case: retrieving objects
+ F32 camera_min_off_ground = getCameraMinOffGround(); // checks isDisableCameraConstraints
+ F32 camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
+ F32 minZ = camera_land_height + camera_min_off_ground;
if (camera_position_global.mdV[VZ] < minZ)
{
camera_position_global.mdV[VZ] = minZ;
@@ -2268,7 +2257,8 @@ void LLAgentCamera::changeCameraToFollow(bool animate)
mCameraMode = CAMERA_MODE_FOLLOW;
// bang-in the current focus, position, and up vector of the follow cam
- mFollowCam.reset(mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis);
+ const LLViewerCamera& camera = LLViewerCamera::instance();
+ mFollowCam.reset(camera.getOrigin(), camera.getPointOfInterest(), LLVector3::z_axis);
if (gBasicToolset)
{
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index 52571f3c55..d277fd6158 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -112,6 +112,7 @@ private:
//--------------------------------------------------------------------
public:
void switchCameraPreset(ECameraPreset preset);
+ ECameraPreset getCameraPreset() const { return mCameraPreset; }
/** Determines default camera offset depending on the current camera preset */
LLVector3 getCameraOffsetInitial();
/** Determines default focus offset depending on the current camera preset */
@@ -138,13 +139,14 @@ private:
//--------------------------------------------------------------------
public:
LLVector3d getCameraPositionGlobal() const;
- const LLVector3 &getCameraPositionAgent() const;
+ const LLVector3& getCameraPositionAgent() const;
LLVector3d calcCameraPositionTargetGlobal(bool *hit_limit = NULL); // Calculate the camera position target
F32 getCameraMinOffGround(); // Minimum height off ground for this mode, meters
void setCameraCollidePlane(const LLVector4 &plane) { mCameraCollidePlane = plane; }
bool calcCameraMinDistance(F32 &obj_min_distance);
- F32 getCurrentCameraBuildOffset() { return (F32)mCameraFocusOffset.length(); }
+ F32 getCurrentCameraBuildOffset() const { return (F32)mCameraFocusOffset.length(); }
void clearCameraLag() { mCameraLag.clearVec(); }
+ const LLVector3& getCameraUpVector() const { return mCameraUpVector; }
private:
LLVector3 getAvatarRootPosition();
@@ -154,7 +156,6 @@ private:
F32 mCameraCurrentFOVZoomFactor; // Interpolated fov zoom
LLVector4 mCameraCollidePlane; // Colliding plane for camera
F32 mCameraZoomFraction; // Mousewheel driven fraction of zoom
- LLVector3 mCameraPositionAgent; // Camera position in agent coordinates
LLVector3 mCameraVirtualPositionAgent; // Camera virtual position (target) before performing FOV zoom
LLVector3d mCameraSmoothingLastPositionGlobal;
LLVector3d mCameraSmoothingLastPositionAgent;
@@ -278,7 +279,7 @@ public:
F32 getAgentHUDTargetZoom();
void resetCameraZoomFraction();
- F32 getCurrentCameraZoomFraction() { return mCameraZoomFraction; }
+ F32 getCurrentCameraZoomFraction() const { return mCameraZoomFraction; }
//--------------------------------------------------------------------
// Pan
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 0c120ae01d..5ddb87558a 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -31,19 +31,25 @@
#include "llagentlistener.h"
#include "llagent.h"
+#include "llagentcamera.h"
+#include "llavatarname.h"
+#include "llavatarnamecache.h"
#include "llvoavatar.h"
#include "llcommandhandler.h"
+#include "llinventorymodel.h"
#include "llslurl.h"
#include "llurldispatcher.h"
+#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
+#include "llvoavatarself.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
#include "lltoolgrab.h"
#include "llhudeffectlookat.h"
-#include "llagentcamera.h"
+#include "llviewercamera.h"
LLAgentListener::LLAgentListener(LLAgent &agent)
: LLEventAPI("LLAgent",
@@ -69,13 +75,6 @@ LLAgentListener::LLAgentListener(LLAgent &agent)
add("resetAxes",
"Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])",
&LLAgentListener::resetAxes);
- add("getAxes",
- "Obsolete - use getPosition instead\n"
- "Send information about the agent's orientation on [\"reply\"]:\n"
- "[\"euler\"]: map of {roll, pitch, yaw}\n"
- "[\"quat\"]: array of [x, y, z, w] quaternion values",
- &LLAgentListener::getAxes,
- LLSDMap("reply", LLSD()));
add("getPosition",
"Send information about the agent's position and orientation on [\"reply\"]:\n"
"[\"region\"]: array of region {x, y, z} position\n"
@@ -87,33 +86,34 @@ LLAgentListener::LLAgentListener(LLAgent &agent)
add("startAutoPilot",
"Start the autopilot system using the following parameters:\n"
"[\"target_global\"]: array of target global {x, y, z} position\n"
- "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]\n"
+ "[\"stop_distance\"]: maximum stop distance from target [default: autopilot guess]\n"
"[\"target_rotation\"]: array of [x, y, z, w] quaternion values [default: no target]\n"
"[\"rotation_threshold\"]: target maximum angle from target facing rotation [default: 0.03 radians]\n"
- "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]"
- "[\"allow_flying\"]: allow flying during autopilot [default: True]",
- //"[\"callback_pump\"]: pump to send success/failure and callback data to [default: none]\n"
- //"[\"callback_data\"]: data to send back during a callback [default: none]",
- &LLAgentListener::startAutoPilot);
+ "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]\n"
+ "[\"allow_flying\"]: allow flying during autopilot [default: True]\n"
+ "event with [\"success\"] flag is sent to 'LLAutopilot' event pump, when auto pilot is terminated",
+ &LLAgentListener::startAutoPilot,
+ llsd::map("target_global", LLSD()));
add("getAutoPilot",
"Send information about current state of the autopilot system to [\"reply\"]:\n"
"[\"enabled\"]: boolean indicating whether or not autopilot is enabled\n"
"[\"target_global\"]: array of target global {x, y, z} position\n"
"[\"leader_id\"]: uuid of target autopilot is following\n"
- "[\"stop_distance\"]: target maximum distance from target\n"
+ "[\"stop_distance\"]: maximum stop distance from target\n"
"[\"target_distance\"]: last known distance from target\n"
"[\"use_rotation\"]: boolean indicating if autopilot has a target facing rotation\n"
"[\"target_facing\"]: array of {x, y} target direction to face\n"
"[\"rotation_threshold\"]: target maximum angle from target facing rotation\n"
"[\"behavior_name\"]: name of the autopilot behavior",
&LLAgentListener::getAutoPilot,
- LLSDMap("reply", LLSD()));
+ llsd::map("reply", LLSD()));
add("startFollowPilot",
"[\"leader_id\"]: uuid of target to follow using the autopilot system (optional with avatar_name)\n"
"[\"avatar_name\"]: avatar name to follow using the autopilot system (optional with leader_id)\n"
"[\"allow_flying\"]: allow flying during autopilot [default: True]\n"
- "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]",
- &LLAgentListener::startFollowPilot);
+ "[\"stop_distance\"]: maximum stop distance from target [default: autopilot guess]",
+ &LLAgentListener::startFollowPilot,
+ llsd::map("reply", LLSD()));
add("setAutoPilotTarget",
"Update target for currently running autopilot:\n"
"[\"target_global\"]: array of target global {x, y, z} position",
@@ -138,6 +138,69 @@ LLAgentListener::LLAgentListener(LLAgent &agent)
"[\"contrib\"]: user's land contribution to this group\n",
&LLAgentListener::getGroups,
LLSDMap("reply", LLSD()));
+ //camera params are similar to LSL, see https://wiki.secondlife.com/wiki/LlSetCameraParams
+ add("setCameraParams",
+ "Set Follow camera params, and then activate it:\n"
+ "[\"camera_pos\"]: vector3, camera position in region coordinates\n"
+ "[\"focus_pos\"]: vector3, what the camera is aimed at (in region coordinates)\n"
+ "[\"focus_offset\"]: vector3, adjusts the camera focus position relative to the target, default is (1, 0, 0)\n"
+ "[\"distance\"]: float (meters), distance the camera wants to be from its target, default is 3\n"
+ "[\"focus_threshold\"]: float (meters), sets the radius of a sphere around the camera's target position within which its focus is not affected by target motion, default is 1\n"
+ "[\"camera_threshold\"]: float (meters), sets the radius of a sphere around the camera's ideal position within which it is not affected by target motion, default is 1\n"
+ "[\"focus_lag\"]: float (seconds), how much the camera lags as it tries to aim towards the target, default is 0.1\n"
+ "[\"camera_lag\"]: float (seconds), how much the camera lags as it tries to move towards its 'ideal' position, default is 0.1\n"
+ "[\"camera_pitch\"]: float (degrees), adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance, default is 0\n"
+ "[\"behindness_angle\"]: float (degrees), sets the angle in degrees within which the camera is not constrained by changes in target rotation, default is 10\n"
+ "[\"behindness_lag\"]: float (seconds), sets how strongly the camera is forced to stay behind the target if outside of behindness angle, default is 0\n"
+ "[\"camera_locked\"]: bool, locks the camera position so it will not move\n"
+ "[\"focus_locked\"]: bool, locks the camera focus so it will not move",
+ &LLAgentListener::setFollowCamParams);
+ add("setFollowCamActive",
+ "Turns on or off scripted control of the camera using boolean [\"active\"]",
+ &LLAgentListener::setFollowCamActive,
+ llsd::map("active", LLSD()));
+ add("removeCameraParams",
+ "Reset Follow camera params",
+ &LLAgentListener::removeFollowCamParams);
+
+ add("playAnimation",
+ "Play [\"item_id\"] animation locally (by default) or [\"inworld\"] (when set to true)",
+ &LLAgentListener::playAnimation,
+ llsd::map("item_id", LLSD(), "reply", LLSD()));
+ add("stopAnimation",
+ "Stop playing [\"item_id\"] animation",
+ &LLAgentListener::stopAnimation,
+ llsd::map("item_id", LLSD(), "reply", LLSD()));
+ add("getAnimationInfo",
+ "Return information about [\"item_id\"] animation",
+ &LLAgentListener::getAnimationInfo,
+ llsd::map("item_id", LLSD(), "reply", LLSD()));
+
+ add("getID",
+ "Return your own avatar ID",
+ &LLAgentListener::getID,
+ llsd::map("reply", LLSD()));
+
+ add("getNearbyAvatarsList",
+ "Return result set key [\"result\"] for nearby avatars in a range of [\"dist\"]\n"
+ "if [\"dist\"] is not specified, 'RenderFarClip' setting is used\n"
+ "reply contains \"result\" table with \"id\", \"name\", \"global_pos\", \"region_pos\", \"region_id\" fields",
+ &LLAgentListener::getNearbyAvatarsList,
+ llsd::map("reply", LLSD()));
+
+ add("getNearbyObjectsList",
+ "Return result set key [\"result\"] for nearby objects in a range of [\"dist\"]\n"
+ "if [\"dist\"] is not specified, 'RenderFarClip' setting is used\n"
+ "reply contains \"result\" table with \"id\", \"global_pos\", \"region_pos\", \"region_id\" fields",
+ &LLAgentListener::getNearbyObjectsList,
+ llsd::map("reply", LLSD()));
+
+ add("getAgentScreenPos",
+ "Return screen position of the [\"avatar_id\"] avatar or own avatar if not specified\n"
+ "reply contains \"x\", \"y\" coordinates and \"onscreen\" flag to indicate if it's actually in within the current window\n"
+ "avatar render position is used as the point",
+ &LLAgentListener::getAgentScreenPos,
+ llsd::map("reply", LLSD()));
}
void LLAgentListener::requestTeleport(LLSD const & event_data) const
@@ -168,7 +231,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const
//mAgent.getAvatarObject()->sitOnObject();
// shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
// *TODO - find a permanent place to share this code properly.
-
+ Response response(LLSD(), event_data);
LLViewerObject *object = NULL;
if (event_data.has("obj_uuid"))
{
@@ -177,7 +240,13 @@ void LLAgentListener::requestSit(LLSD const & event_data) const
else if (event_data.has("position"))
{
LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
- object = findObjectClosestTo(target_position);
+ object = findObjectClosestTo(target_position, true);
+ }
+ else
+ {
+ //just sit on the ground
+ mAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
+ return;
}
if (object && object->getPCode() == LL_PCODE_VOLUME)
@@ -194,8 +263,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const
}
else
{
- LL_WARNS() << "LLAgent requestSit could not find the sit target: "
- << event_data << LL_ENDL;
+ response.error("requestSit could not find the sit target");
}
}
@@ -205,7 +273,7 @@ void LLAgentListener::requestStand(LLSD const & event_data) const
}
-LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & position ) const
+LLViewerObject * LLAgentListener::findObjectClosestTo(const LLVector3 & position, bool sit_target) const
{
LLViewerObject *object = NULL;
@@ -216,8 +284,13 @@ LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & positio
while (cur_index < num_objects)
{
LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
- if (cur_object)
- { // Calculate distance from the target position
+ if (cur_object && !cur_object->isAttachment())
+ {
+ if(sit_target && (cur_object->getPCode() != LL_PCODE_VOLUME))
+ {
+ continue;
+ }
+ // Calculate distance from the target position
LLVector3 target_diff = cur_object->getPositionRegion() - position;
F32 distance_to_target = target_diff.length();
if (distance_to_target < min_distance)
@@ -296,22 +369,6 @@ void LLAgentListener::resetAxes(const LLSD& event_data) const
}
}
-void LLAgentListener::getAxes(const LLSD& event_data) const
-{
- LLQuaternion quat(mAgent.getQuat());
- F32 roll, pitch, yaw;
- quat.getEulerAngles(&roll, &pitch, &yaw);
- // The official query API for LLQuaternion's [x, y, z, w] values is its
- // public member mQ...
- LLSD reply = LLSD::emptyMap();
- reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
- reply["euler"] = LLSD::emptyMap();
- reply["euler"]["roll"] = roll;
- reply["euler"]["pitch"] = pitch;
- reply["euler"]["yaw"] = yaw;
- sendReply(reply, event_data);
-}
-
void LLAgentListener::getPosition(const LLSD& event_data) const
{
F32 roll, pitch, yaw;
@@ -333,14 +390,13 @@ void LLAgentListener::getPosition(const LLSD& event_data) const
void LLAgentListener::startAutoPilot(LLSD const & event_data)
{
- LLQuaternion target_rotation_value;
LLQuaternion* target_rotation = NULL;
if (event_data.has("target_rotation"))
{
- target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]);
+ LLQuaternion target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]);
target_rotation = &target_rotation_value;
}
- // *TODO: Use callback_pump and callback_data
+
F32 rotation_threshold = 0.03f;
if (event_data.has("rotation_threshold"))
{
@@ -360,13 +416,24 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data)
stop_distance = (F32)event_data["stop_distance"].asReal();
}
+ std::string behavior_name = LLCoros::getName();
+ if (event_data.has("behavior_name"))
+ {
+ behavior_name = event_data["behavior_name"].asString();
+ }
+
// Clear follow target, this is doing a path
mFollowTarget.setNull();
+ auto finish_cb = [](bool success, void*)
+ {
+ LLEventPumps::instance().obtain("LLAutopilot").post(llsd::map("success", success));
+ };
+
mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event_data["target_global"]),
- event_data["behavior_name"],
+ behavior_name,
target_rotation,
- NULL, NULL,
+ finish_cb, NULL,
stop_distance,
rotation_threshold,
allow_flying);
@@ -374,7 +441,7 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data)
void LLAgentListener::getAutoPilot(const LLSD& event_data) const
{
- LLSD reply = LLSD::emptyMap();
+ Response reply(LLSD(), event_data);
LLSD::Boolean enabled = mAgent.getAutoPilot();
reply["enabled"] = enabled;
@@ -403,12 +470,11 @@ void LLAgentListener::getAutoPilot(const LLSD& event_data) const
reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold();
reply["behavior_name"] = mAgent.getAutoPilotBehaviorName();
reply["fly"] = (LLSD::Boolean) mAgent.getFlying();
-
- sendReply(reply, event_data);
}
void LLAgentListener::startFollowPilot(LLSD const & event_data)
{
+ Response response(LLSD(), event_data);
LLUUID target_id;
bool allow_flying = true;
@@ -442,6 +508,10 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data)
}
}
}
+ else
+ {
+ return response.error("'leader_id' or 'avatar_name' should be specified");
+ }
F32 stop_distance = 0.f;
if (event_data.has("stop_distance"))
@@ -449,13 +519,16 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data)
stop_distance = (F32)event_data["stop_distance"].asReal();
}
- if (target_id.notNull())
+ if (!gObjectList.findObject(target_id))
{
- mAgent.setFlying(allow_flying);
- mFollowTarget = target_id; // Save follow target so we can report distance later
-
- mAgent.startFollowPilot(target_id, allow_flying, stop_distance);
+ std::string target_info = event_data.has("leader_id") ? event_data["leader_id"] : event_data["avatar_name"];
+ return response.error(stringize("Target ", std::quoted(target_info), " was not found"));
}
+
+ mAgent.setFlying(allow_flying);
+ mFollowTarget = target_id; // Save follow target so we can report distance later
+
+ mAgent.startFollowPilot(target_id, allow_flying, stop_distance);
}
void LLAgentListener::setAutoPilotTarget(LLSD const & event_data) const
@@ -519,3 +592,209 @@ void LLAgentListener::getGroups(const LLSD& event) const
}
sendReply(LLSDMap("groups", reply), event);
}
+
+/*----------------------------- camera control -----------------------------*/
+// specialize LLSDParam to support (const LLVector3&) arguments -- this
+// wouldn't even be necessary except that the relevant LLVector3 constructor
+// is explicitly explicit
+template <>
+class LLSDParam<const LLVector3&>: public LLSDParamBase
+{
+public:
+ LLSDParam(const LLSD& value): value(LLVector3(value)) {}
+
+ operator const LLVector3&() const { return value; }
+
+private:
+ LLVector3 value;
+};
+
+// accept any of a number of similar LLFollowCamMgr methods with different
+// argument types, and return a wrapper lambda that accepts LLSD and converts
+// to the target argument type
+template <typename T>
+auto wrap(void (LLFollowCamMgr::*method)(const LLUUID& source, T arg))
+{
+ return [method](LLFollowCamMgr& followcam, const LLUUID& source, const LLSD& arg)
+ { (followcam.*method)(source, LLSDParam<T>(arg)); };
+}
+
+// table of supported LLFollowCamMgr methods,
+// with the corresponding setFollowCamParams() argument keys
+static std::pair<std::string, std::function<void(LLFollowCamMgr&, const LLUUID&, const LLSD&)>>
+cam_params[] =
+{
+ { "camera_pos", wrap(&LLFollowCamMgr::setPosition) },
+ { "focus_pos", wrap(&LLFollowCamMgr::setFocus) },
+ { "focus_offset", wrap(&LLFollowCamMgr::setFocusOffset) },
+ { "camera_locked", wrap(&LLFollowCamMgr::setPositionLocked) },
+ { "focus_locked", wrap(&LLFollowCamMgr::setFocusLocked) },
+ { "distance", wrap(&LLFollowCamMgr::setDistance) },
+ { "focus_threshold", wrap(&LLFollowCamMgr::setFocusThreshold) },
+ { "camera_threshold", wrap(&LLFollowCamMgr::setPositionThreshold) },
+ { "focus_lag", wrap(&LLFollowCamMgr::setFocusLag) },
+ { "camera_lag", wrap(&LLFollowCamMgr::setPositionLag) },
+ { "camera_pitch", wrap(&LLFollowCamMgr::setPitch) },
+ { "behindness_lag", wrap(&LLFollowCamMgr::setBehindnessLag) },
+ { "behindness_angle", wrap(&LLFollowCamMgr::setBehindnessAngle) },
+};
+
+void LLAgentListener::setFollowCamParams(const LLSD& event) const
+{
+ auto& followcam{ LLFollowCamMgr::instance() };
+ for (const auto& pair : cam_params)
+ {
+ if (event.has(pair.first))
+ {
+ pair.second(followcam, gAgentID, event[pair.first]);
+ }
+ }
+ followcam.setCameraActive(gAgentID, true);
+}
+
+void LLAgentListener::setFollowCamActive(LLSD const & event) const
+{
+ LLFollowCamMgr::getInstance()->setCameraActive(gAgentID, event["active"]);
+}
+
+void LLAgentListener::removeFollowCamParams(LLSD const & event) const
+{
+ LLFollowCamMgr::getInstance()->removeFollowCamParams(gAgentID);
+}
+
+LLViewerInventoryItem* get_anim_item(LLEventAPI::Response &response, const LLSD &event_data)
+{
+ LLViewerInventoryItem* item = gInventory.getItem(event_data["item_id"].asUUID());
+ if (!item || (item->getInventoryType() != LLInventoryType::IT_ANIMATION))
+ {
+ response.error(stringize("Animation item ", std::quoted(event_data["item_id"].asString()), " was not found"));
+ return NULL;
+ }
+ return item;
+}
+
+void LLAgentListener::playAnimation(LLSD const &event_data)
+{
+ Response response(LLSD(), event_data);
+ if (LLViewerInventoryItem* item = get_anim_item(response, event_data))
+ {
+ if (event_data["inworld"].asBoolean())
+ {
+ mAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_START);
+ }
+ else
+ {
+ gAgentAvatarp->startMotion(item->getAssetUUID());
+ }
+ }
+}
+
+void LLAgentListener::stopAnimation(LLSD const &event_data)
+{
+ Response response(LLSD(), event_data);
+ if (LLViewerInventoryItem* item = get_anim_item(response, event_data))
+ {
+ gAgentAvatarp->stopMotion(item->getAssetUUID());
+ mAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP);
+ }
+}
+
+void LLAgentListener::getAnimationInfo(LLSD const &event_data)
+{
+ Response response(LLSD(), event_data);
+ if (LLViewerInventoryItem* item = get_anim_item(response, event_data))
+ {
+ // if motion exists, will return existing one
+ LLMotion* motion = gAgentAvatarp->createMotion(item->getAssetUUID());
+ response["anim_info"] = llsd::map("duration", motion->getDuration(),
+ "is_loop", motion->getLoop(),
+ "num_joints", motion->getNumJointMotions(),
+ "asset_id", item->getAssetUUID(),
+ "priority", motion->getPriority());
+ }
+}
+
+void LLAgentListener::getID(LLSD const& event_data)
+{
+ Response response(llsd::map("id", gAgentID), event_data);
+}
+
+F32 get_search_radius(LLSD const& event_data)
+{
+ static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64);
+ F32 dist = render_far_clip;
+ if (event_data.has("dist"))
+ {
+ dist = llclamp((F32)event_data["dist"].asReal(), 1, 512);
+ }
+ return dist * dist;
+}
+
+void LLAgentListener::getNearbyAvatarsList(LLSD const& event_data)
+{
+ Response response(LLSD(), event_data);
+ F32 radius = get_search_radius(event_data);
+ LLVector3d agent_pos = gAgent.getPositionGlobal();
+ for (LLCharacter* character : LLCharacter::sInstances)
+ {
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (avatar && !avatar->isDead() && !avatar->isControlAvatar() && !avatar->isSelf())
+ {
+ if ((dist_vec_squared(avatar->getPositionGlobal(), agent_pos) <= radius))
+ {
+ LLAvatarName av_name;
+ LLAvatarNameCache::get(avatar->getID(), &av_name);
+ LLVector3 region_pos = avatar->getCharacterPosition();
+ response["result"].append(llsd::map("id", avatar->getID(), "global_pos", ll_sd_from_vector3d(avatar->getPosGlobalFromAgent(region_pos)),
+ "region_pos", ll_sd_from_vector3(region_pos), "name", av_name.getUserName(), "region_id", avatar->getRegion()->getRegionID()));
+ }
+ }
+ }
+}
+
+void LLAgentListener::getNearbyObjectsList(LLSD const& event_data)
+{
+ Response response(LLSD(), event_data);
+ F32 radius = get_search_radius(event_data);
+ S32 num_objects = gObjectList.getNumObjects();
+ LLVector3d agent_pos = gAgent.getPositionGlobal();
+ for (S32 i = 0; i < num_objects; ++i)
+ {
+ LLViewerObject* object = gObjectList.getObject(i);
+ if (object && object->getVolume() && !object->isAttachment())
+ {
+ if ((dist_vec_squared(object->getPositionGlobal(), agent_pos) <= radius))
+ {
+ response["result"].append(llsd::map("id", object->getID(), "global_pos", ll_sd_from_vector3d(object->getPositionGlobal()), "region_pos",
+ ll_sd_from_vector3(object->getPositionRegion()), "region_id", object->getRegion()->getRegionID()));
+ }
+ }
+ }
+}
+
+void LLAgentListener::getAgentScreenPos(LLSD const& event_data)
+{
+ Response response(LLSD(), event_data);
+ LLVector3 render_pos;
+ if (event_data.has("avatar_id") && (event_data["avatar_id"].asUUID() != gAgentID))
+ {
+ LLUUID avatar_id(event_data["avatar_id"]);
+ for (LLCharacter* character : LLCharacter::sInstances)
+ {
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead() && (avatar->getID() == avatar_id))
+ {
+ render_pos = avatar->getRenderPosition();
+ break;
+ }
+ }
+ }
+ else if (gAgentAvatarp.notNull() && gAgentAvatarp->isValid())
+ {
+ render_pos = gAgentAvatarp->getRenderPosition();
+ }
+ LLCoordGL screen_pos;
+ response["onscreen"] = LLViewerCamera::getInstance()->projectPosAgentToScreen(render_pos, screen_pos, false);
+ response["x"] = screen_pos.mX;
+ response["y"] = screen_pos.mY;
+}
diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h
index c544d089ce..b5bea8c0bd 100644
--- a/indra/newview/llagentlistener.h
+++ b/indra/newview/llagentlistener.h
@@ -48,7 +48,6 @@ private:
void requestStand(LLSD const & event_data) const;
void requestTouch(LLSD const & event_data) const;
void resetAxes(const LLSD& event_data) const;
- void getAxes(const LLSD& event_data) const;
void getGroups(const LLSD& event) const;
void getPosition(const LLSD& event_data) const;
void startAutoPilot(const LLSD& event_data);
@@ -58,7 +57,20 @@ private:
void stopAutoPilot(const LLSD& event_data) const;
void lookAt(LLSD const & event_data) const;
- LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const;
+ void setFollowCamParams(LLSD const & event_data) const;
+ void setFollowCamActive(LLSD const & event_data) const;
+ void removeFollowCamParams(LLSD const & event_data) const;
+
+ void playAnimation(LLSD const &event_data);
+ void stopAnimation(LLSD const &event_data);
+ void getAnimationInfo(LLSD const &event_data);
+
+ void getID(LLSD const& event_data);
+ void getNearbyAvatarsList(LLSD const& event_data);
+ void getNearbyObjectsList(LLSD const& event_data);
+ void getAgentScreenPos(LLSD const& event_data);
+
+ LLViewerObject * findObjectClosestTo( const LLVector3 & position, bool sit_target = false ) const;
private:
LLAgent & mAgent;
diff --git a/indra/newview/llagentpilot.cpp b/indra/newview/llagentpilot.cpp
index 0b5198bbd3..8b18b7d5a2 100644
--- a/indra/newview/llagentpilot.cpp
+++ b/indra/newview/llagentpilot.cpp
@@ -322,9 +322,7 @@ void LLAgentPilot::moveCamera()
LLViewerCamera::getInstance()->setView(view);
LLViewerCamera::getInstance()->setOrigin(origin);
- LLViewerCamera::getInstance()->mXAxis = LLVector3(mat.mMatrix[0]);
- LLViewerCamera::getInstance()->mYAxis = LLVector3(mat.mMatrix[1]);
- LLViewerCamera::getInstance()->mZAxis = LLVector3(mat.mMatrix[2]);
+ LLViewerCamera::getInstance()->setAxes(mat);
}
}
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index cd4222dddf..5801ba1eb8 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -538,6 +538,27 @@ LLInventoryItem* LLAgentWearables::getWearableInventoryItem(LLWearableType::ETyp
return item;
}
+const S32 LLAgentWearables::getWearableIdxFromItem(const LLViewerInventoryItem* item) const
+{
+ if (!item) return -1;
+ if (!item->isWearableType()) return -1;
+
+ LLWearableType::EType type = item->getWearableType();
+ U32 wearable_count = getWearableCount(type);
+ if (0 == wearable_count) return -1;
+
+ const LLUUID& asset_id = item->getAssetUUID();
+
+ for (U32 i = 0; i < wearable_count; ++i)
+ {
+ const LLViewerWearable* wearable = getViewerWearable(type, i);
+ if (!wearable) continue;
+ if (wearable->getAssetID() != asset_id) continue;
+ return i;
+ }
+
+ return -1;
+}
const LLViewerWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const
{
const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
@@ -1094,12 +1115,12 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
{
gAgentAvatarp->setCompositeUpdatesEnabled(true);
- // If we have not yet declouded, we may want to use
+ // If we have not yet loaded core parts, we may want to use
// baked texture UUIDs sent from the first objectUpdate message
- // don't overwrite these. If we have already declouded, we've saved
- // these ids as the last known good textures and can invalidate without
- // re-clouding.
- if (!gAgentAvatarp->getIsCloud())
+ // don't overwrite these. If we have parts already, we've saved
+ // these texture ids as the last known good textures and can
+ // invalidate without having to recloud avatar.
+ if (!gAgentAvatarp->getHasMissingParts())
{
gAgentAvatarp->invalidateAll();
}
@@ -1304,7 +1325,7 @@ void LLAgentWearables::findAttachmentsAddRemoveInfo(LLInventoryModel::item_array
LLUUID object_item_id = objectp->getAttachmentItemID();
bool remove_attachment = true;
- if (requested_item_ids.find(object_item_id) != requested_item_ids.end())
+ if (requested_item_ids.find(object_item_id) != requested_item_ids.end() || objectp->isLocked())
{ // Object currently worn, was requested to keep it
// Flag as currently worn so we won't have to add it again.
remove_attachment = false;
@@ -1471,7 +1492,7 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos
LLWearableType::EType type = item->getWearableType();
U32 wearable_count = getWearableCount(type);
- if (0 == wearable_count) return false;
+ if (wearable_count < 2) return false;
const LLUUID& asset_id = item->getAssetUUID();
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 3b8ff93c76..1e118ffa98 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -87,6 +87,7 @@ public:
public:
const LLUUID getWearableItemID(LLWearableType::EType type, U32 index /*= 0*/) const;
const LLUUID getWearableAssetID(LLWearableType::EType type, U32 index /*= 0*/) const;
+ const S32 getWearableIdxFromItem(const LLViewerInventoryItem* item) const;
const LLViewerWearable* getWearableFromItemID(const LLUUID& item_id) const;
LLViewerWearable* getWearableFromItemID(const LLUUID& item_id);
LLViewerWearable* getWearableFromAssetID(const LLUUID& asset_id);
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 11c5ffecb6..5114ac8a08 100644
--- a/indra/newview/llaisapi.cpp
+++ b/indra/newview/llaisapi.cpp
@@ -839,7 +839,7 @@ void AISAPI::onUpdateReceived(const LLSD& update, COMMAND_TYPE type, const LLSD&
if ( (type == UPDATECATEGORY || type == UPDATEITEM)
&& gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))
{
- dump_sequential_xml(gAgentAvatarp->getFullname() + "_ais_update", update);
+ dump_sequential_xml(gAgentAvatarp->getDebugName() + "_ais_update", update);
}
AISUpdate ais_update(update, type, request_body);
diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm
index d4b05dde72..af18dca185 100644
--- a/indra/newview/llappdelegate-objc.mm
+++ b/indra/newview/llappdelegate-objc.mm
@@ -57,42 +57,42 @@
- (void) applicationDidFinishLaunching:(NSNotification *)notification
{
- // Call constructViewer() first so our logging subsystem is in place. This
- // risks missing crashes in the LLAppViewerMacOSX constructor, but for
- // present purposes it's more important to get the startup sequence
- // properly logged.
- // Someday I would like to modify the logging system so that calls before
- // it's initialized are cached in a std::ostringstream and then, once it's
- // initialized, "played back" into whatever handlers have been set up.
- constructViewer();
+ // Call constructViewer() first so our logging subsystem is in place. This
+ // risks missing crashes in the LLAppViewerMacOSX constructor, but for
+ // present purposes it's more important to get the startup sequence
+ // properly logged.
+ // Someday I would like to modify the logging system so that calls before
+ // it's initialized are cached in a std::ostringstream and then, once it's
+ // initialized, "played back" into whatever handlers have been set up.
+ constructViewer();
#if defined(LL_BUGSPLAT)
infos("bugsplat setup");
- // Engage BugsplatStartupManager *before* calling initViewer() to handle
- // any crashes during initialization.
- // https://www.bugsplat.com/docs/platforms/os-x#initialization
- [BugsplatStartupManager sharedManager].autoSubmitCrashReport = YES;
- [BugsplatStartupManager sharedManager].askUserDetails = NO;
- [BugsplatStartupManager sharedManager].delegate = self;
- [[BugsplatStartupManager sharedManager] start];
+ // Engage BugsplatStartupManager *before* calling initViewer() to handle
+ // any crashes during initialization.
+ // https://www.bugsplat.com/docs/platforms/os-x#initialization
+ [BugsplatStartupManager sharedManager].autoSubmitCrashReport = YES;
+ [BugsplatStartupManager sharedManager].askUserDetails = NO;
+ [BugsplatStartupManager sharedManager].delegate = self;
+ [[BugsplatStartupManager sharedManager] start];
#endif
infos("post-bugsplat setup");
- frameTimer = nil;
+ frameTimer = nil;
- [self languageUpdated];
+ [self languageUpdated];
- if (initViewer())
- {
- // Set up recurring calls to oneFrame (repeating timer with timeout 0)
- // until applicationShouldTerminate.
- frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self
- selector:@selector(oneFrame) userInfo:nil repeats:YES];
- } else {
- exit(0);
- }
+ if (initViewer())
+ {
+ // Set up recurring calls to oneFrame (repeating timer with timeout 0)
+ // until applicationShouldTerminate.
+ frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self
+ selector:@selector(oneFrame) userInfo:nil repeats:YES];
+ } else {
+ exit(0);
+ }
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil];
// [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}
@@ -110,74 +110,74 @@
- (void) applicationDidBecomeActive:(NSNotification *)notification
{
- callWindowFocus();
+ callWindowFocus();
}
- (void) applicationDidResignActive:(NSNotification *)notification
{
- callWindowUnfocus();
+ callWindowUnfocus();
}
- (void) applicationDidHide:(NSNotification *)notification
{
- callWindowHide();
+ callWindowHide();
}
- (void) applicationDidUnhide:(NSNotification *)notification
{
- callWindowUnhide();
+ callWindowUnhide();
}
- (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *)sender
{
- // run one frame to assess state
- if (!pumpMainLoop())
- {
- // pumpMainLoop() returns true when done, false if it wants to be
- // called again. Since it returned false, do not yet cancel
- // frameTimer.
- handleQuit();
- [[NSApplication sharedApplication] stopModal];
- return NSTerminateCancel;
- } else {
- // pumpMainLoop() returned true: it's done. Okay, done with frameTimer.
- [frameTimer release];
- cleanupViewer();
- return NSTerminateNow;
- }
+ // run one frame to assess state
+ if (!pumpMainLoop())
+ {
+ // pumpMainLoop() returns true when done, false if it wants to be
+ // called again. Since it returned false, do not yet cancel
+ // frameTimer.
+ handleQuit();
+ [[NSApplication sharedApplication] stopModal];
+ return NSTerminateCancel;
+ } else {
+ // pumpMainLoop() returned true: it's done. Okay, done with frameTimer.
+ [frameTimer release];
+ cleanupViewer();
+ return NSTerminateNow;
+ }
}
- (void) oneFrame
{
- bool appExiting = pumpMainLoop();
- if (appExiting)
- {
- // Once pumpMainLoop() reports that we're done, cancel frameTimer:
- // stop the repetitive calls.
- [frameTimer release];
- [[NSApplication sharedApplication] terminate:self];
- }
+ bool appExiting = pumpMainLoop();
+ if (appExiting)
+ {
+ // Once pumpMainLoop() reports that we're done, cancel frameTimer:
+ // stop the repetitive calls.
+ [frameTimer release];
+ [[NSApplication sharedApplication] terminate:self];
+ }
}
- (void) showInputWindow:(bool)show withEvent:(NSEvent*)textEvent
{
- if (![self romanScript])
- {
- if (show)
- {
- NSLog(@"Showing input window.");
- [inputWindow makeKeyAndOrderFront:inputWindow];
+ if (![self romanScript])
+ {
+ if (show)
+ {
+ NSLog(@"Showing input window.");
+ [inputWindow makeKeyAndOrderFront:inputWindow];
if (textEvent != nil)
{
[[inputView inputContext] discardMarkedText];
[[inputView inputContext] handleEvent:textEvent];
}
- } else {
- NSLog(@"Hiding input window.");
- [inputWindow orderOut:inputWindow];
- [window makeKeyAndOrderFront:window];
- }
- }
+ } else {
+ NSLog(@"Hiding input window.");
+ [inputWindow orderOut:inputWindow];
+ [window makeKeyAndOrderFront:window];
+ }
+ }
}
// This will get called multiple times by NSNotificationCenter.
@@ -187,15 +187,15 @@
- (void) languageUpdated
{
- TISInputSourceRef currentInput = TISCopyCurrentKeyboardInputSource();
- CFArrayRef languages = (CFArrayRef)TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages);
-
+ TISInputSourceRef currentInput = TISCopyCurrentKeyboardInputSource();
+ CFArrayRef languages = (CFArrayRef)TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages);
+
#if 0 // In the event of ever needing to add new language sources, change this to 1 and watch the terminal for "languages:"
- NSLog(@"languages: %@", TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages));
+ NSLog(@"languages: %@", TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages));
#endif
-
- // Typically the language we want is going to be the very first result in the array.
- currentInputLanguage = (NSString*)CFArrayGetValueAtIndex(languages, 0);
+
+ // Typically the language we want is going to be the very first result in the array.
+ currentInputLanguage = (NSString*)CFArrayGetValueAtIndex(languages, 0);
}
- (bool) romanScript
@@ -209,7 +209,7 @@
return false;
}
}
-
+
return true;
}
@@ -313,11 +313,11 @@ struct AttachmentInfo
// We "happen to know" that info[0].basename is "SecondLife.old" -- due to
// the fact that BugsplatMac only notices a crash during the viewer run
- // following the crash.
+ // following the crash.
// The Bugsplat service doesn't respect the MIME type above when returning
// the log data to a browser, so take this opportunity to rename the file
// from <base>.old to <base>_log.txt
- info[0].basename =
+ info[0].basename =
boost::filesystem::path(info[0].pathname).stem().string() + "_log.txt";
infos("attachmentsForBugsplatStartupManager attaching log " + info[0].basename);
@@ -372,8 +372,8 @@ struct AttachmentInfo
- (void)sendEvent:(NSEvent *)event
{
[super sendEvent:event];
- if ([event type] == NSKeyUp && ([event modifierFlags] & NSCommandKeyMask))
- {
+ if ([event type] == NSEventTypeKeyUp && ([event modifierFlags] & NSEventModifierFlagCommand))
+ {
[[self keyWindow] sendEvent:event];
}
}
diff --git a/indra/newview/llappearancelistener.cpp b/indra/newview/llappearancelistener.cpp
new file mode 100644
index 0000000000..dc7bbc3236
--- /dev/null
+++ b/indra/newview/llappearancelistener.cpp
@@ -0,0 +1,158 @@
+/**
+ * @file llappearancelistener.cpp
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llappearancelistener.h"
+
+#include "llappearancemgr.h"
+#include "llinventoryfunctions.h"
+#include "lltransutil.h"
+#include "llwearableitemslist.h"
+#include "stringize.h"
+
+LLAppearanceListener::LLAppearanceListener()
+ : LLEventAPI("LLAppearance",
+ "API to wear a specified outfit and wear/remove individual items")
+{
+ add("wearOutfit",
+ "Wear outfit by folder id: [\"folder_id\"] OR by folder name: [\"folder_name\"]\n"
+ "When [\"append\"] is true, outfit will be added to COF\n"
+ "otherwise it will replace current oufit",
+ &LLAppearanceListener::wearOutfit);
+
+ add("wearItems",
+ "Wear items by id: [items_id]",
+ &LLAppearanceListener::wearItems,
+ llsd::map("items_id", LLSD(), "replace", LLSD()));
+
+ add("detachItems",
+ "Detach items by id: [items_id]",
+ &LLAppearanceListener::detachItems,
+ llsd::map("items_id", LLSD()));
+
+ add("getOutfitsList",
+ "Return the table with Outfits info(id and name)",
+ &LLAppearanceListener::getOutfitsList);
+
+ add("getOutfitItems",
+ "Return the table of items with info(id : name, wearable_type, is_worn) inside specified outfit folder",
+ &LLAppearanceListener::getOutfitItems);
+}
+
+
+void LLAppearanceListener::wearOutfit(LLSD const &data)
+{
+ Response response(LLSD(), data);
+ if (!data.has("folder_id") && !data.has("folder_name"))
+ {
+ return response.error("Either [folder_id] or [folder_name] is required");
+ }
+
+ bool append = data.has("append") ? data["append"].asBoolean() : false;
+ if (!LLAppearanceMgr::instance().wearOutfit(data, append))
+ {
+ response.error("Failed to wear outfit");
+ }
+}
+
+void LLAppearanceListener::wearItems(LLSD const &data)
+{
+ const LLSD& items_id{ data["items_id"] };
+ uuid_vec_t ids;
+ if (!items_id.isArray())
+ {
+ ids.push_back(items_id.asUUID());
+ }
+ else // array
+ {
+ for (const auto& id : llsd::inArray(items_id))
+ {
+ ids.push_back(id);
+ }
+ }
+ LLAppearanceMgr::instance().wearItemsOnAvatar(ids, true, data["replace"].asBoolean());
+}
+
+void LLAppearanceListener::detachItems(LLSD const &data)
+{
+ const LLSD& items_id{ data["items_id"] };
+ uuid_vec_t ids;
+ if (!items_id.isArray())
+ {
+ ids.push_back(items_id.asUUID());
+ }
+ else // array
+ {
+ for (const auto& id : llsd::inArray(items_id))
+ {
+ ids.push_back(id);
+ }
+ }
+ LLAppearanceMgr::instance().removeItemsFromAvatar(ids);
+}
+
+void LLAppearanceListener::getOutfitsList(LLSD const &data)
+{
+ Response response(LLSD(), data);
+ const LLUUID outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+
+ LLIsFolderType is_category(LLFolderType::FT_OUTFIT);
+ gInventory.collectDescendentsIf(outfits_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, is_category);
+
+ response["outfits"] = llsd::toMap(cat_array,
+ [](const LLPointer<LLViewerInventoryCategory> &cat)
+ { return std::make_pair(cat->getUUID().asString(), cat->getName()); });
+}
+
+void LLAppearanceListener::getOutfitItems(LLSD const &data)
+{
+ Response response(LLSD(), data);
+ LLUUID outfit_id(data["outfit_id"].asUUID());
+ LLViewerInventoryCategory *cat = gInventory.getCategory(outfit_id);
+ if (!cat || cat->getPreferredType() != LLFolderType::FT_OUTFIT)
+ {
+ return response.error(stringize("Couldn't find outfit ", outfit_id.asString()));
+ }
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+
+ LLFindOutfitItems collector = LLFindOutfitItems();
+ gInventory.collectDescendentsIf(outfit_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, collector);
+
+ response["items"] = llsd::toMap(item_array,
+ [](const LLPointer<LLViewerInventoryItem> &it)
+ {
+ return std::make_pair(
+ it->getUUID().asString(),
+ llsd::map(
+ "name", it->getName(),
+ "wearable_type", LLWearableType::getInstance()->getTypeName(it->isWearableType() ? it->getWearableType() : LLWearableType::WT_NONE),
+ "is_worn", get_is_item_worn(it)));
+ });
+}
diff --git a/indra/newview/llappearancelistener.h b/indra/newview/llappearancelistener.h
new file mode 100644
index 0000000000..04c5eac2eb
--- /dev/null
+++ b/indra/newview/llappearancelistener.h
@@ -0,0 +1,46 @@
+/**
+ * @file llappearancelistener.h
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLAPPEARANCELISTENER_H
+#define LL_LLAPPEARANCELISTENER_H
+
+#include "lleventapi.h"
+
+class LLAppearanceListener : public LLEventAPI
+{
+public:
+ LLAppearanceListener();
+
+private:
+ void wearOutfit(LLSD const &data);
+ void wearItems(LLSD const &data);
+ void detachItems(LLSD const &data);
+ void getOutfitsList(LLSD const &data);
+ void getOutfitItems(LLSD const &data);
+};
+
+#endif // LL_LLAPPEARANCELISTENER_H
+
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 101aca3823..cb352ac3e5 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -31,6 +31,7 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llagentwearables.h"
+#include "llappearancelistener.h"
#include "llappearancemgr.h"
#include "llattachmentsmgr.h"
#include "llcommandhandler.h"
@@ -66,6 +67,8 @@
#include "llavatarpropertiesprocessor.h"
+LLAppearanceListener sAppearanceListener;
+
namespace
{
const S32 BAKE_RETRY_MAX_COUNT = 5;
@@ -853,7 +856,7 @@ void LLWearableHoldingPattern::checkMissingWearables()
// was requested but none was found, create a default asset as a replacement.
// In all other cases, don't do anything.
// For critical types (shape/hair/skin/eyes), this will keep the avatar as a cloud
- // due to logic in LLVOAvatarSelf::getIsCloud().
+ // due to logic in LLVOAvatarSelf::getHasMissingParts().
// For non-critical types (tatoo, socks, etc.) the wearable will just be missing.
(requested_by_type[type] > 0) &&
((type == LLWearableType::WT_PANTS) || (type == LLWearableType::WT_SHIRT) || (type == LLWearableType::WT_SKIRT)))
@@ -1497,6 +1500,27 @@ void wear_on_avatar_cb(const LLUUID& inv_item, bool do_replace = false)
}
}
+bool needs_to_replace(LLViewerInventoryItem* item_to_wear, bool & first_for_object, std::vector<bool>& first_for_type, bool replace)
+{
+ bool res = false;
+ LLAssetType::EType type = item_to_wear->getType();
+ if (type == LLAssetType::AT_OBJECT)
+ {
+ res = first_for_object && replace;
+ first_for_object = false;
+ }
+ else if (type == LLAssetType::AT_CLOTHING)
+ {
+ LLWearableType::EType wtype = item_to_wear->getWearableType();
+ if (wtype >= 0 && wtype < LLWearableType::WT_COUNT)
+ {
+ res = first_for_type[wtype] && replace;
+ first_for_type[wtype] = false;
+ }
+ }
+ return res;
+}
+
void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,
bool do_update,
bool replace,
@@ -1505,7 +1529,8 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,
LL_DEBUGS("UIUsage") << "wearItemsOnAvatar" << LL_ENDL;
LLUIUsage::instance().logCommand("Avatar.WearItem");
- bool first = true;
+ bool first_for_object = true;
+ std::vector<bool> first_for_type(LLWearableType::WT_COUNT, true);
LLInventoryObject::const_object_list_t items_to_link;
@@ -1513,9 +1538,6 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,
it != item_ids_to_wear.end();
++it)
{
- replace = first && replace;
- first = false;
-
const LLUUID& item_id_to_wear = *it;
if (item_id_to_wear.isNull())
@@ -1534,8 +1556,9 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,
if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID()))
{
LL_DEBUGS("Avatar") << "inventory item in library, will copy and wear "
- << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL;
- LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb,_1,replace));
+ << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL;
+ bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace);
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb, _1, replace_item));
copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(),
item_to_wear->getUUID(), LLUUID::null, std::string(), cb);
continue;
@@ -1573,7 +1596,8 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,
}
LLWearableType::EType type = item_to_wear->getWearableType();
S32 wearable_count = gAgentWearables.getWearableCount(type);
- if ((replace && wearable_count != 0) || !gAgentWearables.canAddWearable(type))
+ bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace);
+ if ((replace_item && wearable_count != 0) || !gAgentWearables.canAddWearable(type))
{
LLUUID item_id = gAgentWearables.getWearableItemID(item_to_wear->getWearableType(),
wearable_count-1);
@@ -1602,7 +1626,13 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,
case LLAssetType::AT_OBJECT:
{
- rez_attachment(item_to_wear, NULL, replace);
+ // Note that this will replace only first attachment regardless of attachment point,
+ // so if user is wearing two items over other two on different attachment points,
+ // only one will be replaced.
+ // Unfortunately we have no way to determine attachment point from inventory item.
+ // We might want to forbid wearing multiple objects with replace option in future.
+ bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace);
+ rez_attachment(item_to_wear, NULL, replace_item);
}
break;
@@ -2042,7 +2072,7 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id)
}
// Moved from LLWearableList::ContextMenu for wider utility.
-bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids) const
+bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids, bool warn_on_type_mismatch) const
{
// TODO: investigate wearables may not be loaded at this point EXT-8231
@@ -2072,7 +2102,10 @@ bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids) const
}
else
{
+ if (warn_on_type_mismatch)
+ {
LL_WARNS() << "Unexpected wearable type" << LL_ENDL;
+ }
return false;
}
}
@@ -2263,7 +2296,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
}
if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))
{
- dump_sequential_xml(gAgentAvatarp->getFullname() + "_slam_request", contents);
+ dump_sequential_xml(gAgentAvatarp->getDebugName() + "_slam_request", contents);
}
slam_inventory_folder(getCOF(), contents, link_waiter);
@@ -3956,7 +3989,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL;
if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))
{
- dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_ok", result);
+ dump_sequential_xml(gAgentAvatarp->getDebugName() + "_appearance_request_ok", result);
}
} while (bRetry);
@@ -3965,7 +3998,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
/*static*/
void LLAppearanceMgr::debugAppearanceUpdateCOF(const LLSD& content)
{
- dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_error", content);
+ dump_sequential_xml(gAgentAvatarp->getDebugName() + "_appearance_request_error", content);
LL_INFOS("Avatar") << "AIS COF, version received: " << content["expected"].asInteger()
<< " ================================= " << LL_ENDL;
@@ -4157,6 +4190,8 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove, nul
for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it)
{
const LLUUID& id_to_remove = *it;
+ auto attachment = gAgentAvatarp->getWornAttachment(id_to_remove);
+ if (attachment && attachment->isLocked()) continue;
const LLUUID& linked_item_id = gInventory.getLinkedItemID(id_to_remove);
LLViewerInventoryItem *item = gInventory.getItem(linked_item_id);
if (item && item->getType() == LLAssetType::AT_OBJECT)
@@ -4212,37 +4247,54 @@ bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_b
if (item->getType() != LLAssetType::AT_CLOTHING) return false;
if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false;
+ S32 pos = gAgentWearables.getWearableIdxFromItem(item);
+ if (pos < 0) return false; // Not found
+
+ U32 count = gAgentWearables.getWearableCount(item->getWearableType());
+ if (count < 2) return false; // Nothing to swap with
+ if (closer_to_body)
+ {
+ if (pos == 0) return false; // already first
+ }
+ else
+ {
+ if (pos == count - 1) return false; // already last
+ }
+
+ U32 old_pos = (U32)pos;
+ U32 swap_with = closer_to_body ? old_pos - 1 : old_pos + 1;
+ LLUUID swap_item_id = gAgentWearables.getWearableItemID(item->getWearableType(), swap_with);
+
+ // Find link item from item id.
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
LLFindWearablesOfType filter_wearables_of_type(item->getWearableType());
gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type);
if (items.empty()) return false;
- // We assume that the items have valid descriptions.
- std::sort(items.begin(), items.end(), WearablesOrderComparator(item->getWearableType()));
-
- if (closer_to_body && items.front() == item) return false;
- if (!closer_to_body && items.back() == item) return false;
-
- LLInventoryModel::item_array_t::iterator it = std::find(items.begin(), items.end(), item);
- if (items.end() == it) return false;
-
-
- //swapping descriptions
- closer_to_body ? --it : ++it;
- LLViewerInventoryItem* swap_item = *it;
- if (!swap_item) return false;
- std::string tmp = swap_item->getActualDescription();
- swap_item->setDescription(item->getActualDescription());
- item->setDescription(tmp);
+ LLViewerInventoryItem* swap_item = nullptr;
+ for (auto iter : items)
+ {
+ if (iter->getLinkedUUID() == swap_item_id)
+ {
+ swap_item = iter.get();
+ break;
+ }
+ }
+ if (!swap_item)
+ {
+ return false;
+ }
- // LL_DEBUGS("Inventory") << "swap, item "
- // << ll_pretty_print_sd(item->asLLSD())
- // << " swap_item "
- // << ll_pretty_print_sd(swap_item->asLLSD()) << LL_ENDL;
+ // Description is supposed to hold sort index, but user could have changed
+ // order rapidly and there might be a state mismatch between description
+ // and gAgentWearables, trust gAgentWearables over description.
+ // Generate new description.
+ std::string new_desc = build_order_string(item->getWearableType(), old_pos);
+ swap_item->setDescription(new_desc);
+ new_desc = build_order_string(item->getWearableType(), swap_with);
+ item->setDescription(new_desc);
- // FIXME switch to use AISv3 where supported.
- //items need to be updated on a dataserver
item->setComplete(true);
item->updateServer(false);
gInventory.updateItem(item);
@@ -4762,6 +4814,11 @@ bool wear_category(const LLSD& query_map, bool append)
return false;
}
+bool LLAppearanceMgr::wearOutfit(const LLSD& query_map, bool append)
+{
+ return wear_category(query_map, append);
+}
+
class LLWearFolderHandler : public LLCommandHandler
{
public:
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 6c45a32856..0a41a91750 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -60,6 +60,7 @@ public:
void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
void wearCategoryFinal(const LLUUID& cat_id, bool copy_items, bool append);
void wearOutfitByName(const std::string& name);
+ bool wearOutfit(const LLSD& query_map, bool append = false);
void changeOutfit(bool proceed, const LLUUID& category, bool append);
void replaceCurrentOutfit(const LLUUID& new_outfit);
void renameOutfit(const LLUUID& outfit_id);
@@ -102,7 +103,7 @@ public:
bool getCanReplaceCOF(const LLUUID& outfit_cat_id);
// Can we add all referenced items to the avatar?
- bool canAddWearables(const uuid_vec_t& item_ids) const;
+ bool canAddWearables(const uuid_vec_t& item_ids, bool warn_on_type_mismatch = true) const;
// Copy all items in a category.
void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 1c0ad25a9e..c34441932d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -131,10 +131,10 @@
#include "stringize.h"
#include "llcoros.h"
#include "llexception.h"
-#if LL_DARWIN || LL_LINUX || __FreeBSD__
+#if !_M_ARM64 // !LL_LINUX
#include "cef/dullahan_version.h"
-#endif
#include "vlc/libvlc_version.h"
+#endif // LL_LINUX
#if LL_DARWIN
#if LL_SDL
@@ -278,6 +278,16 @@ using namespace LL;
#pragma warning (disable:4702)
#endif
+#ifdef LL_DISCORD
+#define DISCORDPP_IMPLEMENTATION
+#include <discordpp.h>
+static std::shared_ptr<discordpp::Client> gDiscordClient;
+static uint64_t gDiscordTimestampsStart;
+static std::string gDiscordActivityDetails;
+static int32_t gDiscordPartyCurrentSize;
+static int32_t gDiscordPartyMaxSize;
+#endif
+
static LLAppViewerListener sAppViewerListener(LLAppViewer::instance);
////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
@@ -295,6 +305,7 @@ extern bool gDebugGL;
#if LL_DARWIN
extern bool gHiDPISupport;
+extern bool gHDRDisplaySupport;
#endif
////////////////////////////////////////////////////////////
@@ -456,13 +467,28 @@ static bool app_metrics_qa_mode = false;
void idle_afk_check()
{
+ // Don't check AFK status during startup states
+ if (LLStartUp::getStartupState() < STATE_STARTED)
+ {
+ return;
+ }
+
// check idle timers
F32 current_idle = gAwayTriggerTimer.getElapsedTimeF32();
static LLCachedControl<S32> afk_timeout(gSavedSettings, "AFKTimeout", 300);
- if (afk_timeout() && (current_idle > (F32)afk_timeout()) && !gAgent.getAFK())
+ if (afk_timeout() && (current_idle > afk_timeout()))
{
- LL_INFOS("IdleAway") << "Idle more than " << afk_timeout << " seconds: automatically changing to Away status" << LL_ENDL;
- gAgent.setAFK();
+ if (!gAgent.getAFK())
+ {
+ LL_INFOS("IdleAway") << "Idle more than " << afk_timeout << " seconds: automatically changing to Away status" << LL_ENDL;
+ gAgent.setAFK();
+ }
+ else
+ {
+ // Refresh timer so that random one click or hover won't clear the status.
+ // But expanding the window still should lift afk status
+ gAwayTimer.reset();
+ }
}
}
@@ -488,7 +514,7 @@ static void deferred_ui_audio_callback(const LLUUID& uuid)
bool create_text_segment_icon_from_url_match(LLUrlMatch* match,LLTextBase* base)
{
- if(!match || !base || base->getPlainText())
+ if (!match || match->getSkipProfileIcon() || !base || base->getPlainText())
return false;
LLUUID match_id = match->getID();
@@ -571,6 +597,7 @@ static void settings_to_globals()
LLWindowMacOSX::sUseMultGL = gSavedSettings.getBOOL("RenderAppleUseMultGL");
#endif // LL_SDL
gHiDPISupport = gSavedSettings.getBOOL("RenderHiDPI");
+ gHDRDisplaySupport = gSavedSettings.getBOOL("MPHDRDisplay");
#endif
}
@@ -582,6 +609,8 @@ static void settings_modify()
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
gDebugGL = gDebugGLSession || gDebugSession;
+ bool noGLDebug = gSavedSettings.getBOOL("MPNoGLDebug");
+ if(noGLDebug) gDebugGL = false;
gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");
}
@@ -987,7 +1016,7 @@ bool LLAppViewer::init()
return false;
}
-#if defined(__i386__) || defined(__x86_64__) || defined(__amd64__)
+#if defined(__i386__) || defined(__x86_64__) || defined(__amd64__) || _M_X64
// Without SSE2 support we will crash almost immediately, warn here.
if (!gSysCPU.hasSSE2())
{
@@ -1259,6 +1288,7 @@ bool LLAppViewer::init()
LLViewerCamera::createInstance();
LL::GLTFSceneManager::createInstance();
+ gSavedSettings.setU32("DebugQualityPerformance", gSavedSettings.getU32("RenderQualityPerformance"));
#if LL_WINDOWS
if (!mSecondInstance)
@@ -1285,11 +1315,15 @@ void LLAppViewer::initMaxHeapSize()
//------------------------------------------------------------------------------------------
//currently SL is built under 32-bit setting, we set its max heap size no more than 1.6 GB.
- #ifndef LL_X86_64
+/*
+#ifndef LL_X86_64
F32Gigabytes max_heap_size_gb = (F32Gigabytes)gSavedSettings.getF32("MaxHeapSize") ;
#else
+*/
F32Gigabytes max_heap_size_gb = (F32Gigabytes)gSavedSettings.getF32("MaxHeapSize64");
+/*
#endif
+*/
LLMemory::initMaxHeapSizeGB(max_heap_size_gb);
}
@@ -1341,14 +1375,21 @@ bool LLAppViewer::frame()
bool LLAppViewer::doFrame()
{
U32 fpsLimitMaxFps = (U32)gSavedSettings.getU32("MaxFPS");
- if(fpsLimitMaxFps>120) fpsLimitMaxFps=0;
+ if(fpsLimitMaxFps > 120) fpsLimitMaxFps = 0;
using TimePoint = std::chrono::steady_clock::time_point;
+ U64 additionalSleepTime = 0;
+ TimePoint frameStartTime = std::chrono::steady_clock::now();
- U64 fpsLimitSleepFor = 0;
- TimePoint fpsLimitFrameStartTime = std::chrono::steady_clock::now();
+#ifdef LL_DISCORD
+ {
+ LL_PROFILE_ZONE_NAMED("discord_callbacks");
+ discordpp::RunCallbacks();
+ }
+#endif
LL_RECORD_BLOCK_TIME(FTM_FRAME);
+ LL_PROFILE_GPU_ZONE("Frame");
{
// and now adjust the visuals from previous frame.
if(LLPerfStats::tunables.userAutoTuneEnabled && LLPerfStats::tunables.tuningFlag != LLPerfStats::Tunables::Nothing)
@@ -1438,24 +1479,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.
@@ -1518,18 +1561,6 @@ bool LLAppViewer::doFrame()
}
}
- if(fpsLimitMaxFps > 0)
- {
- auto elapsed = std::chrono::steady_clock::now() - fpsLimitFrameStartTime;
-
- long long fpsLimitFrameTime = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
- U64 desired_time_us = (U32)(1000000.f / fpsLimitMaxFps);
- if((fpsLimitFrameTime+1000) < desired_time_us)
- {
- fpsLimitSleepFor = (desired_time_us - fpsLimitFrameTime - 1000) * 1.0;
- }
- }
-
{
LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df pauseMainloopTimeout");
pingMainloopTimeout("Main:Sleep");
@@ -1542,9 +1573,25 @@ bool LLAppViewer::doFrame()
//LL_RECORD_BLOCK_TIME(SLEEP2);
LL_PROFILE_ZONE_WARN("Sleep2");
- if(fpsLimitSleepFor)
+ auto elapsed = std::chrono::steady_clock::now() - frameStartTime;
+ long long frameTime = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
+
+ if(fpsLimitMaxFps > 0)
+ {
+ U64 desired_time_us = (U32)(1000000.f / fpsLimitMaxFps);
+ if((frameTime+1000) < desired_time_us)
+ {
+ additionalSleepTime = 0.92 * (F64)(desired_time_us - frameTime);
+ if(additionalSleepTime < 200)
+ {
+ additionalSleepTime = 0;
+ }
+ }
+ }
+
+ if(additionalSleepTime > 0)
{
- usleep(fpsLimitSleepFor);
+ std::this_thread::sleep_for(std::chrono::microseconds(additionalSleepTime));
}
// yield some time to the os based on command line option
@@ -1640,6 +1687,9 @@ bool LLAppViewer::doFrame()
LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df resumeMainloopTimeout");
resumeMainloopTimeout();
}
+
+ //swap();
+
pingMainloopTimeout("Main:End");
}
}
@@ -1884,36 +1934,6 @@ bool LLAppViewer::cleanup()
// Clean up before GL is shut down because we might be holding on to objects with texture references
LLSelectMgr::cleanupGlobals();
- LL_INFOS() << "Shutting down OpenGL" << LL_ENDL;
-
- // Shut down OpenGL
- if( gViewerWindow)
- {
- gViewerWindow->shutdownGL();
-
- // Destroy window, and make sure we're not fullscreen
- // This may generate window reshape and activation events.
- // Therefore must do this before destroying the message system.
- delete gViewerWindow;
- gViewerWindow = NULL;
- LL_INFOS() << "ViewerWindow deleted" << LL_ENDL;
- }
-
- LLSplashScreen::show();
- LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
-
- LL_INFOS() << "Cleaning up Keyboard & Joystick" << LL_ENDL;
-
- // viewer UI relies on keyboard so keep it aound until viewer UI isa gone
- delete gKeyboard;
- gKeyboard = NULL;
-
- if (LLViewerJoystick::instanceExists())
- {
- // Turn off Space Navigator and similar devices
- LLViewerJoystick::getInstance()->terminate();
- }
-
LL_INFOS() << "Cleaning up Objects" << LL_ENDL;
LLViewerObject::cleanupVOClasses();
@@ -2074,6 +2094,36 @@ bool LLAppViewer::cleanup()
sTextureFetch->shutDownTextureCacheThread() ;
LLLFSThread::sLocal->shutdown();
+ LL_INFOS() << "Shutting down OpenGL" << LL_ENDL;
+
+ // Shut down OpenGL
+ if (gViewerWindow)
+ {
+ gViewerWindow->shutdownGL();
+
+ // Destroy window, and make sure we're not fullscreen
+ // This may generate window reshape and activation events.
+ // Therefore must do this before destroying the message system.
+ delete gViewerWindow;
+ gViewerWindow = NULL;
+ LL_INFOS() << "ViewerWindow deleted" << LL_ENDL;
+ }
+
+ LLSplashScreen::show();
+ LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
+
+ LL_INFOS() << "Cleaning up Keyboard & Joystick" << LL_ENDL;
+
+ // viewer UI relies on keyboard so keep it aound until viewer UI isa gone
+ delete gKeyboard;
+ gKeyboard = NULL;
+
+ if (LLViewerJoystick::instanceExists())
+ {
+ // Turn off Space Navigator and similar devices
+ LLViewerJoystick::getInstance()->terminate();
+ }
+
LL_INFOS() << "Shutting down message system" << LL_ENDL;
end_messaging_system();
@@ -2294,10 +2344,7 @@ void errorCallback(LLError::ELevel level, const std::string &error_string)
// Callback for LLError::LLUserWarningMsg
void errorHandler(const std::string& title_string, const std::string& message_string, S32 code)
{
- if (!message_string.empty())
- {
- OSMessageBox(message_string, title_string.empty() ? LLTrans::getString("MBFatalError") : title_string, OSMB_OK);
- }
+ // message is going to hang viewer, create marker first
switch (code)
{
case LLError::LLUserWarningMsg::ERROR_OTHER:
@@ -2305,6 +2352,10 @@ void errorHandler(const std::string& title_string, const std::string& message_st
break;
case LLError::LLUserWarningMsg::ERROR_BAD_ALLOC:
LLAppViewer::instance()->createErrorMarker(LAST_EXEC_BAD_ALLOC);
+ // When system run out of memory and errorHandler gets called from a thread,
+ // main thread might keep going while OSMessageBox freezes the caller.
+ // Todo: handle it better, but for now disconnect to avoid making things worse
+ gDisconnected = true;
break;
case LLError::LLUserWarningMsg::ERROR_MISSING_FILES:
LLAppViewer::instance()->createErrorMarker(LAST_EXEC_MISSING_FILES);
@@ -2312,6 +2363,10 @@ void errorHandler(const std::string& title_string, const std::string& message_st
default:
break;
}
+ if (!message_string.empty())
+ {
+ OSMessageBox(message_string, title_string.empty() ? LLTrans::getString("MBFatalError") : title_string, OSMB_OK);
+ }
}
void LLAppViewer::initLoggingAndGetLastDuration()
@@ -2404,7 +2459,6 @@ void LLAppViewer::initLoggingAndGetLastDuration()
if (gDirUtilp->fileExists(user_data_path_cef_log))
{
std::string user_data_path_cef_old = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "cef.old");
- LLFile::remove(user_data_path_cef_old, ENOENT);
LLFile::rename(user_data_path_cef_log, user_data_path_cef_old);
}
}
@@ -3137,7 +3191,15 @@ bool LLAppViewer::initWindow()
.height(gSavedSettings.getU32("WindowHeight"))
.min_width(gSavedSettings.getU32("MinWindowWidth"))
.min_height(gSavedSettings.getU32("MinWindowHeight"))
+#ifdef LL_DARWIN
+ // Setting it to true causes black screen with no UI displayed.
+ // Given that it's a DEBUG settings and application goes fullscreen
+ // on mac simply by expanding it, it was decided to not support/use
+ // this setting on mac.
+ .fullscreen(false)
+#else // LL_DARWIN
.fullscreen(gSavedSettings.getBOOL("FullScreen"))
+#endif
.ignore_pixel_depth(ignorePixelDepth)
.first_run(mIsFirstRun);
@@ -3171,17 +3233,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();
@@ -3296,6 +3347,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")
{
@@ -3388,7 +3444,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);
@@ -3423,7 +3479,7 @@ LLSD LLAppViewer::getViewerInfo() const
info["VOICE_VERSION"] = LLTrans::getString("NotConnected");
}
-#if LL_DARWIN || LL_LINUX || __FreeBSD__
+#if !_M_ARM64 // !LL_LINUX
std::ostringstream cef_ver_codec;
cef_ver_codec << "Dullahan: ";
cef_ver_codec << DULLAHAN_VERSION_MAJOR;
@@ -3453,7 +3509,7 @@ LLSD LLAppViewer::getViewerInfo() const
info["LIBCEF_VERSION"] = "Undefined";
#endif
-//#if !LL_LINUX
+#if !_M_ARM64 // !LL_LINUX
std::ostringstream vlc_ver_codec;
vlc_ver_codec << LIBVLC_VERSION_MAJOR;
vlc_ver_codec << ".";
@@ -3461,11 +3517,9 @@ LLSD LLAppViewer::getViewerInfo() const
vlc_ver_codec << ".";
vlc_ver_codec << LIBVLC_VERSION_REVISION;
info["LIBVLC_VERSION"] = vlc_ver_codec.str();
-/*
#else
info["LIBVLC_VERSION"] = "Undefined";
#endif
-*/
S32 packets_in = (S32)LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN);
if (packets_in > 0)
@@ -3952,8 +4006,15 @@ void LLAppViewer::processMarkerFiles()
else if (marker_is_same_version)
{
// the file existed, is ours, and matched our version, so we can report on what it says
- LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed" << LL_ENDL;
+ LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed or froze" << LL_ENDL;
+#if LL_WINDOWS && LL_BUGSPLAT
+ // bugsplat will set correct state in bugsplatSendLog
+ // Might be more accurate to rename this one into 'unknown'
+ gLastExecEvent = LAST_EXEC_FROZE;
+#else
gLastExecEvent = LAST_EXEC_OTHER_CRASH;
+#endif // LL_WINDOWS
+
}
else
{
@@ -4202,7 +4263,7 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions)
// case where we need the viewer to exit without any need for notifications
void LLAppViewer::earlyExitNoNotify()
{
- LL_WARNS() << "app_early_exit with no notification: " << LL_ENDL;
+ LL_WARNS() << "app_early_exit with no notification." << LL_ENDL;
gDoDisconnect = true;
finish_early_exit( LLSD(), LLSD() );
}
@@ -4300,7 +4361,7 @@ U32 LLAppViewer::getTextureCacheVersion()
U32 LLAppViewer::getDiskCacheVersion()
{
// Viewer disk cache version intorduced in Simple Cache Viewer, change if the cache format changes.
- const U32 DISK_CACHE_VERSION = 2;
+ const U32 DISK_CACHE_VERSION = 3;
return DISK_CACHE_VERSION ;
}
@@ -4326,8 +4387,8 @@ bool LLAppViewer::initCache()
const std::string cache_dir_name = gSavedSettings.getString("DiskCacheDirName");
const U32 MB = 1024 * 1024;
- const uintmax_t MIN_CACHE_SIZE = 256 * MB;
- const uintmax_t MAX_CACHE_SIZE = 9984ll * MB;
+ const uintmax_t MIN_CACHE_SIZE = 896 * MB;
+ const uintmax_t MAX_CACHE_SIZE = 32768ll * MB;
const uintmax_t setting_cache_total_size = uintmax_t(gSavedSettings.getU32("CacheSize")) * MB;
const uintmax_t cache_total_size = llclamp(setting_cache_total_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
const F64 disk_cache_percent = gSavedSettings.getF32("DiskCachePercentOfTotal");
@@ -4433,6 +4494,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;
}
@@ -4457,18 +4521,28 @@ void LLAppViewer::loadKeyBindings()
LLUrlRegistry::instance().setKeybindingHandler(&gViewerInput);
}
+// As per GHI #4498, remove old, stale CEF cache folders from previous sessions
+void LLAppViewer::purgeCefStaleCaches()
+{
+ // TODO: we really shouldn't use a hard coded name for the cache folder here...
+ const std::string browser_parent_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache");
+ if (LLFile::isdir(browser_parent_cache))
+ {
+ // This is a sledgehammer approach - nukes the cef_cache dir entirely
+ // which is then recreated the first time a CEF instance creates an
+ // individual cache folder. If we ever decide to retain some folders
+ // e.g. Search UI cache - then we will need a more granular approach.
+ gDirUtilp->deleteDirAndContents(browser_parent_cache);
+ }
+}
+
void LLAppViewer::purgeCache()
{
LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL;
LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);
LLVOCache::getInstance()->removeCache(LL_PATH_CACHE);
LLViewerShaderMgr::instance()->clearShaderCache();
- std::string browser_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache");
- if (LLFile::isdir(browser_cache))
- {
- // cef does not support clear_cache and clear_cookies, so clear what we can manually.
- gDirUtilp->deleteDirAndContents(browser_cache);
- }
+ purgeCefStaleCaches();
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), "*");
}
@@ -4537,6 +4611,7 @@ void LLAppViewer::forceDisconnect(const std::string& mesg)
}
else
{
+ sendSimpleLogoutRequest();
args["MESSAGE"] = big_reason;
LLNotificationsUtil::add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );
}
@@ -4592,6 +4667,7 @@ void LLAppViewer::saveFinalSnapshot()
false,
gSavedSettings.getBOOL("RenderHUDInSnapshot"),
true,
+ false,
LLSnapshotModel::SNAPSHOT_TYPE_COLOR,
LLSnapshotModel::SNAPSHOT_FORMAT_PNG);
mSavedFinalSnapshot = true;
@@ -5306,6 +5382,8 @@ void LLAppViewer::sendLogoutRequest()
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
gAgent.sendReliableMessage();
+ LL_INFOS("Agent") << "Logging out as agent: " << gAgent.getID() << " Session: " << gAgent.getSessionID() << LL_ENDL;
+
gLogoutTimer.reset();
gLogoutMaxTime = LOGOUT_REQUEST_TIME;
mLogoutRequestSent = true;
@@ -5314,6 +5392,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())
@@ -5378,6 +5477,12 @@ void LLAppViewer::createErrorMarker(eLastExecEvent error_code) const
}
}
+bool LLAppViewer::errorMarkerExists() const
+{
+ std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME);
+ return LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB);
+}
+
void LLAppViewer::outOfMemorySoftQuit()
{
if (!mQuitRequested)
@@ -5509,7 +5614,10 @@ void LLAppViewer::idleNetwork()
add(LLStatViewer::NUM_NEW_OBJECTS, gObjectList.mNumNewObjects);
// Retransmit unacknowledged packets.
- gXferManager->retransmitUnackedPackets();
+ if (gXferManager)
+ {
+ gXferManager->retransmitUnackedPackets();
+ }
gAssetStorage->checkForTimeouts();
gViewerThrottle.setBufferLoadRate(gMessageSystem->getBufferLoadRate());
gViewerThrottle.updateDynamicThrottle();
@@ -5630,6 +5738,8 @@ void LLAppViewer::forceErrorBreakpoint()
DebugBreak();
#elif __i386__ || __x86_64__
asm ("int $3");
+#else
+ __builtin_trap();
#endif
return;
}
@@ -5728,9 +5838,31 @@ void LLAppViewer::forceErrorThreadCrash()
thread->start();
}
-void LLAppViewer::initMainloopTimeout(const std::string& state, F32 secs)
+void LLAppViewer::forceExceptionThreadCrash()
+{
+ class LLCrashTestThread : public LLThread
+ {
+ public:
+
+ LLCrashTestThread() : LLThread("Crash logging test thread")
+ {
+ }
+
+ void run()
+ {
+ const std::string exception_text = "This is a deliberate exception in a thread";
+ throw std::runtime_error(exception_text);
+ }
+ };
+
+ LL_WARNS() << "This is a deliberate exception in a thread" << LL_ENDL;
+ LLCrashTestThread* thread = new LLCrashTestThread();
+ thread->start();
+}
+
+void LLAppViewer::initMainloopTimeout(std::string_view state, F32 secs)
{
- if(!mMainloopTimeout)
+ if (!mMainloopTimeout)
{
mMainloopTimeout = new LLWatchdogTimeout();
resumeMainloopTimeout(state, secs);
@@ -5739,20 +5871,20 @@ void LLAppViewer::initMainloopTimeout(const std::string& state, F32 secs)
void LLAppViewer::destroyMainloopTimeout()
{
- if(mMainloopTimeout)
+ if (mMainloopTimeout)
{
delete mMainloopTimeout;
- mMainloopTimeout = NULL;
+ mMainloopTimeout = nullptr;
}
}
-void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs)
+void LLAppViewer::resumeMainloopTimeout(std::string_view state, F32 secs)
{
- if(mMainloopTimeout)
+ if (mMainloopTimeout)
{
- if(secs < 0.0f)
+ if (secs < 0.0f)
{
- static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60);
+ static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60.f);
secs = mainloop_timeout;
}
@@ -5763,19 +5895,19 @@ void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs)
void LLAppViewer::pauseMainloopTimeout()
{
- if(mMainloopTimeout)
+ if (mMainloopTimeout)
{
mMainloopTimeout->stop();
}
}
-void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
+void LLAppViewer::pingMainloopTimeout(std::string_view state, F32 secs)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_APP;
- if(mMainloopTimeout)
+ if (mMainloopTimeout)
{
- if(secs < 0.0f)
+ if (secs < 0.0f)
{
static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60);
secs = mainloop_timeout;
@@ -5902,3 +6034,104 @@ void LLAppViewer::metricsSend(bool enable_reporting)
// resolution in time.
gViewerAssetStats->restart();
}
+
+#ifdef LL_DISCORD
+
+void LLAppViewer::initDiscordSocial()
+{
+ gDiscordPartyCurrentSize = 1;
+ gDiscordPartyMaxSize = 0;
+ gDiscordTimestampsStart = time(nullptr);
+ gDiscordClient = std::make_shared<discordpp::Client>();
+ gDiscordClient->SetApplicationId(1393451183741599796);
+ updateDiscordActivity();
+}
+
+void LLAppViewer::updateDiscordActivity()
+{
+ LL_PROFILE_ZONE_SCOPED;
+
+ static LLCachedControl<bool> integration_enabled(gSavedSettings, "EnableDiscord", true);
+ if (!integration_enabled)
+ {
+ gDiscordClient->ClearRichPresence();
+ return;
+ }
+
+ discordpp::Activity activity;
+ activity.SetType(discordpp::ActivityTypes::Playing);
+ discordpp::ActivityTimestamps timestamps;
+ timestamps.SetStart(gDiscordTimestampsStart);
+ activity.SetTimestamps(timestamps);
+
+ if (gAgent.getID() == LLUUID::null)
+ {
+ gDiscordClient->UpdateRichPresence(activity, [](discordpp::ClientResult) {});
+ return;
+ }
+
+ static LLCachedControl<bool> show_details(gSavedSettings, "ShowDiscordActivityDetails", false);
+ if (show_details)
+ {
+ if (gDiscordActivityDetails.empty())
+ {
+ LLAvatarName av_name;
+ LLAvatarNameCache::get(gAgent.getID(), &av_name);
+ gDiscordActivityDetails = av_name.getUserName();
+ auto displayName = av_name.getDisplayName();
+ if (gDiscordActivityDetails != displayName)
+ gDiscordActivityDetails = displayName + " (" + gDiscordActivityDetails + ")";
+ }
+ activity.SetDetails(gDiscordActivityDetails);
+ }
+
+ auto agent_pos_region = gAgent.getPositionAgent();
+ S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f);
+ S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f);
+ S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f);
+ F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
+ const F32 FLY_CUTOFF = 6.f;
+ const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
+ const F32 WALK_CUTOFF = 1.5f;
+ const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
+ if (velocity_mag_sq > FLY_CUTOFF_SQ)
+ {
+ pos_x -= pos_x % 4;
+ pos_y -= pos_y % 4;
+ }
+ else if (velocity_mag_sq > WALK_CUTOFF_SQ)
+ {
+ pos_x -= pos_x % 2;
+ pos_y -= pos_y % 2;
+ }
+
+ std::string location = "Hidden Region";
+ static LLCachedControl<bool> show_state(gSavedSettings, "ShowDiscordActivityState", false);
+ if (show_state)
+ {
+ location = llformat("%s (%d, %d, %d)", gAgent.getRegion()->getName().c_str(), pos_x, pos_y, pos_z);
+ }
+ activity.SetState(location);
+
+ discordpp::ActivityParty party;
+ party.SetId(location);
+ party.SetCurrentSize(gDiscordPartyCurrentSize);
+ party.SetMaxSize(gDiscordPartyMaxSize);
+ activity.SetParty(party);
+
+ gDiscordClient->UpdateRichPresence(activity, [](discordpp::ClientResult) {});
+}
+
+void LLAppViewer::updateDiscordPartyCurrentSize(int32_t size)
+{
+ gDiscordPartyCurrentSize = size;
+ updateDiscordActivity();
+}
+
+void LLAppViewer::updateDiscordPartyMaxSize(int32_t size)
+{
+ gDiscordPartyMaxSize = size;
+ updateDiscordActivity();
+}
+
+#endif
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 3da0246ccf..4f2583cb16 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -149,6 +149,12 @@ public:
std::string getWindowTitle() const; // The window display name.
void forceDisconnect(const std::string& msg); // Force disconnection, with a message to the user.
+
+ // sendSimpleLogoutRequest does not create a marker file.
+ // Meant for lost network case, and for forced shutdowns,
+ // to at least attempt to remove the ghost from the world.
+ void sendSimpleLogoutRequest();
+
void badNetworkHandler(); // Cause a crash state due to bad network packet.
bool hasSavedFinalSnapshot() { return mSavedFinalSnapshot; }
@@ -175,6 +181,7 @@ public:
virtual void forceErrorCoroprocedureCrash();
virtual void forceErrorWorkQueueCrash();
virtual void forceErrorThreadCrash();
+ virtual void forceExceptionThreadCrash();
// The list is found in app_settings/settings_files.xml
// but since they are used explicitly in code,
@@ -197,11 +204,11 @@ public:
// For thread debugging.
// llstartup needs to control init.
// llworld, send_agent_pause() also controls pause/resume.
- void initMainloopTimeout(const std::string& state, F32 secs = -1.0f);
+ void initMainloopTimeout(std::string_view state, F32 secs = -1.0f);
void destroyMainloopTimeout();
void pauseMainloopTimeout();
- void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f);
- void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f);
+ void resumeMainloopTimeout(std::string_view state = "", F32 secs = -1.0f);
+ void pingMainloopTimeout(std::string_view state, F32 secs = -1.0f);
// Handle the 'login completed' event.
// *NOTE:Mani Fix this for login abstraction!!
@@ -219,6 +226,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);
@@ -243,6 +251,7 @@ public:
// Writes an error code into the error_marker file for use on next startup.
void createErrorMarker(eLastExecEvent error_code) const;
+ bool errorMarkerExists() const;
// Attempt a 'soft' quit with disconnect and saving of settings/cache.
// Intended to be thread safe.
@@ -250,6 +259,13 @@ public:
// Note: mQuitRequested can be aborted by user.
void outOfMemorySoftQuit();
+#ifdef LL_DISCORD
+ static void initDiscordSocial();
+ static void updateDiscordActivity();
+ static void updateDiscordPartyCurrentSize(int32_t size);
+ static void updateDiscordPartyMaxSize(int32_t size);
+#endif
+
protected:
virtual bool initWindow(); // Initialize the viewer's window.
virtual void initLoggingAndGetLastDuration(); // Initialize log files, logging system
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index c1e8f38c51..5bbaed750c 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -118,6 +118,11 @@ static void exceptionTerminateHandler()
int main( int argc, char **argv )
{
+ // Call Tracy first thing to have it allocate memory
+ // https://github.com/wolfpld/tracy/issues/196
+ LL_PROFILER_FRAME_END;
+ LL_PROFILER_SET_THREAD_NAME("App");
+
gArgC = argc;
gArgV = argv;
@@ -126,7 +131,16 @@ int main( int argc, char **argv )
// install unexpected exception handler
gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);
- unsetenv( "LD_PRELOAD" ); // <FS:ND/> Get rid of any preloading, we do not want this to happen during startup of plugins.
+#ifdef __aarch64__
+ setenv("LD_PRELOAD", APP_PLUGIN_DIR"/libcef.so", 1);
+#else
+# if LL_LINUX
+ setenv("LD_PRELOAD", "libpthread.so.0 libGL.so.1", 1);
+# else
+ setenv("LD_PRELOAD", "libpthread.so libGL.so.1", 1);
+# endif
+ setenv("__GL_THREADED_OPTIMIZATIONS", "1", 0);
+#endif
bool ok = viewer_app_ptr->init();
if(!ok)
diff --git a/indra/newview/llappviewermacosx-objc.h b/indra/newview/llappviewermacosx-objc.h
index d0ae0a7fc2..3fbf4202f1 100644
--- a/indra/newview/llappviewermacosx-objc.h
+++ b/indra/newview/llappviewermacosx-objc.h
@@ -30,9 +30,6 @@
#include <string>
#include <vector>
-//Why? Because BOOL
-void launchApplication(const std::string* app_name, const std::vector<std::string>* args);
-
void force_ns_sxeption();
#endif // LL_LLAPPVIEWERMACOSX_OBJC_H
diff --git a/indra/newview/llappviewermacosx-objc.mm b/indra/newview/llappviewermacosx-objc.mm
index 9b6bfe621b..96a6bc6edc 100644
--- a/indra/newview/llappviewermacosx-objc.mm
+++ b/indra/newview/llappviewermacosx-objc.mm
@@ -5,27 +5,27 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
- */
+ */
#if !defined LL_DARWIN
- #error "Use only with macOS"
+ #error "Use only with macOS"
#endif
#import <Cocoa/Cocoa.h>
@@ -33,45 +33,6 @@
#include "llappviewermacosx-objc.h"
-void launchApplication(const std::string* app_name, const std::vector<std::string>* args)
-{
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- if (app_name->empty()) return;
-
- NSMutableString* app_name_ns = [NSMutableString stringWithString:[[NSBundle mainBundle] resourcePath]]; //Path to resource dir
- [app_name_ns appendFormat:@"/%@", [NSString stringWithCString:app_name->c_str()
- encoding:[NSString defaultCStringEncoding]]];
-
- NSMutableArray *args_ns = nil;
- args_ns = [[NSMutableArray alloc] init];
-
- for (int i=0; i < args->size(); ++i)
- {
- NSLog(@"Adding string %s", (*args)[i].c_str());
- [args_ns addObject:
- [NSString stringWithCString:(*args)[i].c_str()
- encoding:[NSString defaultCStringEncoding]]];
- }
-
- NSTask *task = [[NSTask alloc] init];
- NSBundle *bundle = [NSBundle bundleWithPath:[[NSWorkspace sharedWorkspace] fullPathForApplication:app_name_ns]];
- [task setLaunchPath:[bundle executablePath]];
- [task setArguments:args_ns];
- [task launch];
-
-// NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
-// NSURL *url = [NSURL fileURLWithPath:[workspace fullPathForApplication:app_name_ns]];
-//
-// NSError *error = nil;
-// [workspace launchApplicationAtURL:url options:0 configuration:[NSDictionary dictionaryWithObject:args_ns forKey:NSWorkspaceLaunchConfigurationArguments] error:&error];
- //TODO Handle error
-
- [pool release];
- return;
-}
-
void force_ns_sxeption()
{
NSException *exception = [NSException exceptionWithName:@"Forced NSException" reason:nullptr userInfo:nullptr];
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 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 169fea320a..bd1a08798b 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -31,7 +31,9 @@
#endif
#include "llwin32headers.h"
+#if !LL_SDL
#include "llwindowwin32.h" // *FIX: for setting gIconResource.
+#endif
#include "llappviewerwin32.h"
@@ -47,8 +49,10 @@
#include "llviewercontrol.h"
#include "lldxhardware.h"
+#if !_M_ARM64
#include "nvapi/nvapi.h"
#include "nvapi/NvApiDriverSettings.h"
+#endif
#include <stdlib.h>
@@ -172,6 +176,22 @@ namespace
<< '/' << loc.mV[1]
<< '/' << loc.mV[2])));
}
+
+ LLAppViewer* app = LLAppViewer::instance();
+ if (!app->isSecondInstance() && !app->errorMarkerExists())
+ {
+ // If marker doesn't exist, create a marker with 'other' code for next launch
+ // otherwise don't override existing file
+ // Any unmarked crashes will be considered as freezes
+ if (app->logoutRequestSent())
+ {
+ app->createErrorMarker(LAST_EXEC_LOGOUT_CRASH);
+ }
+ else
+ {
+ app->createErrorMarker(LAST_EXEC_OTHER_CRASH);
+ }
+ }
} // MDSCB_EXCEPTIONCODE
return false;
@@ -206,6 +226,7 @@ LONG WINAPI catchallCrashHandler(EXCEPTION_POINTERS * /*ExceptionInfo*/)
const std::string LLAppViewerWin32::sWindowClass = "Second Life";
+#if !_M_ARM64
/*
This function is used to print to the command line a text message
describing the nvapi error and quits
@@ -219,6 +240,7 @@ void nvapi_error(NvAPI_Status status)
//should always trigger when asserts are enabled
//llassert(status == NVAPI_OK);
}
+#endif
// Create app mutex creates a unique global windows object.
// If the object can be created it returns true, otherwise
@@ -241,6 +263,7 @@ bool create_app_mutex()
return result;
}
+#if !_M_ARM64
void ll_nvapi_init(NvDRSSessionHandle hSession)
{
// (2) load all the system settings into the session
@@ -253,8 +276,8 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
NvAPI_UnicodeString profile_name;
std::string app_name = LLTrans::getString("APP_NAME");
- llutf16string w_app_name = utf8str_to_utf16str(app_name);
- wsprintf(profile_name, L"%s", w_app_name.c_str());
+ std::wstring w_app_name = ll_convert<std::wstring>(app_name);
+ wsprintf(reinterpret_cast<wchar_t*>(profile_name), L"%s", w_app_name.c_str());
NvDRSProfileHandle hProfile = 0;
// (3) Check if we already have an application profile for the viewer
status = NvAPI_DRS_FindProfileByName(hSession, profile_name, &hProfile);
@@ -271,7 +294,7 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
NVDRS_PROFILE profileInfo;
profileInfo.version = NVDRS_PROFILE_VER;
profileInfo.isPredefined = 0;
- wsprintf(profileInfo.profileName, L"%s", w_app_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(profileInfo.profileName), L"%s", w_app_name.c_str());
status = NvAPI_DRS_CreateProfile(hSession, &profileInfo, &hProfile);
if (status != NVAPI_OK)
@@ -286,9 +309,9 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
NVDRS_APPLICATION profile_application;
profile_application.version = NVDRS_APPLICATION_VER;
- llutf16string w_exe_name = utf8str_to_utf16str(exe_name);
+ std::wstring w_exe_name = ll_convert<std::wstring>(exe_name);
NvAPI_UnicodeString profile_app_name;
- wsprintf(profile_app_name, L"%s", w_exe_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(profile_app_name), L"%s", w_exe_name.c_str());
status = NvAPI_DRS_GetApplicationInfo(hSession, hProfile, profile_app_name, &profile_application);
if (status != NVAPI_OK && status != NVAPI_EXECUTABLE_NOT_FOUND)
@@ -304,10 +327,10 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
NVDRS_APPLICATION application;
application.version = NVDRS_APPLICATION_VER;
application.isPredefined = 0;
- wsprintf(application.appName, L"%s", w_exe_name.c_str());
- wsprintf(application.userFriendlyName, L"%s", w_exe_name.c_str());
- wsprintf(application.launcher, L"%s", w_exe_name.c_str());
- wsprintf(application.fileInFolder, L"%s", "");
+ wsprintf(reinterpret_cast<wchar_t*>(application.appName), L"%s", w_exe_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(application.userFriendlyName), L"%s", w_exe_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(application.launcher), L"%s", w_exe_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(application.fileInFolder), L"%s", "");
status = NvAPI_DRS_CreateApplication(hSession, hProfile, &application);
if (status != NVAPI_OK)
@@ -395,11 +418,19 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
return;
}
}
+#endif
-int APIENTRY wWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- PWSTR pCmdLine,
- int nCmdShow)
+//#define DEBUGGING_SEH_FILTER 1
+#if DEBUGGING_SEH_FILTER
+# define WINMAIN DebuggingWinMain
+#else
+# define WINMAIN wWinMain
+#endif
+
+int APIENTRY WINMAIN(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ PWSTR pCmdLine,
+ int nCmdShow)
{
// Call Tracy first thing to have it allocate memory
// https://github.com/wolfpld/tracy/issues/196
@@ -410,7 +441,9 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
DWORD heap_enable_lfh_error[MAX_HEAPS];
S32 num_heaps = 0;
+#if !LL_SDL
LLWindowWin32::setDPIAwareness();
+#endif
#if WINDOWS_CRT_MEM_CHECKS && !INCLUDE_VLD
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // dump memory leaks on exit
@@ -439,8 +472,11 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
#endif
#endif
+#if !LL_SDL
// *FIX: global
gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);
+#endif
+ gIconSmallResource = MAKEINTRESOURCE(IDI_LL_ICON_SMALL);
LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(ll_convert_wide_to_string(pCmdLine).c_str());
@@ -457,6 +493,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
return -1;
}
+#if !_M_ARM64
NvDRSSessionHandle hSession = 0;
static LLCachedControl<bool> use_nv_api(gSavedSettings, "NvAPICreateApplicationProfile", true);
if (use_nv_api)
@@ -481,6 +518,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
}
}
}
+#endif
// Have to wait until after logging is initialized to display LFH info
if (num_heaps > 0)
@@ -538,21 +576,44 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
delete viewer_app_ptr;
viewer_app_ptr = NULL;
+#if !_M_ARM64
// (NVAPI) (6) We clean up. This is analogous to doing a free()
if (hSession)
{
NvAPI_DRS_DestroySession(hSession);
hSession = 0;
}
+#endif
return 0;
}
+#if DEBUGGING_SEH_FILTER
+// The compiler doesn't like it when you use __try/__except blocks
+// in a method that uses object destructors. Go figure.
+// This winmain just calls the real winmain inside __try.
+// The __except calls our exception filter function. For debugging purposes.
+int APIENTRY wWinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ PWSTR lpCmdLine,
+ int nCmdShow)
+{
+ __try
+ {
+ WINMAIN(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
+ }
+ __except( viewer_windows_exception_handler( GetExceptionInformation() ) )
+ {
+ _tprintf( _T("Exception handled.\n") );
+ }
+}
+#endif
+
void LLAppViewerWin32::disableWinErrorReporting()
{
std::string executable_name = gDirUtilp->getExecutableFilename();
- if( S_OK == WerAddExcludedApplication( utf8str_to_utf16str(executable_name).c_str(), FALSE ) )
+ if( S_OK == WerAddExcludedApplication(ll_convert<std::wstring>(executable_name).c_str(), FALSE ) )
{
LL_INFOS() << "WerAddExcludedApplication() succeeded for " << executable_name << LL_ENDL;
}
@@ -788,6 +849,29 @@ bool LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo)
return false;
}
+bool LLAppViewerWin32::initWindow()
+{
+ // This is a workaround/hotfix for a change in Windows 11 24H2 (and possibly later)
+ // Where the window width and height need to correctly reflect an available FullScreen size
+ if (gSavedSettings.getBOOL("FullScreen"))
+ {
+ DEVMODE dev_mode;
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ dev_mode.dmSize = sizeof(DEVMODE);
+ if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode))
+ {
+ gSavedSettings.setU32("WindowWidth", dev_mode.dmPelsWidth);
+ gSavedSettings.setU32("WindowHeight", dev_mode.dmPelsHeight);
+ }
+ else
+ {
+ LL_WARNS("AppInit") << "Unable to set WindowWidth and WindowHeight for FullScreen mode" << LL_ENDL;
+ }
+ }
+
+ return LLAppViewer::initWindow();
+}
+
void LLAppViewerWin32::initLoggingAndGetLastDuration()
{
LLAppViewer::initLoggingAndGetLastDuration();
@@ -814,69 +898,11 @@ void write_debug_dx(const std::string& str)
bool LLAppViewerWin32::initHardwareTest()
{
- //
- // Do driver verification and initialization based on DirectX
- // hardware polling and driver versions
- //
- if (true == gSavedSettings.getBOOL("ProbeHardwareOnStartup") && false == gSavedSettings.getBOOL("NoHardwareProbe"))
- {
- // per DEV-11631 - disable hardware probing for everything
- // but vram.
- bool vram_only = true;
-
- LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware"));
-
- LL_DEBUGS("AppInit") << "Attempting to poll DirectX for hardware info" << LL_ENDL;
- gDXHardware.setWriteDebugFunc(write_debug_dx);
- bool probe_ok = gDXHardware.getInfo(vram_only);
-
- if (!probe_ok
- && gWarningSettings.getBOOL("AboutDirectX9"))
- {
- LL_WARNS("AppInit") << "DirectX probe failed, alerting user." << LL_ENDL;
-
- // Warn them that runnin without DirectX 9 will
- // not allow us to tell them about driver issues
- std::ostringstream msg;
- msg << LLTrans::getString ("MBNoDirectX");
- S32 button = OSMessageBox(
- msg.str(),
- LLTrans::getString("MBWarning"),
- OSMB_YESNO);
- if (OSBTN_NO== button)
- {
- LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL;
- LLWeb::loadURLExternal("http://secondlife.com/support/", false);
- return false;
- }
- gWarningSettings.setBOOL("AboutDirectX9", false);
- }
- LL_DEBUGS("AppInit") << "Done polling DirectX for hardware info" << LL_ENDL;
-
- // Only probe once after installation
- gSavedSettings.setBOOL("ProbeHardwareOnStartup", false);
-
- // Disable so debugger can work
- std::string splash_msg;
- LLStringUtil::format_map_t args;
- args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle();
- splash_msg = LLTrans::getString("StartupLoading", args);
-
- LLSplashScreen::update(splash_msg);
- }
-
if (!restoreErrorTrap())
{
- LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL;
+ LL_WARNS("AppInit") << " Someone took over my exception handler!" << LL_ENDL;
}
- if (gGLManager.mVRAM == 0)
- {
- gGLManager.mVRAM = gDXHardware.getVRAM();
- }
-
- LL_INFOS("AppInit") << "Detected VRAM: " << gGLManager.mVRAM << LL_ENDL;
-
return true;
}
diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h
index 250e72edf3..3fad53ec72 100644
--- a/indra/newview/llappviewerwin32.h
+++ b/indra/newview/llappviewerwin32.h
@@ -46,6 +46,7 @@ public:
bool reportCrashToBugsplat(void* pExcepInfo) override;
protected:
+ bool initWindow() override; // Override to initialize the viewer's window.
void initLoggingAndGetLastDuration() override; // Override to clean stack_trace info.
void initConsole() override; // Initialize OS level debugging console.
bool initHardwareTest() override; // Win32 uses DX9 to test hardware.
diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp
index f200ca8e31..1ea2899ba4 100644
--- a/indra/newview/llautoreplace.cpp
+++ b/indra/newview/llautoreplace.cpp
@@ -536,11 +536,12 @@ LLAutoReplaceSettings::AddListResult LLAutoReplaceSettings::replaceList(const LL
S32 search_index;
LLSD targetList;
// The following is working around the fact that LLSD arrays containing maps also seem to have undefined entries... see LLSD-30
- for ( search_index = 0, targetList = mLists[0];
+ for ( search_index = 0;
!listFound && search_index < mLists.size();
- search_index += 1, targetList = mLists[search_index]
+ search_index += 1
)
{
+ targetList = mLists[search_index];
if ( targetList.isMap() )
{
if ( listNameMatches( targetList, listName) )
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 52cd86951d..e29be0c757 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -48,12 +48,11 @@
#include "llvoiceclient.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "lltooldraganddrop.h"
-#include "llworld.h"
static LLDefaultChildRegistry::Register<LLAvatarList> r("avatar_list");
// Last interaction time update period.
-static const F32 LIT_UPDATE_PERIOD = 1;
+static const F32 LIT_UPDATE_PERIOD = 5;
// Maximum number of avatars that can be added to a list in one pass.
// Used to limit time spent for avatar list update per frame.
@@ -147,6 +146,7 @@ LLAvatarList::LLAvatarList(const Params& p)
, mShowSpeakingIndicator(p.show_speaking_indicator)
, mShowPermissions(p.show_permissions_granted)
, mShowCompleteName(false)
+, mForceCompleteName(false)
{
setCommitOnSelectionChange(true);
@@ -183,7 +183,7 @@ void LLAvatarList::setShowIcons(std::string param_name)
std::string LLAvatarList::getAvatarName(LLAvatarName av_name)
{
- return mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName();
+ return mShowCompleteName? av_name.getCompleteName(false, mForceCompleteName) : av_name.getDisplayName();
}
// virtual
@@ -204,13 +204,25 @@ void LLAvatarList::draw()
if ((mShowLastInteractionTime || mAvatarDistance || mAvatarArrivalTime) && mLITUpdateTimer->hasExpired())
{
- if (mAvatarArrivalTime)
+ if (mAvatarArrivalTime || mAvatarDistance)
{
- updateAvatarArrivalTime();
- }
- if (mAvatarDistance)
- {
- updateAvatarDistance();
+ std::vector<LLPanel*> items;
+ getItems(items);
+ for (auto it = items.begin(); it != items.end(); it++)
+ {
+ auto item = static_cast<LLAvatarListItem*>(*it);
+ if (mAvatarArrivalTime)
+ {
+ auto secs_since = LLDate::now().secondsSinceEpoch() - LLRecentPeople::instance().getArrivalTimeByID(item->getAvatarId());
+ if (secs_since >= 0)
+ item->setAvatarArrivalTime(secs_since);
+ }
+ if (mAvatarDistance)
+ {
+ auto avatarsPositions = gAgent.getAvatarsPositions();
+ item->setAvatarDistance(dist_vec(avatarsPositions[item->getAvatarId()], gAgent.getPositionGlobal()));
+ }
+ }
}
if (mShowLastInteractionTime)
{
@@ -381,7 +393,7 @@ void LLAvatarList::updateAvatarNames()
for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++)
{
LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it);
- item->setShowCompleteName(mShowCompleteName);
+ item->setShowCompleteName(mShowCompleteName, mForceCompleteName);
item->updateAvatarName();
}
mNeedUpdateNames = false;
@@ -421,6 +433,11 @@ boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse
return mItemDoubleClickSignal.connect(cb);
}
+boost::signals2::connection LLAvatarList::setItemClickedCallback(const mouse_signal_t::slot_type& cb)
+{
+ return mItemClickedSignal.connect(cb);
+}
+
//virtual
S32 LLAvatarList::notifyParent(const LLSD& info)
{
@@ -435,7 +452,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info)
void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, bool is_online, EAddPosition pos)
{
LLAvatarListItem* item = new LLAvatarListItem();
- item->setShowCompleteName(mShowCompleteName);
+ item->setShowCompleteName(mShowCompleteName, mForceCompleteName);
// This sets the name as a side effect
item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus);
item->setOnline(mIgnoreOnlineStatus ? true : is_online);
@@ -451,6 +468,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, bool is
item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoubleClicked, this, _1, _2, _3, _4));
+ item->setMouseDownCallback(boost::bind(&LLAvatarList::onItemClicked, this, _1, _2, _3, _4));
addItem(item, id, pos);
}
@@ -547,46 +565,6 @@ void LLAvatarList::computeDifference(
LLCommonUtils::computeDifference(vnew_unsorted, vcur, vadded, vremoved);
}
-void LLAvatarList::updateAvatarArrivalTime()
-{
- std::vector<LLPanel*> items;
- getItems(items);
- auto uuids = getIDs();
- std::vector<LLVector3d> positions;
- auto me_pos = gAgent.getPositionGlobal();
- LLWorld::getInstance()->getAvatars(&uuids, &positions, me_pos, gSavedSettings.getF32("MPVNearMeRange"));
- LLRecentPeople::instance().updateAvatarsArrivalTime(uuids);
- for (auto it = items.begin(); it != items.end(); it++)
- {
- auto item = static_cast<LLAvatarListItem*>(*it);
- auto secs_since = LLDate::now().secondsSinceEpoch() - LLRecentPeople::instance().getArrivalTimeByID(item->getAvatarId());
- if (secs_since >= 0)
- item->setAvatarArrivalTime(secs_since);
- }
-}
-
- void LLAvatarList::updateAvatarDistance()
-{
- std::vector<LLPanel*> items;
- getItems(items);
- auto uuids = getIDs();
- std::vector<LLVector3d> positions;
- auto me_pos = gAgent.getPositionGlobal();
- LLWorld::getInstance()->getAvatars(&uuids, &positions, me_pos, gSavedSettings.getF32("MPVNearMeRange"));
- std::map <LLUUID, LLVector3d> avatarsPositions;
- auto pos_it = positions.begin();
- auto id_it = uuids.begin();
- for (;pos_it != positions.end() && id_it != uuids.end(); ++pos_it, ++id_it)
- {
- avatarsPositions[*id_it] = *pos_it;
- }
- for (auto it = items.begin(); it != items.end(); it++)
- {
- auto item = static_cast<LLAvatarListItem*>(*it);
- item->setAvatarDistance(dist_vec(avatarsPositions[item->getAvatarId()], me_pos));
- }
-}
-
// Refresh shown time of our last interaction with all listed avatars.
void LLAvatarList::updateLastInteractionTimes()
{
@@ -609,6 +587,11 @@ void LLAvatarList::onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
mItemDoubleClickSignal(ctrl, x, y, mask);
}
+void LLAvatarList::onItemClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
+{
+ mItemClickedSignal(ctrl, x, y, mask);
+}
+
bool LLAvatarItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const
{
const LLAvatarListItem* avatar_item1 = dynamic_cast<const LLAvatarListItem*>(item1);
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 37ad578a20..e6e0728a3f 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -98,11 +98,13 @@ public:
boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb);
+ boost::signals2::connection setItemClickedCallback(const mouse_signal_t::slot_type& cb);
+
virtual S32 notifyParent(const LLSD& info);
void handleDisplayNamesOptionChanged();
- void setShowCompleteName(bool show) { mShowCompleteName = show;};
+ void setShowCompleteName(bool show, bool force = false) { mShowCompleteName = show; mForceCompleteName = force; };
protected:
void refresh();
@@ -112,11 +114,10 @@ protected:
const uuid_vec_t& vnew,
uuid_vec_t& vadded,
uuid_vec_t& vremoved);
- void updateAvatarArrivalTime();
- void updateAvatarDistance();
void updateLastInteractionTimes();
void rebuildNames();
void onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask);
+ void onItemClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask);
void updateAvatarNames();
private:
@@ -133,6 +134,7 @@ private:
bool mShowSpeakingIndicator;
bool mShowPermissions;
bool mShowCompleteName;
+ bool mForceCompleteName;
LLTimer* mLITUpdateTimer; // last interaction time update timer
std::string mIconParamName;
@@ -144,6 +146,7 @@ private:
commit_signal_t mRefreshCompleteSignal;
mouse_signal_t mItemDoubleClickSignal;
+ mouse_signal_t mItemClickedSignal;
};
/** Abstract comparator for avatar items */
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 7be4f4eeb8..f6bc59c748 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -80,6 +80,7 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
mShowProfileBtn(true),
mShowPermissions(false),
mShowCompleteName(false),
+ mForceCompleteName(false),
mHovered(false),
mAvatarNameCacheConnection(),
mGreyOutUsername("")
@@ -350,13 +351,12 @@ void LLAvatarListItem::setShowProfileBtn(bool show)
void LLAvatarListItem::showSpeakingIndicator(bool visible)
{
- // Already done? Then do nothing.
- if (mSpeakingIndicator->getVisible() == (bool)visible)
- return;
-// Disabled to not contradict with SpeakingIndicatorManager functionality. EXT-3976
-// probably this method should be totally removed.
-// mSpeakingIndicator->setVisible(visible);
-// updateChildren();
+ // used only to hide indicator to not contradict with SpeakingIndicatorManager functionality
+ if (mSpeakingIndicator && !visible)
+ {
+ mSpeakingIndicator->setIsActiveChannel(visible);
+ mSpeakingIndicator->setShowParticipantsSpeaking(visible);
+ }
}
void LLAvatarListItem::setAvatarIconVisible(bool visible)
@@ -443,8 +443,8 @@ void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name)
mAvatarNameCacheConnection.disconnect();
mGreyOutUsername = "";
- std::string name_string = mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName();
- if(av_name.getCompleteName() != av_name.getUserName())
+ std::string name_string = mShowCompleteName? av_name.getCompleteName(false, mForceCompleteName) : av_name.getDisplayName();
+ if(av_name.getCompleteName(false, mForceCompleteName) != av_name.getUserName())
{
mGreyOutUsername = "[ " + av_name.getUserName(true) + " ]";
LLStringUtil::toLower(mGreyOutUsername);
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 630a7ec751..f9381f95e3 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -110,7 +110,7 @@ public:
void showAvatarDistance(bool show);
void showLastInteractionTime(bool show);
void setAvatarIconVisible(bool visible);
- void setShowCompleteName(bool show) { mShowCompleteName = show;};
+ void setShowCompleteName(bool show, bool force = false) { mShowCompleteName = show; mForceCompleteName = force;};
const LLUUID& getAvatarId() const;
std::string getAvatarName() const;
@@ -228,6 +228,7 @@ private:
bool mHovered;
bool mShowCompleteName;
+ bool mForceCompleteName;
std::string mGreyOutUsername;
void fetchAvatarName();
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 305b5be194..8617183840 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -189,7 +189,14 @@ public:
std::string url = "secondlife://" + mObjectData["slurl"].asString();
LLUrlAction::teleportToLocation(url);
}
-
+ else if (level == "obj_zoom_in")
+ {
+ LLUUID obj_id = mObjectData["object_id"];
+ if (obj_id.notNull())
+ {
+ handle_zoom_to_object(obj_id);
+ }
+ }
}
bool onObjectIconContextMenuItemVisible(const LLSD& userdata)
@@ -203,6 +210,16 @@ public:
{
return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat);
}
+ else if (level == "obj_zoom_in")
+ {
+ LLUUID obj_id = mObjectData["object_id"];
+ if (obj_id.notNull())
+ {
+ LLViewerObject* object = gObjectList.findObject(obj_id);
+ return object && object->isReachable();
+ }
+ return false;
+ }
return false;
}
@@ -425,6 +442,7 @@ public:
time_t current_time = time_corrected();
time_t message_time = (time_t)(current_time - LLFrameTimer::getElapsedSeconds() + mTime);
+ // Report abuse shouldn't use AM/PM, use 24-hour time
time_string = "[" + LLTrans::getString("TimeMonth") + "]/["
+ LLTrans::getString("TimeDay") + "]/["
+ LLTrans::getString("TimeYear") + "] ["
@@ -936,7 +954,7 @@ protected:
menu->setItemEnabled("Voice Call", false);
menu->setItemEnabled("Chat History", false);
menu->setItemEnabled("Invite Group", false);
- menu->setItemEnabled("Zoom In", false);
+ menu->setItemEnabled("Zoom In", true);
menu->setItemEnabled("Share", false);
menu->setItemEnabled("Pay", false);
menu->setItemEnabled("Block Unblock", false);
@@ -1101,7 +1119,11 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
mEditor->setIsFriendCallback(LLAvatarActions::isFriend);
mEditor->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0));
-
+ mEditor->setIsObjectReachableCallback([](const LLUUID& obj_id)
+ {
+ LLViewerObject* object = gObjectList.findObject(obj_id);
+ return object && object->isReachable();
+ });
}
LLSD LLChatHistory::getValue() const
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 550dfeb802..5ac4ce0d52 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -37,6 +37,8 @@
#include "lllocalcliprect.h"
#include "lltrans.h"
#include "llfloaterimnearbychat.h"
+#include "llfloaterworldmap.h"
+#include "llviewermenu.h"
#include "llviewercontrol.h"
#include "llagentdata.h"
@@ -75,6 +77,23 @@ public:
return true;
}
+ if (verb == "zoomin")
+ {
+ if (!handle_zoom_to_object(object_id) && params.size() > 2)
+ {
+ // zoom faled, show location
+ // secondlife:///app/object/object_id/zoomin/{LOCATION}/{COORDS} SLapp
+ const std::string region_name = LLURI::unescape(params[0].asString());
+ S32 x = (params.size() > 1) ? params[1].asInteger() : 128;
+ S32 y = (params.size() > 2) ? params[2].asInteger() : 128;
+ S32 z = (params.size() > 3) ? params[3].asInteger() : 0;
+
+ LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+ return true;
+ }
+
return false;
}
};
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 9201241856..660fb1b41a 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -129,14 +129,14 @@ void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_
{
LLVector3 pos_box_offset = point_to_box_offset(vol_pos, unshift_extents);
F32 offset_dist = pos_box_offset.length();
- if (offset_dist > MAX_LEGAL_OFFSET && offset_dist > 0.f)
+ if (offset_dist > max_legal_offset && offset_dist > 0.f)
{
- F32 target_dist = (offset_dist - MAX_LEGAL_OFFSET);
+ F32 target_dist = (offset_dist - max_legal_offset);
new_pos_fixup = (target_dist/offset_dist)*pos_box_offset;
}
if (new_pos_fixup != mPositionConstraintFixup)
{
- LL_DEBUGS("ConstraintFix") << getFullname() << " pos fix, offset_dist " << offset_dist << " pos fixup "
+ LL_DEBUGS("ConstraintFix") << getDebugName() << " pos fix, offset_dist " << offset_dist << " pos fixup "
<< new_pos_fixup << " was " << mPositionConstraintFixup << LL_ENDL;
LL_DEBUGS("ConstraintFix") << "vol_pos " << vol_pos << LL_ENDL;
LL_DEBUGS("ConstraintFix") << "extents " << extents[0] << " " << extents[1] << LL_ENDL;
@@ -144,11 +144,11 @@ void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_
}
}
- if (box_size/mScaleConstraintFixup > MAX_LEGAL_SIZE)
+ if (box_size/mScaleConstraintFixup > max_legal_size)
{
- new_scale_fixup = mScaleConstraintFixup* MAX_LEGAL_SIZE /box_size;
- LL_DEBUGS("ConstraintFix") << getFullname() << " scale fix, box_size " << box_size << " fixup "
- << mScaleConstraintFixup << " max legal " << MAX_LEGAL_SIZE
+ new_scale_fixup = mScaleConstraintFixup*max_legal_size/box_size;
+ LL_DEBUGS("ConstraintFix") << getDebugName() << " scale fix, box_size " << box_size << " fixup "
+ << mScaleConstraintFixup << " max legal " << max_legal_size
<< " -> new scale " << new_scale_fixup << LL_ENDL;
}
}
@@ -231,7 +231,7 @@ void LLControlAvatar::matchVolumeTransform()
const LLMeshSkinInfo* skin_info = mRootVolp->getSkinInfo();
if (skin_info)
{
- LL_DEBUGS("BindShape") << getFullname() << " bind shape " << skin_info->mBindShapeMatrix << LL_ENDL;
+ LL_DEBUGS("BindShape") << getDebugName() << " bind shape " << skin_info->mBindShapeMatrix << LL_ENDL;
bind_rot = LLSkinningUtil::getUnscaledQuaternion(LLMatrix4(skin_info->mBindShapeMatrix));
}
#endif
diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
index e6a720e734..65a068e08d 100644
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -118,11 +118,21 @@ const std::string LLConversation::createTimestamp(const U64Seconds& utc_time)
LLSD substitution;
substitution["datetime"] = (S32)utc_time.value();
- timeStr = "["+LLTrans::getString ("TimeMonth")+"]/["
- +LLTrans::getString ("TimeDay")+"]/["
- +LLTrans::getString ("TimeYear")+"] ["
- +LLTrans::getString ("TimeHour")+"]:["
- +LLTrans::getString ("TimeMin")+"]";
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ timeStr = "[" + LLTrans::getString("TimeMonth") + "]/["
+ + LLTrans::getString("TimeDay") + "]/["
+ + LLTrans::getString("TimeYear") + "] [";
+ if (use_24h)
+ {
+ timeStr += LLTrans::getString("TimeHour") + "]:["
+ + LLTrans::getString("TimeMin") + "]";
+ }
+ else
+ {
+ timeStr += LLTrans::getString("TimeHour12") + "]:["
+ + LLTrans::getString("TimeMin") + "] ["
+ + LLTrans::getString("TimeAMPM") + "]";
+ }
LLStringUtil::format (timeStr, substitution);
@@ -663,7 +673,7 @@ void LLConversationLog::onClearLogResponse(const LLSD& notification, const LLSD&
{
mConversations.clear();
notifyObservers();
- cache();
+ saveToFile(getFileName());
deleteBackupLogs();
}
}
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index af5a46742c..774e8fd4c5 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -300,7 +300,7 @@ void LLConversationItemSession::updateName(LLConversationItemParticipant* partic
for (auto itemp : mChildren)
{
- LLConversationItem* current_participant = dynamic_cast<LLConversationItem*>(itemp);
+ LLConversationItem* current_participant = dynamic_cast<LLConversationItem*>(itemp.get());
// Add the avatar uuid to the list (except if it's the own agent uuid)
if (current_participant->getUUID() != gAgentID)
{
@@ -329,6 +329,7 @@ void LLConversationItemSession::updateName(LLConversationItemParticipant* partic
void LLConversationItemSession::removeParticipant(LLConversationItemParticipant* participant)
{
+ LLPointer<LLFolderViewModelItem> holder(participant);
removeChild(participant);
mNeedsRefresh = true;
updateName(participant);
@@ -360,15 +361,10 @@ void LLConversationItemSession::clearAndDeparentModels()
for (child_list_t::iterator it = mChildren.begin(); it != mChildren.end();)
{
LLFolderViewModelItem* child = *it;
- if (child->getNumRefs() == 0)
+ // Note that model might still be assigned to some view/widget
+ // and have a different parent
+ if (child->getParent() == this)
{
- // LLConversationItemParticipant can be created but not assigned to any view,
- // it was waiting for an "add_participant" event to be processed
- delete child;
- }
- else
- {
- // Model is still assigned to some view/widget
child->setParent(NULL);
}
it = mChildren.erase(it);
@@ -383,7 +379,7 @@ LLConversationItemParticipant* LLConversationItemSession::findParticipant(const
child_list_t::iterator iter;
for (iter = mChildren.begin(); iter != mChildren.end(); iter++)
{
- participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
+ participant = dynamic_cast<LLConversationItemParticipant*>((*iter).get());
if (participant && participant->hasSameValue(participant_id))
{
break;
@@ -493,7 +489,7 @@ const bool LLConversationItemSession::getTime(F64& time) const
child_list_t::const_iterator iter;
for (iter = mChildren.begin(); iter != mChildren.end(); iter++)
{
- participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
+ participant = dynamic_cast<LLConversationItemParticipant*>((*iter).get());
F64 participant_time;
if (participant && participant->getTime(participant_time))
{
@@ -517,7 +513,7 @@ void LLConversationItemSession::dumpDebugData(bool dump_children)
{
for (child_list_t::iterator iter = mChildren.begin(); iter != mChildren.end(); iter++)
{
- LLConversationItemParticipant* participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
+ LLConversationItemParticipant* participant = dynamic_cast<LLConversationItemParticipant*>((*iter).get());
if (participant)
{
participant->dumpDebugData();
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index c1e48c63a9..d5486b9f4a 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -79,6 +79,9 @@ public:
virtual LLPointer<LLUIImage> getOpenIcon() const { return getIcon(); }
virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; }
virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
+ virtual bool isFavorite() const { return false; }
+ virtual bool isAgentInventory() const { return false; }
+ virtual bool isAgentInventoryRoot() const { return false; }
virtual bool isItemRenameable() const { return true; }
virtual bool renameItem(const std::string& new_name) { mName = new_name; mNeedsRefresh = true; return true; }
virtual bool isItemMovable( void ) const { return false; }
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index a1f627c8cc..99d770b6e2 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -86,7 +86,8 @@ LLConversationViewSession::LLConversationViewSession(const LLConversationViewSes
mHasArrow(true),
mIsInActiveVoiceChannel(false),
mFlashStateOn(false),
- mFlashStarted(false)
+ mFlashStarted(false),
+ mIsAltFlashColor(false)
{
mFlashTimer = new LLFlashTimer();
mAreChildrenInited = true; // inventory only
@@ -157,7 +158,7 @@ void LLConversationViewSession::destroyView()
LLFolderViewFolder::destroyView();
}
-void LLConversationViewSession::setFlashState(bool flash_state)
+void LLConversationViewSession::setFlashState(bool flash_state, bool alternate_color)
{
if (flash_state && !mFlashStateOn)
{
@@ -170,6 +171,7 @@ void LLConversationViewSession::setFlashState(bool flash_state)
mFlashStateOn = flash_state;
mFlashStarted = false;
+ mIsAltFlashColor = mFlashStateOn && (alternate_color || mIsAltFlashColor);
mFlashTimer->stopFlashing();
}
@@ -288,7 +290,8 @@ void LLConversationViewSession::draw()
startFlashing();
// draw highlight for selected items
- drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
+ static LLUIColor alt_color = LLUIColorTable::instance().getColor("MentionFlashBgColor", DEFAULT_WHITE);
+ drawHighlight(show_context, true, sHighlightBgColor, mIsAltFlashColor ? alt_color : sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
// Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap.
bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen();
@@ -540,7 +543,7 @@ void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& sessi
{
bool old_value = mIsInActiveVoiceChannel;
mIsInActiveVoiceChannel = vmi->getUUID() == session_id;
- mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel);
+ mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel && !LLVoiceChannel::isSuspended());
if (old_value != mIsInActiveVoiceChannel)
{
refresh();
diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h
index 8eb6392121..a6d240ed84 100644
--- a/indra/newview/llconversationview.h
+++ b/indra/newview/llconversationview.h
@@ -90,7 +90,7 @@ public:
virtual void refresh();
- /*virtual*/ void setFlashState(bool flash_state);
+ /*virtual*/ void setFlashState(bool flash_state, bool alternate_color = false);
void setHighlightState(bool hihglight_state);
LLFloater* getSessionFloater();
@@ -111,6 +111,7 @@ private:
LLFlashTimer* mFlashTimer;
bool mFlashStateOn;
bool mFlashStarted;
+ bool mIsAltFlashColor;
bool mCollapsedMode;
bool mHasArrow;
diff --git a/indra/newview/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/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 95f96e85d6..90ee95d424 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -491,7 +491,6 @@ void LLDrawPoolAvatar::beginImpostor()
if (!LLPipeline::sReflectionRender)
{
- LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
LLVOAvatar::sNumVisibleAvatars = 0;
}
@@ -547,7 +546,6 @@ void LLDrawPoolAvatar::beginDeferredImpostor()
if (!LLPipeline::sReflectionRender)
{
- LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
LLVOAvatar::sNumVisibleAvatars = 0;
}
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index bf593bff07..ea2bc74daa 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -802,7 +802,10 @@ void LLBumpImageList::onSourceStandardLoaded( bool success, LLViewerFetchedTextu
}
src_vi->setExplicitFormat(GL_RGBA, GL_RGBA);
{
- src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image);
+ if (!src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image))
+ {
+ LL_WARNS() << "Failed to create bump image texture for image " << src_vi->getID() << LL_ENDL;
+ }
}
}
}
@@ -896,7 +899,10 @@ void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_cod
LLImageGL* src_img = src->getGLTexture();
LLImageGL* dst_img = bump->getGLTexture();
- dst_img->setSize(src->getWidth(), src->getHeight(), 4, 0);
+ if (!dst_img->setSize(src->getWidth(), src->getHeight(), 4, 0))
+ {
+ LL_WARNS() << "Failed to setSize for image " << bump->getID() << LL_ENDL;
+ }
dst_img->setUseMipMaps(true);
dst_img->setDiscardLevel(0);
dst_img->createGLTexture();
@@ -911,7 +917,8 @@ void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_cod
// generate normal map in empty texture
{
- sRenderTarget.bindTarget();
+ sRenderTarget.bindTarget("", 1);
+ //sRenderTarget.clear();
LLGLDepthTest depth(GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h
index 5380463d01..23cf253b6a 100644
--- a/indra/newview/lldrawpoolterrain.h
+++ b/indra/newview/lldrawpoolterrain.h
@@ -38,6 +38,7 @@ public:
VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_NORMAL |
LLVertexBuffer::MAP_TANGENT | // Only PBR terrain uses this currently
+ LLVertexBuffer::MAP_TEXCOORD0 | // Ownership overlay
LLVertexBuffer::MAP_TEXCOORD1
};
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 7d58511d41..7a974fe857 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -119,7 +119,8 @@ void LLDrawPoolWater::beginPostDeferredPass(S32 pass)
LLRenderTarget& depth_src = gPipeline.mRT->deferredScreen;
LLRenderTarget& dst = gPipeline.mWaterDis;
- dst.bindTarget();
+ dst.bindTarget("", 1);
+ //dst.clear();
gCopyDepthProgram.bind();
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
@@ -143,7 +144,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
gGL.setColorMask(true, true);
LLColor3 light_diffuse(0, 0, 0);
- F32 light_exp = 0.0f;
LLEnvironment& environment = LLEnvironment::instance();
LLSettingsWater::ptr_t pwater = environment.getCurrentWater();
@@ -170,7 +170,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
// Apply magic numbers translating light direction into intensities
light_dir.normalize();
F32 ground_proj_sq = light_dir.mV[0] * light_dir.mV[0] + light_dir.mV[1] * light_dir.mV[1];
- light_exp = llmax(32.f, 256.f * powf(ground_proj_sq, 16.0f));
if (0.f < light_diffuse.normalize()) // Normalizing a color? Puzzling...
{
light_diffuse *= (1.5f + (6.f * ground_proj_sq));
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index 33325e352f..984f8ee25e 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -204,7 +204,7 @@ bool LLViewerDynamicTexture::updateAllInstances()
llassert(bake_target.getHeight() >= (U32) LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT);
preview_target.bindTarget();
- preview_target.clear();
+ //preview_target.clear();
LLGLSLShader::unbind();
LLVertexBuffer::unbind();
@@ -249,7 +249,7 @@ bool LLViewerDynamicTexture::updateAllInstances()
// ORDER_LAST is baked skin preview, ORDER_RESET resets appearance parameters and does not render.
bake_target.bindTarget();
- bake_target.clear();
+ //bake_target.clear();
result = false;
ret = false;
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 0017a724ea..875dac103c 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -2563,7 +2563,6 @@ void LLEnvironment::setSharedEnvironment()
{
clearEnvironment(LLEnvironment::ENV_LOCAL);
setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
- updateEnvironment();
}
void LLEnvironment::setExperienceEnvironment(LLUUID experience_id, LLUUID asset_id, F32 transition_time)
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index c6fea1ba82..86c58a3497 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -54,13 +54,6 @@ namespace Details
void stop();
private:
- // We will wait RETRY_SECONDS + (errorCount * RETRY_SECONDS_INC) before retrying after an error.
- // This means we attempt to recover relatively quickly but back off giving more time to recover
- // until we finally give up after MAX_EVENT_POLL_HTTP_ERRORS attempts.
- static const F32 EVENT_POLL_ERROR_RETRY_SECONDS;
- static const F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC;
- static const S32 MAX_EVENT_POLL_HTTP_ERRORS;
-
void eventPollCoro(std::string url);
void handleMessage(const LLSD &content);
@@ -76,9 +69,13 @@ namespace Details
};
- const F32 LLEventPollImpl::EVENT_POLL_ERROR_RETRY_SECONDS = 15.f; // ~ half of a normal timeout.
- const F32 LLEventPollImpl::EVENT_POLL_ERROR_RETRY_SECONDS_INC = 5.f; // ~ half of a normal timeout.
- const S32 LLEventPollImpl::MAX_EVENT_POLL_HTTP_ERRORS = 10; // ~5 minutes, by the above rules.
+ // We will wait RETRY_SECONDS + (errorCount * RETRY_SECONDS_INC) before retrying after an error.
+ // This means we attempt to recover relatively quickly but back off giving more time to recover
+ // until we finally give up after MAX_EVENT_POLL_HTTP_ERRORS attempts.
+ constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS = 15.f; // ~ half of a normal timeout.
+ constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC = 5.f; // ~ half of a normal timeout.
+ constexpr S32 MAX_EVENT_POLL_HTTP_ERRORS = 10; // ~5 minutes, by the above rules.
+ constexpr F64 MIN_SECONDS_PASSED = 10.0; // Minimum time we expect the server to hold the request.
int LLEventPollImpl::sNextCounter = 1;
@@ -151,11 +148,17 @@ namespace Details
LLSD acknowledge;
int errorCount = 0;
int counter = mCounter; // saved on the stack for logging.
+ LLTimer message_time;
LL_DEBUGS("LLEventPollImpl") << " <" << counter << "> entering coroutine." << LL_ENDL;
mAdapter = httpAdapter;
+ // This is a loop with its own waitToRetry implementation,
+ // so disable retries.
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+ httpOpts->setRetries(0);
+
LL::WorkQueue::ptr_t main_queue = nullptr;
// HACK -- grab the mainloop workqueue to move execution of the handler
@@ -172,11 +175,13 @@ namespace Details
request["ack"] = acknowledge;
request["done"] = mDone;
+ message_time.reset();
+
// LL_DEBUGS("LLEventPollImpl::eventPollCoro") << "<" << counter << "> request = "
// << LLSDXMLStreamer(request) << LL_ENDL;
LL_DEBUGS("LLEventPollImpl") << " <" << counter << "> posting and yielding." << LL_ENDL;
- LLSD result = httpAdapter->postAndSuspend(mHttpRequest, url, request);
+ LLSD result = httpAdapter->postAndSuspend(mHttpRequest, url, request, httpOpts);
// LL_DEBUGS("LLEventPollImpl::eventPollCoro") << "<" << counter << "> result = "
// << LLSDXMLStreamer(result) << LL_ENDL;
@@ -194,11 +199,30 @@ namespace Details
if (!status)
{
- if (status == LLCore::HttpStatus(LLCore::HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT))
- { // A standard timeout response we get this when there are no events.
- LL_DEBUGS("LLEventPollImpl") << "All is very quiet on target server. It may have gone idle?" << LL_ENDL;
- errorCount = 0;
- continue;
+ if (status == LLCore::HttpStatus(LLCore::HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT) // A standard timeout, no events.
+ || status == LLCore::HttpStatus(HTTP_BAD_GATEWAY) // An expected 'No events' case.
+ || status == LLCore::HttpStatus(HTTP_INTERNAL_ERROR)
+ || status == LLCore::HttpStatus(HTTP_SERVICE_UNAVAILABLE)
+ || status == LLCore::HttpStatus(HTTP_GATEWAY_TIME_OUT))
+ {
+ if (message_time.getElapsedSeconds() < MIN_SECONDS_PASSED)
+ {
+ // Server is supposed to hold request for 20 to 30 seconds.
+ // If it didn't hold the request at least for 10s, treat as an error.
+ LL_WARNS("LLEventPollImpl") << "Response arrived too early, status: " << status.toTerseString()
+ << ", time passed: " << message_time.getElapsedSeconds() << LL_ENDL;
+ }
+ else
+ {
+ // Timeout, expected and means 'no events'. Request is to be re-issued immediately.
+ // Current definition of a timeout is any of :
+ // - libcurl easy 28 status code
+ // - Linden 499 special http status code
+ // - RFC - standard 502 - 504 http status codes
+ LL_DEBUGS("LLEventPollImpl") << "No events, from: " << mSenderIp <<" status: " << (S32)status.getStatus() << LL_ENDL;
+ errorCount = 0;
+ continue;
+ }
}
else if ((status == LLCore::HttpStatus(LLCore::HttpStatus::LLCORE, LLCore::HE_OP_CANCELED)) ||
(status == LLCore::HttpStatus(HTTP_NOT_FOUND)))
@@ -206,13 +230,13 @@ namespace Details
// some cases the server gets ahead of the viewer and will
// return a 404 error (Not Found) before the cancel event
// comes back in the queue
- LL_WARNS("LLEventPollImpl") << "Canceling coroutine" << LL_ENDL;
+ LL_WARNS("LLEventPollImpl") << "<" << counter << "> Canceling coroutine, status: " << status.toTerseString() << LL_ENDL;
break;
}
else if (!status.isHttpStatus())
{
/// Some LLCore or LIBCurl error was returned. This is unlikely to be recoverable
- LL_WARNS("LLEventPollImpl") << "Critical error from poll request returned from libraries. Canceling coroutine." << LL_ENDL;
+ LL_WARNS("LLEventPollImpl") << "<" << counter << "> Critical error from poll request returned from libraries. Canceling coroutine." << LL_ENDL;
break;
}
LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error result from LLCoreHttpUtil::HttpCoroHandler. Code "
@@ -255,6 +279,10 @@ namespace Details
LL_WARNS("LLEventPollImpl") << "< " << counter << "> Forcing disconnect due to stalled main region event poll." << LL_ENDL;
LLAppViewer::instance()->forceDisconnect(LLTrans::getString("AgentLostConnection"));
}
+ else
+ {
+ LL_WARNS("LLEventPollImpl") << "< " << counter << "> Stopping event poll for " << mSenderIp << " due to failures." << LL_ENDL;
+ }
break;
}
}
diff --git a/indra/newview/lleventpoll.h b/indra/newview/lleventpoll.h
index bb407b3799..ea186aa803 100644
--- a/indra/newview/lleventpoll.h
+++ b/indra/newview/lleventpoll.h
@@ -40,7 +40,30 @@ namespace Details
class LLEventPoll
- ///< implements the viewer side of server-to-viewer pushed events.
+ ///< Implements the viewer side of server-to-viewer pushed events.
+ ///
+ /// This class implements the sole consumer of the EventQueueGet capability
+ /// and delivers data, including llsd-encoded llmessage payloads, from
+ /// simulator to viewer.
+ ///
+ /// https://wiki.secondlife.com/wiki/EventQueueGet
+ /// The wiki page is neither complete nor entirely correct. Request timeouts
+ /// became the de facto method of returning an empty event set to the viewer.
+ /// But the timeout behavior was never defined. It was simply whatever
+ /// behavior a given grid implementation implemented.
+ ///
+ /// In SL's case, the path may include reverse proxies, http caches, http and
+ /// socks proxies, transparent hijacking, and other horrors. A pitfall for
+ /// implementors.
+ ///
+ /// Current definition of a timeout is any of :
+ /// - libcurl easy 28 status code
+ /// - Linden 499 special http status code
+ /// - RFC - standard 502 - 504 http status codes
+ /// If requests are failing too quickly with the above errors, they are treated
+ /// as actual errors and not an empty payload. These will count towards a final
+ /// error declaration and can lead to disconnection from a simulator or the
+ /// entire grid.
{
public:
LLEventPoll(const std::string& pollURL, const LLHost& sender);
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index fb4db9a216..d2b862eb58 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -648,7 +648,7 @@ void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wirefram
LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
#endif
glPolygonOffset(3.f, 3.f);
- glLineWidth(5.f);
+ //glLineWidth(5.f);
#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
#endif
@@ -771,9 +771,6 @@ static void xform4a(LLVector4a &tex_coord, const LLVector4a& trans, const LLVect
// Texture transforms are done about the center of the face.
st.setAdd(tex_coord, trans);
- // Handle rotation
- LLVector4a rot_st;
-
// <s0 * cosAng, s0*-sinAng, s1*cosAng, s1*-sinAng>
LLVector4a s0;
s0.splat(st, 0);
@@ -2258,8 +2255,6 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
if (joint)
{
- LLVector4a jointPos;
-
LLMatrix4a worldMat;
worldMat.loadu((F32*)&joint->getWorldMatrix().mMatrix[0][0]);
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index aa2578fec6..ac052d35e4 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -518,7 +518,8 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
//render charts
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- buffer.bindTarget();
+ buffer.bindTarget("", 1);
+ buffer.clear();
for (std::set<std::string>::iterator iter = chart_names.begin(); iter != chart_names.end(); ++iter)
{
@@ -1057,8 +1058,7 @@ void LLFastTimerView::drawLineGraph()
//fatten highlighted timer
if (mHoverID == idp)
{
- gGL.flush();
- glLineWidth(3);
+ LLRender2D::setLineWidth(3.0);
}
llassert(idp->getIndex() < sTimerColors.size());
@@ -1118,8 +1118,7 @@ void LLFastTimerView::drawLineGraph()
if (mHoverID == idp)
{
- gGL.flush();
- glLineWidth(1);
+ LLRender2D::setLineWidth(1.f);
}
if (idp->getTreeNode().mCollapsed)
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 2bbe5e90c6..9e69fcef29 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -404,8 +404,53 @@ F32 logExceptionBenchmark()
}
#endif
+bool checkRDNA35()
+{
+ // This checks if we're running on an RDNA3.5 GPU. You're only going to see these on AMD's APUs.
+ // As of driver version 25, we're seeing stalls in some of our queries.
+ // This appears to be a driver bug, and appears to be specific RDNA3.5 APUs.
+ // There's multiples of these guys, so we just use this function to check if that GPU is on the list of known RDNA3.5 APUs.
+ // - Geenz 11/12/2025
+ std::array<std::string, 7> rdna35GPUs = {
+ "8060S",
+ "8050S",
+ "8040S",
+ "860M",
+ "840M",
+ "890M",
+ "880M"
+ };
+
+ for (const auto& gpu_name : rdna35GPUs)
+ {
+ if (gGLManager.getRawGLString().find(gpu_name) != std::string::npos)
+ {
+ LL_WARNS("RenderInit") << "Detected AMD RDNA3.5 GPU (" << gpu_name << ")." << LL_ENDL;
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool LLFeatureManager::loadGPUClass()
{
+ // This is a hack for certain AMD GPUs in newer driver versions on certain APUs.
+ // These GPUs will show inconsistent freezes when attempting to run shader profiles against them.
+ // This is extremely problematic as it can lead to:
+ // - Login freezes
+ // - Inability to start the client
+ // - Completely random avatars triggering a freeze
+ // As a result, we filter out these GPUs for shader profiling.
+ // - Geenz 11/11/2025
+
+ if (gGLManager.getRawGLString().find("Radeon") != std::string::npos && checkRDNA35() && gGLManager.mDriverVersionVendorString.find("25.") != std::string::npos)
+ {
+ LL_WARNS("RenderInit") << "Detected AMD RDNA3.5 GPU on a known bad driver; disabling benchmark and occlusion culling to prevent freezes." << LL_ENDL;
+ gSavedSettings.setBOOL("SkipBenchmark", true);
+ gSavedSettings.setBOOL("UseOcclusion", false);
+ }
+
if (!gSavedSettings.getBOOL("SkipBenchmark"))
{
F32 class1_gbps = gSavedSettings.getF32("RenderClass1MemoryBandwidth");
@@ -465,7 +510,7 @@ bool LLFeatureManager::loadGPUClass()
}
#if LL_WINDOWS
- const F32Gigabytes MIN_PHYSICAL_MEMORY(2);
+ const F32Gigabytes MIN_PHYSICAL_MEMORY(8);
LLMemory::updateMemoryInfo();
F32Gigabytes physical_mem = LLMemory::getMaxMemKB();
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index 22de6afbae..d04b89cb60 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -123,6 +123,7 @@ public:
S32 getVersion() const { return mTableVersion; }
void setSafe(const bool safe) { mSafe = safe; }
bool isSafe() const { return mSafe; }
+ bool skipProfiling() const { return mSkipProfiling; }
LLFeatureList *findMask(const std::string& name);
bool maskFeatures(const std::string& name);
@@ -170,6 +171,7 @@ protected:
F32 mExpectedGLVersion; //expected GL version according to gpu table
std::string mGPUString;
bool mGPUSupported;
+ bool mSkipProfiling = false;
};
inline
diff --git a/indra/newview/llfetchedgltfmaterial.cpp b/indra/newview/llfetchedgltfmaterial.cpp
index 558fc92018..a05f725673 100644
--- a/indra/newview/llfetchedgltfmaterial.cpp
+++ b/indra/newview/llfetchedgltfmaterial.cpp
@@ -222,6 +222,14 @@ void LLFetchedGLTFMaterial::updateTextureTracking()
}
}
+void LLFetchedGLTFMaterial::clearFetchedTextures()
+{
+ mBaseColorTexture = nullptr;
+ mNormalTexture = nullptr;
+ mMetallicRoughnessTexture = nullptr;
+ mEmissiveTexture = nullptr;
+}
+
void LLFetchedGLTFMaterial::materialBegin()
{
llassert(!mFetching);
diff --git a/indra/newview/llfetchedgltfmaterial.h b/indra/newview/llfetchedgltfmaterial.h
index 4a33b9f05f..074e3fef41 100644
--- a/indra/newview/llfetchedgltfmaterial.h
+++ b/indra/newview/llfetchedgltfmaterial.h
@@ -67,6 +67,7 @@ public:
LLPointer<LLViewerFetchedTexture> mNormalTexture;
LLPointer<LLViewerFetchedTexture> mMetallicRoughnessTexture;
LLPointer<LLViewerFetchedTexture> mEmissiveTexture;
+ void clearFetchedTextures();
std::set<LLTextureEntry*> mTextureEntires;
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 2516bece8d..d26a3784a2 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -64,7 +64,7 @@ LLFilePicker LLFilePicker::sInstance;
#define XML_FILTER L"XML files (*.xml)\0*.xml\0"
#define SLOBJECT_FILTER L"Objects (*.slobject)\0*.slobject\0"
#define RAW_FILTER L"RAW files (*.raw)\0*.raw\0"
-#define MODEL_FILTER L"Model files (*.dae)\0*.dae\0"
+#define MODEL_FILTER L"Model files (*.dae, *.gltf, *.glb)\0*.dae;*.gltf;*.glb\0"
#define MATERIAL_FILTER L"GLTF Files (*.gltf; *.glb)\0*.gltf;*.glb\0"
#define HDRI_FILTER L"HDRI Files (*.exr)\0*.exr\0"
#define MATERIAL_TEXTURES_FILTER L"GLTF Import (*.gltf; *.glb; *.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.gltf;*.glb;*.tga;*.bmp;*.jpg;*.jpeg;*.png\0"
@@ -222,6 +222,8 @@ bool LLFilePicker::setupFilter(ELoadFilter filter)
break;
case FFLOAD_MODEL:
mOFN.lpstrFilter = MODEL_FILTER \
+ COLLADA_FILTER \
+ MATERIAL_FILTER \
L"\0";
break;
case FFLOAD_MATERIAL:
@@ -290,7 +292,7 @@ bool LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
success = GetOpenFileName(&mOFN);
if (success)
{
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ std::string filename = ll_convert<std::string>(std::wstring(mFilesW));
mFiles.push_back(filename);
}
@@ -356,7 +358,7 @@ bool LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
// lengths.
if( wcslen(mOFN.lpstrFile) > mOFN.nFileOffset ) /*Flawfinder: ignore*/
{
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ std::string filename = ll_convert<std::string>(std::wstring(mFilesW));
mFiles.push_back(filename);
}
else
@@ -370,7 +372,7 @@ bool LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
break;
if (*tptrw == 0)
tptrw++; // shouldn't happen?
- std::string filename = utf16str_to_utf8str(llutf16string(tptrw));
+ std::string filename = ll_convert<std::string>(std::wstring(tptrw));
if (dirname.empty())
dirname = filename + "\\";
else
@@ -416,7 +418,7 @@ bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename,
mOFN.lpstrFile = mFilesW;
if (!filename.empty())
{
- llutf16string tstring = utf8str_to_utf16str(filename);
+ std::wstring tstring = ll_convert<std::wstring>(filename);
wcsncpy(mFilesW, tstring.c_str(), FILENAME_BUFFER_SIZE); } /*Flawfinder: ignore*/
else
{
@@ -598,7 +600,7 @@ bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename,
success = GetSaveFileName(&mOFN);
if (success)
{
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ std::string filename = ll_convert<std::string>(std::wstring(mFilesW));
mFiles.push_back(filename);
}
}
@@ -676,6 +678,8 @@ std::unique_ptr<std::vector<std::string>> LLFilePicker::navOpenFilterProc(ELoadF
case FFLOAD_HDRI:
allowedv->push_back("exr");
case FFLOAD_MODEL:
+ allowedv->push_back("gltf");
+ allowedv->push_back("glb");
case FFLOAD_COLLADA:
allowedv->push_back("dae");
break;
diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm
index b21bc724fb..6cb7c4ad51 100644
--- a/indra/newview/llfilepicker_mac.mm
+++ b/indra/newview/llfilepicker_mac.mm
@@ -1,25 +1,25 @@
-/**
+/**
* @file llfilepicker_mac.cpp
* @brief OS-specific file picker
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -32,15 +32,15 @@
NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned int flags)
{
int i;
-
+
NSOpenPanel *panel = [NSOpenPanel openPanel];
NSMutableArray *fileTypes = nil;
-
-
+
+
if ( allowed_types && !allowed_types->empty())
{
fileTypes = [[NSMutableArray alloc] init];
-
+
for (i=0;i<allowed_types->size();++i)
{
[fileTypes addObject:
@@ -48,7 +48,7 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned
encoding:[NSString defaultCStringEncoding]]];
}
}
-
+
//[panel setMessage:@"Import one or more files or directories."];
[panel setAllowsMultipleSelection: ( (flags & F_MULTIPLE)?true:false ) ];
[panel setCanChooseDirectories: ( (flags & F_DIRECTORY)?true:false ) ];
@@ -56,7 +56,7 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned
[panel setResolvesAliases: true];
[panel setCanChooseFiles: ( (flags & F_FILE)?true:false )];
[panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ];
-
+
if (fileTypes)
{
[panel setAllowedFileTypes:fileTypes];
@@ -77,7 +77,7 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::st
std::unique_ptr<std::vector<std::string>> outfiles;
@autoreleasepool
- {
+ {
int result;
//Aura TODO: We could init a small window and release it at the end of this routine
//for a modeless interface.
@@ -85,17 +85,17 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::st
NSOpenPanel *panel = init_panel(allowed_types,flags);
result = [panel runModal];
-
- if (result == NSOKButton)
+
+ if (result == NSModalResponseOK)
{
NSArray *filesToOpen = [panel URLs];
int i, count = [filesToOpen count];
-
+
if (count > 0)
{
outfiles.reset(new std::vector<std::string>);
}
-
+
for (i=0; i<count; i++) {
NSString *aFile = [[filesToOpen objectAtIndex:i] path];
std::string afilestr = std::string([aFile UTF8String]);
@@ -113,11 +113,11 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types,
{
@autoreleasepool
- {
+ {
// Note: might need to return and save this panel
// so that it does not close immediately
NSOpenPanel *panel = init_panel(allowed_types,flags);
-
+
[panel beginWithCompletionHandler:^(NSModalResponse result)
{
std::vector<std::string> outfiles;
@@ -125,10 +125,10 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types,
{
NSArray *filesToOpen = [panel URLs];
int i, count = [filesToOpen count];
-
+
if (count > 0)
{
-
+
for (i=0; i<count; i++) {
NSString *aFile = [[filesToOpen objectAtIndex:i] path];
std::string *afilestr = new std::string([aFile UTF8String]);
@@ -149,7 +149,7 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types,
}
}
-std::unique_ptr<std::string> doSaveDialog(const std::string* file,
+std::unique_ptr<std::string> doSaveDialog(const std::string* file,
const std::string* type,
const std::string* creator,
const std::string* extension,
@@ -157,23 +157,23 @@ std::unique_ptr<std::string> doSaveDialog(const std::string* file,
{
std::unique_ptr<std::string> outfile;
@autoreleasepool
- {
+ {
NSSavePanel *panel = [NSSavePanel savePanel];
-
+
NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]];
NSArray *fileType = [extensionns componentsSeparatedByString:@","];
-
+
//[panel setMessage:@"Save Image File"];
[panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ];
[panel setCanSelectHiddenExtension:true];
[panel setAllowedFileTypes:fileType];
NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]];
-
+
NSURL* url = [NSURL fileURLWithPath:fileName];
[panel setNameFieldStringValue: fileName];
[panel setDirectoryURL: url];
if([panel runModal] ==
- NSFileHandlingPanelOKButton)
+ NSModalResponseOK)
{
NSURL* url = [panel URL];
NSString* p = [url path];
@@ -193,39 +193,39 @@ void doSaveDialogModeless(const std::string* file,
void *userdata)
{
@autoreleasepool {
- NSSavePanel *panel = [NSSavePanel savePanel];
-
- NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]];
- NSArray *fileType = [extensionns componentsSeparatedByString:@","];
-
- //[panel setMessage:@"Save Image File"];
- [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ];
- [panel setCanSelectHiddenExtension:true];
- [panel setAllowedFileTypes:fileType];
- NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]];
-
- NSURL* url = [NSURL fileURLWithPath:fileName];
- [panel setNameFieldStringValue: fileName];
- [panel setDirectoryURL: url];
-
-
- [panel beginWithCompletionHandler:^(NSModalResponse result)
- {
- if (result == NSOKButton)
- {
- NSURL* url = [panel URL];
- NSString* p = [url path];
- std::string outfile([p UTF8String]);
-
- callback(true, outfile, userdata);
- }
- else // cancel
- {
- std::string outfile;
- callback(false, outfile, userdata);
- }
- }];
- }
+ NSSavePanel *panel = [NSSavePanel savePanel];
+
+ NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]];
+ NSArray *fileType = [extensionns componentsSeparatedByString:@","];
+
+ //[panel setMessage:@"Save Image File"];
+ [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ];
+ [panel setCanSelectHiddenExtension:true];
+ [panel setAllowedFileTypes:fileType];
+ NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]];
+
+ NSURL* url = [NSURL fileURLWithPath:fileName];
+ [panel setNameFieldStringValue: fileName];
+ [panel setDirectoryURL: url];
+
+
+ [panel beginWithCompletionHandler:^(NSModalResponse result)
+ {
+ if (result == NSModalResponseOK)
+ {
+ NSURL* url = [panel URL];
+ NSString* p = [url path];
+ std::string outfile([p UTF8String]);
+
+ callback(true, outfile, userdata);
+ }
+ else // cancel
+ {
+ std::string outfile;
+ callback(false, outfile, userdata);
+ }
+ }];
+ }
}
#endif
diff --git a/indra/newview/llfloaterautoreplacesettings.cpp b/indra/newview/llfloaterautoreplacesettings.cpp
index 99f24e161e..d93bd624f5 100644
--- a/indra/newview/llfloaterautoreplacesettings.cpp
+++ b/indra/newview/llfloaterautoreplacesettings.cpp
@@ -422,7 +422,13 @@ bool LLFloaterAutoReplaceSettings::callbackNewListName(const LLSD& notification,
LLSD newList = notification["payload"]["list"];
- if ( response.has("listname") && response["listname"].isString() )
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 1) // Must also match RenameAutoReplaceList
+ {
+ // user cancelled
+ return false;
+ }
+ else if (response.has("listname") && response["listname"].isString() )
{
std::string newName = response["listname"].asString();
LLAutoReplaceSettings::setListName(newList, newName);
@@ -508,12 +514,53 @@ bool LLFloaterAutoReplaceSettings::callbackListNameConflict(const LLSD& notifica
return false;
}
+bool LLFloaterAutoReplaceSettings::callbackRemoveList(const LLSD& notification, const LLSD& response)
+{
+ std::string listName = notification["payload"]["list"];
+
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ switch (option)
+ {
+ case 1:
+ if (mSettings.removeReplacementList(listName))
+ {
+ LL_INFOS("AutoReplace") << "deleted list '" << listName << "'" << LL_ENDL;
+ mReplacementsList->deleteSelectedItems(); // remove from the scrolling list
+ mSelectedListName.clear();
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+ }
+ break;
+ case 0:
+ break;
+
+ default:
+ LL_ERRS("AutoReplace") << "invalid selected option " << option << LL_ENDL;
+ }
+
+ return false;
+}
+
void LLFloaterAutoReplaceSettings::onDeleteList()
{
std::string listName = mListNames->getSelectedValue().asString();
if ( ! listName.empty() )
{
- if ( mSettings.removeReplacementList(listName) )
+ const LLSD* mappings = mSettings.getListEntries(mSelectedListName);
+ if (mappings->size() > 0)
+ {
+ LLSD payload;
+ payload["list"] = listName;
+
+ LLSD args;
+ args["MAP_SIZE"] = llformat("%d",mappings->size());
+ args["LIST_NAME"] = listName;
+
+ LLNotificationsUtil::add("RemoveAutoReplaceList", args, payload,
+ boost::bind(&LLFloaterAutoReplaceSettings::callbackRemoveList, this, _1, _2));
+ }
+ else if ( mSettings.removeReplacementList(listName) )
{
LL_INFOS("AutoReplace")<<"deleted list '"<<listName<<"'"<<LL_ENDL;
mReplacementsList->deleteSelectedItems(); // remove from the scrolling list
diff --git a/indra/newview/llfloaterautoreplacesettings.h b/indra/newview/llfloaterautoreplacesettings.h
index 94a7c00c15..1a8068ab7c 100644
--- a/indra/newview/llfloaterautoreplacesettings.h
+++ b/indra/newview/llfloaterautoreplacesettings.h
@@ -105,6 +105,8 @@ private:
bool callbackNewListName(const LLSD& notification, const LLSD& response);
/// called from the RenameAutoReplaceList notification dialog
bool callbackListNameConflict(const LLSD& notification, const LLSD& response);
+ /// called from the RemoveAutoReplaceList notification dialog
+ bool callbackRemoveList(const LLSD& notification, const LLSD& response);
bool selectedListIsFirst();
bool selectedListIsLast();
diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatar.cpp
deleted file mode 100644
index 404316275d..0000000000
--- a/indra/newview/llfloateravatar.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @file llfloateravatar.h
- * @author Leyla Farazha
- * @brief floater for the avatar changer
- *
- * $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 "llfloateravatar.h"
-#include "lluictrlfactory.h"
-#include "llmediactrl.h"
-
-
-LLFloaterAvatar::LLFloaterAvatar(const LLSD& key)
- : LLFloater(key)
-{
-}
-
-LLFloaterAvatar::~LLFloaterAvatar()
-{
- if (mAvatarPicker)
- {
- mAvatarPicker->navigateStop();
- mAvatarPicker->clearCache(); //images are reloading each time already
- mAvatarPicker->unloadMediaSource();
- }
-}
-
-bool LLFloaterAvatar::postBuild()
-{
- mAvatarPicker = findChild<LLMediaCtrl>("avatar_picker_contents");
- if (mAvatarPicker)
- {
- mAvatarPicker->clearCache();
- }
- enableResizeCtrls(true, true, false);
- return true;
-}
-
-
diff --git a/indra/newview/llfloateravatar.h b/indra/newview/llfloateravatar.h
deleted file mode 100644
index fb591c8306..0000000000
--- a/indra/newview/llfloateravatar.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * @file llfloateravatar.h
- * @author Leyla Farazha
- * @brief floater for the avatar changer
- *
- * $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$
- */
-
-#ifndef LL_FLOATER_AVATAR_H
-#define LL_FLOATER_AVATAR_H
-
-#include "llfloater.h"
-class LLMediaCtrl;
-
-class LLFloaterAvatar:
- public LLFloater
-{
- friend class LLFloaterReg;
-private:
- LLFloaterAvatar(const LLSD& key);
- ~LLFloaterAvatar();
- bool postBuild() override;
-
- LLMediaCtrl* mAvatarPicker;
-};
-
-#endif
diff --git a/indra/newview/llfloateravatarwelcomepack.cpp b/indra/newview/llfloateravatarwelcomepack.cpp
new file mode 100644
index 0000000000..be384bf4d1
--- /dev/null
+++ b/indra/newview/llfloateravatarwelcomepack.cpp
@@ -0,0 +1,64 @@
+/**
+ * @file llfloateravatarwelcomepack.cpp
+ * @author Callum Prentice (callum@lindenlab.com)
+ * @brief Floater container for the Avatar Welcome Pack we app
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * 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 "llfloateravatarwelcomepack.h"
+#include "llmediactrl.h"
+#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
+
+LLFloaterAvatarWelcomePack::LLFloaterAvatarWelcomePack(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLFloaterAvatarWelcomePack::~LLFloaterAvatarWelcomePack()
+{
+ if (mAvatarPicker)
+ {
+ mAvatarPicker->navigateStop();
+ mAvatarPicker->clearCache(); //images are reloading each time already
+ mAvatarPicker->unloadMediaSource();
+ }
+}
+
+bool LLFloaterAvatarWelcomePack::postBuild()
+{
+ mAvatarPicker = findChild<LLMediaCtrl>("avatar_picker_contents");
+ if (mAvatarPicker)
+ {
+ mAvatarPicker->clearCache();
+ mAvatarPicker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("AvatarWelcomePack");
+ url = LLWeb::expandURLSubstitutions(url, LLSD());
+ mAvatarPicker->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+ }
+
+ return true;
+}
diff --git a/indra/newview/llfloateravatarwelcomepack.h b/indra/newview/llfloateravatarwelcomepack.h
new file mode 100644
index 0000000000..a332d46708
--- /dev/null
+++ b/indra/newview/llfloateravatarwelcomepack.h
@@ -0,0 +1,45 @@
+/**
+ * @file llfloateravatarwelcomepack.h
+ * @author Callum Prentice (callum@lindenlab.com)
+ * @brief Floater container for the Avatar Welcome Pack we app
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#pragma once
+
+#include "llfloater.h"
+
+class LLMediaCtrl;
+
+class LLFloaterAvatarWelcomePack:
+ public LLFloater
+{
+ friend class LLFloaterReg;
+
+ private:
+ LLFloaterAvatarWelcomePack(const LLSD& key);
+ ~LLFloaterAvatarWelcomePack();
+ bool postBuild() override;
+
+ LLMediaCtrl* mAvatarPicker;
+};
diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp
index c09c02d32b..74c5079268 100644
--- a/indra/newview/llfloaterbulkpermission.cpp
+++ b/indra/newview/llfloaterbulkpermission.cpp
@@ -89,9 +89,17 @@ bool LLFloaterBulkPermission::postBuild()
{
mBulkChangeNextOwnerTransfer = true;
}
+
+ mQueueOutputList = getChild<LLScrollListCtrl>("queue output");
return true;
}
+void LLFloaterBulkPermission::onClose(bool app_quitting)
+{
+ removeVOInventoryListener();
+ LLFloater::onClose(app_quitting);
+}
+
void LLFloaterBulkPermission::doApply()
{
// Inspects a stream of selected object contents and adds modifiable ones to the given array.
@@ -216,7 +224,7 @@ void LLFloaterBulkPermission::onCommitCopy()
bool LLFloaterBulkPermission::start()
{
// note: number of top-level objects to modify is mObjectIDs.size().
- getChild<LLScrollListCtrl>("queue output")->setCommentText(getString("start_text"));
+ mQueueOutputList->setCommentText(getString("start_text"));
return nextObject();
}
@@ -239,7 +247,7 @@ bool LLFloaterBulkPermission::nextObject()
if(isDone() && !mDone)
{
- getChild<LLScrollListCtrl>("queue output")->setCommentText(getString("done_text"));
+ mQueueOutputList->setCommentText(getString("done_text"));
mDone = true;
}
return successful_start;
@@ -294,8 +302,6 @@ void LLFloaterBulkPermission::doCheckUncheckAll(bool check)
void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInventoryObject::object_list_t* inv)
{
- LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
-
LLInventoryObject::object_list_t::const_iterator it = inv->begin();
LLInventoryObject::object_list_t::const_iterator end = inv->end();
for ( ; it != end; ++it)
@@ -362,7 +368,7 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInve
status_text.setArg("[STATUS]", "");
}
- list->setCommentText(status_text.getString());
+ mQueueOutputList->setCommentText(status_text.getString());
//TODO if we are an object inside an object we should check a recuse flag and if set
//open the inventory of the object and recurse - Michelle2 Zenovka
diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h
index 23ca45b611..0b61022e0c 100644
--- a/indra/newview/llfloaterbulkpermission.h
+++ b/indra/newview/llfloaterbulkpermission.h
@@ -41,7 +41,8 @@ class LLFloaterBulkPermission : public LLFloater, public LLVOInventoryListener
friend class LLFloaterReg;
public:
- bool postBuild();
+ bool postBuild() override;
+ void onClose(bool app_quitting) override;
private:
@@ -57,7 +58,7 @@ private:
/*virtual*/ void inventoryChanged(LLViewerObject* obj,
LLInventoryObject::object_list_t* inv,
S32 serial_num,
- void* queue);
+ void* queue) override;
// This is called by inventoryChanged
void handleInventory(LLViewerObject* viewer_obj,
@@ -85,7 +86,7 @@ private:
private:
// UI
- LLScrollListCtrl* mMessages;
+ LLScrollListCtrl* mQueueOutputList = nullptr;
LLButton* mCloseBtn;
// Object Queue
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index b94c31ec04..392079efe4 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -118,8 +118,8 @@ std::string STATUS[] =
//-----------------------------------------------------------------------------
// LLFloaterBvhPreview()
//-----------------------------------------------------------------------------
-LLFloaterBvhPreview::LLFloaterBvhPreview(const std::string& filename) :
- LLFloaterNameDesc(filename)
+LLFloaterBvhPreview::LLFloaterBvhPreview(const LLSD& args) :
+ LLFloaterNameDesc(args)
{
mLastMouseX = 0;
mLastMouseY = 0;
@@ -179,7 +179,7 @@ void LLFloaterBvhPreview::setAnimCallbacks()
getChild<LLUICtrl>("ease_out_time")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateEaseOut, this, _1));
}
-std::map <std::string, std::string> LLFloaterBvhPreview::getJointAliases()
+std::map<std::string, std::string, std::less<>> LLFloaterBvhPreview::getJointAliases()
{
LLPointer<LLVOAvatar> av = (LLVOAvatar*)mAnimPreview->getDummyAvatar();
return av->getJointAliases();
@@ -252,7 +252,7 @@ bool LLFloaterBvhPreview::postBuild()
ELoadStatus load_status = E_ST_OK;
S32 line_number = 0;
- std::map<std::string, std::string> joint_alias_map = getJointAliases();
+ auto joint_alias_map = getJointAliases();
loaderp = new LLBVHLoader(file_buffer, load_status, line_number, joint_alias_map);
std::string status = getString(STATUS[load_status]);
@@ -1028,7 +1028,8 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
LLFloaterPerms::getNextOwnerPerms("Uploads"),
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
- expected_upload_cost));
+ expected_upload_cost,
+ floaterp->mDestinationFolderId));
upload_new_resource(assetUploadInfo);
}
diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h
index ae64521492..1eb7f686fd 100644
--- a/indra/newview/llfloaterbvhpreview.h
+++ b/indra/newview/llfloaterbvhpreview.h
@@ -70,7 +70,7 @@ protected:
class LLFloaterBvhPreview : public LLFloaterNameDesc
{
public:
- LLFloaterBvhPreview(const std::string& filename);
+ LLFloaterBvhPreview(const LLSD& args);
virtual ~LLFloaterBvhPreview();
bool postBuild();
@@ -108,7 +108,7 @@ public:
S32 status, LLExtStat ext_status);
private:
void setAnimCallbacks() ;
- std::map <std::string, std::string> getJointAliases();
+ std::map<std::string, std::string, std::less<>> getJointAliases();
protected:
diff --git a/indra/newview/llfloaterchatmentionpicker.cpp b/indra/newview/llfloaterchatmentionpicker.cpp
new file mode 100644
index 0000000000..a3eb286375
--- /dev/null
+++ b/indra/newview/llfloaterchatmentionpicker.cpp
@@ -0,0 +1,184 @@
+/**
+ * @file llfloaterchatmentionpicker.cpp
+ *
+ * $LicenseInfo:firstyear=2025&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2025, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterchatmentionpicker.h"
+
+#include "llavatarlist.h"
+#include "llfloaterimcontainer.h"
+#include "llchatmentionhelper.h"
+#include "llparticipantlist.h"
+
+LLUUID LLFloaterChatMentionPicker::sSessionID(LLUUID::null);
+
+LLFloaterChatMentionPicker::LLFloaterChatMentionPicker(const LLSD& key)
+: LLFloater(key), mAvatarList(NULL)
+{
+ // This floater should hover on top of our dependent (with the dependent having the focus)
+ setFocusStealsFrontmost(false);
+ setBackgroundVisible(false);
+ setAutoFocus(false);
+}
+
+bool LLFloaterChatMentionPicker::postBuild()
+{
+ mAvatarList = getChild<LLAvatarList>("avatar_list");
+ mAvatarList->setShowCompleteName(true, true);
+ mAvatarList->setFocusOnItemClicked(false);
+ mAvatarList->setItemClickedCallback([this](LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
+ {
+ if (LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(ctrl))
+ {
+ selectResident(item->getAvatarId());
+ }
+ });
+ mAvatarList->setRefreshCompleteCallback([this](LLUICtrl* ctrl, const LLSD& param)
+ {
+ if (mAvatarList->numSelected() == 0)
+ {
+ mAvatarList->selectFirstItem();
+ }
+ });
+
+ return LLFloater::postBuild();
+}
+
+void LLFloaterChatMentionPicker::onOpen(const LLSD& key)
+{
+ buildAvatarList();
+ mAvatarList->setNameFilter(key.has("av_name") ? key["av_name"].asString() : "");
+
+ gFloaterView->adjustToFitScreen(this, false);
+}
+
+uuid_vec_t LLFloaterChatMentionPicker::getParticipantIds()
+{
+ LLParticipantList* item = dynamic_cast<LLParticipantList*>(LLFloaterIMContainer::getInstance()->getSessionModel(sSessionID));
+ if (!item)
+ {
+ LL_WARNS() << "Participant list is missing" << LL_ENDL;
+ return {};
+ }
+
+ uuid_vec_t avatar_ids;
+ LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = item->getChildrenBegin();
+ LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd();
+ while (current_participant_model != end_participant_model)
+ {
+ LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>((*current_participant_model).get());
+ if (participant_model)
+ {
+ avatar_ids.push_back(participant_model->getUUID());
+ }
+ current_participant_model++;
+ }
+ return avatar_ids;
+}
+
+void LLFloaterChatMentionPicker::buildAvatarList()
+{
+ uuid_vec_t& avatar_ids = mAvatarList->getIDs();
+ avatar_ids = getParticipantIds();
+ updateAvatarList(avatar_ids);
+ mAvatarList->setDirty();
+}
+
+void LLFloaterChatMentionPicker::selectResident(const LLUUID& id)
+{
+ if (id.isNull())
+ return;
+
+ setValue(stringize("secondlife:///app/agent/", id.asString(), "/mention "));
+ onCommit();
+ LLChatMentionHelper::instance().hideHelper();
+}
+
+void LLFloaterChatMentionPicker::onClose(bool app_quitting)
+{
+ if (!app_quitting)
+ {
+ LLChatMentionHelper::instance().hideHelper();
+ }
+}
+
+bool LLFloaterChatMentionPicker::handleKey(KEY key, MASK mask, bool called_from_parent)
+{
+ if (mask == MASK_NONE)
+ {
+ switch (key)
+ {
+ case KEY_UP:
+ case KEY_DOWN:
+ return mAvatarList->handleKey(key, mask, called_from_parent);
+ case KEY_RETURN:
+ case KEY_TAB:
+ selectResident(mAvatarList->getSelectedUUID());
+ return true;
+ case KEY_ESCAPE:
+ LLChatMentionHelper::instance().hideHelper();
+ return true;
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ return true;
+ default:
+ break;
+ }
+ }
+ return LLFloater::handleKey(key, mask, called_from_parent);
+}
+
+void LLFloaterChatMentionPicker::goneFromFront()
+{
+ LLChatMentionHelper::instance().hideHelper();
+}
+
+void LLFloaterChatMentionPicker::updateSessionID(LLUUID session_id)
+{
+ sSessionID = session_id;
+
+ LLParticipantList* item = dynamic_cast<LLParticipantList*>(LLFloaterIMContainer::getInstance()->getSessionModel(sSessionID));
+ if (!item)
+ {
+ LL_WARNS() << "Participant list is missing" << LL_ENDL;
+ return;
+ }
+
+ uuid_vec_t avatar_ids = getParticipantIds();
+ updateAvatarList(avatar_ids);
+}
+
+void LLFloaterChatMentionPicker::updateAvatarList(uuid_vec_t& avatar_ids)
+{
+ std::vector<std::string> av_names;
+ for (auto& id : avatar_ids)
+ {
+ LLAvatarName av_name;
+ LLAvatarNameCache::get(id, &av_name);
+ av_names.push_back(utf8str_tolower(av_name.getAccountName()));
+ av_names.push_back(utf8str_tolower(av_name.getDisplayName()));
+ }
+ LLChatMentionHelper::instance().updateAvatarList(av_names);
+}
diff --git a/indra/newview/llfloaterchatmentionpicker.h b/indra/newview/llfloaterchatmentionpicker.h
new file mode 100644
index 0000000000..8d221d7a89
--- /dev/null
+++ b/indra/newview/llfloaterchatmentionpicker.h
@@ -0,0 +1,58 @@
+/**
+ * @file llfloaterchatmentionpicker.h
+ *
+ * $LicenseInfo:firstyear=2025&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2025, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLFLOATERCHATMENTIONPICKER_H
+#define LLFLOATERCHATMENTIONPICKER_H
+
+#include "llfloater.h"
+
+class LLAvatarList;
+
+class LLFloaterChatMentionPicker : public LLFloater
+{
+public:
+ LLFloaterChatMentionPicker(const LLSD& key);
+
+ virtual bool postBuild() override;
+ virtual void goneFromFront() override;
+
+ void buildAvatarList();
+
+ static uuid_vec_t getParticipantIds();
+ static void updateSessionID(LLUUID session_id);
+ static void updateAvatarList(uuid_vec_t& avatar_ids);
+
+private:
+
+ void onOpen(const LLSD& key) override;
+ void onClose(bool app_quitting) override;
+ virtual bool handleKey(KEY key, MASK mask, bool called_from_parent) override;
+ void selectResident(const LLUUID& id);
+
+ static LLUUID sSessionID;
+ LLAvatarList* mAvatarList;
+};
+
+#endif
diff --git a/indra/newview/llfloaterdestinations.cpp b/indra/newview/llfloaterdestinations.cpp
index fad9693e8f..84fc4afcdd 100644
--- a/indra/newview/llfloaterdestinations.cpp
+++ b/indra/newview/llfloaterdestinations.cpp
@@ -28,7 +28,10 @@
#include "llviewerprecompiledheaders.h"
#include "llfloaterdestinations.h"
+#include "llmediactrl.h"
#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
LLFloaterDestinations::LLFloaterDestinations(const LLSD& key)
@@ -43,6 +46,15 @@ LLFloaterDestinations::~LLFloaterDestinations()
bool LLFloaterDestinations::postBuild()
{
enableResizeCtrls(true, true, false);
+ LLMediaCtrl* destinations = getChild<LLMediaCtrl>("destination_guide_contents");
+ destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("DestinationGuideURL");
+ url = LLWeb::expandURLSubstitutions(url, LLSD());
+ destinations->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+
+ // If cookie is there, will set it now. Otherwise will have to wait for login completion
+ // which will also update destinations instance if it already exists.
+ LLViewerMedia::getInstance()->getOpenIDCookie(destinations);
return true;
}
diff --git a/indra/newview/llfloaterdisplayname.cpp b/indra/newview/llfloaterdisplayname.cpp
index 236aadfbc1..4843a48e66 100644
--- a/indra/newview/llfloaterdisplayname.cpp
+++ b/indra/newview/llfloaterdisplayname.cpp
@@ -56,6 +56,7 @@ private:
void onCacheSetName(bool success,
const std::string& reason,
const LLSD& content);
+ bool mIsLockedOut = false;
};
LLFloaterDisplayName::LLFloaterDisplayName(const LLSD& key) :
@@ -72,8 +73,8 @@ void LLFloaterDisplayName::onOpen(const LLSD& key)
LLAvatarNameCache::get(gAgent.getID(), &av_name);
F64 now_secs = LLDate::now().secondsSinceEpoch();
-
- if (now_secs < av_name.mNextUpdate)
+ mIsLockedOut = now_secs < av_name.mNextUpdate;
+ if (mIsLockedOut)
{
// ...can't update until some time in the future
F64 next_update_local_secs =
@@ -167,18 +168,19 @@ void LLFloaterDisplayName::onReset()
}
getChild<LLUICtrl>("display_name_editor")->setValue(av_name.getUserName());
- if (getChild<LLUICtrl>("display_name_editor")->getEnabled())
+ if (mIsLockedOut)
{
- // UI is enabled, fill the first field
- getChild<LLUICtrl>("display_name_confirm")->clear();
- getChild<LLUICtrl>("display_name_confirm")->setFocus(true);
+ // UI is disabled.
+ // We should allow resetting even if user already
+ // set a display name, enable save button
+ getChild<LLUICtrl>("display_name_confirm")->setValue(av_name.getUserName());
+ getChild<LLUICtrl>("save_btn")->setEnabled(true);
}
else
{
- // UI is disabled, looks like we should allow resetting
- // even if user already set a display name, enable save button
- getChild<LLUICtrl>("display_name_confirm")->setValue(av_name.getUserName());
- getChild<LLUICtrl>("save_btn")->setEnabled(true);
+ // UI is enabled, focus on the confirm field
+ getChild<LLUICtrl>("display_name_confirm")->clear();
+ getChild<LLUICtrl>("display_name_confirm")->setFocus(true);
}
}
diff --git a/indra/newview/llfloatereditenvironmentbase.h b/indra/newview/llfloatereditenvironmentbase.h
index 37fda5d33e..41192f3d30 100644
--- a/indra/newview/llfloatereditenvironmentbase.h
+++ b/indra/newview/llfloatereditenvironmentbase.h
@@ -133,7 +133,8 @@ protected:
LLSettingsEditPanel() :
LLPanel(),
mIsDirty(false),
- mOnDirtyChanged()
+ mOnDirtyChanged(),
+ mCanEdit(false)
{}
private:
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 42307dd3f8..0a8b8d321d 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -495,7 +495,6 @@ void LLFloaterEditExtDayCycle::setEditDayCycle(const LLSettingsDay::ptr_t &pday)
updateEditEnvironment();
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT);
- LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT);
synchronizeTabs();
updateTabs();
refresh();
@@ -824,7 +823,6 @@ void LLFloaterEditExtDayCycle::onClearTrack()
updateEditEnvironment();
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT);
- LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT);
synchronizeTabs();
updateTabs();
refresh();
diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp
index ffbda0265d..b7f4df874c 100644
--- a/indra/newview/llfloateremojipicker.cpp
+++ b/indra/newview/llfloateremojipicker.cpp
@@ -377,6 +377,9 @@ void LLFloaterEmojiPicker::initialize()
{
if (!mHint.empty())
{
+ // Hack: Trying to open floater, search for a match,
+ // and hide floater immediately if no match found,
+ // instead of checking prior to opening
hideFloater();
return;
}
@@ -406,6 +409,12 @@ void LLFloaterEmojiPicker::initialize()
return;
}
+ if (!mHint.empty() && getSoundFlags() == LLView::SILENT)
+ {
+ // Sounds were supressed
+ make_ui_sound("UISndWindowOpen");
+ }
+
mGroups->setVisible(true);
mPreview->setIcon(nullptr);
showPreview(true);
@@ -1285,7 +1294,7 @@ void LLFloaterEmojiPicker::saveState()
if (!recentlyUsed.empty())
recentlyUsed += ",";
char buffer[32];
- sprintf(buffer, "%u", (U32)emoji);
+ snprintf(buffer, sizeof(buffer), "%u", (U32)emoji);
recentlyUsed += buffer;
if (!--maxCount)
break;
@@ -1302,7 +1311,7 @@ void LLFloaterEmojiPicker::saveState()
if (!frequentlyUsed.empty())
frequentlyUsed += ",";
char buffer[32];
- sprintf(buffer, "%u:%u", (U32)it.first, (U32)it.second);
+ snprintf(buffer, sizeof(buffer), "%u:%u", (U32)it.first, (U32)it.second);
frequentlyUsed += buffer;
if (!--maxCount)
break;
diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp
index 35f8340997..4825cbf7fb 100644
--- a/indra/newview/llfloaterenvironmentadjust.cpp
+++ b/indra/newview/llfloaterenvironmentadjust.cpp
@@ -242,9 +242,7 @@ void LLFloaterEnvironmentAdjust::captureCurrentEnvironment()
environment.setEnvironment(LLEnvironment::ENV_LOCAL, mLiveSky, FLOATER_ENVIRONMENT_UPDATE);
environment.setEnvironment(LLEnvironment::ENV_LOCAL, mLiveWater, FLOATER_ENVIRONMENT_UPDATE);
}
- environment.setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
- environment.updateEnvironment(LLEnvironment::TRANSITION_INSTANT);
-
+ environment.setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_INSTANT);
}
void LLFloaterEnvironmentAdjust::onButtonReset()
@@ -258,7 +256,6 @@ void LLFloaterEnvironmentAdjust::onButtonReset()
this->closeFloater();
LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_LOCAL);
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
- LLEnvironment::instance().updateEnvironment();
}
});
@@ -455,9 +452,29 @@ void LLFloaterEnvironmentAdjust::onMoonAzimElevChanged()
void LLFloaterEnvironmentAdjust::onCloudMapChanged()
{
if (!mLiveSky)
+ {
return;
- mLiveSky->setCloudNoiseTextureId(getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->getValue().asUUID());
- mLiveSky->update();
+ }
+
+ LLTextureCtrl* picker_ctrl = getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP);
+
+ LLUUID new_texture_id = picker_ctrl->getValue().asUUID();
+
+ LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
+
+ LLSettingsSky::ptr_t sky_to_set = mLiveSky->buildClone();
+ if (!sky_to_set)
+ {
+ return;
+ }
+
+ sky_to_set->setCloudNoiseTextureId(new_texture_id);
+
+ LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, sky_to_set);
+
+ LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT, true);
+
+ picker_ctrl->setValue(new_texture_id);
}
void LLFloaterEnvironmentAdjust::onWaterMapChanged()
diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index d28c987414..1825797159 100644
--- a/indra/newview/llfloaterfixedenvironment.cpp
+++ b/indra/newview/llfloaterfixedenvironment.cpp
@@ -134,12 +134,15 @@ void LLFloaterFixedEnvironment::onClose(bool app_quitting)
{
doCloseInventoryFloater(app_quitting);
- LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
- LLEnvironment::instance().setCurrentEnvironmentSelection(LLEnvironment::ENV_LOCAL);
- LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT);
+ if (!app_quitting)
+ {
+ LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
+ LLEnvironment::instance().setCurrentEnvironmentSelection(LLEnvironment::ENV_LOCAL);
+ LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT);
- mSettings.reset();
- syncronizeTabs();
+ mSettings.reset();
+ syncronizeTabs();
+ }
}
void LLFloaterFixedEnvironment::refresh()
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 989e1d8d04..c924807273 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -32,6 +32,7 @@
#include "llimagetga.h"
#include "llimagejpeg.h"
#include "llimagepng.h"
+#include "llimagej2c.h"
#include "llagent.h"
#include "llagentbenefits.h"
@@ -43,6 +44,10 @@
#include "llrender.h"
#include "llface.h"
#include "llfocusmgr.h"
+#include "llfilesystem.h"
+#include "llfloaterperms.h"
+#include "llnotificationsutil.h"
+#include "llstatusbar.h" // can_afford_transaction()
#include "lltextbox.h"
#include "lltoolmgr.h"
#include "llui.h"
@@ -52,6 +57,7 @@
#include "llvoavatar.h"
#include "pipeline.h"
#include "lluictrlfactory.h"
+#include "llviewermenufile.h" // upload_new_resource()
#include "llviewershadermgr.h"
#include "llviewertexturelist.h"
#include "llstring.h"
@@ -72,8 +78,8 @@ const S32 PREVIEW_TEXTURE_HEIGHT = 320;
//-----------------------------------------------------------------------------
// LLFloaterImagePreview()
//-----------------------------------------------------------------------------
-LLFloaterImagePreview::LLFloaterImagePreview(const std::string& filename) :
- LLFloaterNameDesc(filename),
+LLFloaterImagePreview::LLFloaterImagePreview(const LLSD& args) :
+ LLFloaterNameDesc(args),
mAvatarPreview(NULL),
mSculptedPreview(NULL),
@@ -140,7 +146,7 @@ bool LLFloaterImagePreview::postBuild()
}
}
- getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this));
+ getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterImagePreview::onBtnOK, this));
return true;
}
@@ -244,6 +250,69 @@ void LLFloaterImagePreview::clearAllPreviewTextures()
}
//-----------------------------------------------------------------------------
+// onBtnOK()
+//-----------------------------------------------------------------------------
+void LLFloaterImagePreview::onBtnOK()
+{
+ getChildView("ok_btn")->setEnabled(false); // don't allow inadvertent extra uploads
+
+ S32 expected_upload_cost = getExpectedUploadCost();
+ if (can_afford_transaction(expected_upload_cost))
+ {
+ LL_INFOS() << "saving texture: " << mRawImagep->getWidth() << "x" << mRawImagep->getHeight() << LL_ENDL;
+ // gen a new uuid for this asset
+ LLTransactionID tid;
+ tid.generate();
+ LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ LLPointer<LLImageJ2C> formatted = new LLImageJ2C;
+
+ if (mRawImagep->getWidth() * mRawImagep->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
+ {
+ if (gSavedSettings.getBOOL("LosslessJ2CUpload"))
+ {
+ formatted->setReversible(true);
+ }
+ }
+
+ if (formatted->encode(mRawImagep, 0.0f))
+ {
+ LLFileSystem fmt_file(new_asset_id, LLAssetType::AT_TEXTURE, LLFileSystem::WRITE);
+ fmt_file.write(formatted->getData(), formatted->getDataSize());
+
+ LLResourceUploadInfo::ptr_t assetUploadInfo(new LLResourceUploadInfo(
+ tid, LLAssetType::AT_TEXTURE,
+ getChild<LLUICtrl>("name_form")->getValue().asString(),
+ getChild<LLUICtrl>("description_form")->getValue().asString(),
+ 0,
+ LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
+ expected_upload_cost
+ ));
+
+ upload_new_resource(assetUploadInfo);
+ }
+ else
+ {
+ LLSD args;
+ args["REASON"] = LLImage::getLastThreadError();
+ LLNotificationsUtil::add("ErrorEncodingImage", args);
+ LL_WARNS() << "Error encoding image" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LLSD args;
+ args["COST"] = llformat("%d", expected_upload_cost);
+ LLNotificationsUtil::add("ErrorCannotAffordUpload", args);
+ }
+
+ closeFloater(false);
+}
+
+//-----------------------------------------------------------------------------
// draw()
//-----------------------------------------------------------------------------
void LLFloaterImagePreview::draw()
@@ -364,16 +433,15 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename)
return false;
}
- S32 max_width = gSavedSettings.getS32("max_texture_dimension_X");
- S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y");
+ // raw image is limited to 256MB so need at least some upper limit that fits into that
+ constexpr S32 MAX_IMAGE_AREA = 8096 * 8096;
- if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height))
+ if (image_info.getWidth() * image_info.getHeight() > MAX_IMAGE_AREA)
{
LLStringUtil::format_map_t args;
- args["WIDTH"] = llformat("%d", max_width);
- args["HEIGHT"] = llformat("%d", max_height);
+ args["PIXELS"] = llformat("%dM", (S32)(MAX_IMAGE_AREA / 1000000));
- mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args);
+ mImageLoadError = LLTrans::getString("texture_load_area_error", args);
return false;
}
@@ -399,6 +467,46 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename)
image->setLastError("Image files with less than 3 or more than 4 components are not supported.");
return false;
}
+ // Downscale images to fit the max_texture_dimensions_*
+ S32 max_width = gSavedSettings.getS32("max_texture_dimension_X");
+ S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y");
+
+ S32 orig_width = raw_image->getWidth();
+ S32 orig_height = raw_image->getHeight();
+
+ if (orig_width > max_width || orig_height > max_height)
+ {
+ // Calculate scale factors
+ F32 width_scale = (F32)max_width / (F32)orig_width;
+ F32 height_scale = (F32)max_height / (F32)orig_height;
+ F32 scale = llmin(width_scale, height_scale);
+
+ // Calculate new dimensions, preserving aspect ratio
+ S32 new_width = LLImageRaw::contractDimToPowerOfTwo(
+ llclamp((S32)llroundf(orig_width * scale), 4, max_width)
+ );
+ S32 new_height = LLImageRaw::contractDimToPowerOfTwo(
+ llclamp((S32)llroundf(orig_height * scale), 4, max_height)
+ );
+
+ if (!raw_image->scale(new_width, new_height))
+ {
+ LL_WARNS() << "Failed to scale image from "
+ << orig_width << "x" << orig_height
+ << " to " << new_width << "x" << new_height << LL_ENDL;
+ return false;
+ }
+
+ // Inform the resident about the resized image
+ LLSD subs;
+ subs["[ORIGINAL_WIDTH]"] = orig_width;
+ subs["[ORIGINAL_HEIGHT]"] = orig_height;
+ subs["[NEW_WIDTH]"] = new_width;
+ subs["[NEW_HEIGHT]"] = new_height;
+ subs["[MAX_WIDTH]"] = max_width;
+ subs["[MAX_HEIGHT]"] = max_height;
+ LLNotificationsUtil::add("ImageUploadResized", subs);
+ }
raw_image->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
mRawImagep = raw_image;
diff --git a/indra/newview/llfloaterimagepreview.h b/indra/newview/llfloaterimagepreview.h
index ed395722de..5e5f4932c2 100644
--- a/indra/newview/llfloaterimagepreview.h
+++ b/indra/newview/llfloaterimagepreview.h
@@ -110,7 +110,7 @@ protected:
class LLFloaterImagePreview : public LLFloaterNameDesc
{
public:
- LLFloaterImagePreview(const std::string& filename);
+ LLFloaterImagePreview(const LLSD& args);
virtual ~LLFloaterImagePreview();
bool postBuild() override;
@@ -126,6 +126,8 @@ public:
void clearAllPreviewTextures();
+ void onBtnOK();
+
protected:
static void onPreviewTypeCommit(LLUICtrl*,void*);
void draw() override;
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 4fed8eebb8..143781a225 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -460,7 +460,7 @@ void LLFloaterIMContainer::processParticipantsStyleUpdate()
LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = session_model->getChildrenEnd();
while (current_participant_model != end_participant_model)
{
- LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
+ LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>((*current_participant_model).get());
if (participant_model)
{
// Get the avatar name for this participant id from the cache and update the model
@@ -511,7 +511,7 @@ void LLFloaterIMContainer::idleUpdate()
bool can_ban = haveAbilityToBan();
while (current_participant_model != end_participant_model)
{
- LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
+ LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>((*current_participant_model).get());
if (participant_model)
{
participant_model->setModeratorOptionsVisible(is_moderator);
@@ -1548,6 +1548,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
// Beyond that point, if only the user agent is selected, everything is disabled
if (is_single_select && (single_id == gAgentID))
{
+ if ("can_zoom_in" == item)
+ {
+ return true;
+ }
if (is_moderator_option)
{
return enableModerateContextMenuItem(item, true);
@@ -1702,6 +1706,11 @@ void LLFloaterIMContainer::showConversation(const LLUUID& session_id)
if (session_floater)
{
session_floater->restoreFloater();
+ if (session_floater->isTornOff() && session_floater->isMinimized())
+ {
+ session_floater->setMinimized(false);
+ session_floater->setFocus(true);
+ }
}
}
@@ -1882,7 +1891,7 @@ LLConversationItem* LLFloaterIMContainer::addConversationListItem(const LLUUID&
LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd();
while (current_participant_model != end_participant_model)
{
- LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>(*current_participant_model);
+ LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>((*current_participant_model).get());
LLConversationViewParticipant* participant_view = createConversationViewParticipant(participant_model);
participant_view->addToFolder(widget);
current_participant_model++;
@@ -2310,14 +2319,14 @@ bool LLFloaterIMContainer::isConversationLoggingAllowed()
return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
}
-void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes)
+void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes, bool alternate_color)
{
//Finds the conversation line item to flash using the session_id
LLConversationViewSession * widget = dynamic_cast<LLConversationViewSession *>(get_ptr_in_map(mConversationsWidgets,session_id));
if (widget)
{
- widget->setFlashState(is_flashes);
+ widget->setFlashState(is_flashes, alternate_color);
}
}
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index e5486e67da..30eed8be36 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -208,7 +208,7 @@ public:
void reSelectConversation();
void updateSpeakBtnState();
static bool isConversationLoggingAllowed();
- void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes);
+ void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes, bool alternate_color = false);
void highlightConversationItemWidget(const LLUUID& session_id, bool is_highlighted);
bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget);
boost::signals2::connection mMicroChangedSignal;
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index 28c651f0cd..b649514bff 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -52,6 +52,7 @@
#include "llfirstuse.h"
#include "llfloaterimnearbychat.h"
+#include "llfloaterimnearbychatlistener.h"
#include "llagent.h" // gAgent
#include "llgesturemgr.h"
#include "llmultigesture.h"
@@ -71,6 +72,8 @@
S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0;
+static LLFloaterIMNearbyChatListener sChatListener;
+
constexpr S32 EXPANDED_HEIGHT = 266;
constexpr S32 COLLAPSED_HEIGHT = 60;
constexpr S32 EXPANDED_MIN_HEIGHT = 150;
@@ -583,7 +586,7 @@ void LLFloaterIMNearbyChat::sendChat( EChatType type )
{
if (mInputEditor)
{
- LLWString text = mInputEditor->getWText();
+ LLWString text = mInputEditor->getConvertedText();
LLWStringUtil::trim(text);
LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines.
if (!text.empty())
diff --git a/indra/newview/llfloaterimnearbychatlistener.cpp b/indra/newview/llfloaterimnearbychatlistener.cpp
index 43173d3680..b15a32ce40 100644
--- a/indra/newview/llfloaterimnearbychatlistener.cpp
+++ b/indra/newview/llfloaterimnearbychatlistener.cpp
@@ -34,12 +34,12 @@
#include "llagent.h"
#include "llchat.h"
#include "llviewercontrol.h"
+#include "stringize.h"
+static const F32 CHAT_THROTTLE_PERIOD = 1.f;
-LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar)
- : LLEventAPI("LLChatBar",
- "LLChatBar listener to (e.g.) sendChat, etc."),
- mChatbar(chatbar)
+LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener() :
+ LLEventAPI("LLChatBar", "LLChatBar listener to (e.g.) sendChat, etc.")
{
add("sendChat",
"Send chat to the simulator:\n"
@@ -49,10 +49,18 @@ LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyCh
&LLFloaterIMNearbyChatListener::sendChat);
}
-
// "sendChat" command
-void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const
+void LLFloaterIMNearbyChatListener::sendChat(LLSD const& chat_data)
{
+ F64 cur_time = LLTimer::getElapsedSeconds();
+
+ if (cur_time < mLastThrottleTime + CHAT_THROTTLE_PERIOD)
+ {
+ LL_WARNS("LLFloaterIMNearbyChatListener") << "'sendChat' was throttled" << LL_ENDL;
+ return;
+ }
+ mLastThrottleTime = cur_time;
+
// Extract the data
std::string chat_text = chat_data["message"].asString();
@@ -81,20 +89,12 @@ void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const
}
// Have to prepend /42 style channel numbers
- std::string chat_to_send;
- if (channel == 0)
- {
- chat_to_send = chat_text;
- }
- else
+ if (channel)
{
- chat_to_send += "/";
- chat_to_send += chat_data["channel"].asString();
- chat_to_send += " ";
- chat_to_send += chat_text;
+ chat_text = stringize("/", chat_data["channel"].asString(), " ", chat_text);
}
// Send it as if it was typed in
- mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, ((bool)(channel == 0)) && gSavedSettings.getBOOL("PlayChatAnim"));
+ LLFloaterIMNearbyChat::sendChatFromViewer(chat_text, type_o_chat, (channel == 0) && gSavedSettings.getBOOL("PlayChatAnim"));
}
diff --git a/indra/newview/llfloaterimnearbychatlistener.h b/indra/newview/llfloaterimnearbychatlistener.h
index 96184d95b3..71eba53a9a 100644
--- a/indra/newview/llfloaterimnearbychatlistener.h
+++ b/indra/newview/llfloaterimnearbychatlistener.h
@@ -38,12 +38,12 @@ class LLFloaterIMNearbyChat;
class LLFloaterIMNearbyChatListener : public LLEventAPI
{
public:
- LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar);
+ LLFloaterIMNearbyChatListener();
private:
- void sendChat(LLSD const & chat_data) const;
+ void sendChat(LLSD const & chat_data);
- LLFloaterIMNearbyChat & mChatbar;
+ F64 mLastThrottleTime{0};
};
#endif // LL_LLFLOATERIMNEARBYCHATLISTENER_H
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index 185274981b..84a9fad708 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -251,7 +251,7 @@ void LLFloaterIMSession::sendMsgFromInputEditor()
{
if (mInputEditor)
{
- LLWString text = mInputEditor->getWText();
+ LLWString text = mInputEditor->getConvertedText();
LLWStringUtil::trim(text);
LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines.
if(!text.empty())
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 335aba2cc9..48360f30d4 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -35,10 +35,12 @@
#include "llavatariconctrl.h"
#include "llchatentry.h"
#include "llchathistory.h"
+#include "llfloaterchatmentionpicker.h"
#include "llchiclet.h"
#include "llchicletbar.h"
#include "lldraghandle.h"
#include "llemojidictionary.h"
+#include "llemojihelper.h"
#include "llfloaterreg.h"
#include "llfloateremojipicker.h"
#include "llfloaterimsession.h"
@@ -104,26 +106,7 @@ LLFloaterIMSessionTab::~LLFloaterIMSessionTab()
{
delete mRefreshTimer;
LLIMMgr::instance().removeSessionObserver(this);
-
- LLFloaterIMContainer* im_container = LLFloaterIMContainer::findInstance();
- if (im_container)
- {
- LLParticipantList* session = dynamic_cast<LLParticipantList*>(im_container->getSessionModel(mSessionID));
- if (session)
- {
- for (const conversations_widgets_map::value_type& widget_pair : mConversationsWidgets)
- {
- LLFolderViewItem* widget = widget_pair.second;
- LLFolderViewModelItem* item_vmi = widget->getViewModelItem();
- if (item_vmi && item_vmi->getNumRefs() == 1)
- {
- // This is the last pointer, remove participant from session
- // before participant gets deleted on destroyView.
- session->removeChild(item_vmi);
- }
- }
- }
- }
+ mEmojiCloseConn.disconnect();
}
// static
@@ -300,6 +283,8 @@ bool LLFloaterIMSessionTab::postBuild()
mEmojiPickerShowBtn = getChild<LLButton>("emoji_picker_show_btn");
mEmojiPickerShowBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnClicked(); });
+ mEmojiPickerShowBtn->setMouseDownCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnDown(); });
+ mEmojiCloseConn = LLEmojiHelper::instance().setCloseCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerClosed(); });
mGearBtn = getChild<LLButton>("gear_btn");
mAddBtn = getChild<LLButton>("add_btn");
@@ -482,6 +467,7 @@ void LLFloaterIMSessionTab::onFocusReceived()
LLIMModel::instance().sendNoUnreadMessages(mSessionID);
}
+ LLFloaterChatMentionPicker::updateSessionID(mSessionID);
super::onFocusReceived();
}
@@ -532,8 +518,43 @@ void LLFloaterIMSessionTab::onEmojiRecentPanelToggleBtnClicked()
void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked()
{
- mInputEditor->setFocus(true);
- mInputEditor->showEmojiHelper();
+ if (!mEmojiPickerShowBtn->getToggleState())
+ {
+ mInputEditor->hideEmojiHelper();
+ mInputEditor->setFocus(true);
+ mInputEditor->showEmojiHelper();
+ mEmojiPickerShowBtn->setToggleState(true); // in case hideEmojiHelper closed a visible instance
+ }
+ else
+ {
+ mInputEditor->hideEmojiHelper();
+ mEmojiPickerShowBtn->setToggleState(false);
+ }
+}
+
+void LLFloaterIMSessionTab::onEmojiPickerShowBtnDown()
+{
+ if (mEmojiHelperLastCallbackFrame == LLFrameTimer::getFrameCount())
+ {
+ // Helper gets closed by focus lost event on Down before before onEmojiPickerShowBtnDown
+ // triggers.
+ // If this condition is true, user pressed button and it was 'toggled' during press,
+ // restore 'toggled' state so that button will not reopen helper.
+ mEmojiPickerShowBtn->setToggleState(true);
+ }
+}
+
+void LLFloaterIMSessionTab::onEmojiPickerClosed()
+{
+ if (mEmojiPickerShowBtn->getToggleState())
+ {
+ mEmojiPickerShowBtn->setToggleState(false);
+ // Helper gets closed by focus lost event on Down before onEmojiPickerShowBtnDown
+ // triggers. If mEmojiHelperLastCallbackFrame is set and matches Down, means close
+ // was triggered by user's press.
+ // A bit hacky, but I can't think of a better way to handle this without rewriting helper.
+ mEmojiHelperLastCallbackFrame = LLFrameTimer::getFrameCount();
+ }
}
void LLFloaterIMSessionTab::initEmojiRecentPanel()
@@ -597,9 +618,21 @@ void LLFloaterIMSessionTab::deleteAllChildren()
std::string LLFloaterIMSessionTab::appendTime()
{
- std::string timeStr = "[" + LLTrans::getString("TimeHour") + "]:"
- "[" + LLTrans::getString("TimeMin") + "]:"
- "[" + LLTrans::getString("TimeSec") + "]";
+ std::string timeStr;
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ if (use_24h)
+ {
+ timeStr = "[" + LLTrans::getString("TimeHour") + "]:"
+ "[" + LLTrans::getString("TimeMin") + "]:"
+ "[" + LLTrans::getString("TimeSec") + "]";
+ }
+ else
+ {
+ timeStr = "[" + LLTrans::getString("TimeHour12") + "]:"
+ "[" + LLTrans::getString("TimeMin") + "]:"
+ "[" + LLTrans::getString("TimeSec") + "] ["
+ + LLTrans::getString("TimeAMPM") + "]";
+ }
LLSD substitution;
substitution["datetime"] = (S32)time_corrected();
@@ -690,7 +723,7 @@ void LLFloaterIMSessionTab::buildConversationViewParticipant()
LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd();
while (current_participant_model != end_participant_model)
{
- LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>(*current_participant_model);
+ LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>((*current_participant_model).get());
if (participant_model)
{
addConversationViewParticipant(participant_model);
@@ -734,27 +767,6 @@ void LLFloaterIMSessionTab::removeConversationViewParticipant(const LLUUID& part
LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,participant_id);
if (widget)
{
- LLFolderViewModelItem* item_vmi = widget->getViewModelItem();
- if (item_vmi && item_vmi->getNumRefs() == 1)
- {
- // This is the last pointer, remove participant from session
- // before participant gets deleted on destroyView.
- //
- // Floater (widget) and participant's view can simultaneously
- // co-own the model, in which case view is responsible for
- // the deletion and floater is free to clear and recreate
- // the list, yet there are cases where only widget owns
- // the pointer so it should do the cleanup.
- // See "add_participant".
- //
- // Todo: If it keeps causing issues turn participants
- // into LLPointers in the session
- LLParticipantList* session = getParticipantList();
- if (session)
- {
- session->removeChild(item_vmi);
- }
- }
widget->destroyView();
}
mConversationsWidgets.erase(participant_id);
@@ -820,7 +832,7 @@ void LLFloaterIMSessionTab::refreshConversation()
LLIMSpeakerMgr *speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
while (current_participant_model != end_participant_model)
{
- LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
+ LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>((*current_participant_model).get());
if (speaker_mgr && participant_model)
{
LLSpeaker *participant_speaker = speaker_mgr->findSpeaker(participant_model->getUUID());
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
index 367d988f26..6d04d622e1 100644
--- a/indra/newview/llfloaterimsessiontab.h
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -235,6 +235,8 @@ private:
void onEmojiRecentPanelToggleBtnClicked();
void onEmojiPickerShowBtnClicked();
+ void onEmojiPickerShowBtnDown();
+ void onEmojiPickerClosed();
void initEmojiRecentPanel();
void onEmojiRecentPanelFocusReceived();
void onEmojiRecentPanelFocusLost();
@@ -249,6 +251,9 @@ private:
S32 mInputEditorPad;
S32 mChatLayoutPanelHeight;
S32 mFloaterHeight;
+
+ boost::signals2::connection mEmojiCloseConn;
+ U32 mEmojiHelperLastCallbackFrame = { 0 };
};
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index 4f993ca0e1..c0fe7ad896 100644
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -220,7 +220,8 @@ void LLFloaterInspect::refresh()
}
time_t timestamp = (time_t) (obj->mCreationDate/1000000);
- std::string timeStr = getString("timeStamp");
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ std::string timeStr = use_24h ? getString("timeStamp") : getString("timeStampAMPM");
LLSD substitution;
substitution["datetime"] = (S32) timestamp;
LLStringUtil::format (timeStr, substitution);
diff --git a/indra/newview/llfloaterinventorysettings.cpp b/indra/newview/llfloaterinventorysettings.cpp
index e5ee69f240..aab632bcb8 100644
--- a/indra/newview/llfloaterinventorysettings.cpp
+++ b/indra/newview/llfloaterinventorysettings.cpp
@@ -28,9 +28,14 @@
#include "llfloaterinventorysettings.h"
+#include "llcolorswatch.h"
+#include "llviewercontrol.h"
+
LLFloaterInventorySettings::LLFloaterInventorySettings(const LLSD& key)
: LLFloater(key)
{
+ mCommitCallbackRegistrar.add("ScriptPref.applyUIColor", boost::bind(&LLFloaterInventorySettings::applyUIColor, this, _1, _2));
+ mCommitCallbackRegistrar.add("ScriptPref.getUIColor", boost::bind(&LLFloaterInventorySettings::getUIColor, this, _1, _2));
}
LLFloaterInventorySettings::~LLFloaterInventorySettings()
@@ -39,6 +44,29 @@ LLFloaterInventorySettings::~LLFloaterInventorySettings()
bool LLFloaterInventorySettings::postBuild()
{
getChild<LLButton>("ok_btn")->setCommitCallback(boost::bind(&LLFloater::closeFloater, this, false));
+
+ getChild<LLUICtrl>("favorites_color")->setCommitCallback(boost::bind(&LLFloaterInventorySettings::updateColorSwatch, this));
+
+ bool enable_color = gSavedSettings.getBOOL("InventoryFavoritesColorText");
+ getChild<LLUICtrl>("favorites_swatch")->setEnabled(enable_color);
+
return true;
}
+void LLFloaterInventorySettings::updateColorSwatch()
+{
+ bool val = getChild<LLUICtrl>("favorites_color")->getValue();
+ getChild<LLUICtrl>("favorites_swatch")->setEnabled(val);
+}
+
+void LLFloaterInventorySettings::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
+{
+ LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue()));
+}
+
+void LLFloaterInventorySettings::getUIColor(LLUICtrl* ctrl, const LLSD& param)
+{
+ LLColorSwatchCtrl* color_swatch = (LLColorSwatchCtrl*)ctrl;
+ color_swatch->setOriginal(LLUIColorTable::instance().getColor(param.asString()));
+}
+
diff --git a/indra/newview/llfloaterinventorysettings.h b/indra/newview/llfloaterinventorysettings.h
index 3fe3a001b9..c27d5d2e1b 100644
--- a/indra/newview/llfloaterinventorysettings.h
+++ b/indra/newview/llfloaterinventorysettings.h
@@ -40,6 +40,11 @@ public:
private:
LLFloaterInventorySettings(const LLSD& key);
~LLFloaterInventorySettings();
+
+ void updateColorSwatch();
+
+ void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
+ void getUIColor(LLUICtrl* ctrl, const LLSD& param);
};
#endif
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp
index 68b11ec92b..871f924316 100644
--- a/indra/newview/llfloaterjoystick.cpp
+++ b/indra/newview/llfloaterjoystick.cpp
@@ -78,7 +78,7 @@ BOOL CALLBACK di8_list_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr,
// Capable of detecting devices like Oculus Rift
if (device_instance_ptr && pvRef)
{
- std::string product_name = utf16str_to_utf8str(llutf16string(device_instance_ptr->tszProductName));
+ std::string product_name = ll_convert<std::string>(std::wstring(device_instance_ptr->tszProductName));
S32 size = sizeof(GUID);
LLSD::Binary data; //just an std::vector
data.resize(size);
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 52a3e78d04..5c5219bcdd 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -733,7 +733,8 @@ void LLPanelLandGeneral::refresh()
// Display claim date
time_t claim_date = parcel->getClaimDate();
- std::string claim_date_str = getString("time_stamp_template");
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ std::string claim_date_str = use_24h ? getString("time_stamp_template") : getString("time_stamp_template_ampm");
LLSD substitution;
substitution["datetime"] = (S32) claim_date;
LLStringUtil::format (claim_date_str, substitution);
diff --git a/indra/newview/llfloatermarketplace.cpp b/indra/newview/llfloatermarketplace.cpp
new file mode 100644
index 0000000000..7316d7617d
--- /dev/null
+++ b/indra/newview/llfloatermarketplace.cpp
@@ -0,0 +1,70 @@
+/**
+ * @file llfloatermarketplace.cpp
+ * @brief floater for the Marketplace web site
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatermarketplace.h"
+#include "llviewercontrol.h"
+#include "lluictrlfactory.h"
+
+LLFloaterMarketplace::LLFloaterMarketplace(const LLSD& key)
+ : LLFloaterWebContent(key)
+{
+}
+
+LLFloaterMarketplace::~LLFloaterMarketplace()
+{
+}
+
+// just to override LLFloaterWebContent
+void LLFloaterMarketplace::onClose(bool app_quitting)
+{
+}
+
+bool LLFloaterMarketplace::postBuild()
+{
+ if (!LLFloaterWebContent::postBuild())
+ return false;
+
+ mWebBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("MarketplaceURL");
+ mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+
+ // If cookie is there, will set it now, Otherwise will have to wait for login completion
+ // which will also update marketplace instance if it already exists.
+ LLViewerMedia::getInstance()->getOpenIDCookie(mWebBrowser);
+
+ return true;
+}
+
+void LLFloaterMarketplace::openMarketplace()
+{
+ std::string url = gSavedSettings.getString("MarketplaceURL");
+ if (mCurrentURL != url)
+ {
+ mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+ }
+}
diff --git a/indra/newview/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/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 2496887c9d..81eab52e6c 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -180,8 +180,15 @@ void LLFloaterMediaSettings::onClose(bool app_quitting)
////////////////////////////////////////////////////////////////////////////////
//static
-void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editable )
+void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editable, bool has_media_info, bool multiple_media, bool multiple_valid_media)
{
+ if (!sInstance)
+ {
+ return;
+ }
+ sInstance->mIdenticalHasMediaInfo = has_media_info;
+ sInstance->mMultipleMedia = multiple_media;
+ sInstance->mMultipleValidMedia = multiple_valid_media;
if (sInstance->hasFocus()) return;
// Clear values
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index 38730ddc98..7ed7ab246f 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -48,7 +48,7 @@ public:
static LLFloaterMediaSettings* getInstance();
static bool instanceExists();
static void apply();
- static void initValues( const LLSD& media_settings , bool editable);
+ static void initValues( const LLSD& media_settings , bool editable, bool has_media_info, bool multiple_media, bool multiple_valid_media);
static void clearValues( bool editable);
LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 8332a430e6..ef29be8200 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -64,6 +64,7 @@
#include "llcallbacklist.h"
#include "llviewertexteditor.h"
#include "llviewernetwork.h"
+#include "llmaterialeditor.h"
//static
@@ -349,14 +350,14 @@ void LLFloaterModelPreview::initModelPreview()
}
//static
-bool LLFloaterModelPreview::showModelPreview()
+void LLFloaterModelPreview::showModelPreview(const LLUUID& dest_folder)
{
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*)LLFloaterReg::getInstance("upload_model");
if (fmp && !fmp->isModelLoading())
{
+ fmp->setUploadDestination(dest_folder);
fmp->loadHighLodModel();
}
- return true;
}
void LLFloaterModelPreview::onUploadOptionChecked(LLUICtrl* ctrl)
@@ -502,10 +503,13 @@ void LLFloaterModelPreview::onClickCalculateBtn()
mUploadModelUrl.clear();
mModelPhysicsFee.clear();
- gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
+ lod_sources_map_t lod_sources;
+ fillLODSourceStatistics(lod_sources);
+
+ gMeshRepo.uploadModel(mModelPreview->mUploadData, lod_sources, mModelPreview->mPreviewScale,
childGetValue("upload_textures").asBoolean(),
upload_skinweights, upload_joint_positions, lock_scale_if_joint_position,
- mUploadModelUrl, false,
+ mUploadModelUrl, mDestinationFolderId, false,
getWholeModelFeeObserverHandle());
toggleCalculateButton(false);
@@ -619,11 +623,9 @@ void LLFloaterModelPreview::onJointListSelection()
LLPanel *panel = mTabContainer->getPanelByName("rigging_panel");
LLScrollListCtrl *joints_list = panel->getChild<LLScrollListCtrl>("joints_list");
LLScrollListCtrl *joints_pos = panel->getChild<LLScrollListCtrl>("pos_overrides_list");
- LLScrollListCtrl *joints_scale = panel->getChild<LLScrollListCtrl>("scale_overrides_list");
LLTextBox *joint_pos_descr = panel->getChild<LLTextBox>("pos_overrides_descr");
joints_pos->deleteAllItems();
- joints_scale->deleteAllItems();
LLScrollListItem *selected = joints_list->getFirstSelected();
if (selected)
@@ -1033,8 +1035,13 @@ void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data)
gMeshRepo.mDecompThread->submitRequest(request);
}
}
-
- if (stage == "Decompose")
+ if (stage == "Analyze")
+ {
+ sInstance->setStatusMessage(sInstance->getString("decomposing"));
+ sInstance->childSetVisible("Analyze", false);
+ sInstance->childSetVisible("analyze_cancel", true);
+ }
+ else if (stage == "Decompose")
{
sInstance->setStatusMessage(sInstance->getString("decomposing"));
sInstance->childSetVisible("Decompose", false);
@@ -1088,9 +1095,7 @@ void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)
}
else if (which_mode == cube_mode)
{
- std::string path = gDirUtilp->getAppRODataDir();
- gDirUtilp->append(path, "cube.dae");
- sInstance->loadModel(LLModel::LOD_PHYSICS, path);
+ sInstance->loadModel(LLModel::LOD_PHYSICS, getBoundingBoxCubePath());
}
LLModelPreview *model_preview = sInstance->mModelPreview;
@@ -1137,6 +1142,7 @@ void LLFloaterModelPreview::initDecompControls()
childSetCommitCallback("simplify_cancel", onPhysicsStageCancel, NULL);
childSetCommitCallback("decompose_cancel", onPhysicsStageCancel, NULL);
+ childSetCommitCallback("analyze_cancel", onPhysicsStageCancel, NULL);
childSetCommitCallback("physics_lod_combo", onPhysicsUseLOD, NULL);
childSetCommitCallback("physics_browse", onPhysicsBrowse, NULL);
@@ -1318,8 +1324,91 @@ void LLFloaterModelPreview::createSmoothComboBox(LLComboBox* combo_box, float mi
std::string label = (++ilabel == SMOOTH_VALUES_NUMBER) ? "10 (max)" : llformat("%.1d", ilabel);
combo_box->add(label, value, ADD_BOTTOM, true);
}
+}
+std::string get_source_file_format(const std::string& filename)
+{
+ const std::string extension = gDirUtilp->getExtension(filename);
+ if (extension == "gltf"
+ || extension == "glb")
+ {
+ return "gltf";
+ }
+ else if (extension == "dae")
+ {
+ return "dae";
+ }
+ else if (extension == "slm")
+ {
+ return "slm";
+ }
+ else
+ {
+ return "unknown file";
+ }
+}
+std::string LLFloaterModelPreview::getBoundingBoxCubePath()
+{
+ std::string path = gDirUtilp->getAppRODataDir();
+ gDirUtilp->append(path, "cube.dae");
+ return path;
+}
+
+void LLFloaterModelPreview::fillLODSourceStatistics(LLFloaterModelPreview::lod_sources_map_t& lod_sources) const
+{
+ lod_sources.clear();
+
+ // This doesn't nessesarily reflect the actual source of meshes, just user choices,
+ // some meshes could have been matched from different lods, but should be good
+ // enough for statistics.
+ for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod)
+ {
+ const std::string &lod_string = lod_name[lod];
+ if (mLODMode[lod] == LLModelPreview::USE_LOD_ABOVE)
+ {
+ lod_sources[lod_string] = "lod above";
+ }
+ else if (mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_AUTO
+ || mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_PRECISE
+ || mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_SLOPPY)
+ {
+ lod_sources[lod_string] = "generated";
+ }
+ else if (mLODMode[lod] == LLModelPreview::LOD_FROM_FILE)
+ {
+ const std::string& file = mModelPreview->mLODFile[lod];
+ lod_sources[lod_string] = get_source_file_format(file);
+ }
+ else
+ {
+ lod_sources[lod_string] = "unknown source";
+ }
+ }
+ if (mModelPreview->mLODFile[LLModel::LOD_PHYSICS].empty())
+ {
+ if (mModelPreview->mPhysicsSearchLOD >= 0 && mModelPreview->mPhysicsSearchLOD <= 3)
+ {
+ lod_sources["physics"] = lod_name[mModelPreview->mPhysicsSearchLOD];
+ }
+ else
+ {
+ lod_sources["physics"] = "none";
+ }
+ }
+ else
+ {
+ const std::string& file = mModelPreview->mLODFile[LLModel::LOD_PHYSICS];
+ const std::string cube = getBoundingBoxCubePath();
+ if (cube != file) // check for "cube.dae"
+ {
+ lod_sources["physics"] = get_source_file_format(file);
+ }
+ else
+ {
+ lod_sources["physics"] = "bounding box";
+ }
+ }
}
//-----------------------------------------------------------------------------
@@ -1341,26 +1430,26 @@ void LLFloaterModelPreview::addStringToLog(const std::string& message, const LLS
{
std::string str;
switch (lod)
-{
+ {
case LLModel::LOD_IMPOSTOR: str = "LOD0 "; break;
case LLModel::LOD_LOW: str = "LOD1 "; break;
case LLModel::LOD_MEDIUM: str = "LOD2 "; break;
case LLModel::LOD_PHYSICS: str = "PHYS "; break;
case LLModel::LOD_HIGH: str = "LOD3 "; break;
default: break;
-}
+ }
LLStringUtil::format_map_t args_msg;
LLSD::map_const_iterator iter = args.beginMap();
LLSD::map_const_iterator end = args.endMap();
for (; iter != end; ++iter)
-{
+ {
args_msg[iter->first] = iter->second.asString();
}
str += sInstance->getString(message, args_msg);
sInstance->addStringToLogTab(str, flash);
}
- }
+}
// static
void LLFloaterModelPreview::addStringToLog(const std::string& str, bool flash)
@@ -1488,7 +1577,7 @@ void LLFloaterModelPreview::updateAvatarTab(bool highlight_overrides)
{
// Populate table
- std::map<std::string, std::string> joint_alias_map;
+ std::map<std::string, std::string, std::less<>> joint_alias_map;
mModelPreview->getJointAliases(joint_alias_map);
S32 conflicts = 0;
@@ -1657,10 +1746,13 @@ void LLFloaterModelPreview::onUpload(void* user_data)
mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions, lock_scale_if_joint_position);
}
- gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale,
+ lod_sources_map_t lod_sources;
+ mp->fillLODSourceStatistics(lod_sources);
+
+ gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, lod_sources, mp->mModelPreview->mPreviewScale,
mp->childGetValue("upload_textures").asBoolean(),
upload_skinweights, upload_joint_positions, lock_scale_if_joint_position,
- mp->mUploadModelUrl,
+ mp->mUploadModelUrl, mp->mDestinationFolderId,
true, LLHandle<LLWholeModelFeeObserver>(), mp->getWholeModelUploadObserverHandle());
}
@@ -1770,9 +1862,15 @@ void LLFloaterModelPreview::onLoDSourceCommit(S32 lod)
if (index == LLModelPreview::MESH_OPTIMIZER_AUTO
|| index == LLModelPreview::MESH_OPTIMIZER_SLOPPY
|| index == LLModelPreview::MESH_OPTIMIZER_PRECISE)
- { //rebuild LoD to update triangle counts
+ {
+ // rebuild LoD to update triangle counts
onLODParamCommit(lod, true);
}
+ if (index == LLModelPreview::USE_LOD_ABOVE)
+ {
+ // refresh to pick triangle counts
+ mModelPreview->mDirty = true;
+ }
}
void LLFloaterModelPreview::resetDisplayOptions()
@@ -1926,7 +2024,7 @@ void LLFloaterModelPreview::DecompRequest::completed()
{ //called from the main thread
if (mContinue)
{
- mModel->setConvexHullDecomposition(mHull);
+ mModel->setConvexHullDecomposition(mHull, mHullMesh);
if (sInstance)
{
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 6adc084fe8..20e5b2666a 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -73,7 +73,8 @@ public:
/*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true);
void initModelPreview();
- static bool showModelPreview();
+ void setUploadDestination(const LLUUID& dest_folder) { mDestinationFolderId = dest_folder; }
+ static void showModelPreview(const LLUUID& dest_folder = LLUUID::null);
bool handleMouseDown(S32 x, S32 y, MASK mask);
bool handleMouseUp(S32 x, S32 y, MASK mask);
@@ -164,9 +165,6 @@ protected:
static void onPhysicsBrowse(LLUICtrl* ctrl, void* userdata);
static void onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata);
- static void onPhysicsOptimize(LLUICtrl* ctrl, void* userdata);
- static void onPhysicsDecomposeBack(LLUICtrl* ctrl, void* userdata);
- static void onPhysicsSimplifyBack(LLUICtrl* ctrl, void* userdata);
void draw();
@@ -225,6 +223,11 @@ private:
void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
+ static std::string getBoundingBoxCubePath();
+ typedef std::map<std::string, std::string> lod_sources_map_t;
+ void fillLODSourceStatistics(lod_sources_map_t& lod_sources) const;
+
+ LLUUID mDestinationFolderId;
LLButton* mUploadBtn;
LLButton* mCalculateBtn;
LLViewerTextEditor* mUploadLogText;
diff --git a/indra/newview/llfloatermyenvironment.cpp b/indra/newview/llfloatermyenvironment.cpp
index 891e16a8ef..c0405c106e 100644
--- a/indra/newview/llfloatermyenvironment.cpp
+++ b/indra/newview/llfloatermyenvironment.cpp
@@ -38,7 +38,9 @@
#include "llcheckboxctrl.h"
#include "llviewerinventory.h"
#include "llenvironment.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
+#include "lltrans.h"
#include "llviewerparcelmgr.h"
//=========================================================================
@@ -223,16 +225,13 @@ void LLFloaterMyEnvironment::onFilterEdit(const std::string& search_string)
mInventoryList->setFilterSubString(search_string);
}
-void LLFloaterMyEnvironment::onDeleteSelected()
+void LLFloaterMyEnvironment::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, uuid_vec_t item_ids)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
{
- uuid_vec_t selected;
-
- getSelectedIds(selected);
- if (selected.empty())
- return;
-
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- for (const LLUUID& itemid: selected)
+ for (const LLUUID& itemid : item_ids)
{
LLInventoryItem* inv_item = gInventory.getItem(itemid);
@@ -253,6 +252,27 @@ void LLFloaterMyEnvironment::onDeleteSelected()
}
gInventory.notifyObservers();
}
+}
+
+void LLFloaterMyEnvironment::onDeleteSelected()
+{
+ uuid_vec_t selected;
+
+ getSelectedIds(selected);
+ if (selected.empty())
+ return;
+
+ LLSD args;
+ args["QUESTION"] = LLTrans::getString(selected.size() > 1 ? "DeleteItems" : "DeleteItem");
+ LLNotificationsUtil::add(
+ "DeleteItems",
+ args,
+ LLSD(),
+ [this, selected](const LLSD& notification, const LLSD& response)
+ {
+ onItemsRemovalConfirmation(notification, response, selected);
+ });
+}
void LLFloaterMyEnvironment::onDoCreate(const LLSD &data)
@@ -318,13 +338,13 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context)
if (context == PARAMETER_EDIT)
{
- return (selected.size() == 1) && isSettingSelected(selected.front());
+ return (selected.size() == 1) && isSettingId(selected.front());
}
else if (context == PARAMETER_COPY)
{
for (std::vector<LLUUID>::iterator it = selected.begin(); it != selected.end(); it++)
{
- if(!isSettingSelected(*it))
+ if(!isSettingId(*it))
{
return false;
}
@@ -342,7 +362,7 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context)
LLClipboard::instance().pasteFromClipboard(ids);
for (std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
{
- if (!isSettingSelected(*it))
+ if (!isSettingId(*it))
{
return false;
}
@@ -351,7 +371,7 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context)
}
else if (context == PARAMETER_COPYUUID)
{
- return (selected.size() == 1) && isSettingSelected(selected.front());
+ return (selected.size() == 1) && isSettingId(selected.front());
}
return false;
@@ -367,16 +387,42 @@ bool LLFloaterMyEnvironment::canApply(const std::string &context)
if (context == PARAMETER_REGION)
{
- return LLEnvironment::instance().canAgentUpdateRegionEnvironment();
+ return isSettingId(selected.front()) && LLEnvironment::instance().canAgentUpdateRegionEnvironment();
}
else if (context == PARAMETER_PARCEL)
{
- return LLEnvironment::instance().canAgentUpdateParcelEnvironment();
+ return isSettingId(selected.front()) && LLEnvironment::instance().canAgentUpdateParcelEnvironment();
}
- else
+ else if (context == PARAMETER_LOCAL)
{
- return (context == PARAMETER_LOCAL);
+ return isSettingId(selected.front());
}
+
+ return false;
+}
+
+bool can_delete(const LLUUID& id)
+{
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if (id == trash_id || gInventory.isObjectDescendentOf(id, trash_id))
+ {
+ return false;
+ }
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+ if (cat)
+ {
+ if (!get_is_category_removable(&gInventory, id))
+ {
+ return false;
+ }
+ }
+ else if (!get_is_item_removable(&gInventory, id, false))
+ {
+ return false;
+ }
+
+ return true;
}
//-------------------------------------------------------------------------
@@ -389,7 +435,14 @@ void LLFloaterMyEnvironment::refreshButtonStates()
getChild<LLUICtrl>(BUTTON_GEAR)->setEnabled(settings_ok);
getChild<LLUICtrl>(BUTTON_NEWSETTINGS)->setEnabled(true);
- getChild<LLUICtrl>(BUTTON_DELETE)->setEnabled(settings_ok && !selected.empty());
+
+ bool enable_delete = false;
+ if(settings_ok && !selected.empty())
+ {
+ enable_delete = can_delete(selected.front());
+ }
+
+ getChild<LLUICtrl>(BUTTON_DELETE)->setEnabled(enable_delete);
}
//-------------------------------------------------------------------------
@@ -438,7 +491,7 @@ LLUUID LLFloaterMyEnvironment::findItemByAssetId(LLUUID asset_id, bool copyable_
return LLUUID::null;
}
-bool LLFloaterMyEnvironment::isSettingSelected(LLUUID item_id)
+bool LLFloaterMyEnvironment::isSettingId(const LLUUID& item_id)
{
LLInventoryItem* itemp = gInventory.getItem(item_id);
diff --git a/indra/newview/llfloatermyenvironment.h b/indra/newview/llfloatermyenvironment.h
index 8e81b8e5e2..c5d521d207 100644
--- a/indra/newview/llfloatermyenvironment.h
+++ b/indra/newview/llfloatermyenvironment.h
@@ -60,6 +60,7 @@ private:
void onFilterCheckChange();
void onFilterEdit(const std::string& search_string);
void onSelectionChange();
+ void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, uuid_vec_t item_ids);
void onDeleteSelected();
void onDoCreate(const LLSD &data);
void onDoApply(const std::string &context);
@@ -69,7 +70,7 @@ private:
void getSelectedIds(uuid_vec_t& ids) const;
void refreshButtonStates();
- bool isSettingSelected(LLUUID item_id);
+ static bool isSettingId(const LLUUID &item_id);
static LLUUID findItemByAssetId(LLUUID asset_id, bool copyable_only, bool ignore_library);
};
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 01c50d89c5..569b41cfa9 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -62,11 +62,20 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
//-----------------------------------------------------------------------------
// LLFloaterNameDesc()
//-----------------------------------------------------------------------------
-LLFloaterNameDesc::LLFloaterNameDesc(const LLSD& filename )
- : LLFloater(filename),
- mIsAudio(false)
+LLFloaterNameDesc::LLFloaterNameDesc(const LLSD& args)
+ : LLFloater(args)
+ , mIsAudio(false)
+ , mIsText(false)
{
- mFilenameAndPath = filename.asString();
+ if (args.isString())
+ {
+ mFilenameAndPath = args.asString();
+ }
+ else
+ {
+ mFilenameAndPath = args["filename"].asString();
+ mDestinationFolderId = args["dest"].asUUID();
+ }
mFilename = gDirUtilp->getBaseFileName(mFilenameAndPath, false);
}
@@ -203,7 +212,8 @@ void LLFloaterNameDesc::onBtnOK( )
LLFloaterPerms::getNextOwnerPerms("Uploads"),
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
- expected_upload_cost));
+ expected_upload_cost,
+ mDestinationFolderId));
upload_new_resource(uploadInfo, callback, nruserdata);
}
@@ -230,8 +240,8 @@ void LLFloaterNameDesc::onBtnCancel()
// LLFloaterSoundPreview()
//-----------------------------------------------------------------------------
-LLFloaterSoundPreview::LLFloaterSoundPreview(const LLSD& filename )
- : LLFloaterNameDesc(filename)
+LLFloaterSoundPreview::LLFloaterSoundPreview(const LLSD& args )
+ : LLFloaterNameDesc(args)
{
mIsAudio = true;
}
@@ -251,8 +261,8 @@ bool LLFloaterSoundPreview::postBuild()
// LLFloaterAnimPreview()
//-----------------------------------------------------------------------------
-LLFloaterAnimPreview::LLFloaterAnimPreview(const LLSD& filename )
- : LLFloaterNameDesc(filename)
+LLFloaterAnimPreview::LLFloaterAnimPreview(const LLSD& args )
+ : LLFloaterNameDesc(args)
{
}
@@ -270,8 +280,8 @@ bool LLFloaterAnimPreview::postBuild()
// LLFloaterScriptPreview()
//-----------------------------------------------------------------------------
-LLFloaterScriptPreview::LLFloaterScriptPreview(const LLSD& filename )
- : LLFloaterNameDesc(filename)
+LLFloaterScriptPreview::LLFloaterScriptPreview(const LLSD& args )
+ : LLFloaterNameDesc(args)
{
mIsText = true;
}
diff --git a/indra/newview/llfloaternamedesc.h b/indra/newview/llfloaternamedesc.h
index aa5571ccc0..8c8ec49a8e 100644
--- a/indra/newview/llfloaternamedesc.h
+++ b/indra/newview/llfloaternamedesc.h
@@ -39,7 +39,7 @@ class LLRadioGroup;
class LLFloaterNameDesc : public LLFloater
{
public:
- LLFloaterNameDesc(const LLSD& filename);
+ LLFloaterNameDesc(const LLSD& args);
virtual ~LLFloaterNameDesc();
bool postBuild() override;
@@ -58,6 +58,7 @@ protected:
std::string mFilenameAndPath;
std::string mFilename;
+ LLUUID mDestinationFolderId;
};
class LLFloaterSoundPreview : public LLFloaterNameDesc
diff --git a/indra/newview/llfloaternewfeaturenotification.cpp b/indra/newview/llfloaternewfeaturenotification.cpp
index 369727ff1e..1badcdd3d9 100644
--- a/indra/newview/llfloaternewfeaturenotification.cpp
+++ b/indra/newview/llfloaternewfeaturenotification.cpp
@@ -43,12 +43,28 @@ bool LLFloaterNewFeatureNotification::postBuild()
setCanDrag(false);
getChild<LLButton>("close_btn")->setCommitCallback(boost::bind(&LLFloaterNewFeatureNotification::onCloseBtn, this));
- const std::string title_txt = "title_txt";
- const std::string dsc_txt = "description_txt";
- std::string feature = "_" + getKey().asString();
+ if (getKey().isString())
+ {
+ const std::string title_txt = "title_txt";
+ const std::string dsc_txt = "description_txt";
- getChild<LLUICtrl>(title_txt)->setValue(getString(title_txt + feature));
- getChild<LLUICtrl>(dsc_txt)->setValue(getString(dsc_txt + feature));
+ std::string feature = "_" + getKey().asString();
+ if (hasString(title_txt + feature))
+ {
+ getChild<LLUICtrl>(title_txt)->setValue(getString(title_txt + feature));
+ getChild<LLUICtrl>(dsc_txt)->setValue(getString(dsc_txt + feature));
+ }
+ else
+ {
+ // Show blank
+ LL_WARNS() << "Feature \"" << getKey().asString() << "\" not found for feature notification" << LL_ENDL;
+ }
+ }
+ else
+ {
+ // Show blank
+ LL_WARNS() << "Feature notification without a feature" << LL_ENDL;
+ }
if (getKey().asString() == "gltf")
{
diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp
index 26b7304b9a..fa491a4b27 100644
--- a/indra/newview/llfloaterobjectweights.cpp
+++ b/indra/newview/llfloaterobjectweights.cpp
@@ -36,6 +36,14 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
+static const std::string lod_strings[4] =
+{
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod",
+};
+
// virtual
bool LLCrossParcelFunctor::apply(LLViewerObject* obj)
{
@@ -75,7 +83,10 @@ LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key)
mSelectedOnLand(NULL),
mRezzedOnLand(NULL),
mRemainingCapacity(NULL),
- mTotalCapacity(NULL)
+ mTotalCapacity(NULL),
+ mLodLevel(nullptr),
+ mTrianglesShown(nullptr),
+ mPixelArea(nullptr)
{
}
@@ -99,6 +110,10 @@ bool LLFloaterObjectWeights::postBuild()
mRemainingCapacity = getChild<LLTextBox>("remaining_capacity");
mTotalCapacity = getChild<LLTextBox>("total_capacity");
+ mLodLevel = getChild<LLTextBox>("lod_level");
+ mTrianglesShown = getChild<LLTextBox>("triangles_shown");
+ mPixelArea = getChild<LLTextBox>("pixel_area");
+
return true;
}
@@ -135,6 +150,69 @@ void LLFloaterObjectWeights::setErrorStatus(S32 status, const std::string& reaso
toggleWeightsLoadingIndicators(false);
}
+void LLFloaterObjectWeights::draw()
+{
+ // Normally it's a bad idea to set text and visibility inside draw
+ // since it can cause rect updates go to different, already drawn elements,
+ // but floater is very simple and these elements are supposed to be isolated
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ if (selection->isEmpty())
+ {
+ const std::string text = getString("nothing_selected");
+ mLodLevel->setText(text);
+ mTrianglesShown->setText(text);
+ mPixelArea->setText(text);
+
+ toggleRenderLoadingIndicators(false);
+ }
+ else
+ {
+ S32 object_lod = -1;
+ bool multiple_lods = false;
+ S32 total_tris = 0;
+ F32 pixel_area = 0;
+ for (LLObjectSelection::valid_root_iterator iter = selection->valid_root_begin();
+ iter != selection->valid_root_end(); ++iter)
+ {
+ LLViewerObject* object = (*iter)->getObject();
+ S32 lod = object->getLOD();
+ if (object_lod < 0)
+ {
+ object_lod = lod;
+ }
+ else if (object_lod != lod)
+ {
+ multiple_lods = true;
+ }
+
+ if (object->isRootEdit())
+ {
+ total_tris += object->recursiveGetTriangleCount();
+ pixel_area += object->getPixelArea();
+ }
+ }
+
+ if (multiple_lods)
+ {
+ mLodLevel->setText(getString("multiple_lods"));
+ toggleRenderLoadingIndicators(false);
+ }
+ else if (object_lod < 0)
+ {
+ // nodes are waiting for data
+ toggleRenderLoadingIndicators(true);
+ }
+ else
+ {
+ mLodLevel->setText(getString(lod_strings[object_lod]));
+ toggleRenderLoadingIndicators(false);
+ }
+ mTrianglesShown->setText(llformat("%d", total_tris));
+ mPixelArea->setText(llformat("%d", pixel_area));
+ }
+ LLFloater::draw();
+}
+
void LLFloaterObjectWeights::updateLandImpacts(const LLParcel* parcel)
{
if (!parcel || LLSelectMgr::getInstance()->getSelection()->isEmpty())
@@ -252,6 +330,17 @@ void LLFloaterObjectWeights::toggleLandImpactsLoadingIndicators(bool visible)
mTotalCapacity->setVisible(!visible);
}
+void LLFloaterObjectWeights::toggleRenderLoadingIndicators(bool visible)
+{
+ childSetVisible("lod_level_loading_indicator", visible);
+ childSetVisible("triangles_shown_loading_indicator", visible);
+ childSetVisible("pixel_area_loading_indicator", visible);
+
+ mLodLevel->setVisible(!visible);
+ mTrianglesShown->setVisible(!visible);
+ mPixelArea->setVisible(!visible);
+}
+
void LLFloaterObjectWeights::updateIfNothingSelected()
{
const std::string text = getString("nothing_selected");
@@ -269,6 +358,11 @@ void LLFloaterObjectWeights::updateIfNothingSelected()
mRemainingCapacity->setText(text);
mTotalCapacity->setText(text);
+ mLodLevel->setText(text);
+ mTrianglesShown->setText(text);
+ mPixelArea->setText(text);
+
toggleWeightsLoadingIndicators(false);
toggleLandImpactsLoadingIndicators(false);
+ toggleRenderLoadingIndicators(false);
}
diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h
index 3b999f6b9b..bda625564b 100644
--- a/indra/newview/llfloaterobjectweights.h
+++ b/indra/newview/llfloaterobjectweights.h
@@ -58,21 +58,24 @@ public:
LLFloaterObjectWeights(const LLSD& key);
~LLFloaterObjectWeights();
- /*virtual*/ bool postBuild();
+ bool postBuild() override;
- /*virtual*/ void onOpen(const LLSD& key);
+ void onOpen(const LLSD& key) override;
- /*virtual*/ void onWeightsUpdate(const SelectionCost& selection_cost);
- /*virtual*/ void setErrorStatus(S32 status, const std::string& reason);
+ void onWeightsUpdate(const SelectionCost& selection_cost) override;
+ void setErrorStatus(S32 status, const std::string& reason) override;
+
+ void draw() override;
void updateLandImpacts(const LLParcel* parcel);
- void refresh();
+ void refresh() override;
private:
- /*virtual*/ void generateTransactionID();
+ void generateTransactionID() override;
void toggleWeightsLoadingIndicators(bool visible);
void toggleLandImpactsLoadingIndicators(bool visible);
+ void toggleRenderLoadingIndicators(bool visible);
void updateIfNothingSelected();
@@ -88,6 +91,10 @@ private:
LLTextBox *mRezzedOnLand;
LLTextBox *mRemainingCapacity;
LLTextBox *mTotalCapacity;
+
+ LLTextBox *mLodLevel;
+ LLTextBox *mTrianglesShown;
+ LLTextBox *mPixelArea;
};
#endif //LL_LLFLOATEROBJECTWEIGHTS_H
diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h
index 6cca85a009..48e7f4913f 100644
--- a/indra/newview/llfloaterperformance.h
+++ b/indra/newview/llfloaterperformance.h
@@ -33,6 +33,7 @@ class LLCharacter;
class LLCheckBoxCtrl;
class LLNameListCtrl;
class LLTextBox;
+class LLSliderCtrl;
class LLFloaterPerformance : public LLFloater
{
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index fdac390e8a..aa36782942 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -366,6 +366,11 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.ClearLog", boost::bind(&LLConversationLog::onClearLog, &LLConversationLog::instance()));
mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this));
mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering
+#ifdef LL_DISCORD
+ gSavedSettings.getControl("EnableDiscord")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
+ gSavedSettings.getControl("ShowDiscordActivityDetails")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
+ gSavedSettings.getControl("ShowDiscordActivityState")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
+#endif
}
void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type )
@@ -470,6 +475,8 @@ bool LLFloaterPreference::postBuild()
getChild<LLUICtrl>("log_path_string")->setEnabled(false); // make it read-only but selectable
getChild<LLComboBox>("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this));
+ mTimeFormatCombobox = getChild<LLComboBox>("time_format_combobox");
+ mTimeFormatCombobox->setCommitCallback(boost::bind(&LLFloaterPreference::onTimeFormatChange, this));
getChild<LLComboBox>("FriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"FriendIMOptions"));
getChild<LLComboBox>("NonFriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"NonFriendIMOptions"));
@@ -523,6 +530,11 @@ bool LLFloaterPreference::postBuild()
getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true);
}
+#ifndef LL_DISCORD
+ LLPanel* panel = getChild<LLPanel>("privacy_preferences_discord");
+ getChild<LLTabContainer>("privacy_tab_container")->removeTabPanel(panel);
+#endif
+
return true;
}
@@ -748,6 +760,7 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// Forget previous language changes.
mLanguageChanged = false;
+ mLastQualityLevel = gSavedSettings.getU32("RenderQualityPerformance");
// Display selected maturity icons.
onChangeMaturity();
@@ -761,6 +774,17 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// Load (double-)click to walk/teleport settings.
updateClickActionViews();
+#if LL_LINUX
+ // Lixux doesn't support automatic mode
+ LLComboBox* combo = getChild<LLComboBox>("double_click_action_combo");
+ S32 mode = gSavedSettings.getS32("MouseWarpMode");
+ if (mode == 0)
+ {
+ combo->setValue("1");
+ }
+ combo->setEnabledByValue("0", false);
+#endif
+
// Enabled/disabled popups, might have been changed by user actions
// while preferences floater was closed.
buildPopupLists();
@@ -1092,6 +1116,13 @@ void LLFloaterPreference::onLanguageChange()
}
}
+void LLFloaterPreference::onTimeFormatChange()
+{
+ std::string val = mTimeFormatCombobox->getValue();
+ gSavedSettings.setBOOL("Use24HourClock", val == "1");
+ onLanguageChange();
+}
+
void LLFloaterPreference::onNotificationsChange(const std::string& OptionName)
{
mNotificationOptions[OptionName] = getChild<LLComboBox>(OptionName)->getSelectedItemLabel();
@@ -1307,6 +1338,8 @@ void LLFloaterPreference::refresh()
advanced->refresh();
}
updateClickActionViews();
+
+ mTimeFormatCombobox->selectByValue(gSavedSettings.getBOOL("Use24HourClock") ? "1" : "0");
}
void LLFloaterPreference::onCommitWindowedMode()
@@ -1317,7 +1350,35 @@ void LLFloaterPreference::onCommitWindowedMode()
void LLFloaterPreference::onChangeQuality(const LLSD& data)
{
U32 level = (U32)(data.asReal());
+ constexpr U32 LVL_HIGH = 4;
+ if (level >= LVL_HIGH && mLastQualityLevel < level)
+ {
+ constexpr U32 LOW_MEM_THRESHOLD = 4097;
+ U32 total_mem = (U32Megabytes)LLMemory::getMaxMemKB();
+ if (total_mem < LOW_MEM_THRESHOLD)
+ {
+ LLSD args;
+ args["TOTAL_MEM"] = LLSD::Integer(total_mem);
+ LLNotificationsUtil::add("PreferenceQualityWithLowMemory", args, LLSD(), [this](const LLSD& notification, const LLSD& response)
+ {
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // If cancel pressed
+ if (option == 1)
+ {
+ constexpr U32 LVL_MED_PLUS = 3;
+ gSavedSettings.setU32("RenderQualityPerformance", LVL_MED_PLUS);
+ mLastQualityLevel = LVL_MED_PLUS;
+ LLFeatureManager::getInstance()->setGraphicsLevel(LVL_MED_PLUS, true);
+ refreshEnabledGraphics();
+ refresh();
+ }
+ }
+ );
+ }
+ }
+ mLastQualityLevel = level;
LLFeatureManager::getInstance()->setGraphicsLevel(level, true);
+ gSavedSettings.setU32("DebugQualityPerformance", level);
refreshEnabledGraphics();
refresh();
}
@@ -1968,7 +2029,21 @@ void LLFloaterPreference::selectChatPanel()
void LLFloaterPreference::changed()
{
+ if (LLConversationLog::instance().getIsLoggingEnabled())
+ {
getChild<LLButton>("clear_log")->setEnabled(LLConversationLog::instance().getConversations().size() > 0);
+ }
+ else
+ {
+ // onClearLog clears list, then notifies changed() and only then clears file,
+ // so check presence of conversations before checking file, file will cleared later.
+ llstat st;
+ bool has_logs = LLConversationLog::instance().getConversations().size() > 0
+ && LLFile::stat(LLConversationLog::instance().getFileName(), &st) == 0
+ && S_ISREG(st.st_mode)
+ && st.st_size > 0;
+ getChild<LLButton>("clear_log")->setEnabled(has_logs);
+ }
// set 'enable' property for 'Delete transcripts...' button
updateDeleteTranscriptsButton();
@@ -2354,6 +2429,7 @@ private:
};
static LLPanelInjector<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics");
+static LLPanelInjector<LLPanelPreferenceGraphics3> t_pref_graph3("panel_preference_graphics3");
static LLPanelInjector<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy");
bool LLPanelPreferenceGraphics::postBuild()
@@ -2523,6 +2599,174 @@ void LLPanelPreferenceGraphics::setHardwareDefaults()
resetDirtyChilds();
}
+// LLPanelPreferenceGraphics3 (Visuals Effects)
+
+bool LLPanelPreferenceGraphics3::postBuild()
+{
+ getChild<LLButton>("MPBalancedButton")->setCommitCallback(boost::bind(&LLPanelPreferenceGraphics3::onMPRecommanded, this));
+ return LLPanelPreference::postBuild();
+}
+
+void LLPanelPreferenceGraphics3::draw()
+{
+ LLPanelPreference::draw();
+}
+
+bool LLPanelPreferenceGraphics3::hasDirtyChilds()
+{
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
+ std::list<LLView*> view_stack;
+ view_stack.push_back(this);
+ if (advanced)
+ {
+ view_stack.push_back(advanced);
+ }
+ while(!view_stack.empty())
+ {
+ // Process view on top of the stack
+ LLView* curview = view_stack.front();
+ view_stack.pop_front();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
+ if (ctrl)
+ {
+ if (ctrl->isDirty())
+ {
+ LLControlVariable* control = ctrl->getControlVariable();
+ if (control)
+ {
+ std::string control_name = control->getName();
+ if (!control_name.empty())
+ {
+ return true;
+ }
+ }
+ }
+ }
+ // Push children onto the end of the work stack
+ for (child_list_t::const_iterator iter = curview->getChildList()->begin();
+ iter != curview->getChildList()->end(); ++iter)
+ {
+ view_stack.push_back(*iter);
+ }
+ }
+
+ return false;
+}
+
+void LLPanelPreferenceGraphics3::resetDirtyChilds()
+{
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
+ std::list<LLView*> view_stack;
+ view_stack.push_back(this);
+ if (advanced)
+ {
+ view_stack.push_back(advanced);
+ }
+ while(!view_stack.empty())
+ {
+ // Process view on top of the stack
+ LLView* curview = view_stack.front();
+ view_stack.pop_front();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
+ if (ctrl)
+ {
+ ctrl->resetDirty();
+ }
+ // Push children onto the end of the work stack
+ for (child_list_t::const_iterator iter = curview->getChildList()->begin();
+ iter != curview->getChildList()->end(); ++iter)
+ {
+ view_stack.push_back(*iter);
+ }
+ }
+}
+
+void LLPanelPreferenceGraphics3::cancel(const std::vector<std::string> settings_to_skip)
+{
+ LLPanelPreference::cancel(settings_to_skip);
+}
+void LLPanelPreferenceGraphics3::saveSettings()
+{
+ resetDirtyChilds();
+ std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
+ if (preset_graphic_active.empty())
+ {
+ LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
+ if (instance)
+ {
+ //don't restore previous preset after closing Preferences
+ instance->saveGraphicsPreset(preset_graphic_active);
+ }
+ }
+ LLPanelPreference::saveSettings();
+}
+
+void LLPanelPreferenceGraphics3::onMPRecommanded()
+{
+ //LL_WARNS() << "onClickMPRecommanded()" << LL_ENDL;
+
+ // LOD
+
+ gSavedSettings.setF32("RenderVolumeLODFactor", 3.5);
+ gSavedSettings.setF32("RenderAvatarPhysicsLODFactor", 1.0);
+
+ // AA
+
+ gSavedSettings.setU32("RenderFSAAType", 2);
+ gSavedSettings.setU32("RenderFSAASamples", 2);
+
+ gSavedSettings.setBOOL("RenderAnisotropic", false);
+
+ // Shadows
+
+ gSavedSettings.setS32("RenderShadowDetail", 0);
+ gSavedSettings.setF32("MPRenderShadowMaxDist", 40.0);
+ gSavedSettings.setF32("RenderShadowResolutionScale", 2.0);
+ gSavedSettings.setF32("RenderShadowBlurSize", 0.2);
+ gSavedSettings.setBOOL("RenderDeferredSSAO", 0);
+
+ // Bloom
+
+ gSavedSettings.setU32("MPRenderBloom", 0);
+ gSavedSettings.setF32("MPBloomBlurRadius", 1.2);
+ gSavedSettings.setF32("MPBloomBlurRadiusAdd", 1.2);
+ gSavedSettings.setF32("MPBloomExtractBrightness", 0.1);
+ gSavedSettings.setF32("MPBloomStrength", 1.0);
+
+ gSavedSettings.setF32("MPBloomExtractMetal", 0.4);
+ gSavedSettings.setF32("MPBloomExtractNonMetal", 0.0);
+
+ // Probes
+
+ gSavedSettings.setS32("RenderReflectionProbeDetail", 0);
+ gSavedSettings.setS32("RenderReflectionProbeLevel", 1);
+ gSavedSettings.setU32("RenderReflectionProbeCount", 32);
+ gSavedSettings.setU32("RenderReflectionProbeResolution", 128);
+ gSavedSettings.setF32("RenderReflectionProbeDrawDistance", 24.0);
+ gSavedSettings.setF32("RenderDefaultProbeUpdatePeriod", 20.0);
+ gSavedSettings.setF32("MPRenderProbeUpdatePeriod", 30.0);
+ gSavedSettings.setF32("MPRenderProbeSlowDown", 0.02);
+
+ // Misc
+
+ gSavedSettings.setBOOL("RenderDisableVintageMode", true);
+ gSavedSettings.setBOOL("RenderTransparentWater", true);
+ gSavedSettings.setU32("MPColorPrecision", 0);
+
+ gSavedSettings.setU32("RenderResolutionDivisor", 1.0);
+
+ gSavedSettings.setBOOL("RenderGLMultiThreadedTextures", false);
+ gSavedSettings.setBOOL("RenderAppleUseMultGL", false);
+ gSavedSettings.setBOOL("MPNoGLDebug", true);
+
+ gSavedSettings.setBOOL("MPHDRDisplay", false);
+ gSavedSettings.setF32("MPHDRBoost", 1.0);
+ gSavedSettings.setF32("MPHDRUIBoost", 1.0);
+ gSavedSettings.setF32("MPHDRGamma", 2.4);
+}
+
//------------------------LLPanelPreferenceControls--------------------------------
static LLPanelInjector<LLPanelPreferenceControls> t_pref_contrls("panel_preference_controls");
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index fa9c421a8f..8d3f1ed6b0 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -117,6 +117,7 @@ protected:
void onClickClearCache(); // Clear viewer texture cache, file cache on next startup
void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above
void onLanguageChange();
+ void onTimeFormatChange();
void onNotificationsChange(const std::string& OptionName);
void onNameTagOpacityChange(const LLSD& newvalue);
@@ -218,6 +219,7 @@ private:
bool mGotPersonalInfo;
bool mLanguageChanged;
bool mAvatarDataInitialized;
+ U32 mLastQualityLevel = 0;
std::string mPriorInstantMessageLogPath;
bool mOriginalHideOnlineStatus;
@@ -234,10 +236,11 @@ private:
LLButton* mDeleteTranscriptsBtn = nullptr;
LLButton* mEnablePopupBtn = nullptr;
LLButton* mDisablePopupBtn = nullptr;
+ LLComboBox* mTimeFormatCombobox = nullptr;
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 );
@@ -313,6 +316,26 @@ private:
LOG_CLASS(LLPanelPreferenceGraphics);
};
+class LLPanelPreferenceGraphics3 : public LLPanelPreference
+{
+public:
+ bool postBuild();
+ void draw();
+ void cancel(const std::vector<std::string> settings_to_skip = {});
+ void saveSettings();
+ void resetDirtyChilds();
+ void onMPRecommanded();
+
+protected:
+ bool hasDirtyChilds();
+
+
+private:
+
+
+ LOG_CLASS(LLPanelPreferenceGraphics3);
+};
+
class LLPanelPreferenceControls : public LLPanelPreference, public LLKeyBindResponderInterface
{
LOG_CLASS(LLPanelPreferenceControls);
diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
index 94b95b21c2..a8a1e507a8 100644
--- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
+++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
@@ -274,9 +274,7 @@ void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTe
void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
- LLComboBox* ctrl_shadows_quality = getChild<LLComboBox>("MPShadowQuality");
LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText");
- LLTextBox* shadows_quality_text = getChild<LLTextBox>("RenderShadowQualityText");
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
@@ -292,9 +290,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
//deferred needs windlight, disable deferred
ctrl_shadows->setEnabled(false);
ctrl_shadows->setValue(0);
- ctrl_shadows_quality->setEnabled(false);
shadows_text->setEnabled(false);
- shadows_quality_text->setEnabled(false);
ctrl_ssao->setEnabled(false);
ctrl_ssao->setValue(false);
@@ -308,9 +304,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
ctrl_shadows->setEnabled(false);
ctrl_shadows->setValue(0);
- ctrl_shadows_quality->setEnabled(false);
shadows_text->setEnabled(false);
- shadows_quality_text->setEnabled(false);
ctrl_ssao->setEnabled(false);
ctrl_ssao->setValue(false);
@@ -331,9 +325,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
ctrl_shadows->setEnabled(false);
ctrl_shadows->setValue(0);
- ctrl_shadows_quality->setEnabled(false);
shadows_text->setEnabled(false);
- shadows_quality_text->setEnabled(false);
}
// Vintage mode
@@ -363,9 +355,7 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
- LLComboBox* ctrl_shadow_quality = getChild<LLComboBox>("MPShadowQuality");
LLTextBox* shadow_text = getChild<LLTextBox>("RenderShadowDetailText");
- LLTextBox* shadows_quality_text = getChild<LLTextBox>("RenderShadowQualityText");
// note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO");// && ctrl_deferred->get();
@@ -378,9 +368,7 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
ctrl_shadow->setEnabled(enabled);
- ctrl_shadow_quality->setEnabled(enabled);
shadow_text->setEnabled(enabled);
- shadows_quality_text->setEnabled(enabled);
// Hardware settings
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/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 2d972ea3f5..7673c2bacd 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -270,10 +270,12 @@ bool LLFloaterRegionInfo::postBuild()
static LLCachedControl<bool> feature_pbr_terrain_transforms_enabled(gSavedSettings, "RenderTerrainPBRTransformsEnabled", false);
if (!feature_pbr_terrain_transforms_enabled() || !feature_pbr_terrain_enabled())
{
+ LL_INFOS("Terrain") << "Building region terrain panel from panel_region_terrain.xml" << LL_ENDL;
panel->buildFromFile("panel_region_terrain.xml");
}
else
{
+ LL_INFOS("Terrain") << "Building region terrain panel from panel_region_terrain_texture_transform.xml" << LL_ENDL;
panel->buildFromFile("panel_region_terrain_texture_transform.xml");
}
mTab->addTabPanel(panel);
@@ -1490,6 +1492,11 @@ bool LLPanelRegionTerrainInfo::validateMaterials()
const LLUUID& material_asset_id = material_ctrl->getImageAssetID();
llassert(material_asset_id.notNull());
if (material_asset_id.isNull()) { return false; }
+ if (material_asset_id == BLANK_MATERIAL_ASSET_ID)
+ {
+ // Default/Blank material is valid by default
+ continue;
+ }
const LLFetchedGLTFMaterial* material = gGLTFMaterialList.getMaterial(material_asset_id);
if (!material->isLoaded())
{
@@ -1999,18 +2006,7 @@ void LLPanelRegionTerrainInfo::initMaterialCtrl(LLTextureCtrl*& ctrl, const std:
ctrl->setCommitCallback(
[this, index](LLUICtrl* ctrl, const LLSD& param)
{
- if (!mMaterialScaleUCtrl[index]
- || !mMaterialScaleVCtrl[index]
- || !mMaterialRotationCtrl[index]
- || !mMaterialOffsetUCtrl[index]
- || !mMaterialOffsetVCtrl[index]) return;
-
- mMaterialScaleUCtrl[index]->setValue(1.f);
- mMaterialScaleVCtrl[index]->setValue(1.f);
- mMaterialRotationCtrl[index]->setValue(0.f);
- mMaterialOffsetUCtrl[index]->setValue(0.f);
- mMaterialOffsetVCtrl[index]->setValue(0.f);
- onChangeAnything();
+ callbackMaterialCommit(index);
});
}
@@ -2098,6 +2094,25 @@ bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, con
return false;
}
+void LLPanelRegionTerrainInfo::callbackMaterialCommit(S32 index)
+{
+ // These can be null if 'transforms' panel was not inited
+ if (mMaterialScaleUCtrl[index]
+ && mMaterialScaleVCtrl[index]
+ && mMaterialRotationCtrl[index]
+ && mMaterialOffsetUCtrl[index]
+ && mMaterialOffsetVCtrl[index])
+ {
+ mMaterialScaleUCtrl[index]->setValue(1.f);
+ mMaterialScaleVCtrl[index]->setValue(1.f);
+ mMaterialRotationCtrl[index]->setValue(0.f);
+ mMaterialOffsetUCtrl[index]->setValue(0.f);
+ mMaterialOffsetVCtrl[index]->setValue(0.f);
+ }
+
+ onChangeAnything();
+}
+
/////////////////////////////////////////////////////////////////////////////
// LLPanelEstateInfo
//
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index a8631c36ca..0036df9c3d 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -272,6 +272,7 @@ public:
static void onClickBakeTerrain(void*);
bool callbackBakeTerrain(const LLSD& notification, const LLSD& response);
bool callbackTextureHeights(const LLSD& notification, const LLSD& response);
+ void callbackMaterialCommit(S32 index);
protected:
bool sendUpdate() override;
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index d3c8bf3451..9b7a4e5134 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -1,11 +1,10 @@
/**
* @file llfloatersearch.cpp
- * @author Martin Reddy
- * @brief Search floater - uses an embedded web browser control
+ * @brief Floater for Search (update 2025, preload)
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,68 +26,48 @@
#include "llviewerprecompiledheaders.h"
+#include "llfloatersearch.h"
+
+#include "llagent.h"
#include "llcommandhandler.h"
#include "llfloaterreg.h"
-#include "llfloatersearch.h"
-#include "llhttpconstants.h"
#include "llmediactrl.h"
-#include "llnotificationsutil.h"
-#include "lllogininstance.h"
-#include "lluri.h"
-#include "llagent.h"
-#include "llui.h"
+#include "lluictrlfactory.h"
#include "llviewercontrol.h"
#include "llweb.h"
// support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps
-class LLSearchHandler : public LLCommandHandler
-{
-public:
- // requires trusted browser to trigger
- LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { }
- bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
- {
- const size_t parts = tokens.size();
+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,50 @@ void LLFloaterSearch::search(const SearchQuery &p)
}
}
- // add the user's preferred maturity (can be changed via prefs)
- std::string maturity;
+ // Default to PG
+ std::string maturity = "g";
if (gAgent.prefersAdult())
{
- maturity = "gma"; // PG,Mature,Adult
+ // PG,Mature,Adult
+ maturity = "gma";
}
else if (gAgent.prefersMature())
{
- maturity = "gm"; // PG,Mature
- }
- else
- {
- maturity = "g"; // PG
+ // PG,Mature
+ maturity = "gm";
}
subs["MATURITY"] = maturity;
- // add the user's god status
+ // God status
subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
- // get the search URL and expand all of the substitutions
- // (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
- std::string url = gSavedSettings.getString("SearchURL");
+ // This call expands a set of generic substitutions like language, viewer version
+ // etc. and then also does the same with the list of subs passed in.
url = LLWeb::expandURLSubstitutions(url, subs);
- // and load the URL in the web view
+ // Naviation to the calculated URL - we know it's HTML so we can
+ // tell the media system not to bother with the MIME type check.
mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
}
+
+bool LLFloaterSearch::postBuild()
+{
+ if (!LLFloaterWebContent::postBuild())
+ return false;
+
+ mWebBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+
+ // If cookie is there, will set it now, Otherwise will have to wait for login completion
+ // which will also update search instance if it already exists.
+ LLViewerMedia::getInstance()->getOpenIDCookie(mWebBrowser);
+
+ getChildView("address")->setEnabled(false);
+ getChildView("popexternal")->setEnabled(false);
+
+ // This call is actioned by the preload code in llViewerWindow
+ // that creates the search floater during the login process
+ // using a generic search with no query
+ initiateSearch(LLSD());
+
+ return true;
+}
diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h
index beaac2ad2f..6d93474f4a 100644
--- a/indra/newview/llfloatersearch.h
+++ b/indra/newview/llfloatersearch.h
@@ -1,11 +1,10 @@
/**
* @file llfloatersearch.h
- * @author Martin Reddy
- * @brief Search floater - uses an embedded web browser control
+ * @brief Floater for Search (update 2025, preload)
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,70 +24,25 @@
* $/LicenseInfo$
*/
-#ifndef LL_LLFLOATERSEARCH_H
-#define LL_LLFLOATERSEARCH_H
+#pragma once
+#include "llfloater.h"
#include "llfloaterwebcontent.h"
-#include "llviewermediaobserver.h"
-#include <string>
+class LLFloaterSearch:
+ public LLFloaterWebContent {
+ friend class LLFloaterReg;
-class LLMediaCtrl;
+ public:
+ void onOpen(const LLSD& key) override;
+ void onClose(bool app_quitting) override;
-///
-/// The search floater allows users to perform all search operations.
-/// All search functionality is now implemented via web services and
-/// so this floater simply embeds a web view and displays the search
-/// web page. The browser control is explicitly marked as "trusted"
-/// so that the user can click on teleport links in search results.
-///
-class LLFloaterSearch :
- public LLFloaterWebContent
-{
-public:
- struct SearchQuery : public LLInitParam::Block<SearchQuery>
- {
- Optional<std::string> category;
- Optional<std::string> collection;
- Optional<std::string> query;
+ private:
+ LLFloaterSearch(const LLSD& key);
+ ~LLFloaterSearch();
+ void initiateSearch(const LLSD& tokens);
+ bool postBuild() override;
- SearchQuery();
- };
-
- struct _Params : public LLInitParam::Block<_Params, LLFloaterWebContent::Params>
- {
- Optional<SearchQuery> search;
- };
-
- typedef LLSDParamAdapter<_Params> Params;
-
- LLFloaterSearch(const Params& key);
-
- /// show the search floater with a new search
- /// see search() for details on the key parameter.
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ void onClose(bool app_quitting);
-
- /// perform a search with the specific search term.
- /// The key should be a map that can contain the following keys:
- /// - "id": specifies the text phrase to search for
- /// - "category": one of "all" (default), "people", "places",
- /// "events", "groups", "wiki", "destinations", "classifieds"
- void search(const SearchQuery &query);
-
- /// changing godmode can affect the search results that are
- /// returned by the search website - use this method to tell the
- /// search floater that the user has changed god level.
- void godLevelChanged(U8 godlevel);
-
-private:
- /*virtual*/ bool postBuild();
-
- std::set<std::string> mSearchType;
- std::set<std::string> mCollectionType;
- U8 mSearchGodLevel;
+ std::set<std::string> mSearchType;
+ std::set<std::string> mCollectionType;
};
-
-#endif // LL_LLFLOATERSEARCH_H
-
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index 8cc01f6dc6..01108b5cfa 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -207,14 +207,14 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
mSettingNameText->setToolTip(controlp->getName());
mComment->setVisible(true);
- std::string old_text = mComment->getText();
std::string new_text = controlp->getComment();
// Don't setText if not nessesary, it will reset scroll
// This is a debug UI that reads from xml, there might
// be use cases where comment changes, but not the name
- if (old_text != new_text)
+ if (mOldText != new_text)
{
mComment->setText(controlp->getComment());
+ mOldText = new_text;
}
mValSpinner1->setMaxValue(F32_MAX);
@@ -467,6 +467,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
}
default:
mComment->setText(std::string("unknown"));
+ mOldText = "unknown";
break;
}
}
diff --git a/indra/newview/llfloatersettingsdebug.h b/indra/newview/llfloatersettingsdebug.h
index b813cf4a74..8781cd3b67 100644
--- a/indra/newview/llfloatersettingsdebug.h
+++ b/indra/newview/llfloatersettingsdebug.h
@@ -82,6 +82,7 @@ protected:
LLColorSwatchCtrl* mColorSwatch = nullptr;
std::string mSearchFilter;
+ std::string mOldText;
};
#endif //LLFLOATERDEBUGSETTINGS_H
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 68b9e758a1..faf7ed0d8c 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -60,12 +60,13 @@ LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshotBase*
{
LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container");
LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel());
- if (!active_panel)
- {
- LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL;
- }
+
if (!ok_if_not_found)
{
+ if (!active_panel)
+ {
+ LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL;
+ }
llassert_always(active_panel != NULL);
}
return active_panel;
@@ -516,34 +517,13 @@ void LLFloaterSnapshotBase::ImplBase::onClickFilter(LLUICtrl *ctrl, void* data)
}
// static
-void LLFloaterSnapshotBase::ImplBase::onClickUICheck(LLUICtrl *ctrl, void* data)
+void LLFloaterSnapshotBase::ImplBase::onClickDisplaySetting(LLUICtrl* ctrl, void* data)
{
- LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
- gSavedSettings.setBOOL( "RenderUIInSnapshot", check->get() );
-
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
+ LLFloaterSnapshot* view = (LLFloaterSnapshot*)data;
if (view)
{
LLSnapshotLivePreview* previewp = view->getPreviewView();
- if(previewp)
- {
- previewp->updateSnapshot(true, true);
- }
- view->impl->updateControls(view);
- }
-}
-
-// static
-void LLFloaterSnapshotBase::ImplBase::onClickHUDCheck(LLUICtrl *ctrl, void* data)
-{
- LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
- gSavedSettings.setBOOL( "RenderHUDInSnapshot", check->get() );
-
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- if (view)
- {
- LLSnapshotLivePreview* previewp = view->getPreviewView();
- if(previewp)
+ if (previewp)
{
previewp->updateSnapshot(true, true);
}
@@ -1002,11 +982,9 @@ bool LLFloaterSnapshot::postBuild()
mSucceessLblPanel = getChild<LLUICtrl>("succeeded_panel");
mFailureLblPanel = getChild<LLUICtrl>("failed_panel");
- childSetCommitCallback("ui_check", ImplBase::onClickUICheck, this);
- getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot"));
-
- childSetCommitCallback("hud_check", ImplBase::onClickHUDCheck, this);
- getChild<LLUICtrl>("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot"));
+ childSetCommitCallback("ui_check", ImplBase::onClickDisplaySetting, this);
+ childSetCommitCallback("balance_check", ImplBase::onClickDisplaySetting, this);
+ childSetCommitCallback("hud_check", ImplBase::onClickDisplaySetting, this);
((Impl*)impl)->setAspectRatioCheckboxValue(this, gSavedSettings.getBOOL("KeepAspectForSnapshot"));
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index 6df851b839..186d9c41cf 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -103,8 +103,7 @@ public:
static void onClickAutoSnap(LLUICtrl *ctrl, void* data);
static void onClickNoPost(LLUICtrl *ctrl, void* data);
static void onClickFilter(LLUICtrl *ctrl, void* data);
- static void onClickUICheck(LLUICtrl *ctrl, void* data);
- static void onClickHUDCheck(LLUICtrl *ctrl, void* data);
+ static void onClickDisplaySetting(LLUICtrl *ctrl, void* data);
static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);
virtual LLPanelSnapshot* getActivePanel(LLFloaterSnapshotBase* floater, bool ok_if_not_found = true) = 0;
diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp
index f6257dbd3d..5e3ec366d5 100644
--- a/indra/newview/llfloatertoybox.cpp
+++ b/indra/newview/llfloatertoybox.cpp
@@ -63,7 +63,7 @@ bool LLFloaterToybox::postBuild()
mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));
mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4));
- mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4));
+ mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4,_5));
mToolBar->setButtonEnterCallback(boost::bind(&LLFloaterToybox::onToolBarButtonEnter,this,_1));
//
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 9bc075d03f..af58c6316d 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -1043,7 +1043,9 @@ void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filen
{
CFStringRef executable_cfstr = (CFStringRef)CFDictionaryGetValue(bundleInfoDict, CFSTR("CFBundleExecutable")); // get the name of the actual executable (e.g. TextEdit or firefox-bin)
int max_file_length = 256; // (max file name length is 255 in OSX)
- char executable_buf[max_file_length];
+
+ // Xcode 26: VLAs are a clang extension. Just create the buffer and delete it after.
+ char *executable_buf = new char [max_file_length];
if(CFStringGetCString(executable_cfstr, executable_buf, max_file_length, kCFStringEncodingMacRoman)) // convert CFStringRef to char*
{
executable_path += std::string("/Contents/MacOS/") + std::string(executable_buf); // append path to executable directory and then executable name to exec path
@@ -1053,6 +1055,7 @@ void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filen
std::string warning = "Unable to get CString from CFString for executable path";
popupAndPrintWarning(warning);
}
+ delete [] executable_buf;
}
else
{
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index 7651b2528f..2f1857ec61 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -242,6 +242,16 @@ void LLFloaterURLEntry::getMediaTypeCoro(std::string url, LLHandle<LLFloater> pa
resolvedMimeType = mimeType;
}
}
+ else if (resultHeaders.has(HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS))
+ {
+ const std::string& val = resultHeaders[HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS];
+ if (val == HTTP_NOSNIFF)
+ {
+ // Doesn't permit 'sniffing' mime type, default to either html or plain
+ // If this doesn't work user will have to choose something manually.
+ resolvedMimeType = HTTP_CONTENT_TEXT_HTML;
+ }
+ }
floaterUrlEntry->headerFetchComplete(status.getType(), resolvedMimeType);
diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp
index e1b6df6072..3ff84ac9b7 100644
--- a/indra/newview/llfloaterwebcontent.cpp
+++ b/indra/newview/llfloaterwebcontent.cpp
@@ -130,7 +130,7 @@ void LLFloaterWebContent::initializeURLHistory()
for(; iter_history != end_history; ++iter_history)
{
std::string url = (*iter_history).asString();
- if(! url.empty())
+ if(! url.empty() && url_list)
url_list->addSimpleElement(url);
}
}
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 30ed723db6..03979edbc1 100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -169,6 +169,52 @@ public:
};
LLWorldMapHandler gWorldMapHandler;
+// handle secondlife:///app/worldmap_global/{GLOBAL_COORDS} URLs
+class LLWorldMapGlobalHandler : public LLCommandHandler
+{
+public:
+ LLWorldMapGlobalHandler() : LLCommandHandler("worldmap_global", UNTRUSTED_THROTTLE)
+ {}
+
+ virtual bool canHandleUntrusted(
+ const LLSD& params,
+ const LLSD& query_map,
+ LLMediaCtrl* web,
+ const std::string& nav_type)
+ {
+ if (nav_type == NAV_TYPE_CLICKED
+ || nav_type == NAV_TYPE_EXTERNAL)
+ {
+ // NAV_TYPE_EXTERNAL will be throttled
+ return true;
+ }
+
+ return false;
+ }
+
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
+ {
+ if (params.size() < 3)
+ {
+ LL_WARNS() << "Correct global coordinates are not provided." << LL_ENDL;
+ return true;
+ }
+
+ LLVector3d parcel_global_pos = LLVector3d(params[0].asInteger(), params[1].asInteger(), params[2].asInteger());
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+ if (!parcel_global_pos.isExactlyZero() && worldmap_instance)
+ {
+ worldmap_instance->trackLocation(parcel_global_pos);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+ return true;
+ }
+};
+LLWorldMapGlobalHandler gWorldMapGlobalHandler;
+
// SocialMap handler secondlife:///app/maptrackavatar/id
class LLMapTrackAvatarHandler : public LLCommandHandler
{
@@ -325,11 +371,9 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
mWaitingForTracker(false),
mIsClosing(false),
mSetToUserPosition(true),
+ mProcessingSearchUpdate(false),
mTrackedLocation(0.0,0.0,0.0),
mTrackedStatus(LLTracker::TRACKING_NOTHING),
- mListFriendCombo(nullptr),
- mListLandmarkCombo(nullptr),
- mListSearchResults(nullptr),
mParcelInfoObserver(nullptr),
mShowParcelInfo(false)
{
@@ -341,7 +385,7 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
mCommitCallbackRegistrar.add("WMap.Location", boost::bind(&LLFloaterWorldMap::onLocationCommit, this));
mCommitCallbackRegistrar.add("WMap.AvatarCombo", boost::bind(&LLFloaterWorldMap::onAvatarComboCommit, this));
mCommitCallbackRegistrar.add("WMap.Landmark", boost::bind(&LLFloaterWorldMap::onLandmarkComboCommit, this));
- mCommitCallbackRegistrar.add("WMap.SearchResult", boost::bind(&LLFloaterWorldMap::onCommitSearchResult, this));
+ mCommitCallbackRegistrar.add("WMap.SearchResult", [this](LLUICtrl* ctrl, const LLSD& data) { LLFloaterWorldMap::onCommitSearchResult(false); });
mCommitCallbackRegistrar.add("WMap.GoHome", boost::bind(&LLFloaterWorldMap::onGoHome, this));
mCommitCallbackRegistrar.add("WMap.Teleport", boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
mCommitCallbackRegistrar.add("WMap.ShowTarget", boost::bind(&LLFloaterWorldMap::onShowTargetBtn, this));
@@ -383,32 +427,33 @@ bool LLFloaterWorldMap::postBuild()
mTeleportCoordSpinY = getChild<LLUICtrl>("teleport_coordinate_y");
mTeleportCoordSpinZ = getChild<LLUICtrl>("teleport_coordinate_z");
- LLComboBox *avatar_combo = getChild<LLComboBox>("friend combo");
- avatar_combo->selectFirstItem();
- avatar_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this) );
- avatar_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
- mListFriendCombo = dynamic_cast<LLCtrlListInterface *>(avatar_combo);
+ mFriendCombo = getChild<LLComboBox>("friend combo");
+ mFriendCombo->selectFirstItem();
+ mFriendCombo->setPrearrangeCallback(boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this));
+ mFriendCombo->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onComboTextEntry, this));
mLocationEditor = getChild<LLSearchEditor>("location");
mLocationEditor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1));
- mLocationEditor->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
+ mLocationEditor->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
- getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
- mListSearchResults = childGetListInterface("search_results");
+ mSearchResults = getChild<LLScrollListCtrl>("search_results");
+ mSearchResults->setDoubleClickCallback(boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
- LLComboBox *landmark_combo = getChild<LLComboBox>( "landmark combo");
- landmark_combo->selectFirstItem();
- landmark_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this) );
- landmark_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
- mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo);
+ mLandmarkCombo = getChild<LLComboBox>("landmark combo");
+ mLandmarkCombo->selectFirstItem();
+ mLandmarkCombo->setPrearrangeCallback(boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this));
+ mLandmarkCombo->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onComboTextEntry, this));
mZoomSlider = getChild<LLSliderCtrl>("zoom slider");
F32 slider_zoom = mMapView->getZoom();
mZoomSlider->setValue(slider_zoom);
+ mTrackCtrlsPanel = getChild<LLPanel>("layout_panel_4");
+ mSearchButton = getChild<LLButton>("DoSearch");
+
getChild<LLPanel>("expand_btn_panel")->setMouseDownCallback(boost::bind(&LLFloaterWorldMap::onExpandCollapseBtn, this));
- setDefaultBtn(NULL);
+ mTrackCtrlsPanel->setDefaultBtn(nullptr);
onChangeMaturity();
@@ -486,8 +531,11 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id);
- mLocationEditor->setFocus( true);
- gFocusMgr.triggerFocusFlash();
+ if (hasFocus())
+ {
+ mLocationEditor->setFocus( true);
+ gFocusMgr.triggerFocusFlash();
+ }
buildAvatarIDList();
buildLandmarkIDLists();
@@ -605,7 +653,6 @@ void LLFloaterWorldMap::draw()
}
mTeleportButton->setEnabled((bool)tracking_status);
- // getChildView("Clear")->setEnabled((bool)tracking_status);
mShowDestinationButton->setEnabled((bool)tracking_status || LLWorldMap::getInstance()->isTracking());
mCopySlurlButton->setEnabled((mSLURL.isValid()) );
@@ -697,26 +744,24 @@ void LLFloaterWorldMap::requestParcelInfo(const LLVector3d& pos_global, const LL
}
}
-void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string& name )
+void LLFloaterWorldMap::trackAvatar(const LLUUID& avatar_id, const std::string& name)
{
mShowParcelInfo = false;
- LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo");
- if (!iface) return;
buildAvatarIDList();
- if(iface->setCurrentByID(avatar_id) || gAgent.isGodlike())
+ if (mFriendCombo->setCurrentByID(avatar_id) || gAgent.isGodlike())
{
// *HACK: Adjust Z values automatically for liaisons & gods so
// they swoop down when they click on the map. Requested
// convenience.
- if(gAgent.isGodlike())
+ if (gAgent.isGodlike())
{
mTeleportCoordSpinZ->setValue(LLSD(200.f));
}
// Don't re-request info if we already have it or we won't have it in time to teleport
if (mTrackedStatus != LLTracker::TRACKING_AVATAR || avatar_id != mTrackedAvatarID)
{
- mTrackedStatus = LLTracker::TRACKING_AVATAR;
+ mTrackedStatus = LLTracker::TRACKING_AVATAR;
mTrackedAvatarID = avatar_id;
LLTracker::trackAvatar(avatar_id, name);
}
@@ -725,52 +770,45 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&
{
LLTracker::stopTracking(false);
}
- setDefaultBtn("Teleport");
+ mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);
}
-void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
+void LLFloaterWorldMap::trackLandmark(const LLUUID& landmark_item_id)
{
mShowParcelInfo = false;
- LLCtrlSelectionInterface *iface = childGetSelectionInterface("landmark combo");
- if (!iface) return;
buildLandmarkIDLists();
bool found = false;
- S32 idx;
+ S32 idx;
for (idx = 0; idx < mLandmarkItemIDList.size(); idx++)
{
- if ( mLandmarkItemIDList.at(idx) == landmark_item_id)
+ if (mLandmarkItemIDList.at(idx) == landmark_item_id)
{
found = true;
break;
}
}
- if (found && iface->setCurrentByID( landmark_item_id ) )
+ if (found && mLandmarkCombo->setCurrentByID(landmark_item_id))
{
- LLUUID asset_id = mLandmarkAssetIDList.at( idx );
- std::string name;
- LLComboBox* combo = getChild<LLComboBox>( "landmark combo");
- if (combo) name = combo->getSimple();
- mTrackedStatus = LLTracker::TRACKING_LANDMARK;
- LLTracker::trackLandmark(mLandmarkAssetIDList.at( idx ), // assetID
- mLandmarkItemIDList.at( idx ), // itemID
- name); // name
+ LLUUID asset_id = mLandmarkAssetIDList.at(idx);
+ std::string name = mLandmarkCombo->getSimple();
+ mTrackedStatus = LLTracker::TRACKING_LANDMARK;
+ LLTracker::trackLandmark(mLandmarkAssetIDList.at(idx), // assetID
+ mLandmarkItemIDList.at(idx), // itemID
+ name); // name
- if( asset_id != sHomeID )
+ if (asset_id != sHomeID)
{
// start the download process
- gLandmarkList.getAsset( asset_id);
+ gLandmarkList.getAsset(asset_id);
}
-
- // We have to download both region info and landmark data, so set busy. JC
- // getWindow()->incBusyCount();
}
else
{
LLTracker::stopTracking(false);
}
- setDefaultBtn("Teleport");
+ mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);
}
@@ -779,7 +817,7 @@ void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info)
mShowParcelInfo = false;
mTrackedStatus = LLTracker::TRACKING_LOCATION;
LLTracker::trackLocation(event_info.getGlobalPosition(), event_info.getName(), event_info.getToolTip(), LLTracker::LOCATION_EVENT);
- setDefaultBtn("Teleport");
+ mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);
}
void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item)
@@ -787,11 +825,12 @@ void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item)
mShowParcelInfo = false;
mTrackedStatus = LLTracker::TRACKING_LOCATION;
LLTracker::trackLocation(item.getGlobalPosition(), item.getName(), item.getToolTip(), LLTracker::LOCATION_ITEM);
- setDefaultBtn("Teleport");
+ mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);
}
void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
{
+ mProcessingSearchUpdate = false;
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
if (!sim_info)
{
@@ -801,7 +840,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
S32 world_x = S32(pos_global.mdV[0] / 256);
S32 world_y = S32(pos_global.mdV[1] / 256);
LLWorldMapMessage::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true);
- setDefaultBtn("");
+ mTrackCtrlsPanel->setDefaultBtn(nullptr);
// clicked on a non-region - turn off coord display
enableTeleportCoordsDisplay( false );
@@ -815,7 +854,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
LLTracker::stopTracking(false);
LLWorldMap::getInstance()->setTracking(pos_global);
LLWorldMap::getInstance()->setTrackingInvalid();
- setDefaultBtn("");
+ mTrackCtrlsPanel->setDefaultBtn(nullptr);
// clicked on a down region - turn off coord display
enableTeleportCoordsDisplay( false );
@@ -846,7 +885,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
// we have a valid region - turn on coord display
enableTeleportCoordsDisplay( true );
- setDefaultBtn("Teleport");
+ mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);
}
// enable/disable teleport destination coordinates
@@ -931,7 +970,10 @@ void LLFloaterWorldMap::updateLocation()
}
}
- mLocationEditor->setValue(sim_name);
+ if (!mProcessingSearchUpdate)
+ {
+ mLocationEditor->setValue(sim_name);
+ }
// refresh coordinate display to reflect where user clicked.
LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal();
@@ -961,7 +1003,7 @@ void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S3
local_pos.mV[VZ] = (F32)z_coord;
LLVector3d global_pos = sim_info->getGlobalPos(local_pos);
trackLocation(global_pos);
- setDefaultBtn("Teleport");
+ mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);
}
else
{
@@ -1022,17 +1064,14 @@ void LLFloaterWorldMap::observeFriends()
void LLFloaterWorldMap::friendsChanged()
{
- LLAvatarTracker& t = LLAvatarTracker::instance();
- const LLUUID& avatar_id = t.getAvatarID();
+ LLAvatarTracker& t = LLAvatarTracker::instance();
+ const LLUUID& avatar_id = t.getAvatarID();
buildAvatarIDList();
- if(avatar_id.notNull())
+ if (avatar_id.notNull())
{
- LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo");
const LLRelationship* buddy_info = t.getBuddyInfo(avatar_id);
- if(!iface ||
- !iface->setCurrentByID(avatar_id) ||
- (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) ||
- gAgent.isGodlike())
+ if (!mFriendCombo->setCurrentByID(avatar_id) ||
+ (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) || gAgent.isGodlike())
{
LLTracker::stopTracking(false);
}
@@ -1042,15 +1081,12 @@ void LLFloaterWorldMap::friendsChanged()
// No longer really builds a list. Instead, just updates mAvatarCombo.
void LLFloaterWorldMap::buildAvatarIDList()
{
- LLCtrlListInterface *list = mListFriendCombo;
- if (!list) return;
-
// Delete all but the "None" entry
- S32 list_size = list->getItemCount();
+ S32 list_size = mFriendCombo->getItemCount();
if (list_size > 1)
{
- list->selectItemRange(1, -1);
- list->operateOnSelection(LLCtrlListInterface::OP_DELETE);
+ mFriendCombo->selectItemRange(1, -1);
+ mFriendCombo->operateOnSelection(LLCtrlListInterface::OP_DELETE);
}
// Get all of the calling cards for avatar that are currently online
@@ -1058,29 +1094,26 @@ void LLFloaterWorldMap::buildAvatarIDList()
LLAvatarTracker::instance().applyFunctor(collector);
LLCollectMappableBuddies::buddy_map_t::iterator it;
LLCollectMappableBuddies::buddy_map_t::iterator end;
- it = collector.mMappable.begin();
+ it = collector.mMappable.begin();
end = collector.mMappable.end();
- for( ; it != end; ++it)
+ for (; it != end; ++it)
{
- list->addSimpleElement((*it).second, ADD_BOTTOM, (*it).first);
+ mFriendCombo->addSimpleElement((*it).second, ADD_BOTTOM, (*it).first);
}
- list->setCurrentByID( LLAvatarTracker::instance().getAvatarID() );
- list->selectFirstItem();
+ mFriendCombo->setCurrentByID(LLAvatarTracker::instance().getAvatarID());
+ mFriendCombo->selectFirstItem();
}
void LLFloaterWorldMap::buildLandmarkIDLists()
{
- LLCtrlListInterface *list = mListLandmarkCombo;
- if (!list) return;
-
// Delete all but the "None" entry
- S32 list_size = list->getItemCount();
+ S32 list_size = mLandmarkCombo->getItemCount();
if (list_size > 1)
{
- list->selectItemRange(1, -1);
- list->operateOnSelection(LLCtrlListInterface::OP_DELETE);
+ mLandmarkCombo->selectItemRange(1, -1);
+ mLandmarkCombo->operateOnSelection(LLCtrlListInterface::OP_DELETE);
}
mLandmarkItemIDList.clear();
@@ -1112,13 +1145,13 @@ void LLFloaterWorldMap::buildLandmarkIDLists()
{
LLInventoryItem* item = items.at(i);
- list->addSimpleElement(item->getName(), ADD_BOTTOM, item->getUUID());
+ mLandmarkCombo->addSimpleElement(item->getName(), ADD_BOTTOM, item->getUUID());
mLandmarkAssetIDList.push_back( item->getAssetUUID() );
mLandmarkItemIDList.push_back( item->getUUID() );
}
- list->selectFirstItem();
+ mLandmarkCombo->selectFirstItem();
}
@@ -1136,10 +1169,9 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination,
void LLFloaterWorldMap::clearLocationSelection(bool clear_ui, bool dest_reached)
{
- LLCtrlListInterface *list = mListSearchResults;
- if (list && (!dest_reached || (list->getItemCount() == 1)))
+ if (!dest_reached || (mSearchResults->getItemCount() == 1))
{
- list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ mSearchResults->operateOnAll(LLCtrlListInterface::OP_DELETE);
}
LLWorldMap::getInstance()->cancelTracking();
mCompletingRegionName = "";
@@ -1150,11 +1182,7 @@ void LLFloaterWorldMap::clearLandmarkSelection(bool clear_ui)
{
if (clear_ui || !childHasKeyboardFocus("landmark combo"))
{
- LLCtrlListInterface *list = mListLandmarkCombo;
- if (list)
- {
- list->selectByValue( "None" );
- }
+ mLandmarkCombo->selectByValue("None");
}
}
@@ -1164,10 +1192,9 @@ void LLFloaterWorldMap::clearAvatarSelection(bool clear_ui)
if (clear_ui || !childHasKeyboardFocus("friend combo"))
{
mTrackedStatus = LLTracker::TRACKING_NOTHING;
- LLCtrlListInterface *list = mListFriendCombo;
- if (list && list->getSelectedValue().asString() != "None")
+ if (mFriendCombo->getSelectedValue().asString() != "None")
{
- list->selectByValue( "None" );
+ mFriendCombo->selectByValue("None");
}
}
}
@@ -1220,28 +1247,25 @@ void LLFloaterWorldMap::onGoHome()
{
gAgent.teleportHome();
closeFloater();
+ mProcessingSearchUpdate = false;
}
-void LLFloaterWorldMap::onLandmarkComboPrearrange( )
+void LLFloaterWorldMap::onLandmarkComboPrearrange()
{
- if( mIsClosing )
+ if (mIsClosing)
{
return;
}
- LLCtrlListInterface *list = mListLandmarkCombo;
- if (!list) return;
-
- LLUUID current_choice = list->getCurrentID();
+ LLUUID current_choice = mLandmarkCombo->getCurrentID();
buildLandmarkIDLists();
- if( current_choice.isNull() || !list->setCurrentByID( current_choice ) )
+ if (current_choice.isNull() || !mLandmarkCombo->setCurrentByID(current_choice))
{
LLTracker::stopTracking(false);
}
-
}
void LLFloaterWorldMap::onComboTextEntry()
@@ -1261,33 +1285,28 @@ void LLFloaterWorldMap::onSearchTextEntry( )
void LLFloaterWorldMap::onLandmarkComboCommit()
{
- if( mIsClosing )
+ if (mIsClosing)
{
return;
}
- LLCtrlListInterface *list = mListLandmarkCombo;
- if (!list) return;
-
LLUUID asset_id;
- LLUUID item_id = list->getCurrentID();
+ LLUUID item_id = mLandmarkCombo->getCurrentID();
LLTracker::stopTracking(false);
- //RN: stopTracking() clears current combobox selection, need to reassert it here
- list->setCurrentByID(item_id);
+ // RN: stopTracking() clears current combobox selection, need to reassert it here
+ mLandmarkCombo->setCurrentByID(item_id);
- if( item_id.isNull() )
- {
- }
- else if( item_id == sHomeID )
+ if (item_id.isNull()) {}
+ else if (item_id == sHomeID)
{
asset_id = sHomeID;
}
else
{
- LLInventoryItem* item = gInventory.getItem( item_id );
- if( item )
+ LLInventoryItem* item = gInventory.getItem(item_id);
+ if (item)
{
asset_id = item->getAssetUUID();
}
@@ -1298,34 +1317,31 @@ void LLFloaterWorldMap::onLandmarkComboCommit()
}
}
- trackLandmark( item_id);
+ trackLandmark(item_id);
onShowTargetBtn();
// Reset to user postion if nothing is tracked
- mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING );
+ mSetToUserPosition = (LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING);
}
// static
-void LLFloaterWorldMap::onAvatarComboPrearrange( )
+void LLFloaterWorldMap::onAvatarComboPrearrange()
{
- if( mIsClosing )
+ if (mIsClosing)
{
return;
}
- LLCtrlListInterface *list = mListFriendCombo;
- if (!list) return;
-
LLUUID current_choice;
- if( LLAvatarTracker::instance().haveTrackingInfo() )
+ if (LLAvatarTracker::instance().haveTrackingInfo())
{
current_choice = LLAvatarTracker::instance().getAvatarID();
}
buildAvatarIDList();
- if( !list->setCurrentByID( current_choice ) || current_choice.isNull() )
+ if (!mFriendCombo->setCurrentByID(current_choice) || current_choice.isNull())
{
LLTracker::stopTracking(false);
}
@@ -1333,26 +1349,21 @@ void LLFloaterWorldMap::onAvatarComboPrearrange( )
void LLFloaterWorldMap::onAvatarComboCommit()
{
- if( mIsClosing )
+ if (mIsClosing)
{
return;
}
- LLCtrlListInterface *list = mListFriendCombo;
- if (!list) return;
-
- const LLUUID& new_avatar_id = list->getCurrentID();
+ const LLUUID& new_avatar_id = mFriendCombo->getCurrentID();
if (new_avatar_id.notNull())
{
- std::string name;
- LLComboBox* combo = getChild<LLComboBox>("friend combo");
- if (combo) name = combo->getSimple();
+ std::string name = mFriendCombo->getSimple();
trackAvatar(new_avatar_id, name);
onShowTargetBtn();
}
else
- { // Reset to user postion if nothing is tracked
- mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING );
+ { // Reset to user postion if nothing is tracked
+ mSetToUserPosition = (LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING);
}
}
@@ -1372,11 +1383,11 @@ void LLFloaterWorldMap::updateSearchEnabled()
if (childHasKeyboardFocus("location") &&
mLocationEditor->getValue().asString().length() > 0)
{
- setDefaultBtn("DoSearch");
+ mTrackCtrlsPanel->setDefaultBtn(mSearchButton);
}
else
{
- setDefaultBtn(NULL);
+ mTrackCtrlsPanel->setDefaultBtn(nullptr);
}
}
@@ -1406,6 +1417,7 @@ void LLFloaterWorldMap::onLocationCommit()
{
return;
}
+ mProcessingSearchUpdate = true;
LLStringUtil::toLower(str);
mCompletingRegionName = str;
@@ -1427,6 +1439,7 @@ void LLFloaterWorldMap::onCoordinatesCommit()
{
return;
}
+ mProcessingSearchUpdate = false;
S32 x_coord = (S32)mTeleportCoordSpinX->getValue().asReal();
S32 y_coord = (S32)mTeleportCoordSpinY->getValue().asReal();
@@ -1440,6 +1453,7 @@ void LLFloaterWorldMap::onCoordinatesCommit()
void LLFloaterWorldMap::onClearBtn()
{
mTrackedStatus = LLTracker::TRACKING_NOTHING;
+ mProcessingSearchUpdate = false;
LLTracker::stopTracking(true);
LLWorldMap::getInstance()->cancelTracking();
mSLURL = LLSLURL(); // Clear the SLURL since it's invalid
@@ -1456,6 +1470,7 @@ void LLFloaterWorldMap::onShowAgentBtn()
mMapView->setPanWithInterpTime(0, 0, false, 0.1f); // false == animate
// Set flag so user's location will be displayed if not tracking anything else
mSetToUserPosition = true;
+ mProcessingSearchUpdate = false;
}
void LLFloaterWorldMap::onClickTeleportBtn()
@@ -1484,8 +1499,9 @@ void LLFloaterWorldMap::onExpandCollapseBtn()
std::string image_name = getString(toggle_collapse ? "expand_icon" : "collapse_icon");
std::string tooltip = getString(toggle_collapse ? "expand_tooltip" : "collapse_tooltip");
- getChild<LLIconCtrl>("expand_collapse_icon")->setImage(LLUI::getUIImage(image_name));
- getChild<LLIconCtrl>("expand_collapse_icon")->setToolTip(tooltip);
+ LLIconCtrl* expandCollapseIcon = getChild<LLIconCtrl>("expand_collapse_icon");
+ expandCollapseIcon->setImage(LLUI::getUIImage(image_name));
+ expandCollapseIcon->setToolTip(tooltip);
getChild<LLPanel>("expand_btn_panel")->setToolTip(tooltip);
}
@@ -1610,6 +1626,12 @@ void LLFloaterWorldMap::teleport()
gAgent.teleportViaLocation( pos_global );
}
}
+
+ if (mProcessingSearchUpdate)
+ {
+ mProcessingSearchUpdate = false;
+ mTrackedSimName.clear();
+ }
}
void LLFloaterWorldMap::flyToLandmark()
@@ -1677,9 +1699,9 @@ void LLFloaterWorldMap::teleportToAvatar()
void LLFloaterWorldMap::flyToAvatar()
{
- if( LLAvatarTracker::instance().haveTrackingInfo() )
+ if (LLAvatarTracker::instance().haveTrackingInfo())
{
- gAgent.startAutoPilotGlobal( LLAvatarTracker::instance().getGlobalPos() );
+ gAgent.startAutoPilotGlobal(LLAvatarTracker::instance().getGlobalPos());
}
}
@@ -1690,8 +1712,7 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
return;
}
- LLScrollListCtrl *list = getChild<LLScrollListCtrl>("search_results");
- list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ mSearchResults->operateOnAll(LLCtrlListInterface::OP_DELETE);
auto name_length = mCompletingRegionName.length();
@@ -1719,7 +1740,7 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
value["id"] = info->getName();
value["columns"][0]["column"] = "sim_name";
value["columns"][0]["value"] = info->getName();
- list->addElement(value);
+ mSearchResults->addElement(value);
num_results++;
}
}
@@ -1734,21 +1755,24 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
// if match found, highlight it and go
if (!match.isUndefined())
{
- list->selectByValue(match);
+ mSearchResults->selectByValue(match);
+ mSearchResults->setFocus(true);
+ onCommitSearchResult(false /*fully commit the only option*/);
}
- // else select first found item
+ // else let user decide
else
{
- list->selectFirstItem();
+ mSearchResults->selectFirstItem();
+ mSearchResults->setFocus(true);
+ onCommitSearchResult(true /*don't update text field*/);
}
- getChild<LLUICtrl>("search_results")->setFocus(true);
- onCommitSearchResult();
}
else
{
// if we found nothing, say "none"
- list->setCommentText(LLTrans::getString("worldmap_results_none_found"));
- list->operateOnAll(LLCtrlListInterface::OP_DESELECT);
+ mProcessingSearchUpdate = false;
+ mSearchResults->setCommentText(LLTrans::getString("worldmap_results_none_found"));
+ mSearchResults->operateOnAll(LLCtrlListInterface::OP_DESELECT);
}
}
@@ -1760,13 +1784,9 @@ void LLFloaterWorldMap::onTeleportFinished()
}
}
-void LLFloaterWorldMap::onCommitSearchResult()
+void LLFloaterWorldMap::onCommitSearchResult(bool from_search)
{
- LLCtrlListInterface *list = mListSearchResults;
- if (!list) return;
-
- LLSD selected_value = list->getSelectedValue();
- std::string sim_name = selected_value.asString();
+ std::string sim_name = mSearchResults->getSelectedValue().asString();
if (sim_name.empty())
{
return;
@@ -1782,7 +1802,7 @@ void LLFloaterWorldMap::onCommitSearchResult()
{
LLVector3d pos_global = info->getGlobalOrigin();
- const F64 SIM_COORD_DEFAULT = 128.0;
+ constexpr F64 SIM_COORD_DEFAULT = 128.0;
LLVector3 pos_local(SIM_COORD_DEFAULT, SIM_COORD_DEFAULT, 0.0f);
// Did this value come from a trackURL() request?
@@ -1795,9 +1815,15 @@ void LLFloaterWorldMap::onCommitSearchResult()
pos_global.mdV[VY] += (F64)pos_local.mV[VY];
pos_global.mdV[VZ] = (F64)pos_local.mV[VZ];
- mLocationEditor->setValue(sim_name);
+ // Commiting search string automatically selects first item in the search list,
+ // in such case onCommitSearchResult shouldn't modify search string
+ if (!from_search)
+ {
+ mLocationEditor->setValue(sim_name);
+ }
trackLocation(pos_global);
- setDefaultBtn("Teleport");
+ mProcessingSearchUpdate = from_search;
+ mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);
break;
}
}
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index 2f2b2b7a0d..9558ca2615 100644
--- a/indra/newview/llfloaterworldmap.h
+++ b/indra/newview/llfloaterworldmap.h
@@ -51,6 +51,8 @@ class LLCheckBoxCtrl;
class LLSliderCtrl;
class LLSpinCtrl;
class LLSearchEditor;
+class LLComboBox;
+class LLScrollListCtrl;
class LLWorldMapParcelInfoObserver : public LLRemoteParcelInfoObserver
{
@@ -174,7 +176,7 @@ protected:
void onLocationFocusChanged( LLFocusableElement* ctrl );
void onLocationCommit();
void onCoordinatesCommit();
- void onCommitSearchResult();
+ void onCommitSearchResult(bool from_search);
void onTeleportFinished();
@@ -211,6 +213,7 @@ private:
bool mIsClosing;
bool mSetToUserPosition;
+ bool mProcessingSearchUpdate; // Don't update search string from what user set it to
LLVector3d mTrackedLocation;
LLTracker::ETrackingStatus mTrackedStatus;
@@ -218,14 +221,11 @@ private:
LLUUID mTrackedAvatarID;
LLSLURL mSLURL;
- LLCtrlListInterface * mListFriendCombo;
- LLCtrlListInterface * mListLandmarkCombo;
- LLCtrlListInterface * mListSearchResults;
-
LLButton* mTeleportButton = nullptr;
LLButton* mShowDestinationButton = nullptr;
LLButton* mCopySlurlButton = nullptr;
LLButton* mGoHomeButton = nullptr;
+ LLButton* mSearchButton = nullptr;
LLCheckBoxCtrl* mPeopleCheck = nullptr;
LLCheckBoxCtrl* mInfohubCheck = nullptr;
@@ -245,6 +245,13 @@ private:
LLSliderCtrl* mZoomSlider = nullptr;
+ LLComboBox* mLandmarkCombo = nullptr;
+ LLComboBox* mFriendCombo = nullptr;
+
+ LLScrollListCtrl* mSearchResults = nullptr;
+
+ LLPanel* mTrackCtrlsPanel = nullptr;
+
boost::signals2::connection mTeleportFinishConnection;
};
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index c668d414d3..a0621bb015 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -68,9 +68,10 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )
if (!folder->areChildrenInited() || !needsSort(folder->getViewModelItem())) return;
- LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem());
- if (modelp->getUUID().isNull()) return;
+ LLFolderViewModelItemInventory* sort_modelp = static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem());
+ if (!sort_modelp->canSortContent()) return;
+ bool has_favorites = false;
for (std::list<LLFolderViewFolder*>::iterator it = folder->getFoldersBegin(), end_it = folder->getFoldersEnd();
it != end_it;
++it)
@@ -79,11 +80,14 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )
LLFolderViewFolder* child_folderp = *it;
sort(child_folderp);
+ LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem());
+ has_favorites |= child_folderp->isFavorite() || child_folderp->hasFavorites();
+
if (child_folderp->getFoldersCount() > 0)
{
- time_t most_recent_folder_time =
- static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem())->getCreationDate();
- LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem());
+ LLFolderViewModelItemInventory* folderp = static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem());
+ time_t most_recent_folder_time = folderp->getCreationDate();
+
if (most_recent_folder_time > modelp->getCreationDate())
{
modelp->setCreationDate(most_recent_folder_time);
@@ -91,16 +95,26 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )
}
if (child_folderp->getItemsCount() > 0)
{
- time_t most_recent_item_time =
- static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem())->getCreationDate();
+ LLFolderViewModelItemInventory* itemp = static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem());
+ time_t most_recent_item_time = itemp->getCreationDate();
- LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem());
if (most_recent_item_time > modelp->getCreationDate())
{
modelp->setCreationDate(most_recent_item_time);
}
}
}
+ for (std::list<LLFolderViewItem*>::const_iterator it = folder->getItemsBegin(), end_it = folder->getItemsEnd();
+ it != end_it && !has_favorites;
+ ++it)
+ {
+ LLFolderViewItem* child_itemp = *it;
+ has_favorites |= child_itemp->isFavorite();
+ }
+ if (has_favorites)
+ {
+ folder->updateHasFavorites(true);
+ }
base_t::sort(folder);
}
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index 48b4ee5fd9..74645a19e0 100644
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -48,6 +48,7 @@ public:
virtual bool isItemInTrash( void) const { return false; } // TODO: make into pure virtual.
virtual bool isItemInOutfits() const { return false; }
virtual bool isAgentInventory() const { return false; }
+ virtual bool isAgentInventoryRoot() const { return false; }
virtual bool isUpToDate() const = 0;
virtual void addChild(LLFolderViewModelItem* child);
virtual bool hasChildren() const = 0;
@@ -58,6 +59,7 @@ public:
virtual EInventorySortGroup getSortGroup() const = 0;
virtual LLInventoryObject* getInventoryObject() const = 0;
virtual void requestSort();
+ virtual bool canSortContent() const { return getUUID().notNull(); }
virtual void setPassedFilter(bool filtered, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0);
virtual bool filter( LLFolderViewFilter& filter);
virtual bool filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 112008172e..fffc520d9c 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -728,8 +728,7 @@ void LLViewerObjectList::renderObjectBeacons()
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- gGL.flush();
- glLineWidth( (F32)line_width );
+ LLRender2D::setLineWidth(line_width);
last_line_width = line_width;
}
@@ -758,8 +757,7 @@ void LLViewerObjectList::renderObjectBeacons()
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- gGL.flush();
- glLineWidth( (F32)line_width );
+ LLRender2D::setLineWidth(line_width);
last_line_width = line_width;
}
@@ -772,8 +770,7 @@ void LLViewerObjectList::renderObjectBeacons()
gGL.end();
}
- gGL.flush();
- glLineWidth(1.f);
+ LLRender2D::setLineWidth(1.f);
for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
@@ -808,7 +805,9 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di
{
pos_end.mV[i] = pos_agent.mV[i] + (50 * direction.mV[i]);
}
- glLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth);
+
+ LLRender2D::setLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth);
+
gGL.begin(LLRender::LINES);
color.mV[3] *= 0.5f;
gGL.color4fv(color.mV);
@@ -818,9 +817,7 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di
gGL.vertex3fv(pos_end.mV);
gGL.end();
- gGL.flush();
- glLineWidth(1.f);
-
+ LLRender2D::setLineWidth(1.f);
}
//-----------------------------------------------------------------------------
@@ -977,7 +974,7 @@ F32 gpu_benchmark()
delete[] pixels;
return -1.f;
}
- dest[i].bindTarget();
+ dest[i].bindTarget("", 1);
dest[i].clear();
dest[i].flush();
@@ -1039,7 +1036,7 @@ F32 gpu_benchmark()
// run GPU timer benchmark
{
ShaderProfileHelper initProfile;
- dest[0].bindTarget();
+ dest[0].bindTarget("benchmark", 1);
gBenchmarkProgram.bind();
for (S32 c = 0; c < samples; ++c)
{
diff --git a/indra/newview/llgltffolderitem.h b/indra/newview/llgltffolderitem.h
index 89d90c81cc..40a4c6fef1 100644
--- a/indra/newview/llgltffolderitem.h
+++ b/indra/newview/llgltffolderitem.h
@@ -114,6 +114,11 @@ public:
EType getType() const { return mItemType; }
S32 getItemId() const { return mItemId; }
+ bool isFavorite() const override { return false; }
+ bool isItemInTrash() const override { return false; }
+ bool isAgentInventory() const override { return false; }
+ bool isAgentInventoryRoot() const override { return false; }
+
private:
LLUIImagePtr pIcon;
std::string mName;
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp
index d8b3f996aa..3e4aadc381 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>
@@ -357,6 +359,7 @@ void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const L
{
if (asset_id.isNull() || override_json.empty())
{
+ // If there is no asset, there can't be an override
queueApply(obj, side, asset_id);
}
else
@@ -369,6 +372,7 @@ void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const L
{
if (asset_id.isNull() || material_override == nullptr)
{
+ // If there is no asset, there can't be an override
queueApply(obj, side, asset_id);
}
else
@@ -468,7 +472,7 @@ void LLGLTFMaterialList::flushUpdatesOnce(std::shared_ptr<CallbackHolder> callba
{
data[i]["gltf_json"] = e.override_data->asJSON();
}
- if (!e.override_json.empty())
+ else if (!e.override_json.empty())
{
data[i]["gltf_json"] = e.override_json;
}
@@ -555,8 +559,7 @@ void LLGLTFMaterialList::onAssetLoadComplete(const LLUUID& id, LLAssetType::ETyp
LLSD asset;
// read file into buffer
- std::istrstream str(&buffer[0], static_cast<S32>(buffer.size()));
-
+ boost::iostreams::stream<boost::iostreams::array_source> str(buffer.data(), buffer.size());
if (LLSDSerialize::deserialize(asset, str, buffer.size()))
{
if (asset.has("version") && LLGLTFMaterial::isAcceptedVersion(asset["version"].asString()))
diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp
index da1f1a466f..02b6751307 100644
--- a/indra/newview/llgltfmaterialpreviewmgr.cpp
+++ b/indra/newview/llgltfmaterialpreviewmgr.cpp
@@ -425,6 +425,8 @@ bool LLGLTFPreviewTexture::render()
if (!mShouldRender) { return false; }
+ LL_WARNS() << "LLGLTFPreviewTexture:render()" << LL_ENDL;
+
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -520,19 +522,50 @@ bool LLGLTFPreviewTexture::render()
// *HACK: Hide mExposureMap from generateExposure
gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure);
+ //bool hdr = gPipeline.has_hdr();
+ bool hdr = true;
+
+ if (hdr)
+ {
gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap);
gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap);
gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false);
- gPipeline.gammaCorrect(&screen, &gPipeline.mPostMap);
+/*
+ gPipeline.gammaCorrect(&screen, &gPipeline.mPostPingMap);
+*/
+ }
+
+ U16 activeRT = 0;
+ gPipeline.gammaCorrect(&screen, &gPipeline.mPostMaps[activeRT]);
+
LLVertexBuffer::unbind();
- gPipeline.generateGlow(&gPipeline.mPostMap);
- gPipeline.combineGlow(&gPipeline.mPostMap, &screen);
- gPipeline.renderDoF(&screen, &gPipeline.mPostMap);
- gPipeline.applyFXAA(&gPipeline.mPostMap, &screen);
+/*
+ gPipeline.generateGlow(&gPipeline.mPostPingMap);
+ gPipeline.combineGlow(&gPipeline.mPostPingMap, &screen);
+ gPipeline.renderDoF(&screen, &gPipeline.mPostPingMap);
+ gPipeline.applyFXAA(&gPipeline.mPostPingMap, &screen);
+*/
+
+ gPipeline.generateGlow(&gPipeline.mPostMaps[activeRT]);
+ gPipeline.combineGlow(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT]);
+ activeRT = 1-activeRT;
+
+ if(gPipeline.renderDoF(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT]))
+ {
+ activeRT = 1-activeRT;
+ }
+
+ if(gPipeline.applyFXAA(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT]))
+ {
+ activeRT = 1-activeRT;
+ }
// *HACK: Restore mExposureMap (it will be consumed by generateExposure next frame)
gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure);
+ gPipeline.copyRenderTarget(&gPipeline.mPostMaps[activeRT], &screen);
+
+
// Final render
gDeferredPostNoDoFProgram.bind();
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index ba9c9fa13f..34d96aa024 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -46,7 +46,7 @@
//
// Globals
//
-static GroupChatListener sGroupChatListener;
+static LLGroupChatListener sGroupChatListener;
class LLGroupHandler : public LLCommandHandler
{
diff --git a/indra/newview/llheroprobemanager.cpp b/indra/newview/llheroprobemanager.cpp
index 343bb01072..9efe70786d 100644
--- a/indra/newview/llheroprobemanager.cpp
+++ b/indra/newview/llheroprobemanager.cpp
@@ -92,6 +92,7 @@ void LLHeroProbeManager::update()
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("hero manager update");
llassert(!gCubeSnapshot); // assert a snapshot is not in progress
if (LLAppViewer::instance()->logoutRequestSent())
{
@@ -293,6 +294,9 @@ void LLHeroProbeManager::renderProbes()
// In effect this simulates single-bounce lighting.
void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool is_dynamic, F32 near_clip)
{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("hero probe update");
+
// hacky hot-swap of camera specific render targets
gPipeline.mRT = &gPipeline.mHeroProbeRT;
@@ -363,7 +367,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool
for (int i = 0; i < mMipChain.size(); ++i)
{
- LL_PROFILE_GPU_ZONE("probe mip");
+ LL_PROFILE_GPU_ZONE("hero probe mip");
mMipChain[i].bindTarget();
if (i == 0)
{
@@ -390,7 +394,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool
if (mip >= 0)
{
- LL_PROFILE_GPU_ZONE("probe mip copy");
+ LL_PROFILE_GPU_ZONE("hero probe mip copy");
mTexture->bind(0);
glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, mip, 0, 0, sourceIdx * 6 + face, 0, 0, res, res);
@@ -440,7 +444,7 @@ void LLHeroProbeManager::generateRadiance(LLReflectionMap* probe)
for (int i = 0; i < mMipChain.size() / 4; ++i)
{
- LL_PROFILE_GPU_ZONE("probe radiance gen");
+ LL_PROFILE_GPU_ZONE("hero probe radiance gen");
static LLStaticHashedString sMipLevel("mipLevel");
static LLStaticHashedString sRoughness("roughness");
static LLStaticHashedString sWidth("u_width");
@@ -487,6 +491,7 @@ void LLHeroProbeManager::updateUniforms()
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("hpmu - uniforms")
LLMatrix4a modelview;
modelview.loadu(gGLModelView);
diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index d0d2ee191a..776d2dd31e 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -37,6 +37,7 @@
#include "lldrawable.h"
#include "llviewerobjectlist.h"
#include "llviewercontrol.h"
+#include "llvoavatarself.h"
#include "llrendersphere.h"
#include "llselectmgr.h"
#include "llglheaders.h"
@@ -397,6 +398,21 @@ bool LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec
return false;
}
+ static LLCachedControl<bool> enable_lookat_hints(gSavedSettings, "EnableLookAtTarget", true);
+ if (!enable_lookat_hints)
+ {
+ // Clear the effect so it doesn't linger around if it gets disabled
+ if (mTargetType != LOOKAT_TARGET_IDLE)
+ {
+ mTargetObject = gAgentAvatarp;
+ mTargetType = LOOKAT_TARGET_IDLE;
+ mTargetOffsetGlobal.set(2.f, 0.f, 0.f);
+ setDuration(3.f);
+ setNeedsSendToSim(true);
+ }
+ return false;
+ }
+
if (target_type >= LOOKAT_NUM_TARGETS)
{
LL_WARNS() << "Bad target_type " << (int)target_type << " - ignoring." << LL_ENDL;
@@ -409,6 +425,29 @@ bool LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec
return false;
}
+ static LLCachedControl<bool> limit_lookat_hints(gSavedSettings, "LimitLookAtTarget", true);
+ // Don't affect the look at if object is gAgentAvatarp (cursor head follow)
+ if (limit_lookat_hints && object != gAgentAvatarp)
+ {
+ // If it is a object
+ if (object)
+ {
+ position += object->getRenderPosition();
+ object = NULL;
+ }
+
+ LLVector3 agentHeadPosition = gAgentAvatarp->mHeadp->getWorldPosition();
+ float dist = (float)dist_vec(agentHeadPosition, position);
+
+ static LLCachedControl<F32> limit_lookat_hints_distance(gSavedSettings, "LimitLookAtTargetDistance", 2.0f);
+ if (dist > limit_lookat_hints_distance)
+ {
+ LLVector3 headOffset = position - agentHeadPosition;
+ headOffset *= limit_lookat_hints_distance / dist;
+ position.setVec(agentHeadPosition + headOffset);
+ }
+ }
+
F32 current_time = mTimer.getElapsedTimeF32();
// type of lookat behavior or target object has changed
diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp
index eeb38cd6aa..c600010f6b 100644
--- a/indra/newview/llhudeffectpointat.cpp
+++ b/indra/newview/llhudeffectpointat.cpp
@@ -34,6 +34,7 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "lldrawable.h"
+#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llvoavatar.h"
#include "message.h"
@@ -226,6 +227,19 @@ bool LLHUDEffectPointAt::setPointAt(EPointAtType target_type, LLViewerObject *ob
return false;
}
+ static LLCachedControl<bool> enable_selection_hints(gSavedSettings, "EnableSelectionHints", true);
+ if (!enable_selection_hints)
+ {
+ // Clear the effect so it doesn't linger around if it gets disabled
+ if (mTargetType != POINTAT_TARGET_NONE)
+ {
+ clearPointAtTarget();
+ setDuration(1.f);
+ setNeedsSendToSim(true);
+ }
+ return false;
+ }
+
if (target_type >= POINTAT_NUM_TARGETS)
{
LL_WARNS() << "Bad target_type " << (int)target_type << " - ignoring." << LL_ENDL;
diff --git a/indra/newview/llhudeffectresetskeleton.cpp b/indra/newview/llhudeffectresetskeleton.cpp
new file mode 100644
index 0000000000..2bb5696f59
--- /dev/null
+++ b/indra/newview/llhudeffectresetskeleton.cpp
@@ -0,0 +1,220 @@
+/**
+ * @file llhudeffectresetskeleton.cpp
+ * @brief LLHUDEffectResetSkeleton class implementation
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llhudeffectresetskeleton.h"
+
+#include "llagent.h"
+#include "llviewerobjectlist.h"
+#include "llvoavatar.h"
+#include "message.h"
+
+// packet layout
+const S32 TARGET_OBJECT = 0; // This is to allow for targetting owned animesh
+const S32 RESET_ANIMATIONS = 16; //This can also be a flags if needed
+const S32 PKT_SIZE = 17;
+
+//-----------------------------------------------------------------------------
+// LLHUDEffectResetSkeleton()
+//-----------------------------------------------------------------------------
+LLHUDEffectResetSkeleton::LLHUDEffectResetSkeleton(const U8 type) :
+ LLHUDEffect(type)
+{
+}
+
+//-----------------------------------------------------------------------------
+// ~LLHUDEffectResetSkeleton()
+//-----------------------------------------------------------------------------
+LLHUDEffectResetSkeleton::~LLHUDEffectResetSkeleton()
+{
+}
+
+//-----------------------------------------------------------------------------
+// packData()
+//-----------------------------------------------------------------------------
+void LLHUDEffectResetSkeleton::render()
+{
+ // HUDEffectResetSkeleton is a fake effect meant to reset skeleton only.
+ // Just wait for an update() call to do its work and then die.
+}
+
+//-----------------------------------------------------------------------------
+// packData()
+//-----------------------------------------------------------------------------
+void LLHUDEffectResetSkeleton::packData(LLMessageSystem *mesgsys)
+{
+ // Pack the default data
+ LLHUDEffect::packData(mesgsys);
+
+ // Pack the type-specific data. Uses a fun packed binary format. Whee!
+ U8 packed_data[PKT_SIZE];
+ memset(packed_data, 0, PKT_SIZE);
+
+ // pack both target object and position
+ // position interpreted as offset if target object is non-null
+ if (mTargetObject)
+ {
+ htolememcpy(&(packed_data[TARGET_OBJECT]), mTargetObject->mID.mData, MVT_LLUUID, 16);
+ }
+ else
+ {
+ htolememcpy(&(packed_data[TARGET_OBJECT]), LLUUID::null.mData, MVT_LLUUID, 16);
+ }
+
+ U8 resetAnimations = (U8)mResetAnimations;
+ htolememcpy(&(packed_data[RESET_ANIMATIONS]), &resetAnimations, MVT_U8, 1);
+
+ mesgsys->addBinaryDataFast(_PREHASH_TypeData, packed_data, PKT_SIZE);
+}
+
+//-----------------------------------------------------------------------------
+// unpackData()
+//-----------------------------------------------------------------------------
+void LLHUDEffectResetSkeleton::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
+{
+ LLVector3d new_target;
+ U8 packed_data[PKT_SIZE];
+
+
+ LLHUDEffect::unpackData(mesgsys, blocknum);
+
+ LLUUID source_id;
+ mesgsys->getUUIDFast(_PREHASH_Effect, _PREHASH_AgentID, source_id, blocknum);
+
+ LLViewerObject *objp = gObjectList.findObject(source_id);
+ if (objp && objp->isAvatar())
+ {
+ setSourceObject(objp);
+ }
+ else
+ {
+ //LL_WARNS() << "Could not find source avatar for ResetSkeleton effect" << LL_ENDL;
+ return;
+ }
+
+ S32 size = mesgsys->getSizeFast(_PREHASH_Effect, blocknum, _PREHASH_TypeData);
+ if (size != PKT_SIZE)
+ {
+ LL_WARNS() << "ResetSkeleton effect with bad size " << size << LL_ENDL;
+ return;
+ }
+
+ mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData, packed_data, PKT_SIZE, blocknum);
+
+ LLUUID target_id;
+ htolememcpy(target_id.mData, &(packed_data[TARGET_OBJECT]), MVT_LLUUID, 16);
+
+ // The purpose for having a target ID is if we want to reset animesh, or
+ // other things in the future.
+ // I implemented this, but due to issues regarding various permission
+ // checks, I scrapped it for now. --Chaser Zaks
+ // See https://github.com/secondlife/viewer/pull/1212 for additional info
+
+ if (target_id.isNull())
+ {
+ target_id = source_id;
+ }
+
+ objp = gObjectList.findObject(target_id);
+
+ if (objp)
+ {
+ setTargetObject(objp);
+ }
+
+ U8 resetAnimations = 0;
+ htolememcpy(&resetAnimations, &(packed_data[RESET_ANIMATIONS]), MVT_U8, 1);
+
+ // Pre-emptively assume this is going to be flags in the future.
+ // It isn't needed now, but this will assure that only bit 1 is set
+ mResetAnimations = resetAnimations & 1;
+
+ update();
+}
+
+//-----------------------------------------------------------------------------
+// setTargetObjectAndOffset()
+//-----------------------------------------------------------------------------
+void LLHUDEffectResetSkeleton::setTargetObject(LLViewerObject *objp)
+{
+ mTargetObject = objp;
+}
+
+
+//-----------------------------------------------------------------------------
+// markDead()
+//-----------------------------------------------------------------------------
+void LLHUDEffectResetSkeleton::markDead()
+{
+ LLHUDEffect::markDead();
+}
+
+void LLHUDEffectResetSkeleton::setSourceObject(LLViewerObject* objectp)
+{
+ // restrict source objects to avatars
+ if (objectp && objectp->isAvatar())
+ {
+ LLHUDEffect::setSourceObject(objectp);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// update()
+//-----------------------------------------------------------------------------
+void LLHUDEffectResetSkeleton::update()
+{
+ // If the target object is dead, set the target object to NULL
+ if (mTargetObject.isNull() || mTargetObject->isDead())
+ {
+ markDead();
+ return;
+ }
+
+ if (mSourceObject.isNull() || mSourceObject->isDead())
+ {
+ markDead();
+ return;
+ }
+
+ if (mTargetObject->isAvatar())
+ {
+ // Only the owner of a avatar can reset their skeleton like this
+ // Also allow reset if we created the effect (Local resetting)
+ if (mSourceObject->getID() == mTargetObject->getID() || getOriginatedHere())
+ {
+ LLVOAvatar* avatar = mTargetObject->asAvatar();
+ avatar->resetSkeleton(mResetAnimations);
+ }
+ }
+ else
+ {
+ LL_WARNS() << mSourceObject->getID() << " attempted to reset skeleton on "
+ << mTargetObject->getID() << ", but it is not a avatar!" << LL_ENDL;
+ }
+
+ markDead();
+}
diff --git a/indra/newview/llhudeffectresetskeleton.h b/indra/newview/llhudeffectresetskeleton.h
new file mode 100644
index 0000000000..c89516d7fc
--- /dev/null
+++ b/indra/newview/llhudeffectresetskeleton.h
@@ -0,0 +1,60 @@
+/**
+ * @file llhudeffectresetskeleton.h
+ * @brief LLHUDEffectResetSkeleton class definition
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLHUDEFFECTRESETSKELETON_H
+#define LL_LLHUDEFFECTRESETSKELETON_H
+
+#include "llhudeffect.h"
+
+class LLViewerObject;
+class LLVOAvatar;
+
+
+class LLHUDEffectResetSkeleton final : public LLHUDEffect
+{
+public:
+ friend class LLHUDObject;
+
+ /*virtual*/ void markDead() override;
+ /*virtual*/ void setSourceObject(LLViewerObject* objectp) override;
+
+ void setTargetObject(LLViewerObject *objp) override;
+ void setResetAnimations(bool enable){ mResetAnimations = enable; };
+
+protected:
+ LLHUDEffectResetSkeleton(const U8 type);
+ ~LLHUDEffectResetSkeleton();
+
+ void render() override;
+ void packData(LLMessageSystem *mesgsys) override;
+ void unpackData(LLMessageSystem *mesgsys, S32 blocknum) override;
+
+ void update() override;
+private:
+ bool mResetAnimations;
+};
+
+#endif // LL_LLHUDEFFECTRESETSKELETON_H
diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp
index e6fbfbfb38..04e9e2dff2 100644
--- a/indra/newview/llhudobject.cpp
+++ b/indra/newview/llhudobject.cpp
@@ -36,6 +36,7 @@
#include "llhudeffecttrail.h"
#include "llhudeffectlookat.h"
#include "llhudeffectpointat.h"
+#include "llhudeffectresetskeleton.h"
#include "llhudnametag.h"
#include "llvoicevisualizer.h"
@@ -241,6 +242,9 @@ LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type)
case LL_HUD_EFFECT_BLOB:
hud_objectp = new LLHUDEffectBlob(type);
break;
+ case LL_HUD_EFFECT_RESET_SKELETON:
+ hud_objectp = new LLHUDEffectResetSkeleton(type);
+ break;
default:
LL_WARNS() << "Unknown type of hud effect:" << (U32) type << LL_ENDL;
}
diff --git a/indra/newview/llhudobject.h b/indra/newview/llhudobject.h
index 8c628e3f92..f683f21e96 100644
--- a/indra/newview/llhudobject.h
+++ b/indra/newview/llhudobject.h
@@ -96,7 +96,8 @@ public:
LL_HUD_EFFECT_POINTAT,
LL_HUD_EFFECT_VOICE_VISUALIZER, // Ventrella
LL_HUD_NAME_TAG,
- LL_HUD_EFFECT_BLOB
+ LL_HUD_EFFECT_BLOB,
+ LL_HUD_EFFECT_RESET_SKELETON
};
protected:
static void sortObjects();
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index fd0d8b696f..c092b4c91a 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -225,10 +225,6 @@ void LLHUDText::renderText()
}
text_color = segment_iter->mColor;
- if (mOnHUDAttachment)
- {
- text_color = linearColor4(text_color);
- }
text_color.mV[VALPHA] *= alpha_factor;
hud_render_text(segment_iter->getText(), render_position, *fontp, style, shadow, x_offset, y_offset, text_color, mOnHUDAttachment);
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 4e8bcc4f7a..7cd0171a37 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -422,6 +422,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
U8 *binary_bucket,
S32 binary_bucket_size,
LLHost &sender,
+ LLSD metadata,
LLUUID aux_id)
{
LLChat chat;
@@ -451,6 +452,28 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
bool is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&
LLMuteList::isLinden(name);
+ /***
+ * The simulator may have flagged this sender as a bot, if the viewer would like to display
+ * the chat text in a different color or font, the below code is how the viewer can
+ * tell if the sender is a bot.
+ *-----------------------------------------------------
+ bool is_bot = false;
+ if (metadata.has("sender"))
+ { // The server has identified this sender as a bot.
+ is_bot = metadata["sender"]["bot"].asBoolean();
+ }
+ *-----------------------------------------------------
+ */
+
+ std::string notice_name;
+ LLSD notice_args;
+ if (metadata.has("notice"))
+ { // The server has injected a notice into the IM conversation.
+ // These will be things like bot notifications, etc.
+ notice_name = metadata["notice"]["id"].asString();
+ notice_args = metadata["notice"]["data"];
+ }
+
chat.mMuted = is_muted;
chat.mFromID = from_id;
chat.mFromName = name;
@@ -544,7 +567,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
}
else
{
- // standard message, not from system
+ // standard message, server may have injected a notice into the conversation.
std::string saved;
if (offline == IM_OFFLINE)
{
@@ -579,8 +602,17 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
region_message = true;
}
}
- gIMMgr->addMessage(
- session_id,
+
+ std::string real_name;
+
+ if (!notice_name.empty())
+ { // The simulator has injected some sort of notice into the conversation.
+ // findString will only replace the contents of buffer if the notice_id is found.
+ LLTrans::findString(buffer, notice_name, notice_args);
+ real_name = SYSTEM_FROM;
+ }
+
+ gIMMgr->addMessage(session_id,
from_id,
name,
buffer,
@@ -591,7 +623,9 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
region_id,
position,
region_message,
- timestamp);
+ timestamp,
+ LLUUID::null,
+ real_name);
}
else
{
@@ -1486,10 +1520,10 @@ void LLIMProcessing::requestOfflineMessages()
if (!requested
&& gMessageSystem
&& !gDisconnected
- && LLMuteList::getInstance()->isLoaded()
&& isAgentAvatarValid()
&& gAgent.getRegion()
- && gAgent.getRegion()->capabilitiesReceived())
+ && gAgent.getRegion()->capabilitiesReceived()
+ && (LLMuteList::getInstance()->isLoaded() || LLMuteList::getInstance()->getLoadFailed()))
{
std::string cap_url = gAgent.getRegionCapability("ReadOfflineMsgs");
@@ -1619,6 +1653,12 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
from_group = message_data["from_group"].asString() == "Y";
}
+ LLSD metadata;
+ if (message_data.has("metadata"))
+ {
+ metadata = message_data["metadata"];
+ }
+
EInstantMessage dialog = static_cast<EInstantMessage>(message_data["dialog"].asInteger());
LLUUID session_id = message_data["transaction-id"].asUUID();
if (session_id.isNull() && dialog == IM_FROM_TASK)
@@ -1646,6 +1686,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
local_bin_bucket.data(),
S32(local_bin_bucket.size()),
local_sender,
+ metadata,
message_data["asset_id"].asUUID());
});
diff --git a/indra/newview/llimprocessing.h b/indra/newview/llimprocessing.h
index 030d28b198..66ffc59ae0 100644
--- a/indra/newview/llimprocessing.h
+++ b/indra/newview/llimprocessing.h
@@ -48,6 +48,7 @@ public:
U8 *binary_bucket,
S32 binary_bucket_size,
LLHost &sender,
+ LLSD metadata,
LLUUID aux_id = LLUUID::null);
// Either receives list of offline messages from 'ReadOfflineMsgs' capability
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 756f3b33ed..67b62433f8 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -73,6 +73,7 @@
#include "llviewerregion.h"
#include "llcorehttputil.h"
#include "lluiusage.h"
+#include "llurlregistry.h"
#include <array>
@@ -199,6 +200,9 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);
bool store_dnd_message = false; // flag storage of a dnd message
bool is_session_focused = session_floater->isTornOff() && session_floater->hasFocus();
+ bool contains_mention = LLUrlRegistry::getInstance()->containsAgentMention(msg["message"].asString());
+ static LLCachedControl<bool> play_snd_mention_pref(gSavedSettings, "PlaySoundChatMention", false);
+ bool play_snd_mention = contains_mention && play_snd_mention_pref && (msg["source_type"].asInteger() != CHAT_SOURCE_OBJECT);
if (!LLFloater::isVisible(im_box) || im_box->isMinimized())
{
conversations_floater_status = CLOSED;
@@ -232,7 +236,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
else
{
user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions");
- if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNearbyChatIM")))
+ if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNearbyChatIM")) && !play_snd_mention)
{
make_ui_sound("UISndNewIncomingIMSession");
}
@@ -243,7 +247,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
if (LLAvatarTracker::instance().isBuddy(participant_id))
{
user_preferences = gSavedSettings.getString("NotificationFriendIMOptions");
- if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundFriendIM")))
+ if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundFriendIM")) && !play_snd_mention)
{
make_ui_sound("UISndNewIncomingIMSession");
}
@@ -251,7 +255,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
else
{
user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions");
- if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNonFriendIM")))
+ if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNonFriendIM")) && !play_snd_mention)
{
make_ui_sound("UISndNewIncomingIMSession");
}
@@ -260,7 +264,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
else if (session->isAdHocSessionType())
{
user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions");
- if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundConferenceIM")))
+ if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundConferenceIM")) && !play_snd_mention)
{
make_ui_sound("UISndNewIncomingIMSession");
}
@@ -268,11 +272,18 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
else if(session->isGroupSessionType())
{
user_preferences = gSavedSettings.getString("NotificationGroupChatOptions");
- if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundGroupChatIM")))
+ if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundGroupChatIM")) && !play_snd_mention)
{
make_ui_sound("UISndNewIncomingIMSession");
}
}
+ if (play_snd_mention)
+ {
+ if (!gAgent.isDoNotDisturb())
+ {
+ make_ui_sound("UISndChatMention");
+ }
+ }
// actions:
@@ -325,7 +336,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
if ("openconversations" == user_preferences
|| ON_TOP == conversations_floater_status
|| ("toast" == user_preferences && ON_TOP != conversations_floater_status)
- || ("flash" == user_preferences && (CLOSED == conversations_floater_status
+ || (("flash" == user_preferences || contains_mention) && (CLOSED == conversations_floater_status
|| NOT_ON_TOP == conversations_floater_status))
|| is_dnd_msg)
{
@@ -345,7 +356,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
}
else
{
- im_box->flashConversationItemWidget(session_id, true);
+ im_box->flashConversationItemWidget(session_id, true, contains_mention);
}
}
}
@@ -800,6 +811,10 @@ void LLIMModel::LLIMSession::initVoiceChannel(const LLSD& voiceChannelInfo)
{
if (mVoiceChannel)
{
+ if (!voiceChannelInfo.isMap())
+ {
+ LL_WARNS() << "initVoiceChannel called without voiceChannelInfo" << LL_ENDL;
+ }
if (mVoiceChannel->isThisVoiceChannel(voiceChannelInfo))
{
return;
@@ -1691,6 +1706,8 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from,
}
else
{
+ // will check KeepConversationLogTranscripts on its own
+ LLConversationLog::instance().cache();
return false;
}
}
@@ -3144,9 +3161,16 @@ void LLIMMgr::addMessage(
const LLUUID& region_id,
const LLVector3& position,
bool is_region_msg,
- U32 timestamp) // May be zero
+ U32 timestamp, // May be zero
+ LLUUID display_id,
+ std::string_view display_name)
{
LLUUID other_participant_id = target_id;
+ std::string message_display_name = (display_name.empty()) ? from : std::string(display_name);
+ if (display_id.isNull() && (display_name.empty()))
+ {
+ display_id = other_participant_id;
+ }
LLUUID new_session_id = session_id;
if (new_session_id.isNull())
@@ -3243,9 +3267,13 @@ void LLIMMgr::addMessage(
}
//Play sound for new conversations
- if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation")))
+ if (!skip_message && !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation")))
{
- make_ui_sound("UISndNewIncomingIMSession");
+ static LLCachedControl<bool> play_snd_mention_pref(gSavedSettings, "PlaySoundChatMention", false);
+ if (!play_snd_mention_pref || !LLUrlRegistry::getInstance()->containsAgentMention(msg))
+ {
+ make_ui_sound("UISndNewIncomingIMSession");
+ }
}
}
else
@@ -3257,7 +3285,7 @@ void LLIMMgr::addMessage(
if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !skip_message)
{
- LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg, true, is_region_msg, timestamp);
+ LLIMModel::instance().addMessage(new_session_id, message_display_name, display_id, msg, true, is_region_msg, timestamp);
}
// Open conversation floater if offline messages are present
@@ -3265,7 +3293,7 @@ void LLIMMgr::addMessage(
{
LLFloaterReg::showInstance("im_container");
LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->
- flashConversationItemWidget(new_session_id, true);
+ flashConversationItemWidget(new_session_id, true, LLUrlRegistry::getInstance()->containsAgentMention(msg));
}
}
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 61776860e3..23f90ca795 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -368,7 +368,9 @@ public:
const LLUUID& region_id = LLUUID::null,
const LLVector3& position = LLVector3::zero,
bool is_region_msg = false,
- U32 timestamp = 0);
+ U32 timestamp = 0,
+ LLUUID display_id = LLUUID::null,
+ std::string_view display_name = "");
void addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args);
diff --git a/indra/newview/llinspecttexture.cpp b/indra/newview/llinspecttexture.cpp
index 24dbe61bad..9f0d236826 100644
--- a/indra/newview/llinspecttexture.cpp
+++ b/indra/newview/llinspecttexture.cpp
@@ -115,7 +115,6 @@ public:
protected:
LLPointer<LLViewerFetchedTexture> m_Image;
- S32 mImageBoostLevel = LLGLTexture::BOOST_NONE;
std::string mLoadingText;
};
@@ -128,12 +127,8 @@ LLTexturePreviewView::LLTexturePreviewView(const LLView::Params& p)
LLTexturePreviewView::~LLTexturePreviewView()
{
- if (m_Image)
- {
- m_Image->setBoostLevel(mImageBoostLevel);
m_Image = nullptr;
}
-}
void LLTexturePreviewView::draw()
{
@@ -153,18 +148,18 @@ void LLTexturePreviewView::draw()
bool isLoading = (!m_Image->isFullyLoaded()) && (m_Image->getDiscardLevel() > 0);
if (isLoading)
LLFontGL::getFontSansSerif()->renderUTF8(mLoadingText, 0, rctClient.mLeft + 3, rctClient.mTop - 25, LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
- m_Image->addTextureStats((isLoading) ? MAX_IMAGE_AREA : (F32)(rctClient.getWidth() * rctClient.getHeight()));
+
+ m_Image->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE);
}
}
void LLTexturePreviewView::setImageFromAssetId(const LLUUID& idAsset)
{
- m_Image = LLViewerTextureManager::getFetchedTexture(idAsset, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ m_Image = LLViewerTextureManager::getFetchedTexture(idAsset, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_THUMBNAIL);
if (m_Image)
{
- mImageBoostLevel = m_Image->getBoostLevel();
- m_Image->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
m_Image->forceToSaveRawImage(0);
+ m_Image->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE);
if ( (!m_Image->isFullyLoaded()) && (!m_Image->hasFetcher()) )
{
if (m_Image->isInFastCacheList())
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 15190854a2..1ec7ec85c9 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -104,7 +104,6 @@ static bool check_item(const LLUUID& item_id,
LLInventoryFilter* filter);
// Helper functions
-
bool isAddAction(const std::string& action)
{
return ("wear" == action || "attach" == action || "activate" == action);
@@ -830,6 +829,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
{
const LLInventoryObject *obj = getInventoryObject();
bool single_folder_root = (mRoot == NULL);
+ bool is_cof = isCOFFolder();
+ bool is_inbox = isInboxFolder();
if (obj)
{
@@ -844,7 +845,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
disabled_items.push_back(std::string("Copy"));
}
- if (isAgentInventory() && !single_folder_root && !isMarketplaceListingsFolder())
+ bool is_agent_inventory = isAgentInventory();
+ if (is_agent_inventory && !single_folder_root && !is_cof && !is_inbox)
{
items.push_back(std::string("New folder from selected"));
items.push_back(std::string("Subfolder Separator"));
@@ -857,6 +859,19 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
}
}
+ if (isFavorite())
+ {
+ items.push_back(std::string("Remove from Favorites"));
+ }
+ else if (is_agent_inventory && !gInventory.isObjectDescendentOf(mUUID, gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)))
+ {
+ items.push_back(std::string("Add to Favorites"));
+ if (gInventory.getRootFolderID() == mUUID)
+ {
+ disabled_items.push_back(std::string("Add to Favorites"));
+ }
+ }
+
if (obj->getIsLinkType())
{
items.push_back(std::string("Find Original"));
@@ -869,6 +884,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
if (!isItemMovable() || !canMenuCut())
{
disabled_items.push_back(std::string("Cut"));
+ disabled_items.push_back(std::string("New folder from selected"));
}
}
else
@@ -878,7 +894,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
items.push_back(std::string("Find Links"));
}
- if (!isInboxFolder() && !single_folder_root)
+ if (!is_inbox && !single_folder_root)
{
items.push_back(std::string("Rename"));
if (!isItemRenameable() || ((flags & FIRST_SELECTED_ITEM) == 0))
@@ -918,6 +934,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
if (!isItemMovable() || !canMenuCut())
{
disabled_items.push_back(std::string("Cut"));
+ disabled_items.push_back(std::string("New folder from selected"));
}
if (canListOnMarketplace() && !isMarketplaceListingsFolder() && !isInboxFolder())
@@ -940,7 +957,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
}
// Don't allow items to be pasted directly into the COF or the inbox
- if (!isCOFFolder() && !isInboxFolder())
+ if (!is_cof && !is_inbox)
{
items.push_back(std::string("Paste"));
}
@@ -1334,6 +1351,13 @@ bool LLInvFVBridge::isAgentInventory() const
return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID());
}
+bool LLInvFVBridge::isAgentInventoryRoot() const
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if(!model) return false;
+ return gInventory.getRootFolderID() == mUUID;
+}
+
bool LLInvFVBridge::isCOFFolder() const
{
return LLAppearanceMgr::instance().getIsInCOF(mUUID);
@@ -2281,7 +2305,21 @@ const LLUUID& LLItemBridge::getThumbnailUUID() const
return LLUUID::null;
}
-// virtual
+bool LLItemBridge::isFavorite() const
+{
+ LLViewerInventoryItem* item = NULL;
+ LLInventoryModel* model = getInventoryModel();
+ if (model)
+ {
+ item = model->getItem(mUUID);
+ }
+ if (item)
+ {
+ return get_is_favorite(item);
+ }
+ return false;
+}
+
bool LLItemBridge::isItemPermissive() const
{
if (LLViewerInventoryItem* item = getItem())
@@ -2426,6 +2464,16 @@ const LLUUID& LLFolderBridge::getThumbnailUUID() const
return LLUUID::null;
}
+bool LLFolderBridge::isFavorite() const
+{
+ LLViewerInventoryCategory* cat = getCategory();
+ if (cat)
+ {
+ return cat->getIsFavorite();
+ }
+ return false;
+}
+
void LLFolderBridge::update()
{
// we know we have children but haven't fetched them (doesn't obey filter)
@@ -2665,6 +2713,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
//
bool is_movable = true;
+ bool create_outfit = false;
if (is_movable && (marketplacelistings_id == cat_id))
{
@@ -2697,14 +2746,24 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit");
if (is_movable && move_is_into_outfit)
{
- if (mUUID == my_outifts_id)
+ if ((inv_cat->getPreferredType() != LLFolderType::FT_NONE) && (inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT))
+ {
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ is_movable = false;
+ }
+ else if (mUUID == my_outifts_id)
{
if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings)
{
tooltip_msg = LLTrans::getString("TooltipOutfitNotInInventory");
is_movable = false;
}
- else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear))
+ else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear))
+ {
+ is_movable = true;
+ create_outfit = true;
+ }
+ else if (can_move_to_my_outfits_as_subfolder(model, inv_cat))
{
is_movable = true;
}
@@ -2714,13 +2773,44 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
is_movable = false;
}
}
- else if(getCategory() && getCategory()->getPreferredType() == LLFolderType::FT_NONE)
+ else if (!getCategory())
{
- is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT));
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
}
else
{
- is_movable = false;
+ EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id);
+ EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id);
+ if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_OUTFIT)
+ {
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit");
+ }
+ else if (dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT)
+ {
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ }
+ else if (dest_res == MY_OUTFITS_SUBFOLDER && inv_res == MY_OUTFITS_SUBOUTFIT)
+ {
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ }
+ else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear))
+ {
+ is_movable = true;
+ create_outfit = true;
+ }
+ else if (can_move_to_my_outfits_as_subfolder(model, inv_cat))
+ {
+ is_movable = true;
+ }
+ else
+ {
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ }
}
}
if (is_movable && move_is_into_current_outfit && is_link)
@@ -2912,9 +3002,81 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
if (mUUID == my_outifts_id)
{
- // Category can contains objects,
- // create a new folder and populate it with links to original objects
- dropToMyOutfits(inv_cat, cb);
+ EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id);
+ if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT || !create_outfit)
+ {
+ LLInvFVBridge::changeCategoryParent(
+ model,
+ (LLViewerInventoryCategory*)inv_cat,
+ mUUID,
+ false);
+ if (cb) cb->fire(inv_cat->getUUID());
+ }
+ else
+ {
+ // Moving from inventory
+ // create a new folder and populate it with links to original objects
+ dropToMyOutfits(inv_cat, cb);
+ }
+ }
+ else if (move_is_into_my_outfits)
+ {
+ EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id);
+ EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id);
+ switch (inv_res)
+ {
+ case MY_OUTFITS_NO:
+ // Moning from outside outfits into outfits
+ if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit)
+ {
+ // turn it into outfit
+ dropToMyOutfitsSubfolder(inv_cat, mUUID, cb);
+ }
+ else
+ {
+ LLInvFVBridge::changeCategoryParent(
+ model,
+ (LLViewerInventoryCategory*)inv_cat,
+ mUUID,
+ move_is_into_trash);
+ if (cb) cb->fire(inv_cat->getUUID());
+ }
+ break;
+ case MY_OUTFITS_SUBFOLDER:
+ case MY_OUTFITS_OUTFIT:
+ // only permit moving subfodlers and outfits into other subfolders
+ if (dest_res == MY_OUTFITS_SUBFOLDER)
+ {
+ LLInvFVBridge::changeCategoryParent(
+ model,
+ (LLViewerInventoryCategory*)inv_cat,
+ mUUID,
+ false);
+ if (cb) cb->fire(inv_cat->getUUID());
+ }
+ else
+ {
+ assert(false); // mot permitted, shouldn't have accepted
+ }
+ break;
+ case MY_OUTFITS_SUBOUTFIT:
+ if (dest_res == MY_OUTFITS_SUBOUTFIT || dest_res == MY_OUTFITS_OUTFIT)
+ {
+ LLInvFVBridge::changeCategoryParent(
+ model,
+ (LLViewerInventoryCategory*)inv_cat,
+ mUUID,
+ false);
+ if (cb) cb->fire(inv_cat->getUUID());
+ }
+ else
+ {
+ assert(false); // mot permitted, shouldn't have accepted
+ }
+ break;
+ default:
+ break;
+ }
}
// if target is current outfit folder we use link
else if (move_is_into_current_outfit &&
@@ -3996,7 +4158,6 @@ void LLFolderBridge::perform_pasteFromClipboard()
LLInventoryObject *obj = model->getObject(item_id);
if (obj)
{
-
if (move_is_into_lost_and_found)
{
if (LLAssetType::AT_CATEGORY == obj->getType())
@@ -4006,24 +4167,57 @@ void LLFolderBridge::perform_pasteFromClipboard()
}
if (move_is_into_outfit)
{
- if (!move_is_into_my_outfits && item && can_move_to_outfit(item, move_is_into_current_outfit))
+ bool handled = false;
+ if (mUUID != my_outifts_id
+ && dest_folder->getPreferredType() == LLFolderType::FT_OUTFIT
+ && item
+ && can_move_to_outfit(item, move_is_into_current_outfit))
{
dropToOutfit(item, move_is_into_current_outfit, cb);
+ handled = true;
}
else if (move_is_into_my_outfits && LLAssetType::AT_CATEGORY == obj->getType())
{
- LLInventoryCategory* cat = model->getCategory(item_id);
+ LLViewerInventoryCategory* cat = model->getCategory(item_id);
U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit");
- if (cat && can_move_to_my_outfits(model, cat, max_items_to_wear))
+ if (cat && can_move_to_my_outfits_as_outfit(model, cat, max_items_to_wear))
{
- dropToMyOutfits(cat, cb);
+ if (mUUID == my_outifts_id)
+ {
+ dropToMyOutfits(cat, cb);
+ handled = true;
+ }
+ else
+ {
+ EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id);
+ if (dest_res == MY_OUTFITS_SUBFOLDER)
+ {
+ // turn it into outfit
+ dropToMyOutfitsSubfolder(cat, mUUID, cb);
+ handled = true;
+ }
+ }
}
- else
+ if (!handled && cat && can_move_to_my_outfits_as_subfolder(model, cat))
{
- LLNotificationsUtil::add("MyOutfitsPasteFailed");
+ EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id);
+ if (dest_res == MY_OUTFITS_SUBFOLDER || mUUID == my_outifts_id)
+ {
+ if (LLClipboard::instance().isCutMode())
+ {
+ changeCategoryParent(model, cat, parent_id, false);
+ }
+ else
+ {
+ copy_inventory_category(model, cat, parent_id);
+ }
+ if (cb) cb->fire(item_id);
+ handled = true;
+ }
}
}
- else
+
+ if (!handled)
{
LLNotificationsUtil::add("MyOutfitsPasteFailed");
}
@@ -4066,7 +4260,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
// move_inventory_item() is not enough, as we have to update inventory locally too
if (LLAssetType::AT_CATEGORY == obj->getType())
{
- LLViewerInventoryCategory* vicat = (LLViewerInventoryCategory *) model->getCategory(item_id);
+ LLViewerInventoryCategory* vicat = model->getCategory(item_id);
llassert(vicat);
if (vicat)
{
@@ -4196,6 +4390,32 @@ void LLFolderBridge::pasteLinkFromClipboard()
std::vector<LLUUID> objects;
LLClipboard::instance().pasteFromClipboard(objects);
+ if (objects.size() == 0)
+ {
+ LLClipboard::instance().setCutMode(false);
+ return;
+ }
+
+ LLUUID& first_id = objects[0];
+ LLInventoryItem* item = model->getItem(first_id);
+ if (item && item->getAssetUUID().isNull())
+ {
+ if (item->getActualType() == LLAssetType::AT_NOTECARD)
+ {
+ // otehrwise AIS will return 'Cannot link to items with a NULL asset_id.'
+ LLNotificationsUtil::add("CantLinkNotecard");
+ LLClipboard::instance().setCutMode(false);
+ return;
+ }
+ else if (item->getActualType() == LLAssetType::AT_MATERIAL)
+ {
+ LLNotificationsUtil::add("CantLinkMaterial");
+ LLClipboard::instance().setCutMode(false);
+ return;
+ }
+ }
+
+
LLPointer<LLInventoryCallback> cb = NULL;
LLInventoryPanel* panel = mInventoryPanel.get();
if (panel->getRootFolder()->isSingleFolderMode())
@@ -4256,6 +4476,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
if (outfits_id == mUUID)
{
+ items.push_back(std::string("New Outfit Folder"));
items.push_back(std::string("New Outfit"));
}
@@ -4274,6 +4495,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("upload_options"));
disabled_items.push_back(std::string("upload_def"));
disabled_items.push_back(std::string("create_new"));
}
@@ -4299,6 +4521,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
{
disabled_items.push_back(std::string("New Folder"));
disabled_items.push_back(std::string("New Listing Folder"));
+ disabled_items.push_back(std::string("upload_options"));
disabled_items.push_back(std::string("upload_def"));
disabled_items.push_back(std::string("create_new"));
}
@@ -4349,68 +4572,94 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
else if(isAgentInventory()) // do not allow creating in library
{
LLViewerInventoryCategory *cat = getCategory();
- // BAP removed protected check to re-enable standard ops in untyped folders.
- // Not sure what the right thing is to do here.
- if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT))
- {
- if (!isInboxFolder() // don't allow creation in inbox
- && outfits_id != mUUID)
- {
- bool menu_items_added = false;
- // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
- if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
- {
- items.push_back(std::string("New Folder"));
- menu_items_added = true;
- }
- if (!isMarketplaceListingsFolder())
- {
- items.push_back(std::string("upload_def"));
- items.push_back(std::string("create_new"));
- items.push_back(std::string("New Script"));
- items.push_back(std::string("New Note"));
- items.push_back(std::string("New Gesture"));
- items.push_back(std::string("New Material"));
- items.push_back(std::string("New Clothes"));
- items.push_back(std::string("New Body Parts"));
- items.push_back(std::string("New Settings"));
- if (!LLEnvironment::instance().isInventoryEnabled())
- {
- disabled_items.push_back("New Settings");
- }
- }
- else
- {
- items.push_back(std::string("New Listing Folder"));
- }
- if (menu_items_added)
- {
- items.push_back(std::string("Create Separator"));
- }
- }
- getClipboardEntries(false, items, disabled_items, flags);
- }
- else
+
+ if (cat)
{
- // Want some but not all of the items from getClipboardEntries for outfits.
- if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
+ if (cat->getPreferredType() == LLFolderType::FT_OUTFIT)
{
+ // Want some but not all of the items from getClipboardEntries for outfits.
items.push_back(std::string("Rename"));
items.push_back(std::string("thumbnail"));
+ addInventoryFavoritesMenuOptions(items);
addDeleteContextMenuOptions(items, disabled_items);
// EXT-4030: disallow deletion of currently worn outfit
- const LLViewerInventoryItem *base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink();
+ const LLViewerInventoryItem* base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink();
if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory()))
{
disabled_items.push_back(std::string("Delete"));
}
}
+ else if (outfits_id == mUUID)
+ {
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
+ else if (!isCOFFolder())
+ {
+ EMyOutfitsSubfolderType in_my_outfits = myoutfit_object_subfolder_type(model, mUUID, outfits_id);
+ if (in_my_outfits != MY_OUTFITS_NO)
+ {
+ // Either an outfit or a subfolder inside MY_OUTFITS
+ if (in_my_outfits == MY_OUTFITS_SUBFOLDER)
+ {
+ // Not inside an outfit, but inside 'my outfits'
+ items.push_back(std::string("New Outfit"));
+ items.push_back(std::string("New Outfit Folder"));
+ }
+ items.push_back(std::string("Rename"));
+ items.push_back(std::string("thumbnail"));
+
+ addInventoryFavoritesMenuOptions(items);
+ addDeleteContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ if (!isInboxFolder() // don't allow creation in inbox
+ && outfits_id != mUUID)
+ {
+ bool menu_items_added = false;
+ // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
+ if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
+ {
+ items.push_back(std::string("New Folder"));
+ menu_items_added = true;
+ }
+ if (!isMarketplaceListingsFolder())
+ {
+ items.push_back(std::string("upload_options"));
+ items.push_back(std::string("upload_def"));
+ items.push_back(std::string("create_new"));
+ items.push_back(std::string("New Script"));
+ items.push_back(std::string("New Note"));
+ items.push_back(std::string("New Gesture"));
+ items.push_back(std::string("New Material"));
+ items.push_back(std::string("New Clothes"));
+ items.push_back(std::string("New Body Parts"));
+ items.push_back(std::string("New Settings"));
+ if (!LLEnvironment::instance().isInventoryEnabled())
+ {
+ disabled_items.push_back("New Settings");
+ }
+ }
+ else
+ {
+ items.push_back(std::string("New Listing Folder"));
+ }
+ if (menu_items_added)
+ {
+ items.push_back(std::string("Create Separator"));
+ }
+ }
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
+ }
}
if (model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) == mUUID)
{
items.push_back(std::string("Copy outfit list to clipboard"));
+ addInventoryFavoritesMenuOptions(items);
+
addOpenFolderMenuOptions(flags, items);
}
@@ -4560,7 +4809,11 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
if (((flags & ITEM_IN_MULTI_SELECTION) == 0) && hasChildren() && (type != LLFolderType::FT_OUTFIT))
{
- items.push_back(std::string("Ungroup folder items"));
+ const LLUUID my_outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ if (!gInventory.isObjectDescendentOf(mUUID, my_outfits))
+ {
+ items.push_back(std::string("Ungroup folder items"));
+ }
}
}
else
@@ -4667,6 +4920,18 @@ void LLFolderBridge::addOpenFolderMenuOptions(U32 flags, menuentry_vec_t& items)
}
}
+void LLFolderBridge::addInventoryFavoritesMenuOptions(menuentry_vec_t& items)
+{
+ if (isFavorite())
+ {
+ items.push_back(std::string("Remove from Favorites"));
+ }
+ else
+ {
+ items.push_back(std::string("Add to Favorites"));
+ }
+}
+
bool LLFolderBridge::hasChildren() const
{
LLInventoryModel* model = getInventoryModel();
@@ -5333,13 +5598,23 @@ void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLI
// Note: creation will take time, so passing folder id to callback is slightly unreliable,
// but so is collecting and passing descendants' ids
inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel);
- gInventory.createNewCategory(dest_id,
+ getInventoryModel()->createNewCategory(dest_id,
LLFolderType::FT_OUTFIT,
inv_cat->getName(),
func,
inv_cat->getThumbnailUUID());
}
+void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLPointer<LLInventoryCallback> cb)
+{
+ inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel);
+ getInventoryModel()->createNewCategory(dest_id,
+ LLFolderType::FT_OUTFIT,
+ inv_cat->getName(),
+ func,
+ inv_cat->getThumbnailUUID());
+}
+
void LLFolderBridge::outfitFolderCreatedCallback(LLUUID cat_source_id,
LLUUID cat_dest_id,
LLPointer<LLInventoryCallback> cb,
@@ -5513,7 +5788,9 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
else if (user_confirm && (move_is_into_current_outfit || move_is_into_outfit))
{
- accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);
+ EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id);
+ // don't allow items in my outfits' subfodlers, only in outfits and outfit's subfolders
+ accept = res != MY_OUTFITS_SUBFOLDER && can_move_to_outfit(inv_item, move_is_into_current_outfit);
}
else if (user_confirm && (move_is_into_favorites || move_is_into_landmarks))
{
@@ -6909,12 +7186,13 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)
item = (LLViewerInventoryItem*)gInventory.getItem(object_id);
if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID()))
{
- rez_attachment(item, NULL, true); // Replace if "Wear"ing.
+ static LLCachedControl<bool> replace_item(gSavedSettings, "InventoryAddAttachmentBehavior", false);
+ rez_attachment(item, NULL, ("attach" == action) ? replace_item() : true); // Replace if "Wear"ing.
}
else if(item && item->isFinished())
{
// must be in library. copy it to our inventory and put it on.
- LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0));
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0, true));
copy_inventory_item(
gAgent.getID(),
item->getPermissions().getOwner(),
@@ -7555,6 +7833,15 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
items.push_back(std::string("Properties"));
addDeleteContextMenuOptions(items, disabled_items);
+
+ if (isFavorite())
+ {
+ items.push_back(std::string("Remove from Favorites"));
+ }
+ else if (isAgentInventory())
+ {
+ items.push_back(std::string("Add to Favorites"));
+ }
}
addLinkReplaceMenuOption(items, disabled_items);
hide_context_entries(menu, items, disabled_items);
@@ -7781,6 +8068,15 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
items.push_back(std::string("Find Original"));
addDeleteContextMenuOptions(items, disabled_items);
+
+ if (isFavorite())
+ {
+ items.push_back(std::string("Remove from Favorites"));
+ }
+ else if (isAgentInventory())
+ {
+ items.push_back(std::string("Add to Favorites"));
+ }
}
hide_context_entries(menu, items, disabled_items);
}
@@ -8039,7 +8335,8 @@ void LLObjectBridgeAction::attachOrDetach()
}
else
{
- LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, false); // Don't replace if adding.
+ static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryAddAttachmentBehavior", false);
+ LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, inventory_linking()); // Don't replace if adding.
}
}
@@ -8230,6 +8527,7 @@ void LLRecentItemsFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
buildContextMenuOptions(flags, items, disabled_items);
items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end());
+ items.erase(std::remove(items.begin(), items.end(), std::string("New folder from selected")), items.end());
hide_context_entries(menu, items, disabled_items);
}
@@ -8264,6 +8562,51 @@ LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge(
return new_listener;
}
+/************************************************************************/
+/* Favorites Inventory Panel related classes */
+/************************************************************************/
+void LLFavoritesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ // todo: consider things that should be disabled
+ menuentry_vec_t disabled_items, items;
+ buildContextMenuOptions(flags, items, disabled_items);
+
+ items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end());
+ items.erase(std::remove(items.begin(), items.end(), std::string("New folder from selected")), items.end());
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
+LLInvFVBridge* LLFavoritesInventoryBridgeBuilder::createBridge(
+ LLAssetType::EType asset_type,
+ LLAssetType::EType actual_asset_type,
+ LLInventoryType::EType inv_type,
+ LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ U32 flags /*= 0x00*/) const
+{
+ LLInvFVBridge* new_listener = NULL;
+ if (asset_type == LLAssetType::AT_CATEGORY
+ && actual_asset_type != LLAssetType::AT_LINK_FOLDER)
+ {
+ new_listener = new LLFavoritesFolderBridge(inv_type, inventory, root, uuid);
+ }
+ else
+ {
+ new_listener = LLInventoryFolderViewModelBuilder::createBridge(asset_type,
+ actual_asset_type,
+ inv_type,
+ inventory,
+ view_model,
+ root,
+ uuid,
+ flags);
+ }
+ return new_listener;
+}
+
LLFolderViewGroupedItemBridge::LLFolderViewGroupedItemBridge()
{
}
@@ -8274,7 +8617,7 @@ void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_dequ
menuentry_vec_t disabled_items;
if (get_selection_item_uuids(selected_items, ids))
{
- if (!LLAppearanceMgr::instance().canAddWearables(ids) && canWearSelected(ids))
+ if (!LLAppearanceMgr::instance().canAddWearables(ids, false) && canWearSelected(ids))
{
disabled_items.push_back(std::string("Wearable And Object Wear"));
disabled_items.push_back(std::string("Wearable Add"));
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 3e7f74384b..d96adbd1d2 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -86,6 +86,7 @@ public:
//--------------------------------------------------------------------
virtual const LLUUID& getUUID() const { return mUUID; }
virtual const LLUUID& getThumbnailUUID() const { return LLUUID::null; }
+ virtual bool isFavorite() const { return false; }
virtual void clearDisplayName() { mDisplayName.clear(); }
virtual void restoreItem() {}
virtual void restoreToWorld() {}
@@ -175,6 +176,7 @@ protected:
bool isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory?
bool isAgentInventory() const; // false if lost or in the inventory library
+ bool isAgentInventoryRoot() const; // true if worn by agent
bool isCOFFolder() const; // true if COF or descendant of
bool isInboxFolder() const; // true if COF or descendant of marketplace inbox
@@ -259,6 +261,7 @@ public:
LLViewerInventoryItem* getItem() const;
virtual const LLUUID& getThumbnailUUID() const;
+ virtual bool isFavorite() const;
protected:
bool confirmRemoveItem(const LLSD& notification, const LLSD& response);
@@ -301,6 +304,7 @@ public:
virtual std::string getLabelSuffix() const;
virtual LLFontGL::StyleFlags getLabelStyle() const;
virtual const LLUUID& getThumbnailUUID() const;
+ virtual bool isFavorite() const;
void setShowDescendantsCount(bool show_count) {mShowDescendantsCount = show_count;}
@@ -341,6 +345,7 @@ protected:
void buildContextMenuOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items);
void buildContextMenuFolderOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items);
void addOpenFolderMenuOptions(U32 flags, menuentry_vec_t& items);
+ void addInventoryFavoritesMenuOptions(menuentry_vec_t& items); // Inventory favorites, not toolbar favorites
//--------------------------------------------------------------------
// Menu callbacks
@@ -369,6 +374,7 @@ protected:
void dropToFavorites(LLInventoryItem* inv_item, LLPointer<LLInventoryCallback> cb = NULL);
void dropToOutfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit, LLPointer<LLInventoryCallback> cb = NULL);
void dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLInventoryCallback> cb = NULL);
+ void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLPointer<LLInventoryCallback> cb = NULL);
//--------------------------------------------------------------------
// Messy hacks for handling folder options
@@ -754,6 +760,46 @@ public:
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Favorites Inventory Panel related classes
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+// Overridden version of the Inventory-Folder-View-Bridge for Folders
+class LLFavoritesFolderBridge : public LLFolderBridge
+{
+ friend class LLInvFVBridgeAction;
+public:
+ // Creates context menu for Folders related to Recent Inventory Panel.
+ // Uses base logic and than removes from visible items "New..." menu items.
+ LLFavoritesFolderBridge(LLInventoryType::EType type,
+ LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLFolderBridge(inventory, root, uuid)
+ {
+ mInvType = type;
+ }
+ /*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags);
+ /*virtual*/ bool canSortContent() const { return true; }
+};
+
+// Bridge builder to create Inventory-Folder-View-Bridge for Recent Inventory Panel
+class LLFavoritesInventoryBridgeBuilder : public LLInventoryFolderViewModelBuilder
+{
+public:
+ LLFavoritesInventoryBridgeBuilder() {}
+ // Overrides FolderBridge for Recent Inventory Panel.
+ // It use base functionality for bridges other than FolderBridge.
+ virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type,
+ LLAssetType::EType actual_asset_type,
+ LLInventoryType::EType inv_type,
+ LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ U32 flags = 0x00) const;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Marketplace Inventory Panel related classes
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -780,7 +826,7 @@ private:
void rez_attachment(LLViewerInventoryItem* item,
LLViewerJointAttachment* attachment,
- bool replace = false);
+ bool replace);
// Move items from an in-world object's "Contents" folder to a specified
// folder in agent inventory.
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 5c0905af3c..99c2d6e410 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -64,6 +64,7 @@ LLInventoryFilter::FilterOps::FilterOps(const Params& p)
mFilterUUID(p.uuid),
mFilterLinks(p.links),
mFilterThumbnails(p.thumbnails),
+ mFilterFavorites(p.favorites),
mSearchVisibility(p.search_visibility)
{
}
@@ -159,6 +160,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
passed = passed && checkAgainstCreator(listener);
passed = passed && checkAgainstSearchVisibility(listener);
+ passed = passed && checkAgainstFilterFavorites(listener->getUUID());
passed = passed && checkAgainstFilterThumbnails(listener->getUUID());
return passed;
@@ -221,6 +223,19 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
return false;
}
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
+ if (cat && cat->getIsFavorite())
+ {
+ if (mFilterOps.mFilterFavorites == FILTER_ONLY_FAVORITES)
+ {
+ return true;
+ }
+ if (mFilterOps.mFilterFavorites == FILTER_EXCLUDE_FAVORITES)
+ {
+ return false;
+ }
+ }
+
// Marketplace folder filtering
const U32 filterTypes = mFilterOps.mFilterTypes;
const U32 marketplace_filter = FILTERTYPE_MARKETPLACE_ACTIVE | FILTERTYPE_MARKETPLACE_INACTIVE |
@@ -273,6 +288,16 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
}
}
+ if (filterTypes & FILTERTYPE_NO_TRASH_ITEMS)
+ {
+ const LLUUID trash_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ // If not a descendant of the marketplace listings root, then the nesting depth is -1 by definition
+ if (gInventory.isObjectDescendentOf(folder_id, trash_uuid))
+ {
+ return false;
+ }
+ }
+
// show folder links
LLViewerInventoryItem* item = gInventory.getItem(folder_id);
if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER)
@@ -611,6 +636,24 @@ bool LLInventoryFilter::checkAgainstFilterThumbnails(const LLUUID& object_id) co
return true;
}
+bool LLInventoryFilter::checkAgainstFilterFavorites(const LLUUID& object_id) const
+{
+ const LLInventoryObject* object = gInventory.getObject(object_id);
+ if (!object) return true;
+
+
+ if (mFilterOps.mFilterFavorites != FILTER_INCLUDE_FAVORITES)
+ {
+ bool is_favorite = get_is_favorite(object);
+ if (is_favorite && (mFilterOps.mFilterFavorites == FILTER_EXCLUDE_FAVORITES))
+ return false;
+ if (!is_favorite && (mFilterOps.mFilterFavorites == FILTER_ONLY_FAVORITES))
+ return false;
+ }
+
+ return true;
+}
+
bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory* listener) const
{
if (!listener)
@@ -811,6 +854,32 @@ void LLInventoryFilter::setFilterThumbnails(U64 filter_thumbnails)
mFilterOps.mFilterThumbnails = filter_thumbnails;
}
+void LLInventoryFilter::setFilterFavorites(U64 filter_favorites)
+{
+ if (mFilterOps.mFilterFavorites != filter_favorites)
+ {
+ if (mFilterOps.mFilterFavorites == FILTER_EXCLUDE_FAVORITES
+ && filter_favorites == FILTER_ONLY_FAVORITES)
+ {
+ setModified(FILTER_RESTART);
+ }
+ else if (mFilterOps.mFilterFavorites == FILTER_ONLY_FAVORITES
+ && filter_favorites == FILTER_EXCLUDE_FAVORITES)
+ {
+ setModified(FILTER_RESTART);
+ }
+ else if (mFilterOps.mFilterFavorites == FILTER_INCLUDE_FAVORITES)
+ {
+ setModified(FILTER_MORE_RESTRICTIVE);
+ }
+ else
+ {
+ setModified(FILTER_LESS_RESTRICTIVE);
+ }
+ }
+ mFilterOps.mFilterFavorites = filter_favorites;
+}
+
void LLInventoryFilter::setFilterEmptySystemFolders()
{
mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;
@@ -923,6 +992,11 @@ void LLInventoryFilter::toggleSearchVisibilityLibrary()
}
}
+void LLInventoryFilter::setFilterNoTrashFolder()
+{
+ mFilterOps.mFilterTypes |= FILTERTYPE_NO_TRASH_ITEMS;
+}
+
void LLInventoryFilter::setFilterNoMarketplaceFolder()
{
mFilterOps.mFilterTypes |= FILTERTYPE_NO_MARKETPLACE_ITEMS;
@@ -959,7 +1033,7 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
boost::char_separator<char> sep("+");
tokenizer tokens(filter_sub_string_new, sep);
- for (auto token_iter : tokens)
+ for (const auto& token_iter : tokens)
{
mFilterTokens.push_back(token_iter);
}
@@ -1025,7 +1099,7 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
}
// Cancel out UUID once the search string is modified
- if (mFilterOps.mFilterTypes == FILTERTYPE_UUID)
+ if (mFilterOps.mFilterTypes & FILTERTYPE_UUID)
{
mFilterOps.mFilterTypes &= ~FILTERTYPE_UUID;
mFilterOps.mFilterUUID = LLUUID::null;
@@ -1615,6 +1689,11 @@ U64 LLInventoryFilter::getFilterThumbnails() const
return mFilterOps.mFilterThumbnails;
}
+U64 LLInventoryFilter::getFilterFavorites() const
+{
+ return mFilterOps.mFilterFavorites;
+}
+
bool LLInventoryFilter::hasFilterString() const
{
return mFilterSubString.size() > 0;
@@ -1707,7 +1786,7 @@ std::string LLInventoryFilter::getEmptyLookupMessage(bool is_empty_folder) const
}
}
-bool LLInventoryFilter::areDateLimitsSet()
+bool LLInventoryFilter::areDateLimitsSet() const
{
return mFilterOps.mMinDate != time_min()
|| mFilterOps.mMaxDate != time_max()
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 7e64a03e73..c0164e04e4 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -61,6 +61,7 @@ public:
FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10, // pass iff folder is not under the marketplace
FILTERTYPE_WORN = 0x1 << 11, // pass if item is worn
FILTERTYPE_SETTINGS = 0x1 << 12, // pass if the item is a settings object
+ FILTERTYPE_NO_TRASH_ITEMS = 0x1 << 13, // pass iff folder is not under the marketplace
};
enum EFilterDateDirection
@@ -83,6 +84,13 @@ public:
FILTER_ONLY_THUMBNAILS
};
+ enum EFilterFavorite
+ {
+ FILTER_INCLUDE_FAVORITES,
+ FILTER_EXCLUDE_FAVORITES,
+ FILTER_ONLY_FAVORITES
+ };
+
enum ESortOrderType
{
SO_NAME = 0, // Sort inventory by name
@@ -149,6 +157,7 @@ public:
Optional<PermissionMask> permissions;
Optional<EFilterCreatorType> creator_type;
Optional<EFilterThumbnail> thumbnails;
+ Optional<EFilterFavorite> favorites;
Params()
: types("filter_types", FILTERTYPE_OBJECT),
@@ -156,6 +165,7 @@ public:
wearable_types("wearable_types", 0xffffFFFFffffFFFFULL),
settings_types("settings_types", 0xffffFFFFffffFFFFULL),
thumbnails("thumbnails", FILTER_INCLUDE_THUMBNAILS),
+ favorites("favorites", FILTER_INCLUDE_FAVORITES),
category_types("category_types", 0xffffFFFFffffFFFFULL),
links("links", FILTERLINK_INCLUDE_LINKS),
search_visibility("search_visibility", 0xFFFFFFFF),
@@ -177,6 +187,7 @@ public:
mFilterWearableTypes,
mFilterSettingsTypes, // for _SETTINGS
mFilterThumbnails,
+ mFilterFavorites,
mFilterLinks,
mFilterCategoryTypes; // For _CATEGORY
LLUUID mFilterUUID; // for UUID
@@ -220,6 +231,7 @@ public:
U64 getFilterSettingsTypes() const;
U64 getSearchVisibilityTypes() const;
U64 getFilterThumbnails() const;
+ U64 getFilterFavorites() const;
bool isFilterObjectTypesWith(LLInventoryType::EType t) const;
void setFilterObjectTypes(U64 types);
@@ -233,8 +245,10 @@ public:
void setFilterMarketplaceInactiveFolders();
void setFilterMarketplaceUnassociatedFolders();
void setFilterMarketplaceListingFolders(bool select_only_listing_folders);
+ void setFilterNoTrashFolder();
void setFilterNoMarketplaceFolder();
void setFilterThumbnails(U64 filter_thumbnails);
+ void setFilterFavorites(U64 filter_favorites);
void updateFilterTypes(U64 types, U64& current_types);
void setSearchType(ESearchType type);
ESearchType getSearchType() { return mSearchType; }
@@ -339,9 +353,10 @@ public:
LLInventoryFilter& operator =(const LLInventoryFilter& other);
bool checkAgainstFilterThumbnails(const LLUUID& object_id) const;
+ bool checkAgainstFilterFavorites(const LLUUID& object_id) const;
private:
- bool areDateLimitsSet();
+ bool areDateLimitsSet() const;
bool checkAgainstFilterSubString(const std::string& desc) const;
bool checkAgainstFilterType(const class LLFolderViewModelItemInventory* listener) const;
bool checkAgainstFilterType(const LLInventoryItem* item) const;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 1ccefa3212..e6b33453d5 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -51,6 +51,7 @@
#include "lldirpicker.h"
#include "lldonotdisturbnotificationstorage.h"
#include "llfloatermarketplacelistings.h"
+#include "llfloatermodelpreview.h"
#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
@@ -62,6 +63,7 @@
#include "llinventorymodel.h"
#include "llinventorypanel.h"
#include "lllineeditor.h"
+#include "llmaterialeditor.h"
#include "llmarketplacenotifications.h"
#include "llmarketplacefunctions.h"
#include "llmenugl.h"
@@ -86,6 +88,7 @@
#include "llviewermessage.h"
#include "llviewerfoldertype.h"
#include "llviewerobjectlist.h"
+#include "llviewermenufile.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
@@ -438,7 +441,13 @@ void copy_inventory_category(LLInventoryModel* model,
{
copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items);
};
- gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID());
+ LLFolderType::EType type = LLFolderType::FT_NONE;
+ if (cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ // at the moment only permitting copy of outfits and normal folders
+ type = LLFolderType::FT_OUTFIT;
+ }
+ gInventory.createNewCategory(parent_id, type, cat->getName(), func, cat->getThumbnailUUID());
}
void copy_inventory_category(LLInventoryModel* model,
@@ -460,6 +469,25 @@ void copy_inventory_category(LLInventoryModel* model,
gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID());
}
+void copy_inventory_category(LLInventoryModel* model,
+ LLViewerInventoryCategory* cat,
+ const LLUUID& parent_id,
+ const LLUUID& root_copy_id,
+ bool move_no_copy_items,
+ LLPointer<LLInventoryCallback> callback)
+{
+ // Create the initial folder
+ inventory_func_type func = [model, cat, root_copy_id, move_no_copy_items, callback](const LLUUID& new_id)
+ {
+ copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items);
+ if (callback)
+ {
+ callback.get()->fire(new_id);
+ }
+ };
+ gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID());
+}
+
void copy_cb(const LLUUID& dest_folder, const LLUUID& root_id)
{
// Decrement the count in root_id since that one item won't be copied over
@@ -2147,21 +2175,10 @@ void validate_marketplacelistings(
void change_item_parent(const LLUUID& item_id, const LLUUID& new_parent_id)
{
- LLInventoryItem* inv_item = gInventory.getItem(item_id);
+ LLViewerInventoryItem* inv_item = gInventory.getItem(item_id);
if (inv_item)
{
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(inv_item->getParentUUID(), -1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
- update.push_back(new_folder);
- gInventory.accountForUpdate(update);
-
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item);
- new_item->setParent(new_parent_id);
- new_item->updateParentOnServer(false);
- gInventory.updateItem(new_item);
- gInventory.notifyObservers();
+ gInventory.changeItemParent(inv_item, new_parent_id, false);
}
}
@@ -2169,17 +2186,17 @@ void move_items_to_folder(const LLUUID& new_cat_uuid, const uuid_vec_t& selected
{
for (uuid_vec_t::const_iterator it = selected_uuids.begin(); it != selected_uuids.end(); ++it)
{
- LLInventoryItem* inv_item = gInventory.getItem(*it);
+ LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
if (inv_item)
{
- change_item_parent(*it, new_cat_uuid);
+ gInventory.changeItemParent(inv_item, new_cat_uuid, false);
}
else
{
- LLInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
if (inv_cat && !LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
{
- gInventory.changeCategoryParent((LLViewerInventoryCategory*)inv_cat, new_cat_uuid, false);
+ gInventory.changeCategoryParent(inv_cat, new_cat_uuid, false);
}
}
}
@@ -2314,7 +2331,7 @@ bool can_move_to_landmarks(LLInventoryItem* inv_item)
}
// Returns true if folder's content can be moved to Current Outfit or any outfit folder.
-bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit)
+bool can_move_to_my_outfits_as_outfit(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit)
{
LLInventoryModel::cat_array_t *cats;
LLInventoryModel::item_array_t *items;
@@ -2325,9 +2342,9 @@ bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_ca
return false;
}
- if (items->size() == 0)
+ if (items->size() == 0 && inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT)
{
- // Nothing to move(create)
+ // Nothing to create an outfit folder from
return false;
}
@@ -2353,6 +2370,51 @@ bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_ca
return true;
}
+bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCategory* inv_cat, S32 depth)
+{
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ model->getDirectDescendentsOf(inv_cat->getUUID(), cats, items);
+
+ if (items->size() > 0)
+ {
+ // subfolders don't allow items
+ return false;
+ }
+
+ if (inv_cat->getPreferredType() != LLFolderType::FT_NONE)
+ {
+ // only normal folders can become subfodlers
+ return false;
+ }
+
+ constexpr size_t MAX_CONTENT = 255;
+ if (cats->size() > MAX_CONTENT)
+ {
+ // don't allow massive folders
+ return false;
+ }
+
+ for (LLPointer<LLViewerInventoryCategory>& cat : *cats)
+ {
+ // outfits are valid to move, check non-outfit folders
+ if (cat->getPreferredType() != LLFolderType::FT_OUTFIT)
+ {
+ if (depth == 3)
+ {
+ // don't allow massive folders
+ return false;
+ }
+ if (!can_move_to_my_outfits_as_subfolder(model, cat, depth + 1))
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
std::string get_localized_folder_name(LLUUID cat_uuid)
{
std::string localized_root_name;
@@ -2418,6 +2480,143 @@ void ungroup_folder_items(const LLUUID& folder_id)
gInventory.notifyObservers();
}
+class LLUpdateFavorite : public LLInventoryCallback
+{
+public:
+ LLUpdateFavorite(const LLUUID& inv_item_id)
+ : mInvItemID(inv_item_id)
+ {}
+ /* virtual */ void fire(const LLUUID& inv_item_id) override
+ {
+ gInventory.addChangedMask(LLInventoryObserver::UPDATE_FAVORITE, mInvItemID);
+
+ LLInventoryModel::item_array_t items;
+ LLInventoryModel::cat_array_t cat_array;
+ LLLinkedItemIDMatches matches(mInvItemID);
+ gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
+ cat_array,
+ items,
+ LLInventoryModel::INCLUDE_TRASH,
+ matches);
+
+ std::set<LLUUID> link_ids;
+ for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); ++it)
+ {
+ LLPointer<LLViewerInventoryItem> item = *it;
+
+ gInventory.addChangedMask(LLInventoryObserver::UPDATE_FAVORITE, item->getUUID());
+ }
+
+ gInventory.notifyObservers();
+ }
+private:
+ LLUUID mInvItemID;
+};
+
+void favorite_send(LLInventoryObject* obj, const LLUUID& obj_id, bool favorite)
+{
+ LLSD updates;
+ if (favorite)
+ {
+ updates["favorite"] = LLSD().with("toggled", true);
+ }
+ else
+ {
+ updates["favorite"] = LLSD();
+ }
+
+ LLPointer<LLInventoryCallback> cb = new LLUpdateFavorite(obj_id);
+
+ LLViewerInventoryCategory* view_folder = dynamic_cast<LLViewerInventoryCategory*>(obj);
+ if (view_folder)
+ {
+ update_inventory_category(obj_id, updates, cb);
+ }
+ LLViewerInventoryItem* view_item = dynamic_cast<LLViewerInventoryItem*>(obj);
+ if (view_item)
+ {
+ update_inventory_item(obj_id, updates, cb);
+ }
+}
+
+bool get_is_favorite(const LLInventoryObject* object)
+{
+ if (object->getIsLinkType())
+ {
+ LLInventoryObject* obj = gInventory.getObject(object->getLinkedUUID());
+ return obj && obj->getIsFavorite();
+ }
+
+ return object->getIsFavorite();
+}
+
+bool get_is_favorite(const LLUUID& obj_id)
+{
+ LLInventoryObject* object = gInventory.getObject(obj_id);
+ if (object && object->getIsLinkType())
+ {
+ LLInventoryObject* obj = gInventory.getObject(object->getLinkedUUID());
+ return obj && obj->getIsFavorite();
+ }
+
+ return object->getIsFavorite();
+}
+
+void set_favorite(const LLUUID& obj_id, bool favorite)
+{
+ LLInventoryObject* obj = gInventory.getObject(obj_id);
+
+ if (obj && obj->getIsLinkType())
+ {
+ if (!favorite && obj->getIsFavorite())
+ {
+ // Links currently aren't supposed to be favorites,
+ // instead should show state of the original
+ LL_INFOS("Inventory") << "Recovering proper 'favorites' state of a link " << obj_id << LL_ENDL;
+ favorite_send(obj, obj_id, false);
+ }
+ obj = gInventory.getObject(obj->getLinkedUUID());
+ }
+
+ if (obj && obj->getIsFavorite() != favorite)
+ {
+ favorite_send(obj, obj->getUUID(), favorite);
+ }
+}
+
+void toggle_favorite(const LLUUID& obj_id)
+{
+ LLInventoryObject* obj = gInventory.getObject(obj_id);
+ if (obj && obj->getIsLinkType())
+ {
+ obj = gInventory.getObject(obj->getLinkedUUID());
+ }
+
+ if (obj)
+ {
+ favorite_send(obj, obj->getUUID(), !obj->getIsFavorite());
+ }
+}
+
+void toggle_favorites(const uuid_vec_t& ids)
+{
+ if (ids.size() == 0)
+ {
+ return;
+ }
+ if (ids.size() == 1)
+ {
+ toggle_favorite(ids[0]);
+ return;
+ }
+
+ bool new_val = !get_is_favorite(ids.front());
+ for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ {
+ set_favorite(*it, new_val);
+ }
+}
+
std::string get_searchable_description(LLInventoryModel* model, const LLUUID& item_id)
{
if (model)
@@ -2493,6 +2692,40 @@ bool can_share_item(const LLUUID& item_id)
return can_share;
}
+
+EMyOutfitsSubfolderType myoutfit_object_subfolder_type(
+ LLInventoryModel* model,
+ const LLUUID& obj_id,
+ const LLUUID& my_outfits_id)
+{
+ if (obj_id == my_outfits_id) return MY_OUTFITS_NO;
+
+ const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id);
+ if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ return MY_OUTFITS_OUTFIT;
+ }
+ while (test_cat)
+ {
+ if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ return MY_OUTFITS_SUBOUTFIT;
+ }
+
+ const LLUUID& parent_id = test_cat->getParentUUID();
+ if (parent_id.isNull())
+ {
+ return MY_OUTFITS_NO;
+ }
+ if (parent_id == my_outfits_id)
+ {
+ return MY_OUTFITS_SUBFOLDER;
+ }
+ test_cat = model->getCategory(parent_id);
+ }
+
+ return MY_OUTFITS_NO;
+}
///----------------------------------------------------------------------------
/// LLMarketplaceValidator implementations
///----------------------------------------------------------------------------
@@ -2621,6 +2854,11 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte
return false;
}
+bool LLIsFolderType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ return cat && cat->getPreferredType() == mType;
+}
+
bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
if(mType == LLAssetType::AT_CATEGORY)
@@ -2713,6 +2951,20 @@ bool LLIsTypeWithPermissions::operator()(LLInventoryCategory* cat, LLInventoryIt
return false;
}
+bool LLFavoritesCollector::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ if (item && item->getIsFavorite())
+ {
+ return true;
+ }
+ if (cat && cat->getIsFavorite())
+ {
+ return true;
+ }
+ return false;
+}
+
bool LLBuddyCollector::operator()(LLInventoryCategory* cat,
LLInventoryItem* item)
{
@@ -3197,7 +3449,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
for (LLInventoryModel::item_array_t::value_type& item : items)
{
- if (get_is_item_worn(item))
+ if (!item->getIsLinkType() && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@@ -3217,7 +3469,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
}
}
LLViewerInventoryItem* item = gInventory.getItem(obj_id);
- if (item && get_is_item_worn(item))
+ if (item && !item->getIsLinkType() && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@@ -3423,7 +3675,6 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
}
else if ("new_folder_from_selected" == action)
{
-
LLInventoryObject* first_item = gInventory.getObject(*ids.begin());
if (!first_item)
{
@@ -3467,6 +3718,20 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
ungroup_folder_items(*ids.begin());
}
}
+ else if ("add_to_favorites" == action)
+ {
+ for (const LLUUID& id : ids)
+ {
+ set_favorite(id, true);
+ }
+ }
+ else if ("remove_from_favorites" == action)
+ {
+ for (const LLUUID& id : ids)
+ {
+ set_favorite(id, false);
+ }
+ }
else if ("thumbnail" == action)
{
if (selected_items.size() > 0)
@@ -3577,6 +3842,79 @@ void LLInventoryAction::removeItemFromDND(LLFolderView* root)
}
}
+void LLInventoryAction::fileUploadLocation(const LLUUID& dest_id, const std::string& action)
+{
+ if (action == "def_model")
+ {
+ gSavedPerAccountSettings.setString("ModelUploadFolder", dest_id.asString());
+ }
+ else if (action == "def_texture")
+ {
+ gSavedPerAccountSettings.setString("TextureUploadFolder", dest_id.asString());
+ }
+ else if (action == "def_sound")
+ {
+ gSavedPerAccountSettings.setString("SoundUploadFolder", dest_id.asString());
+ }
+ else if (action == "def_animation")
+ {
+ gSavedPerAccountSettings.setString("AnimationUploadFolder", dest_id.asString());
+ }
+ else if (action == "def_pbr_material")
+ {
+ gSavedPerAccountSettings.setString("PBRUploadFolder", dest_id.asString());
+ }
+ else if (action == "upload_texture")
+ {
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, dest_id), LLFilePicker::FFLOAD_IMAGE, false);
+ }
+ else if (action == "upload_sound")
+ {
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, dest_id), LLFilePicker::FFLOAD_WAV, false);
+ }
+ else if (action == "upload_animation")
+ {
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, dest_id), LLFilePicker::FFLOAD_ANIM, false);
+ }
+ else if (action == "upload_model")
+ {
+ LLFloaterModelPreview::showModelPreview(dest_id);
+ }
+ else if (action == "upload_pbr_material")
+ {
+ LLMaterialEditor::importMaterial(dest_id);
+ }
+ else if (action == "upload_bulk")
+ {
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true, dest_id), LLFilePicker::FFLOAD_ALL, true);
+ }
+}
+
+bool LLInventoryAction::isFileUploadLocation(const LLUUID& dest_id, const std::string& action)
+{
+ if (action == "def_model")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT) == dest_id;
+ }
+ else if (action == "def_texture")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE) == dest_id;
+ }
+ else if (action == "def_sound")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_SOUND) == dest_id;
+ }
+ else if (action == "def_animation")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_ANIMATION) == dest_id;
+ }
+ else if (action == "def_pbr_material")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL) == dest_id;
+ }
+ return false;
+}
+
void LLInventoryAction::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -3685,15 +4023,17 @@ void LLInventoryAction::buildMarketplaceFolders(LLFolderView* root)
for (; set_iter != selected_items.end(); ++set_iter)
{
viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*set_iter)->getViewModelItem());
- if (!viewModel || !viewModel->getInventoryObject()) continue;
- if (gInventory.isObjectDescendentOf(viewModel->getInventoryObject()->getParentUUID(), marketplacelistings_id))
+ if (!viewModel) continue;
+ LLInventoryObject* inv_obj = viewModel->getInventoryObject();
+ if (!inv_obj) continue;
+ if (gInventory.isObjectDescendentOf(inv_obj->getParentUUID(), marketplacelistings_id))
{
- const LLUUID &parent_id = viewModel->getInventoryObject()->getParentUUID();
+ const LLUUID &parent_id = inv_obj->getParentUUID();
if (parent_id != marketplacelistings_id)
{
sMarketplaceFolders.push_back(parent_id);
}
- const LLUUID &curr_id = viewModel->getInventoryObject()->getUUID();
+ const LLUUID &curr_id = inv_obj->getUUID();
if (curr_id != marketplacelistings_id)
{
sMarketplaceFolders.push_back(curr_id);
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 13a64f21dc..77a2a18877 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -78,6 +78,7 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s
void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null, bool move_no_copy_items = false);
void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, inventory_func_type callback);
+void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, LLPointer<LLInventoryCallback> callback);
void copy_inventory_category_content(const LLUUID& new_cat_uuid, LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& root_copy_id, bool move_no_copy_items);
@@ -112,15 +113,33 @@ std::string get_category_path(LLUUID cat_id);
bool can_move_to_outfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit);
bool can_move_to_landmarks(LLInventoryItem* inv_item);
-bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit);
+bool can_move_to_my_outfits_as_outfit(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit);
+bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCategory* inv_cat, S32 depth = 0);
std::string get_localized_folder_name(LLUUID cat_uuid);
void new_folder_window(const LLUUID& folder_id);
void ungroup_folder_items(const LLUUID& folder_id);
+bool get_is_favorite(const LLInventoryObject* object);
+bool get_is_favorite(const LLUUID& obj_id);
+void set_favorite(const LLUUID& obj_id, bool favorite);
+void toggle_favorite(const LLUUID& obj_id);
+void toggle_favorites(const uuid_vec_t& ids);
std::string get_searchable_description(LLInventoryModel* model, const LLUUID& item_id);
std::string get_searchable_creator_name(LLInventoryModel* model, const LLUUID& item_id);
std::string get_searchable_UUID(LLInventoryModel* model, const LLUUID& item_id);
bool can_share_item(const LLUUID& item_id);
+enum EMyOutfitsSubfolderType
+{
+ MY_OUTFITS_NO,
+ MY_OUTFITS_SUBFOLDER,
+ MY_OUTFITS_OUTFIT,
+ MY_OUTFITS_SUBOUTFIT,
+};
+EMyOutfitsSubfolderType myoutfit_object_subfolder_type(
+ LLInventoryModel* model,
+ const LLUUID& obj_id,
+ const LLUUID& my_outfits_id);
+
/** Miscellaneous global functions
** **
*******************************************************************************/
@@ -187,7 +206,9 @@ class LLInventoryCollectFunctor
{
public:
virtual ~LLInventoryCollectFunctor(){};
- virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0;
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0;
+
+ virtual bool exceedsLimit() { return false; }
static bool itemTransferCommonlyAllowed(const LLInventoryItem* item);
};
@@ -234,6 +255,24 @@ protected:
// the type is the type passed in during construction.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLIsFolderType : public LLInventoryCollectFunctor
+{
+public:
+ LLIsFolderType(LLFolderType::EType type) : mType(type) {}
+ virtual ~LLIsFolderType() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+protected:
+ LLFolderType::EType mType;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLIsType
+//
+// Implementation of a LLInventoryCollectFunctor which returns true if
+// the type is the type passed in during construction.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
class LLIsType : public LLInventoryCollectFunctor
{
public:
@@ -344,6 +383,18 @@ protected:
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFavoritesCollector
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFavoritesCollector : public LLInventoryCollectFunctor
+{
+public:
+ LLFavoritesCollector() {}
+ virtual ~LLFavoritesCollector() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLBuddyCollector
//
// Simple class that collects calling cards that are not null, and not
@@ -601,6 +652,8 @@ struct LLInventoryAction
static void callback_copySelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root);
static void removeItemFromDND(LLFolderView* root);
+ static void fileUploadLocation(const LLUUID& dest_id, const std::string& action);
+ static bool isFileUploadLocation(const LLUUID& dest_id, const std::string& action);
static void saveMultipleTextures(const std::vector<std::string>& filenames, std::set<LLFolderViewItem*> selected_items, LLInventoryModel* model);
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp
index c4f93cee98..c54af7d9f1 100644
--- a/indra/newview/llinventorygallery.cpp
+++ b/indra/newview/llinventorygallery.cpp
@@ -60,10 +60,12 @@ static LLPanelInjector<LLInventoryGallery> t_inventory_gallery("inventory_galler
const S32 GALLERY_ITEMS_PER_ROW_MIN = 2;
const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value immediately
+
// Helper dnd functions
bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, bool drop, std::string& tooltip_msg, bool is_link);
bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, std::string& tooltip_msg, bool user_confirm);
void dropToMyOutfits(LLInventoryCategory* inv_cat);
+void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id);
class LLGalleryPanel: public LLPanel
{
@@ -634,7 +636,7 @@ void LLInventoryGallery::removeFromLastRow(LLInventoryGalleryItem* item)
mItemPanels.pop_back();
}
-LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn)
+LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn, bool is_favorite)
{
LLInventoryGalleryItem::Params giparams;
giparams.visible = true;
@@ -645,6 +647,7 @@ LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, L
gitem->setUUID(item_id);
gitem->setGallery(this);
gitem->setType(type, inventory_type, flags, is_link);
+ gitem->setFavorite(is_favorite);
gitem->setLoadImmediately(mLoadThumbnailsImmediately);
gitem->setThumbnail(thumbnail_id);
gitem->setWorn(is_worn);
@@ -937,8 +940,19 @@ bool LLInventoryGallery::updateAddedItem(LLUUID item_id)
}
bool res = false;
-
- LLInventoryGalleryItem* item = buildGalleryItem(name, item_id, obj->getType(), thumbnail_id, inventory_type, misc_flags, obj->getCreationDate(), obj->getIsLinkType(), is_worn);
+ bool is_favorite = get_is_favorite(obj);
+
+ LLInventoryGalleryItem* item = buildGalleryItem(
+ name,
+ item_id,
+ obj->getType(),
+ thumbnail_id,
+ inventory_type,
+ misc_flags,
+ obj->getCreationDate(),
+ obj->getIsLinkType(),
+ is_worn,
+ is_favorite);
mItemMap.insert(LLInventoryGallery::gallery_item_map_t::value_type(item_id, item));
if (mGalleryCreated)
{
@@ -975,7 +989,7 @@ void LLInventoryGallery::updateRemovedItem(LLUUID item_id)
mItemBuildQuery.erase(item_id);
}
-void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name)
+void LLInventoryGallery::updateChangedItemData(LLUUID item_id, std::string name, bool is_favorite)
{
gallery_item_map_t::iterator iter = mItemMap.find(item_id);
if (iter != mItemMap.end())
@@ -984,6 +998,7 @@ void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name)
if (item)
{
item->setItemName(name);
+ item->setFavorite(is_favorite);
}
}
}
@@ -1999,7 +2014,7 @@ void LLInventoryGallery::deleteSelection()
for (LLInventoryModel::item_array_t::value_type& item : items)
{
- if (get_is_item_worn(item))
+ if (!item->getIsLinkType() && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@@ -2020,7 +2035,7 @@ void LLInventoryGallery::deleteSelection()
}
LLViewerInventoryItem* item = gInventory.getItem(id);
- if (item && get_is_item_worn(item))
+ if (item && !item->getIsLinkType() && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@@ -2105,6 +2120,30 @@ void LLInventoryGallery::pasteAsLink()
std::vector<LLUUID> objects;
LLClipboard::instance().pasteFromClipboard(objects);
+ if (objects.size() == 0)
+ {
+ LLClipboard::instance().setCutMode(false);
+ return;
+ }
+
+ LLUUID& first_id = objects[0];
+ LLInventoryItem* item = gInventory.getItem(first_id);
+ if (item && item->getAssetUUID().isNull())
+ {
+ if (item->getActualType() == LLAssetType::AT_NOTECARD)
+ {
+ LLNotificationsUtil::add("CantLinkNotecard");
+ LLClipboard::instance().setCutMode(false);
+ return;
+ }
+ else if (item->getActualType() == LLAssetType::AT_MATERIAL)
+ {
+ LLNotificationsUtil::add("CantLinkMaterial");
+ LLClipboard::instance().setCutMode(false);
+ return;
+ }
+ }
+
bool paste_into_root = mSelectedItemIDs.empty();
for (LLUUID& dest : mSelectedItemIDs)
{
@@ -2333,7 +2372,7 @@ void LLInventoryGallery::refreshList(const LLUUID& category_id)
return;
}
- updateChangedItemName(*items_iter, obj->getName());
+ updateChangedItemData(*items_iter, obj->getName(), get_is_favorite(obj));
mNeedsArrange = true;
}
@@ -2849,6 +2888,14 @@ void LLInventoryGalleryItem::setType(LLAssetType::EType type, LLInventoryType::E
getChild<LLIconCtrl>("link_overlay")->setVisible(is_link);
}
+void LLInventoryGalleryItem::setFavorite(bool is_favorite)
+{
+ getChild<LLIconCtrl>("fav_icon")->setVisible(is_favorite);
+ static const LLUIColor text_color = LLUIColorTable::instance().getColor("LabelTextColor", LLColor4::white);
+ static const LLUIColor favorite_color = LLUIColorTable::instance().getColor("InventoryFavoriteColor", LLColor4::white);
+ mNameText->setReadOnlyColor(is_favorite ? favorite_color : text_color);
+}
+
void LLInventoryGalleryItem::setThumbnail(LLUUID id)
{
mDefaultImage = id.isNull();
@@ -3712,6 +3759,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
//
bool is_movable = true;
+ bool create_outfit = false;
if (is_movable && (marketplacelistings_id == cat_id))
{
@@ -3745,14 +3793,24 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit");
if (is_movable && move_is_into_outfit)
{
- if (dest_id == my_outifts_id)
+ if ((inv_cat->getPreferredType() != LLFolderType::FT_NONE) && (inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT))
+ {
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ is_movable = false;
+ }
+ else if (dest_id == my_outifts_id)
{
if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings)
{
tooltip_msg = LLTrans::getString("TooltipOutfitNotInInventory");
is_movable = false;
}
- else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear))
+ else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear))
+ {
+ is_movable = true;
+ create_outfit = true;
+ }
+ else if (can_move_to_my_outfits_as_subfolder(model, inv_cat))
{
is_movable = true;
}
@@ -3762,13 +3820,44 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
is_movable = false;
}
}
- else if (dest_cat && dest_cat->getPreferredType() == LLFolderType::FT_NONE)
+ else if (!dest_cat)
{
- is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT));
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
}
else
{
- is_movable = false;
+ EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id);
+ EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id);
+ if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_OUTFIT)
+ {
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit");
+ }
+ else if (dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT)
+ {
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ }
+ else if (dest_res == MY_OUTFITS_SUBFOLDER && inv_res == MY_OUTFITS_SUBOUTFIT)
+ {
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ }
+ else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear))
+ {
+ is_movable = true;
+ create_outfit = true;
+ }
+ else if (can_move_to_my_outfits_as_subfolder(model, inv_cat))
+ {
+ is_movable = true;
+ }
+ else
+ {
+ is_movable = false;
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ }
}
}
if (is_movable && move_is_into_current_outfit && is_link)
@@ -3894,9 +3983,73 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
if (dest_id == my_outifts_id)
{
- // Category can contains objects,
- // create a new folder and populate it with links to original objects
- dropToMyOutfits(inv_cat);
+ EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id);
+ if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT || !create_outfit)
+ {
+ gInventory.changeCategoryParent(
+ (LLViewerInventoryCategory*)inv_cat,
+ dest_id,
+ move_is_into_trash);
+ }
+ else
+ {
+ // Category can contains objects,
+ // create a new folder and populate it with links to original objects
+ dropToMyOutfits(inv_cat);
+ }
+ }
+ else if (move_is_into_my_outfits)
+ {
+ EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id);
+ EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id);
+ switch (inv_res)
+ {
+ case MY_OUTFITS_NO:
+ // Moning from outside outfits into outfits
+ if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit)
+ {
+ // turn it into outfit
+ dropToMyOutfitsSubfolder(inv_cat, dest_id);
+ }
+ else
+ {
+ gInventory.changeCategoryParent(
+ (LLViewerInventoryCategory*)inv_cat,
+ dest_id,
+ move_is_into_trash);
+ }
+ break;
+ case MY_OUTFITS_SUBFOLDER:
+ case MY_OUTFITS_OUTFIT:
+ // only permit moving subfodlers and outfits into other subfolders
+ if (dest_res == MY_OUTFITS_SUBFOLDER)
+ {
+ gInventory.changeCategoryParent(
+ (LLViewerInventoryCategory*)inv_cat,
+ dest_id,
+ move_is_into_trash);
+ }
+ else
+ {
+ assert(false); // mot permitted, shouldn't have accepted
+ }
+ break;
+ case MY_OUTFITS_SUBOUTFIT:
+ if (dest_res == MY_OUTFITS_SUBOUTFIT || dest_res == MY_OUTFITS_OUTFIT)
+ {
+ gInventory.changeCategoryParent(
+ (LLViewerInventoryCategory*)inv_cat,
+ dest_id,
+ move_is_into_trash);
+ }
+ else
+ {
+ assert(false); // mot permitted, shouldn't have accepted
+ }
+ break;
+ default:
+ break;
+ }
}
// if target is current outfit folder we use link
else if (move_is_into_current_outfit &&
@@ -4041,3 +4194,11 @@ void dropToMyOutfits(LLInventoryCategory* inv_cat)
inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1);
gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID());
}
+
+void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id)
+{
+ // Note: creation will take time, so passing folder id to callback is slightly unreliable,
+ // but so is collecting and passing descendants' ids
+ inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1);
+ gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID());
+}
diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h
index 59d08d19ed..7f53f9998d 100644
--- a/indra/newview/llinventorygallery.h
+++ b/indra/newview/llinventorygallery.h
@@ -102,7 +102,7 @@ public:
void getCurrentCategories(uuid_vec_t& vcur);
bool updateAddedItem(LLUUID item_id); // returns true if added item is visible
void updateRemovedItem(LLUUID item_id);
- void updateChangedItemName(LLUUID item_id, std::string name);
+ void updateChangedItemData(LLUUID item_id, std::string name, bool is_favorite);
void updateItemThumbnail(LLUUID item_id);
void updateWornItem(LLUUID item_id, bool is_worn);
@@ -227,7 +227,7 @@ private:
bool updateRowsIfNeeded();
void updateGalleryWidth();
- LLInventoryGalleryItem* buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn);
+ LLInventoryGalleryItem* buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn, bool is_favorite);
LLInventoryGalleryItem* getItem(const LLUUID& id) const;
void buildGalleryPanel(int row_count);
@@ -343,6 +343,7 @@ public:
void setHidden(bool hidden) {mHidden = hidden;}
void setType(LLAssetType::EType type, LLInventoryType::EType inventory_type, U32 flags, bool is_link);
+ void setFavorite(bool is_favorite);
LLAssetType::EType getAssetType() { return mType; }
void setThumbnail(LLUUID id);
void setGallery(LLInventoryGallery* gallery) { mGallery = gallery; }
diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp
index 0c35a7f695..6bea648380 100644
--- a/indra/newview/llinventorygallerymenu.cpp
+++ b/indra/newview/llinventorygallerymenu.cpp
@@ -112,6 +112,7 @@ LLContextMenu* LLInventoryGalleryContextMenu::createMenu()
enable_registrar.add("Inventory.CanSetUploadLocation", boost::bind(&LLInventoryGalleryContextMenu::canSetUploadLocation, this, _2));
enable_registrar.add("Inventory.CanSetFavoriteFolder", boost::bind(&LLInventoryGalleryContextMenu::canSetFavoriteFolder, this));
+ enable_registrar.add("Inventory.FileUploadLocation.Check", boost::bind(&LLInventoryGalleryContextMenu::isUploadLocationSelected, this, _2));
enable_registrar.add("Inventory.EnvironmentEnabled", [](LLUICtrl*, const LLSD&)
{
@@ -252,6 +253,20 @@ void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata)
{
ungroup_folder_items(mUUIDs.front());
}
+ else if ("add_to_favorites" == action)
+ {
+ for (const LLUUID& id : mUUIDs)
+ {
+ set_favorite(id, true);
+ }
+ }
+ else if ("remove_from_favorites" == action)
+ {
+ for (const LLUUID& id : mUUIDs)
+ {
+ set_favorite(id, false);
+ }
+ }
else if ("replaceoutfit" == action)
{
modify_outfit(false, mUUIDs.front(), &gInventory);
@@ -474,22 +489,13 @@ void LLInventoryGalleryContextMenu::onRename(const LLSD& notification, const LLS
void LLInventoryGalleryContextMenu::fileUploadLocation(const LLSD& userdata)
{
const std::string param = userdata.asString();
- if (param == "model")
- {
- gSavedPerAccountSettings.setString("ModelUploadFolder", mUUIDs.front().asString());
- }
- else if (param == "texture")
- {
- gSavedPerAccountSettings.setString("TextureUploadFolder", mUUIDs.front().asString());
- }
- else if (param == "sound")
- {
- gSavedPerAccountSettings.setString("SoundUploadFolder", mUUIDs.front().asString());
- }
- else if (param == "animation")
- {
- gSavedPerAccountSettings.setString("AnimationUploadFolder", mUUIDs.front().asString());
- }
+ LLInventoryAction::fileUploadLocation(mUUIDs.front(), param);
+}
+
+bool LLInventoryGalleryContextMenu::isUploadLocationSelected(const LLSD& userdata)
+{
+ const std::string param = userdata.asString();
+ return LLInventoryAction::isFileUploadLocation(mUUIDs.front(), param);
}
bool LLInventoryGalleryContextMenu::canSetUploadLocation(const LLSD& userdata)
@@ -607,7 +613,9 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
bool is_trash = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH));
bool is_in_trash = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH));
bool is_lost_and_found = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
- bool is_outfits= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS));
+ const LLUUID my_outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ bool is_outfits= (selected_id == my_outfits);
+ bool is_in_outfits = is_outfits || gInventory.isObjectDescendentOf(selected_id, my_outfits);
bool is_in_favorites = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE));
//bool is_favorites= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE));
@@ -616,20 +624,23 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
bool has_children = false;
bool is_full_perm_item = false;
bool is_copyable = false;
- LLViewerInventoryItem* selected_item = gInventory.getItem(selected_id);
+
+ LLViewerInventoryCategory* selected_category = nullptr;
+ LLViewerInventoryItem* selected_item = nullptr;
if(is_folder)
{
- LLInventoryCategory* category = gInventory.getCategory(selected_id);
- if (category)
+ selected_category = dynamic_cast<LLViewerInventoryCategory*>(obj);
+ if (selected_category)
{
- folder_type = category->getPreferredType();
+ folder_type = selected_category->getPreferredType();
is_system_folder = LLFolderType::lookupIsProtectedType(folder_type);
has_children = (gInventory.categoryHasChildren(selected_id) != LLInventoryModel::CHILDREN_NO);
}
}
else
{
+ selected_item = dynamic_cast<LLViewerInventoryItem*>(obj);
if (selected_item)
{
is_full_perm_item = selected_item->getIsFullPerm();
@@ -746,10 +757,9 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
}
else
{
- if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits)
+ if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits && !is_in_outfits)
{
- LLViewerInventoryCategory* category = gInventory.getCategory(selected_id);
- if (!category || !LLFriendCardsManager::instance().isCategoryInFriendFolder(category))
+ if (!selected_category || !LLFriendCardsManager::instance().isCategoryInFriendFolder(selected_category))
{
items.push_back(std::string("New Folder"));
}
@@ -777,6 +787,22 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
if (inventory_linking)
{
items.push_back(std::string("Paste As Link"));
+
+ if (selected_item)
+ {
+ if (!LLAssetType::lookupCanLink(selected_item->getActualType()))
+ {
+ disabled_items.push_back(std::string("Paste As Link"));
+ }
+ else if (gInventory.isObjectDescendentOf(selected_item->getUUID(), gInventory.getLibraryRootFolderID()))
+ {
+ disabled_items.push_back(std::string("Paste As Link"));
+ }
+ }
+ else if (selected_category && LLFolderType::lookupIsProtectedType(selected_category->getPreferredType()))
+ {
+ disabled_items.push_back(std::string("Paste As Link"));
+ }
}
}
if (is_folder && is_agent_inventory)
@@ -787,20 +813,44 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
{
items.push_back(std::string("New Folder"));
}
+ items.push_back(std::string("upload_options"));
items.push_back(std::string("upload_def"));
}
items.push_back(std::string("Set favorite folder"));
- if(is_outfits && !isRootFolder())
+ if(is_outfits)
+ {
+ EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(&gInventory, selected_id, my_outfits);
+ if (res != MY_OUTFITS_OUTFIT && res != MY_OUTFITS_SUBOUTFIT)
+ {
+ items.push_back(std::string("New Outfit"));
+ items.push_back(std::string("New Outfit Folder"));
+ }
+ items.push_back(std::string("Delete"));
+ items.push_back(std::string("Rename"));
+ if (!get_is_category_and_children_removable(&gInventory, selected_id, false))
+ {
+ disabled_items.push_back(std::string("Delete"));
+ }
+ }
+
+ if (!is_trash && !is_in_trash && gInventory.getRootFolderID() != selected_id)
{
- items.push_back(std::string("New Outfit"));
+ if (get_is_favorite(obj))
+ {
+ items.push_back(std::string("Remove from Favorites"));
+ }
+ else
+ {
+ items.push_back(std::string("Add to Favorites"));
+ }
}
items.push_back(std::string("Subfolder Separator"));
- if (!is_system_folder && !isRootFolder())
+ if (!is_system_folder && !isRootFolder() && !is_outfits)
{
- if(has_children && (folder_type != LLFolderType::FT_OUTFIT))
+ if(has_children && (folder_type != LLFolderType::FT_OUTFIT) && !is_in_outfits)
{
items.push_back(std::string("Ungroup folder items"));
}
@@ -842,6 +892,17 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
if(is_agent_inventory)
{
items.push_back(std::string("Cut"));
+ if (!is_in_trash)
+ {
+ if (get_is_favorite(obj))
+ {
+ items.push_back(std::string("Remove from Favorites"));
+ }
+ else
+ {
+ items.push_back(std::string("Add to Favorites"));
+ }
+ }
if (!is_link || !is_cof || !get_is_item_worn(selected_id))
{
items.push_back(std::string("Delete"));
@@ -980,6 +1041,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
}
disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("upload_options"));
disabled_items.push_back(std::string("upload_def"));
disabled_items.push_back(std::string("create_new"));
}
@@ -1001,9 +1063,8 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
{
if (is_folder)
{
- LLViewerInventoryCategory* cat = gInventory.getCategory(selected_id);
- if (cat
- && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())
+ if (selected_category
+ && !LLFolderType::lookupIsProtectedType(selected_category->getPreferredType())
&& gInventory.isObjectDescendentOf(selected_id, gInventory.getRootFolderID()))
{
can_list = true;
@@ -1030,6 +1091,15 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
disabled_items.push_back(std::string("Marketplace Move"));
}
}
+
+ if (get_is_favorite(obj))
+ {
+ items.push_back(std::string("Remove from Favorites"));
+ }
+ else if (is_agent_inventory)
+ {
+ items.push_back(std::string("Add to Favorites"));
+ }
}
hide_context_entries(*menu, items, disabled_items);
diff --git a/indra/newview/llinventorygallerymenu.h b/indra/newview/llinventorygallerymenu.h
index 7f6598e171..d91c752544 100644
--- a/indra/newview/llinventorygallerymenu.h
+++ b/indra/newview/llinventorygallerymenu.h
@@ -47,6 +47,7 @@ protected:
void updateMenuItemsVisibility(LLContextMenu* menu);
void fileUploadLocation(const LLSD& userdata);
+ bool isUploadLocationSelected(const LLSD& userdata);
bool canSetUploadLocation(const LLSD& userdata);
void setFavoriteFolder();
diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index 2e0669fc38..73cc953692 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -40,6 +40,10 @@
#include "llinventorymodel.h"
#include "llviewerinventory.h"
+bool LLInventoryItemsList::sListIdleRegistered = false;
+LLInventoryItemsList::all_list_t LLInventoryItemsList::sAllLists;
+LLInventoryItemsList::all_list_t::iterator LLInventoryItemsList::sAllListIter;
+
LLInventoryItemsList::Params::Params()
{}
@@ -55,13 +59,39 @@ LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p
setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems"));
- gIdleCallbacks.addFunction(idle, this);
+ sAllLists.push_back(this);
+ sAllListIter = sAllLists.begin();
+
+ if (!sListIdleRegistered)
+ {
+ sAllListIter = sAllLists.begin();
+ gIdleCallbacks.addFunction(idle, nullptr);
+
+ LLEventPumps::instance().obtain("LLApp").listen(
+ "LLInventoryItemsList",
+ [](const LLSD& stat)
+ {
+ std::string status(stat["status"]);
+ if (status != "running")
+ {
+ // viewer is starting shutdown
+ gIdleCallbacks.deleteFunction(idle, nullptr);
+ }
+ return false;
+ });
+ sListIdleRegistered = true;
+ }
}
// virtual
LLInventoryItemsList::~LLInventoryItemsList()
{
- gIdleCallbacks.deleteFunction(idle, this);
+ auto it = std::find(sAllLists.begin(), sAllLists.end(), this);
+ if (it != sAllLists.end())
+ {
+ sAllLists.erase(it);
+ sAllListIter = sAllLists.begin();
+ }
}
void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array)
@@ -111,25 +141,55 @@ void LLInventoryItemsList::updateSelection()
mSelectTheseIDs.clear();
}
-void LLInventoryItemsList::doIdle()
+bool LLInventoryItemsList::doIdle()
{
- if (mRefreshState == REFRESH_COMPLETE) return;
+ if (mRefreshState == REFRESH_COMPLETE) return true; // done
- if (isInVisibleChain() || mForceRefresh )
+ if (isInVisibleChain() || mForceRefresh || !getFilterSubString().empty())
{
refresh();
mRefreshCompleteSignal(this, LLSD());
+ return false; // keep going
}
+ return true; // done
}
//static
void LLInventoryItemsList::idle(void* user_data)
{
- LLInventoryItemsList* self = static_cast<LLInventoryItemsList*>(user_data);
- if ( self )
- { // Do the real idle
- self->doIdle();
+ if (sAllLists.empty())
+ return;
+
+ LL_PROFILE_ZONE_SCOPED;
+
+ using namespace std::chrono;
+ auto start = steady_clock::now();
+ const milliseconds time_limit = milliseconds(3);
+ const auto end_time = start + time_limit;
+ S32 max_update_count = 50;
+
+ if (sAllListIter == sAllLists.end())
+ {
+ sAllListIter = sAllLists.begin();
+ }
+
+ S32 updated = 0;
+ while (steady_clock::now() < end_time
+ && updated < max_update_count
+ && sAllListIter != sAllLists.end())
+ {
+ LLInventoryItemsList* list = *sAllListIter;
+ // Refresh is split into multiple separate parts,
+ // so keep repeating it while there is time, until done.
+ // Todo: refresh() split is pointless now?
+ // Or still useful for large folders?
+ if (list->doIdle())
+ {
+ // Item is done
+ ++sAllListIter;
+ updated++;
+ }
}
}
@@ -141,6 +201,7 @@ void LLInventoryItemsList::refresh()
{
case REFRESH_ALL:
{
+ LL_PROFILE_ZONE_NAMED("items_refresh_all");
mAddedItems.clear();
mRemovedItems.clear();
computeDifference(getIDs(), mAddedItems, mRemovedItems);
@@ -163,6 +224,7 @@ void LLInventoryItemsList::refresh()
}
case REFRESH_LIST_ERASE:
{
+ LL_PROFILE_ZONE_NAMED("items_refresh_erase");
uuid_vec_t::const_iterator it = mRemovedItems.begin();
for (; mRemovedItems.end() != it; ++it)
{
@@ -175,6 +237,7 @@ void LLInventoryItemsList::refresh()
}
case REFRESH_LIST_APPEND:
{
+ LL_PROFILE_ZONE_NAMED("items_refresh_append");
static const unsigned ADD_LIMIT = 25; // Note: affects perfomance
unsigned int nadded = 0;
@@ -239,6 +302,7 @@ void LLInventoryItemsList::refresh()
}
case REFRESH_LIST_SORT:
{
+ LL_PROFILE_ZONE_NAMED("items_refresh_sort");
// Filter, sort, rearrange and notify parent about shape changes
filterItems(true, true);
@@ -255,7 +319,10 @@ void LLInventoryItemsList::refresh()
break;
}
default:
- break;
+ {
+ mRefreshState = REFRESH_COMPLETE;
+ break;
+ }
}
setForceRefresh(mRefreshState != REFRESH_COMPLETE);
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index 9ebeb5e52b..b20c27eec8 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -59,7 +59,10 @@ public:
* Sets the flag indicating that the list needs to be refreshed even if it is
* not currently visible.
*/
- void setForceRefresh(bool force_refresh) { mForceRefresh = force_refresh; }
+ void setForceRefresh(bool force_refresh)
+ {
+ mForceRefresh = force_refresh;
+ }
/**
* If refreshes when invisible.
@@ -76,7 +79,7 @@ public:
* This is needed for example to filter items of the list hidden by closed
* accordion tab.
*/
- virtual void doIdle(); // Real idle routine
+ bool doIdle(); // Real idle routine
static void idle(void* user_data); // static glue to doIdle()
protected:
@@ -126,6 +129,12 @@ private:
bool mForceRefresh;
commit_signal_t mRefreshCompleteSignal;
+
+ // Update synchronization
+ typedef std::vector<LLInventoryItemsList*> all_list_t;
+ static all_list_t sAllLists;
+ static all_list_t::iterator sAllListIter;
+ static bool sListIdleRegistered;
};
#endif //LL_LLINVENTORYITEMSLIST_H
diff --git a/indra/newview/llinventorylistener.cpp b/indra/newview/llinventorylistener.cpp
new file mode 100644
index 0000000000..028483e134
--- /dev/null
+++ b/indra/newview/llinventorylistener.cpp
@@ -0,0 +1,309 @@
+/**
+ * @file llinventorylistener.cpp
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llinventorylistener.h"
+
+#include "llappearancemgr.h"
+#include "llinventoryfunctions.h"
+#include "lltransutil.h"
+#include "llwearableitemslist.h"
+#include "stringize.h"
+
+LLInventoryListener::LLInventoryListener()
+ : LLEventAPI("LLInventory",
+ "API for interactions with viewer Inventory items")
+{
+ add("getItemsInfo",
+ "Return information about items or folders defined in [\"item_ids\"]:\n"
+ "reply will contain [\"items\"] and [\"categories\"] result set keys",
+ &LLInventoryListener::getItemsInfo,
+ llsd::map("item_ids", LLSD(), "reply", LLSD()));
+
+ add("getFolderTypeNames",
+ "Return the table of folder type names, contained in [\"names\"]\n",
+ &LLInventoryListener::getFolderTypeNames,
+ llsd::map("reply", LLSD()));
+
+ add("getAssetTypeNames",
+ "Return the table of asset type names, contained in [\"names\"]\n",
+ &LLInventoryListener::getAssetTypeNames,
+ llsd::map("reply", LLSD()));
+
+ add("getBasicFolderID",
+ "Return the UUID of the folder by specified folder type name, for example:\n"
+ "\"Textures\", \"My outfits\", \"Sounds\" and other basic folders which have associated type",
+ &LLInventoryListener::getBasicFolderID,
+ llsd::map("ft_name", LLSD(), "reply", LLSD()));
+
+ add("getDirectDescendants",
+ "Return result set keys [\"categories\"] and [\"items\"] for the direct\n"
+ "descendants of the [\"folder_id\"]",
+ &LLInventoryListener::getDirectDescendants,
+ llsd::map("folder_id", LLSD(), "reply", LLSD()));
+
+ add("collectDescendantsIf",
+ "Return result set keys [\"categories\"] and [\"items\"] for the descendants\n"
+ "of the [\"folder_id\"], if it passes specified filters:\n"
+ "[\"name\"] is a substring of object's name,\n"
+ "[\"desc\"] is a substring of object's description,\n"
+ "asset [\"type\"] corresponds to the string name of the object's asset type\n"
+ "[\"limit\"] sets item count limit in result set (default unlimited)\n"
+ "[\"filter_links\"]: EXCLUDE_LINKS - don't show links, ONLY_LINKS - only show links, INCLUDE_LINKS - show links too (default)",
+ &LLInventoryListener::collectDescendantsIf,
+ llsd::map("folder_id", LLSD(), "reply", LLSD()));
+}
+
+void add_cat_info(LLEventAPI::Response& response, LLViewerInventoryCategory* cat)
+{
+ response["categories"].insert(cat->getUUID().asString(),
+ llsd::map("id", cat->getUUID(),
+ "name", cat->getName(),
+ "parent_id", cat->getParentUUID(),
+ "type", LLFolderType::lookup(cat->getPreferredType())));
+
+};
+
+void add_item_info(LLEventAPI::Response& response, LLViewerInventoryItem* item)
+{
+ response["items"].insert(item->getUUID().asString(),
+ llsd::map("id", item->getUUID(),
+ "name", item->getName(),
+ "parent_id", item->getParentUUID(),
+ "desc", item->getDescription(),
+ "inv_type", LLInventoryType::lookup(item->getInventoryType()),
+ "asset_type", LLAssetType::lookup(item->getType()),
+ "creation_date", LLSD::Integer(item->getCreationDate()),
+ "asset_id", item->getAssetUUID(),
+ "is_link", item->getIsLinkType(),
+ "linked_id", item->getLinkedUUID()));
+}
+
+void add_objects_info(LLEventAPI::Response& response, LLInventoryModel::cat_array_t cat_array, LLInventoryModel::item_array_t item_array)
+{
+ for (auto& p : item_array)
+ {
+ add_item_info(response, p);
+ }
+ for (auto& p : cat_array)
+ {
+ add_cat_info(response, p);
+ }
+}
+
+void LLInventoryListener::getItemsInfo(LLSD const &data)
+{
+ Response response(LLSD(), data);
+ uuid_vec_t ids = LLSDParam<uuid_vec_t>(data["item_ids"]);
+ for (auto &it : ids)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(it);
+ if (item)
+ {
+ add_item_info(response, item);
+ }
+ else
+ {
+ LLViewerInventoryCategory *cat = gInventory.getCategory(it);
+ if (cat)
+ {
+ add_cat_info(response, cat);
+ }
+ }
+ }
+}
+
+void LLInventoryListener::getFolderTypeNames(LLSD const &data)
+{
+ Response response(llsd::map("names", LLFolderType::getTypeNames()), data);
+}
+
+void LLInventoryListener::getAssetTypeNames(LLSD const &data)
+{
+ Response response(llsd::map("names", LLAssetType::getTypeNames()), data);
+}
+
+void LLInventoryListener::getBasicFolderID(LLSD const &data)
+{
+ Response response(llsd::map("id", gInventory.findCategoryUUIDForType(LLFolderType::lookup(data["ft_name"].asString()))), data);
+}
+
+
+void LLInventoryListener::getDirectDescendants(LLSD const &data)
+{
+ Response response(LLSD(), data);
+ LLUUID folder_id(data["folder_id"].asUUID());
+ LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
+ if (!cat)
+ {
+ return response.error(stringize("Folder ", std::quoted(data["folder_id"].asString()), " was not found"));
+ }
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(folder_id, cats, items);
+
+ add_objects_info(response, *cats, *items);
+}
+
+struct LLFilteredCollector : public LLInventoryCollectFunctor
+{
+ enum EFilterLink
+ {
+ INCLUDE_LINKS, // show links too
+ EXCLUDE_LINKS, // don't show links
+ ONLY_LINKS // only show links
+ };
+
+ LLFilteredCollector(LLSD const &data);
+ virtual ~LLFilteredCollector() {}
+ virtual bool operator()(LLInventoryCategory *cat, LLInventoryItem *item) override;
+ virtual bool exceedsLimit() override
+ {
+ // mItemLimit == 0 means unlimited
+ return (mItemLimit && mItemLimit <= mItemCount);
+ }
+
+ protected:
+ bool checkagainstType(LLInventoryCategory *cat, LLInventoryItem *item);
+ bool checkagainstNameDesc(LLInventoryCategory *cat, LLInventoryItem *item);
+ bool checkagainstLinks(LLInventoryCategory *cat, LLInventoryItem *item);
+
+ LLAssetType::EType mType;
+ std::string mName;
+ std::string mDesc;
+ EFilterLink mLinkFilter;
+
+ S32 mItemLimit;
+ S32 mItemCount;
+};
+
+void LLInventoryListener::collectDescendantsIf(LLSD const &data)
+{
+ Response response(LLSD(), data);
+ LLUUID folder_id(data["folder_id"].asUUID());
+ LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id);
+ if (!cat)
+ {
+ return response.error(stringize("Folder ", std::quoted(data["folder_id"].asString()), " was not found"));
+ }
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+
+ LLFilteredCollector collector = LLFilteredCollector(data);
+
+ gInventory.collectDescendentsIf(folder_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, collector);
+
+ add_objects_info(response, cat_array, item_array);
+}
+
+LLFilteredCollector::LLFilteredCollector(LLSD const &data) :
+ mType(LLAssetType::EType::AT_UNKNOWN),
+ mLinkFilter(INCLUDE_LINKS),
+ mItemLimit(0),
+ mItemCount(0)
+{
+
+ mName = data["name"].asString();
+ mDesc = data["desc"].asString();
+
+ if (data.has("type"))
+ {
+ mType = LLAssetType::lookup(data["type"]);
+ }
+ if (data.has("filter_links"))
+ {
+ if (data["filter_links"] == "EXCLUDE_LINKS")
+ {
+ mLinkFilter = EXCLUDE_LINKS;
+ }
+ else if (data["filter_links"] == "ONLY_LINKS")
+ {
+ mLinkFilter = ONLY_LINKS;
+ }
+ }
+ if (data["limit"].isInteger())
+ {
+ mItemLimit = std::max(data["limit"].asInteger(), 1);
+ }
+}
+
+bool LLFilteredCollector::operator()(LLInventoryCategory *cat, LLInventoryItem *item)
+{
+ bool passed = checkagainstType(cat, item);
+ passed = passed && checkagainstNameDesc(cat, item);
+ passed = passed && checkagainstLinks(cat, item);
+
+ if (passed)
+ {
+ ++mItemCount;
+ }
+ return passed;
+}
+
+bool LLFilteredCollector::checkagainstNameDesc(LLInventoryCategory *cat, LLInventoryItem *item)
+{
+ std::string name, desc;
+ bool passed(true);
+ if (cat)
+ {
+ if (!mDesc.empty()) return false;
+ name = cat->getName();
+ }
+ if (item)
+ {
+ name = item->getName();
+ passed = (mDesc.empty() || (item->getDescription().find(mDesc) != std::string::npos));
+ }
+
+ return passed && (mName.empty() || name.find(mName) != std::string::npos);
+}
+
+bool LLFilteredCollector::checkagainstType(LLInventoryCategory *cat, LLInventoryItem *item)
+{
+ if (mType == LLAssetType::AT_UNKNOWN)
+ {
+ return true;
+ }
+ if (cat && (mType == LLAssetType::AT_CATEGORY))
+ {
+ return true;
+ }
+ if (item && item->getType() == mType)
+ {
+ return true;
+ }
+ return false;
+}
+
+bool LLFilteredCollector::checkagainstLinks(LLInventoryCategory *cat, LLInventoryItem *item)
+{
+ bool is_link = cat ? cat->getIsLinkType() : item->getIsLinkType();
+ if (is_link && (mLinkFilter == EXCLUDE_LINKS))
+ return false;
+ if (!is_link && (mLinkFilter == ONLY_LINKS))
+ return false;
+ return true;
+}
diff --git a/indra/newview/llinventorylistener.h b/indra/newview/llinventorylistener.h
new file mode 100644
index 0000000000..d50397730c
--- /dev/null
+++ b/indra/newview/llinventorylistener.h
@@ -0,0 +1,48 @@
+/**
+ * @file llinventorylistener.h
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLINVENTORYLISTENER_H
+#define LL_LLINVENTORYLISTENER_H
+
+#include "lleventapi.h"
+#include "llinventoryfunctions.h"
+
+class LLInventoryListener : public LLEventAPI
+{
+public:
+ LLInventoryListener();
+
+private:
+ void getItemsInfo(LLSD const &data);
+ void getFolderTypeNames(LLSD const &data);
+ void getAssetTypeNames(LLSD const &data);
+ void getBasicFolderID(LLSD const &data);
+ void getDirectDescendants(LLSD const &data);
+ void collectDescendantsIf(LLSD const &data);
+};
+
+#endif // LL_LLINVENTORYLISTENER_H
+
diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp
index e210975a5a..5fb5b0f23f 100644
--- a/indra/newview/llinventorylistitem.cpp
+++ b/indra/newview/llinventorylistitem.cpp
@@ -43,7 +43,19 @@
static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(&typeid(LLPanelInventoryListItemBase::Params), "inventory_list_item");
-static const S32 WIDGET_SPACING = 3;
+constexpr S32 WIDGET_SPACING = 3;
+constexpr S32 FAVORITE_IMAGE_SIZE = 14;
+constexpr S32 FAVORITE_IMAGE_PAD = 3;
+
+bool get_is_item_favorite(const LLViewerInventoryItem* inv)
+{
+ if (inv->getIsLinkType())
+ {
+ LLInventoryObject* obj = gInventory.getObject(inv->getLinkedUUID());
+ return obj && obj->getIsFavorite();
+ }
+ return inv->getIsFavorite();
+}
LLPanelInventoryListItemBase::Params::Params()
: default_style("default_style"),
@@ -75,19 +87,30 @@ void LLPanelInventoryListItemBase::draw()
LLViewerInventoryItem* inv_item = getItem();
if (inv_item)
{
- updateItem(inv_item->getName());
+ updateItem(inv_item->getName(), get_is_item_favorite(inv_item));
}
setNeedsRefresh(false);
}
+ static LLUICachedControl<bool> draw_star("InventoryFavoritesUseStar", true);
+
+ LLRect local_rect = getLocalRect();
if (mHovered && mHoverImage)
{
- mHoverImage->draw(getLocalRect());
+ mHoverImage->draw(local_rect);
+ }
+ else if (mIsFavorite && draw_star())
+ {
+
+ static LLPointer<LLUIImage> fav_img = LLRender2D::getInstance()->getUIImage("Inv_Favorite_Star_Full");
+ gl_draw_scaled_image(
+ local_rect.getWidth() - FAVORITE_IMAGE_SIZE - FAVORITE_IMAGE_PAD, FAVORITE_IMAGE_PAD,
+ FAVORITE_IMAGE_SIZE, FAVORITE_IMAGE_SIZE, fav_img->getImage());
}
if (mSelected && mSelectedImage)
{
- mSelectedImage->draw(getLocalRect());
+ mSelectedImage->draw(local_rect);
}
if (mSeparatorVisible && mSeparatorImage)
@@ -95,7 +118,7 @@ void LLPanelInventoryListItemBase::draw()
// place under bottom of listitem, using image height
// item_pad in list using the item should be >= image height
// to avoid cropping of top of the next item.
- LLRect separator_rect = getLocalRect();
+ LLRect separator_rect = local_rect;
separator_rect.mTop = separator_rect.mBottom;
separator_rect.mBottom -= mSeparatorImage->getHeight();
F32 alpha = getCurrentTransparency();
@@ -107,9 +130,15 @@ void LLPanelInventoryListItemBase::draw()
// virtual
void LLPanelInventoryListItemBase::updateItem(const std::string& name,
+ bool favorite,
EItemState item_state)
{
setIconImage(mIconImage);
+ if (mIsFavorite != favorite)
+ {
+ mIsFavorite = favorite;
+ reshapeMiddleWidgets();
+ }
setTitle(name, mHighlightedText, item_state);
}
@@ -164,7 +193,7 @@ bool LLPanelInventoryListItemBase::postBuild()
if (inv_item)
{
mIconImage = LLInventoryIcon::getIcon(inv_item->getType(), inv_item->getInventoryType(), inv_item->getFlags(), false);
- updateItem(inv_item->getName());
+ updateItem(inv_item->getName(), get_is_item_favorite(inv_item));
}
setNeedsRefresh(true);
@@ -290,6 +319,7 @@ LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem
mHovered(false),
mSelected(false),
mSeparatorVisible(false),
+ mIsFavorite(false),
mHoverImage(params.hover_image),
mSelectedImage(params.selected_image),
mSeparatorImage(params.separator_image)
@@ -392,6 +422,16 @@ void LLPanelInventoryListItemBase::setTitle(const std::string& title,
default:;
}
+ if (mIsFavorite)
+ {
+ static LLUICachedControl<bool> use_color("InventoryFavoritesColorText", true);
+ if (use_color)
+ {
+ static const LLUIColor favorite_color = LLUIColorTable::instance().getColor("InventoryFavoriteColor", LLColor4::white);
+ style_params.color = favorite_color;
+ }
+ }
+
LLTextUtil::textboxSetHighlightedVal(
mTitleCtrl,
style_params,
@@ -466,6 +506,10 @@ void LLPanelInventoryListItemBase::reshapeMiddleWidgets()
S32 name_left = icon_rect.mRight + getWidgetSpacing();
S32 name_right = getLocalRect().getWidth() - mRightWidgetsWidth - getWidgetSpacing();
+ if (mIsFavorite)
+ {
+ name_right -= FAVORITE_IMAGE_SIZE + FAVORITE_IMAGE_PAD;
+ }
LLRect name_rect(mTitleCtrl->getRect());
name_rect.set(name_left, name_rect.mTop, name_right, name_rect.mBottom);
mTitleCtrl->setShape(name_rect);
diff --git a/indra/newview/llinventorylistitem.h b/indra/newview/llinventorylistitem.h
index 21540a380b..40a86001a4 100644
--- a/indra/newview/llinventorylistitem.h
+++ b/indra/newview/llinventorylistitem.h
@@ -167,6 +167,7 @@ protected:
* Called after inventory item was updated, update panel widgets to reflect inventory changes.
*/
virtual void updateItem(const std::string& name,
+ bool favorite,
EItemState item_state = IS_DEFAULT);
void setLeftWidgetsWidth(S32 width) { mLeftWidgetsWidth = width; }
@@ -222,8 +223,9 @@ private:
LLUIImagePtr mSelectedImage;
LLUIImagePtr mSeparatorImage;
- bool mSelected;
- bool mSeparatorVisible;
+ bool mSelected = false;
+ bool mSeparatorVisible = false;
+ bool mIsFavorite = false; // note that any setter needs to update tittle
std::string mHighlightedText;
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index b6ff31a7ed..943f41b6a7 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -78,7 +78,7 @@
// Increment this if the inventory contents change in a non-backwards-compatible way.
// For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect.
-const S32 LLInventoryModel::sCurrentInvCacheVersion = 3;
+const S32 LLInventoryModel::sCurrentInvCacheVersion = 5;
bool LLInventoryModel::sFirstTimeInViewer2 = true;
S32 LLInventoryModel::sPendingSystemFolders = 0;
@@ -1007,7 +1007,8 @@ void LLInventoryModel::createNewCategory(const LLUUID& parent_id,
return;
}
- if (preferred_type != LLFolderType::FT_NONE)
+ if (preferred_type != LLFolderType::FT_NONE
+ && preferred_type != LLFolderType::FT_OUTFIT)
{
// Ultimately this should only be done for non-singleton
// types. Requires back-end changes to guarantee that others
@@ -1282,6 +1283,10 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
{
for (auto& cat : *cat_array)
{
+ if (add.exceedsLimit())
+ {
+ break;
+ }
if(add(cat,NULL))
{
cats.push_back(cat);
@@ -1297,6 +1302,10 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
{
for (auto& item : *item_array)
{
+ if (add.exceedsLimit())
+ {
+ break;
+ }
if(add(NULL, item))
{
items.push_back(item);
@@ -2681,6 +2690,7 @@ bool LLInventoryModel::loadSkeleton(
LL_PROFILE_ZONE_SCOPED;
LL_DEBUGS(LOG_INV) << "importing inventory skeleton for " << owner_id << LL_ENDL;
+ LLTimer timer;
typedef std::set<LLPointer<LLViewerInventoryCategory>, InventoryIDPtrLess> cat_set_t;
cat_set_t temp_cats;
bool rv = true;
@@ -2767,6 +2777,7 @@ bool LLInventoryModel::loadSkeleton(
bool is_cache_obsolete = false;
if (loadFromFile(inventory_filename, categories, items, categories_to_update, is_cache_obsolete))
{
+ LL_PROFILE_ZONE_NAMED("loadFromFile");
// We were able to find a cache of files. So, use what we
// found to generate a set of categories we should add. We
// will go through each category loaded and if the version
@@ -2806,8 +2817,9 @@ bool LLInventoryModel::loadSkeleton(
cached_ids.insert(tcat->getUUID());
// At the moment download does not provide a thumbnail
- // uuid, use the one from cache
+ // uuid or favorite, use values from cache
tcat->setThumbnailUUID(cat->getThumbnailUUID());
+ tcat->setFavorite(cat->getIsFavorite());
}
}
@@ -2964,7 +2976,8 @@ bool LLInventoryModel::loadSkeleton(
}
LL_INFOS(LOG_INV) << "Successfully loaded " << cached_category_count
- << " categories and " << cached_item_count << " items from cache."
+ << " categories and " << cached_item_count << " items from cache"
+ << " after " << timer.getElapsedTimeF32() << " seconds."
<< LL_ENDL;
return rv;
@@ -3371,7 +3384,7 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,
}
LL_INFOS(LOG_INV) << "loading inventory from: (" << filename << ")" << LL_ENDL;
- llifstream file(filename.c_str());
+ llifstream file(filename.c_str(), std::ifstream::in | std::ifstream::binary);
if (!file.is_open())
{
@@ -3380,80 +3393,92 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,
}
is_cache_obsolete = true; // Obsolete until proven current
-
- //U64 lines_count = 0U;
- std::string line;
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
- while (std::getline(file, line))
+ U32 value_nbo = 0;
+ file.read((char*)&value_nbo, sizeof(U32));
+ if (file.fail())
{
- LLSD s_item;
- std::istringstream iss(line);
- if (parser->parse(iss, s_item, line.length()) == LLSDParser::PARSE_FAILURE)
+ LL_WARNS(LOG_INV) << "Failed to read cache version. Unable to load inventory from: " << filename << LL_ENDL;
+ }
+ else
+ {
+ S32 version = (S32)ntohl(value_nbo);
+ if (version == sCurrentInvCacheVersion)
{
- LL_WARNS(LOG_INV)<< "Parsing inventory cache failed" << LL_ENDL;
- break;
+ // Cache is up to date
+ is_cache_obsolete = false;
}
-
- if (s_item.has("inv_cache_version"))
+ else
{
- S32 version = s_item["inv_cache_version"].asInteger();
- if (version == sCurrentInvCacheVersion)
- {
- // Cache is up to date
- is_cache_obsolete = false;
- continue;
- }
- else
- {
- LL_WARNS(LOG_INV)<< "Inventory cache is out of date" << LL_ENDL;
- break;
- }
+ LL_WARNS(LOG_INV) << "Inventory cache is out of date" << LL_ENDL;
}
- else if (s_item.has("cat_id"))
+ }
+
+ LLSD inventory;
+ if (!is_cache_obsolete)
+ {
+ LLPointer<LLSDParser> parser = new LLSDBinaryParser();
+
+ if (parser->parse(file, inventory, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
{
- if (is_cache_obsolete)
- break;
+ is_cache_obsolete = true;
+ LL_WARNS(LOG_INV) << "Parsing inventory cache failed" << LL_ENDL;
+ }
+ }
- LLPointer<LLViewerInventoryCategory> inv_cat = new LLViewerInventoryCategory(LLUUID::null);
- if(inv_cat->importLLSD(s_item))
+ if (!is_cache_obsolete)
+ {
+ const LLSD& llsd_cats = inventory["categories"];
+ if (llsd_cats.isArray())
+ {
+ LLSD::array_const_iterator iter = llsd_cats.beginArray();
+ LLSD::array_const_iterator end = llsd_cats.endArray();
+ for (; iter != end; ++iter)
{
- categories.push_back(inv_cat);
+ LLPointer<LLViewerInventoryCategory> inv_cat = new LLViewerInventoryCategory(LLUUID::null);
+ if (inv_cat->importLLSDMap(*iter))
+ {
+ categories.push_back(inv_cat);
+ }
}
}
- else if (s_item.has("item_id"))
- {
- if (is_cache_obsolete)
- break;
- LLPointer<LLViewerInventoryItem> inv_item = new LLViewerInventoryItem;
- if( inv_item->fromLLSD(s_item) )
+ const LLSD& llsd_items = inventory["items"];
+ if (llsd_items.isArray())
+ {
+ LLSD::array_const_iterator iter = llsd_items.beginArray();
+ LLSD::array_const_iterator end = llsd_items.endArray();
+ for (; iter != end; ++iter)
{
- if(inv_item->getUUID().isNull())
- {
- LL_DEBUGS(LOG_INV) << "Ignoring inventory with null item id: "
- << inv_item->getName() << LL_ENDL;
- }
- else
+ LLPointer<LLViewerInventoryItem> inv_item = new LLViewerInventoryItem;
+ if (inv_item->fromLLSD(*iter))
{
- if (inv_item->getType() == LLAssetType::AT_UNKNOWN)
+ if (inv_item->getUUID().isNull())
{
- cats_to_update.insert(inv_item->getParentUUID());
+ LL_DEBUGS(LOG_INV) << "Ignoring inventory with null item id: "
+ << inv_item->getName() << LL_ENDL;
}
else
{
- items.push_back(inv_item);
+ if (inv_item->getType() == LLAssetType::AT_UNKNOWN)
+ {
+ cats_to_update.insert(inv_item->getParentUUID());
+ }
+ else
+ {
+ items.push_back(inv_item);
+ }
}
}
+
+ // TODO(brad) - figure out how to reenable this without breaking everything else
+ // static constexpr U64 BATCH_SIZE = 512U;
+ // if ((++lines_count % BATCH_SIZE) == 0)
+ // {
+ // // SL-19968 - make sure message system code gets a chance to run every so often
+ // pump_idle_startup_network();
+ // }
}
}
-
-// TODO(brad) - figure out how to reenable this without breaking everything else
-// static constexpr U64 BATCH_SIZE = 512U;
-// if ((++lines_count % BATCH_SIZE) == 0)
-// {
-// // SL-19968 - make sure message system code gets a chance to run every so often
-// pump_idle_startup_network();
-// }
}
file.close();
@@ -3476,56 +3501,56 @@ bool LLInventoryModel::saveToFile(const std::string& filename,
try
{
- llofstream fileXML(filename.c_str());
- if (!fileXML.is_open())
+ llofstream fileSD(filename.c_str(), std::ios_base::out | std::ios_base::binary);
+ if (!fileSD.is_open())
{
LL_WARNS(LOG_INV) << "Failed to open file. Unable to save inventory to: " << filename << LL_ENDL;
return false;
}
-
- LLSD cache_ver;
- cache_ver["inv_cache_version"] = sCurrentInvCacheVersion;
-
- if (fileXML.fail())
+ U32 value_nbo = htonl(sCurrentInvCacheVersion);
+ fileSD.write((const char*)(&value_nbo), sizeof(U32));
+ if (fileSD.fail())
{
- LL_WARNS(LOG_INV) << "Failed to write cache version to file. Unable to save inventory to: " << filename << LL_ENDL;
+ LL_WARNS(LOG_INV) << "Failed to write cache. Unable to save inventory to: " << filename << LL_ENDL;
return false;
}
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(cache_ver) << std::endl;
+ LLSD inventory;
+ inventory["categories"] = LLSD::emptyArray();
+ LLSD& cat_array = inventory["categories"];
S32 cat_count = 0;
for (auto& cat : categories)
{
if (cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
{
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(cat->exportLLSD()) << std::endl;
+ LLSD sd;
+ cat->exportLLSD(sd);
+ cat_array.append(sd);
cat_count++;
}
-
- if (fileXML.fail())
- {
- LL_WARNS(LOG_INV) << "Failed to write a folder to file. Unable to save inventory to: " << filename << LL_ENDL;
- return false;
- }
}
+ inventory["items"] = LLSD::emptyArray();
+ LLSD& item_array = inventory["items"];
auto it_count = items.size();
for (auto& item : items)
{
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(item->asLLSD()) << std::endl;
-
- if (fileXML.fail())
- {
- LL_WARNS(LOG_INV) << "Failed to write an item to file. Unable to save inventory to: " << filename << LL_ENDL;
- return false;
- }
+ LLSD sd;
+ item->asLLSD(sd);
+ item_array.append(sd);
+ }
+ fileSD << LLSDOStreamer<LLSDBinaryFormatter>(inventory) << std::endl;
+ if (fileSD.fail())
+ {
+ LL_WARNS(LOG_INV) << "Failed to write cache. Unable to save inventory to: " << filename << LL_ENDL;
+ return false;
}
- fileXML.flush();
+ fileSD.flush();
- fileXML.close();
+ fileSD.close();
- LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL;
+ LL_INFOS(LOG_INV) << "Inventory saved: " << (S32)cat_count << " categories, " << (S32)it_count << " items." << LL_ENDL;
}
catch (...)
{
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index ac791e224e..ac22be9d5a 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -749,6 +749,13 @@ void LLInventoryCategoriesObserver::changed(U32 mask)
cat_changed = true;
}
+ bool is_favorite = category->getIsFavorite();
+ if (cat_data.mIsFavorite != is_favorite)
+ {
+ cat_data.mIsFavorite = is_favorite;
+ cat_changed = true;
+ }
+
// If anything has changed above, fire the callback.
if (cat_changed)
cat_data.mCallback();
@@ -766,6 +773,7 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t
S32 version = LLViewerInventoryCategory::VERSION_UNKNOWN;
S32 current_num_known_descendents = LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN;
bool can_be_added = true;
+ bool favorite = false;
LLUUID thumbnail_id;
LLViewerInventoryCategory* category = gInventory.getCategory(cat_id);
@@ -779,6 +787,7 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t
// to a category have been made.
version = category->getVersion();
thumbnail_id = category->getThumbnailUUID();
+ favorite = category->getIsFavorite();
LLInventoryModel::cat_array_t* cats;
LLInventoryModel::item_array_t* items;
@@ -804,11 +813,11 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t
if(init_name_hash)
{
digest_t item_name_hash = gInventory.hashDirectDescendentNames(cat_id);
- mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, cb, version, current_num_known_descendents,item_name_hash)));
+ mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, favorite, cb, version, current_num_known_descendents,item_name_hash)));
}
else
{
- mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, cb, version, current_num_known_descendents)));
+ mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, favorite, cb, version, current_num_known_descendents)));
}
}
@@ -821,25 +830,37 @@ void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id)
}
LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData(
- const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents)
+ const LLUUID& cat_id,
+ const LLUUID& thumbnail_id,
+ bool is_favorite,
+ callback_t cb,
+ S32 version,
+ S32 num_descendents)
: mCatID(cat_id)
, mCallback(cb)
, mVersion(version)
, mDescendentsCount(num_descendents)
, mThumbnailId(thumbnail_id)
+ , mIsFavorite(is_favorite)
, mIsNameHashInitialized(false)
{
}
LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData(
- const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents, const digest_t& name_hash)
+ const LLUUID& cat_id,
+ const LLUUID& thumbnail_id,
+ bool is_favorite,
+ callback_t cb, S32 version,
+ S32 num_descendents,
+ const digest_t& name_hash)
: mCatID(cat_id)
, mCallback(cb)
, mVersion(version)
, mDescendentsCount(num_descendents)
, mThumbnailId(thumbnail_id)
+ , mIsFavorite(is_favorite)
, mIsNameHashInitialized(true)
, mItemNameHash(name_hash)
{
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 950b02d3cf..12d6c44521 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -60,6 +60,7 @@ public:
CREATE = 512, // With ADD, item has just been created.
// unfortunately a particular message is still associated with some unique semantics.
UPDATE_CREATE = 1024, // With ADD, item added via UpdateCreateInventoryItem
+ UPDATE_FAVORITE = 2048, // With ADD, item added via UpdateCreateInventoryItem
ALL = 0xffffffff
};
LLInventoryObserver();
@@ -276,12 +277,26 @@ protected:
typedef LLUUID digest_t; // To clarify the actual usage of this "UUID"
struct LLCategoryData
{
- LLCategoryData(const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents);
- LLCategoryData(const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents, const digest_t& name_hash);
+ LLCategoryData(
+ const LLUUID& cat_id,
+ const LLUUID& thumbnail_id,
+ bool is_favorite,
+ callback_t cb,
+ S32 version,
+ S32 num_descendents);
+ LLCategoryData(
+ const LLUUID& cat_id,
+ const LLUUID& thumbnail_id,
+ bool is_favorite,
+ callback_t cb,
+ S32 version,
+ S32 num_descendents,
+ const digest_t& name_hash);
callback_t mCallback;
S32 mVersion;
S32 mDescendentsCount;
digest_t mItemNameHash;
+ bool mIsFavorite;
bool mIsNameHashInitialized;
LLUUID mCatID;
LLUUID mThumbnailId;
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 1795de727d..4b436e894a 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -55,11 +55,13 @@
#include "llviewerfoldertype.h"
#include "llvoavatarself.h"
+class LLInventoryFavoritesItemsPanel;
class LLInventoryRecentItemsPanel;
class LLAssetFilteredInventoryPanel;
static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel");
+static LLDefaultChildRegistry::Register<LLInventoryFavoritesItemsPanel> t_favorites_inventory_panel("favorites_inventory_panel");
static LLDefaultChildRegistry::Register<LLAssetFilteredInventoryPanel> t_asset_filtered_inv_panel("asset_filtered_inv_panel");
const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
@@ -186,6 +188,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2));
mCommitCallbackRegistrar.add("Inventory.SetFavoriteFolder", boost::bind(&LLInventoryPanel::setFavoriteFolder, this));
+ mEnableCallbackRegistrar.add("Inventory.FileUploadLocation.Check", boost::bind(&LLInventoryPanel::isUploadLocationSelected, this, _2));
mCommitCallbackRegistrar.add("Inventory.OpenNewFolderWindow", boost::bind(&LLInventoryPanel::openSingleViewInventory, this, LLUUID()));
}
@@ -365,9 +368,28 @@ void LLInventoryPanel::initializeViewBuilding()
if (mInventory->isInventoryUsable()
&& LLStartUp::getStartupState() <= STATE_WEARABLES_WAIT)
{
+ LLTimer timer;
// Usually this happens on login, so we have less time constraits, but too long and we can cause a disconnect
const F64 max_time = 20.f;
initializeViews(max_time);
+
+ if (mViewsInitialized == VIEWS_INITIALIZED)
+ {
+ LL_INFOS("Inventory")
+ << "Fully initialized inventory panel " << getName()
+ << " with " << (S32)mItemMap.size()
+ << " views in " << timer.getElapsedTimeF32() << " seconds."
+ << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("Inventory")
+ << "Partially initialized inventory panel " << getName()
+ << " with " << (S32)mItemMap.size()
+ << " views in " << timer.getElapsedTimeF32()
+ << " seconds. Pending known views: " << (S32)mBuildViewsQueue.size()
+ << LL_ENDL;
+ }
}
else
{
@@ -623,6 +645,19 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
}
}
+ if (mask & LLInventoryObserver::UPDATE_FAVORITE)
+ {
+ if (view_item)
+ {
+ view_item->refresh();
+ LLFolderViewFolder* parent = view_item->getParentFolder();
+ if (parent)
+ {
+ parent->updateHasFavorites(get_is_favorite(model_item));
+ }
+ }
+ }
+
// We don't typically care which of these masks the item is actually flagged with, since the masks
// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
@@ -651,6 +686,16 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
setSelection(item_id, false);
}
updateFolderLabel(model_item->getParentUUID());
+
+ if (get_is_favorite(model_item))
+ {
+ LLFolderViewFolder* new_parent = getFolderByID(model_item->getParentUUID());
+ if (new_parent)
+ {
+ new_parent->updateHasFavorites(true);
+ }
+ }
+
}
//////////////////////////////
@@ -664,9 +709,11 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
{
LLFolderViewModelItem* old_parent_vmi = old_parent->getViewModelItem();
LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(old_parent_vmi);
- LLFolderViewFolder* new_parent = (LLFolderViewFolder*)getItemByID(model_item->getParentUUID());
- // Item has been moved.
- if (old_parent != new_parent)
+ LLFolderViewFolder* new_parent = getFolderByID(model_item->getParentUUID());
+
+ if (old_parent != new_parent // Item has been moved.
+ && (new_parent != NULL || !isInRootContent(item_id, view_item)) // item is not or shouldn't be in root content
+ )
{
if (new_parent != NULL)
{
@@ -701,9 +748,21 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
{
old_parent_vmi->dirtyDescendantsFilter();
}
+
+ if (view_item->isFavorite())
+ {
+ if (old_parent)
+ {
+ old_parent->updateHasFavorites(false); // favorite was removed
+ }
+ if (new_parent)
+ {
+ new_parent->updateHasFavorites(true); // favorite was added
+ }
}
}
}
+ }
//////////////////////////////
// REMOVE Operation
@@ -713,6 +772,7 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
// Remove the item's UI.
LLFolderViewFolder* parent = view_item->getParentFolder();
removeItemID(viewmodel_item->getUUID());
+ bool was_favorite = view_item->isFavorite();
view_item->destroyView();
if(parent)
{
@@ -726,6 +786,10 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
updateFolderLabel(viewmodel_folder->getUUID());
}
}
+ if (was_favorite)
+ {
+ parent->updateHasFavorites(false); // favorite was removed
+ }
}
}
}
@@ -736,7 +800,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
LL_PROFILE_ZONE_SCOPED;
- if (mViewsInitialized != VIEWS_INITIALIZED) return;
+ if (mViewsInitialized != VIEWS_INITIALIZED) return; // todo: Store changes if building?
const LLInventoryModel* model = getModel();
if (!model) return;
@@ -843,7 +907,23 @@ void LLInventoryPanel::idle(void* user_data)
bool in_visible_chain = panel->isInVisibleChain();
- if (!panel->mBuildViewsQueue.empty())
+ if (!panel->mBuildRootQueue.empty())
+ {
+ const F64 max_time = in_visible_chain ? 0.006f : 0.001f; // 6 ms
+ F64 curent_time = LLTimer::getTotalSeconds();
+ panel->mBuildViewsEndTime = curent_time + max_time;
+
+ while (curent_time < panel->mBuildViewsEndTime
+ && !panel->mBuildRootQueue.empty())
+ {
+ LLUUID item_id = panel->mBuildRootQueue.back();
+ panel->mBuildRootQueue.pop_back();
+ panel->findAndInitRootContent(item_id);
+
+ curent_time = LLTimer::getTotalSeconds();
+ }
+ }
+ else if (!panel->mBuildViewsQueue.empty())
{
const F64 max_time = in_visible_chain ? 0.006f : 0.001f; // 6 ms
F64 curent_time = LLTimer::getTotalSeconds();
@@ -883,6 +963,11 @@ void LLInventoryPanel::idle(void* user_data)
panel->mViewsInitialized = VIEWS_INITIALIZED;
}
}
+ // in case panel is empty or only has 'roots'
+ else if (panel->mViewsInitialized == VIEWS_BUILDING)
+ {
+ panel->mViewsInitialized = VIEWS_INITIALIZED;
+ }
// Take into account the fact that the root folder might be invalidated
if (panel->mFolderRoot.get())
@@ -925,20 +1010,9 @@ void LLInventoryPanel::initializeViews(F64 max_time)
mBuildViewsEndTime = curent_time + max_time;
// init everything
- LLUUID root_id = getRootFolderID();
- if (root_id.notNull())
- {
- buildNewViews(getRootFolderID());
- }
- else
- {
- // Default case: always add "My Inventory" root first, "Library" root second
- // If we run out of time, this still should create root folders
- buildNewViews(gInventory.getRootFolderID()); // My Inventory
- buildNewViews(gInventory.getLibraryRootFolderID()); // Library
- }
+ initRootContent();
- if (mBuildViewsQueue.empty())
+ if (mBuildViewsQueue.empty() && mBuildRootQueue.empty())
{
mViewsInitialized = VIEWS_INITIALIZED;
}
@@ -969,6 +1043,22 @@ void LLInventoryPanel::initializeViews(F64 max_time)
}
}
+void LLInventoryPanel::initRootContent()
+{
+ LLUUID root_id = getRootFolderID();
+ if (root_id.notNull())
+ {
+ buildNewViews(getRootFolderID());
+ }
+ else
+ {
+ // Default case: always add "My Inventory" root first, "Library" root second
+ // If we run out of time, this still should create root folders
+ buildNewViews(gInventory.getRootFolderID()); // My Inventory
+ buildNewViews(gInventory.getLibraryRootFolderID()); // Library
+ }
+}
+
LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop)
{
@@ -1740,26 +1830,8 @@ bool LLInventoryPanel::beginIMSession()
void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
{
const std::string param = userdata.asString();
- if (param == "model")
- {
- gSavedPerAccountSettings.setString("ModelUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
- }
- else if (param == "texture")
- {
- gSavedPerAccountSettings.setString("TextureUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
- }
- else if (param == "sound")
- {
- gSavedPerAccountSettings.setString("SoundUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
- }
- else if (param == "animation")
- {
- gSavedPerAccountSettings.setString("AnimationUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
- }
- else if (param == "pbr_material")
- {
- gSavedPerAccountSettings.setString("PBRUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
- }
+ const LLUUID dest = LLFolderBridge::sSelf.get()->getUUID();
+ LLInventoryAction::fileUploadLocation(dest, param);
}
void LLInventoryPanel::setFavoriteFolder()
@@ -1767,6 +1839,13 @@ void LLInventoryPanel::setFavoriteFolder()
gSavedPerAccountSettings.setString("FavoriteFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
}
+bool LLInventoryPanel::isUploadLocationSelected(const LLSD& userdata)
+{
+ const std::string param = userdata.asString();
+ const LLUUID dest = LLFolderBridge::sSelf.get()->getUUID();
+ return LLInventoryAction::isFileUploadLocation(dest, param);
+}
+
void LLInventoryPanel::openSingleViewInventory(LLUUID folder_id)
{
LLPanelMainInventory::newFolderWindow(folder_id.isNull() ? LLFolderBridge::sSelf.get()->getUUID() : folder_id);
@@ -2032,7 +2111,7 @@ void LLInventoryPanel::removeItemID(const LLUUID& id)
++it)
{
mItemMap.erase((*it)->getUUID());
- }
+}
for (LLInventoryModel::item_array_t::iterator it = items.begin(), end_it = items.end();
it != end_it;
@@ -2212,6 +2291,297 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;
}
+/************************************************************************/
+/* Favorites Inventory Panel related class */
+/************************************************************************/
+static const LLFavoritesInventoryBridgeBuilder FAVORITES_BUILDER;
+class LLInventoryFavoritesItemsPanel : public LLInventoryPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+ {};
+
+ void initFromParams(const Params& p)
+ {
+ LLInventoryPanel::initFromParams(p);
+ // turn off trash
+ getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() | (1ULL << LLFolderType::FT_TRASH));
+ getFilter().setFilterNoTrashFolder();
+ // turn off marketplace for favorites
+ getFilter().setFilterNoMarketplaceFolder();
+ }
+
+ void removeItemID(const LLUUID& id) override;
+ bool isInRootContent(const LLUUID& id, LLFolderViewItem* view_item) override;
+ bool hasPredecessorsInRootContent(const LLInventoryObject* model_item) const;
+
+protected:
+ LLInventoryFavoritesItemsPanel(const Params&);
+ friend class LLUICtrlFactory;
+
+ void findAndInitRootContent(const LLUUID& folder_id) override;
+ void initRootContent() override;
+
+ // removeFavorite removes item from root, does not readd favorited children if present
+ bool removeFavorite(const LLUUID& id, const LLInventoryObject* model_item);
+ void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
+
+ std::set<LLUUID> mRootContentIDs;
+};
+
+LLInventoryFavoritesItemsPanel::LLInventoryFavoritesItemsPanel(const Params& params)
+ : LLInventoryPanel(params)
+{
+ // replace bridge builder to have necessary View bridges.
+ mInvFVBridgeBuilder = &FAVORITES_BUILDER;
+}
+
+void LLInventoryFavoritesItemsPanel::removeItemID(const LLUUID& id)
+{
+ std::set<LLUUID>::iterator found = mRootContentIDs.find(id);
+ if (found != mRootContentIDs.end())
+ {
+ mRootContentIDs.erase(found);
+ // check content for favorites
+ mBuildRootQueue.emplace_back(id);
+ }
+
+ LLInventoryPanel::removeItemID(id);
+}
+
+bool LLInventoryFavoritesItemsPanel::isInRootContent(const LLUUID& id, LLFolderViewItem* view_item)
+{
+ if (!view_item->isFavorite())
+ {
+ return false;
+ }
+
+ std::set<LLUUID>::iterator found = mRootContentIDs.find(id);
+ return found != mRootContentIDs.end();
+}
+
+bool LLInventoryFavoritesItemsPanel::hasPredecessorsInRootContent(const LLInventoryObject* obj) const
+{
+ LLUUID parent_id = obj->getParentUUID();
+ while (parent_id.notNull())
+ {
+ if (mRootContentIDs.contains(parent_id))
+ {
+ return true;
+ }
+ LLViewerInventoryCategory* cat = mInventory->getCategory(parent_id);
+ if (cat)
+ {
+ parent_id = cat->getParentUUID();
+ }
+ }
+ return false;
+}
+
+void LLInventoryFavoritesItemsPanel::findAndInitRootContent(const LLUUID& id)
+{
+ F64 curent_time = LLTimer::getTotalSeconds();
+ if (mBuildViewsEndTime < curent_time)
+ {
+ mBuildRootQueue.emplace_back(id);
+ return;
+ }
+ LLViewerInventoryCategory::cat_array_t* categories;
+ LLViewerInventoryItem::item_array_t* items;
+ mInventory->lockDirectDescendentArrays(id, categories, items);
+
+ if (categories)
+ {
+ S32 count = static_cast<S32>(categories->size());
+ for (S32 i = 0; i < count; ++i)
+ {
+ LLViewerInventoryCategory* cat = categories->at(i);
+ if (cat->getPreferredType() == LLFolderType::FT_TRASH)
+ {
+ continue;
+ }
+ else if (cat->getIsFavorite())
+ {
+ LLFolderViewItem* folder_view_item = getItemByID(cat->getUUID());
+ if (!folder_view_item)
+ {
+ const LLUUID& parent_id = cat->getParentUUID();
+ mRootContentIDs.emplace(cat->getUUID());
+
+ buildViewsTree(cat->getUUID(), parent_id, cat, folder_view_item, mFolderRoot.get(), BUILD_TIMELIMIT);
+ }
+ }
+ else
+ {
+ findAndInitRootContent(cat->getUUID());
+ }
+ }
+ }
+
+ if (items)
+ {
+ S32 count = static_cast<S32>(items->size());
+ for (S32 i = 0; i < count; ++i)
+ {
+ LLViewerInventoryItem* item = items->at(i);
+ const LLUUID item_id = item->getUUID();
+ if (item->getIsFavorite() && typedViewsFilter(item_id, item))
+ {
+ LLFolderViewItem* folder_view_item = getItemByID(id);
+ if (!folder_view_item)
+ {
+ const LLUUID& parent_id = item->getParentUUID();
+ mRootContentIDs.emplace(item_id);
+
+ buildViewsTree(item_id, parent_id, item, folder_view_item, mFolderRoot.get(), BUILD_TIMELIMIT);
+ }
+ }
+ }
+ }
+
+ mInventory->unlockDirectDescendentArrays(id);
+}
+
+void LLInventoryFavoritesItemsPanel::initRootContent()
+{
+ findAndInitRootContent(gInventory.getRootFolderID()); // My Inventory
+}
+
+bool LLInventoryFavoritesItemsPanel::removeFavorite(const LLUUID& id, const LLInventoryObject* model_item)
+{
+ std::set<LLUUID>::iterator found = mRootContentIDs.find(id);
+ if (found == mRootContentIDs.end())
+ {
+ return false;
+ }
+
+ mRootContentIDs.erase(found);
+
+ // This item is in root's content, remove item's UI.
+ LLFolderViewItem* view_item = getItemByID(id);
+ if (view_item)
+ {
+ LLFolderViewFolder* parent = view_item->getParentFolder();
+ LLFolderViewModelItemInventory* viewmodel_item = static_cast<LLFolderViewModelItemInventory*>(view_item->getViewModelItem());
+ if (viewmodel_item)
+ {
+ removeItemID(viewmodel_item->getUUID());
+ }
+ bool was_favorite = view_item->isFavorite();
+ view_item->destroyView();
+ if (parent)
+ {
+ parent->getViewModelItem()->dirtyDescendantsFilter();
+ LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(parent->getViewModelItem());
+ if (viewmodel_folder)
+ {
+ updateFolderLabel(viewmodel_folder->getUUID());
+ }
+ if (was_favorite)
+ {
+ parent->updateHasFavorites(false); // favorite was removed
+ }
+ }
+ }
+
+ return true;
+}
+
+void LLInventoryFavoritesItemsPanel::itemChanged(const LLUUID& id, U32 mask, const LLInventoryObject* model_item)
+{
+ LLFolderViewItem* view_item = getItemByID(id);
+ if (!model_item && !view_item)
+ {
+ // remove operation, but item is not in panel already
+ return;
+ }
+
+ bool handled = false;
+
+ if (mask & (LLInventoryObserver::UPDATE_FAVORITE |
+ LLInventoryObserver::STRUCTURE |
+ LLInventoryObserver::ADD |
+ LLInventoryObserver::REMOVE))
+ {
+ // specifically exlude links and not get_is_favorite(model_item)
+ if (model_item && model_item->getIsFavorite())
+ {
+ if (!view_item)
+ {
+ const LLViewerInventoryCategory* cat = dynamic_cast<const LLViewerInventoryCategory*>(model_item);
+ if (cat)
+ {
+ // New favorite folder
+ if (cat->getPreferredType() != LLFolderType::FT_TRASH)
+ {
+ // If any descendants were in the list, remove them
+ // Todo: Consider implementing and checking hasFavorites to save on search
+ LLFavoritesCollector is_favorite;
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ gInventory.collectDescendentsIf(id, cat_array, item_array, false, is_favorite);
+ for (LLInventoryModel::cat_array_t::const_iterator it = cat_array.begin(); it != cat_array.end(); ++it)
+ {
+ removeFavorite((*it)->getUUID(), *it);
+ }
+ for (LLInventoryModel::item_array_t::const_iterator it = item_array.begin(); it != item_array.end(); ++it)
+ {
+ removeFavorite((*it)->getUUID(), *it);
+ }
+
+ LLFolderViewItem* folder_view_item = getItemByID(cat->getUUID());
+ if (!folder_view_item
+ && !hasPredecessorsInRootContent(model_item))
+ {
+ const LLUUID& parent_id = cat->getParentUUID();
+ mRootContentIDs.emplace(cat->getUUID());
+
+ buildViewsTree(cat->getUUID(), parent_id, cat, folder_view_item, mFolderRoot.get(), BUILD_ONE_FOLDER);
+ }
+ }
+ }
+ else
+ {
+ // New favorite item
+ if (model_item->getIsFavorite()
+ && typedViewsFilter(id, model_item)
+ && !hasPredecessorsInRootContent(model_item))
+ {
+ const LLUUID& parent_id = model_item->getParentUUID();
+ mRootContentIDs.emplace(id);
+
+ buildViewsTree(id, parent_id, model_item, NULL, mFolderRoot.get(), BUILD_ONE_FOLDER);
+ }
+ }
+ handled = true;
+ }
+ }
+ else
+ {
+ handled = removeFavorite(id, model_item);
+ if (handled)
+ {
+ const LLViewerInventoryCategory* cat = dynamic_cast<const LLViewerInventoryCategory*>(model_item);
+ // Todo: Consider implementing and checking hasFavorites to save on search
+ if (cat)
+ {
+ // re-add any favorited children
+ mBuildRootQueue.emplace_back(id);
+ }
+ }
+ }
+ }
+
+ if (!handled
+ && (!model_item || model_item->getParentUUID().notNull())) // filter out 'My inventory'
+ {
+ LLInventoryPanel::itemChanged(id, mask, model_item);
+ }
+}
+/************************************************************************/
+/* LLInventorySingleFolderPanel */
+/************************************************************************/
+
static LLDefaultChildRegistry::Register<LLInventorySingleFolderPanel> t_single_folder_inventory_panel("single_folder_inventory_panel");
LLInventorySingleFolderPanel::LLInventorySingleFolderPanel(const Params& params)
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index ab17196e5f..5a73df54b0 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -226,6 +226,7 @@ public:
bool beginIMSession();
void fileUploadLocation(const LLSD& userdata);
void setFavoriteFolder();
+ bool isUploadLocationSelected(const LLSD& userdata);
void openSingleViewInventory(LLUUID folder_id = LLUUID());
void purgeSelectedItems();
bool attachObject(const LLSD& userdata);
@@ -252,7 +253,8 @@ public:
bool reset_filter = false);
static void setSFViewAndOpenFolder(const LLInventoryPanel* panel, const LLUUID& folder_id);
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
- void removeItemID(const LLUUID& id);
+ virtual void removeItemID(const LLUUID& id);
+ virtual bool isInRootContent(const LLUUID& id, LLFolderViewItem* view_item) { return false; }
LLFolderViewItem* getItemByID(const LLUUID& id);
LLFolderViewFolder* getFolderByID(const LLUUID& id);
void setSelectionByID(const LLUUID& obj_id, bool take_keyboard_focus);
@@ -335,6 +337,8 @@ public:
protected:
// Builds the UI. Call this once the inventory is usable.
void initializeViews(F64 max_time);
+ virtual void initRootContent();
+ virtual void findAndInitRootContent(const LLUUID& root_id) {};
// Specific inventory colors
static bool sColorSetInitialized;
@@ -372,7 +376,7 @@ protected:
virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge);
boost::function<void(const std::deque<LLFolderViewItem*>& items, bool user_action)> mSelectionCallback;
-private:
+
// buildViewsTree does not include some checks and is meant
// for recursive use, use buildNewViews() for first call
LLFolderViewItem* buildViewsTree(const LLUUID& id,
@@ -395,6 +399,8 @@ private:
EViewsInitializationState mViewsInitialized; // Whether views have been generated
F64 mBuildViewsEndTime; // Stop building views past this timestamp
std::deque<LLUUID> mBuildViewsQueue;
+ std::deque<LLUUID> mBuildRootQueue;
+
};
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index 101ee215cb..6e56aac270 100644
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -38,6 +38,7 @@
/* image compression headers. */
#include "llimagebmp.h"
#include "llimagetga.h"
+#include "llimagej2c.h"
#include "llimagejpeg.h"
#include "llimagepng.h"
@@ -106,6 +107,10 @@ LLLocalBitmap::LLLocalBitmap(std::string filename)
{
mExtension = ET_IMG_JPG;
}
+ else if (temp_exten == "j2c" || temp_exten == "jp2")
+ {
+ mExtension = ET_IMG_J2C;
+ }
else if (temp_exten == "png")
{
mExtension = ET_IMG_PNG;
@@ -191,7 +196,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
#ifndef LL_WINDOWS
const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename));
#else
- const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(utf8str_to_utf16str(mFilename)));
+ const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(ll_convert<std::wstring>(mFilename)));
#endif
LLSD new_last_modified = asctime(localtime(&temp_time));
@@ -214,7 +219,10 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
LLPointer<LLViewerFetchedTexture> texture = new LLViewerFetchedTexture
("file://"+mFilename, FTT_LOCAL_FILE, mWorldID, LL_LOCAL_USE_MIPMAPS);
- texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image);
+ if (!texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image))
+ {
+ LL_WARNS() << "Failed to create GL texture for local bitmap: " << mFilename << " " << mWorldID << LL_ENDL;
+ }
texture->ref();
gTextureList.addImage(texture, TEX_LIST_STANDARD);
@@ -354,6 +362,21 @@ bool LLLocalBitmap::decodeBitmap(LLPointer<LLImageRaw> rawimg)
break;
}
+ case ET_IMG_J2C:
+ {
+ LLPointer<LLImageJ2C> jpeg_image = new LLImageJ2C;
+ if (jpeg_image->load(mFilename))
+ {
+ jpeg_image->setDiscardLevel(0);
+ if (jpeg_image->decode(rawimg, 0.0f))
+ {
+ rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ decode_successful = true;
+ }
+ }
+ break;
+ }
+
case ET_IMG_PNG:
{
LLPointer<LLImagePNG> png_image = new LLImagePNG;
diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h
index de2dcb3467..6c9d65e3b6 100644
--- a/indra/newview/lllocalbitmaps.h
+++ b/indra/newview/lllocalbitmaps.h
@@ -89,6 +89,7 @@ class LLLocalBitmap
ET_IMG_BMP,
ET_IMG_TGA,
ET_IMG_JPG,
+ ET_IMG_J2C,
ET_IMG_PNG
};
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/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 5e230d95bd..1a07efe25d 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -32,6 +32,8 @@
#include "lllogchat.h"
#include "llregex.h"
#include "lltrans.h"
+#include "llurlaction.h"
+#include "llurlentry.h"
#include "llviewercontrol.h"
#include "lldiriterator.h"
@@ -78,8 +80,8 @@ const static std::string MULTI_LINE_PREFIX(" ");
*
* Note: "You" was used as an avatar names in viewers of previous versions
*/
-const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$");
-const static boost::regex TIMESTAMP("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]|\\[\\d{1,2}:\\d{2}\\]).*");
+const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\s[AaPp][Mm]\\]\\s+|\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}:\\d{2}\\s[AaPp][Mm]\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$");
+const static boost::regex TIMESTAMP("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}(\\s[AaPp][Mm])?\\]|\\[\\d{1,2}:\\d{2}(\\s[AaPp][Mm])?\\]).*");
/**
* Regular expression suitable to match names like
@@ -150,6 +152,10 @@ public:
void checkAndCutOffDate(std::string& time_str)
{
+ if (time_str.size() < 10) // not enough space for a date
+ {
+ return;
+ }
// Cuts off the "%Y/%m/%d" from string for todays timestamps.
// Assume that passed string has at least "%H:%M" time format.
date log_date(not_a_date_time);
@@ -166,20 +172,12 @@ public:
if ( days_alive == zero_days )
{
- // Yep, today's so strip "%Y/%m/%d" info
- ptime stripped_time(not_a_date_time);
-
- mTimeStream.str(LLStringUtil::null);
- mTimeStream << time_str;
- mTimeStream >> stripped_time;
- mTimeStream.clear();
-
- time_str.clear();
-
- mTimeStream.str(LLStringUtil::null);
- mTimeStream << stripped_time;
- mTimeStream >> time_str;
- mTimeStream.clear();
+ size_t pos = time_str.find_first_of(' ');
+ if (pos != std::string::npos)
+ {
+ time_str.erase(0, pos + 1);
+ LLStringUtil::trim(time_str);
+ }
}
LL_DEBUGS("LLChatLogParser")
@@ -308,18 +306,24 @@ std::string LLLogChat::timestamp2LogString(U32 timestamp, bool withdate)
std::string timeStr;
if (withdate)
{
- timeStr = "[" + LLTrans::getString ("TimeYear") + "]/["
- + LLTrans::getString ("TimeMonth") + "]/["
- + LLTrans::getString ("TimeDay") + "] ["
- + LLTrans::getString ("TimeHour") + "]:["
- + LLTrans::getString ("TimeMin") + "]:["
- + LLTrans::getString ("TimeSec") + "]";
+ timeStr = "[" + LLTrans::getString("TimeYear") + "]/["
+ + LLTrans::getString("TimeMonth") + "]/["
+ + LLTrans::getString("TimeDay") + "] ";
+ }
+
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ if (use_24h)
+ {
+ timeStr += "[" + LLTrans::getString("TimeHour") + "]:["
+ + LLTrans::getString("TimeMin") + "]:["
+ + LLTrans::getString("TimeSec") + "]";
}
else
{
- timeStr = "[" + LLTrans::getString("TimeHour") + "]:["
- + LLTrans::getString ("TimeMin")+"]:["
- + LLTrans::getString ("TimeSec")+"]";
+ timeStr += "[" + LLTrans::getString("TimeHour12") + "]:["
+ + LLTrans::getString("TimeMin") + "]:["
+ + LLTrans::getString("TimeSec") + "] ["
+ + LLTrans::getString("TimeAMPM") + "]";
}
LLSD substitution;
@@ -360,13 +364,29 @@ void LLLogChat::saveHistory(const std::string& filename,
return;
}
+ std::string altered_line = line;
+
+ // avoid costly regex calls
+ if (line.find("/mention") != std::string::npos)
+ {
+ static const boost::regex mention_regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/mention", boost::regex::perl | boost::regex::icase);
+
+ // replace mention URL with [@username](URL)
+ altered_line = boost::regex_replace(line, mention_regex, [](const boost::smatch& match) -> std::string
+ {
+ std::string url = match[0].str();
+ std::string username = LLUrlAction::getURLLabel(url);
+ return "[" + username + "](" + url + ")";
+ });
+ }
+
LLSD item;
if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
item["time"] = LLLogChat::timestamp2LogString(0, gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
item["from_id"] = from_id;
- item["message"] = line;
+ item["message"] = altered_line;
//adding "Second Life:" for all system messages to make chat log history parsing more reliable
if (from.empty() && from_id.isNull())
@@ -434,8 +454,8 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m
}
// If we got here, we managed to stat the file.
- // Open the file to read
- LLFILE* fptr = LLFile::fopen(log_file_name, "r"); /*Flawfinder: ignore*/
+ // Open the file to read in binary mode to prevent interpreting other characters as EOF
+ LLFILE* fptr = LLFile::fopen(log_file_name, "rb"); /*Flawfinder: ignore*/
if (!fptr)
{ // Ok, this is strange but not really tragic in the big picture of things
LL_WARNS("ChatHistory") << "Unable to read file " << log_file_name << " after stat was successful" << LL_ENDL;
@@ -472,6 +492,19 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m
std::string line(remove_utf8_bom(buffer));
+
+ // fast heuristic test for a mention URL in a string
+ // this is used to avoid costly regex calls
+ if (line.find("/mention)") != std::string::npos)
+ {
+ // restore original mention URL from [@username](URL) format
+ static const boost::regex altered_mention_regex("\\[@([^\\]]+)\\]\\((" APP_HEADER_REGEX "/agent/[\\da-f-]+/mention)\\)",
+ boost::regex::perl | boost::regex::icase);
+
+ // $2 captures the URL part
+ line = boost::regex_replace(line, altered_mention_regex, "$2");
+ }
+
//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
if (' ' == line[0])
{
@@ -1152,7 +1185,7 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
}
bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
- LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "rb");/*Flawfinder: ignore*/
if (!fptr)
{
@@ -1161,17 +1194,17 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
{
std::string old_name(file_name);
old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size());
- fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r");
+ fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "rb");
if (fptr)
{
fclose(fptr);
LLFile::copy(LLLogChat::makeLogFileName(old_name), LLLogChat::makeLogFileName(file_name));
}
- fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");
+ fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "rb");
}
if (!fptr)
{
- fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "rb");/*Flawfinder: ignore*/
if (!fptr)
{
mNewLoad = false;
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index cbc3744aa3..41cec4f074 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -62,7 +62,7 @@
const S32 LOGIN_MAX_RETRIES = 0; // Viewer should not autmatically retry login
const F32 LOGIN_SRV_TIMEOUT_MIN = 10;
-const F32 LOGIN_SRV_TIMEOUT_MAX = 120;
+const F32 LOGIN_SRV_TIMEOUT_MAX = 180;
const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time
class LLLoginInstance::Disposable {
@@ -329,6 +329,15 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
LL_DEBUGS("LLLogin") << "reason " << reason_response
<< " message " << message_response
<< LL_ENDL;
+
+ if (response.has("mfa_hash"))
+ {
+ mRequestData["params"]["mfa_hash"] = response["mfa_hash"];
+ mRequestData["params"]["token"] = "";
+
+ saveMFAHash(response);
+ }
+
// For the cases of critical message or TOS agreement,
// start the TOS dialog. The dialog response will be handled
// by the LLLoginInstance::handleTOSResponse() callback.
@@ -593,6 +602,24 @@ bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & respon
return true;
}
+void LLLoginInstance::saveMFAHash(LLSD const& response)
+{
+ std::string grid(LLGridManager::getInstance()->getGridId());
+ std::string user_id(LLStartUp::getUserId());
+
+ // Only save mfa_hash for future logins if the user wants their info remembered.
+ if (response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && LLLoginInstance::getInstance()->saveMFA())
+ {
+ gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]);
+ }
+ else if (!LLLoginInstance::getInstance()->saveMFA())
+ {
+ gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id);
+ }
+ // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically
+ gSecAPIHandler->syncProtectedMap();
+}
+
std::string construct_start_string()
{
std::string start;
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index 748909c069..941b378b14 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -70,6 +70,8 @@ public:
void setNotificationsInterface(LLNotificationsInterface* ni) { mNotifications = ni; }
LLNotificationsInterface& getNotificationsInterface() const { return *mNotifications; }
+ void saveMFAHash(LLSD const& response);
+
private:
typedef std::shared_ptr<LLEventAPI::Response> ResponsePtr;
void constructAuthParams(LLPointer<LLCredential> user_credentials);
diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp
index aa03001389..51c38aba3a 100644
--- a/indra/newview/llmachineid.cpp
+++ b/indra/newview/llmachineid.cpp
@@ -293,7 +293,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var
if (validate_as_uuid)
{
std::wstring ws(serialNumber, serial_size);
- std::string str = ll_convert_wide_to_string(ws);
+ std::string str = ll_convert<std::string>(ws);
if (!LLUUID::validate(str))
{
@@ -315,7 +315,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var
continue;
}
}
- LL_INFOS("AppInit") << " Serial Number : " << vtProp.bstrVal << LL_ENDL;
+ LL_INFOS("AppInit") << " Serial Number : " << ll_convert_wide_to_string(std::wstring(vtProp.bstrVal, SysStringLen(vtProp.bstrVal))) << LL_ENDL;
unsigned int j = 0;
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 28160177f6..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";
@@ -137,7 +138,8 @@ LLFloaterComboOptions* LLFloaterComboOptions::showUI(
{
combo_picker->mComboOptions->addSimpleElement(*iter);
}
- combo_picker->mComboOptions->selectFirstItem();
+ // select 'Bulk Upload All' option
+ combo_picker->mComboOptions->selectNthItem((S32)options.size() - 1);
combo_picker->openFloater(LLSD(title));
combo_picker->setFocus(true);
@@ -1245,7 +1247,7 @@ bool LLMaterialEditor::decodeAsset(const std::vector<char>& buffer)
{
LLSD asset;
- std::istrstream str(&buffer[0], buffer.size());
+ boost::iostreams::stream<boost::iostreams::array_source> str(buffer.data(), buffer.size());
if (LLSDSerialize::deserialize(asset, str, buffer.size()))
{
if (asset.has("version") && LLGLTFMaterial::isAcceptedVersion(asset["version"].asString()))
@@ -1332,15 +1334,6 @@ const std::string LLMaterialEditor::buildMaterialDescription()
desc << mNormalName;
}
- // trim last char if it's a ',' in case there is no normal texture
- // present and the code above inserts one
- // (no need to check for string length - always has initial string)
- std::string::iterator iter = desc.str().end() - 1;
- if (*iter == ',')
- {
- desc.str().erase(iter);
- }
-
// sanitize the material description so that it's compatible with the inventory
// note: split this up because clang doesn't like operating directly on the
// str() - error: lvalue reference to type 'basic_string<...>' cannot bind to a
@@ -1348,6 +1341,15 @@ const std::string LLMaterialEditor::buildMaterialDescription()
std::string inv_desc = desc.str();
LLInventoryObject::correctInventoryName(inv_desc);
+ // trim last char if it's a ',' in case there is no normal texture
+ // present and the code above inserts one
+ // (no need to check for string length - always has initial string)
+ std::string::iterator iter = inv_desc.end() - 1;
+ if (*iter == ',')
+ {
+ inv_desc.erase(iter);
+ }
+
return inv_desc;
}
@@ -1414,7 +1416,7 @@ bool LLMaterialEditor::saveIfNeeded()
}
std::string res_desc = buildMaterialDescription();
- createInventoryItem(buffer, mMaterialName, res_desc, local_permissions);
+ createInventoryItem(buffer, mMaterialName, res_desc, local_permissions, mUploadFolder);
// We do not update floater with uploaded asset yet, so just close it.
closeFloater();
@@ -1584,12 +1586,12 @@ private:
std::string mNewName;
};
-void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions)
+void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions, const LLUUID& upload_folder)
{
// gen a new uuid for this asset
LLTransactionID tid;
tid.generate(); // timestamp-based randomization + uniquification
- LLUUID parent = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL);
+ LLUUID parent = upload_folder.isNull() ? gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL) : upload_folder;
const U8 subtype = NO_INV_SUBTYPE; // TODO maybe use AT_SETTINGS and LLSettingsType::ST_MATERIAL ?
LLPointer<LLObjectsMaterialItemCallback> cb = new LLObjectsMaterialItemCallback(permissions, buffer, name);
@@ -1903,7 +1905,11 @@ static void pack_textures(
}
}
-void LLMaterialEditor::uploadMaterialFromModel(const std::string& filename, tinygltf::Model& model_in, S32 index)
+void LLMaterialEditor::uploadMaterialFromModel(
+ const std::string& filename,
+ tinygltf::Model& model_in,
+ S32 index,
+ const LLUUID& dest)
{
if (index < 0 || !LLMaterialEditor::capabilitiesAvailable())
{
@@ -1926,12 +1932,13 @@ void LLMaterialEditor::uploadMaterialFromModel(const std::string& filename, tiny
// This uses 'filename' to make sure multiple bulk uploads work
// instead of fighting for a single instance.
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor", LLSD().with("filename", filename).with("index", LLSD::Integer(index)));
+ me->mUploadFolder = dest;
me->loadMaterial(model_in, filename, index, false);
me->saveIfNeeded();
}
-void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 index)
+void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 index, const LLUUID& dest_folder)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
@@ -2431,17 +2438,17 @@ void LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback(const LLSD& notificati
return;
}
- createInventoryItem(str.str(), new_name, std::string(), permissions);
+ createInventoryItem(str.str(), new_name, std::string(), permissions, LLUUID::null);
}
-const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k);
+void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k, const LLUUID& dest);
void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::string &filename, S32 index, bool open_floater)
{
if (index == model_in.materials.size())
{
// bulk upload all the things
- upload_bulk({ filename }, LLFilePicker::FFLOAD_MATERIAL, true);
+ upload_bulk({ filename }, LLFilePicker::FFLOAD_MATERIAL, true, LLUUID::null);
return;
}
@@ -2478,6 +2485,42 @@ void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::
pack_textures(base_color_img, normal_img, mr_img, emissive_img, occlusion_img,
mBaseColorJ2C, mNormalJ2C, mMetallicRoughnessJ2C, mEmissiveJ2C);
+ if (open_floater)
+ {
+ bool textures_scaled = false;
+ if (mBaseColorFetched && mBaseColorJ2C
+ && (mBaseColorFetched->getWidth() != mBaseColorJ2C->getWidth()
+ || mBaseColorFetched->getHeight() != mBaseColorJ2C->getHeight()))
+ {
+ textures_scaled = true;
+ }
+ else if (mNormalFetched && mNormalJ2C
+ && (mNormalFetched->getWidth() != mNormalJ2C->getWidth()
+ || mNormalFetched->getHeight() != mNormalJ2C->getHeight()))
+ {
+ textures_scaled = true;
+ }
+ else if (mMetallicRoughnessFetched && mMetallicRoughnessJ2C
+ && (mMetallicRoughnessFetched->getWidth() != mMetallicRoughnessJ2C->getWidth()
+ || mMetallicRoughnessFetched->getHeight() != mMetallicRoughnessJ2C->getHeight()))
+ {
+ textures_scaled = true;
+ }
+ else if (mEmissiveFetched && mEmissiveJ2C
+ && (mEmissiveFetched->getWidth() != mEmissiveJ2C->getWidth()
+ || mEmissiveFetched->getHeight() != mEmissiveJ2C->getHeight()))
+ {
+ textures_scaled = true;
+ }
+
+ if (textures_scaled)
+ {
+ LLSD args;
+ args["MAX_SIZE"] = LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT;
+ LLNotificationsUtil::add("MaterialImagesWereScaled", args);
+ }
+ }
+
LLUUID base_color_id;
if (mBaseColorFetched.notNull())
{
@@ -2684,10 +2727,8 @@ const std::string LLMaterialEditor::getImageNameFromUri(std::string image_uri, c
// so we can include everything
if (stripped_uri.length() > 0)
{
- // example "DamagedHelmet: base layer"
+ // example "base layer"
return STRINGIZE(
- mMaterialNameShort <<
- ": " <<
stripped_uri <<
" (" <<
texture_type <<
@@ -2696,28 +2737,17 @@ const std::string LLMaterialEditor::getImageNameFromUri(std::string image_uri, c
}
else
// uri doesn't include the type (because the uri is empty)
- // so we must reorganize the string a bit to include the name
- // and an explicit name type
+ // include an explicit name type
{
- // example "DamagedHelmet: (Emissive)"
- return STRINGIZE(
- mMaterialNameShort <<
- " (" <<
- texture_type <<
- ")"
- );
+ // example "Emissive"
+ return texture_type;
}
}
else
- // uri includes the type so just use it directly with the
- // name of the material
+ // uri includes the type so just use it directly
{
- return STRINGIZE(
- // example: AlienBust: normal_layer
- mMaterialNameShort <<
- ": " <<
- stripped_uri
- );
+ // example: "normal_layer"
+ return stripped_uri;
}
}
@@ -2848,10 +2878,10 @@ void LLMaterialEditor::setFromGltfMetaData(const std::string& filename, const ti
}
}
-void LLMaterialEditor::importMaterial()
+void LLMaterialEditor::importMaterial(const LLUUID dest_folder)
{
LLFilePickerReplyThread::startPicker(
- [](const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter)
+ [dest_folder](const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter)
{
if (LLAppViewer::instance()->quitRequested())
{
@@ -2861,7 +2891,7 @@ void LLMaterialEditor::importMaterial()
{
if (filenames.size() > 0)
{
- LLMaterialEditor::loadMaterialFromFile(filenames[0], -1);
+ LLMaterialEditor::loadMaterialFromFile(filenames[0], -1, dest_folder);
}
}
catch (std::bad_alloc&)
@@ -3549,6 +3579,7 @@ void LLMaterialEditor::saveTexture(LLImageJ2C* img, const std::string& name, con
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost,
+ mUploadFolder,
false,
cb,
failed_upload));
diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h
index 232467460e..1abdd7f84c 100644
--- a/indra/newview/llmaterialeditor.h
+++ b/indra/newview/llmaterialeditor.h
@@ -94,7 +94,7 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
void setFromGltfMetaData(const std::string& filename, const tinygltf::Model& model, S32 index);
// open a file dialog and select a gltf/glb file for import
- static void importMaterial();
+ static void importMaterial(const LLUUID dest_folder = LLUUID::null);
// for live preview, apply current material to currently selected object
void applyToSelection();
@@ -105,8 +105,11 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
void loadAsset() override;
// @index if -1 and file contains more than one material,
// will promt to select specific one
- static void uploadMaterialFromModel(const std::string& filename, tinygltf::Model& model, S32 index);
- static void loadMaterialFromFile(const std::string& filename, S32 index = -1);
+ static void uploadMaterialFromModel(const std::string& filename,
+ tinygltf::Model& model,
+ S32 index,
+ const LLUUID& dest_folder_id = LLUUID::null);
+ static void loadMaterialFromFile(const std::string& filename, S32 index = -1, const LLUUID& dest_folder = LLUUID::null);
void onSelectionChanged(); // live overrides selection changes
@@ -134,8 +137,6 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
void onClickSave();
- void getGLTFModel(tinygltf::Model& model);
-
std::string getEncodedAsset();
bool decodeAsset(const std::vector<char>& buffer);
@@ -239,7 +240,7 @@ private:
static void saveObjectsMaterialAs(const LLGLTFMaterial *render_material, const LLLocalGLTFMaterial *local_material, const LLPermissions& permissions, const LLUUID& object_id /* = LLUUID::null */, const LLUUID& item /* = LLUUID::null */);
static bool updateInventoryItem(const std::string &buffer, const LLUUID &item_id, const LLUUID &task_id);
- static void createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions);
+ static void createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions, const LLUUID& upload_folder);
void setFromGLTFMaterial(LLGLTFMaterial* mat);
bool setFromSelection();
@@ -249,6 +250,7 @@ private:
friend class LLMaterialFilePicker;
LLUUID mAssetID;
+ LLUUID mUploadFolder;
LLTextureCtrl* mBaseColorTextureCtrl;
LLTextureCtrl* mMetallicTextureCtrl;
diff --git a/indra/newview/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 a8c6f69425..413f02b723 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -256,6 +256,7 @@
// mDecompositionRequests mMutex rw.repo.mMutex, ro.repo.none [5]
// mPhysicsShapeRequests mMutex rw.repo.mMutex, ro.repo.none [5]
// mDecompositionQ mMutex rw.repo.mLoadedMutex, rw.main.mLoadedMutex [5] (was: [0])
+// mPhysicsQ mMutex rw.repo.mLoadedMutex, rw.main.mLoadedMutex [5] (was: [0])
// mHeaderReqQ mMutex ro.repo.none [5], rw.repo.mMutex, rw.any.mMutex
// mLODReqQ mMutex ro.repo.none [5], rw.repo.mMutex, rw.any.mMutex
// mUnavailableQ mMutex rw.repo.none [0], ro.main.none [5], rw.main.mLoadedMutex
@@ -544,6 +545,66 @@ bool RequestStats::isDelayed() const
return mTimer.getStarted() && !mTimer.hasExpired();
}
+F32 calculate_score(LLVOVolume* object)
+{
+ if (!object)
+ {
+ return -1.f;
+ }
+ LLDrawable* drawable = object->mDrawable;
+ if (!drawable)
+ {
+ return -1;
+ }
+ if (drawable->isState(LLDrawable::RIGGED) || object->isAttachment())
+ {
+ LLVOAvatar* avatar = object->getAvatar();
+ LLDrawable* av_drawable = avatar ? avatar->mDrawable : nullptr;
+ if (avatar && av_drawable)
+ {
+ // See LLVOVolume::calcLOD()
+ F32 radius;
+ if (avatar->isControlAvatar())
+ {
+ const LLVector3* box = avatar->getLastAnimExtents();
+ LLVector3 diag = box[1] - box[0];
+ radius = diag.magVec() * 0.5f;
+ }
+ else
+ {
+ // Volume in a rigged mesh attached to a regular avatar.
+ const LLVector3* box = avatar->getLastAnimExtents();
+ LLVector3 diag = box[1] - box[0];
+ radius = diag.magVec();
+
+ if (!avatar->isSelf() && !avatar->hasFirstFullAttachmentData())
+ {
+ // slightly deprioritize avatars that are still receiving data
+ radius *= 0.9f;
+ }
+ }
+ return radius / llmax(av_drawable->mDistanceWRTCamera, 1.f);
+ }
+ }
+ return drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f);
+}
+
+void PendingRequestBase::updateScore()
+{
+ mScore = 0;
+ if (mTrackedData)
+ {
+ for (LLVOVolume* volume : mTrackedData->mVolumes)
+ {
+ F32 cur_score = calculate_score(volume);
+ if (cur_score > 0)
+ {
+ mScore = llmax(mScore, cur_score);
+ }
+ }
+ }
+}
+
LLViewerFetchedTexture* LLMeshUploadThread::FindViewerTexture(const LLImportMaterial& material)
{
LLPointer< LLViewerFetchedTexture > * ppTex = static_cast< LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData);
@@ -756,8 +817,12 @@ public:
};
-void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
- const char * const stage, const std::string & model_name)
+void log_upload_error(
+ LLCore::HttpStatus status,
+ const LLSD& content,
+ const char * const stage,
+ const std::string & model_name,
+ const std::vector<std::string> & texture_filenames)
{
// Add notification popup.
LLSD args;
@@ -815,6 +880,20 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
error_num++;
}
}
+
+ if (err.has("TextureIndex"))
+ {
+ S32 texture_index = err["TextureIndex"].asInteger();
+ if (texture_index < texture_filenames.size())
+ {
+ args["MESSAGE"] = message + "\n" + texture_filenames[texture_index];
+ }
+ else
+ {
+ llassert(false); // figure out why or how texture wasn't in the list
+ args["MESSAGE"] = message + llformat("\nTexture index: %d", texture_index);
+ }
+ }
}
else
{
@@ -904,6 +983,12 @@ LLMeshRepoThread::~LLMeshRepoThread()
mDecompositionQ.pop_front();
}
+ while (!mPhysicsQ.empty())
+ {
+ delete mPhysicsQ.front();
+ mPhysicsQ.pop_front();
+ }
+
delete mHttpRequest;
mHttpRequest = nullptr;
delete mMutex;
@@ -1210,6 +1295,12 @@ void LLMeshRepoThread::run()
LL_WARNS(LOG_MESH) << "Convex decomposition unable to be quit." << LL_ENDL;
}
}
+void LLMeshRepoThread::cleanup()
+{
+ mShuttingDown = true;
+ mSignal->broadcast();
+ mMeshThreadPool->close();
+}
// Mutex: LLMeshRepoThread::mMutex must be held on entry
void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id)
@@ -1493,6 +1584,11 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
[mesh_id, buffer, size]
()
{
+ if (gMeshRepo.mThread->isShuttingDown())
+ {
+ delete[] buffer;
+ return;
+ }
if (!gMeshRepo.mThread->skinInfoReceived(mesh_id, buffer, size))
{
// either header is faulty or something else overwrote the cache
@@ -1798,42 +1894,36 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
//static
void LLMeshRepoThread::incActiveLODRequests()
{
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
++LLMeshRepoThread::sActiveLODRequests;
}
//static
void LLMeshRepoThread::decActiveLODRequests()
{
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
--LLMeshRepoThread::sActiveLODRequests;
}
//static
void LLMeshRepoThread::incActiveHeaderRequests()
{
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
++LLMeshRepoThread::sActiveHeaderRequests;
}
//static
void LLMeshRepoThread::decActiveHeaderRequests()
{
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
--LLMeshRepoThread::sActiveHeaderRequests;
}
//static
void LLMeshRepoThread::incActiveSkinRequests()
{
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
++LLMeshRepoThread::sActiveSkinRequests;
}
//static
void LLMeshRepoThread::decActiveSkinRequests()
{
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
--LLMeshRepoThread::sActiveSkinRequests;
}
@@ -1993,6 +2083,11 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
[params, mesh_id, lod, buffer, size]
()
{
+ if (gMeshRepo.mThread->isShuttingDown())
+ {
+ delete[] buffer;
+ return;
+ }
if (gMeshRepo.mThread->lodReceived(params, lod, buffer, size) == MESH_OK)
{
LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mesh_id << " - was retrieved from the cache." << LL_ENDL;
@@ -2210,7 +2305,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes
if (gMeshRepo.mLoadingSkins.find(mesh_id) == gMeshRepo.mLoadingSkins.end())
{
- gMeshRepo.mLoadingSkins[mesh_id] = {}; // add an empty vector to indicate to main thread that we are loading skin info
+ gMeshRepo.mLoadingSkins[mesh_id]; // add an empty vector to indicate to main thread that we are loading skin info
}
}
@@ -2222,6 +2317,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes
}
if (request_skin)
{
+ LLMutexLock lock(mMutex);
mSkinRequests.push_back(UUIDBasedRequest(mesh_id));
}
}
@@ -2292,7 +2388,13 @@ EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_p
LLPointer<LLVolume> volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
if (volume->unpackVolumeFaces(data, data_size))
{
- if (volume->getNumFaces() > 0)
+ // Use LLVolume::getNumVolumeFaces() here and not LLVolume::getNumFaces(),
+ // because setMeshAssetLoaded() has not yet been called for this volume
+ // (it is set later in LLMeshRepository::notifyMeshLoaded()), and
+ // getNumFaces() would return the number of faces in the LLProfile
+ // instead. HB
+ S32 num_faces = volume->getNumVolumeFaces();
+ if (num_faces > 0)
{
// if we have a valid SkinInfo, cache per-joint bounding boxes for this LOD
LLPointer<LLMeshSkinInfo> skin_info = nullptr;
@@ -2306,7 +2408,7 @@ EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_p
}
if (skin_info.notNull() && isAgentAvatarValid())
{
- for (S32 i = 0; i < volume->getNumFaces(); ++i)
+ for (S32 i = 0; i < num_faces; ++i)
{
// NOTE: no need to lock gAgentAvatarp as the state being checked is not changed after initialization
LLVolumeFace& face = volume->getVolumeFace(i);
@@ -2325,6 +2427,11 @@ EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_p
// might be good idea to turn mesh into pointer to avoid making a copy
mesh.mVolume = NULL;
}
+ {
+ // make sure skin info is not removed from list while we are decreasing reference count
+ LLMutexLock lock(mSkinMapMutex);
+ skin_info = nullptr;
+ }
return MESH_OK;
}
}
@@ -2361,7 +2468,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);
@@ -2465,14 +2572,15 @@ EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_
{
LLMutexLock lock(mLoadedMutex);
- mDecompositionQ.push_back(d);
+ mPhysicsQ.push_back(d);
}
return MESH_OK;
}
-LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
+LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list_t& data, const LLMeshUploadThread::lod_sources_map_t& sources_list,
+ LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
- const std::string & upload_url, bool do_upload,
+ const std::string & upload_url, LLUUID destination_folder_id, bool do_upload,
LLHandle<LLWholeModelFeeObserver> fee_observer,
LLHandle<LLWholeModelUploadObserver> upload_observer)
: LLThread("mesh upload"),
@@ -2480,10 +2588,12 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
mDiscarded(false),
mDoUpload(do_upload),
mWholeModelUploadURL(upload_url),
+ mDestinationFolderId(destination_folder_id),
mFeeObserverHandle(fee_observer),
mUploadObserverHandle(upload_observer)
{
mInstanceList = data;
+ mLodSources = sources_list;
mUploadTextures = upload_textures;
mUploadSkin = upload_skin;
mUploadJoints = upload_joints;
@@ -2549,7 +2659,7 @@ void LLMeshUploadThread::DecompRequest::completed()
void LLMeshUploadThread::preStart()
{
//build map of LLModel refs to instances for callbacks
- for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
+ for (instance_list_t::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
{
mInstance[iter->mModel].push_back(*iter);
}
@@ -2583,6 +2693,8 @@ void dump_llsd_to_file(const LLSD& content, std::string filename)
{
if (gSavedSettings.getBOOL("MeshUploadLogXML"))
{
+ filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
+ filename);
llofstream of(filename.c_str());
LLSDSerialize::toPrettyXML(content,of);
}
@@ -2596,346 +2708,302 @@ LLSD llsd_from_file(std::string filename)
return result;
}
-void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
+void LLMeshUploadThread::packModelIntance(
+ LLModel* model,
+ LLMeshUploadThread::instance_list_t& instance_list,
+ std::string& model_name,
+ LLSD& res,
+ S32& mesh_num,
+ S32& texture_num,
+ S32& instance_num,
+ std::unordered_set<LLViewerTexture* >& textures,
+ std::unordered_map<LLViewerTexture*, S32> texture_index,
+ std::unordered_map<LLModel*, S32>& mesh_index,
+ std::vector<std::string>& texture_list_dest,
+ bool include_textures
+ )
{
- LLSD result;
-
- LLSD res;
- result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT);
- result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
- result["asset_type"] = "mesh";
- result["inventory_type"] = "object";
- result["description"] = "(No Description)";
- result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms("Uploads"));
- result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms("Uploads"));
- result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms("Uploads"));
-
- res["mesh_list"] = LLSD::emptyArray();
- res["texture_list"] = LLSD::emptyArray();
- res["instance_list"] = LLSD::emptyArray();
- S32 mesh_num = 0;
- S32 texture_num = 0;
-
- std::unordered_set<LLViewerTexture* > textures;
- std::unordered_map<LLViewerTexture*,S32> texture_index;
+ LLMeshUploadData data;
+ data.mBaseModel = model;
- std::unordered_map<LLModel*,S32> mesh_index;
- std::string model_name;
-
- S32 instance_num = 0;
-
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ LLModelInstance& first_instance = *(instance_list.begin());
+ for (S32 i = 0; i < 5; i++)
{
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
+ data.mModel[i] = first_instance.mLOD[i];
+ }
- if (data.mBaseModel->mSubmodelID)
+ if (mesh_index.find(data.mBaseModel) == mesh_index.end())
+ {
+ // Have not seen this model before - create a new mesh_list entry for it.
+ if (model_name.empty())
{
- // These are handled below to insure correct parenting order on creation
- // due to map walking being based on model address (aka random)
- continue;
+ model_name = data.mBaseModel->getName();
}
- LLModelInstance& first_instance = *(iter->second.begin());
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = first_instance.mLOD[i];
- }
+ std::stringstream ostr;
- if (mesh_index.find(data.mBaseModel) == mesh_index.end())
- {
- // Have not seen this model before - create a new mesh_list entry for it.
- if (model_name.empty())
- {
- model_name = data.mBaseModel->getName();
- }
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
- std::stringstream ostr;
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
+ LLSD mesh_header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints,
+ mLockScaleIfJointPosition,
+ LLModel::WRITE_BINARY,
+ false,
+ data.mBaseModel->mSubmodelID);
- decomp.mBaseHull = mHullMap[data.mBaseModel];
+ data.mAssetData = ostr.str();
+ std::string str = ostr.str();
- LLSD mesh_header = LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints,
- mLockScaleIfJointPosition,
- false,
- false,
- data.mBaseModel->mSubmodelID);
+ res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(), str.end());
+ mesh_index[data.mBaseModel] = mesh_num;
+ mesh_num++;
+ }
- data.mAssetData = ostr.str();
- std::string str = ostr.str();
+ // For all instances that use this model
+ for (instance_list_t::iterator instance_iter = instance_list.begin();
+ instance_iter != instance_list.end();
+ ++instance_iter)
+ {
+ LLModelInstance& instance = *instance_iter;
- res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
- mesh_index[data.mBaseModel] = mesh_num;
- mesh_num++;
- }
+ LLSD instance_entry;
- // For all instances that use this model
- for (instance_list::iterator instance_iter = iter->second.begin();
- instance_iter != iter->second.end();
- ++instance_iter)
+ for (S32 i = 0; i < 5; i++)
{
+ data.mModel[i] = instance.mLOD[i];
+ }
- LLModelInstance& instance = *instance_iter;
-
- LLSD instance_entry;
+ LLVector3 pos, scale;
+ LLQuaternion rot;
+ LLMatrix4 transformation = instance.mTransform;
+ decomposeMeshMatrix(transformation, pos, rot, scale);
+ instance_entry["position"] = ll_sd_from_vector3(pos);
+ instance_entry["rotation"] = ll_sd_from_quaternion(rot);
+ instance_entry["scale"] = ll_sd_from_vector3(scale);
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
+ instance_entry["material"] = LL_MCODE_WOOD;
+ if (model->mSubmodelID)
+ {
+ // Should it really be different?
+ instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_NONE);
+ }
+ else
+ {
+ instance_entry["physics_shape_type"] = data.mModel[LLModel::LOD_PHYSICS].notNull() ? (U8)(LLViewerObject::PHYSICS_SHAPE_PRIM) : (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ }
+ instance_entry["mesh"] = mesh_index[data.mBaseModel];
+ instance_entry["mesh_name"] = instance.mLabel;
- LLVector3 pos, scale;
- LLQuaternion rot;
- LLMatrix4 transformation = instance.mTransform;
- decomposeMeshMatrix(transformation,pos,rot,scale);
- instance_entry["position"] = ll_sd_from_vector3(pos);
- instance_entry["rotation"] = ll_sd_from_quaternion(rot);
- instance_entry["scale"] = ll_sd_from_vector3(scale);
+ instance_entry["face_list"] = LLSD::emptyArray();
- instance_entry["material"] = LL_MCODE_WOOD;
- instance_entry["physics_shape_type"] = data.mModel[LLModel::LOD_PHYSICS].notNull() ? (U8)(LLViewerObject::PHYSICS_SHAPE_PRIM) : (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
- instance_entry["mesh"] = mesh_index[data.mBaseModel];
- instance_entry["mesh_name"] = instance.mLabel;
+ // We want to be able to allow more than 8 materials...
+ //
+ S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), instance.mModel->getNumVolumeFaces());
- instance_entry["face_list"] = LLSD::emptyArray();
+ for (S32 face_num = 0; face_num < end; face_num++)
+ {
+ // multiple faces can reuse the same material
+ LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
+ LLSD face_entry = LLSD::emptyMap();
- // We want to be able to allow more than 8 materials...
- //
- S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), instance.mModel->getNumVolumeFaces()) ;
+ LLViewerFetchedTexture* texture = NULL;
- for (S32 face_num = 0; face_num < end; face_num++)
+ if (material.mDiffuseMapFilename.size())
{
- // multiple faces can reuse the same material
- LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
- LLSD face_entry = LLSD::emptyMap();
+ texture = FindViewerTexture(material);
+ }
- LLViewerFetchedTexture *texture = NULL;
+ if ((texture != NULL) &&
+ (textures.find(texture) == textures.end()))
+ {
+ textures.insert(texture);
+ }
- if (material.mDiffuseMapFilename.size())
+ std::stringstream texture_str;
+ if (texture != NULL && include_textures && mUploadTextures)
+ {
+ if (texture->hasSavedRawImage())
{
- texture = FindViewerTexture(material);
- }
+ LLImageDataLock lock(texture->getSavedRawImage());
- if ((texture != NULL) &&
- (textures.find(texture) == textures.end()))
- {
- textures.insert(texture);
- }
+ LLPointer<LLImageJ2C> upload_file =
+ LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
- std::stringstream texture_str;
- if (texture != NULL && include_textures && mUploadTextures)
- {
- if (texture->hasSavedRawImage())
+ if (!upload_file.isNull() && upload_file->getDataSize() && !upload_file->isBufferInvalid())
{
- LLImageDataLock lock(texture->getSavedRawImage());
-
- LLPointer<LLImageJ2C> upload_file =
- LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
-
- if (!upload_file.isNull() && upload_file->getDataSize())
- {
- texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
- }
+ texture_str.write((const char*)upload_file->getData(), upload_file->getDataSize());
}
}
+ }
- if (texture != NULL &&
- mUploadTextures &&
- texture_index.find(texture) == texture_index.end())
- {
- texture_index[texture] = texture_num;
- std::string str = texture_str.str();
- res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
- texture_num++;
- }
-
- // Subset of TextureEntry fields.
- if (texture != NULL && mUploadTextures)
- {
- face_entry["image"] = texture_index[texture];
- face_entry["scales"] = 1.0;
- face_entry["scalet"] = 1.0;
- face_entry["offsets"] = 0.0;
- face_entry["offsett"] = 0.0;
- face_entry["imagerot"] = 0.0;
- }
- face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor);
- face_entry["fullbright"] = material.mFullbright;
- instance_entry["face_list"][face_num] = face_entry;
+ if (texture != NULL &&
+ mUploadTextures &&
+ texture_index.find(texture) == texture_index.end())
+ {
+ texture_index[texture] = texture_num;
+ std::string str = texture_str.str();
+ res["texture_list"][texture_num] = LLSD::Binary(str.begin(), str.end());
+ // store indexes for error handling;
+ texture_list_dest.push_back(material.mDiffuseMapFilename);
+ texture_num++;
}
- res["instance_list"][instance_num] = instance_entry;
- instance_num++;
+ // Subset of TextureEntry fields.
+ if (texture != NULL && mUploadTextures)
+ {
+ face_entry["image"] = texture_index[texture];
+ face_entry["scales"] = 1.0;
+ face_entry["scalet"] = 1.0;
+ face_entry["offsets"] = 0.0;
+ face_entry["offsett"] = 0.0;
+ face_entry["imagerot"] = 0.0;
+ }
+ face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor);
+ face_entry["fullbright"] = material.mFullbright;
+ instance_entry["face_list"][face_num] = face_entry;
}
+
+ res["instance_list"][instance_num] = instance_entry;
+ instance_num++;
}
+}
+
+void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>& texture_list_dest, bool include_textures)
+{
+ LLSD result;
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ LLSD res;
+ if (mDestinationFolderId.isNull())
{
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
+ result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT);
+ result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
+ }
+ else
+ {
+ result["folder_id"] = mDestinationFolderId;
+ result["texture_folder_id"] = mDestinationFolderId;
+ }
+ result["asset_type"] = "mesh";
+ result["inventory_type"] = "object";
+ result["description"] = "(No Description)";
+ result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms("Uploads"));
+ result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms("Uploads"));
+ result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms("Uploads"));
+
+ res["mesh_list"] = LLSD::emptyArray();
+ res["texture_list"] = LLSD::emptyArray();
+ res["instance_list"] = LLSD::emptyArray();
+ LLSD& lod_sources = res["source_format"];
+ lod_sources["high"] = 0;
+ for (auto &source : mLodSources)
+ {
+ lod_sources[source.first] = source.second;
+ }
+ S32 mesh_num = 0;
+ S32 texture_num = 0;
+ S32 instance_num = 0;
+
+ std::unordered_set<LLViewerTexture* > textures;
+ std::unordered_map<LLViewerTexture*,S32> texture_index;
+
+ std::unordered_map<LLModel*,S32> mesh_index;
+ std::string model_name;
- if (!data.mBaseModel->mSubmodelID)
+ // If server gets a m1, m2, m3, m4 list, m1 becomes the root
+ // and the rest go as m4, m3, m2
+ // to counter that mInstance is sorted as m4, m3, m2, m1
+ // and we grab m1 from the end and send it first
+ LLModel* root_model = nullptr;
+ for (instance_map_t::reverse_iterator iter = mInstance.rbegin(); iter != mInstance.rend(); ++iter)
+ {
+ if (iter->first->mSubmodelID)
{
- // These were handled above already...
- //
+ // Submodel can't be root
continue;
}
-
- LLModelInstance& first_instance = *(iter->second.begin());
- for (S32 i = 0; i < 5; i++)
+ root_model = iter->first;
+ packModelIntance(
+ iter->first,
+ iter->second,
+ model_name,
+ res,
+ mesh_num,
+ texture_num,
+ instance_num,
+ textures,
+ texture_index,
+ mesh_index,
+ texture_list_dest,
+ include_textures);
+ break;
+ }
+
+ // Handle models, ignore submodels for now.
+ // Probably should pre-sort by mSubmodelID instead of running twice.
+ // Note: mInstance should be sorted by model name for the sake of
+ // deterministic order.
+ for (auto& iter : mInstance)
+ {
+ if (iter.first->mSubmodelID)
{
- data.mModel[i] = first_instance.mLOD[i];
+ // These are handled below to insure correct parenting order on creation
+ // due to map walking being based on model address (aka random)
+ continue;
}
-
- if (mesh_index.find(data.mBaseModel) == mesh_index.end())
+ if (root_model == iter.first)
{
- // Have not seen this model before - create a new mesh_list entry for it.
- if (model_name.empty())
- {
- model_name = data.mBaseModel->getName();
- }
-
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- decomp.mBaseHull = mHullMap[data.mBaseModel];
-
- LLSD mesh_header = LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints,
- mLockScaleIfJointPosition,
- false,
- false,
- data.mBaseModel->mSubmodelID);
-
- data.mAssetData = ostr.str();
- std::string str = ostr.str();
-
- res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
- mesh_index[data.mBaseModel] = mesh_num;
- mesh_num++;
+ // Reached root, root was already packed and is last non-submodel
+ break;
}
+ packModelIntance(
+ iter.first,
+ iter.second,
+ model_name,
+ res,
+ mesh_num,
+ texture_num,
+ instance_num,
+ textures,
+ texture_index,
+ mesh_index,
+ texture_list_dest,
+ include_textures);
+ }
- // For all instances that use this model
- for (instance_list::iterator instance_iter = iter->second.begin();
- instance_iter != iter->second.end();
- ++instance_iter)
+ // Now handle the submodels.
+ for (auto& iter : mInstance)
+ {
+ if (!iter.first->mSubmodelID)
{
-
- LLModelInstance& instance = *instance_iter;
-
- LLSD instance_entry;
-
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
-
- LLVector3 pos, scale;
- LLQuaternion rot;
- LLMatrix4 transformation = instance.mTransform;
- decomposeMeshMatrix(transformation,pos,rot,scale);
- instance_entry["position"] = ll_sd_from_vector3(pos);
- instance_entry["rotation"] = ll_sd_from_quaternion(rot);
- instance_entry["scale"] = ll_sd_from_vector3(scale);
-
- instance_entry["material"] = LL_MCODE_WOOD;
- instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_NONE);
- instance_entry["mesh"] = mesh_index[data.mBaseModel];
-
- instance_entry["face_list"] = LLSD::emptyArray();
-
- // We want to be able to allow more than 8 materials...
- //
- S32 end = llmin((S32)instance.mMaterial.size(), instance.mModel->getNumVolumeFaces()) ;
-
- for (S32 face_num = 0; face_num < end; face_num++)
- {
- LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
- LLSD face_entry = LLSD::emptyMap();
-
- LLViewerFetchedTexture *texture = NULL;
-
- if (material.mDiffuseMapFilename.size())
- {
- texture = FindViewerTexture(material);
- }
-
- if ((texture != NULL) &&
- (textures.find(texture) == textures.end()))
- {
- textures.insert(texture);
- }
-
- std::stringstream texture_str;
- if (texture != NULL && include_textures && mUploadTextures)
- {
- if (texture->hasSavedRawImage())
- {
- LLImageDataLock lock(texture->getSavedRawImage());
-
- LLPointer<LLImageJ2C> upload_file =
- LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
-
- if (!upload_file.isNull() && upload_file->getDataSize())
- {
- texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
- }
- }
- }
-
- if (texture != NULL &&
- mUploadTextures &&
- texture_index.find(texture) == texture_index.end())
- {
- texture_index[texture] = texture_num;
- std::string str = texture_str.str();
- res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
- texture_num++;
- }
-
- // Subset of TextureEntry fields.
- if (texture != NULL && mUploadTextures)
- {
- face_entry["image"] = texture_index[texture];
- face_entry["scales"] = 1.0;
- face_entry["scalet"] = 1.0;
- face_entry["offsets"] = 0.0;
- face_entry["offsett"] = 0.0;
- face_entry["imagerot"] = 0.0;
- }
- face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor);
- face_entry["fullbright"] = material.mFullbright;
- instance_entry["face_list"][face_num] = face_entry;
- }
-
- res["instance_list"][instance_num] = instance_entry;
- instance_num++;
+ // These were handled above already...
+ continue;
}
+ packModelIntance(
+ iter.first,
+ iter.second,
+ model_name,
+ res,
+ mesh_num,
+ texture_num,
+ instance_num,
+ textures,
+ texture_index,
+ mesh_index,
+ texture_list_dest,
+ include_textures);
}
if (model_name.empty()) model_name = "mesh model";
@@ -2951,7 +3019,7 @@ void LLMeshUploadThread::generateHulls()
{
bool has_valid_requests = false ;
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ for (instance_map_t::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
{
LLMeshUploadData data;
data.mBaseModel = iter->first;
@@ -3023,7 +3091,8 @@ void LLMeshUploadThread::doWholeModelUpload()
LL_DEBUGS(LOG_MESH) << "Hull generation completed." << LL_ENDL;
mModelData = LLSD::emptyMap();
- wholeModelToLLSD(mModelData, true);
+ mTextureFiles.clear();
+ wholeModelToLLSD(mModelData, mTextureFiles, true);
LLSD body = mModelData["asset_resources"];
dump_llsd_to_file(body, make_dump_name("whole_model_body_", dump_num));
@@ -3076,7 +3145,8 @@ void LLMeshUploadThread::requestWholeModelFee()
generateHulls();
mModelData = LLSD::emptyMap();
- wholeModelToLLSD(mModelData, false);
+ mTextureFiles.clear();
+ wholeModelToLLSD(mModelData, mTextureFiles, false);
dump_llsd_to_file(mModelData, make_dump_name("whole_model_fee_request_", dump_num));
LLCore::HttpHandle handle = LLCoreHttpUtil::requestPostWithLLSD(mHttpRequest,
mHttpPolicyClass,
@@ -3142,7 +3212,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp
body["error"] = LLSD::emptyMap();
body["error"]["message"] = reason;
body["error"]["identifier"] = "NetworkError"; // from asset-upload/upload_util.py
- log_upload_error(status, body, "upload", mModelData["name"].asString());
+ log_upload_error(status, body, "upload", mModelData["name"].asString(), mTextureFiles);
if (observer)
{
@@ -3177,7 +3247,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp
else
{
LL_WARNS(LOG_MESH) << "Upload failed. Not in expected 'complete' state." << LL_ENDL;
- log_upload_error(status, body, "upload", mModelData["name"].asString());
+ log_upload_error(status, body, "upload", mModelData["name"].asString(), mTextureFiles);
if (observer)
{
@@ -3202,7 +3272,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp
body["error"] = LLSD::emptyMap();
body["error"]["message"] = reason;
body["error"]["identifier"] = "NetworkError"; // from asset-upload/upload_util.py
- log_upload_error(status, body, "fee", mModelData["name"].asString());
+ log_upload_error(status, body, "fee", mModelData["name"].asString(), mTextureFiles);
if (observer)
{
@@ -3235,7 +3305,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp
else
{
LL_WARNS(LOG_MESH) << "Fee request failed. Not in expected 'upload' state." << LL_ENDL;
- log_upload_error(status, body, "fee", mModelData["name"].asString());
+ log_upload_error(status, body, "fee", mModelData["name"].asString(), mTextureFiles);
if (observer)
{
@@ -3313,13 +3383,14 @@ void LLMeshRepoThread::notifyLoadedMeshes()
}
}
- if (!mSkinInfoQ.empty() || !mSkinUnavailableQ.empty() || ! mDecompositionQ.empty())
+ if (!mSkinInfoQ.empty() || !mSkinUnavailableQ.empty() || !mDecompositionQ.empty() || !mPhysicsQ.empty())
{
if (mLoadedMutex->trylock())
{
std::deque<LLPointer<LLMeshSkinInfo>> skin_info_q;
std::deque<UUIDBasedRequest> skin_info_unavail_q;
std::list<LLModel::Decomposition*> decomp_q;
+ std::list<LLModel::Decomposition*> physics_q;
if (! mSkinInfoQ.empty())
{
@@ -3336,6 +3407,11 @@ void LLMeshRepoThread::notifyLoadedMeshes()
decomp_q.swap(mDecompositionQ);
}
+ if (!mPhysicsQ.empty())
+ {
+ physics_q.swap(mPhysicsQ);
+ }
+
mLoadedMutex->unlock();
// Process the elements free of the lock
@@ -3352,9 +3428,15 @@ void LLMeshRepoThread::notifyLoadedMeshes()
while (! decomp_q.empty())
{
- gMeshRepo.notifyDecompositionReceived(decomp_q.front());
+ gMeshRepo.notifyDecompositionReceived(decomp_q.front(), false);
decomp_q.pop_front();
}
+
+ while (!physics_q.empty())
+ {
+ gMeshRepo.notifyDecompositionReceived(physics_q.front(), true);
+ physics_q.pop_front();
+ }
}
}
@@ -3792,6 +3874,11 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body
[shrd_handler, data, data_size]
()
{
+ if (gMeshRepo.mThread->isShuttingDown())
+ {
+ delete[] data;
+ return;
+ }
LLMeshLODHandler* handler = (LLMeshLODHandler * )shrd_handler.get();
handler->processLod(data, data_size);
delete[] data;
@@ -3905,6 +3992,11 @@ void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /*
[shrd_handler, data, data_size]
()
{
+ if (gMeshRepo.mThread->isShuttingDown())
+ {
+ delete[] data;
+ return;
+ }
LLMeshSkinInfoHandler* handler = (LLMeshSkinInfoHandler*)shrd_handler.get();
handler->processSkin(data, data_size);
delete[] data;
@@ -4127,8 +4219,7 @@ void LLMeshRepository::shutdown()
mUploads[i]->discard() ; //discard the uploading requests.
}
- mThread->mSignal->broadcast();
- mThread->mMeshThreadPool->close();
+ mThread->cleanup();
while (!mThread->isStopped())
{
@@ -4193,13 +4284,13 @@ void LLMeshRepository::unregisterMesh(LLVOVolume* vobj)
{
for (auto& param : lod)
{
- vector_replace_with_last(param.second, vobj);
+ vector_replace_with_last(param.second.mVolumes, vobj);
}
}
for (auto& skin_pair : mLoadingSkins)
{
- vector_replace_with_last(skin_pair.second, vobj);
+ vector_replace_with_last(skin_pair.second.mVolumes, vobj);
}
}
@@ -4222,16 +4313,17 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
mesh_load_map::iterator iter = mLoadingMeshes[new_lod].find(mesh_id);
if (iter != mLoadingMeshes[new_lod].end())
{ //request pending for this mesh, append volume id to list
- auto it = std::find(iter->second.begin(), iter->second.end(), vobj);
- if (it == iter->second.end()) {
- iter->second.push_back(vobj);
+ auto it = std::find(iter->second.mVolumes.begin(), iter->second.mVolumes.end(), vobj);
+ if (it == iter->second.mVolumes.end()) {
+ iter->second.addVolume(vobj);
}
}
else
{
//first request for this mesh
- mLoadingMeshes[new_lod][mesh_id].push_back(vobj);
- mPendingRequests.emplace_back(new PendingRequestLOD(mesh_params, new_lod));
+ std::shared_ptr<PendingRequestBase> request(new PendingRequestLOD(mesh_params, new_lod));
+ mPendingRequests.emplace_back(request);
+ mLoadingMeshes[new_lod][mesh_id].initData(vobj, request);
LLMeshRepository::sLODPending++;
}
}
@@ -4290,50 +4382,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
return new_lod;
}
-F32 calculate_score(LLVOVolume* object)
-{
- if (!object)
- {
- return -1.f;
- }
- LLDrawable* drawable = object->mDrawable;
- if (!drawable)
- {
- return -1;
- }
- if (drawable->isState(LLDrawable::RIGGED) || object->isAttachment())
- {
- LLVOAvatar* avatar = object->getAvatar();
- LLDrawable* av_drawable = avatar ? avatar->mDrawable : nullptr;
- if (avatar && av_drawable)
- {
- // See LLVOVolume::calcLOD()
- F32 radius;
- if (avatar->isControlAvatar())
- {
- const LLVector3* box = avatar->getLastAnimExtents();
- LLVector3 diag = box[1] - box[0];
- radius = diag.magVec() * 0.5f;
- }
- else
- {
- // Volume in a rigged mesh attached to a regular avatar.
- const LLVector3* box = avatar->getLastAnimExtents();
- LLVector3 diag = box[1] - box[0];
- radius = diag.magVec();
-
- if (!avatar->isSelf() && !avatar->hasFirstFullAttachmentData())
- {
- // slightly deprioritize avatars that are still receiving data
- radius *= 0.9f;
- }
- }
- return radius / llmax(av_drawable->mDistanceWRTCamera, 1.f);
- }
- }
- return drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f);
-}
-
void LLMeshRepository::notifyLoadedMeshes()
{ //called from main thread
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; //LL_RECORD_BLOCK_TIME(FTM_MESH_FETCH);
@@ -4470,13 +4518,20 @@ void LLMeshRepository::notifyLoadedMeshes()
{
LLMutexTrylock lock1(mMeshMutex);
LLMutexTrylock lock2(mThread->mMutex);
+ LLMutexTrylock lock3(mThread->mHeaderMutex);
+ LLMutexTrylock lock4(mThread->mPendingMutex);
static U32 hold_offs(0);
- if (! lock1.isLocked() || ! lock2.isLocked())
+ if (! lock1.isLocked() || ! lock2.isLocked() || ! lock3.isLocked() || ! lock4.isLocked())
{
// If we can't get the locks, skip and pick this up later.
+ // Eventually thread queue will be free enough
++hold_offs;
sMaxLockHoldoffs = llmax(sMaxLockHoldoffs, hold_offs);
+ if (hold_offs > 4)
+ {
+ LL_WARNS_ONCE() << "High mesh thread holdoff" << LL_ENDL;
+ }
return;
}
hold_offs = 0;
@@ -4523,61 +4578,25 @@ void LLMeshRepository::notifyLoadedMeshes()
if (mPendingRequests.size() > push_count)
{
+ LL_PROFILE_ZONE_NAMED("Mesh score update");
// More requests than the high-water limit allows so
// sort and forward the most important.
- //calculate "score" for pending requests
-
- //create score map
- std::map<LLUUID, F32> score_map;
-
- for (U32 i = 0; i < LLVolumeLODGroup::NUM_LODS; ++i)
+ // update "score" for pending requests
+ for (std::shared_ptr<PendingRequestBase>& req_p : mPendingRequests)
{
- for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
- {
- F32 max_score = 0.f;
- for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
- {
- F32 cur_score = calculate_score(*obj_iter);
- if (cur_score >= 0.f)
- {
- max_score = llmax(max_score, cur_score);
- }
- }
-
- score_map[iter->first] = max_score;
- }
- }
- for (mesh_load_map::iterator iter = mLoadingSkins.begin(); iter != mLoadingSkins.end(); ++iter)
- {
- F32 max_score = 0.f;
- for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
- {
- F32 cur_score = calculate_score(*obj_iter);
- if (cur_score >= 0.f)
- {
- max_score = llmax(max_score, cur_score);
- }
- }
-
- score_map[iter->first] = max_score;
- }
-
- //set "score" for pending requests
- for (std::unique_ptr<PendingRequestBase>& req_p : mPendingRequests)
- {
- req_p->setScore(score_map[req_p->getId()]);
+ req_p->checkScore();
}
//sort by "score"
std::partial_sort(mPendingRequests.begin(), mPendingRequests.begin() + push_count,
mPendingRequests.end(), PendingRequestBase::CompareScoreGreater());
}
- LLMutexTrylock lock3(mThread->mHeaderMutex);
- LLMutexTrylock lock4(mThread->mPendingMutex);
while (!mPendingRequests.empty() && push_count > 0)
{
- std::unique_ptr<PendingRequestBase>& req_p = mPendingRequests.front();
+ std::shared_ptr<PendingRequestBase>& req_p = mPendingRequests.front();
+ // todo: check hasTrackedData here and erase request if none
+ // since this is supposed to mean that request was removed
switch (req_p->getRequestType())
{
case MESH_REQUEST_LOD:
@@ -4632,7 +4651,7 @@ void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo* info)
skin_load_map::iterator iter = mLoadingSkins.find(info->mMeshID);
if (iter != mLoadingSkins.end())
{
- for (LLVOVolume* vobj : iter->second)
+ for (LLVOVolume* vobj : iter->second.mVolumes)
{
if (vobj)
{
@@ -4648,7 +4667,7 @@ void LLMeshRepository::notifySkinInfoUnavailable(const LLUUID& mesh_id)
skin_load_map::iterator iter = mLoadingSkins.find(mesh_id);
if (iter != mLoadingSkins.end())
{
- for (LLVOVolume* vobj : iter->second)
+ for (LLVOVolume* vobj : iter->second.mVolumes)
{
if (vobj)
{
@@ -4659,13 +4678,13 @@ void LLMeshRepository::notifySkinInfoUnavailable(const LLUUID& mesh_id)
}
}
-void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp)
+void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp, bool physics_mesh)
{
- decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID);
+ LLUUID decomp_id = decomp->mMeshID; // Copy to avoid invalidation in below deletion
+ decomposition_map::iterator iter = mDecompositionMap.find(decomp_id);
if (iter == mDecompositionMap.end())
{ //just insert decomp into map
- mDecompositionMap[decomp->mMeshID] = decomp;
- mLoadingDecompositions.erase(decomp->mMeshID);
+ mDecompositionMap[decomp_id] = decomp;
sCacheBytesDecomps += decomp->sizeBytes();
}
else
@@ -4673,10 +4692,17 @@ void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decom
sCacheBytesDecomps -= iter->second->sizeBytes();
iter->second->merge(decomp);
sCacheBytesDecomps += iter->second->sizeBytes();
-
- mLoadingDecompositions.erase(decomp->mMeshID);
delete decomp;
}
+
+ if (physics_mesh)
+ {
+ mLoadingPhysicsShapes.erase(decomp_id);
+ }
+ else
+ {
+ mLoadingDecompositions.erase(decomp_id);
+ }
}
void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume, S32 lod)
@@ -4712,7 +4738,7 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol
}
//notify waiting LLVOVolume instances that their requested mesh is available
- for (LLVOVolume* vobj : obj_iter->second)
+ for (LLVOVolume* vobj : obj_iter->second.mVolumes)
{
if (vobj)
{
@@ -4742,7 +4768,7 @@ void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params,
LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
}
- for (LLVOVolume* vobj : obj_iter->second)
+ for (LLVOVolume* vobj : obj_iter->second.mVolumes)
{
if (vobj)
{
@@ -4785,16 +4811,17 @@ const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOV
skin_load_map::iterator iter = mLoadingSkins.find(mesh_id);
if (iter != mLoadingSkins.end())
{ //request pending for this mesh, append volume id to list
- auto it = std::find(iter->second.begin(), iter->second.end(), requesting_obj);
- if (it == iter->second.end()) {
- iter->second.push_back(requesting_obj);
+ auto it = std::find(iter->second.mVolumes.begin(), iter->second.mVolumes.end(), requesting_obj);
+ if (it == iter->second.mVolumes.end()) {
+ iter->second.addVolume(requesting_obj);
}
}
else
{
//first request for this mesh
- mLoadingSkins[mesh_id].push_back(requesting_obj);
- mPendingRequests.emplace_back(new PendingRequestUUID(mesh_id, MESH_REQUEST_SKIN));
+ std::shared_ptr<PendingRequestBase> request(new PendingRequestUUID(mesh_id, MESH_REQUEST_SKIN));
+ mLoadingSkins[mesh_id].initData(requesting_obj, request);
+ mPendingRequests.emplace_back(request);
}
}
}
@@ -4822,7 +4849,6 @@ void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
std::unordered_set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id);
if (iter == mLoadingPhysicsShapes.end())
{ //no request pending for this skin info
- // *FIXME: Nothing ever deletes entries, can't be right
mLoadingPhysicsShapes.insert(mesh_id);
mPendingPhysicsShapeRequests.push(mesh_id);
}
@@ -4971,14 +4997,15 @@ bool LLMeshRepoThread::hasHeader(const LLUUID& mesh_id) const
return iter != mMeshHeader.end();
}
-void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
+void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, const std::map<std::string, std::string> &lod_sources,
+ LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
- std::string upload_url, bool do_upload,
+ std::string upload_url, const LLUUID& destination_folder_id, bool do_upload,
LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)
{
- LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures,
+ LLMeshUploadThread* thread = new LLMeshUploadThread(data, lod_sources, scale, upload_textures,
upload_skin, upload_joints, lock_scale_if_joint_position,
- upload_url, do_upload, fee_observer, upload_observer);
+ upload_url, destination_folder_id, do_upload, fee_observer, upload_observer);
mUploadWaitList.push_back(thread);
}
@@ -5968,13 +5995,7 @@ bool LLMeshRepository::meshUploadEnabled()
bool LLMeshRepository::meshRezEnabled()
{
static LLCachedControl<bool> mesh_enabled(gSavedSettings, "MeshEnabled");
- LLViewerRegion *region = gAgent.getRegion();
- if(mesh_enabled &&
- region)
- {
- return region->meshRezEnabled();
- }
- return false;
+ return mesh_enabled;
}
// Threading: main thread only
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 0d9da32e27..01b51e753e 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -168,7 +168,6 @@ public:
void submitRequest(Request* request);
static S32 llcdCallback(const char*, S32, S32);
- void cancel();
void setMeshData(LLCDMeshData& mesh, bool vertex_based);
void doDecomposition();
@@ -206,19 +205,19 @@ private:
LLFrameTimer mTimer;
};
-
+class MeshLoadData;
class PendingRequestBase
{
public:
struct CompareScoreGreater
{
- bool operator()(const std::unique_ptr<PendingRequestBase>& lhs, const std::unique_ptr<PendingRequestBase>& rhs)
+ bool operator()(const std::shared_ptr<PendingRequestBase>& lhs, const std::shared_ptr<PendingRequestBase>& rhs)
{
return lhs->mScore > rhs->mScore; // greatest = first
}
};
- PendingRequestBase() : mScore(0.f) {};
+ PendingRequestBase() : mScore(0.f), mTrackedData(nullptr), mScoreDirty(true) {};
virtual ~PendingRequestBase() {}
bool operator<(const PendingRequestBase& rhs) const
@@ -226,14 +225,34 @@ public:
return mId < rhs.mId;
}
- void setScore(F32 score) { mScore = score; }
F32 getScore() const { return mScore; }
+ void checkScore()
+ {
+ constexpr F32 EXPIRE_TIME_SECS = 8.f;
+ if (mScoreTimer.getElapsedTimeF32() > EXPIRE_TIME_SECS || mScoreDirty)
+ {
+ updateScore();
+ mScoreDirty = false;
+ mScoreTimer.reset();
+ }
+ };
+
LLUUID getId() const { return mId; }
virtual EMeshRequestType getRequestType() const = 0;
+ void trackData(MeshLoadData* data) { mTrackedData = data; mScoreDirty = true; }
+ void untrackData() { mTrackedData = nullptr; }
+ bool hasTrackedData() { return mTrackedData != nullptr; }
+ void setScoreDirty() { mScoreDirty = true; }
+
protected:
- F32 mScore;
+ void updateScore();
+
LLUUID mId;
+ F32 mScore;
+ bool mScoreDirty;
+ LLTimer mScoreTimer;
+ MeshLoadData* mTrackedData;
};
class PendingRequestLOD : public PendingRequestBase
@@ -267,6 +286,37 @@ private:
EMeshRequestType mRequestType;
};
+
+class MeshLoadData
+{
+public:
+ MeshLoadData() {}
+ ~MeshLoadData()
+ {
+ if (std::shared_ptr<PendingRequestBase> request = mRequest.lock())
+ {
+ request->untrackData();
+ }
+ }
+ void initData(LLVOVolume* vol, std::shared_ptr<PendingRequestBase>& request)
+ {
+ mVolumes.push_back(vol);
+ request->trackData(this);
+ mRequest = request;
+ }
+ void addVolume(LLVOVolume* vol)
+ {
+ mVolumes.push_back(vol);
+ if (std::shared_ptr<PendingRequestBase> request = mRequest.lock())
+ {
+ request->setScoreDirty();
+ }
+ }
+ std::vector<LLVOVolume*> mVolumes;
+private:
+ std::weak_ptr<PendingRequestBase> mRequest;
+};
+
class LLMeshHeader
{
public:
@@ -471,6 +521,9 @@ public:
// list of completed Decomposition info requests
std::list<LLModel::Decomposition*> mDecompositionQ;
+ // list of completed Physics Mesh info requests
+ std::list<LLModel::Decomposition*> mPhysicsQ;
+
//queue of requested headers
std::queue<HeaderRequest> mHeaderReqQ;
@@ -515,6 +568,8 @@ public:
~LLMeshRepoThread();
virtual void run();
+ void cleanup();
+ bool isShuttingDown() { return mShuttingDown; }
void lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
@@ -583,6 +638,7 @@ private:
U8* getDiskCacheBuffer(S32 size);
S32 mDiskCacheBufferSize = 0;
U8* mDiskCacheBuffer = nullptr;
+ bool mShuttingDown = false;
};
@@ -615,14 +671,31 @@ public:
LLPointer<DecompRequest> mFinalDecomp;
volatile bool mPhysicsComplete;
- typedef std::map<LLPointer<LLModel>, std::vector<LLVector3> > hull_map;
- hull_map mHullMap;
+ typedef std::map<LLPointer<LLModel>, std::vector<LLVector3> > hull_map_t;
+ hull_map_t mHullMap;
- typedef std::vector<LLModelInstance> instance_list;
- instance_list mInstanceList;
+ typedef std::vector<LLModelInstance> instance_list_t;
+ instance_list_t mInstanceList;
- typedef std::map<LLPointer<LLModel>, instance_list> instance_map;
- instance_map mInstance;
+ // Upload should happen in deterministic order, so sort instances by model name.
+ struct LLUploadModelInstanceLess
+ {
+ inline bool operator()(const LLPointer<LLModel>& a, const LLPointer<LLModel>& b) const
+ {
+ if (a.isNull() || b.isNull())
+ {
+ llassert(false); // We are uploading these models, they shouldn't be null.
+ return true;
+ }
+ // Note: probably can sort by mBaseModel->mSubmodelID here as well to avoid
+ // running over the list twice in wholeModelToLLSD.
+ return a->mLabel > b->mLabel;
+ }
+ };
+ typedef std::map<LLPointer<LLModel>, instance_list_t, LLUploadModelInstanceLess> instance_map_t;
+ instance_map_t mInstance;
+ typedef std::map<std::string, std::string> lod_sources_map_t;
+ lod_sources_map_t mLodSources;
LLMutex* mMutex;
S32 mPendingUploads;
@@ -637,10 +710,14 @@ public:
LLHost mHost;
std::string mWholeModelFeeCapability;
std::string mWholeModelUploadURL;
+ LLUUID mDestinationFolderId;
- LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures,
+ LLMeshUploadThread(instance_list_t& data, const lod_sources_map_t& sources_list,
+ LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
- const std::string & upload_url, bool do_upload = true,
+ const std::string & upload_url,
+ const LLUUID destination_folder_id = LLUUID::null,
+ bool do_upload = true,
LLHandle<LLWholeModelFeeObserver> fee_observer = (LLHandle<LLWholeModelFeeObserver>()),
LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
~LLMeshUploadThread();
@@ -656,7 +733,7 @@ public:
void doWholeModelUpload();
void requestWholeModelFee();
- void wholeModelToLLSD(LLSD& dest, bool include_textures);
+ void wholeModelToLLSD(LLSD& dest, std::vector<std::string>& texture_list_dest, bool include_textures);
void decomposeMeshMatrix(LLMatrix4& transformation,
LLVector3& result_pos,
@@ -671,12 +748,29 @@ public:
static LLViewerFetchedTexture* FindViewerTexture(const LLImportMaterial& material);
+protected:
+ void packModelIntance(
+ LLModel* model,
+ LLMeshUploadThread::instance_list_t& instance_list,
+ std::string& model_name,
+ LLSD& res,
+ S32& mesh_num,
+ S32& texture_num,
+ S32& instance_num,
+ std::unordered_set<LLViewerTexture* > &textures,
+ std::unordered_map<LLViewerTexture*, S32> texture_index,
+ std::unordered_map<LLModel*, S32>& mesh_index,
+ std::vector<std::string>& texture_list_dest,
+ bool include_textures
+ );
+
private:
LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle;
LLHandle<LLWholeModelUploadObserver> mUploadObserverHandle;
bool mDoUpload; // if false only model data will be requested, otherwise the model will be uploaded
LLSD mModelData;
+ std::vector<std::string> mTextureFiles;
// llcorehttp library interface objects.
LLCore::HttpStatus mHttpStatus;
@@ -780,7 +874,7 @@ public:
void notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 request_lod, S32 volume_lod);
void notifySkinInfoReceived(LLMeshSkinInfo* info);
void notifySkinInfoUnavailable(const LLUUID& info);
- void notifyDecompositionReceived(LLModel::Decomposition* info);
+ void notifyDecompositionReceived(LLModel::Decomposition* info, bool physics_mesh);
S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
static S32 getActualMeshLOD(LLMeshHeader& header, S32 lod);
@@ -797,9 +891,12 @@ public:
bool meshUploadEnabled();
bool meshRezEnabled();
- void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
+ void uploadModel(std::vector<LLModelInstance>& data, const std::map<std::string, std::string> &lod_sources,
+ LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
- std::string upload_url, bool do_upload = true,
+ std::string upload_url,
+ const LLUUID& destination_folder_id = LLUUID::null,
+ bool do_upload = true,
LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()),
LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
@@ -811,7 +908,7 @@ public:
static void metricsProgress(unsigned int count);
static void metricsUpdate();
- typedef std::unordered_map<LLUUID, std::vector<LLVOVolume*> > mesh_load_map;
+ typedef std::unordered_map<LLUUID, MeshLoadData> mesh_load_map;
mesh_load_map mLoadingMeshes[4];
typedef std::unordered_map<LLUUID, LLPointer<LLMeshSkinInfo>> skin_map;
@@ -822,11 +919,11 @@ public:
LLMutex* mMeshMutex;
- typedef std::vector <std::unique_ptr<PendingRequestBase> > pending_requests_vec;
+ typedef std::vector <std::shared_ptr<PendingRequestBase> > pending_requests_vec;
pending_requests_vec mPendingRequests;
//list of mesh ids awaiting skin info
- typedef std::unordered_map<LLUUID, std::vector<LLVOVolume*> > skin_load_map;
+ typedef std::unordered_map<LLUUID, MeshLoadData > skin_load_map;
skin_load_map mLoadingSkins;
//list of mesh ids awaiting decompositions
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 64ea1710f5..6a7c25ec0f 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -30,7 +30,7 @@
#include "llmodelloader.h"
#include "lldaeloader.h"
-#include "llgltfloader.h"
+#include "gltf/llgltfloader.h"
#include "llfloatermodelpreview.h"
#include "llagent.h"
@@ -40,6 +40,7 @@
#include "lldrawable.h"
#include "llface.h"
#include "lliconctrl.h"
+#include "lljointdata.h"
#include "llmatrix4a.h"
#include "llmeshrepository.h"
#include "llmeshoptimizer.h"
@@ -132,20 +133,21 @@ std::string getLodSuffix(S32 lod)
return suffix;
}
-void FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut)
+static bool FindModel(const LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut)
{
- for (auto scene_iter = scene.begin(); scene_iter != scene.end(); scene_iter++)
+ for (const auto& scene_pair : scene)
{
- for (auto model_iter = scene_iter->second.begin(); model_iter != scene_iter->second.end(); model_iter++)
+ for (const auto& model_iter : scene_pair.second)
{
- if (model_iter->mModel && (model_iter->mModel->mLabel == name_to_match))
+ if (model_iter.mModel && (model_iter.mModel->mLabel == name_to_match))
{
- baseModelOut = model_iter->mModel;
- matOut = scene_iter->first;
- return;
+ baseModelOut = model_iter.mModel;
+ matOut = scene_pair.first;
+ return true;
}
}
}
+ return false;
}
//-----------------------------------------------------------------------------
@@ -162,10 +164,14 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
, mPhysicsSearchLOD(LLModel::LOD_PHYSICS)
, mResetJoints(false)
, mModelNoErrors(true)
+ , mLoading(false)
+ , mModelLoader(nullptr)
, mLastJointUpdate(false)
, mFirstSkinUpdate(true)
, mHasDegenerate(false)
- , mImporterDebug(LLCachedControl<bool>(gSavedSettings, "ImporterDebug", false))
+ , mNumOfFetchingTextures(0)
+ , mTexturesNeedScaling(false)
+ , mImporterDebug(LLCachedControl<bool>(gSavedSettings, "ImporterDebugVerboseLogging", false))
{
mNeedsUpdate = true;
mCameraDistance = 0.f;
@@ -174,11 +180,9 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
mCameraZoom = 1.f;
mTextureName = 0;
mPreviewLOD = 0;
- mModelLoader = NULL;
mMaxTriangleLimit = 0;
mDirty = false;
mGenLOD = false;
- mLoading = false;
mLookUpLodFiles = false;
mLoadState = LLModelLoader::STARTING;
mGroup = 0;
@@ -210,6 +214,7 @@ LLModelPreview::~LLModelPreview()
{
mModelLoader->shutdown();
mModelLoader = NULL;
+ mLoading = false;
}
if (mPreviewAvatar)
@@ -319,10 +324,8 @@ void LLModelPreview::rebuildUploadData()
mat *= scale_mat;
- for (auto model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
- { // for each instance with said transform applied
- LLModelInstance instance = *model_iter;
-
+ for (LLModelInstance& instance : iter->second)
+ { //for each instance with said transform applied
LLModel* base_model = instance.mModel;
if (base_model && !requested_name.empty())
@@ -354,7 +357,7 @@ void LLModelPreview::rebuildUploadData()
}
else
{
- //Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for
+ // Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for
extensionLOD = mPhysicsSearchLOD;
}
@@ -365,9 +368,9 @@ void LLModelPreview::rebuildUploadData()
name_to_match += toAdd;
}
- FindModel(mScene[i], name_to_match, lod_model, transform);
+ bool found = FindModel(mScene[i], name_to_match, lod_model, transform);
- if (!lod_model && i != LLModel::LOD_PHYSICS)
+ if (!found && i != LLModel::LOD_PHYSICS)
{
if (mImporterDebug)
{
@@ -380,7 +383,7 @@ void LLModelPreview::rebuildUploadData()
}
int searchLOD = (i > LLModel::LOD_HIGH) ? LLModel::LOD_HIGH : i;
- while ((searchLOD <= LLModel::LOD_HIGH) && !lod_model)
+ for (; searchLOD <= LLModel::LOD_HIGH; ++searchLOD)
{
std::string name_to_match = instance.mLabel;
llassert(!name_to_match.empty());
@@ -394,8 +397,8 @@ void LLModelPreview::rebuildUploadData()
// See if we can find an appropriately named model in LOD 'searchLOD'
//
- FindModel(mScene[searchLOD], name_to_match, lod_model, transform);
- searchLOD++;
+ if (FindModel(mScene[searchLOD], name_to_match, lod_model, transform))
+ break;
}
}
}
@@ -558,10 +561,7 @@ void LLModelPreview::rebuildUploadData()
texture->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, true, false, new LLHandle<LLModelPreview>(getHandle()), &mCallbackTextureList, false);
texture->forceToSaveRawImage(0, F32_MAX);
texture->updateFetch();
- if (mModelLoader)
- {
- mModelLoader->mNumOfFetchingTextures++;
- }
+ mNumOfFetchingTextures++;
}
}
}
@@ -576,7 +576,7 @@ void LLModelPreview::rebuildUploadData()
for (U32 model_ind = 0; model_ind < mModel[lod].size(); ++model_ind)
{
bool found_model = false;
- for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
{
LLModelInstance& instance = *iter;
if (instance.mLOD[lod] == mModel[lod][model_ind])
@@ -692,7 +692,7 @@ void LLModelPreview::saveUploadData(const std::string& filename,
save_skinweights,
save_joint_positions,
lock_scale_if_joint_position,
- false, true, instance.mModel->mSubmodelID);
+ LLModel::WRITE_BINARY, true, instance.mModel->mSubmodelID);
data["mesh"][instance.mModel->mLocalID] = str.str();
}
@@ -754,6 +754,10 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
LL_WARNS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true);
assert(lod >= LLModel::LOD_IMPOSTOR && lod < LLModel::NUM_LODS);
+ if (mModelLoader == nullptr)
+ {
+ mLoading = false;
+ }
return;
}
@@ -781,7 +785,7 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
mLODFile[lod] = filename;
- std::map<std::string, std::string> joint_alias_map;
+ std::map<std::string, std::string, std::less<>> joint_alias_map;
getJointAliases(joint_alias_map);
LLHandle<LLModelPreview> preview_handle = getHandle();
@@ -807,10 +811,14 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
joint_alias_map,
LLSkinningUtil::getMaxJointCount(),
gSavedSettings.getU32("ImporterModelLimit"),
+ gSavedSettings.getU32("ImporterDebugMode"),
gSavedSettings.getBOOL("ImporterPreprocessDAE"));
}
else
{
+ LLVOAvatar* av = getPreviewAvatar();
+ std::vector<LLJointData> viewer_skeleton;
+ av->getJointMatricesAndHierarhy(viewer_skeleton);
mModelLoader = new LLGLTFLoader(
filename,
lod,
@@ -823,7 +831,9 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
mJointsFromNode,
joint_alias_map,
LLSkinningUtil::getMaxJointCount(),
- gSavedSettings.getU32("ImporterModelLimit"));
+ gSavedSettings.getU32("ImporterModelLimit"),
+ gSavedSettings.getU32("ImporterDebugMode"),
+ viewer_skeleton);
}
if (force_disable_slm)
@@ -986,7 +996,9 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
setRigValidForJointPositionUpload(mModelLoader->isRigValidForJointPositionUpload());
setLegacyRigFlags(mModelLoader->getLegacyRigFlags());
+ mTexturesNeedScaling |= mModelLoader->mTexturesNeedScaling;
mModelLoader->loadTextures();
+ warnTextureScaling();
if (loaded_lod == -1)
{ //populate all LoDs from model loader scene
@@ -1174,8 +1186,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
LLModel* found_model = NULL;
LLMatrix4 transform;
- FindModel(mBaseScene, loaded_name, found_model, transform);
- if (found_model)
+ if (FindModel(mBaseScene, loaded_name, found_model, transform))
{ // don't rename correctly named models (even if they are placed in a wrong order)
name_based = true;
}
@@ -1809,7 +1820,7 @@ F32 LLModelPreview::genMeshOptimizerPerFace(LLModel *base_model, LLModel *target
void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 decimation, bool enforce_tri_limit)
{
- LL_INFOS() << "Generating lod " << which_lod << " using meshoptimizer" << LL_ENDL;
+ LL_DEBUGS("Upload") << "Generating lod " << which_lod << " using meshoptimizer" << LL_ENDL;
// Allow LoD from -1 to LLModel::LOD_PHYSICS
if (which_lod < -1 || which_lod > LLModel::NUM_LODS - 1)
{
@@ -1886,6 +1897,12 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
mMaxTriangleLimit = base_triangle_count;
+ // For logging purposes
+ S32 meshes_processed = 0;
+ S32 meshes_simplified = 0;
+ S32 meshes_sloppy_simplified = 0;
+ S32 meshes_fail_count = 0;
+
// Build models
S32 start = LLModel::LOD_HIGH;
@@ -1895,7 +1912,7 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
{
start = which_lod;
end = which_lod;
- }
+ };
for (S32 lod = start; lod >= end; --lod)
{
@@ -1958,6 +1975,11 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
const LLVolumeFace &face = base->getVolumeFace(face_idx);
LLVolumeFace &new_face = target_model->getVolumeFace(face_idx);
new_face = face;
+ meshes_fail_count++;
+ }
+ else
+ {
+ meshes_simplified++;
}
}
}
@@ -1970,7 +1992,18 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
if (genMeshOptimizerPerFace(base, target_model, face_idx, indices_decimator, lod_error_threshold, MESH_OPTIMIZER_NO_TOPOLOGY) < 0)
{
// Sloppy failed and returned an invalid model
- genMeshOptimizerPerFace(base, target_model, face_idx, indices_decimator, lod_error_threshold, MESH_OPTIMIZER_FULL);
+ if (genMeshOptimizerPerFace(base, target_model, face_idx, indices_decimator, lod_error_threshold, MESH_OPTIMIZER_FULL) < 0)
+ {
+ meshes_fail_count++;
+ }
+ else
+ {
+ meshes_simplified++;
+ }
+ }
+ else
+ {
+ meshes_sloppy_simplified++;
}
}
}
@@ -2070,25 +2103,28 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
precise_ratio = genMeshOptimizerPerModel(base, target_model, indices_decimator, lod_error_threshold, MESH_OPTIMIZER_FULL);
}
- LL_INFOS() << "Model " << target_model->getName()
+ LL_DEBUGS("Upload") << "Model " << target_model->getName()
<< " lod " << which_lod
<< " resulting ratio " << precise_ratio
<< " simplified using per model method." << LL_ENDL;
+ meshes_simplified++;
}
else
{
- LL_INFOS() << "Model " << target_model->getName()
+ LL_DEBUGS("Upload") << "Model " << target_model->getName()
<< " lod " << which_lod
<< " resulting ratio " << sloppy_ratio
<< " sloppily simplified using per model method." << LL_ENDL;
+ meshes_sloppy_simplified++;
}
}
else
{
- LL_INFOS() << "Model " << target_model->getName()
+ LL_DEBUGS("Upload") << "Model " << target_model->getName()
<< " lod " << which_lod
<< " resulting ratio " << precise_ratio
<< " simplified using per model method." << LL_ENDL;
+ meshes_simplified++;
}
}
@@ -2102,6 +2138,8 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
//copy material list
target_model->mMaterialList = base->mMaterialList;
+ meshes_processed++;
+
if (!validate_model(target_model))
{
LL_ERRS() << "Invalid model generated when creating LODs" << LL_ENDL;
@@ -2131,6 +2169,11 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
}
}
}
+
+ LL_INFOS("Upload") << "LOD " << which_lod << ", Mesh optimizer processed meshes : " << meshes_processed
+ <<" simplified: " << meshes_simplified
+ << ", slopily simplified: " << meshes_sloppy_simplified
+ << ", failures: " << meshes_fail_count << LL_ENDL;
}
void LLModelPreview::updateStatusMessages()
@@ -2166,7 +2209,7 @@ void LLModelPreview::updateStatusMessages()
total_submeshes[i] = 0;
}
- for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
{
LLModelInstance& instance = *iter;
@@ -2350,7 +2393,7 @@ void LLModelPreview::updateStatusMessages()
if (lod != lod_high)
{
- if (total_submeshes[lod] && total_submeshes[lod] != total_submeshes[lod_high])
+ if (total_submeshes[lod] && total_submeshes[lod] > total_submeshes[lod_high])
{ //number of submeshes is different
message = "mesh_status_submesh_mismatch";
upload_status[lod] = 2;
@@ -2468,7 +2511,7 @@ void LLModelPreview::updateStatusMessages()
LLMutexLock lock(this);
if (mModelLoader)
{
- if (!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean())
+ if (!areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean())
{
// Some textures are still loading, prevent upload until they are done
mModelNoErrors = false;
@@ -2500,6 +2543,8 @@ void LLModelPreview::updateStatusMessages()
S32 phys_tris = 0;
S32 phys_hulls = 0;
S32 phys_points = 0;
+ S32 which_mode = 0;
+ S32 file_mode = 1;
//get the triangle count for the whole scene
for (LLModelLoader::scene::iterator iter = mScene[LLModel::LOD_PHYSICS].begin(), endIter = mScene[LLModel::LOD_PHYSICS].end(); iter != endIter; ++iter)
@@ -2581,7 +2626,16 @@ void LLModelPreview::updateStatusMessages()
//enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean();
//enable/disable "analysis" UI
- LLPanel* panel = fmp->getChild<LLPanel>("physics analysis");
+#if LL_HAVOK
+ LLPanel* panel = fmp->getChild<LLPanel>("physics simplification");
+ panel->setVisible(true);
+
+ panel = fmp->getChild<LLPanel>("physics analysis havok");
+ panel->setVisible(true);
+#else
+ LLPanel* panel = fmp->getChild<LLPanel>("physics analysis vhacd");
+ panel->setVisible(true);
+#endif
LLView* child = panel->getFirstChild();
while (child)
{
@@ -2605,6 +2659,8 @@ void LLModelPreview::updateStatusMessages()
fmp->childSetVisible("simplify_cancel", false);
fmp->childSetVisible("Decompose", true);
fmp->childSetVisible("decompose_cancel", false);
+ fmp->childSetVisible("Analyze", true);
+ fmp->childSetVisible("analyze_cancel", false);
if (phys_hulls > 0)
{
@@ -2614,6 +2670,7 @@ void LLModelPreview::updateStatusMessages()
if (phys_tris || phys_hulls > 0)
{
fmp->childEnable("Decompose");
+ fmp->childEnable("Analyze");
}
}
else
@@ -2621,18 +2678,16 @@ void LLModelPreview::updateStatusMessages()
fmp->childEnable("simplify_cancel");
fmp->childEnable("decompose_cancel");
}
- }
-
- LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo");
- S32 which_mode = 0;
- S32 file_mode = 1;
- if (iface)
- {
- which_mode = iface->getFirstSelectedIndex();
- file_mode = iface->getItemCount() - 1;
+ LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo");
+ if (iface)
+ {
+ which_mode = iface->getFirstSelectedIndex();
+ file_mode = iface->getItemCount() - 1;
+ }
}
+
if (which_mode == file_mode)
{
mFMP->childEnable("physics_file");
@@ -3041,9 +3096,12 @@ void LLModelPreview::loadedCallback(
S32 lod,
void* opaque)
{
+ if(LLModelPreview::sIgnoreLoadedCallback)
+ return;
+
LLModelPreview* pPreview = static_cast<LLModelPreview*>(opaque);
LLMutexLock lock(pPreview);
- if (pPreview && pPreview->mModelLoader && !LLModelPreview::sIgnoreLoadedCallback)
+ if (pPreview && pPreview->mModelLoader)
{
// Load loader's warnings into floater's log tab
const LLSD out = pPreview->mModelLoader->logOut();
@@ -3092,25 +3150,48 @@ void LLModelPreview::lookupLODModelFiles(S32 lod)
S32 next_lod = (lod - 1 >= LLModel::LOD_IMPOSTOR) ? lod - 1 : LLModel::LOD_PHYSICS;
std::string lod_filename = mLODFile[LLModel::LOD_HIGH];
- std::string ext = ".dae";
std::string lod_filename_lower(lod_filename);
LLStringUtil::toLower(lod_filename_lower);
- std::string::size_type i = lod_filename_lower.rfind(ext);
- if (i != std::string::npos)
+
+ // Check for each supported file extension
+ std::vector<std::string> supported_exts = { ".dae", ".gltf", ".glb" };
+ std::string found_ext;
+ std::string::size_type ext_pos = std::string::npos;
+
+ for (const auto& ext : supported_exts)
{
- lod_filename.replace(i, lod_filename.size() - ext.size(), getLodSuffix(next_lod) + ext);
+ std::string::size_type i = lod_filename_lower.rfind(ext);
+ if (i != std::string::npos)
+ {
+ ext_pos = i;
+ found_ext = ext;
+ break;
+ }
}
- if (gDirUtilp->fileExists(lod_filename))
+
+ if (ext_pos != std::string::npos)
{
- LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
- if (fmp)
+ // Replace extension with LOD suffix + original extension
+ std::string lod_file_to_check = lod_filename;
+ lod_file_to_check.replace(ext_pos, found_ext.size(), getLodSuffix(next_lod) + found_ext);
+
+ if (gDirUtilp->fileExists(lod_file_to_check))
{
- fmp->setCtrlLoadFromFile(next_lod);
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (fmp)
+ {
+ fmp->setCtrlLoadFromFile(next_lod);
+ }
+ loadModel(lod_file_to_check, next_lod);
+ }
+ else
+ {
+ lookupLODModelFiles(next_lod);
}
- loadModel(lod_filename, next_lod);
}
else
{
+ // No recognized extension found, continue with next LOD
lookupLODModelFiles(next_lod);
}
}
@@ -3151,6 +3232,7 @@ U32 LLModelPreview::loadTextures(LLImportMaterial& material, LLHandle<LLModelPre
tex->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, true, false, new LLHandle<LLModelPreview>(handle), &preview->mCallbackTextureList, false);
tex->forceToSaveRawImage(0, F32_MAX);
material.setDiffuseMap(tex->getID()); // record tex ID
+ preview->mNumOfFetchingTextures++;
return 1;
}
@@ -3325,7 +3407,6 @@ bool LLModelPreview::render()
fmp->setViewOptionEnabled("show_skin_weight", show_skin_weight);
}
}
- //if (this) return TRUE;
if (upload_skin && !has_skin_weights)
{ //can't upload skin weights if model has no skin weights
@@ -3461,7 +3542,7 @@ bool LLModelPreview::render()
if (!show_skin_weight)
{
- for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
{
LLModelInstance& instance = *iter;
@@ -3551,7 +3632,7 @@ bool LLModelPreview::render()
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
- for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
{
LLModelInstance& instance = *iter;
@@ -3647,7 +3728,6 @@ bool LLModelPreview::render()
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0);
gGL.diffuseColor4fv(PREVIEW_PSYH_EDGE_COL.mV);
- glLineWidth(PREVIEW_PSYH_EDGE_WIDTH);
#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
#endif
@@ -3656,7 +3736,6 @@ bool LLModelPreview::render()
#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
- glLineWidth(1.f);
buffer->unmapBuffer();
}
@@ -3668,7 +3747,6 @@ bool LLModelPreview::render()
// only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]
if (mHasDegenerate)
{
- glLineWidth(PREVIEW_DEG_EDGE_WIDTH);
#if GL_VERSION_1_1
glPointSize(PREVIEW_DEG_POINT_SIZE);
#endif
@@ -3679,7 +3757,7 @@ bool LLModelPreview::render()
gGL.diffuseColor4f(1.f, 0.f, 0.f, 1.f);
const LLVector4a scale(0.5f);
- for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
{
LLModelInstance& instance = *iter;
@@ -3740,7 +3818,7 @@ bool LLModelPreview::render()
gGL.popMatrix();
}
- glLineWidth(1.f);
+ //glLineWidth(1.f);
#if GL_VERSION_1_1
glPointSize(1.f);
#endif
@@ -3864,7 +3942,7 @@ bool LLModelPreview::render()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV);
- glLineWidth(PREVIEW_EDGE_WIDTH);
+ //glLineWidth(PREVIEW_EDGE_WIDTH);
#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
#endif
@@ -3872,7 +3950,6 @@ bool LLModelPreview::render()
#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
- glLineWidth(1.f);
}
}
}
@@ -4011,6 +4088,18 @@ void LLModelPreview::setPreviewLOD(S32 lod)
updateStatusMessages();
}
+void LLModelPreview::warnTextureScaling()
+{
+ if (areTexturesReady() && mTexturesNeedScaling)
+ {
+ std::ostringstream out;
+ out << "One or more textures in this model were scaled to be within the allowed limits.";
+ LL_INFOS() << out.str() << LL_ENDL;
+ LLSD args;
+ LLFloaterModelPreview::addStringToLog("ModelTextureScaling", args, true, -1);
+ }
+}
+
//static
void LLModelPreview::textureLoadedCallback(
bool success,
@@ -4031,11 +4120,19 @@ void LLModelPreview::textureLoadedCallback(
LLModelPreview* preview = static_cast<LLModelPreview*>(handle->get());
preview->refresh();
- if (final && preview->mModelLoader)
+ if (final)
{
- if (preview->mModelLoader->mNumOfFetchingTextures > 0)
+ if (src_vi
+ && (src_vi->getOriginalWidth() > LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT
+ || src_vi->getOriginalHeight() > LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT))
+ {
+ preview->mTexturesNeedScaling = true;
+ }
+
+ if (preview->mNumOfFetchingTextures > 0)
{
- preview->mModelLoader->mNumOfFetchingTextures--;
+ preview->mNumOfFetchingTextures--;
+ preview->warnTextureScaling();
}
}
}
diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h
index 0873263587..92ac2d1faf 100644
--- a/indra/newview/llmodelpreview.h
+++ b/indra/newview/llmodelpreview.h
@@ -204,6 +204,7 @@ public:
std::vector<S32> mLodsQuery;
std::vector<S32> mLodsWithParsingError;
bool mHasDegenerate;
+ bool areTexturesReady() { return !mNumOfFetchingTextures; }
protected:
@@ -213,6 +214,7 @@ protected:
static LLJoint* lookupJointByName(const std::string&, void* opaque);
static U32 loadTextures(LLImportMaterial& material, LLHandle<LLModelPreview> handle);
+ void warnTextureScaling();
void lookupLODModelFiles(S32 lod);
private:
@@ -242,6 +244,9 @@ private:
/// Not read unless mWarnOfUnmatchedPhyicsMeshes is true.
LLPointer<LLModel> mDefaultPhysicsShapeP;
+ S32 mNumOfFetchingTextures;
+ bool mTexturesNeedScaling;
+
typedef enum
{
MESH_OPTIMIZER_FULL,
@@ -314,7 +319,7 @@ protected:
// Amount of triangles in original(base) model
U32 mMaxTriangleLimit;
- LLMeshUploadThread::instance_list mUploadData;
+ LLMeshUploadThread::instance_list_t mUploadData;
std::set<LLViewerFetchedTexture * > mTextureSet;
LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList;
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index a8ceaffde8..df515389c5 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -538,7 +538,7 @@ void LLPanelStandStopFlying::setStandStopFlyingMode(EStandStopFlyingMode mode)
LLFirstUse::sit();
LLFirstUse::notMoving(false);
}
- panel->mStandButton->setVisible(SSFM_STAND == mode);
+ panel->mStandButton->setVisible((SSFM_STAND == mode) & gAgent.isAllowedToStand());
panel->mStopFlyingButton->setVisible(SSFM_STOP_FLYING == mode);
//visibility of it should be updated after updating visibility of the buttons
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index 3690245e1d..208e1e80f1 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -143,6 +143,7 @@ public:
static void clearStandStopFlyingMode(EStandStopFlyingMode mode);
/*virtual*/ bool postBuild();
/*virtual*/ void setVisible(bool visible);
+ void setVisibleStandButton(bool visible) { mStandButton->setVisible(visible); }
// *HACK: due to hard enough to have this control aligned with "Move" button while resizing
// let update its position in each frame
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 2d51acc063..f6d635f51f 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -154,7 +154,8 @@ std::string LLMute::getDisplayType() const
// LLMuteList()
//-----------------------------------------------------------------------------
LLMuteList::LLMuteList() :
- mIsLoaded(false)
+ mLoadState(ML_INITIAL),
+ mRequestStartTime(0.f)
{
gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList);
@@ -209,6 +210,23 @@ bool LLMuteList::isLinden(const std::string& name)
return last_name == "linden";
}
+bool LLMuteList::getLoadFailed() const
+{
+ if (mLoadState == ML_FAILED)
+ {
+ return true;
+ }
+ if (mLoadState == ML_REQUESTED)
+ {
+ constexpr F64 WAIT_SECONDS = 30;
+ if (mRequestStartTime + WAIT_SECONDS < LLTimer::getTotalSeconds())
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
static LLVOAvatar* find_avatar(const LLUUID& id)
{
LLViewerObject *obj = gObjectList.findObject(id);
@@ -371,11 +389,14 @@ void LLMuteList::updateAdd(const LLMute& mute)
msg->addU32("MuteFlags", mute.mFlags);
gAgent.sendReliableMessage();
- if (!mIsLoaded)
+ if (!isLoaded())
{
LL_WARNS() << "Added elements to non-initialized block list" << LL_ENDL;
}
- mIsLoaded = true; // why is this here? -MG
+ // Based of logs and testing, if file doesn't exist server side,
+ // viewer will not receive any callback and won't know to set
+ // ML_LOADED. As a workaround, set it regardless of current state.
+ mLoadState = ML_LOADED;
}
@@ -564,6 +585,7 @@ bool LLMuteList::loadFromFile(const std::string& filename)
if(!filename.size())
{
LL_WARNS() << "Mute List Filename is Empty!" << LL_ENDL;
+ mLoadState = ML_FAILED;
return false;
}
@@ -571,6 +593,7 @@ bool LLMuteList::loadFromFile(const std::string& filename)
if (!fp)
{
LL_WARNS() << "Couldn't open mute list " << filename << LL_ENDL;
+ mLoadState = ML_FAILED;
return false;
}
@@ -730,13 +753,17 @@ void LLMuteList::requestFromServer(const LLUUID& agent_id)
if (gDisconnected)
{
LL_WARNS() << "Trying to request mute list when disconnected!" << LL_ENDL;
+ mLoadState = ML_FAILED;
return;
}
if (!gAgent.getRegion())
{
LL_WARNS() << "No region for agent yet, skipping mute list request!" << LL_ENDL;
+ mLoadState = ML_FAILED;
return;
}
+ mLoadState = ML_REQUESTED;
+ mRequestStartTime = LLTimer::getElapsedSeconds();
// Double amount of retries due to this request happening during busy stage
// Ideally this should be turned into a capability
gMessageSystem->sendReliable(gAgent.getRegionHost(), LL_DEFAULT_RELIABLE_RETRIES * 2, true, LL_PING_BASED_TIMEOUT_DUMMY, NULL, NULL);
@@ -749,7 +776,7 @@ void LLMuteList::requestFromServer(const LLUUID& agent_id)
void LLMuteList::cache(const LLUUID& agent_id)
{
// Write to disk even if empty.
- if(mIsLoaded)
+ if(isLoaded())
{
std::string agent_id_string;
std::string filename;
@@ -777,6 +804,13 @@ void LLMuteList::processMuteListUpdate(LLMessageSystem* msg, void**)
msg->getStringFast(_PREHASH_MuteData, _PREHASH_Filename, unclean_filename);
std::string filename = LLDir::getScrubbedFileName(unclean_filename);
+ LLMuteList* mute_list = getInstance();
+ mute_list->mLoadState = ML_REQUESTED;
+ mute_list->mRequestStartTime = LLTimer::getElapsedSeconds();
+
+ // Todo: Based of logs and testing, there is no callback
+ // from server if file doesn't exist server side.
+ // Once server side gets fixed make sure it gets handled right.
std::string *local_filename_and_path = new std::string(gDirUtilp->getExpandedFilename( LL_PATH_CACHE, filename ));
gXferManager->requestFile(*local_filename_and_path,
filename,
@@ -809,12 +843,16 @@ void LLMuteList::onFileMuteList(void** user_data, S32 error_code, LLExtStat ext_
LLMuteList::getInstance()->loadFromFile(*local_filename_and_path);
LLFile::remove(*local_filename_and_path);
}
+ else
+ {
+ LLMuteList::getInstance()->mLoadState = ML_FAILED;
+ }
delete local_filename_and_path;
}
void LLMuteList::onAccountNameChanged(const LLUUID& id, const std::string& username)
{
- if (mIsLoaded)
+ if (isLoaded())
{
LLMute mute(id, username, LLMute::AGENT);
mute_set_t::iterator mute_it = mMutes.find(mute);
@@ -866,7 +904,7 @@ void LLMuteList::removeObserver(LLMuteListObserver* observer)
void LLMuteList::setLoaded()
{
- mIsLoaded = true;
+ mLoadState = ML_LOADED;
notifyObservers();
}
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 13d579c61f..b65fd61fcc 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -74,6 +74,14 @@ class LLMuteList : public LLSingleton<LLMuteList>
LLSINGLETON(LLMuteList);
~LLMuteList();
/*virtual*/ void cleanupSingleton() override;
+
+ enum EMuteListState
+ {
+ ML_INITIAL,
+ ML_REQUESTED,
+ ML_LOADED,
+ ML_FAILED,
+ };
public:
// reasons for auto-unmuting a resident
enum EAutoReason
@@ -107,7 +115,8 @@ public:
static bool isLinden(const std::string& name);
- bool isLoaded() const { return mIsLoaded; }
+ bool isLoaded() const { return mLoadState == ML_LOADED; }
+ bool getLoadFailed() const;
std::vector<LLMute> getMutes() const;
@@ -167,7 +176,8 @@ private:
typedef std::set<LLMuteListObserver*> observer_set_t;
observer_set_t mObservers;
- bool mIsLoaded;
+ EMuteListState mLoadState;
+ F64 mRequestStartTime;
friend class LLDispatchEmptyMuteList;
};
diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp
index 5b8b28ebe6..9a33bcb1b9 100644
--- a/indra/newview/llnotificationlistitem.cpp
+++ b/indra/newview/llnotificationlistitem.cpp
@@ -38,6 +38,7 @@
#include "lluicolortable.h"
#include "message.h"
#include "llnotificationsutil.h"
+#include "llviewercontrol.h"
#include <boost/regex.hpp>
LLNotificationListItem::LLNotificationListItem(const Params& p) : LLPanel(p),
@@ -133,10 +134,22 @@ std::string LLNotificationListItem::buildNotificationDate(const LLDate& time_sta
default:
timeStr = "[" + LLTrans::getString("TimeMonth") + "]/["
+LLTrans::getString("TimeDay")+"]/["
- +LLTrans::getString("TimeYear")+"] ["
- +LLTrans::getString("TimeHour")+"]:["
- +LLTrans::getString("TimeMin")+"] ["
- +LLTrans::getString("TimeTimezone")+"]";
+ +LLTrans::getString("TimeYear")+"] [";
+
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ if (use_24h)
+ {
+ timeStr += LLTrans::getString("TimeHour") + "]:["
+ + LLTrans::getString("TimeMin") + "] ["
+ + LLTrans::getString("TimeTimezone") + "]";
+ }
+ else
+ {
+ timeStr += LLTrans::getString("TimeHour12") + "]:["
+ + LLTrans::getString("TimeMin") + "] ["
+ + LLTrans::getString("TimeAMPM") + "] ["
+ + LLTrans::getString("TimeTimezone") + "]";
+ }
break;
}
LLSD substitution;
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index b1d5cd9e16..8589afae06 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -69,7 +69,6 @@ const S32 GALLERY_ITEMS_PER_ROW_MIN = 2;
LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p)
: LLOutfitListBase(),
- mOutfitsObserver(NULL),
mScrollPanel(NULL),
mGalleryPanel(NULL),
mLastRowPanel(NULL),
@@ -88,9 +87,16 @@ LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p)
mItemsInRow(p.items_in_row),
mRowPanWidthFactor(p.row_panel_width_factor),
mGalleryWidthFactor(p.gallery_width_factor),
- mTextureSelected(NULL)
+ mTextureSelected(NULL),
+ mSortMenu(nullptr)
{
updateGalleryWidth();
+
+ LLControlVariable* ctrl = gSavedSettings.getControl("InventoryFavoritesColorText");
+ if (ctrl)
+ {
+ mSavedSettingInvFavColor = ctrl->getSignal()->connect(boost::bind(&LLOutfitGallery::handleInvFavColorChange, this));
+ }
}
LLOutfitGallery::Params::Params()
@@ -421,19 +427,32 @@ void LLOutfitGallery::updateRowsIfNeeded()
bool compareGalleryItem(LLOutfitGalleryItem* item1, LLOutfitGalleryItem* item2)
{
- static LLCachedControl<bool> outfit_gallery_sort_by_name(gSavedSettings, "OutfitGallerySortByName");
- if(outfit_gallery_sort_by_name ||
- ((item1->isDefaultImage() && item2->isDefaultImage()) || (!item1->isDefaultImage() && !item2->isDefaultImage())))
- {
- std::string name1 = item1->getItemName();
- std::string name2 = item2->getItemName();
-
- return (LLStringUtil::compareDict(name1, name2) < 0);
- }
- else
+ static LLCachedControl<S32> sort_by_name(gSavedSettings, "OutfitGallerySortOrder", 0);
+ switch (sort_by_name())
{
- return item2->isDefaultImage();
+ case 2:
+ // Sort by favorites - favorite items first, then alphabetically
+ if (item1->isFavorite() != item2->isFavorite())
+ {
+ return item1->isFavorite();
+ }
+ break;
+ case 1:
+ // Sort by images - items with non-default images first, then alphabetically
+ if (item1->isDefaultImage() != item2->isDefaultImage())
+ {
+ return item2->isDefaultImage();
+ }
+ break;
+ default:
+ // Sort alphabetically only
+ break;
}
+
+ // Final comparison is always alphabetical by name
+ std::string name1 = item1->getItemName();
+ std::string name2 = item2->getItemName();
+ return (LLStringUtil::compareDict(name1, name2) < 0);
}
void LLOutfitGallery::reArrangeRows(S32 row_diff)
@@ -476,6 +495,20 @@ void LLOutfitGallery::updateGalleryWidth()
mGalleryWidth = mGalleryWidthFactor * mItemsInRow - mItemHorizontalGap;
}
+void LLOutfitGallery::handleInvFavColorChange()
+{
+ for (outfit_map_t::iterator iter = mOutfitMap.begin();
+ iter != mOutfitMap.end();
+ ++iter)
+ {
+ if (!iter->second) continue;
+ LLOutfitGalleryItem* item = (LLOutfitGalleryItem*)iter->second;
+
+ // refresh font color
+ item->setOutfitFavorite(item->isFavorite());
+ }
+}
+
LLPanel* LLOutfitGallery::addLastRow()
{
mRowCount++;
@@ -627,7 +660,7 @@ void LLOutfitGallery::removeFromLastRow(LLOutfitGalleryItem* item)
mItemPanels.pop_back();
}
-LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID outfit_id)
+LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID outfit_id, bool is_favorite)
{
LLOutfitGalleryItem::Params giparams;
LLOutfitGalleryItem* gitem = LLUICtrlFactory::create<LLOutfitGalleryItem>(giparams);
@@ -636,6 +669,7 @@ LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID
gitem->setFollowsLeft();
gitem->setFollowsTop();
gitem->setOutfitName(name);
+ gitem->setOutfitFavorite(is_favorite);
gitem->setUUID(outfit_id);
gitem->setGallery(this);
return gitem;
@@ -730,12 +764,6 @@ LLOutfitGallery::~LLOutfitGallery()
{
delete mOutfitGalleryMenu;
- if (gInventory.containsObserver(mOutfitsObserver))
- {
- gInventory.removeObserver(mOutfitsObserver);
- }
- delete mOutfitsObserver;
-
while (!mUnusedRowPanels.empty())
{
LLPanel* panelp = mUnusedRowPanels.back();
@@ -790,11 +818,22 @@ void LLOutfitGallery::getCurrentCategories(uuid_vec_t& vcur)
void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
{
+ LL_PROFILE_ZONE_SCOPED;
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
if (!cat) return;
- std::string name = cat->getName();
- LLOutfitGalleryItem* item = buildGalleryItem(name, cat_id);
+ if (!isOutfitFolder(cat))
+ {
+ // Assume a subfolder that contains or will contain outfits, track it
+ const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ mCategoriesObserver->addCategory(cat_id, [this, outfits]()
+ {
+ observerCallback(outfits);
+ });
+ return;
+ }
+
+ LLOutfitGalleryItem* item = buildGalleryItem(cat->getName(), cat_id, cat->getIsFavorite());
mOutfitMap.insert(LLOutfitGallery::outfit_map_value_t(cat_id, item));
item->setRightMouseDownCallback(boost::bind(&LLOutfitListBase::outfitRightClickCallBack, this,
_1, _2, _3, cat_id));
@@ -809,14 +848,8 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
if (!outfit_category)
return;
- if (mOutfitsObserver == NULL)
- {
- mOutfitsObserver = new LLInventoryCategoriesObserver();
- gInventory.addObserver(mOutfitsObserver);
- }
-
// Start observing changes in "My Outfits" category.
- mOutfitsObserver->addCategory(cat_id,
+ mCategoriesObserver->addCategory(cat_id,
boost::bind(&LLOutfitGallery::refreshOutfit, this, cat_id), true);
outfit_category->fetch();
@@ -829,7 +862,7 @@ void LLOutfitGallery::updateRemovedCategory(LLUUID cat_id)
if (outfits_iter != mOutfitMap.end())
{
// 0. Remove category from observer.
- mOutfitsObserver->removeCategory(cat_id);
+ mCategoriesObserver->removeCategory(cat_id);
//const LLUUID& outfit_id = outfits_iter->first;
LLOutfitGalleryItem* item = outfits_iter->second;
@@ -863,6 +896,7 @@ void LLOutfitGallery::updateChangedCategoryName(LLViewerInventoryCategory *cat,
if (item)
{
item->setOutfitName(name);
+ item->setOutfitFavorite(cat->getIsFavorite());
}
}
}
@@ -943,6 +977,10 @@ LLOutfitListGearMenuBase* LLOutfitGallery::createGearMenu()
static LLDefaultChildRegistry::Register<LLOutfitGalleryItem> r("outfit_gallery_item");
+bool LLOutfitGalleryItem::sColorSetInitialized = false;
+LLUIColor LLOutfitGalleryItem::sDefaultTextColor;
+LLUIColor LLOutfitGalleryItem::sDefaultFavoriteColor;
+
LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p)
: LLPanel(p),
mGallery(nullptr),
@@ -954,6 +992,12 @@ LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p)
mUUID(LLUUID())
{
buildFromFile("panel_outfit_gallery_item.xml");
+ if (!sColorSetInitialized)
+ {
+ sDefaultTextColor = LLUIColorTable::instance().getColor("White", LLColor4::white);
+ sDefaultFavoriteColor = LLUIColorTable::instance().getColor("InventoryFavoriteColor", LLColor4::white);
+ sColorSetInitialized = true;
+ }
}
LLOutfitGalleryItem::~LLOutfitGalleryItem()
@@ -1000,6 +1044,19 @@ void LLOutfitGalleryItem::draw()
gl_draw_scaled_image(interior.mLeft - 1, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
}
+ static LLUICachedControl<bool> draw_star("InventoryFavoritesUseStar", true);
+ if(mFavorite && draw_star())
+ {
+ const S32 HPAD = 3;
+ const S32 VPAD = 6; // includes padding for text and for the image
+ const S32 image_size = 14;
+ static LLPointer<LLUIImage> fav_img = LLRender2D::getInstance()->getUIImage("Inv_Favorite_Star_Full");
+
+ const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
+ gl_draw_scaled_image(
+ border.getWidth() - image_size - HPAD, image_size + VPAD + mOutfitNameText->getRect().getHeight(),
+ image_size, image_size, fav_img->getImage(), UI_VERTEX_COLOR % alpha);
+ }
}
void LLOutfitGalleryItem::setOutfitName(std::string name)
@@ -1009,18 +1066,28 @@ void LLOutfitGalleryItem::setOutfitName(std::string name)
mOutfitName = name;
}
+void LLOutfitGalleryItem::setOutfitFavorite(bool is_favorite)
+{
+ mFavorite = is_favorite;
+
+ static LLCachedControl<bool> use_color(gSavedSettings, "InventoryFavoritesColorText");
+ mOutfitNameText->setReadOnlyColor((mFavorite && use_color()) ? sDefaultFavoriteColor : sDefaultTextColor);
+}
+
void LLOutfitGalleryItem::setOutfitWorn(bool value)
{
mWorn = value;
LLStringUtil::format_map_t worn_string_args;
std::string worn_string = getString("worn_string", worn_string_args);
- LLUIColor text_color = LLUIColorTable::instance().getColor("White", LLColor4::white);
- mOutfitWornText->setReadOnlyColor(text_color);
- mOutfitNameText->setReadOnlyColor(text_color);
+ mOutfitWornText->setReadOnlyColor(sDefaultTextColor.get());
+ mOutfitNameText->setReadOnlyColor(sDefaultTextColor.get());
mOutfitWornText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall());
mOutfitNameText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall());
mOutfitWornText->setValue(value ? worn_string : "");
mOutfitNameText->setText(mOutfitName); // refresh LLTextViewModel to pick up font changes
+
+ static LLCachedControl<bool> use_color(gSavedSettings, "InventoryFavoritesColorText");
+ mOutfitNameText->setReadOnlyColor((mFavorite && use_color()) ? sDefaultFavoriteColor : sDefaultTextColor);
}
void LLOutfitGalleryItem::setSelected(bool value)
@@ -1172,6 +1239,7 @@ LLContextMenu* LLOutfitGalleryContextMenu::createMenu()
registrar.add("Outfit.Delete", boost::bind(LLOutfitGallery::onRemoveOutfit, selected_id));
registrar.add("Outfit.Create", boost::bind(&LLOutfitGalleryContextMenu::onCreate, this, _2));
registrar.add("Outfit.Thumbnail", boost::bind(&LLOutfitGalleryContextMenu::onThumbnail, this, selected_id));
+ registrar.add("Outfit.Favorite", boost::bind(&LLOutfitGalleryContextMenu::onFavorite, this, selected_id));
registrar.add("Outfit.Save", boost::bind(&LLOutfitGalleryContextMenu::onSave, this, selected_id));
enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitGalleryContextMenu::onEnable, this, _2));
enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitGalleryContextMenu::onVisible, this, _2));
@@ -1210,25 +1278,12 @@ void LLOutfitGalleryGearMenu::onUpdateItemsVisibility()
{
if (!mMenu) return;
bool have_selection = getSelectedOutfitID().notNull();
- mMenu->setItemVisible("expand", false);
- mMenu->setItemVisible("collapse", false);
mMenu->setItemVisible("thumbnail", have_selection);
mMenu->setItemVisible("sepatator3", true);
mMenu->setItemVisible("sort_folders_by_name", true);
LLOutfitListGearMenuBase::onUpdateItemsVisibility();
}
-void LLOutfitGalleryGearMenu::onChangeSortOrder()
-{
- bool sort_by_name = !gSavedSettings.getBOOL("OutfitGallerySortByName");
- gSavedSettings.setBOOL("OutfitGallerySortByName", sort_by_name);
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery)
- {
- gallery->reArrangeRows();
- }
-}
-
bool LLOutfitGalleryGearMenu::hasDefaultImage()
{
LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
@@ -1345,6 +1400,15 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
}
}
+LLToggleableMenu* LLOutfitGallery::getSortMenu()
+{
+ if (!mSortMenu)
+ {
+ mSortMenu = new LLOutfitGallerySortMenu(this);
+ }
+ return mSortMenu->getMenu();
+}
+
LLUUID LLOutfitGallery::getPhotoAssetId(const LLUUID& outfit_id)
{
outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
@@ -1360,3 +1424,84 @@ LLUUID LLOutfitGallery::getDefaultPhoto()
return LLUUID();
}
+
+//////////////////// LLOutfitGallerySortMenu ////////////////////
+
+LLOutfitGallerySortMenu::LLOutfitGallerySortMenu(LLOutfitListBase* parent_panel)
+ : mPanelHandle(parent_panel->getHandle())
+{
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add("Sort.OnSort", boost::bind(&LLOutfitGallerySortMenu::onSort, this, _2));
+ enable_registrar.add("Sort.OnEnable", boost::bind(&LLOutfitGallerySortMenu::onEnable, this, _2));
+
+ mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
+ "menu_outfit_gallery_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ llassert(mMenu);
+}
+
+
+LLToggleableMenu* LLOutfitGallerySortMenu::getMenu()
+{
+ return mMenu;
+}
+
+void LLOutfitGallerySortMenu::updateItemsVisibility()
+{
+ onUpdateItemsVisibility();
+}
+
+void LLOutfitGallerySortMenu::onUpdateItemsVisibility()
+{
+ if (!mMenu) return;
+}
+
+bool LLOutfitGallerySortMenu::onEnable(LLSD::String param)
+{
+ static LLCachedControl<S32> sort_order(gSavedSettings, "OutfitGallerySortOrder", 0);
+ if ("favorites_to_top" == param)
+ {
+ return sort_order == 2;
+ }
+ else if ("images_to_top" == param)
+ {
+ return sort_order == 1;
+ }
+ else if ("by_name" == param)
+ {
+ return sort_order == 0;
+ }
+
+ return false;
+}
+
+void LLOutfitGallerySortMenu::onSort(LLSD::String param)
+{
+ S32 sort_order = gSavedSettings.getS32("OutfitGallerySortOrder");
+ S32 new_sort_order = 0;
+ if ("favorites_to_top" == param)
+ {
+ new_sort_order = 2;
+ }
+ else if ("images_to_top" == param)
+ {
+ new_sort_order = 1;
+ }
+ else if ("by_name" == param)
+ {
+ new_sort_order = 0;
+ }
+ if (sort_order == new_sort_order)
+ {
+ new_sort_order = sort_order ? 0 : 1;
+ }
+ gSavedSettings.setS32("OutfitGallerySortOrder", new_sort_order);
+
+ LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mPanelHandle.get());
+ if (gallery)
+ {
+ gallery->reArrangeRows();
+ }
+}
+
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 541ea2f9d4..5801a32a39 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -42,11 +42,13 @@ class LLOutfitGalleryItem;
class LLOutfitListGearMenuBase;
class LLOutfitGalleryGearMenu;
class LLOutfitGalleryContextMenu;
+class LLOutfitGallerySortMenu;
class LLOutfitGallery : public LLOutfitListBase
{
public:
friend class LLOutfitGalleryGearMenu;
+ friend class LLOutfitGallerySortMenu;
friend class LLOutfitGalleryContextMenu;
friend class LLUpdateGalleryOnPhotoLinked;
@@ -102,10 +104,12 @@ public:
/*virtual*/ bool getHasExpandableFolders() { return false; }
+ /*virtual*/ void onChangeSortOrder(const LLSD& userdata) {};
void updateMessageVisibility();
bool hasDefaultImage(const LLUUID& outfit_cat_id);
void refreshOutfit(const LLUUID& category_id);
+ virtual LLToggleableMenu* getSortMenu();
protected:
/*virtual*/ void onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id);
@@ -133,8 +137,9 @@ private:
void reArrangeRows(S32 row_diff = 0);
void updateRowsIfNeeded();
void updateGalleryWidth();
+ void handleInvFavColorChange();
- LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id);
+ LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id, bool is_favorite);
LLOutfitGalleryItem* getSelectedItem() const;
LLOutfitGalleryItem* getItem(const LLUUID& id) const;
@@ -176,6 +181,7 @@ private:
int mGalleryWidthFactor;
LLListContextMenu* mOutfitGalleryMenu;
+ LLOutfitGallerySortMenu* mSortMenu;
typedef std::map<LLUUID, LLOutfitGalleryItem*> outfit_map_t;
typedef outfit_map_t::value_type outfit_map_value_t;
@@ -187,6 +193,8 @@ private:
LLInventoryCategoriesObserver* mOutfitsObserver;
+
+ boost::signals2::connection mSavedSettingInvFavColor;
};
class LLOutfitGalleryContextMenu : public LLOutfitContextMenu
{
@@ -213,8 +221,6 @@ public:
protected:
/*virtual*/ void onUpdateItemsVisibility();
private:
- /*virtual*/ void onChangeSortOrder();
-
bool hasDefaultImage();
};
@@ -243,6 +249,7 @@ public:
bool setImageAssetId(LLUUID asset_id);
LLUUID getImageAssetId();
void setOutfitName(std::string name);
+ void setOutfitFavorite(bool is_favorite);
void setOutfitWorn(bool value);
void setSelected(bool value);
void setUUID(const LLUUID &outfit_id) {mUUID = outfit_id;}
@@ -250,6 +257,7 @@ public:
std::string getItemName() {return mOutfitName;}
bool isDefaultImage() {return mDefaultImage;}
+ bool isFavorite() { return mFavorite; }
bool isHidden() {return mHidden;}
void setHidden(bool hidden) {mHidden = hidden;}
@@ -267,7 +275,29 @@ private:
bool mWorn;
bool mDefaultImage;
bool mHidden;
+ bool mFavorite;
std::string mOutfitName;
+
+ static bool sColorSetInitialized;
+ static LLUIColor sDefaultTextColor;
+ static LLUIColor sDefaultFavoriteColor;
+};
+
+class LLOutfitGallerySortMenu
+{
+public:
+ LLOutfitGallerySortMenu(LLOutfitListBase* parent_panel);
+
+ LLToggleableMenu* getMenu();
+ void updateItemsVisibility();
+
+private:
+ void onUpdateItemsVisibility();
+ bool onEnable(LLSD::String param);
+ void onSort(LLSD::String param);
+
+ LLToggleableMenu* mMenu;
+ LLHandle<LLPanel> mPanelHandle;
};
#endif // LL_LLOUTFITGALLERYCTRL_H
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 6e666b8a4b..58cd9fab83 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -34,10 +34,13 @@
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
+#include "llaisapi.h"
#include "llappearancemgr.h"
+#include "llappviewer.h"
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llinspecttexture.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llmenubutton.h"
@@ -45,6 +48,7 @@
#include "lloutfitobserver.h"
#include "lltoggleablemenu.h"
#include "lltransutil.h"
+#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
@@ -53,14 +57,24 @@
static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y);
static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR;
+static const LLOutfitTabFavComparator OUTFIT_TAB_FAV_COMPARATOR;
/*virtual*/
bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const
{
- std::string name1 = tab1->getTitle();
- std::string name2 = tab2->getTitle();
+ return (LLStringUtil::compareDict(tab1->getTitle(), tab2->getTitle()) < 0);
+}
- return (LLStringUtil::compareDict(name1, name2) < 0);
+bool LLOutfitTabFavComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const
+{
+ LLOutfitAccordionCtrlTab* taba = (LLOutfitAccordionCtrlTab*)tab1;
+ LLOutfitAccordionCtrlTab* tabb = (LLOutfitAccordionCtrlTab*)tab2;
+ if (taba->getFavorite() != tabb->getFavorite())
+ {
+ return taba->getFavorite();
+ }
+
+ return (LLStringUtil::compareDict(tab1->getTitle(), tab2->getTitle()) < 0);
}
struct outfit_accordion_tab_params : public LLInitParam::Block<outfit_accordion_tab_params, LLOutfitAccordionCtrlTab::Params>
@@ -80,6 +94,9 @@ const outfit_accordion_tab_params& get_accordion_tab_params()
{
initialized = true;
+ LLOutfitAccordionCtrlTab::sFavoriteIcon = LLUI::getUIImage("Inv_Favorite_Star_Full");
+ LLOutfitAccordionCtrlTab::sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", LLColor4U(255, 255, 255));
+
LLXMLNodePtr xmlNode;
if (LLUICtrlFactory::getLayeredXMLNode("outfit_accordion_tab.xml", xmlNode))
{
@@ -103,11 +120,20 @@ LLOutfitsList::LLOutfitsList()
, mAccordion(NULL)
, mListCommands(NULL)
, mItemSelected(false)
+ , mSortMenu(nullptr)
{
+ LLControlVariable* ctrl = gSavedSettings.getControl("InventoryFavoritesColorText");
+ if (ctrl)
+ {
+ mSavedSettingInvFavColor = ctrl->getSignal()->connect(boost::bind(&LLOutfitsList::handleInvFavColorChange, this));
+ }
}
LLOutfitsList::~LLOutfitsList()
{
+ delete mSortMenu;
+ mSavedSettingInvFavColor.disconnect();
+ mGearMenuConnection.disconnect();
}
bool LLOutfitsList::postBuild()
@@ -115,9 +141,25 @@ bool LLOutfitsList::postBuild()
mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");
mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR);
+ initComparator();
+
return LLOutfitListBase::postBuild();
}
+void LLOutfitsList::initComparator()
+{
+ S32 mode = gSavedSettings.getS32("OutfitListSortOrder");
+ if (mode == 0)
+ {
+ mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR);
+ }
+ else
+ {
+ mAccordion->setComparator(&OUTFIT_TAB_FAV_COMPARATOR);
+ }
+ sortOutfits();
+}
+
//virtual
void LLOutfitsList::onOpen(const LLSD& info)
{
@@ -139,9 +181,21 @@ void LLOutfitsList::onOpen(const LLSD& info)
void LLOutfitsList::updateAddedCategory(LLUUID cat_id)
{
+ LL_PROFILE_ZONE_SCOPED;
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
if (!cat) return;
+ if (!isOutfitFolder(cat))
+ {
+ // Assume a subfolder that contains or will contain outfits, track it
+ const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ mCategoriesObserver->addCategory(cat_id, [this, outfits]()
+ {
+ observerCallback(outfits);
+ });
+ return;
+ }
+
std::string name = cat->getName();
outfit_accordion_tab_params tab_params(get_accordion_tab_params());
@@ -154,6 +208,7 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id)
tab->setName(name);
tab->setTitle(name);
+ tab->setFavorite(cat->getIsFavorite());
// *TODO: LLUICtrlFactory::defaultBuilder does not use "display_children" from xml. Should be investigated.
tab->setDisplayChildren(false);
@@ -183,8 +238,9 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id)
// Setting callback to reset items selection inside outfit on accordion collapsing and expanding (EXT-7875)
tab->setDropDownStateChangedCallback(boost::bind(&LLOutfitsList::resetItemSelection, this, list, cat_id));
- // force showing list items that don't match current filter(EXT-7158)
- list->setForceShowingUnmatchedItems(true);
+ // Depending on settings, force showing list items that don't match current filter(EXT-7158)
+ static LLCachedControl<bool> list_filter(gSavedSettings, "OutfitListFilterFullList");
+ list->setForceShowingUnmatchedItems(list_filter(), false);
// Setting list commit callback to monitor currently selected wearable item.
list->setCommitCallback(boost::bind(&LLOutfitsList::onListSelectionChange, this, _1));
@@ -194,12 +250,29 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id)
list->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onWearableItemsListRightClick, this, _1, _2, _3));
- // Fetch the new outfit contents.
- cat->fetch();
-
- // Refresh the list of outfit items after fetch().
- // Further list updates will be triggered by the category observer.
- list->updateList(cat_id);
+ if (AISAPI::isAvailable() && LLInventoryModelBackgroundFetch::instance().folderFetchActive())
+ {
+ // For reliability just fetch it whole, linked items included
+ // Todo: list is not warrantied to exist once callback arrives
+ // Fix it!
+ LLInventoryModelBackgroundFetch::instance().fetchFolderAndLinks(cat_id, [cat_id, list]
+ {
+ if (list)
+ {
+ list->updateList(cat_id);
+ list->setForceRefresh(true);
+ }
+ });
+ }
+ else
+ {
+ // Fetch the new outfit contents.
+ cat->fetch();
+ // Refresh the list of outfit items after fetch().
+ // Further list updates will be triggered by the category observer.
+ list->updateList(cat_id);
+ list->setForceRefresh(true);
+ }
// If filter is currently applied we store the initial tab state.
if (!getFilterSubString().empty())
@@ -249,13 +322,11 @@ void LLOutfitsList::onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id)
{
if (mOutfitsMap[prev_id])
{
- mOutfitsMap[prev_id]->setTitleFontStyle("NORMAL");
- mOutfitsMap[prev_id]->setTitleColor(LLUIColorTable::instance().getColor("AccordionHeaderTextColor"));
+ ((LLOutfitAccordionCtrlTab*)mOutfitsMap[prev_id])->setOutfitSelected(false);
}
if (mOutfitsMap[base_id])
{
- mOutfitsMap[base_id]->setTitleFontStyle("BOLD");
- mOutfitsMap[base_id]->setTitleColor(LLUIColorTable::instance().getColor("SelectedOutfitTextColor"));
+ ((LLOutfitAccordionCtrlTab*)mOutfitsMap[base_id])->setOutfitSelected(true);
}
}
@@ -313,6 +384,11 @@ void LLOutfitsList::onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid)
}
}
+void LLOutfitListBase::onAction(const LLSD& userdata)
+{
+ performAction(userdata.asString());
+}
+
// virtual
bool LLOutfitListBase::isActionEnabled(const LLSD& userdata)
{
@@ -425,11 +501,12 @@ void LLOutfitsList::updateChangedCategoryName(LLViewerInventoryCategory *cat, st
if (outfits_iter != mOutfitsMap.end())
{
// Update tab name with the new category name.
- LLAccordionCtrlTab* tab = outfits_iter->second;
+ LLOutfitAccordionCtrlTab* tab = (LLOutfitAccordionCtrlTab*) outfits_iter->second;
if (tab)
{
tab->setName(name);
tab->setTitle(name);
+ tab->setFavorite(cat->getIsFavorite());
}
}
}
@@ -738,6 +815,75 @@ void LLOutfitsList::onOutfitRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUI
}
}
+void LLOutfitsList::handleInvFavColorChange()
+{
+ for (outfits_map_t::iterator iter = mOutfitsMap.begin();
+ iter != mOutfitsMap.end();
+ ++iter)
+ {
+ if (!iter->second) continue;
+ LLOutfitAccordionCtrlTab* tab = (LLOutfitAccordionCtrlTab*)iter->second;
+
+ // refresh font color
+ tab->setFavorite(tab->getFavorite());
+ }
+}
+
+void LLOutfitsList::onChangeSortOrder(const LLSD& userdata)
+{
+ std::string sort_data = userdata.asString();
+ if (sort_data == "favorites_to_top")
+ {
+ // at the moment this is a toggle
+ S32 val = gSavedSettings.getS32("OutfitListSortOrder");
+ gSavedSettings.setS32("OutfitListSortOrder", (val ? 0 : 1));
+
+ initComparator();
+ }
+ else if (sort_data == "show_entire_outfit")
+ {
+ bool new_val = !gSavedSettings.getBOOL("OutfitListFilterFullList");
+ gSavedSettings.setBOOL("OutfitListFilterFullList", new_val);
+
+ if (!getFilterSubString().empty())
+ {
+ for (outfits_map_t::value_type& outfit : mOutfitsMap)
+ {
+ LLAccordionCtrlTab* tab = outfit.second;
+ const LLUUID& category_id = outfit.first;
+ if (!tab) continue;
+
+ LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
+ if (list)
+ {
+ list->setForceRefresh(true);
+ list->setForceShowingUnmatchedItems(new_val, tab->getDisplayChildren());
+ }
+ applyFilterToTab(category_id, tab, getFilterSubString());
+ }
+ mAccordion->arrange();
+ }
+ }
+}
+
+LLToggleableMenu* LLOutfitsList::getSortMenu()
+{
+ if (!mSortMenu)
+ {
+ mSortMenu = new LLOutfitListSortMenu(this);
+ }
+ return mSortMenu->getMenu();
+}
+
+void LLOutfitsList::updateMenuItemsVisibility()
+{
+ if (mSortMenu)
+ {
+ mSortMenu->updateItemsVisibility();
+ }
+ LLOutfitListBase::updateMenuItemsVisibility();
+}
+
LLOutfitListGearMenuBase* LLOutfitsList::createGearMenu()
{
return new LLOutfitListGearMenu(this);
@@ -755,10 +901,10 @@ bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y)
LLOutfitListBase::LLOutfitListBase()
: LLPanelAppearanceTab()
, mIsInitialized(false)
+ , mGearMenu(nullptr)
{
mCategoriesObserver = new LLInventoryCategoriesObserver();
mOutfitMenu = new LLOutfitContextMenu(this);
- //mGearMenu = createGearMenu();
}
LLOutfitListBase::~LLOutfitListBase()
@@ -819,8 +965,45 @@ void LLOutfitListBase::observerCallback(const LLUUID& category_id)
refreshList(category_id);
}
+bool LLOutfitListBase::isOutfitFolder(LLViewerInventoryCategory* cat) const
+{
+ if (!cat)
+ {
+ return false;
+ }
+ if (cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ return true;
+ }
+ // assumes that folder is somewhere inside MyOutfits
+ if (cat->getPreferredType() == LLFolderType::FT_NONE)
+ {
+ LLViewerInventoryCategory* inv_cat = dynamic_cast<LLViewerInventoryCategory*>(cat);
+ if (inv_cat && inv_cat->getDescendentCount() > 3)
+ {
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items);
+ if (cats->empty() // protection against outfits inside
+ && items->size() > 3) // arbitrary, if doesn't have at least base parts, not an outfit
+ {
+ // For now assume this to be an old style outfit, not a subfolder
+ // but ideally no such 'outfits' should be left in My Outfits
+ // Todo: stop counting FT_NONE as outfits,
+ // convert obvious outfits into FT_OUTFIT
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
void LLOutfitListBase::refreshList(const LLUUID& category_id)
{
+ if (LLAppViewer::instance()->quitRequested())
+ {
+ return;
+ }
bool wasNull = mRefreshListState.CategoryUUID.isNull();
mRefreshListState.CategoryUUID.setNull();
@@ -879,10 +1062,21 @@ void LLOutfitListBase::onIdle(void* userdata)
void LLOutfitListBase::onIdleRefreshList()
{
+ LL_PROFILE_ZONE_SCOPED;
+ if (LLAppViewer::instance()->quitRequested())
+ {
+ mRefreshListState.CategoryUUID.setNull();
+ gIdleCallbacks.deleteFunction(onIdle, this);
+ return;
+ }
if (mRefreshListState.CategoryUUID.isNull())
+ {
+ LL_WARNS() << "Called onIdleRefreshList without id" << LL_ENDL;
+ gIdleCallbacks.deleteFunction(onIdle, this);
return;
+ }
- const F64 MAX_TIME = 0.05f;
+ const F64 MAX_TIME = 0.005f;
F64 curent_time = LLTimer::getTotalSeconds();
const F64 end_time = curent_time + MAX_TIME;
@@ -1022,12 +1216,6 @@ void LLOutfitListBase::ChangeOutfitSelection(LLWearableItemsList* list, const LL
bool LLOutfitListBase::postBuild()
{
- mGearMenu = createGearMenu();
-
- LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn");
-
- menu_gear_btn->setMouseDownCallback(boost::bind(&LLOutfitListGearMenuBase::updateItemsVisibility, mGearMenu));
- menu_gear_btn->setMenu(mGearMenu->getMenu());
return true;
}
@@ -1041,6 +1229,20 @@ void LLOutfitListBase::expandAllFolders()
onExpandAllFolders();
}
+void LLOutfitListBase::updateMenuItemsVisibility()
+{
+ mGearMenu->updateItemsVisibility();
+}
+
+LLToggleableMenu* LLOutfitListBase::getGearMenu()
+{
+ if (!mGearMenu)
+ {
+ mGearMenu = createGearMenu();
+ }
+ return mGearMenu->getMenu();
+};
+
void LLOutfitListBase::deselectOutfit(const LLUUID& category_id)
{
// Reset selection if the outfit is selected.
@@ -1067,6 +1269,7 @@ LLContextMenu* LLOutfitContextMenu::createMenu()
registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id));
registrar.add("Outfit.Delete", boost::bind(&LLOutfitListBase::removeSelected, mOutfitList));
registrar.add("Outfit.Thumbnail", boost::bind(&LLOutfitContextMenu::onThumbnail, this, selected_id));
+ registrar.add("Outfit.Favorite", boost::bind(&LLOutfitContextMenu::onFavorite, this, selected_id));
registrar.add("Outfit.Save", boost::bind(&LLOutfitContextMenu::onSave, this, selected_id));
enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitContextMenu::onEnable, this, _2));
@@ -1117,6 +1320,16 @@ bool LLOutfitContextMenu::onVisible(LLSD::String param)
{
return LLAppearanceMgr::instance().getCanRemoveOutfit(outfit_cat_id);
}
+ else if ("favorites_add" == param)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(outfit_cat_id);
+ return cat && !cat->getIsFavorite();
+ }
+ else if ("favorites_remove" == param)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(outfit_cat_id);
+ return cat && cat->getIsFavorite();
+ }
return true;
}
@@ -1141,6 +1354,14 @@ void LLOutfitContextMenu::onThumbnail(const LLUUID &outfit_cat_id)
}
}
+void LLOutfitContextMenu::onFavorite(const LLUUID& outfit_cat_id)
+{
+ if (outfit_cat_id.notNull())
+ {
+ toggle_favorite(outfit_cat_id);
+ }
+}
+
void LLOutfitContextMenu::onSave(const LLUUID &outfit_cat_id)
{
if (outfit_cat_id.notNull())
@@ -1171,14 +1392,13 @@ LLOutfitListGearMenuBase::LLOutfitListGearMenuBase(LLOutfitListBase* olist)
registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenuBase::onRename, this));
registrar.add("Gear.Delete", boost::bind(&LLOutfitListBase::removeSelected, mOutfitList));
registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenuBase::onCreate, this, _2));
- registrar.add("Gear.Collapse", boost::bind(&LLOutfitListBase::onCollapseAllFolders, mOutfitList));
- registrar.add("Gear.Expand", boost::bind(&LLOutfitListBase::onExpandAllFolders, mOutfitList));
registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenuBase::onAdd, this));
registrar.add("Gear.Save", boost::bind(&LLOutfitListGearMenuBase::onSave, this));
registrar.add("Gear.Thumbnail", boost::bind(&LLOutfitListGearMenuBase::onThumbnail, this));
- registrar.add("Gear.SortByName", boost::bind(&LLOutfitListGearMenuBase::onChangeSortOrder, this));
+ registrar.add("Gear.Favorite", boost::bind(&LLOutfitListGearMenuBase::onFavorite, this));
+ registrar.add("Gear.SortByImage", boost::bind(&LLOutfitListGearMenuBase::onChangeSortOrder, this));
enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenuBase::onEnable, this, _2));
enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenuBase::onVisible, this, _2));
@@ -1312,6 +1532,16 @@ bool LLOutfitListGearMenuBase::onVisible(LLSD::String param)
{
return false;
}
+ else if ("favorites_add" == param)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id);
+ return cat && !cat->getIsFavorite();
+ }
+ else if ("favorites_remove" == param)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id);
+ return cat && cat->getIsFavorite();
+ }
return true;
}
@@ -1323,6 +1553,12 @@ void LLOutfitListGearMenuBase::onThumbnail()
LLFloaterReg::showInstance("change_item_thumbnail", data);
}
+void LLOutfitListGearMenuBase::onFavorite()
+{
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ toggle_favorite(selected_outfit_id);
+}
+
void LLOutfitListGearMenuBase::onChangeSortOrder()
{
@@ -1338,21 +1574,91 @@ LLOutfitListGearMenu::~LLOutfitListGearMenu()
void LLOutfitListGearMenu::onUpdateItemsVisibility()
{
if (!mMenu) return;
- mMenu->setItemVisible("expand", true);
- mMenu->setItemVisible("collapse", true);
mMenu->setItemVisible("thumbnail", getSelectedOutfitID().notNull());
+ mMenu->setItemVisible("favorite", getSelectedOutfitID().notNull());
mMenu->setItemVisible("sepatator3", false);
mMenu->setItemVisible("sort_folders_by_name", false);
LLOutfitListGearMenuBase::onUpdateItemsVisibility();
}
+//////////////////// LLOutfitListSortMenu ////////////////////
+
+LLOutfitListSortMenu::LLOutfitListSortMenu(LLOutfitListBase* parent_panel)
+ : mPanelHandle(parent_panel->getHandle())
+{
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add("Sort.Collapse", boost::bind(&LLOutfitListBase::onCollapseAllFolders, parent_panel));
+ registrar.add("Sort.Expand", boost::bind(&LLOutfitListBase::onExpandAllFolders, parent_panel));
+ registrar.add("Sort.OnSort", boost::bind(&LLOutfitListBase::onChangeSortOrder, parent_panel, _2));
+ enable_registrar.add("Sort.OnEnable", boost::bind(&LLOutfitListSortMenu::onEnable, this, _2));
+
+ mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
+ "menu_outfit_list_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ llassert(mMenu);
+}
+
+
+LLToggleableMenu* LLOutfitListSortMenu::getMenu()
+{
+ return mMenu;
+}
+
+void LLOutfitListSortMenu::updateItemsVisibility()
+{
+ onUpdateItemsVisibility();
+}
+
+void LLOutfitListSortMenu::onUpdateItemsVisibility()
+{
+ if (!mMenu) return;
+ mMenu->setItemVisible("expand", true);
+ mMenu->setItemVisible("collapse", true);
+ mMenu->setItemVisible("sort_favorites_to_top", true);
+ mMenu->setItemVisible("show_entire_outfit_in_search", true);
+}
+
+bool LLOutfitListSortMenu::onEnable(LLSD::String param)
+{
+ if ("favorites_to_top" == param)
+ {
+ static LLCachedControl<S32> sort_order(gSavedSettings, "OutfitListSortOrder", 0);
+ return sort_order == 1;
+ }
+ else if ("show_entire_outfit" == param)
+ {
+ static LLCachedControl<bool> filter_mode(gSavedSettings, "OutfitListFilterFullList", 0);
+ return filter_mode;
+ }
+
+ return false;
+}
+
+
+//////////////////// LLOutfitAccordionCtrlTab ////////////////////
+
+LLUIImage* LLOutfitAccordionCtrlTab::sFavoriteIcon;
+LLUIColor LLOutfitAccordionCtrlTab::sFgColor;
+
+void LLOutfitAccordionCtrlTab::draw()
+{
+ LLAccordionCtrlTab::draw();
+ drawFavoriteIcon();
+}
+
bool LLOutfitAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask)
{
if (y >= getLocalRect().getHeight() - getHeaderHeight())
{
LLSD params;
params["inv_type"] = LLInventoryType::IT_CATEGORY;
- params["thumbnail_id"] = gInventory.getCategory(mFolderID)->getThumbnailUUID();
+ LLViewerInventoryCategory* cat = gInventory.getCategory(mFolderID);
+ if (cat)
+ {
+ params["thumbnail_id"] = cat->getThumbnailUUID();
+ }
+ // else consider returning
params["item_id"] = mFolderID;
LLToolTipMgr::instance().show(LLToolTip::Params()
@@ -1366,4 +1672,54 @@ bool LLOutfitAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask)
return LLAccordionCtrlTab::handleToolTip(x, y, mask);
}
+
+void LLOutfitAccordionCtrlTab::setFavorite(bool is_favorite)
+{
+ mIsFavorite = is_favorite;
+ updateTitleColor();
+}
+
+void LLOutfitAccordionCtrlTab::setOutfitSelected(bool val)
+{
+ mIsSelected = val;
+ setTitleFontStyle(mIsSelected ? "BOLD" : "NORMAL");
+ updateTitleColor();
+ }
+
+void LLOutfitAccordionCtrlTab::updateTitleColor()
+ {
+ static LLUICachedControl<bool> highlight_color("InventoryFavoritesColorText", true);
+ if (mIsFavorite && highlight_color())
+ {
+ setTitleColor(LLUIColorTable::instance().getColor("InventoryFavoriteColor"));
+ }
+ else if (mIsSelected)
+ {
+ setTitleColor(LLUIColorTable::instance().getColor("SelectedOutfitTextColor"));
+ }
+ else
+ {
+ setTitleColor(LLUIColorTable::instance().getColor("AccordionHeaderTextColor"));
+ }
+ }
+
+void LLOutfitAccordionCtrlTab::drawFavoriteIcon()
+{
+ if (!mIsFavorite)
+ {
+ return;
+ }
+ static LLUICachedControl<bool> draw_star("InventoryFavoritesUseStar", true);
+ if (!draw_star)
+ {
+ return;
+ }
+
+ const S32 PAD = 2;
+ const S32 image_size = 18;
+
+ gl_draw_scaled_image(
+ getRect().getWidth() - image_size - PAD, getRect().getHeight() - image_size - PAD,
+ image_size, image_size, sFavoriteIcon->getImage(), sFgColor);
+}
// EOF
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index f581b419d9..0bf5becb05 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -41,6 +41,7 @@
class LLAccordionCtrlTab;
class LLInventoryCategoriesObserver;
class LLOutfitListGearMenuBase;
+class LLOutfitListSortMenuBase;
class LLWearableItemsList;
class LLListContextMenu;
@@ -61,6 +62,17 @@ public:
/*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const;
};
+class LLOutfitTabFavComparator : public LLAccordionCtrl::LLTabComparator
+{
+ LOG_CLASS(LLOutfitTabFavComparator);
+
+public:
+ LLOutfitTabFavComparator() {};
+ virtual ~LLOutfitTabFavComparator() {};
+
+ /*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const;
+};
+
class LLOutfitListBase : public LLPanelAppearanceTab
{
public:
@@ -92,6 +104,7 @@ public:
boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb);
void outfitRightClickCallBack(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);
+ void onAction(const LLSD& userdata);
virtual bool isActionEnabled(const LLSD& userdata);
virtual void performAction(std::string action);
virtual bool hasItemSelected() = 0;
@@ -109,6 +122,12 @@ public:
virtual bool getHasExpandableFolders() = 0;
+ virtual void onChangeSortOrder(const LLSD& userdata) = 0;
+
+ virtual void updateMenuItemsVisibility();
+ virtual LLToggleableMenu* getGearMenu();
+ virtual bool getTrashMenuVisible() { return true; };
+
protected:
void observerCallback(const LLUUID& category_id);
virtual LLOutfitListGearMenuBase* createGearMenu() = 0;
@@ -118,6 +137,8 @@ protected:
void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response);
virtual void onChangeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id) = 0;
+ bool isOutfitFolder(LLViewerInventoryCategory* cat) const;
+
static void onIdle(void* userdata);
void onIdleRefreshList();
@@ -139,6 +160,7 @@ protected:
selection_change_signal_t mSelectionChangeSignal;
LLListContextMenu* mOutfitMenu;
LLOutfitListGearMenuBase* mGearMenu;
+ boost::signals2::connection mGearMenuConnection;
};
//////////////////////////////////////////////////////////////////////////
@@ -155,7 +177,6 @@ protected:
/* virtual */ LLContextMenu* createMenu();
bool onEnable(LLSD::String param);
-
bool onVisible(LLSD::String param);
static void editOutfit();
@@ -163,6 +184,7 @@ protected:
static void renameOutfit(const LLUUID& outfit_cat_id);
void onThumbnail(const LLUUID &outfit_cat_id);
+ void onFavorite(const LLUUID& outfit_cat_id);
void onSave(const LLUUID &outfit_cat_id);
private:
@@ -182,6 +204,7 @@ public:
protected:
virtual void onUpdateItemsVisibility();
virtual void onThumbnail();
+ virtual void onFavorite();
virtual void onChangeSortOrder();
const LLUUID& getSelectedOutfitID();
@@ -202,6 +225,23 @@ private:
bool onVisible(LLSD::String param);
};
+class LLOutfitListSortMenu
+{
+public:
+ LLOutfitListSortMenu(LLOutfitListBase* parent_panel);
+
+ LLToggleableMenu* getMenu();
+ void updateItemsVisibility();
+
+private:
+ void onUpdateItemsVisibility();
+ bool onEnable(LLSD::String param);
+
+ LLToggleableMenu* mMenu;
+ LLHandle<LLPanel> mPanelHandle;
+};
+
+
class LLOutfitListGearMenu : public LLOutfitListGearMenuBase
{
public:
@@ -221,8 +261,16 @@ public:
Params() : cat_id("cat_id") {}
};
+ virtual void draw();
virtual bool handleToolTip(S32 x, S32 y, MASK mask);
+ void setFavorite(bool is_favorite);
+ bool getFavorite() const { return mIsFavorite; }
+ void setOutfitSelected(bool val);
+
+ static LLUIImage* sFavoriteIcon;
+ static LLUIColor sFgColor;
+
protected:
LLOutfitAccordionCtrlTab(const LLOutfitAccordionCtrlTab::Params &p)
: LLAccordionCtrlTab(p),
@@ -230,7 +278,12 @@ public:
{}
friend class LLUICtrlFactory;
+ void updateTitleColor();
+ void drawFavoriteIcon();
+
LLUUID mFolderID;
+ bool mIsFavorite = false;
+ bool mIsSelected = false;
};
/**
* @class LLOutfitsList
@@ -249,6 +302,7 @@ public:
virtual ~LLOutfitsList();
/*virtual*/ bool postBuild();
+ void initComparator();
/*virtual*/ void onOpen(const LLSD& info);
@@ -287,6 +341,10 @@ public:
/*virtual*/ bool getHasExpandableFolders() { return true; }
+ /*virtual*/ void onChangeSortOrder(const LLSD& userdata);
+ virtual LLToggleableMenu* getSortMenu();
+ void updateMenuItemsVisibility();
+
protected:
LLOutfitListGearMenuBase* createGearMenu();
@@ -357,6 +415,8 @@ private:
static void onOutfitRename(const LLSD& notification, const LLSD& response);
+ void handleInvFavColorChange();
+
//LLInventoryCategoriesObserver* mCategoriesObserver;
LLAccordionCtrl* mAccordion;
@@ -374,13 +434,15 @@ private:
// Used to monitor COF changes for updating items worn state. See EXT-8636.
uuid_vec_t mCOFLinkedItems;
- //LLOutfitListGearMenu* mGearMenu;
+ LLOutfitListSortMenu* mSortMenu;
//bool mIsInitialized;
/**
* True if there is a selection inside currently selected outfit
*/
bool mItemSelected;
+
+ boost::signals2::connection mSavedSettingInvFavColor;
};
#endif //LL_LLOUTFITSLIST_H
diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h
index e4d16582de..e088c3e6f0 100644
--- a/indra/newview/llpanelappearancetab.h
+++ b/indra/newview/llpanelappearancetab.h
@@ -29,6 +29,8 @@
#include "llpanel.h"
+class LLToggleableMenu;
+
class LLPanelAppearanceTab : public LLPanel
{
public:
@@ -47,6 +49,11 @@ public:
const std::string& getFilterSubString() { return mFilterSubString; }
+ virtual void updateMenuItemsVisibility() = 0;
+ virtual LLToggleableMenu* getGearMenu() = 0;
+ virtual LLToggleableMenu* getSortMenu() = 0;
+ virtual bool getTrashMenuVisible() = 0;
+
protected:
/**
diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp
index 3a6a6a5ec3..f0555408dd 100644
--- a/indra/newview/llpanelemojicomplete.cpp
+++ b/indra/newview/llpanelemojicomplete.cpp
@@ -463,6 +463,7 @@ void LLPanelEmojiComplete::updateConstraints()
{
mEmojiHeight = mRenderRect.getHeight();
mRenderRect.stretch((mRenderRect.getWidth() - static_cast<S32>(mVisibleEmojis) * mEmojiWidth) / -2, 0);
+ mRenderRect.translate(-mRenderRect.mLeft, 0); // Left align emojis to fix hitboxes
}
updateScrollPos();
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 4ada9c445c..fc5c468297 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -162,6 +162,36 @@ void LLPanelFace::updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&select_func);
}
+void LLPanelFace::updateSelectedGLTFMaterialsWithScale(std::function<void(LLGLTFMaterial*, const F32, const F32)> func)
+{
+ struct LLSelectedTEGLTFMaterialFunctor : public LLSelectedTEFunctor
+ {
+ LLSelectedTEGLTFMaterialFunctor(std::function<void(LLGLTFMaterial*, const F32, const F32)> func) : mFunc(func) {}
+ virtual ~LLSelectedTEGLTFMaterialFunctor() {};
+ bool apply(LLViewerObject* object, S32 face) override
+ {
+ LLGLTFMaterial new_override;
+ const LLTextureEntry* tep = object->getTE(face);
+ if (tep->getGLTFMaterialOverride())
+ {
+ new_override = *tep->getGLTFMaterialOverride();
+ }
+
+ U32 s_axis = VX;
+ U32 t_axis = VY;
+ LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);
+ mFunc(&new_override, object->getScale().mV[s_axis], object->getScale().mV[t_axis]);
+ LLGLTFMaterialList::queueModify(object, face, &new_override);
+
+ return true;
+ }
+
+ std::function<void(LLGLTFMaterial*, const F32, const F32)> mFunc;
+ } select_func(func);
+
+ LLSelectMgr::getInstance()->getSelection()->applyToTEs(&select_func);
+}
+
template<typename T>
void readSelectedGLTFMaterial(std::function<T(const LLGLTFMaterial*)> func, T& value, bool& identical, bool has_tolerance, T tolerance)
{
@@ -182,6 +212,36 @@ void readSelectedGLTFMaterial(std::function<T(const LLGLTFMaterial*)> func, T& v
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&select_func, value, has_tolerance, tolerance);
}
+void getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo channel, F32& repeats, bool& identical)
+{
+ // The All channel should read base color values
+ if (channel == LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_COUNT)
+ channel = LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR;
+
+ struct LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor : public LLSelectedTEGetFunctor<F32>
+ {
+ LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor(LLGLTFMaterial::TextureInfo channel) : mChannel(channel) {}
+ virtual ~LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor() {};
+ F32 get(LLViewerObject* object, S32 face) override
+ {
+ const LLTextureEntry* tep = object->getTE(face);
+ const LLGLTFMaterial* render_material = tep->getGLTFRenderMaterial();
+ if (!render_material)
+ return 0.f;
+
+ U32 s_axis = VX;
+ U32 t_axis = VY;
+ LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);
+ F32 repeats_u = render_material->mTextureTransform[mChannel].mScale[VX] / object->getScale().mV[s_axis];
+ F32 repeats_v = render_material->mTextureTransform[mChannel].mScale[VY] / object->getScale().mV[t_axis];
+ return llmax(repeats_u, repeats_v);
+ }
+
+ LLGLTFMaterial::TextureInfo mChannel;
+ } max_repeats_func(channel);
+ identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&max_repeats_func, repeats);
+}
+
BOOST_STATIC_ASSERT(MATTYPE_DIFFUSE == LLRender::DIFFUSE_MAP && MATTYPE_NORMAL == LLRender::NORMAL_MAP && MATTYPE_SPECULAR == LLRender::SPECULAR_MAP);
//
@@ -216,7 +276,7 @@ LLRender::eTexIndex LLPanelFace::getMatTextureChannel()
return LLRender::NORMAL_MAP;
break;
case MATTYPE_SPECULAR: // "Shininess (specular)"
- if (getCurrentNormalMap().notNull())
+ if (getCurrentSpecularMap().notNull())
return LLRender::SPECULAR_MAP;
break;
}
@@ -322,6 +382,7 @@ bool LLPanelFace::postBuild()
getChildSetCommitCallback(mPBRScaleU, "gltfTextureScaleU", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureScaleU(); });
getChildSetCommitCallback(mPBRScaleV, "gltfTextureScaleV", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureScaleV(); });
+ getChildSetCommitCallback(mPBRRepeat, "gltfRptctrl", [&](LLUICtrl*, const LLSD&) { onCommitGLTFRepeatsPerMeter(); });
getChildSetCommitCallback(mPBRRotate, "gltfTextureRotation", [&](LLUICtrl*, const LLSD&) { onCommitGLTFRotation(); });
getChildSetCommitCallback(mPBROffsetU, "gltfTextureOffsetU", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureOffsetU(); });
getChildSetCommitCallback(mPBROffsetV, "gltfTextureOffsetV", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureOffsetV(); });
@@ -482,10 +543,6 @@ LLPanelFace::~LLPanelFace()
void LLPanelFace::onVisibilityChange(bool new_visibility)
{
- if (new_visibility)
- {
- gAgent.showLatestFeatureNotification("gltf");
- }
LLPanel::onVisibilityChange(new_visibility);
}
@@ -1106,6 +1163,63 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
updateVisibility(objectp);
+ bool missing_asset = false;
+ {
+ LLGLenum image_format = GL_RGB;
+ bool identical_image_format = false;
+ LLSelectedTE::getImageFormat(image_format, identical_image_format, missing_asset);
+
+ if (!missing_asset)
+ {
+ mIsAlpha = false;
+ switch (image_format)
+ {
+ case GL_RGBA:
+ case GL_ALPHA:
+ {
+ mIsAlpha = true;
+ }
+ break;
+
+ case GL_RGB:
+ break;
+ default:
+ {
+ LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL;
+ }
+ break;
+ }
+ }
+ else
+ {
+ // Don't know image's properties, use material's mode value
+ mIsAlpha = true;
+ }
+
+ // Diffuse Alpha Mode
+ // Init to the default that is appropriate for the alpha content of the asset
+ //
+ U8 alpha_mode = mIsAlpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
+
+ bool identical_alpha_mode = false;
+
+ // See if that's been overridden by a material setting for same...
+ //
+ LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(alpha_mode, identical_alpha_mode, mIsAlpha);
+
+ // it is invalid to have any alpha mode other than blend if transparency is greater than zero ...
+ // Want masking? Want emissive? Tough! You get BLEND!
+ alpha_mode = (transparency > 0.f) ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : alpha_mode;
+
+ // ... unless there is no alpha channel in the texture, in which case alpha mode MUST be none
+ alpha_mode = mIsAlpha ? alpha_mode : LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
+
+ mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode);
+ updateAlphaControls();
+
+ mExcludeWater &= (LLMaterial::DIFFUSE_ALPHA_MODE_BLEND == alpha_mode);
+ }
+
// Water exclusion
{
mCheckHideWater->setEnabled(editable && !has_pbr_material && !isMediaTexSelected());
@@ -1188,65 +1302,11 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
// Texture
{
- LLGLenum image_format = GL_RGB;
- bool identical_image_format = false;
- bool missing_asset = false;
- LLSelectedTE::getImageFormat(image_format, identical_image_format, missing_asset);
-
- if (!missing_asset)
- {
- mIsAlpha = false;
- switch (image_format)
- {
- case GL_RGBA:
- case GL_ALPHA:
- {
- mIsAlpha = true;
- }
- break;
-
- case GL_RGB: break;
- default:
- {
- LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL;
- }
- break;
- }
- }
- else
- {
- // Don't know image's properties, use material's mode value
- mIsAlpha = true;
- }
-
if (LLViewerMedia::getInstance()->textureHasMedia(id))
{
mBtnAlign->setEnabled(editable);
}
- // Diffuse Alpha Mode
-
- // Init to the default that is appropriate for the alpha content of the asset
- //
- U8 alpha_mode = mIsAlpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
-
- bool identical_alpha_mode = false;
-
- // See if that's been overridden by a material setting for same...
- //
- LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(alpha_mode, identical_alpha_mode, mIsAlpha);
-
- // it is invalid to have any alpha mode other than blend if transparency is greater than zero ...
- // Want masking? Want emissive? Tough! You get BLEND!
- alpha_mode = (transparency > 0.f) ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : alpha_mode;
-
- // ... unless there is no alpha channel in the texture, in which case alpha mode MUST be none
- alpha_mode = mIsAlpha ? alpha_mode : LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
-
- mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode);
-
- updateAlphaControls();
-
if (mTextureCtrl)
{
if (identical_diffuse)
@@ -1395,9 +1455,18 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
spec_scale_s = editable ? spec_scale_s : 1.0f;
spec_scale_s *= identical_planar_texgen ? 2.0f : 1.0f;
- mTexScaleU->setValue(diff_scale_s);
- mShinyScaleU->setValue(spec_scale_s);
- mBumpyScaleU->setValue(norm_scale_s);
+ if (force_set_values)
+ {
+ mTexScaleU->forceSetValue(diff_scale_s);
+ mShinyScaleU->forceSetValue(spec_scale_s);
+ mBumpyScaleU->forceSetValue(norm_scale_s);
+ }
+ else
+ {
+ mTexScaleU->setValue(diff_scale_s);
+ mShinyScaleU->setValue(spec_scale_s);
+ mBumpyScaleU->setValue(norm_scale_s);
+ }
mTexScaleU->setEnabled(editable && has_material);
mShinyScaleU->setEnabled(editable && has_material && specmap_id.notNull());
@@ -1445,13 +1514,16 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (force_set_values)
{
mTexScaleV->forceSetValue(diff_scale_t);
+ mShinyScaleV->forceSetValue(spec_scale_t);
+ mBumpyScaleV->forceSetValue(norm_scale_t);
}
else
{
mTexScaleV->setValue(diff_scale_t);
+ mShinyScaleV->setValue(spec_scale_t);
+ mBumpyScaleV->setValue(norm_scale_t);
}
- mShinyScaleV->setValue(spec_scale_t);
- mBumpyScaleV->setValue(norm_scale_t);
+
mTexScaleV->setTentative(LLSD(diff_scale_tentative));
mShinyScaleV->setTentative(LLSD(spec_scale_tentative));
@@ -1591,36 +1663,57 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
F32 repeats_norm = 1.f;
F32 repeats_spec = 1.f;
+ F32 repeats_pbr_basecolor = 1.f;
+ F32 repeats_pbr_metallic_roughness = 1.f;
+ F32 repeats_pbr_normal = 1.f;
+ F32 repeats_pbr_emissive = 1.f;
+
bool identical_diff_repeats = false;
bool identical_norm_repeats = false;
bool identical_spec_repeats = false;
- LLSelectedTE::getMaxDiffuseRepeats(repeats_diff, identical_diff_repeats);
- LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats);
- LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats);
+ bool identical_pbr_basecolor_repeats = false;
+ bool identical_pbr_metallic_roughness_repeats = false;
+ bool identical_pbr_normal_repeats = false;
+ bool identical_pbr_emissive_repeats = false;
{
+ LLSpinCtrl* repeats_spin_ctrl = nullptr;
S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0;
bool enabled = editable && (index != 1);
bool identical_repeats = true;
S32 material_selection = mComboMatMedia->getCurrentIndex();
F32 repeats = 1.0f;
- U32 material_type = MATTYPE_DIFFUSE;
- if (material_selection == MATMEDIA_MATERIAL)
+ LLRender::eTexIndex material_channel = LLRender::DIFFUSE_MAP;
+ if (material_selection != MATMEDIA_PBR)
{
- material_type = mRadioMaterialType->getSelectedIndex();
+ repeats_spin_ctrl = mTexRepeat;
+ material_channel = getMatTextureChannel();
+ LLSelectedTE::getMaxDiffuseRepeats(repeats_diff, identical_diff_repeats);
+ LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats);
+ LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats);
}
else if (material_selection == MATMEDIA_PBR)
{
+ repeats_spin_ctrl = mPBRRepeat;
enabled = editable && has_pbr_material;
- material_type = mRadioPbrType->getSelectedIndex();
+ material_channel = getPBRTextureChannel();
+
+ getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR,
+ repeats_pbr_basecolor, identical_pbr_basecolor_repeats);
+ getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS,
+ repeats_pbr_metallic_roughness, identical_pbr_metallic_roughness_repeats);
+ getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_NORMAL,
+ repeats_pbr_normal, identical_pbr_normal_repeats);
+ getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_EMISSIVE,
+ repeats_pbr_emissive, identical_pbr_emissive_repeats);
}
- switch (material_type)
+ switch (material_channel)
{
default:
- case MATTYPE_DIFFUSE:
+ case LLRender::DIFFUSE_MAP:
if (material_selection != MATMEDIA_PBR)
{
enabled = editable && !id.isNull();
@@ -1628,7 +1721,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
identical_repeats = identical_diff_repeats;
repeats = repeats_diff;
break;
- case MATTYPE_SPECULAR:
+ case LLRender::SPECULAR_MAP:
if (material_selection != MATMEDIA_PBR)
{
enabled = (editable && ((shiny == SHINY_TEXTURE) && !specmap_id.isNull()));
@@ -1636,7 +1729,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
identical_repeats = identical_spec_repeats;
repeats = repeats_spec;
break;
- case MATTYPE_NORMAL:
+ case LLRender::NORMAL_MAP:
if (material_selection != MATMEDIA_PBR)
{
enabled = (editable && ((bumpy == BUMPY_TEXTURE) && !normmap_id.isNull()));
@@ -1644,6 +1737,23 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
identical_repeats = identical_norm_repeats;
repeats = repeats_norm;
break;
+ case LLRender::NUM_TEXTURE_CHANNELS:
+ case LLRender::BASECOLOR_MAP:
+ identical_repeats = identical_pbr_basecolor_repeats;
+ repeats = repeats_pbr_basecolor;
+ break;
+ case LLRender::METALLIC_ROUGHNESS_MAP:
+ identical_repeats = identical_pbr_metallic_roughness_repeats;
+ repeats = repeats_pbr_metallic_roughness;
+ break;
+ case LLRender::GLTF_NORMAL_MAP:
+ identical_repeats = identical_pbr_normal_repeats;
+ repeats = repeats_pbr_normal;
+ break;
+ case LLRender::EMISSIVE_MAP:
+ identical_repeats = identical_pbr_emissive_repeats;
+ repeats = repeats_pbr_emissive;
+ break;
}
bool repeats_tentative = !identical_repeats;
@@ -1651,14 +1761,14 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (force_set_values)
{
// onCommit, previosly edited element updates related ones
- mTexRepeat->forceSetValue(editable ? repeats : 1.0f);
+ repeats_spin_ctrl->forceSetValue(editable ? repeats : 1.0f);
}
else
{
- mTexRepeat->setValue(editable ? repeats : 1.0f);
+ repeats_spin_ctrl->setValue(editable ? repeats : 1.0f);
}
- mTexRepeat->setTentative(LLSD(repeats_tentative));
- mTexRepeat->setEnabled(has_material && !identical_planar_texgen && enabled);
+ repeats_spin_ctrl->setTentative(LLSD(repeats_tentative));
+ repeats_spin_ctrl->setEnabled(!identical_planar_texgen && enabled);
}
}
@@ -1804,6 +1914,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
mLabelColorTransp->setEnabled(false);
mTexRepeat->setEnabled(false);
+ mPBRRepeat->setEnabled(false);
mLabelTexGen->setEnabled(false);
mLabelShininess->setEnabled(false);
mLabelBumpiness->setEnabled(false);
@@ -1999,6 +2110,7 @@ void LLPanelFace::updateVisibilityGLTF(LLViewerObject* objectp /*= nullptr */)
mPBRRotate->setVisible(show_pbr);
mPBROffsetU->setVisible(show_pbr);
mPBROffsetV->setVisible(show_pbr);
+ mPBRRepeat->setVisible(show_pbr);
}
void LLPanelFace::updateCopyTexButton()
@@ -2093,7 +2205,7 @@ void LLPanelFace::refreshMedia()
// check if all faces have media(or, all dont have media)
- LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue(&func, bool_has_media);
+ bool identical_has_media_info = selected_objects->getSelectedTEValue(&func, bool_has_media);
const LLMediaEntry default_media_data;
@@ -2115,7 +2227,8 @@ void LLPanelFace::refreshMedia()
} func_media_data(default_media_data);
LLMediaEntry media_data_get;
- LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue(&func_media_data, media_data_get));
+ bool multiple_media = !(selected_objects->getSelectedTEValue(&func_media_data, media_data_get));
+ bool multiple_valid_media = false;
std::string multi_media_info_str = LLTrans::getString("Multiple Media");
std::string media_title = "";
@@ -2124,12 +2237,12 @@ void LLPanelFace::refreshMedia()
mAddMedia->setEnabled(editable);
// IF all the faces have media (or all dont have media)
- if (LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo)
+ if (identical_has_media_info)
{
// TODO: get media title and set it.
mTitleMediaText->clear();
// if identical is set, all faces are same (whether all empty or has the same media)
- if (!(LLFloaterMediaSettings::getInstance()->mMultipleMedia))
+ if (!multiple_media)
{
// Media data is valid
if (media_data_get != default_media_data)
@@ -2150,9 +2263,9 @@ void LLPanelFace::refreshMedia()
else // not all face has media but at least one does.
{
// seleted faces have not identical value
- LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data);
+ multiple_valid_media = selected_objects->isMultipleTEValue(&func_media_data, default_media_data);
- if (LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
+ if (multiple_valid_media)
{
media_title = multi_media_info_str;
}
@@ -2189,7 +2302,7 @@ void LLPanelFace::refreshMedia()
// load values for media settings
updateMediaSettings();
- LLFloaterMediaSettings::initValues(mMediaSettings, editable);
+ LLFloaterMediaSettings::initValues(mMediaSettings, editable, identical_has_media_info, multiple_media, multiple_valid_media);
}
void LLPanelFace::unloadMedia()
@@ -3262,6 +3375,7 @@ void LLPanelFace::onSelectNormalTexture(const LLSD& data)
// TODO: test if there is media on the item and only allow editing if present
void LLPanelFace::onClickBtnEditMedia()
{
+ LLFloaterMediaSettings::getInstance(); // make sure floater we are about to open exists before refreshMedia
refreshMedia();
LLFloaterReg::showInstance("media_settings");
}
@@ -3280,6 +3394,7 @@ void LLPanelFace::onClickBtnAddMedia()
// check if multiple faces are selected
if (LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
{
+ LLFloaterMediaSettings::getInstance(); // make sure floater we are about to open exists before refreshMedia
refreshMedia();
LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
}
@@ -3644,23 +3759,13 @@ void LLPanelFace::onCommitRepeatsPerMeter()
bool identical_scale_t = false;
LLSelectedTE::getObjectScaleS(obj_scale_s, identical_scale_s);
- LLSelectedTE::getObjectScaleS(obj_scale_t, identical_scale_t);
+ LLSelectedTE::getObjectScaleT(obj_scale_t, identical_scale_t);
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
LLSelectMgr::getInstance()->selectionTexScaleAutofit(repeats_per_meter);
-
- mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter);
- mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter);
-
- LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter);
-
- mShinyScaleU->setValue(obj_scale_s * repeats_per_meter);
- mShinyScaleV->setValue(obj_scale_t * repeats_per_meter);
-
- LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter);
+ LLSelectedTEMaterial::selectionNormalScaleAutofit(this, repeats_per_meter);
+ LLSelectedTEMaterial::selectionSpecularScaleAutofit(this, repeats_per_meter);
}
else
{
@@ -3671,18 +3776,10 @@ void LLPanelFace::onCommitRepeatsPerMeter()
LLSelectMgr::getInstance()->selectionTexScaleAutofit(repeats_per_meter);
break;
case MATTYPE_NORMAL:
- mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter);
- mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter);
-
- LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter);
+ LLSelectedTEMaterial::selectionNormalScaleAutofit(this, repeats_per_meter);
break;
case MATTYPE_SPECULAR:
- mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter);
- mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter);
-
- LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter);
+ LLSelectedTEMaterial::selectionSpecularScaleAutofit(this, repeats_per_meter);
break;
default:
llassert(false);
@@ -3693,6 +3790,21 @@ void LLPanelFace::onCommitRepeatsPerMeter()
updateUI(true);
}
+// Commit the number of GLTF repeats per meter
+void LLPanelFace::onCommitGLTFRepeatsPerMeter()
+{
+ F32 repeats_per_meter = (F32)mPBRRepeat->getValue().asReal();
+
+ LLGLTFMaterial::TextureInfo material_type = getPBRTextureInfo();
+ updateGLTFTextureTransformWithScale(material_type, [&](LLGLTFMaterial::TextureTransform* new_transform, F32 scale_s, F32 scale_t)
+ {
+ new_transform->mScale.mV[VX] = scale_s * repeats_per_meter;
+ new_transform->mScale.mV[VY] = scale_t * repeats_per_meter;
+ });
+
+ updateUI(true);
+}
+
struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
{
virtual bool apply(LLViewerObject* object, S32 te)
@@ -4009,6 +4121,85 @@ void LLPanelFace::onPasteColor(LLViewerObject* objectp, S32 te)
}
}
+void set_item_availability(
+ const LLUUID& id,
+ LLSD& dest,
+ const std::string& modifier,
+ bool is_creator,
+ std::map<LLUUID, LLUUID> &asset_item_map,
+ LLViewerObject* objectp)
+{
+ if (id.isNull())
+ {
+ return;
+ }
+
+ LLUUID item_id;
+ bool from_library = get_is_predefined_texture(id);
+ bool full_perm = from_library;
+ full_perm |= is_creator;
+
+ if (!full_perm)
+ {
+ std::map<LLUUID, LLUUID>::iterator iter = asset_item_map.find(id);
+ if (iter != asset_item_map.end())
+ {
+ item_id = iter->second;
+ }
+ else
+ {
+ // What this does is simply searches inventory for item with same asset id,
+ // as result it is Hightly unreliable, leaves little control to user, borderline hack
+ // but there are little options to preserve permissions - multiple inventory
+ // items might reference same asset and inventory search is expensive.
+ bool no_transfer = false;
+ if (objectp->getInventoryItemByAsset(id))
+ {
+ no_transfer = !objectp->getInventoryItemByAsset(id)->getIsFullPerm();
+ }
+ item_id = get_copy_free_item_by_asset_id(id, no_transfer);
+ // record value to avoid repeating inventory search when possible
+ asset_item_map[id] = item_id;
+ }
+ }
+
+ if (item_id.notNull() && gInventory.isObjectDescendentOf(item_id, gInventory.getLibraryRootFolderID()))
+ {
+ full_perm = true;
+ from_library = true;
+ }
+
+ dest[modifier + "itemfullperm"] = full_perm;
+ dest[modifier + "fromlibrary"] = from_library;
+
+ // If full permission object, texture is free to copy,
+ // but otherwise we need to check inventory and extract permissions
+ //
+ // Normally we care only about restrictions for current user and objects
+ // don't inherit any 'next owner' permissions from texture, so there is
+ // no need to record item id if full_perm==true
+ if (!full_perm && item_id.notNull())
+ {
+ LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
+ if (itemp)
+ {
+ LLPermissions item_permissions = itemp->getPermissions();
+ if (item_permissions.allowOperationBy(PERM_COPY,
+ gAgent.getID(),
+ gAgent.getGroupID()))
+ {
+ dest[modifier + "itemid"] = item_id;
+ dest[modifier + "itemfullperm"] = itemp->getIsFullPerm();
+ if (!itemp->isFinished())
+ {
+ // needed for dropTextureAllFaces
+ LLInventoryModelBackgroundFetch::instance().start(item_id, false);
+ }
+ }
+ }
+ }
+}
+
void LLPanelFace::onCopyTexture()
{
LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
@@ -4046,6 +4237,7 @@ void LLPanelFace::onCopyTexture()
if (tep)
{
LLSD te_data;
+ LLUUID pbr_id = objectp->getRenderMaterialID(te);
// asLLSD() includes media
te_data["te"] = tep->asLLSD();
@@ -4054,21 +4246,20 @@ void LLPanelFace::onCopyTexture()
te_data["te"]["bumpshiny"] = tep->getBumpShiny();
te_data["te"]["bumpfullbright"] = tep->getBumpShinyFullbright();
te_data["te"]["texgen"] = tep->getTexGen();
- te_data["te"]["pbr"] = objectp->getRenderMaterialID(te);
+ te_data["te"]["pbr"] = pbr_id;
if (tep->getGLTFMaterialOverride() != nullptr)
{
te_data["te"]["pbr_override"] = tep->getGLTFMaterialOverride()->asJSON();
}
- if (te_data["te"].has("imageid"))
+ if (te_data["te"].has("imageid") || pbr_id.notNull())
{
- LLUUID item_id;
- LLUUID id = te_data["te"]["imageid"].asUUID();
- bool from_library = get_is_predefined_texture(id);
- bool full_perm = from_library;
+ LLUUID img_id = te_data["te"]["imageid"].asUUID();
+ bool pbr_from_library = false;
+ bool pbr_full_perm = false;
+ bool is_creator = false;
- if (!full_perm
- && objectp->permCopy()
+ if (objectp->permCopy()
&& objectp->permTransfer()
&& objectp->permModify())
{
@@ -4078,66 +4269,31 @@ void LLPanelFace::onCopyTexture()
std::string creator_app_link;
LLUUID creator_id;
LLSelectMgr::getInstance()->selectGetCreator(creator_id, creator_app_link);
- full_perm = objectp->mOwnerID == creator_id;
+ is_creator = objectp->mOwnerID == creator_id;
}
- if (id.notNull() && !full_perm)
+ // check permissions for blin-phong/diffuse image and for pbr asset
+ if (img_id.notNull())
{
- std::map<LLUUID, LLUUID>::iterator iter = asset_item_map.find(id);
- if (iter != asset_item_map.end())
- {
- item_id = iter->second;
- }
- else
- {
- // What this does is simply searches inventory for item with same asset id,
- // as result it is Hightly unreliable, leaves little control to user, borderline hack
- // but there are little options to preserve permissions - multiple inventory
- // items might reference same asset and inventory search is expensive.
- bool no_transfer = false;
- if (objectp->getInventoryItemByAsset(id))
- {
- no_transfer = !objectp->getInventoryItemByAsset(id)->getIsFullPerm();
- }
- item_id = get_copy_free_item_by_asset_id(id, no_transfer);
- // record value to avoid repeating inventory search when possible
- asset_item_map[id] = item_id;
- }
+ set_item_availability(img_id, te_data["te"], "img", is_creator, asset_item_map, objectp);
}
-
- if (item_id.notNull() && gInventory.isObjectDescendentOf(item_id, gInventory.getLibraryRootFolderID()))
+ if (pbr_id.notNull())
{
- full_perm = true;
- from_library = true;
- }
+ set_item_availability(pbr_id, te_data["te"], "pbr", is_creator, asset_item_map, objectp);
- {
- te_data["te"]["itemfullperm"] = full_perm;
- te_data["te"]["fromlibrary"] = from_library;
-
- // If full permission object, texture is free to copy,
- // but otherwise we need to check inventory and extract permissions
- //
- // Normally we care only about restrictions for current user and objects
- // don't inherit any 'next owner' permissions from texture, so there is
- // no need to record item id if full_perm==true
- if (!full_perm && !from_library && item_id.notNull())
+ // permissions for overrides
+ // Overrides do not permit no-copy textures
+ LLGLTFMaterial* override = tep->getGLTFMaterialOverride();
+ if (override != nullptr)
{
- LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
- if (itemp)
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
{
- LLPermissions item_permissions = itemp->getPermissions();
- if (item_permissions.allowOperationBy(PERM_COPY,
- gAgent.getID(),
- gAgent.getGroupID()))
+ LLUUID& texture_id = override->mTextureId[i];
+ if (texture_id.notNull())
{
- te_data["te"]["imageitemid"] = item_id;
- te_data["te"]["itemfullperm"] = itemp->getIsFullPerm();
- if (!itemp->isFinished())
- {
- // needed for dropTextureAllFaces
- LLInventoryModelBackgroundFetch::instance().start(item_id, false);
- }
+ const std::string prefix = "pbr" + std::to_string(i);
+ te_data["te"][prefix + "imageid"] = texture_id;
+ set_item_availability(texture_id, te_data["te"], prefix, is_creator, asset_item_map, objectp);
}
}
}
@@ -4201,6 +4357,44 @@ void LLPanelFace::onCopyTexture()
}
}
+bool get_full_permission(const LLSD& te, const std::string &prefix)
+{
+ return te.has(prefix + "itemfullperm") && te[prefix+"itemfullperm"].asBoolean();
+}
+
+bool LLPanelFace::validateInventoryItem(const LLSD& te, const std::string& prefix)
+{
+ if (te.has(prefix + "itemid"))
+ {
+ LLUUID item_id = te[prefix + "itemid"].asUUID();
+ if (item_id.notNull())
+ {
+ LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
+ if (!itemp)
+ {
+ // image might be in object's inventory, but it can be not up to date
+ LLSD notif_args;
+ static std::string reason = getString("paste_error_inventory_not_found");
+ notif_args["REASON"] = reason;
+ LLNotificationsUtil::add("FacePasteFailed", notif_args);
+ return false;
+ }
+ }
+ }
+ else
+ {
+ // Item was not found on 'copy' stage
+ // Since this happened at copy, might be better to either show this
+ // at copy stage or to drop clipboard here
+ LLSD notif_args;
+ static std::string reason = getString("paste_error_inventory_not_found");
+ notif_args["REASON"] = reason;
+ LLNotificationsUtil::add("FacePasteFailed", notif_args);
+ return false;
+ }
+ return true;
+}
+
void LLPanelFace::onPasteTexture()
{
if (!mClipboardParams.has("texture"))
@@ -4265,39 +4459,49 @@ void LLPanelFace::onPasteTexture()
for (; iter != end; ++iter)
{
const LLSD& te_data = *iter;
- if (te_data.has("te") && te_data["te"].has("imageid"))
+ if (te_data.has("te"))
{
- bool full_perm = te_data["te"].has("itemfullperm") && te_data["te"]["itemfullperm"].asBoolean();
- full_perm_object &= full_perm;
- if (!full_perm)
+ if (te_data["te"].has("imageid"))
{
- if (te_data["te"].has("imageitemid"))
+ bool full_perm = get_full_permission(te_data["te"], "img");
+ full_perm_object &= full_perm;
+ if (!full_perm)
{
- LLUUID item_id = te_data["te"]["imageitemid"].asUUID();
- if (item_id.notNull())
+ if (!validateInventoryItem(te_data["te"], "img"))
{
- LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
- if (!itemp)
- {
- // image might be in object's inventory, but it can be not up to date
- LLSD notif_args;
- static std::string reason = getString("paste_error_inventory_not_found");
- notif_args["REASON"] = reason;
- LLNotificationsUtil::add("FacePasteFailed", notif_args);
- return;
- }
+ return;
}
}
- else
+ }
+ if (te_data["te"].has("pbr"))
+ {
+ bool full_perm = get_full_permission(te_data["te"], "pbr");
+ full_perm_object &= full_perm;
+ if (!full_perm)
{
- // Item was not found on 'copy' stage
- // Since this happened at copy, might be better to either show this
- // at copy stage or to drop clipboard here
- LLSD notif_args;
- static std::string reason = getString("paste_error_inventory_not_found");
- notif_args["REASON"] = reason;
- LLNotificationsUtil::add("FacePasteFailed", notif_args);
- return;
+ if (!validateInventoryItem(te_data["te"], "pbr"))
+ {
+ return;
+ }
+ }
+ if (te_data["te"].has("pbr_override"))
+ {
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ const std::string prefix = "pbr" + std::to_string(i);
+ if (te_data["te"].has(prefix + "imageid"))
+ {
+ bool full_perm = get_full_permission(te_data["te"], prefix);
+ full_perm_object &= full_perm;
+ if (!full_perm)
+ {
+ if (!validateInventoryItem(te_data["te"], prefix))
+ {
+ return;
+ }
+ }
+ }
+ }
}
}
}
@@ -4322,6 +4526,71 @@ void LLPanelFace::onPasteTexture()
selected_objects->applyToTEs(&navigate_home_func);
}
+void get_item_and_permissions(const LLUUID &id, LLViewerInventoryItem*& itemp, bool& full_perm, bool& from_library, const LLSD &data, const std::string &prefix)
+{
+ full_perm = get_full_permission(data, prefix);
+ from_library = data.has(prefix + "fromlibrary") && data.get(prefix + "fromlibrary").asBoolean();
+ LLViewerInventoryItem* itemp_res = NULL;
+
+ if (data.has(prefix + "itemid"))
+ {
+ LLUUID item_id = data.get(prefix + "itemid").asUUID();
+ if (item_id.notNull())
+ {
+ LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
+ if (itemp && itemp->isFinished())
+ {
+ // dropTextureAllFaces will fail if incomplete
+ itemp_res = itemp;
+ }
+ else
+ {
+ // Theoretically shouldn't happend, but if it does happen, we
+ // might need to add a notification to user that paste will fail
+ // since inventory isn't fully loaded
+ LL_WARNS() << "Item " << item_id << " is incomplete, paste might fail silently." << LL_ENDL;
+ }
+ }
+ }
+
+ // for case when item got removed from inventory after we pressed 'copy'
+ // or texture got pasted into previous object
+ if (!itemp_res && !full_perm)
+ {
+ // Due to checks for imageitemid in LLPanelFace::onPasteTexture() this should no longer be reachable.
+ LL_INFOS() << "Item " << data.get(prefix + "itemid").asUUID() << " no longer in inventory." << LL_ENDL;
+ // Todo: fix this, we are often searching same texture multiple times (equal to number of faces)
+ // Perhaps just mPanelFace->onPasteTexture(objectp, te, &asset_to_item_id_map); ? Not pretty, but will work
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ LLAssetIDMatches asset_id_matches(id);
+ gInventory.collectDescendentsIf(LLUUID::null,
+ cats,
+ items,
+ LLInventoryModel::INCLUDE_TRASH,
+ asset_id_matches);
+
+ // Extremely unreliable and perfomance unfriendly.
+ // But we need this to check permissions and it is how texture control finds items
+ for (S32 i = 0; i < items.size(); i++)
+ {
+ LLViewerInventoryItem* itemp = items[i];
+ if (itemp && itemp->isFinished())
+ {
+ // dropTextureAllFaces will fail if incomplete
+ LLPermissions item_permissions = itemp->getPermissions();
+ if (item_permissions.allowOperationBy(PERM_COPY,
+ gAgent.getID(),
+ gAgent.getGroupID()))
+ {
+ itemp_res = itemp;
+ break; // first match
+ }
+ }
+ }
+ }
+}
+
void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)
{
LLSD te_data;
@@ -4345,77 +4614,22 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)
if (te_data.has("te"))
{
// Texture
- bool full_perm = te_data["te"].has("itemfullperm") && te_data["te"]["itemfullperm"].asBoolean();
- bool from_library = te_data["te"].has("fromlibrary") && te_data["te"]["fromlibrary"].asBoolean();
if (te_data["te"].has("imageid"))
{
+ bool img_full_perm = false;
+ bool img_from_library = false;
const LLUUID& imageid = te_data["te"]["imageid"].asUUID(); //texture or asset id
- LLViewerInventoryItem* itemp_res = NULL;
+ LLViewerInventoryItem* img_itemp_res = NULL;
- if (te_data["te"].has("imageitemid"))
- {
- LLUUID item_id = te_data["te"]["imageitemid"].asUUID();
- if (item_id.notNull())
- {
- LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
- if (itemp && itemp->isFinished())
- {
- // dropTextureAllFaces will fail if incomplete
- itemp_res = itemp;
- }
- else
- {
- // Theoretically shouldn't happend, but if it does happen, we
- // might need to add a notification to user that paste will fail
- // since inventory isn't fully loaded
- LL_WARNS() << "Item " << item_id << " is incomplete, paste might fail silently." << LL_ENDL;
- }
- }
- }
- // for case when item got removed from inventory after we pressed 'copy'
- // or texture got pasted into previous object
- if (!itemp_res && !full_perm)
- {
- // Due to checks for imageitemid in LLPanelFace::onPasteTexture() this should no longer be reachable.
- LL_INFOS() << "Item " << te_data["te"]["imageitemid"].asUUID() << " no longer in inventory." << LL_ENDL;
- // Todo: fix this, we are often searching same texture multiple times (equal to number of faces)
- // Perhaps just mPanelFace->onPasteTexture(objectp, te, &asset_to_item_id_map); ? Not pretty, but will work
- LLViewerInventoryCategory::cat_array_t cats;
- LLViewerInventoryItem::item_array_t items;
- LLAssetIDMatches asset_id_matches(imageid);
- gInventory.collectDescendentsIf(LLUUID::null,
- cats,
- items,
- LLInventoryModel::INCLUDE_TRASH,
- asset_id_matches);
-
- // Extremely unreliable and perfomance unfriendly.
- // But we need this to check permissions and it is how texture control finds items
- for (S32 i = 0; i < items.size(); i++)
- {
- LLViewerInventoryItem* itemp = items[i];
- if (itemp && itemp->isFinished())
- {
- // dropTextureAllFaces will fail if incomplete
- LLPermissions item_permissions = itemp->getPermissions();
- if (item_permissions.allowOperationBy(PERM_COPY,
- gAgent.getID(),
- gAgent.getGroupID()))
- {
- itemp_res = itemp;
- break; // first match
- }
- }
- }
- }
+ get_item_and_permissions(imageid, img_itemp_res, img_full_perm, img_from_library, te_data["te"], "img");
- if (itemp_res)
+ if (img_itemp_res)
{
if (te == -1) // all faces
{
LLToolDragAndDrop::dropTextureAllFaces(objectp,
- itemp_res,
- from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT,
+ img_itemp_res,
+ img_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT,
LLUUID::null,
false);
}
@@ -4423,15 +4637,15 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)
{
LLToolDragAndDrop::dropTextureOneFace(objectp,
te,
- itemp_res,
- from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT,
+ img_itemp_res,
+ img_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT,
LLUUID::null,
false,
0);
}
}
// not an inventory item or no complete items
- else if (full_perm)
+ else if (img_full_perm)
{
// Either library, local or existed as fullperm when user made a copy
LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(imageid, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
@@ -4459,23 +4673,69 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)
// PBR/GLTF
if (te_data["te"].has("pbr"))
{
- objectp->setRenderMaterialID(te, te_data["te"]["pbr"].asUUID(), false /*managing our own update*/);
- tep->setGLTFRenderMaterial(nullptr);
- tep->setGLTFMaterialOverride(nullptr);
+ const LLUUID pbr_id = te_data["te"]["pbr"].asUUID();
+ bool pbr_full_perm = false;
+ bool pbr_from_library = false;
+ LLViewerInventoryItem* pbr_itemp_res = NULL;
+
+ get_item_and_permissions(pbr_id, pbr_itemp_res, pbr_full_perm, pbr_from_library, te_data["te"], "pbr");
+ bool allow = true;
+
+ // check overrides first since they don't need t be moved to inventory
if (te_data["te"].has("pbr_override"))
{
- LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID(), te_data["te"]["pbr_override"]);
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ const std::string prefix = "pbr" + std::to_string(i);
+ if (te_data["te"].has(prefix + "imageid"))
+ {
+ LLUUID tex_id = te_data["te"][prefix + "imageid"];
+
+ bool full_perm = false;
+ bool from_library = false;
+ LLViewerInventoryItem* itemp_res = NULL;
+ get_item_and_permissions(tex_id, itemp_res, full_perm, from_library, te_data["te"], prefix);
+ allow = full_perm;
+ if (!allow) break;
+ }
+ }
}
- else
+
+ if (allow && pbr_itemp_res)
+ {
+ if (pbr_itemp_res)
+ {
+ allow = LLToolDragAndDrop::handleDropMaterialProtections(
+ objectp,
+ pbr_itemp_res,
+ pbr_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT,
+ pbr_id);
+ }
+ else
+ {
+ allow = pbr_full_perm;
+ }
+ }
+
+ if (allow)
{
- LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID());
+ objectp->setRenderMaterialID(te, te_data["te"]["pbr"].asUUID(), false /*managing our own update*/);
+ tep->setGLTFMaterialOverride(nullptr);
+
+ if (te_data["te"].has("pbr_override"))
+ {
+ LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID(), te_data["te"]["pbr_override"]);
+ }
+ else
+ {
+ LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID());
+ }
}
}
else
{
objectp->setRenderMaterialID(te, LLUUID::null, false /*send in bulk later*/ );
- tep->setGLTFRenderMaterial(nullptr);
tep->setGLTFMaterialOverride(nullptr);
// blank out most override data on the server
@@ -4642,6 +4902,29 @@ void LLPanelFace::updateGLTFTextureTransform(std::function<void(LLGLTFMaterial::
}
}
+void LLPanelFace::updateGLTFTextureTransformWithScale(const LLGLTFMaterial::TextureInfo texture_info, std::function<void(LLGLTFMaterial::TextureTransform*, const F32, const F32)> edit)
+{
+ if (texture_info == LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT)
+ {
+ updateSelectedGLTFMaterialsWithScale([&](LLGLTFMaterial* new_override, const F32 scale_s, const F32 scale_t)
+ {
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[(LLGLTFMaterial::TextureInfo)i];
+ edit(&new_transform, scale_s, scale_t);
+ }
+ });
+ }
+ else
+ {
+ updateSelectedGLTFMaterialsWithScale([&](LLGLTFMaterial* new_override, const F32 scale_s, const F32 scale_t)
+ {
+ LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[texture_info];
+ edit(&new_transform, scale_s, scale_t);
+ });
+ }
+}
+
void LLPanelFace::setMaterialOverridesFromSelection()
{
const LLGLTFMaterial::TextureInfo texture_info = getPBRTextureInfo();
@@ -4717,8 +5000,9 @@ void LLPanelFace::setMaterialOverridesFromSelection()
}
}
- mPBRScaleU->setValue(transform.mScale[VX]);
- mPBRScaleV->setValue(transform.mScale[VY]);
+ // Force set scales just in case they were set by repeats per meter and their spinner is focused
+ mPBRScaleU->forceSetValue(transform.mScale[VX]);
+ mPBRScaleV->forceSetValue(transform.mScale[VY]);
mPBRRotate->setValue(transform.mRotation * RAD_TO_DEG);
mPBROffsetU->setValue(transform.mOffset[VX]);
mPBROffsetV->setValue(transform.mOffset[VY]);
@@ -4728,6 +5012,12 @@ void LLPanelFace::setMaterialOverridesFromSelection()
mPBRRotate->setTentative(!rotation_same);
mPBROffsetU->setTentative(!offset_u_same);
mPBROffsetV->setTentative(!offset_v_same);
+
+ F32 repeats = 1.f;
+ bool identical = false;
+ getSelectedGLTFMaterialMaxRepeats(getPBRDropChannel(), repeats, identical);
+ mPBRRepeat->forceSetValue(repeats);
+ mPBRRepeat->setTentative(!identical || !scale_u_same || !scale_v_same);
}
void LLPanelFace::Selection::connect()
@@ -5151,6 +5441,7 @@ void LLPanelFace::LLSelectedTEMaterial::getMaxSpecularRepeats(F32& repeats, bool
LLMaterial* mat = object->getTE(face)->getMaterialParams().get();
U32 s_axis = VX;
U32 t_axis = VY;
+ LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);
F32 repeats_s = 1.0f;
F32 repeats_t = 1.0f;
if (mat)
@@ -5175,6 +5466,7 @@ void LLPanelFace::LLSelectedTEMaterial::getMaxNormalRepeats(F32& repeats, bool&
LLMaterial* mat = object->getTE(face)->getMaterialParams().get();
U32 s_axis = VX;
U32 t_axis = VY;
+ LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);
F32 repeats_s = 1.0f;
F32 repeats_t = 1.0f;
if (mat)
@@ -5219,6 +5511,62 @@ void LLPanelFace::LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(U8& diffuse_a
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &get_diff_mode, diffuse_alpha_mode);
}
+void LLPanelFace::LLSelectedTEMaterial::selectionNormalScaleAutofit(LLPanelFace* panel_face, F32 repeats_per_meter)
+{
+ struct f : public LLSelectedTEFunctor
+ {
+ LLPanelFace* mFacePanel;
+ F32 mRepeatsPerMeter;
+ f(LLPanelFace* face_panel, const F32& repeats_per_meter) : mFacePanel(face_panel), mRepeatsPerMeter(repeats_per_meter) {}
+ bool apply(LLViewerObject* object, S32 te)
+ {
+ if (object->permModify())
+ {
+ // Compute S,T to axis mapping
+ U32 s_axis, t_axis;
+ if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis))
+ return true;
+
+ F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter;
+ F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter;
+
+ setNormalRepeatX(mFacePanel, new_s, te);
+ setNormalRepeatY(mFacePanel, new_t, te);
+ }
+ return true;
+ }
+ } setfunc(panel_face, repeats_per_meter);
+ LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
+}
+
+void LLPanelFace::LLSelectedTEMaterial::selectionSpecularScaleAutofit(LLPanelFace* panel_face, F32 repeats_per_meter)
+{
+ struct f : public LLSelectedTEFunctor
+ {
+ LLPanelFace* mFacePanel;
+ F32 mRepeatsPerMeter;
+ f(LLPanelFace* face_panel, const F32& repeats_per_meter) : mFacePanel(face_panel), mRepeatsPerMeter(repeats_per_meter) {}
+ bool apply(LLViewerObject* object, S32 te)
+ {
+ if (object->permModify())
+ {
+ // Compute S,T to axis mapping
+ U32 s_axis, t_axis;
+ if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis))
+ return true;
+
+ F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter;
+ F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter;
+
+ setSpecularRepeatX(mFacePanel, new_s, te);
+ setSpecularRepeatY(mFacePanel, new_t, te);
+ }
+ return true;
+ }
+ } setfunc(panel_face, repeats_per_meter);
+ LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
+}
+
void LLPanelFace::LLSelectedTE::getObjectScaleS(F32& scale_s, bool& identical)
{
struct LLSelectedTEGetObjectScaleS : public LLSelectedTEGetFunctor<F32>
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 1ee9bf2cf7..0911378582 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -250,6 +250,7 @@ protected:
void onCommitGLTFRotation();
void onCommitGLTFTextureOffsetU();
void onCommitGLTFTextureOffsetV();
+ void onCommitGLTFRepeatsPerMeter();
void onClickAutoFix();
void onAlignTexture();
@@ -264,6 +265,9 @@ public: // needs to be accessible to selection manager
void onCopyTexture();
void onPasteTexture();
void onPasteTexture(LLViewerObject* objectp, S32 te);
+private:
+ // for copy/paste operations
+ bool validateInventoryItem(const LLSD& te, const std::string& prefix);
protected:
void menuDoToSelected(const LLSD& userdata);
@@ -358,6 +362,7 @@ private:
LLButton* mDelMedia { nullptr };
LLSpinCtrl* mPBRScaleU { nullptr };
LLSpinCtrl* mPBRScaleV { nullptr };
+ LLSpinCtrl* mPBRRepeat { nullptr };
LLSpinCtrl* mPBRRotate { nullptr };
LLSpinCtrl* mPBROffsetU { nullptr };
LLSpinCtrl* mPBROffsetV { nullptr };
@@ -551,7 +556,9 @@ private:
void updateVisibilityGLTF(LLViewerObject* objectp = nullptr);
void updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*)> func);
+ void updateSelectedGLTFMaterialsWithScale(std::function<void(LLGLTFMaterial*, const F32, const F32)> func);
void updateGLTFTextureTransform(std::function<void(LLGLTFMaterial::TextureTransform*)> edit);
+ void updateGLTFTextureTransformWithScale(const LLGLTFMaterial::TextureInfo texture_info, std::function<void(LLGLTFMaterial::TextureTransform*, const F32, const F32)> edit);
void setMaterialOverridesFromSelection();
@@ -646,6 +653,8 @@ public:
static void getMaxSpecularRepeats(F32& repeats, bool& identical);
static void getMaxNormalRepeats(F32& repeats, bool& identical);
static void getCurrentDiffuseAlphaMode(U8& diffuse_alpha_mode, bool& identical, bool diffuse_texture_has_alpha);
+ static void selectionNormalScaleAutofit(LLPanelFace* panel_face, F32 repeats_per_meter);
+ static void selectionSpecularScaleAutofit(LLPanelFace* panel_face, F32 repeats_per_meter);
DEF_GET_MAT_STATE(LLUUID, const LLUUID&, getNormalID, LLUUID::null, false, LLUUID::null);
DEF_GET_MAT_STATE(LLUUID, const LLUUID&, getSpecularID, LLUUID::null, false, LLUUID::null);
diff --git a/indra/newview/llpanelgroupbulk.cpp b/indra/newview/llpanelgroupbulk.cpp
index 8032e207cd..81c0bd97be 100644
--- a/indra/newview/llpanelgroupbulk.cpp
+++ b/indra/newview/llpanelgroupbulk.cpp
@@ -54,17 +54,16 @@
//////////////////////////////////////////////////////////////////////////
LLPanelGroupBulkImpl::LLPanelGroupBulkImpl(const LLUUID& group_id) :
mGroupID(group_id),
- mBulkAgentList(NULL),
- mOKButton(NULL),
+ mBulkAgentList(nullptr),
+ mOKButton(nullptr),
mAddButton(nullptr),
- mRemoveButton(NULL),
- mGroupName(NULL),
+ mRemoveButton(nullptr),
+ mGroupName(nullptr),
mLoadingText(),
mTooManySelected(),
- mCloseCallback(NULL),
- mCloseCallbackUserData(NULL),
- mAvatarNameCacheConnection(),
- mRoleNames(NULL),
+ mCloseCallback(nullptr),
+ mCloseCallbackUserData(nullptr),
+ mRoleNames(nullptr),
mOwnerWarning(),
mAlreadyInGroup(),
mConfirmedOwnerInvite(false),
@@ -74,10 +73,13 @@ LLPanelGroupBulkImpl::LLPanelGroupBulkImpl(const LLUUID& group_id) :
LLPanelGroupBulkImpl::~LLPanelGroupBulkImpl()
{
- if (mAvatarNameCacheConnection.connected())
+ for (auto& [id, connection] : mAvatarNameCacheConnections)
{
- mAvatarNameCacheConnection.disconnect();
+ if (connection.connected())
+ connection.disconnect();
}
+
+ mAvatarNameCacheConnections.clear();
}
void LLPanelGroupBulkImpl::callbackClickAdd(LLPanelGroupBulk* panelp)
@@ -124,43 +126,42 @@ void LLPanelGroupBulkImpl::callbackSelect(LLUICtrl* ctrl, void* userdata)
void LLPanelGroupBulkImpl::addUsers(const uuid_vec_t& agent_ids)
{
- std::vector<std::string> names;
for (const LLUUID& agent_id : agent_ids)
{
- LLAvatarName av_name;
- if (LLAvatarNameCache::get(agent_id, &av_name))
+ if (LLAvatarName av_name; LLAvatarNameCache::get(agent_id, &av_name))
{
onAvatarNameCache(agent_id, av_name);
}
else
{
- if (mAvatarNameCacheConnection.connected())
+ if (auto found = mAvatarNameCacheConnections.find(agent_id); found != mAvatarNameCacheConnections.end())
{
- mAvatarNameCacheConnection.disconnect();
+ if (found->second.connected())
+ found->second.disconnect();
+
+ mAvatarNameCacheConnections.erase(found);
}
- // *TODO : Add a callback per avatar name being fetched.
- mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_id,
+
+ mAvatarNameCacheConnections.try_emplace(agent_id, LLAvatarNameCache::get(agent_id,
[&](const LLUUID& agent_id, const LLAvatarName& av_name)
{
onAvatarNameCache(agent_id, av_name);
- });
+ }));
}
}
}
void LLPanelGroupBulkImpl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
{
- if (mAvatarNameCacheConnection.connected())
+ if (auto found = mAvatarNameCacheConnections.find(agent_id); found != mAvatarNameCacheConnections.end())
{
- mAvatarNameCacheConnection.disconnect();
- }
+ if (found->second.connected())
+ found->second.disconnect();
- std::vector<std::string> names;
- uuid_vec_t agent_ids;
- agent_ids.push_back(agent_id);
- names.push_back(av_name.getCompleteName());
+ mAvatarNameCacheConnections.erase(found);
+ }
- addUsers(names, agent_ids);
+ addUsers({ av_name.getCompleteName() }, { agent_id });
}
void LLPanelGroupBulkImpl::handleRemove()
@@ -232,7 +233,7 @@ void LLPanelGroupBulkImpl::addUsers(const std::vector<std::string>& names, const
}
}
-void LLPanelGroupBulkImpl::setGroupName(std::string name)
+void LLPanelGroupBulkImpl::setGroupName(const std::string& name)
{
if (mGroupName)
{
@@ -337,12 +338,7 @@ void LLPanelGroupBulk::updateGroupData()
void LLPanelGroupBulk::addUserCallback(const LLUUID& id, const LLAvatarName& av_name)
{
- std::vector<std::string> names;
- uuid_vec_t agent_ids;
- agent_ids.push_back(id);
- names.push_back(av_name.getAccountName());
-
- mImplementation->addUsers(names, agent_ids);
+ mImplementation->addUsers({ av_name.getAccountName() }, { id });
}
void LLPanelGroupBulk::setCloseCallback(void (*close_callback)(void*), void* data)
diff --git a/indra/newview/llpanelgroupbulkimpl.h b/indra/newview/llpanelgroupbulkimpl.h
index 5515bd6d9a..f186ae5373 100644
--- a/indra/newview/llpanelgroupbulkimpl.h
+++ b/indra/newview/llpanelgroupbulkimpl.h
@@ -59,7 +59,7 @@ public:
void handleSelection();
void addUsers(const std::vector<std::string>& names, const uuid_vec_t& agent_ids);
- void setGroupName(std::string name);
+ void setGroupName(const std::string& name);
public:
@@ -84,7 +84,7 @@ public:
void (*mCloseCallback)(void* data);
void* mCloseCallbackUserData;
- boost::signals2::connection mAvatarNameCacheConnection;
+ std::map<LLUUID, boost::signals2::connection> mAvatarNameCacheConnections;
// The following are for the LLPanelGroupInvite subclass only.
// These aren't needed for LLPanelGroupBulkBan, but if we have to add another
diff --git a/indra/newview/llpanelgroupcreate.cpp b/indra/newview/llpanelgroupcreate.cpp
index 4a370525ff..bc7b5caddf 100644
--- a/indra/newview/llpanelgroupcreate.cpp
+++ b/indra/newview/llpanelgroupcreate.cpp
@@ -85,6 +85,7 @@ bool LLPanelGroupCreate::postBuild()
mInsignia = getChild<LLTextureCtrl>("insignia", true);
mInsignia->setAllowLocalTexture(false);
+ mInsignia->setBakeTextureEnabled(false);
mInsignia->setCanApplyImmediately(false);
return true;
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 0c331b4cec..38ae818910 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -211,6 +211,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
{
mInsignia->setCommitCallback(onCommitAny, this);
mInsignia->setAllowLocalTexture(false);
+ mInsignia->setBakeTextureEnabled(false);
}
mFounderName = getChild<LLTextBox>("founder_name");
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 41373cd7f5..7596c0eba8 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -41,6 +41,7 @@
#include "lllandmarkactions.h"
#include "llparcel.h"
#include "llslurl.h"
+#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
@@ -326,7 +327,8 @@ void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem)
}
else
{
- std::string timeStr = getString("acquired_date");
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ std::string timeStr = use_24h ? getString("acquired_date") : getString("acquired_date_ampm");
LLSD substitution;
substitution["datetime"] = (S32) time_utc;
LLStringUtil::format (timeStr, substitution);
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index d964fa9170..ad7aa57842 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -68,6 +68,7 @@ const std::string FILTERS_FILENAME("filters.xml");
const std::string ALL_ITEMS("All Items");
const std::string RECENT_ITEMS("Recent Items");
const std::string WORN_ITEMS("Worn Items");
+const std::string FAVORITES("Favorites");
static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory");
@@ -78,9 +79,9 @@ static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory")
class LLFloaterInventoryFinder : public LLFloater
{
public:
- LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view);
- virtual void draw();
- /*virtual*/ bool postBuild();
+ LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view);
+ void draw();
+ bool postBuild();
void changeFilter(LLInventoryFilter* filter);
void updateElementsFromFilter();
bool getCheckShowEmpty();
@@ -90,17 +91,35 @@ public:
void onCreatorSelfFilterCommit();
void onCreatorOtherFilterCommit();
- static void onTimeAgo(LLUICtrl*, void *);
- static void onCloseBtn(void* user_data);
- static void selectAllTypes(void* user_data);
- static void selectNoTypes(void* user_data);
+ void onTimeAgo();
+ void onCloseBtn();
+ void selectAllTypes();
+ void selectNoTypes();
private:
- LLPanelMainInventory* mPanelMainInventory;
- LLSpinCtrl* mSpinSinceDays;
- LLSpinCtrl* mSpinSinceHours;
- LLCheckBoxCtrl* mCreatorSelf;
- LLCheckBoxCtrl* mCreatorOthers;
- LLInventoryFilter* mFilter;
+ LLPanelMainInventory* mPanelMainInventory{ nullptr };
+ LLSpinCtrl* mSpinSinceDays{ nullptr };
+ LLSpinCtrl* mSpinSinceHours{ nullptr };
+ LLCheckBoxCtrl* mCreatorSelf{ nullptr };
+ LLCheckBoxCtrl* mCreatorOthers{ nullptr };
+ LLInventoryFilter* mFilter{ nullptr };
+
+ LLCheckBoxCtrl* mCheckAnimation{ nullptr };
+ LLCheckBoxCtrl* mCheckCallingCard{ nullptr };
+ LLCheckBoxCtrl* mCheckClothing{ nullptr };
+ LLCheckBoxCtrl* mCheckGesture{ nullptr };
+ LLCheckBoxCtrl* mCheckLandmark{ nullptr };
+ LLCheckBoxCtrl* mCheckMaterial{ nullptr };
+ LLCheckBoxCtrl* mCheckNotecard{ nullptr };
+ LLCheckBoxCtrl* mCheckObject{ nullptr };
+ LLCheckBoxCtrl* mCheckScript{ nullptr };
+ LLCheckBoxCtrl* mCheckSounds{ nullptr };
+ LLCheckBoxCtrl* mCheckTexture{ nullptr };
+ LLCheckBoxCtrl* mCheckSnapshot{ nullptr };
+ LLCheckBoxCtrl* mCheckSettings{ nullptr };
+ LLCheckBoxCtrl* mCheckShowEmpty{ nullptr };
+ LLCheckBoxCtrl* mCheckSinceLogoff{ nullptr };
+
+ LLRadioGroup* mRadioDateSearchDirection{ nullptr };
};
///----------------------------------------------------------------------------
@@ -196,6 +215,17 @@ bool LLPanelMainInventory::postBuild()
worn_filter.markDefault();
mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2));
}
+
+ LLInventoryPanel* favorites_panel = getChild<LLInventoryPanel>(FAVORITES);
+ if (favorites_panel)
+ {
+ favorites_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
+ LLInventoryFilter& favorites_filter = favorites_panel->getFilter();
+ favorites_filter.setEmptyLookupMessage("InventoryNoMatchingFavorites");
+ favorites_filter.markDefault();
+ favorites_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, favorites_panel, _1, _2));
+ }
+
mSearchTypeCombo = getChild<LLComboBox>("search_type");
if(mSearchTypeCombo)
{
@@ -560,7 +590,8 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata)
}
else
{
- menu_create_inventory_item(getPanel(), NULL, userdata);
+ selectAllItemsPanel();
+ menu_create_inventory_item(mAllItemsPanel, NULL, userdata);
}
}
@@ -734,7 +765,6 @@ bool LLPanelMainInventory::filtersVisible(void* user_data)
void LLPanelMainInventory::onClearSearch()
{
bool initially_active = false;
- LLFloater *finder = getFinder();
if (mActivePanel && (getActivePanel() != mWornItemsPanel))
{
initially_active = mActivePanel->getFilter().isNotDefault();
@@ -743,9 +773,9 @@ void LLPanelMainInventory::onClearSearch()
mActivePanel->setFilterLinks(LLInventoryFilter::FILTERLINK_INCLUDE_LINKS);
}
- if (finder)
+ if (LLFloaterInventoryFinder* finder = getFinder())
{
- LLFloaterInventoryFinder::selectAllTypes(finder);
+ finder->selectAllTypes();
}
// re-open folders that were initially open in case filter was active
@@ -1145,36 +1175,53 @@ bool LLFloaterInventoryFinder::postBuild()
const LLRect& viewrect = mPanelMainInventory->getRect();
setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
- childSetAction("All", selectAllTypes, this);
- childSetAction("None", selectNoTypes, this);
+ childSetAction("All", [this](LLUICtrl*, const LLSD&) { selectAllTypes(); });
+ childSetAction("None", [this](LLUICtrl*, const LLSD&) { selectNoTypes(); });
mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
- childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
+ mSpinSinceHours->setCommitCallback([this](LLUICtrl*, const LLSD&) { onTimeAgo(); });
mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
- childSetCommitCallback("spin_days_ago", onTimeAgo, this);
+ mSpinSinceDays->setCommitCallback([this](LLUICtrl*, const LLSD&) { onTimeAgo(); });
mCreatorSelf = getChild<LLCheckBoxCtrl>("check_created_by_me");
mCreatorOthers = getChild<LLCheckBoxCtrl>("check_created_by_others");
mCreatorSelf->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorSelfFilterCommit, this));
mCreatorOthers->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorOtherFilterCommit, this));
- childSetAction("Close", onCloseBtn, this);
+ mCheckAnimation = getChild<LLCheckBoxCtrl>("check_animation");
+ mCheckCallingCard = getChild<LLCheckBoxCtrl>("check_calling_card");
+ mCheckClothing = getChild<LLCheckBoxCtrl>("check_clothing");
+ mCheckGesture = getChild<LLCheckBoxCtrl>("check_gesture");
+ mCheckLandmark = getChild<LLCheckBoxCtrl>("check_landmark");
+ mCheckMaterial = getChild<LLCheckBoxCtrl>("check_material");
+ mCheckNotecard = getChild<LLCheckBoxCtrl>("check_notecard");
+ mCheckObject = getChild<LLCheckBoxCtrl>("check_object");
+ mCheckScript = getChild<LLCheckBoxCtrl>("check_script");
+ mCheckSounds = getChild<LLCheckBoxCtrl>("check_sound");
+ mCheckTexture = getChild<LLCheckBoxCtrl>("check_texture");
+ mCheckSnapshot = getChild<LLCheckBoxCtrl>("check_snapshot");
+ mCheckSettings = getChild<LLCheckBoxCtrl>("check_settings");
+ mCheckShowEmpty = getChild<LLCheckBoxCtrl>("check_show_empty");
+ mCheckSinceLogoff = getChild<LLCheckBoxCtrl>("check_since_logoff");
+
+ mRadioDateSearchDirection = getChild<LLRadioGroup>("date_search_direction");
+
+ childSetAction("Close", [this](LLUICtrl*, const LLSD&) { onCloseBtn(); });
updateElementsFromFilter();
+
return true;
}
-void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
-{
- LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
- if (!self) return;
- if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() )
+void LLFloaterInventoryFinder::onTimeAgo()
+{
+ if (mSpinSinceDays->get() || mSpinSinceHours->get())
{
- self->getChild<LLUICtrl>("check_since_logoff")->setValue(false);
+ mCheckSinceLogoff->setValue(false);
- U32 days = (U32)self->mSpinSinceDays->get();
- U32 hours = (U32)self->mSpinSinceHours->get();
+ U32 days = (U32)mSpinSinceDays->get();
+ U32 hours = (U32)mSpinSinceHours->get();
if (hours >= 24)
{
// Try to handle both cases of spinner clicking and text input in a sensible fashion as best as possible.
@@ -1190,11 +1237,11 @@ void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
days = hours / 24;
}
hours = (U32)hours % 24;
- self->mSpinSinceHours->setFocus(false);
- self->mSpinSinceDays->setFocus(false);
- self->mSpinSinceDays->set((F32)days);
- self->mSpinSinceHours->set((F32)hours);
- self->mSpinSinceHours->setFocus(true);
+ mSpinSinceHours->setFocus(false);
+ mSpinSinceDays->setFocus(false);
+ mSpinSinceDays->set((F32)days);
+ mSpinSinceHours->set((F32)hours);
+ mSpinSinceHours->setFocus(true);
}
}
}
@@ -1223,29 +1270,28 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
// update the ui elements
setTitle(mFilter->getName());
- getChild<LLUICtrl>("check_animation")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
-
- getChild<LLUICtrl>("check_calling_card")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
- getChild<LLUICtrl>("check_clothing")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
- getChild<LLUICtrl>("check_gesture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
- getChild<LLUICtrl>("check_landmark")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
- getChild<LLUICtrl>("check_material")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MATERIAL));
- getChild<LLUICtrl>("check_notecard")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
- getChild<LLUICtrl>("check_object")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
- getChild<LLUICtrl>("check_script")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
- getChild<LLUICtrl>("check_sound")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
- getChild<LLUICtrl>("check_texture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
- getChild<LLUICtrl>("check_snapshot")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
- getChild<LLUICtrl>("check_settings")->setValue((S32)(filter_types & 0x1 << LLInventoryType::IT_SETTINGS));
- getChild<LLUICtrl>("check_show_empty")->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
-
- getChild<LLUICtrl>("check_created_by_me")->setValue(show_created_by_me);
- getChild<LLUICtrl>("check_created_by_others")->setValue(show_created_by_others);
-
- getChild<LLUICtrl>("check_since_logoff")->setValue(mFilter->isSinceLogoff());
+ mCheckAnimation->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
+ mCheckCallingCard->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
+ mCheckClothing->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
+ mCheckGesture->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
+ mCheckLandmark->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
+ mCheckMaterial->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MATERIAL));
+ mCheckNotecard->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
+ mCheckObject->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
+ mCheckScript->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
+ mCheckSounds->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
+ mCheckTexture->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
+ mCheckSnapshot->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
+ mCheckSettings->setValue((S32)(filter_types & 0x1 << LLInventoryType::IT_SETTINGS));
+ mCheckShowEmpty->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
+
+ mCreatorSelf->setValue(show_created_by_me);
+ mCreatorOthers->setValue(show_created_by_others);
+
+ mCheckSinceLogoff->setValue(mFilter->isSinceLogoff());
mSpinSinceHours->set((F32)(hours % 24));
mSpinSinceDays->set((F32)(hours / 24));
- getChild<LLRadioGroup>("date_search_direction")->setSelectedIndex(date_search_direction);
+ mRadioDateSearchDirection->setSelectedIndex(date_search_direction);
}
void LLFloaterInventoryFinder::draw()
@@ -1253,80 +1299,80 @@ void LLFloaterInventoryFinder::draw()
U64 filter = 0xffffffffffffffffULL;
bool filtered_by_all_types = true;
- if (!getChild<LLUICtrl>("check_animation")->getValue())
+ if (!mCheckAnimation->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_calling_card")->getValue())
+ if (!mCheckCallingCard->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_clothing")->getValue())
+ if (!mCheckClothing->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_gesture")->getValue())
+ if (!mCheckGesture->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_landmark")->getValue())
+ if (!mCheckLandmark->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_material")->getValue())
+ if (!mCheckMaterial->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_MATERIAL);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_notecard")->getValue())
+ if (!mCheckNotecard->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_object")->getValue())
+ if (!mCheckObject->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_script")->getValue())
+ if (!mCheckScript->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_LSL);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_sound")->getValue())
+ if (!mCheckSounds->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_SOUND);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_texture")->getValue())
+ if (!mCheckTexture->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_snapshot")->getValue())
+ if (!mCheckSnapshot->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
filtered_by_all_types = false;
}
- if (!getChild<LLUICtrl>("check_settings")->getValue())
+ if (!mCheckSettings->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_SETTINGS);
filtered_by_all_types = false;
@@ -1444,65 +1490,56 @@ void LLFloaterInventoryFinder::onCreatorOtherFilterCommit()
bool LLFloaterInventoryFinder::getCheckShowEmpty()
{
- return getChild<LLUICtrl>("check_show_empty")->getValue();
+ return mCheckShowEmpty->getValue();
}
bool LLFloaterInventoryFinder::getCheckSinceLogoff()
{
- return getChild<LLUICtrl>("check_since_logoff")->getValue();
+ return mCheckSinceLogoff->getValue();
}
U32 LLFloaterInventoryFinder::getDateSearchDirection()
{
- return getChild<LLRadioGroup>("date_search_direction")->getSelectedIndex();
+ return mRadioDateSearchDirection->getSelectedIndex();
}
-void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
+void LLFloaterInventoryFinder::onCloseBtn()
{
- LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
- finderp->closeFloater();
+ closeFloater();
}
-// static
-void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
-{
- LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
- if(!self) return;
-
- self->getChild<LLUICtrl>("check_animation")->setValue(true);
- self->getChild<LLUICtrl>("check_calling_card")->setValue(true);
- self->getChild<LLUICtrl>("check_clothing")->setValue(true);
- self->getChild<LLUICtrl>("check_gesture")->setValue(true);
- self->getChild<LLUICtrl>("check_landmark")->setValue(true);
- self->getChild<LLUICtrl>("check_material")->setValue(true);
- self->getChild<LLUICtrl>("check_notecard")->setValue(true);
- self->getChild<LLUICtrl>("check_object")->setValue(true);
- self->getChild<LLUICtrl>("check_script")->setValue(true);
- self->getChild<LLUICtrl>("check_sound")->setValue(true);
- self->getChild<LLUICtrl>("check_texture")->setValue(true);
- self->getChild<LLUICtrl>("check_snapshot")->setValue(true);
- self->getChild<LLUICtrl>("check_settings")->setValue(true);
+void LLFloaterInventoryFinder::selectAllTypes()
+{
+ mCheckAnimation->setValue(true);
+ mCheckCallingCard->setValue(true);
+ mCheckClothing->setValue(true);
+ mCheckGesture->setValue(true);
+ mCheckLandmark->setValue(true);
+ mCheckMaterial->setValue(true);
+ mCheckNotecard->setValue(true);
+ mCheckObject->setValue(true);
+ mCheckScript->setValue(true);
+ mCheckSounds->setValue(true);
+ mCheckTexture->setValue(true);
+ mCheckSnapshot->setValue(true);
+ mCheckSettings->setValue(true);
}
-//static
-void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
-{
- LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
- if(!self) return;
-
- self->getChild<LLUICtrl>("check_animation")->setValue(false);
- self->getChild<LLUICtrl>("check_calling_card")->setValue(false);
- self->getChild<LLUICtrl>("check_clothing")->setValue(false);
- self->getChild<LLUICtrl>("check_gesture")->setValue(false);
- self->getChild<LLUICtrl>("check_landmark")->setValue(false);
- self->getChild<LLUICtrl>("check_material")->setValue(false);
- self->getChild<LLUICtrl>("check_notecard")->setValue(false);
- self->getChild<LLUICtrl>("check_object")->setValue(false);
- self->getChild<LLUICtrl>("check_script")->setValue(false);
- self->getChild<LLUICtrl>("check_sound")->setValue(false);
- self->getChild<LLUICtrl>("check_texture")->setValue(false);
- self->getChild<LLUICtrl>("check_snapshot")->setValue(false);
- self->getChild<LLUICtrl>("check_settings")->setValue(false);
+void LLFloaterInventoryFinder::selectNoTypes()
+{
+ mCheckAnimation->setValue(false);
+ mCheckCallingCard->setValue(false);
+ mCheckClothing->setValue(false);
+ mCheckGesture->setValue(false);
+ mCheckLandmark->setValue(false);
+ mCheckMaterial->setValue(false);
+ mCheckNotecard->setValue(false);
+ mCheckObject->setValue(false);
+ mCheckScript->setValue(false);
+ mCheckSounds->setValue(false);
+ mCheckTexture->setValue(false);
+ mCheckSnapshot->setValue(false);
+ mCheckSettings->setValue(false);
}
//////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 0a3a2e753a..23e6a9fbcf 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -2267,19 +2267,21 @@ void LLPanelObject::onCopyParams()
if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
{
LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
-
- LLUUID texture_id = sculpt_params->getSculptTexture();
- if (get_can_copy_texture(texture_id))
- {
- LL_DEBUGS("FloaterTools") << "Recording texture" << LL_ENDL;
- mClipboardParams["sculpt"]["id"] = texture_id;
- }
- else
+ if (sculpt_params)
{
- mClipboardParams["sculpt"]["id"] = SCULPT_DEFAULT_TEXTURE;
- }
+ LLUUID texture_id = sculpt_params->getSculptTexture();
+ if (get_can_copy_texture(texture_id))
+ {
+ LL_DEBUGS("FloaterTools") << "Recording texture" << LL_ENDL;
+ mClipboardParams["sculpt"]["id"] = texture_id;
+ }
+ else
+ {
+ mClipboardParams["sculpt"]["id"] = SCULPT_DEFAULT_TEXTURE;
+ }
- mClipboardParams["sculpt"]["type"] = sculpt_params->getSculptType();
+ mClipboardParams["sculpt"]["type"] = sculpt_params->getSculptType();
+ }
}
}
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index ef7986603b..a31a54bb67 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -129,6 +129,7 @@ public:
virtual void navigateToFolder(bool new_window = false, bool change_mode = false) {}
virtual bool isItemRenameable() const;
virtual bool renameItem(const std::string& new_name);
+ virtual bool isFavorite() const { return false; }
virtual bool isItemMovable() const;
virtual bool isItemRemovable(bool check_worn = true) const;
virtual bool removeItem();
@@ -384,10 +385,7 @@ bool LLTaskInvFVBridge::removeItem()
return true;
}
- LLSD payload;
- payload["task_id"] = mPanel->getTaskUUID();
- payload["inventory_ids"].append(mUUID);
- LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
+ LLNotificationsUtil::add("CantModifyContentInNoModTask");
return false;
}
}
@@ -410,13 +408,7 @@ void LLTaskInvFVBridge::removeBatch(std::vector<LLFolderViewModelItem*>& batch)
if (!object->permModify())
{
- LLSD payload;
- payload["task_id"] = mPanel->getTaskUUID();
- for (LLFolderViewModelItem* item : batch)
- {
- payload["inventory_ids"].append(((LLTaskInvFVBridge*)item)->getUUID());
- }
- LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
+ LLNotificationsUtil::add("CantModifyContentInNoModTask");
}
else
{
@@ -1364,7 +1356,23 @@ bool LLPanelObjectInventory::postBuild()
void LLPanelObjectInventory::doToSelected(const LLSD& userdata)
{
- LLInventoryAction::doToSelected(&gInventory, mFolders, userdata.asString());
+ std::string action = userdata.asString();
+ if ("rename" == action || "delete" == action)
+ {
+ LLViewerObject* objectp = gObjectList.findObject(mTaskUUID);
+ if (objectp && !objectp->permModify())
+ {
+ LLNotificationsUtil::add("CantModifyContentInNoModTask");
+ }
+ else
+ {
+ LLInventoryAction::doToSelected(&gInventory, mFolders, action);
+ }
+ }
+ else
+ {
+ LLInventoryAction::doToSelected(&gInventory, mFolders, action);
+ }
}
void LLPanelObjectInventory::clearContents()
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 4cd4afaa5a..a9e860d2ef 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -404,7 +404,9 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
mWearableListManager(NULL),
mPlusBtn(NULL),
mWearablesGearMenuBtn(NULL),
- mGearMenuBtn(NULL)
+ mGearMenuBtn(NULL),
+ mStatus(NULL),
+ mCurrentOutfitName(NULL)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(false);
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 47c02793a3..e2e2cf1a61 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -33,6 +33,7 @@
#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llmenubutton.h"
#include "llnotificationsutil.h"
#include "lloutfitgallery.h"
#include "lloutfitobserver.h"
@@ -53,12 +54,17 @@ static const std::string SAVE_BTN("save_btn");
static LLPanelInjector<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
-LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
- mMyOutfitsPanel(NULL),
- mCurrentOutfitPanel(NULL),
- mActivePanel(NULL),
- mAppearanceTabs(NULL),
- mInitialized(false)
+LLPanelOutfitsInventory::LLPanelOutfitsInventory()
+ : mMyOutfitsPanel(nullptr)
+ , mCurrentOutfitPanel(nullptr)
+ , mActivePanel(nullptr)
+ , mAppearanceTabs(nullptr)
+ , mInitialized(false)
+ , mGearMenu(nullptr)
+ , mSortMenu(nullptr)
+ , mTrashBtn(nullptr)
+ , mSortMenuPanel(nullptr)
+ , mTrashMenuPanel(nullptr)
{
gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this));
gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoading, this));
@@ -75,6 +81,9 @@ LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
{
gSavedSettings.setS32("LastAppearanceTab", mAppearanceTabs->getCurrentPanelIndex());
}
+ mGearMenuConnection.disconnect();
+ mSortMenuConnection.disconnect();
+ mTrashMenuConnection.disconnect();
}
// virtual
@@ -258,6 +267,22 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
mOutfitGalleryPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
}
+void LLPanelOutfitsInventory::setMenuButtons(LLMenuButton* gear_menu, LLMenuButton* sort_menu, LLButton* trash_btn, LLPanel* sort_menu_panel, LLPanel* trash_menu_panel)
+{
+ mGearMenu = gear_menu;
+ mSortMenu = sort_menu;
+ mTrashBtn = trash_btn;
+ mSortMenuPanel = sort_menu_panel;
+ mTrashMenuPanel = trash_menu_panel;
+
+ mGearMenuConnection.disconnect();
+ mSortMenuConnection.disconnect();
+ mTrashMenuConnection.disconnect();
+ mGearMenuConnection = mGearMenu->setMouseDownCallback(boost::bind(&LLPanelOutfitsInventory::onGearMouseDown, this));
+ mSortMenuConnection = mSortMenu->setMouseDownCallback(boost::bind(&LLPanelOutfitsInventory::onGearMouseDown, this));
+ mTrashMenuConnection = mTrashBtn->setClickedCallback(boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
+}
+
void LLPanelOutfitsInventory::updateListCommands()
{
bool trash_enabled = isActionEnabled("delete");
@@ -284,6 +309,14 @@ void LLPanelOutfitsInventory::onTrashButtonClick()
}
}
+void LLPanelOutfitsInventory::onGearMouseDown()
+{
+ if (mActivePanel)
+ {
+ mActivePanel->updateMenuItemsVisibility();
+ }
+}
+
bool LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
{
return mActivePanel && mActivePanel->isActionEnabled(userdata);
@@ -320,6 +353,28 @@ void LLPanelOutfitsInventory::onTabChange()
mActivePanel->checkFilterSubString();
mActivePanel->onOpen(LLSD());
+ if (mGearMenu)
+ {
+ mGearMenu->setMenu(mActivePanel->getGearMenu(), LLMenuButton::MP_BOTTOM_LEFT);
+ }
+ if (mSortMenu && mSortMenuPanel)
+ {
+ LLToggleableMenu* menu = mActivePanel->getSortMenu();
+ if (menu)
+ {
+ mSortMenu->setMenu(menu, LLMenuButton::MP_BOTTOM_LEFT);
+ mSortMenuPanel->setVisible(true);
+ }
+ else
+ {
+ mSortMenuPanel->setVisible(false);
+ }
+ }
+ if (mTrashMenuPanel)
+ {
+ mTrashMenuPanel->setVisible(mActivePanel->getTrashMenuVisible());
+ }
+
updateVerbs();
}
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index e046681e95..29f7eb44f7 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -30,11 +30,13 @@
#include "llpanel.h"
+class LLButton;
class LLOutfitGallery;
class LLOutfitsList;
class LLOutfitListGearMenuBase;
class LLPanelAppearanceTab;
class LLPanelWearing;
+class LLMenuButton;
class LLMenuGL;
class LLSidepanelAppearance;
class LLTabContainer;
@@ -63,6 +65,13 @@ public:
bool isCOFPanelActive() const;
+ void setMenuButtons(
+ LLMenuButton* gear_menu,
+ LLMenuButton* sort_menu,
+ LLButton* trash_btn,
+ LLPanel* sort_menu_panel,
+ LLPanel* trash_menu_panel);
+
protected:
void updateVerbs();
@@ -92,20 +101,29 @@ protected:
void initListCommandsHandlers();
void updateListCommands();
void onWearButtonClick();
- void showGearMenu();
void onTrashButtonClick();
+ void onGearMouseDown();
bool isActionEnabled(const LLSD& userdata);
void setWearablesLoading(bool val);
void onWearablesLoaded();
void onWearablesLoading();
private:
LLPanel* mListCommands;
- LLMenuGL* mMenuAdd;
LLButton* mWearBtn = nullptr;
// List Commands //
//////////////////////////////////////////////////////////////////////////////////
bool mInitialized;
+
+ // not owned items
+ LLMenuButton* mGearMenu;
+ LLMenuButton* mSortMenu;
+ LLButton* mTrashBtn;
+ LLPanel* mSortMenuPanel;
+ LLPanel* mTrashMenuPanel;
+ boost::signals2::connection mGearMenuConnection;
+ boost::signals2::connection mSortMenuConnection;
+ boost::signals2::connection mTrashMenuConnection;
};
#endif //LL_LLPANELOUTFITSINVENTORY_H
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 72fa553023..42c40fe404 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -160,6 +160,7 @@ public:
mAvatarsPositions[*id_it] = *pos_it;
}
};
+ const id_to_pos_map_t& getAvatarsPositions() const { return mAvatarsPositions; }
protected:
virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
@@ -841,10 +842,15 @@ void LLPanelPeople::updateNearbyList()
std::vector<LLVector3d> positions;
- LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("MPVNearMeRange"));
+ LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
mNearbyList->setDirty();
+#ifdef LL_DISCORD
+ if (gSavedSettings.getBOOL("EnableDiscord"))
+ LLAppViewer::updateDiscordPartyMaxSize((S32)mNearbyList->getIDs().size());
+#endif
DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs());
+ gAgent.setAvatarsPositions(DISTANCE_COMPARATOR.getAvatarsPositions());
LLActiveSpeakerMgr::instance().update(true);
}
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 04b8af49c1..794ae4ad44 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -155,11 +155,15 @@ void PeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata)
{
+ std::string item = userdata.asString();
if(gAgent.getID() == mUUIDs.front())
{
+ if (item == std::string("can_zoom_in"))
+ {
+ return true;
+ }
return false;
}
- std::string item = userdata.asString();
// Note: can_block and can_delete is used only for one person selected menu
// so we don't need to go over all uuids.
@@ -351,7 +355,10 @@ void PeopleContextMenu::eject()
avatar = (LLVOAvatar*) object;
}
}
- if (!avatar) return;
+
+ if (!avatar)
+ return;
+
LLSD payload;
payload["avatar_id"] = avatar->getID();
std::string fullname = avatar->getFullname();
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 0ce1f0f9d3..cbf5819fda 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -176,7 +176,7 @@ bool LLPanelPermissions::postBuild()
childSetCommitCallback("sale type",LLPanelPermissions::onCommitSaleType,this);
- childSetCommitCallback("Edit Cost", LLPanelPermissions::onCommitSaleInfo, this);
+ childSetCommitCallback("Edit Cost", LLPanelPermissions::onCommitSalePrice, this);
childSetCommitCallback("checkbox next owner can modify",LLPanelPermissions::onCommitNextOwnerModify,this);
childSetCommitCallback("checkbox next owner can copy",LLPanelPermissions::onCommitNextOwnerCopy,this);
@@ -781,7 +781,9 @@ void LLPanelPermissions::refresh()
if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER))
{
- getChildView("checkbox for sale")->setEnabled(can_transfer || (!can_transfer && num_for_sale));
+ bool change_sale_allowed = can_transfer || (!can_transfer && num_for_sale);
+ getChildView("checkbox for sale")->setEnabled(change_sale_allowed);
+ getChildView("Edit Cost")->setEnabled(change_sale_allowed && !is_for_sale_mixed);
// Set the checkbox to tentative if the prices of each object selected
// are not the same.
getChild<LLUICtrl>("checkbox for sale")->setTentative( is_for_sale_mixed);
@@ -1175,6 +1177,7 @@ void LLPanelPermissions::onCommitName(LLUICtrl*, void* data)
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->rename(tb->getText());
+ new_item->setComplete(true); // to not err at updateServer
new_item->updateServer(false);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
@@ -1223,6 +1226,16 @@ void LLPanelPermissions::onCommitSaleType(LLUICtrl*, void* data)
self->setAllSaleInfo();
}
+void LLPanelPermissions::onCommitSalePrice(LLUICtrl *, void *data)
+{
+ LLPanelPermissions *self = (LLPanelPermissions *) data;
+ LLCheckBoxCtrl *checkPurchase = self->getChild<LLCheckBoxCtrl>("checkbox for sale");
+ if (checkPurchase && checkPurchase->get())
+ {
+ self->setAllSaleInfo();
+ }
+}
+
void LLPanelPermissions::setAllSaleInfo()
{
LL_INFOS() << "LLPanelPermissions::setAllSaleInfo()" << LL_ENDL;
diff --git a/indra/newview/llpanelpermissions.h b/indra/newview/llpanelpermissions.h
index 77129434ed..12e88361c9 100644
--- a/indra/newview/llpanelpermissions.h
+++ b/indra/newview/llpanelpermissions.h
@@ -77,6 +77,7 @@ protected:
static void onCommitSaleInfo(LLUICtrl* ctrl, void* data);
static void onCommitSaleType(LLUICtrl* ctrl, void* data);
+ static void onCommitSalePrice(LLUICtrl *ctrl, void *data);
void setAllSaleInfo();
static void onCommitClickAction(LLUICtrl* ctrl, void*);
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 7b562337a3..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();
@@ -777,7 +777,7 @@ void LLPanelPrimMediaControls::draw()
else if(mFadeTimer.getStarted())
{
F32 time = mFadeTimer.getElapsedTimeF32();
- alpha *= llmax(lerp(1.0f, 0.0f, time / mControlFadeTime), 0.0f);
+ alpha *= llmax(lerp(1.f, 0.f, time / mControlFadeTime), 0.0f);
if(time >= mControlFadeTime)
{
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 132098ba99..24a6875d5a 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -328,7 +328,7 @@ public:
}
const std::string verb = params[1].asString();
- if (verb == "about")
+ if (verb == "about" || verb == "mention")
{
LLAvatarActions::showProfile(avatar_id);
return true;
@@ -859,7 +859,7 @@ void LLPanelProfileSecondLife::resetData()
resetLoading();
// Set default image and 1:1 dimensions for it
- mSecondLifePic->setValue("Generic_Person_Large");
+ mSecondLifePic->setValue(LLUUID());
LLRect imageRect = mSecondLifePicLayout->getRect();
mSecondLifePicLayout->reshape(imageRect.getWidth(), imageRect.getWidth());
@@ -2071,6 +2071,7 @@ void LLPanelProfileFirstLife::onChangePhoto()
}
});
texture_floaterp->setLocalTextureEnabled(false);
+ texture_floaterp->setBakeTextureEnabled(false);
texture_floaterp->setCanApply(false, true, false);
parent_floater->addDependentFloater(mFloaterTexturePickerHandle);
diff --git a/indra/newview/llpanelprofileclassifieds.h b/indra/newview/llpanelprofileclassifieds.h
index 42cd5f8975..2e6b7c4428 100644
--- a/indra/newview/llpanelprofileclassifieds.h
+++ b/indra/newview/llpanelprofileclassifieds.h
@@ -157,17 +157,17 @@ public:
void setParcelId(const LLUUID& id) { mParcelId = id; }
- LLUUID getParcelId() { return mParcelId; }
+ LLUUID getParcelId() const { return mParcelId; }
void setSimName(const std::string& sim_name) { mSimName = sim_name; }
- std::string getSimName() { return mSimName; }
+ std::string getSimName() const { return mSimName; }
void setFromSearch(bool val) { mFromSearch = val; }
- bool fromSearch() { return mFromSearch; }
+ bool fromSearch() const { return mFromSearch; }
- bool getInfoLoaded() { return mInfoLoaded; }
+ bool getInfoLoaded() const { return mInfoLoaded; }
void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
@@ -175,9 +175,9 @@ public:
void resetDirty() override;
- bool isNew() { return mIsNew; }
+ bool isNew() const { return mIsNew; }
- bool isNewWithErrors() { return mIsNewWithErrors; }
+ bool isNewWithErrors() const { return mIsNewWithErrors; }
bool canClose();
@@ -191,10 +191,10 @@ public:
bool getAutoRenew();
- S32 getPriceForListing() { return mPriceForListing; }
+ S32 getPriceForListing() const { return mPriceForListing; }
void setEditMode(bool edit_mode);
- bool getEditMode() {return mEditMode;}
+ bool getEditMode() const { return mEditMode; }
static void setClickThrough(
const LLUUID& classified_id,
diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp
index a87ef4f0f9..c9626bf9ea 100644
--- a/indra/newview/llpanelprofilepicks.cpp
+++ b/indra/newview/llpanelprofilepicks.cpp
@@ -248,6 +248,8 @@ void LLPanelProfilePicks::onClickNewBtn()
select_tab(true).
label(pick_panel->getPickName()));
updateButtons();
+
+ pick_panel->addLocationChangedCallbacks();
}
void LLPanelProfilePicks::onClickDelete()
@@ -607,10 +609,12 @@ void LLPanelProfilePick::setAvatarId(const LLUUID& avatar_id)
{
mPickName->setEnabled(true);
mPickDescription->setEnabled(true);
+ mSetCurrentLocationButton->setVisible(true);
}
else
{
mSnapshotCtrl->setEnabled(false);
+ mSetCurrentLocationButton->setVisible(false);
}
}
@@ -621,6 +625,7 @@ bool LLPanelProfilePick::postBuild()
mSaveButton = getChild<LLButton>("save_changes_btn");
mCreateButton = getChild<LLButton>("create_changes_btn");
mCancelButton = getChild<LLButton>("cancel_changes_btn");
+ mSetCurrentLocationButton = getChild<LLButton>("set_to_curr_location_btn");
mSnapshotCtrl = getChild<LLTextureCtrl>("pick_snapshot");
mSnapshotCtrl->setCommitCallback(boost::bind(&LLPanelProfilePick::onSnapshotChanged, this));
@@ -633,6 +638,7 @@ bool LLPanelProfilePick::postBuild()
mSaveButton->setCommitCallback(boost::bind(&LLPanelProfilePick::onClickSave, this));
mCreateButton->setCommitCallback(boost::bind(&LLPanelProfilePick::onClickSave, this));
mCancelButton->setCommitCallback(boost::bind(&LLPanelProfilePick::onClickCancel, this));
+ mSetCurrentLocationButton->setCommitCallback(boost::bind(&LLPanelProfilePick::onClickSetLocation, this));
mPickName->setKeystrokeCallback(boost::bind(&LLPanelProfilePick::onPickChanged, this, _1), NULL);
mPickName->setEnabled(false);
@@ -811,6 +817,32 @@ bool LLPanelProfilePick::isDirty() const
return false;
}
+void LLPanelProfilePick::onClickSetLocation()
+{
+ // Save location for later use.
+ setPosGlobal(gAgent.getPositionGlobal());
+
+ std::string parcel_name, region_name;
+
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (parcel)
+ {
+ mParcelId = parcel->getID();
+ parcel_name = parcel->getName();
+ }
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ region_name = region->getName();
+ }
+
+ setPickLocation(createLocationText(getLocationNotice(), parcel_name, region_name, getPosGlobal()));
+
+ mLocationChanged = true;
+ enableSaveButton(true);
+}
+
void LLPanelProfilePick::onClickSave()
{
if (mRegionCallbackConnection.connected())
@@ -821,6 +853,10 @@ void LLPanelProfilePick::onClickSave()
{
mParcelCallbackConnection.disconnect();
}
+ if (mLocationChanged)
+ {
+ onClickSetLocation();
+ }
sendUpdate();
mLocationChanged = false;
@@ -871,6 +907,12 @@ void LLPanelProfilePick::processParcelInfo(const LLParcelData& parcel_data)
}
}
+void LLPanelProfilePick::addLocationChangedCallbacks()
+{
+ mRegionCallbackConnection = gAgent.addRegionChangedCallback([this]() { onClickSetLocation(); });
+ mParcelCallbackConnection = gAgent.addParcelChangedCallback([this]() { onClickSetLocation(); });
+}
+
void LLPanelProfilePick::setParcelID(const LLUUID& parcel_id)
{
if (mParcelId != parcel_id)
diff --git a/indra/newview/llpanelprofilepicks.h b/indra/newview/llpanelprofilepicks.h
index b4d3eb010e..847ac57cea 100644
--- a/indra/newview/llpanelprofilepicks.h
+++ b/indra/newview/llpanelprofilepicks.h
@@ -141,6 +141,8 @@ public:
LLUUID getParcelID() const { return mParcelId; }
void setErrorStatus(S32 status, const std::string& reason) override {};
+ void addLocationChangedCallbacks();
+
protected:
/**
@@ -203,6 +205,11 @@ public:
void resetDirty() override;
/**
+ * Callback for "Set Location" button click
+ */
+ void onClickSetLocation();
+
+ /**
* Callback for "Save" and "Create" button click
*/
void onClickSave();
@@ -224,6 +231,7 @@ protected:
LLTextureCtrl* mSnapshotCtrl;
LLLineEditor* mPickName;
LLTextEditor* mPickDescription;
+ LLButton* mSetCurrentLocationButton;
LLButton* mSaveButton;
LLButton* mCreateButton;
LLButton* mCancelButton;
@@ -241,7 +249,7 @@ protected:
bool mLocationChanged;
bool mNewPick;
- bool mIsEditing;
+ bool mIsEditing;
void onDescriptionFocusReceived();
};
diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp
index 32c9f6f402..56c0294dbe 100644
--- a/indra/newview/llpanelsnapshot.cpp
+++ b/indra/newview/llpanelsnapshot.cpp
@@ -37,6 +37,7 @@
// newview
#include "llsidetraypanelcontainer.h"
+#include "llsnapshotlivepreview.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llagentbenefits.h"
@@ -99,6 +100,17 @@ void LLPanelSnapshot::onOpen(const LLSD& key)
{
getParentByType<LLFloater>()->notify(LLSD().with("image-format-change", true));
}
+
+ // If resolution is set to "Current Window", force a snapshot update
+ // each time a snapshot panel is opened to determine the correct
+ // image size (and upload fee) depending on the snapshot type.
+ if (mSnapshotFloater && getChild<LLUICtrl>(getImageSizeComboName())->getValue().asString() == "[i0,i0]")
+ {
+ if (LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView())
+ {
+ preview->mForceUpdateSnapshot = true;
+ }
+ }
}
LLSnapshotModel::ESnapshotFormat LLPanelSnapshot::getImageFormat() const
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
index 96b17acc40..b81b891685 100644
--- a/indra/newview/llpanelsnapshotinventory.cpp
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -42,77 +42,35 @@
/**
* The panel provides UI for saving snapshot as an inventory texture.
*/
-class LLPanelSnapshotInventoryBase
- : public LLPanelSnapshot
-{
- LOG_CLASS(LLPanelSnapshotInventoryBase);
-
-public:
- LLPanelSnapshotInventoryBase();
-
- /*virtual*/ bool postBuild();
-protected:
- void onSend();
- /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType();
-};
-
class LLPanelSnapshotInventory
- : public LLPanelSnapshotInventoryBase
+ : public LLPanelSnapshot
{
LOG_CLASS(LLPanelSnapshotInventory);
public:
LLPanelSnapshotInventory();
- /*virtual*/ bool postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
+ bool postBuild() override;
+ void onOpen(const LLSD& key) override;
void onResolutionCommit(LLUICtrl* ctrl);
private:
- /*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; }
- /*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; }
- /*virtual*/ std::string getAspectRatioCBName() const { return "inventory_keep_aspect_check"; }
- /*virtual*/ std::string getImageSizeComboName() const { return "texture_size_combo"; }
- /*virtual*/ std::string getImageSizePanelName() const { return LLStringUtil::null; }
- /*virtual*/ void updateControls(const LLSD& info);
-
-};
-
-class LLPanelOutfitSnapshotInventory
- : public LLPanelSnapshotInventoryBase
-{
- LOG_CLASS(LLPanelOutfitSnapshotInventory);
-
-public:
- LLPanelOutfitSnapshotInventory();
- /*virtual*/ bool postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
+ std::string getWidthSpinnerName() const override { return "inventory_snapshot_width"; }
+ std::string getHeightSpinnerName() const override { return "inventory_snapshot_height"; }
+ std::string getAspectRatioCBName() const override { return "inventory_keep_aspect_check"; }
+ std::string getImageSizeComboName() const override { return "texture_size_combo"; }
+ std::string getImageSizePanelName() const override { return LLStringUtil::null; }
+ LLSnapshotModel::ESnapshotType getSnapshotType() override;
+ void updateControls(const LLSD& info) override;
-private:
- /*virtual*/ std::string getWidthSpinnerName() const { return ""; }
- /*virtual*/ std::string getHeightSpinnerName() const { return ""; }
- /*virtual*/ std::string getAspectRatioCBName() const { return ""; }
- /*virtual*/ std::string getImageSizeComboName() const { return "texture_size_combo"; }
- /*virtual*/ std::string getImageSizePanelName() const { return LLStringUtil::null; }
- /*virtual*/ void updateControls(const LLSD& info);
-
- /*virtual*/ void cancel();
+ void onSend();
+ void updateUploadCost();
+ S32 calculateUploadCost();
};
static LLPanelInjector<LLPanelSnapshotInventory> panel_class1("llpanelsnapshotinventory");
-static LLPanelInjector<LLPanelOutfitSnapshotInventory> panel_class2("llpaneloutfitsnapshotinventory");
-
-LLPanelSnapshotInventoryBase::LLPanelSnapshotInventoryBase()
-{
-}
-
-bool LLPanelSnapshotInventoryBase::postBuild()
-{
- return LLPanelSnapshot::postBuild();
-}
-
-LLSnapshotModel::ESnapshotType LLPanelSnapshotInventoryBase::getSnapshotType()
+LLSnapshotModel::ESnapshotType LLPanelSnapshotInventory::getSnapshotType()
{
return LLSnapshotModel::SNAPSHOT_TEXTURE;
}
@@ -130,12 +88,14 @@ bool LLPanelSnapshotInventory::postBuild()
getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(false);
getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onResolutionCommit, this, _1));
- return LLPanelSnapshotInventoryBase::postBuild();
+ return LLPanelSnapshot::postBuild();
}
// virtual
void LLPanelSnapshotInventory::onOpen(const LLSD& key)
{
+ updateUploadCost();
+
LLPanelSnapshot::onOpen(key);
}
@@ -144,6 +104,8 @@ void LLPanelSnapshotInventory::updateControls(const LLSD& info)
{
const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot);
+
+ updateUploadCost();
}
void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)
@@ -153,21 +115,9 @@ void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)
getChild<LLSpinCtrl>(getHeightSpinnerName())->setVisible(!current_window_selected);
}
-void LLPanelSnapshotInventoryBase::onSend()
+void LLPanelSnapshotInventory::onSend()
{
- S32 w = 0;
- S32 h = 0;
-
- if( mSnapshotFloater )
- {
- LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView();
- if( preview )
- {
- preview->getSize(w, h);
- }
- }
-
- S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(w, h);
+ S32 expected_upload_cost = calculateUploadCost();
if (can_afford_transaction(expected_upload_cost))
{
if (mSnapshotFloater)
@@ -188,36 +138,24 @@ void LLPanelSnapshotInventoryBase::onSend()
}
}
-LLPanelOutfitSnapshotInventory::LLPanelOutfitSnapshotInventory()
+void LLPanelSnapshotInventory::updateUploadCost()
{
- mCommitCallbackRegistrar.add("Inventory.SaveOutfitPhoto", boost::bind(&LLPanelOutfitSnapshotInventory::onSend, this));
- mCommitCallbackRegistrar.add("Inventory.SaveOutfitCancel", boost::bind(&LLPanelOutfitSnapshotInventory::cancel, this));
+ getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", calculateUploadCost()));
}
-// virtual
-bool LLPanelOutfitSnapshotInventory::postBuild()
+S32 LLPanelSnapshotInventory::calculateUploadCost()
{
- return LLPanelSnapshotInventoryBase::postBuild();
-}
-
-// virtual
-void LLPanelOutfitSnapshotInventory::onOpen(const LLSD& key)
-{
- getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLAgentBenefitsMgr::current().getTextureUploadCost()));
- LLPanelSnapshot::onOpen(key);
-}
-
-// virtual
-void LLPanelOutfitSnapshotInventory::updateControls(const LLSD& info)
-{
- const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
- getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot);
-}
+ S32 w = 0;
+ S32 h = 0;
-void LLPanelOutfitSnapshotInventory::cancel()
-{
if (mSnapshotFloater)
{
- mSnapshotFloater->closeFloater();
+ if (LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView())
+ {
+ w = preview->getEncodedImageWidth();
+ h = preview->getEncodedImageHeight();
+ }
}
+
+ return LLAgentBenefitsMgr::current().getTextureUploadCost(w, h);
}
diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp
index 366030c0fa..57759fbcaa 100644
--- a/indra/newview/llpanelsnapshotlocal.cpp
+++ b/indra/newview/llpanelsnapshotlocal.cpp
@@ -47,18 +47,18 @@ class LLPanelSnapshotLocal
public:
LLPanelSnapshotLocal();
- /*virtual*/ bool postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
+ bool postBuild() override;
+ void onOpen(const LLSD& key) override;
private:
- /*virtual*/ std::string getWidthSpinnerName() const { return "local_snapshot_width"; }
- /*virtual*/ std::string getHeightSpinnerName() const { return "local_snapshot_height"; }
- /*virtual*/ std::string getAspectRatioCBName() const { return "local_keep_aspect_check"; }
- /*virtual*/ std::string getImageSizeComboName() const { return "local_size_combo"; }
- /*virtual*/ std::string getImageSizePanelName() const { return "local_image_size_lp"; }
- /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const;
- /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType();
- /*virtual*/ void updateControls(const LLSD& info);
+ std::string getWidthSpinnerName() const override { return "local_snapshot_width"; }
+ std::string getHeightSpinnerName() const override { return "local_snapshot_height"; }
+ std::string getAspectRatioCBName() const override { return "local_keep_aspect_check"; }
+ std::string getImageSizeComboName() const override { return "local_size_combo"; }
+ std::string getImageSizePanelName() const override { return "local_image_size_lp"; }
+ LLSnapshotModel::ESnapshotFormat getImageFormat() const override;
+ LLSnapshotModel::ESnapshotType getSnapshotType() override;
+ void updateControls(const LLSD& info) override;
S32 mLocalFormat;
diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp
index 962d3bba16..05cd9e7b3a 100644
--- a/indra/newview/llpanelsnapshotoptions.cpp
+++ b/indra/newview/llpanelsnapshotoptions.cpp
@@ -30,12 +30,8 @@
#include "llsidetraypanelcontainer.h"
#include "llfloatersnapshot.h" // FIXME: create a snapshot model
-#include "llsnapshotlivepreview.h"
#include "llfloaterreg.h"
-#include "llagentbenefits.h"
-
-
/**
* Provides several ways to save a snapshot.
*/
@@ -46,12 +42,9 @@ class LLPanelSnapshotOptions
public:
LLPanelSnapshotOptions();
- ~LLPanelSnapshotOptions();
- /*virtual*/ bool postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
+ bool postBuild() override;
private:
- void updateUploadCost();
void openPanel(const std::string& panel_name);
void onSaveToProfile();
void onSaveToEmail();
@@ -71,10 +64,6 @@ LLPanelSnapshotOptions::LLPanelSnapshotOptions()
mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this));
}
-LLPanelSnapshotOptions::~LLPanelSnapshotOptions()
-{
-}
-
// virtual
bool LLPanelSnapshotOptions::postBuild()
{
@@ -82,30 +71,6 @@ bool LLPanelSnapshotOptions::postBuild()
return LLPanel::postBuild();
}
-// virtual
-void LLPanelSnapshotOptions::onOpen(const LLSD& key)
-{
- updateUploadCost();
-}
-
-void LLPanelSnapshotOptions::updateUploadCost()
-{
- S32 w = 0;
- S32 h = 0;
-
- if( mSnapshotFloater )
- {
- LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView();
- if( preview )
- {
- preview->getSize(w, h);
- }
- }
-
- S32 upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(w, h);
- getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost));
-}
-
void LLPanelSnapshotOptions::openPanel(const std::string& panel_name)
{
LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
index 23e8789e3f..f3dfdc9250 100644
--- a/indra/newview/llpanelsnapshotpostcard.cpp
+++ b/indra/newview/llpanelsnapshotpostcard.cpp
@@ -56,18 +56,18 @@ class LLPanelSnapshotPostcard
public:
LLPanelSnapshotPostcard();
- /*virtual*/ bool postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
+ bool postBuild() override;
+ void onOpen(const LLSD& key) override;
private:
- /*virtual*/ std::string getWidthSpinnerName() const { return "postcard_snapshot_width"; }
- /*virtual*/ std::string getHeightSpinnerName() const { return "postcard_snapshot_height"; }
- /*virtual*/ std::string getAspectRatioCBName() const { return "postcard_keep_aspect_check"; }
- /*virtual*/ std::string getImageSizeComboName() const { return "postcard_size_combo"; }
- /*virtual*/ std::string getImageSizePanelName() const { return "postcard_image_size_lp"; }
- /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const { return LLSnapshotModel::SNAPSHOT_FORMAT_JPEG; }
- /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType();
- /*virtual*/ void updateControls(const LLSD& info);
+ std::string getWidthSpinnerName() const override { return "postcard_snapshot_width"; }
+ std::string getHeightSpinnerName() const override { return "postcard_snapshot_height"; }
+ std::string getAspectRatioCBName() const override { return "postcard_keep_aspect_check"; }
+ std::string getImageSizeComboName() const override { return "postcard_size_combo"; }
+ std::string getImageSizePanelName() const override { return "postcard_image_size_lp"; }
+ LLSnapshotModel::ESnapshotFormat getImageFormat() const override { return LLSnapshotModel::SNAPSHOT_FORMAT_JPEG; }
+ LLSnapshotModel::ESnapshotType getSnapshotType() override;
+ void updateControls(const LLSD& info) override;
bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response);
static void sendPostcardFinished(LLSD result);
diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp
index aa257dea9e..b533d7bbbc 100644
--- a/indra/newview/llpanelsnapshotprofile.cpp
+++ b/indra/newview/llpanelsnapshotprofile.cpp
@@ -49,17 +49,17 @@ class LLPanelSnapshotProfile
public:
LLPanelSnapshotProfile();
- /*virtual*/ bool postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
+ bool postBuild() override;
+ void onOpen(const LLSD& key) override;
private:
- /*virtual*/ std::string getWidthSpinnerName() const { return "profile_snapshot_width"; }
- /*virtual*/ std::string getHeightSpinnerName() const { return "profile_snapshot_height"; }
- /*virtual*/ std::string getAspectRatioCBName() const { return "profile_keep_aspect_check"; }
- /*virtual*/ std::string getImageSizeComboName() const { return "profile_size_combo"; }
- /*virtual*/ std::string getImageSizePanelName() const { return "profile_image_size_lp"; }
- /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const { return LLSnapshotModel::SNAPSHOT_FORMAT_PNG; }
- /*virtual*/ void updateControls(const LLSD& info);
+ std::string getWidthSpinnerName() const override { return "profile_snapshot_width"; }
+ std::string getHeightSpinnerName() const override { return "profile_snapshot_height"; }
+ std::string getAspectRatioCBName() const override { return "profile_keep_aspect_check"; }
+ std::string getImageSizeComboName() const override { return "profile_size_combo"; }
+ std::string getImageSizePanelName() const override { return "profile_image_size_lp"; }
+ LLSnapshotModel::ESnapshotFormat getImageFormat() const override { return LLSnapshotModel::SNAPSHOT_FORMAT_PNG; }
+ void updateControls(const LLSD& info) override;
void onSend();
};
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 902412d359..bfdfa68e01 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -42,6 +42,7 @@
#include "llnotificationsutil.h"
#include "lltextbox.h"
#include "lltoggleablemenu.h"
+#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "lllandmarkactions.h"
#include "llclipboard.h"
@@ -215,8 +216,18 @@ std::string LLTeleportHistoryFlatItem::getTimestamp()
// Only show timestamp for today and yesterday
if(time_diff < seconds_today + seconds_in_day)
{
- timestamp = "[" + LLTrans::getString("TimeHour12")+"]:["
- + LLTrans::getString("TimeMin")+"] ["+ LLTrans::getString("TimeAMPM")+"]";
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ if (use_24h)
+ {
+ timestamp = "[" + LLTrans::getString("TimeHour") + "]:["
+ + LLTrans::getString("TimeMin") + "]";
+ }
+ else
+ {
+ timestamp = "[" + LLTrans::getString("TimeHour12") + "]:["
+ + LLTrans::getString("TimeMin") + "] [" + LLTrans::getString("TimeAMPM") + "]";
+ }
+
LLSD substitution;
substitution["datetime"] = (S32) date.secondsSinceEpoch();
LLStringUtil::format(timestamp, substitution);
diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp
index 60877494e7..d8d6bcf5fd 100644
--- a/indra/newview/llpanelvoicedevicesettings.cpp
+++ b/indra/newview/llpanelvoicedevicesettings.cpp
@@ -240,13 +240,38 @@ void LLPanelVoiceDeviceSettings::refresh()
if(mCtrlInputDevices)
{
mCtrlInputDevices->removeall();
- mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM);
+ auto it = mLocalizedDeviceNames.find(mInputDevice);
+ if (it != mLocalizedDeviceNames.end())
+ {
+ mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM);
+ }
+ else
+ {
+ // Display name generaly doesn't match value.
+ // Value is an id so it's not nessesary readable,
+ // might not even be valid (disconnected usb).
+ // Until we get the data, don't change the device,
+ // otherwise box might override the control.
+ // But show a readable placeholder.
+ // Combo is disabled so it's safe to show
+ // a placeholder.
+ mCtrlInputDevices->add(getString("device_not_loaded"), mInputDevice, ADD_BOTTOM);
+ }
mCtrlInputDevices->setValue(mInputDevice);
}
if(mCtrlOutputDevices)
{
mCtrlOutputDevices->removeall();
- mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM);
+ auto it = mLocalizedDeviceNames.find(mOutputDevice);
+ if (it != mLocalizedDeviceNames.end())
+ {
+ mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM);
+ }
+ else
+ {
+ // Don't change the device, only the label
+ mCtrlOutputDevices->add(getString("device_not_loaded"), mOutputDevice, ADD_BOTTOM);
+ }
mCtrlOutputDevices->setValue(mOutputDevice);
}
}
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 951dc45a78..5916163f60 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -576,32 +576,52 @@ void LLPanelVolume::getState( )
return object->getMaterial();
}
} func;
- bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ bool material_same = selection->getSelectedTEValue( &func, material_code );
std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
- if (editable && single_volume && material_same)
+
+ bool enable_material = editable && single_volume && material_same;
+ LLCachedControl<bool> edit_linked(gSavedSettings, "EditLinkedParts", false);
+ if (!enable_material)
{
- mComboMaterial->setEnabled( true );
- if (material_code == LL_MCODE_LIGHT)
+ LLViewerObject* root = selection->getPrimaryObject();
+ while (root && !root->isAvatar() && root->getParent())
{
- if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
+ LLViewerObject* parent = (LLViewerObject*)root->getParent();
+ if (parent->isAvatar())
{
- mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
+ break;
}
- mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
- }
- else
- {
- if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
+ if (!parent->isSelected())
{
- mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
+ break;
}
+ root = parent;
+ }
+ if (root)
+ {
+ material_code = root->getMaterial();
+ }
+ }
+
+ mComboMaterial->setEnabled(enable_material);
- mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
+ if (material_code == LL_MCODE_LIGHT)
+ {
+ if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
+ {
+ mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
}
+ mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
}
else
{
- mComboMaterial->setEnabled( false );
+ if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
+ {
+ mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
+ }
+
+ mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
}
// Physics properties
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index c1534c9abd..3aedde74c6 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -113,6 +113,7 @@ protected:
boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs, no_op));
registrar.add("Wearing.Detach",
boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs, no_op));
+ registrar.add("Wearing.Favorite", boost::bind(toggle_favorites, mUUIDs));
LLContextMenu* menu = createFromFile("menu_wearing_tab.xml");
updateMenuItemsVisibility(menu);
@@ -125,6 +126,8 @@ protected:
bool bp_selected = false; // true if body parts selected
bool clothes_selected = false;
bool attachments_selected = false;
+ bool can_favorite = false;
+ bool can_unfavorite = false;
// See what types of wearables are selected.
for (uuid_vec_t::const_iterator it = mUUIDs.begin(); it != mUUIDs.end(); ++it)
@@ -137,6 +140,9 @@ protected:
continue;
}
+ LLUUID linked_id = item->getLinkedUUID();
+ LLViewerInventoryItem* linked_item = gInventory.getItem(linked_id);
+
LLAssetType::EType type = item->getType();
if (type == LLAssetType::AT_CLOTHING)
{
@@ -150,6 +156,8 @@ protected:
{
attachments_selected = true;
}
+ can_favorite |= !linked_item->getIsFavorite();
+ can_unfavorite |= linked_item->getIsFavorite();
}
// Enable/disable some menu items depending on the selection.
@@ -166,6 +174,8 @@ protected:
menu->setItemVisible("detach", allow_detach);
menu->setItemVisible("edit_outfit_separator", show_touch | show_edit | allow_take_off || allow_detach);
menu->setItemVisible("show_original", mUUIDs.size() == 1);
+ menu->setItemVisible("favorites_add", can_favorite);
+ menu->setItemVisible("favorites_remove", can_unfavorite);
}
};
@@ -232,6 +242,10 @@ LLPanelWearing::~LLPanelWearing()
{
mAttachmentsChangedConnection.disconnect();
}
+ if (mGearMenuConnection.connected())
+ {
+ mGearMenuConnection.disconnect();
+ }
}
bool LLPanelWearing::postBuild()
@@ -249,10 +263,6 @@ bool LLPanelWearing::postBuild()
mTempItemsList->setFgUnselectedColor(LLColor4::white);
mTempItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onTempAttachmentsListRightClick, this, _1, _2, _3));
- LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn");
-
- menu_gear_btn->setMenu(mGearMenu->getMenu());
-
return true;
}
@@ -560,6 +570,16 @@ void LLPanelWearing::onRemoveAttachment()
}
}
+LLToggleableMenu* LLPanelWearing::getGearMenu()
+{
+ return mGearMenu->getMenu();
+}
+
+LLToggleableMenu* LLPanelWearing::getSortMenu()
+{
+ return NULL;
+}
+
void LLPanelWearing::onRemoveItem()
{
if (mWearablesTab->isExpanded())
diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h
index ea0787d0ef..aa80a3fc21 100644
--- a/indra/newview/llpanelwearing.h
+++ b/indra/newview/llpanelwearing.h
@@ -84,6 +84,11 @@ public:
void onEditAttachment();
void onRemoveAttachment();
+ void updateMenuItemsVisibility() {};
+ LLToggleableMenu* getGearMenu();
+ LLToggleableMenu* getSortMenu();
+ bool getTrashMenuVisible() { return false; }
+
private:
void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);
void onTempAttachmentsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);
@@ -93,6 +98,7 @@ private:
LLWearableItemsList* mCOFItemsList;
LLScrollListCtrl* mTempItemsList;
LLWearingGearMenu* mGearMenu;
+ boost::signals2::connection mGearMenuConnection;
LLListContextMenu* mContextMenu;
LLListContextMenu* mAttachmentsMenu;
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 86291708b0..e5c84728fe 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -646,18 +646,17 @@ bool LLPhysicsMotion::onUpdate(F32 time)
velocity_new_local = 0;
}
- // Check for NaN values. A NaN value is detected if the variables doesn't equal itself.
- // If NaN, then reset everything.
- if ((mPosition_local != mPosition_local) ||
- (mVelocity_local != mVelocity_local) ||
- (position_new_local != position_new_local))
+ // Check for NaN values. If NaN, then reset everything.
+ if (llisnan(mPosition_local) ||
+ llisnan(mVelocity_local) ||
+ llisnan(position_new_local))
{
- position_new_local = 0;
- mVelocity_local = 0;
- mVelocityJoint_local = 0;
- mAccelerationJoint_local = 0;
- mPosition_local = 0;
- mPosition_world = LLVector3(0,0,0);
+ position_new_local = 0.f;
+ mVelocity_local = 0.f;
+ mVelocityJoint_local = 0.f;
+ mAccelerationJoint_local = 0.f;
+ mPosition_local = 0.f;
+ mPosition_world = LLVector3(0.f,0.f,0.f);
}
const F32 position_new_local_clamped = llclamp(position_new_local,
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 02a4c7fb26..c2aa4925bd 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -703,9 +703,10 @@ void LLScriptEdCore::sync()
}
}
-bool LLScriptEdCore::hasChanged()
+bool LLScriptEdCore::hasChanged() const
{
- if (!mEditor) return false;
+ if (!mEditor)
+ return false;
return ((!mEditor->isPristine() || mEnableSave) && mHasScriptData);
}
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 70ee1a4274..0bbe540207 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -143,7 +143,7 @@ public:
void setItemRemoved(bool script_removed){mScriptRemoved = script_removed;};
void setAssetID( const LLUUID& asset_id){ mAssetID = asset_id; };
- LLUUID getAssetID() { return mAssetID; }
+ LLUUID getAssetID() const { return mAssetID; }
bool isFontSizeChecked(const LLSD &userdata);
void onChangeFontSize(const LLSD &size_name);
@@ -155,7 +155,7 @@ public:
void onBtnDynamicHelp();
void onBtnUndoChanges();
- bool hasChanged();
+ bool hasChanged() const;
void selectFirstError();
@@ -211,7 +211,6 @@ class LLScriptEdContainer : public LLPreview
public:
LLScriptEdContainer(const LLSD& key);
- LLScriptEdContainer(const LLSD& key, const bool live);
bool handleKeyHere(KEY key, MASK mask);
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 2c09943b83..c77fc6dc84 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -81,6 +81,8 @@ bool LLProgressView::postBuild()
{
mProgressBar = getChild<LLProgressBar>("login_progress_bar");
+ mLogosLabel = getChild<LLTextBox>("logos_lbl");
+
mProgressText = getChild<LLTextBox>("progress_text");
mMessageText = getChild<LLTextBox>("message_text");
mMessageTextRectInitial = mMessageText->getRect(); // auto resizes, save initial size
@@ -239,6 +241,33 @@ void LLProgressView::drawStartTexture(F32 alpha)
gGL.popMatrix();
}
+void LLProgressView::drawLogos(F32 alpha)
+{
+ if (mLogosList.empty())
+ {
+ return;
+ }
+
+ // logos are tied to label,
+ // due to potential resizes we have to figure offsets out on draw or resize
+ S32 offset_x, offset_y;
+ mLogosLabel->localPointToScreen(0, 0, &offset_x, &offset_y);
+ std::vector<TextureData>::const_iterator iter = mLogosList.begin();
+ std::vector<TextureData>::const_iterator end = mLogosList.end();
+ for (; iter != end; iter++)
+ {
+ gl_draw_scaled_image_with_border(iter->mDrawRect.mLeft + offset_x,
+ iter->mDrawRect.mBottom + offset_y,
+ iter->mDrawRect.getWidth(),
+ iter->mDrawRect.getHeight(),
+ iter->mTexturep.get(),
+ UI_VERTEX_COLOR % alpha,
+ false,
+ iter->mClipRect,
+ iter->mOffsetRect);
+ }
+}
+
void LLProgressView::draw()
{
static LLTimer timer;
@@ -254,6 +283,7 @@ void LLProgressView::draw()
}
LLPanel::draw();
+ drawLogos(alpha);
return;
}
@@ -266,6 +296,7 @@ void LLProgressView::draw()
drawStartTexture(alpha);
LLPanel::draw();
+ drawLogos(alpha);
// faded out completely - remove panel and reveal world
if (mFadeToWorldTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME )
@@ -300,6 +331,7 @@ void LLProgressView::draw()
drawStartTexture(1.0f);
// draw children
LLPanel::draw();
+ drawLogos(1.0f);
}
void LLProgressView::setText(const std::string& text)
@@ -330,6 +362,98 @@ void LLProgressView::setMessage(const std::string& msg)
}
}
+void LLProgressView::loadLogo(const std::string &path,
+ const U8 image_codec,
+ const LLRect &pos_rect,
+ const LLRectf &clip_rect,
+ const LLRectf &offset_rect)
+{
+ // We need these images very early, so we have to force-load them, otherwise they might not load in time.
+ if (!gDirUtilp->fileExists(path))
+ {
+ return;
+ }
+
+ LLPointer<LLImageFormatted> start_image_frmted = LLImageFormatted::createFromType(image_codec);
+ if (!start_image_frmted->load(path))
+ {
+ LL_WARNS("AppInit") << "Image load failed: " << path << LL_ENDL;
+ return;
+ }
+
+ LLPointer<LLImageRaw> raw = new LLImageRaw;
+ if (!start_image_frmted->decode(raw, 0.0f))
+ {
+ LL_WARNS("AppInit") << "Image decode failed " << path << LL_ENDL;
+ return;
+ }
+ // HACK: getLocalTexture allows only power of two dimentions
+ raw->expandToPowerOfTwo();
+
+ TextureData data;
+ data.mTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), false);
+ data.mDrawRect = pos_rect;
+ data.mClipRect = clip_rect;
+ data.mOffsetRect = offset_rect;
+ mLogosList.push_back(data);
+}
+
+void LLProgressView::initLogos()
+{
+ mLogosList.clear();
+
+#if LL_FMODSTUDIO || LL_HAVOK
+ const U8 image_codec = IMG_CODEC_PNG;
+ const LLRectf default_clip(0.f, 1.f, 1.f, 0.f);
+ //const S32 default_height = 28;
+ const S32 default_pad = 15;
+
+ S32 icon_width, icon_height;
+
+ // We don't know final screen rect yet, so we can't precalculate position fully
+ S32 texture_start_x = (S32)mLogosLabel->getFont()->getWidthF32(mLogosLabel->getWText().c_str()) + default_pad;
+ S32 texture_start_y = -7;
+#endif //LL_FMODSTUDIO || LL_HAVOK
+
+ // Normally we would just preload these textures from textures.xml,
+ // and display them via icon control, but they are only needed on
+ // startup and preloaded/UI ones stay forever
+ // (and this code was done already so simply reused it)
+ std::string temp_str = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "textures", "3p_icons");
+
+ temp_str += gDirUtilp->getDirDelimiter();
+
+#ifdef LL_FMODSTUDIO
+ // original image size is 264x96, it is on longer side but
+ // with no internal paddings so it gets additional padding
+ icon_width = 77;
+ icon_height = 21;
+ S32 pad_fmod_y = 4;
+ texture_start_x++;
+ loadLogo(temp_str + "fmod_logo.png",
+ image_codec,
+ LLRect(texture_start_x, texture_start_y + pad_fmod_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_fmod_y),
+ default_clip,
+ default_clip);
+
+ texture_start_x += icon_width + default_pad + 1;
+#endif //LL_FMODSTUDIO
+#ifdef LL_HAVOK
+ // original image size is 342x113, central element is on a larger side
+ // plus internal padding, so it gets slightly more height than desired 32
+ icon_width = 88;
+ icon_height = 29;
+ S32 pad_havok_y = -1;
+ loadLogo(temp_str + "havok_logo.png",
+ image_codec,
+ LLRect(texture_start_x, texture_start_y + pad_havok_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_havok_y),
+ default_clip,
+ default_clip);
+
+ texture_start_x += icon_width + default_pad;
+#endif //LL_HAVOK
+}
+
void LLProgressView::initStartTexture(S32 location_id, bool is_in_production)
{
if (gStartTexture.notNull())
@@ -408,11 +532,19 @@ void LLProgressView::initStartTexture(S32 location_id, bool is_in_production)
void LLProgressView::initTextures(S32 location_id, bool is_in_production)
{
initStartTexture(location_id, is_in_production);
+ initLogos();
+
+ childSetVisible("panel_icons", !mLogosList.empty());
+ childSetVisible("panel_top_spacer", mLogosList.empty());
}
void LLProgressView::releaseTextures()
{
gStartTexture = NULL;
+ mLogosList.clear();
+
+ childSetVisible("panel_top_spacer", true);
+ childSetVisible("panel_icons", false);
}
void LLProgressView::setCancelButtonVisible(bool b, const std::string& label)
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index 250ee511d7..f529c16c1d 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -53,6 +53,7 @@ public:
/*virtual*/ void draw();
void drawStartTexture(F32 alpha);
+ void drawLogos(F32 alpha);
/*virtual*/ bool handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ bool handleKeyHere(KEY key, MASK mask);
@@ -85,6 +86,7 @@ public:
protected:
LLProgressBar* mProgressBar;
LLMediaCtrl* mMediaCtrl;
+ LLTextBox* mLogosLabel = nullptr;
LLTextBox* mProgressText = nullptr;
LLTextBox* mMessageText = nullptr;
F32 mPercentDone;
@@ -110,8 +112,25 @@ protected:
bool handleUpdate(const LLSD& event_data);
static void onIdle(void* user_data);
+ void loadLogo(const std::string &path, const U8 image_codec, const LLRect &pos_rect, const LLRectf &clip_rect, const LLRectf &offset_rect);
+ // logos have unusual location and need to be preloaded to not appear grey, then deleted
+ void initLogos();
// Loads a bitmap to display during load
void initStartTexture(S32 location_id, bool is_in_production);
+
+private:
+ // We need to draw textures on login, but only once.
+ // So this vector gets filled up for textures to render and gets cleaned later
+ // Some textures have unusual requirements, so we are rendering directly
+ class TextureData
+ {
+ public:
+ LLPointer<LLViewerTexture> mTexturep;
+ LLRect mDrawRect;
+ LLRectf mClipRect;
+ LLRectf mOffsetRect;
+ };
+ std::vector<TextureData> mLogosList;
};
#endif // LL_LLPROGRESSVIEW_H
diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp
index 910509928d..7f5076bd56 100644
--- a/indra/newview/llreflectionmap.cpp
+++ b/indra/newview/llreflectionmap.cpp
@@ -177,7 +177,7 @@ void LLReflectionMap::autoAdjustOrigin()
mPriority = 1;
mOrigin.load3(mViewerObject->getPositionAgent().mV);
- if (mViewerObject->getVolume() && ((LLVOVolume*)mViewerObject)->getReflectionProbeIsBox())
+ if (mViewerObject->getVolume() && ((LLVOVolume*)mViewerObject.get())->getReflectionProbeIsBox())
{
LLVector3 s = mViewerObject->getScale().scaledVec(LLVector3(0.5f, 0.5f, 0.5f));
mRadius = s.magVec();
diff --git a/indra/newview/llreflectionmap.h b/indra/newview/llreflectionmap.h
index d20bba7059..39ec06a167 100644
--- a/indra/newview/llreflectionmap.h
+++ b/indra/newview/llreflectionmap.h
@@ -103,6 +103,9 @@ public:
// last time this probe was bound for rendering
F32 mLastBindTime = 0.f;
+ // Next update time
+ F32 mNextUpdateTime = 0.f;
+
// cube map used to sample this environment map
LLPointer<LLCubeMapArray> mCubeArray;
S32 mCubeIndex = -1; // index into cube map array or -1 if not currently stored in cube map array
@@ -110,6 +113,9 @@ public:
// probe has had at least one full update and is ready to render
bool mComplete = false;
+ // number of tiees the probe has been completed
+ U32 mCompletedCount = 0;
+
// fade in parameter for this probe
F32 mFadeIn = 0.f;
@@ -124,7 +130,7 @@ public:
LLSpatialGroup* mGroup = nullptr;
// viewer object this probe is tracking (if any)
- LLViewerObject* mViewerObject = nullptr;
+ LLPointer<LLViewerObject> mViewerObject;
// what priority should this probe have (higher is higher priority)
// currently only 0 or 1
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index fae6acec3c..aa48035aa8 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -54,6 +54,7 @@
#endif
LLPointer<LLImageGL> gEXRImage;
+//LLTrace::BlockTimerStatHandle FTM_RENDER_RADIANCE("Render Radiance");
void load_exr(const std::string& filename)
{
@@ -211,6 +212,7 @@ void LLReflectionMapManager::update()
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("reflection manager update");
llassert(!gCubeSnapshot); // assert a snapshot is not in progress
if (LLAppViewer::instance()->logoutRequestSent())
{
@@ -222,25 +224,39 @@ 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);
+ static LLCachedControl<F32> sProbeUpdateSlowDown(gSavedSettings, "MPRenderProbeSlowDown", 0.05);
+
+ bool realtime = mRenderReflectionProbeDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
+
+ if(sProbeUpdateSlowDown > 0.0)
+ {
+ if ( mLastUpdate > 0.f )
+ {
+ F32 elapsed = gFrameTimeSeconds - mLastUpdate;
+ if (elapsed > 0.0 && elapsed < sProbeUpdateSlowDown)
+ {
+ return;
+ }
+ }
+ }
+
+ mLastUpdate = gFrameTimeSeconds;
+
mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f);
{
U32 probe_count_temp = mDynamicProbeCount;
- if (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 +265,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);
@@ -274,10 +290,17 @@ void LLReflectionMapManager::update()
initReflectionMaps();
static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
+ static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0);
+
+ U32 color_fmt = render_hdr ? GL_R11F_G11F_B10F : GL_RGB8;
+
+ if(MPColorPrecision == 1)
+ {
+ color_fmt = GL_RGB8;
+ }
if (!mRenderTarget.isComplete())
{
- U32 color_fmt = render_hdr ? GL_R11F_G11F_B10F : GL_RGB8;
U32 targetRes = mProbeResolution * 4; // super sample
mRenderTarget.allocate(targetRes, targetRes, color_fmt, true);
}
@@ -290,7 +313,7 @@ void LLReflectionMapManager::update()
mMipChain.resize(count);
for (U32 i = 0; i < count; ++i)
{
- mMipChain[i].allocate(res, res, render_hdr ? GL_R11F_G11F_B10F : GL_RGB8);
+ mMipChain[i].allocate(res, res, color_fmt);
res /= 2;
}
}
@@ -328,8 +351,6 @@ void LLReflectionMapManager::update()
bool did_update = false;
- bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
-
LLReflectionMap* closestDynamic = nullptr;
LLReflectionMap* oldestProbe = nullptr;
@@ -362,6 +383,9 @@ void LLReflectionMapManager::update()
probe->mCubeArray = nullptr;
probe->mCubeIndex = -1;
probe->mComplete = false;
+ probe->mCompletedCount = 0;
+ probe->mLastUpdateTime = 0.0;
+ probe->mNextUpdateTime = 0.0;
probe->mFadeIn = 0;
}
}
@@ -385,6 +409,8 @@ void LLReflectionMapManager::update()
mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f);
+ static LLCachedControl<F32> sDefaultUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.0);
+
for (unsigned int i = 0; i < mProbes.size(); ++i)
{
LLReflectionMap* probe = mProbes[i];
@@ -401,6 +427,8 @@ void LLReflectionMapManager::update()
continue;
}
+ // Calculating distance
+
LLVector4a d;
if (probe != mDefaultProbe)
@@ -412,13 +440,14 @@ void LLReflectionMapManager::update()
d.setSub(camera_pos, probe->mOrigin);
probe->mDistance = d.getLength3().getF32() - probe->mRadius;
}
- else if (probe->mComplete)
+ else if (mDefaultProbe->mComplete)
{
// make default probe have a distance of 64m for the purposes of prioritization (if it's already been generated once)
probe->mDistance = 64.f;
}
else
{
+ probe->mNextUpdateTime = 0.f;
probe->mDistance = -4096.f; //boost priority of default probe when it's not complete
}
@@ -427,8 +456,13 @@ void LLReflectionMapManager::update()
probe->autoAdjustOrigin();
probe->mFadeIn = llmin((F32) (probe->mFadeIn + gFrameIntervalSeconds), 1.f);
}
+
+ // Guess oldest probe
+
if (probe->mOccluded && probe->mComplete)
{
+ // occluded probe
+
if (oldestOccluded == nullptr)
{
oldestOccluded = probe;
@@ -457,7 +491,7 @@ void LLReflectionMapManager::update()
closestDynamic = probe;
}
- if (sLevel == 0)
+ if (mRenderReflectionProbeLevel == 0)
{
// only update default probe when coverage is set to none
llassert(probe == mDefaultProbe);
@@ -465,6 +499,8 @@ void LLReflectionMapManager::update()
}
}
+ // realtime
+
if (realtime && closestDynamic != nullptr)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("rmmu - realtime");
@@ -480,21 +516,23 @@ void LLReflectionMapManager::update()
{
updateProbeFace(closestDynamic, i);
}
+ if(mRealtimeRadiancePass) updateProbeRadiance(closestDynamic);
+ else updateProbeIrradiance(closestDynamic);
mRealtimeRadiancePass = !mRealtimeRadiancePass;
// restore "isRadiancePass"
mRadiancePass = radiance_pass;
}
- static LLCachedControl<F32> sUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.f);
- if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sUpdatePeriod)
+ if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sDefaultUpdatePeriod)
{
- if (sLevel == 0)
+// if (sLevel == 0 && mDefaultProbe->mComplete)
+ if (mRenderReflectionProbeLevel == 0)
{ // when probes are disabled don't update the default probe more often than the prescribed update period
oldestProbe = nullptr;
}
}
- else if (sLevel > 0)
+ else if (mRenderReflectionProbeLevel > 0)
{ // when probes are enabled don't update the default probe less often than the prescribed update period
oldestProbe = mDefaultProbe;
}
@@ -505,11 +543,21 @@ void LLReflectionMapManager::update()
LLReflectionMap* probe = oldestProbe;
llassert(probe->mCubeIndex != -1);
+ bool shouldUpdate = true;
+
+ if( probe->mNextUpdateTime > 0.f && gFrameTimeSeconds < probe->mNextUpdateTime)
+ {
+ shouldUpdate = false;
+ }
+
+ if(shouldUpdate)
+ {
probe->autoAdjustOrigin();
sUpdateCount++;
mUpdatingProbe = probe;
doProbeUpdate();
+ }
}
if (oldestOccluded)
@@ -520,6 +568,14 @@ void LLReflectionMapManager::update()
}
}
+void LLReflectionMapManager::refreshSettings()
+{
+ mRenderReflectionProbeDetail = gSavedSettings.getS32("RenderReflectionProbeDetail");
+ mRenderReflectionProbeLevel = gSavedSettings.getS32("RenderReflectionProbeLevel");
+ mRenderReflectionProbeCount = gSavedSettings.getU32("RenderReflectionProbeCount");
+ mRenderReflectionProbeDynamicAllocation = gSavedSettings.getS32("RenderReflectionProbeDynamicAllocation");
+}
+
LLReflectionMap* LLReflectionMapManager::addProbe(LLSpatialGroup* group)
{
if (gGLManager.mGLVersion < 4.05f || !LLPipeline::sReflectionProbesEnabled)
@@ -717,11 +773,19 @@ void LLReflectionMapManager::doProbeUpdate()
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
llassert(mUpdatingProbe != nullptr);
- updateProbeFace(mUpdatingProbe, mUpdatingFace);
+ if(mUpdatingFace < 6)
+ {
+ updateProbeFace(mUpdatingProbe, mUpdatingFace);
+ }
+ else
+ {
+ if(isRadiancePass()) updateProbeRadiance(mUpdatingProbe);
+ else updateProbeIrradiance(mUpdatingProbe);
+ }
bool debug_updates = gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PROBE_UPDATES) && mUpdatingProbe->mViewerObject;
- if (++mUpdatingFace == 6)
+ if (mUpdatingFace == 6)
{
if (debug_updates)
{
@@ -731,7 +795,23 @@ void LLReflectionMapManager::doProbeUpdate()
mUpdatingFace = 0;
if (isRadiancePass())
{
+ static LLCachedControl<F32> sMPUpdatePeriod(gSavedSettings, "MPRenderProbeUpdatePeriod", 15.0);
+
mUpdatingProbe->mComplete = true;
+ mUpdatingProbe->mCompletedCount++;
+
+ LL_WARNS() << "Probe updated (" << mUpdatingProbe->mCompletedCount << ")" << LL_ENDL;
+
+ if(mUpdatingProbe->mCompletedCount < 5)
+ {
+ //probe->mNextUpdateTime = gFrameTimeSeconds + fmax( ((F32)sMPUpdatePeriod / 2.0), 0.25);
+ mUpdatingProbe->mNextUpdateTime = gFrameTimeSeconds + 1.0;
+ }
+ else
+ {
+ mUpdatingProbe->mNextUpdateTime = gFrameTimeSeconds + fmax( (F32)sMPUpdatePeriod, 0.10);
+ }
+
mUpdatingProbe = nullptr;
mRadiancePass = false;
}
@@ -740,9 +820,14 @@ void LLReflectionMapManager::doProbeUpdate()
mRadiancePass = true;
}
}
- else if (debug_updates)
+ else
{
+ ++mUpdatingFace;
+
+ if (debug_updates)
+ {
mUpdatingProbe->mViewerObject->setDebugText(llformat("%.1f", (F32)gFrameTimeSeconds), LLColor4(1, 1, 0, 1));
+ }
}
}
@@ -756,6 +841,8 @@ void LLReflectionMapManager::doProbeUpdate()
// In effect this simulates single-bounce lighting.
void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("probe update");
// hacky hot-swap of camera specific render targets
gPipeline.mRT = &gPipeline.mAuxillaryRT;
@@ -782,7 +869,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
}
else
{
- llassert(gSavedSettings.getS32("RenderReflectionProbeLevel") > 0); // should never update a probe that's not the default probe if reflection coverage is none
+ llassert(mRenderReflectionProbeLevel > 0); // should never update a probe that's not the default probe if reflection coverage is none
probe->update(mRenderTarget.getWidth(), face);
}
@@ -795,7 +882,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
sourceIdx += 1;
}
- gGL.setColorMask(true, true);
+ gGL.setColorMask(true, false);
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
LLGLDisable blend(GL_BLEND);
@@ -829,7 +916,8 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
// horizontal
gGaussianProgram.uniform2f(direction, 1.f, 0.f);
gGL.getTexUnit(diffuseChannel)->bind(screen_rt);
- mRenderTarget.bindTarget();
+ mRenderTarget.bindTarget("", 1);
+ mRenderTarget.clear(0);
gPipeline.mScreenTriangleVB->setBuffer();
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
mRenderTarget.flush();
@@ -837,7 +925,8 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
// vertical
gGaussianProgram.uniform2f(direction, 0.f, 1.f);
gGL.getTexUnit(diffuseChannel)->bind(&mRenderTarget);
- screen_rt->bindTarget();
+ screen_rt->bindTarget("", 1);
+ screen_rt->clear(0);
gPipeline.mScreenTriangleVB->setBuffer();
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
screen_rt->flush();
@@ -852,7 +941,10 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
for (int i = 0; i < mMipChain.size(); ++i)
{
LL_PROFILE_GPU_ZONE("probe mip");
- mMipChain[i].bindTarget();
+
+ mMipChain[i].bindTarget("probe face ", 0);
+ mMipChain[i].clear(0);
+
if (i == 0)
{
gGL.getTexUnit(diffuseChannel)->bind(screen_rt);
@@ -896,17 +988,118 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
gGL.getTexUnit(diffuseChannel)->unbind(LLTexUnit::TT_TEXTURE);
gReflectionMipProgram.unbind();
}
+}
- if (face == 5)
- {
- mMipChain[0].bindTarget();
- static LLStaticHashedString sSourceIdx("sourceIdx");
+// ===================== IRRADIANCE ================================
- if (isRadiancePass())
+void LLReflectionMapManager::updateProbeIrradiance(LLReflectionMap* probe)
+{
+ LL_PROFILE_GPU_ZONE("probe irradiance gen");
+
+ static LLStaticHashedString sMipLevel("mipLevel");
+ static LLStaticHashedString sRoughness("roughness");
+ static LLStaticHashedString sWidth("u_width");
+
+ S32 sourceIdx = mReflectionProbeCount;
+
+ if (probe != mUpdatingProbe)
+ { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel
+ sourceIdx += 1;
+ }
+
+ gGL.setColorMask(true, false);
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+
+ static LLStaticHashedString sSourceIdx("sourceIdx");
+
+
+ mMipChain[0].bindTarget("irradiance", 0);
+ mMipChain[0].clear();
+
+ gIrradianceGenProgram.bind();
+
+#if GL_VERSION_4_0
+ S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
+ mTexture->bind(channel);
+#endif
+
+ gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
+ gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
+
+ mVertexBuffer->setBuffer();
+
+ int start_mip = 0;
+ // find the mip target to start with based on irradiance map resolution
+ for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip)
+ {
+ if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION)
{
- //generate radiance map (even if this is not the irradiance map, we need the mip chain for the irradiance map)
- gRadianceGenProgram.bind();
- mVertexBuffer->setBuffer();
+ break;
+ }
+ }
+
+ int i = start_mip;
+
+ //LL_PROFILE_GPU_ZONE("probe irradiance gen");
+
+ glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight());
+
+ for (int cf = 0; cf < 6; ++cf)
+ {
+ LLCoordFrame frame;
+ frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
+
+ F32 mat[16];
+ frame.getOpenGLRotation(mat);
+ gGL.loadMatrix(mat);
+
+ mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4);
+
+ S32 res = mMipChain[i].getWidth();
+#if GL_VERSION_4_0
+ mIrradianceMaps->bind(channel);
+ glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
+ mTexture->bind(channel);
+#endif
+ //mMipChain[0].clear(0);
+ }
+
+ mMipChain[0].flush();
+ gIrradianceGenProgram.unbind();
+}
+
+// ==================== RADIANCE ===========================
+
+void LLReflectionMapManager::updateProbeRadiance(LLReflectionMap* probe)
+{
+ LL_PROFILE_GPU_ZONE("probe radiance gen");
+ static LLStaticHashedString sMipLevel("mipLevel");
+ static LLStaticHashedString sRoughness("roughness");
+ static LLStaticHashedString sWidth("u_width");
+
+ S32 sourceIdx = mReflectionProbeCount;
+
+ if (probe != mUpdatingProbe)
+ { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel
+ sourceIdx += 1;
+ }
+
+ gGL.setColorMask(true, false);
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+
+ static LLStaticHashedString sSourceIdx("sourceIdx");
+
+ //LL_RECORD_BLOCK_TIME(FTM_RENDER_RADIANCE);
+
+ mMipChain[0].bindTarget("radiance", 0);
+ mMipChain[0].clear();
+
+ gRadianceGenProgram.bind();
+ mVertexBuffer->setBuffer();
#if GL_VERSION_4_0
S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
@@ -915,22 +1108,19 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, 1.f);
+ gRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
U32 res = mMipChain[0].getWidth();
for (int i = 0; i < mMipChain.size(); ++i)
{
- LL_PROFILE_GPU_ZONE("probe radiance gen");
- static LLStaticHashedString sMipLevel("mipLevel");
- static LLStaticHashedString sRoughness("roughness");
- static LLStaticHashedString sWidth("u_width");
+ glViewport(0, 0, res, res);
- gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1));
gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i);
- gRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
+ gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1));
for (int cf = 0; cf < 6; ++cf)
- { // for each cube face
+ {
LLCoordFrame frame;
frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
@@ -943,70 +1133,18 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
#if GL_VERSION_4_0
glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
#endif
+ LOG_GLERROR("glCopyTexSubImage3D");
}
if (i != mMipChain.size() - 1)
{
res /= 2;
- glViewport(0, 0, res, res);
}
- }
+ }
gRadianceGenProgram.unbind();
- }
- else
- {
- //generate irradiance map
- gIrradianceGenProgram.bind();
-#if GL_VERSION_4_0
- S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
- mTexture->bind(channel);
-#endif
-
- gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
- gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
-
- mVertexBuffer->setBuffer();
- int start_mip = 0;
- // find the mip target to start with based on irradiance map resolution
- for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip)
- {
- if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION)
- {
- break;
- }
- }
-
- //for (int i = start_mip; i < mMipChain.size(); ++i)
- {
- int i = start_mip;
- LL_PROFILE_GPU_ZONE("probe irradiance gen");
- glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight());
- for (int cf = 0; cf < 6; ++cf)
- { // for each cube face
- LLCoordFrame frame;
- frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
-
- F32 mat[16];
- frame.getOpenGLRotation(mat);
- gGL.loadMatrix(mat);
-
- mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4);
-
- S32 res = mMipChain[i].getWidth();
-#if GL_VERSION_4_0
- mIrradianceMaps->bind(channel);
- glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
- mTexture->bind(channel);
-#endif
- }
- }
- }
-
- mMipChain[0].flush();
-
- gIrradianceGenProgram.unbind();
- }
+ mMipChain[0].flush();
+ //mTexture->unbind();
}
void LLReflectionMapManager::reset()
@@ -1081,6 +1219,7 @@ void LLReflectionMapManager::updateUniforms()
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("rmmu - uniforms")
mReflectionMaps.resize(mReflectionProbeCount);
@@ -1156,7 +1295,7 @@ void LLReflectionMapManager::updateUniforms()
{
if (refmap->mViewerObject && refmap->mViewerObject->getVolume())
{ // have active manual probes live-track the object they're associated with
- LLVOVolume* vobj = (LLVOVolume*)refmap->mViewerObject;
+ LLVOVolume* vobj = (LLVOVolume*)refmap->mViewerObject.get();
refmap->mOrigin.load3(vobj->getPositionAgent().mV);
@@ -1426,8 +1565,13 @@ void LLReflectionMapManager::initReflectionMaps()
{
static LLCachedControl<U32> ref_probe_res(gSavedSettings, "RenderReflectionProbeResolution", 128U);
U32 probe_resolution = nhpo2(llclamp(ref_probe_res(), (U32)64, (U32)512));
- if (mTexture.isNull() || mReflectionProbeCount != mDynamicProbeCount || mProbeResolution != probe_resolution || mReset)
+
+ bool shouldInit = mTexture.isNull() || mReflectionProbeCount != mDynamicProbeCount || mProbeResolution != probe_resolution || mReset;
+
+ if (shouldInit)
{
+ //LL_WARNS() << "====== initReflectionMaps() =======" << LL_ENDL;
+
if(mProbeResolution != probe_resolution)
{
mRenderTarget.release();
@@ -1444,6 +1588,8 @@ void LLReflectionMapManager::initReflectionMaps()
mTexture->getWidth() != mProbeResolution ||
mReflectionProbeCount + 2 != mTexture->getCount())
{
+ static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
+
if (mTexture)
{
mTexture = new LLCubeMapArray(*mTexture, mProbeResolution, mReflectionProbeCount + 2);
@@ -1454,8 +1600,6 @@ void LLReflectionMapManager::initReflectionMaps()
{
mTexture = new LLCubeMapArray();
- static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
-
// store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation
// source)
mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr);
@@ -1477,7 +1621,9 @@ void LLReflectionMapManager::initReflectionMaps()
for (auto& probe : mProbes)
{
probe->mLastUpdateTime = 0.f;
+ probe->mNextUpdateTime = 0.f;
probe->mComplete = false;
+ probe->mCompletedCount = 0;
probe->mProbeIndex = -1;
probe->mCubeArray = nullptr;
probe->mCubeIndex = -1;
@@ -1503,6 +1649,9 @@ void LLReflectionMapManager::initReflectionMaps()
mDefaultProbe->mRadius = 4096.f;
mDefaultProbe->mProbeIndex = 0;
mDefaultProbe->mComplete = default_complete;
+ mDefaultProbe->mCompletedCount = 0;
+ mDefaultProbe->mLastUpdateTime = 0.f;
+ mDefaultProbe->mNextUpdateTime = 0.f;
touch_default_probe(mDefaultProbe);
}
diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h
index 0719c28134..337c4ca7fa 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);
@@ -212,6 +214,9 @@ private:
// update the specified face of the specified probe
void updateProbeFace(LLReflectionMap* probe, U32 face);
+ void updateProbeIrradiance(LLReflectionMap* probe);
+ void updateProbeRadiance(LLReflectionMap* probe);
+
// list of active reflection maps
std::vector<LLPointer<LLReflectionMap> > mProbes;
@@ -248,6 +253,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;
@@ -267,6 +278,8 @@ private:
bool mPaused = false;
F32 mResumeTime = 0.f;
+ F32 mLastUpdate = 0.f;
+
ReflectionProbeData mProbeData;
};
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 22a9dd0027..2fdec14f6d 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -109,25 +109,27 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id)
LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
{
LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id);
- floater->setNotificationId(notification_id);
- floater->createForm(notification_id);
-
- //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445)
- floater->setAutoFocus(false);
-
- if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))
+ if (floater)
{
- floater->setSavePosition(true);
- floater->restorePosition();
- }
- else
- {
- floater->dockToChiclet(true);
- }
+ floater->setNotificationId(notification_id);
+ floater->createForm(notification_id);
- //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445)
- LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, false);
+ //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445)
+ floater->setAutoFocus(false);
+ if (LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))
+ {
+ floater->setSavePosition(true);
+ floater->restorePosition();
+ }
+ else
+ {
+ floater->dockToChiclet(true);
+ }
+
+ //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445)
+ LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, false);
+ }
return floater;
}
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 1876cd3086..758e91f6c9 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -252,6 +252,7 @@ LLSelectMgr::LLSelectMgr()
LLSelectMgr::~LLSelectMgr()
{
clearSelections();
+ mSlectionLodModChangedConnection.disconnect();
}
void LLSelectMgr::clearSelections()
@@ -1995,9 +1996,95 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
asset_id = BLANK_MATERIAL_ASSET_ID;
}
}
+
+ // If this face already has the target material ID, do nothing.
+ // This prevents re-sending the same ID on OK, which can cause the server
+ // to drop overrides when queueApply is invoked with the OLD id.
+ if (objectp->getRenderMaterialID(te) == asset_id)
+ {
+ return true;
+ }
+
+ // Preserve existing texture transforms when switching to PBR material
+ LLTextureEntry* tep = objectp->getTE(te);
+ bool should_preserve_transforms = false;
+ LLGLTFMaterial* preserved_override = nullptr;
+
+ if (tep && asset_id.notNull())
+ {
+ // Only preserve transforms from existing GLTF material override
+ // Do not fall back to texture entry transforms when switching between PBR materials
+ LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride();
+ if (existing_override)
+ {
+ // Check if existing override has non-default transforms
+ const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0];
+ const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
+
+ if (existing_transform.mScale != default_transform.mScale ||
+ existing_transform.mOffset != default_transform.mOffset ||
+ existing_transform.mRotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from current PBR material
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ preserved_override->mTextureTransform[i].mScale = existing_transform.mScale;
+ preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset;
+ preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation;
+ }
+ should_preserve_transforms = true;
+ }
+ // If existing override has default transforms, don't preserve anything
+ }
+ else
+ {
+ // No existing PBR material override - check texture entry transforms
+ // This handles the case of switching from Blinn-Phong to PBR material
+ F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
+ tep->getScale(&existing_scale_s, &existing_scale_t);
+ tep->getOffset(&existing_offset_s, &existing_offset_t);
+ existing_rotation = tep->getRotation();
+
+ const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
+ if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
+ existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
+ existing_rotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from texture entry
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLVector2 pbr_scale, pbr_offset;
+ F32 pbr_rotation;
+ LLGLTFMaterial::convertTextureTransformToPBR(
+ existing_scale_s, existing_scale_t,
+ existing_offset_s, existing_offset_t,
+ existing_rotation,
+ pbr_scale, pbr_offset, pbr_rotation);
+ preserved_override->mTextureTransform[i].mScale = pbr_scale;
+ preserved_override->mTextureTransform[i].mOffset = pbr_offset;
+ preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
+ }
+ should_preserve_transforms = true;
+ }
+ }
+ }
+
objectp->clearTEWaterExclusion(te);
// Blank out most override data on the object and send to server
- objectp->setRenderMaterialID(te, asset_id);
+ if (should_preserve_transforms && preserved_override)
+ {
+ // Apply material with preserved transforms
+ LLGLTFMaterialList::queueApply(objectp, te, asset_id, preserved_override);
+ // Update local state
+ objectp->setRenderMaterialID(te, asset_id, false, true);
+ tep->setGLTFMaterialOverride(preserved_override);
+ }
+ else
+ {
+ objectp->setRenderMaterialID(te, asset_id);
+ }
return true;
}
@@ -2248,6 +2335,7 @@ void LLSelectMgr::selectionRevertGLTFMaterials()
{
// Restore base material
LLUUID asset_id = nodep->mSavedGLTFMaterialIds[te];
+ LLUUID old_asset_id = objectp->getRenderMaterialID(te);
// Update material locally
objectp->setRenderMaterialID(te, asset_id, false /*wait for LLGLTFMaterialList update*/);
@@ -2258,18 +2346,15 @@ void LLSelectMgr::selectionRevertGLTFMaterials()
objectp->setTEGLTFMaterialOverride(te, material);
}
- // Enqueue update to server
- if (asset_id.notNull() && material)
+ if (asset_id.isNull() || !material)
{
- // Restore overrides and base material
- LLGLTFMaterialList::queueApply(objectp, te, asset_id, material);
+ //blank override out
+ LLGLTFMaterialList::queueApply(objectp, te, asset_id);
}
else
{
- //blank override out
- LLGLTFMaterialList::queueApply(objectp, te, asset_id);
+ LLGLTFMaterialList::queueApply(objectp, te, asset_id, material);
}
-
}
return true;
}
@@ -3139,22 +3224,46 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
F32 scale_x = 1;
F32 scale_y = 1;
+ F32 offset_x = 0;
+ F32 offset_y = 0;
- for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ if (te_num < selectNode->mGLTFScaleRatios.size())
{
- LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i];
-
- if (planar)
- {
- scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis];
- scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis];
- }
- else
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
{
- scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis];
- scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis];
+ LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i];
+
+ if (planar)
+ {
+ scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis];
+ scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis];
+ }
+ else
+ {
+ scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis];
+ scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis];
+ }
+ material->mTextureTransform[i].mScale.set(scale_x, scale_y);
+
+ LLVector2 scales = selectNode->mGLTFScales[te_num][i];
+ LLVector2 offsets = selectNode->mGLTFOffsets[te_num][i];
+ F64 int_part = 0;
+ offset_x = (F32)modf((offsets[VX] + (scales[VX] - scale_x)) / 2, &int_part);
+ if (offset_x < 0)
+ {
+ offset_x++;
+ }
+ offset_y = (F32)modf((offsets[VY] + (scales[VY] - scale_y)) / 2, &int_part);
+ if (offset_y < 0)
+ {
+ offset_y++;
+ }
+ material->mTextureTransform[i].mOffset.set(offset_x, offset_y);
}
- material->mTextureTransform[i].mScale.set(scale_x, scale_y);
+ }
+ else
+ {
+ llassert(false); // make sure mGLTFScaleRatios is filled
}
const LLGLTFMaterial* base_material = tep->getGLTFMaterial();
@@ -6507,7 +6616,7 @@ void LLSelectMgr::renderSilhouettes(bool for_hud)
gGL.popMatrix();
gGL.popMatrix();
- glLineWidth(1.f);
+ //glLineWidth(1.f);
#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
@@ -6909,10 +7018,11 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
{
mTextureScaleRatios.clear();
mGLTFScaleRatios.clear();
+ mGLTFScales.clear();
+ mGLTFOffsets.clear();
if (mObject.notNull())
{
-
LLVector3 scale = mObject->getScale();
for (U8 i = 0; i < mObject->getNumTEs(); i++)
@@ -6949,6 +7059,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
F32 scale_x = 1;
F32 scale_y = 1;
std::vector<LLVector3> material_v_vec;
+ std::vector<LLVector2> material_scales_vec;
+ std::vector<LLVector2> material_offset_vec;
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
{
if (material)
@@ -6956,12 +7068,16 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i];
scale_x = transform.mScale[VX];
scale_y = transform.mScale[VY];
+ material_scales_vec.push_back(transform.mScale);
+ material_offset_vec.push_back(transform.mOffset);
}
else
{
// Not having an override doesn't mean that there is no material
scale_x = 1;
scale_y = 1;
+ material_scales_vec.emplace_back(scale_x, scale_y);
+ material_offset_vec.emplace_back(0.f, 0.f);
}
if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR)
@@ -6977,6 +7093,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
material_v_vec.push_back(material_v);
}
mGLTFScaleRatios.push_back(material_v_vec);
+ mGLTFScales.push_back(material_scales_vec);
+ mGLTFOffsets.push_back(material_offset_vec);
}
}
}
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 0dbdc133e3..11aad3b806 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -242,6 +242,8 @@ public:
gltf_materials_vec_t mSavedGLTFOverrideMaterials;
std::vector<LLVector3> mTextureScaleRatios;
std::vector< std::vector<LLVector3> > mGLTFScaleRatios;
+ std::vector< std::vector<LLVector2> > mGLTFScales;
+ std::vector< std::vector<LLVector2> > mGLTFOffsets;
std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
bool mSilhouetteExists; // need to generate silhouette?
@@ -941,6 +943,7 @@ private:
bool mForceSelection;
std::vector<LLAnimPauseRequest> mPauseRequests;
+ boost::signals2::connection mSlectionLodModChangedConnection;
};
// *DEPRECATED: For callbacks or observers, use
diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp
index 619882dc5e..5fc39b0dd8 100644
--- a/indra/newview/llsettingspicker.cpp
+++ b/indra/newview/llsettingspicker.cpp
@@ -152,7 +152,11 @@ void LLFloaterSettingsPicker::onClose(bool app_quitting)
owner->setFocus(true);
}
mSettingItemID.setNull();
- mInventoryPanel->getRootFolder()->clearSelection();
+ mInventoryPanel->clearSelection();
+ if (mInventoryPanel->getRootFolder())
+ {
+ mInventoryPanel->getRootFolder()->clearSelection();
+ }
}
void LLFloaterSettingsPicker::setValue(const LLSD& value)
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index c618483fc4..1d1b31d2a6 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -40,6 +40,7 @@
#include "llfloaterworldmap.h"
#include "llfolderviewmodel.h"
#include "llloadingindicator.h"
+#include "llmenubutton.h"
#include "lloutfitobserver.h"
#include "llpaneleditwearable.h"
#include "llpaneloutfitsinventory.h"
@@ -145,6 +146,14 @@ bool LLSidepanelAppearance::postBuild()
setWearablesLoading(gAgentWearables.isCOFChangeInProgress());
+
+ LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn");
+ LLMenuButton* menu_sort_btn = getChild<LLMenuButton>("sorting_menu_btn");
+ LLButton* menu_trash_btn = getChild<LLButton>("trash_btn");
+ LLPanel* menu_sort_btn_panel = getChild<LLPanel>("options_sort_btn_panel");
+ LLPanel* menu_trash_btn_panel = getChild<LLPanel>("trash_btn_panel");
+ mPanelOutfitsInventory->setMenuButtons(menu_gear_btn, menu_sort_btn, menu_trash_btn, menu_sort_btn_panel, menu_trash_btn_panel);
+
return true;
}
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index fccf745a74..6d50f216f5 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -56,6 +56,8 @@
#include "llviewerregion.h"
+const char* const DEFAULT_DESC = "(No Description)";
+
class PropertiesChangedCallback : public LLInventoryCallback
{
public:
@@ -128,6 +130,7 @@ LLSidepanelItemInfo::LLSidepanelItemInfo(const LLPanel::Params& p)
, mUpdatePendingId(-1)
, mIsDirty(false) /*Not ready*/
, mParentFloater(NULL)
+ , mLabelItemDesc(NULL)
{
gInventory.addObserver(this);
gIdleCallbacks.addFunction(&LLSidepanelItemInfo::onIdle, (void*)this);
@@ -158,10 +161,11 @@ bool LLSidepanelItemInfo::postBuild()
mItemTypeIcon = getChild<LLIconCtrl>("item_type_icon");
mLabelOwnerName = getChild<LLTextBox>("LabelOwnerName");
mLabelCreatorName = getChild<LLTextBox>("LabelCreatorName");
+ mLabelItemDesc = getChild<LLTextEditor>("LabelItemDesc");
getChild<LLLineEditor>("LabelItemName")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
- getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
+ mLabelItemDesc->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
// Thumnail edition
mChangeThumbnailBtn->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onEditThumbnail, this));
// acquired date
@@ -483,7 +487,8 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
}
else
{
- std::string timeStr = getString("acquiredDate");
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ std::string timeStr = use_24h ? getString("acquiredDate") : getString("acquiredDateAMPM");
LLSD substitution;
substitution["datetime"] = (S32) time_utc;
LLStringUtil::format (timeStr, substitution);
@@ -923,17 +928,22 @@ void LLSidepanelItemInfo::onCommitDescription()
LLViewerInventoryItem* item = findItem();
if(!item) return;
- LLTextEditor* labelItemDesc = getChild<LLTextEditor>("LabelItemDesc");
- if(!labelItemDesc)
+ if(!mLabelItemDesc)
+ {
+ return;
+ }
+ if (!gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))
{
return;
}
- if((item->getDescription() != labelItemDesc->getText()) &&
- (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)))
+ std::string old_desc = item->getDescription();
+ std::string new_desc = mLabelItemDesc->getText();
+ if(old_desc != new_desc)
{
+ mLabelItemDesc->setSelectAllOnFocusReceived(false);
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- new_item->setDescription(labelItemDesc->getText());
+ new_item->setDescription(new_desc);
onCommitChanges(new_item);
}
}
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
index 718edc79d6..0895d3360c 100644
--- a/indra/newview/llsidepaneliteminfo.h
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -46,6 +46,7 @@ class LLObjectInventoryObserver;
class LLViewerObject;
class LLPermissions;
class LLTextBox;
+class LLTextEditor;
class LLSidepanelItemInfo : public LLPanel, public LLInventoryObserver
{
@@ -105,6 +106,7 @@ private:
LLIconCtrl* mItemTypeIcon;
LLTextBox* mLabelOwnerName;
LLTextBox* mLabelCreatorName;
+ LLTextEditor* mLabelItemDesc;
//
// UI Elements
diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
index cee43f3cff..223fc2a8f5 100644
--- a/indra/newview/llskinningutil.cpp
+++ b/indra/newview/llskinningutil.cpp
@@ -116,8 +116,8 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin
// needed for handling of any legacy bad data.
if (!avatar->getJoint(skin->mJointNames[j]))
{
- LL_DEBUGS("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint " << skin->mJointNames[j] << LL_ENDL;
- LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL;
+ LL_DEBUGS("Avatar") << avatar->getDebugName() << " mesh rigged to invalid joint " << skin->mJointNames[j] << LL_ENDL;
+ LL_WARNS_ONCE("Avatar") << avatar->getDebugName() << " mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL;
skin->mJointNames[j] = "mPelvis";
skin->mJointNumsInitialized = false; // force update after names change.
}
@@ -135,6 +135,12 @@ void LLSkinningUtil::initSkinningMatrixPalette(
initJointNums(const_cast<LLMeshSkinInfo*>(skin), avatar);
+ if (skin->mInvBindMatrix.size() < count )
+ {
+ // faulty model? mInvBindMatrix.size() should have matched mJointNames.size()
+ return;
+ }
+
LLMatrix4a world[LL_CHARACTER_MAX_ANIMATED_JOINTS];
for (S32 j = 0; j < count; ++j)
@@ -354,7 +360,8 @@ void LLSkinningUtil::updateRiggingInfo(const LLMeshSkinInfo* skin, LLVOAvatar *a
{
rig_info_tab[joint_num].setIsRiggedTo(true);
- const LLMatrix4a& mat = skin->mBindPoseMatrix[joint_index];
+ size_t bind_poses_size = skin->mBindPoseMatrix.size();
+ const LLMatrix4a& mat = bind_poses_size > joint_index ? skin->mBindPoseMatrix[joint_index] : LLMatrix4a::identity();
LLVector4a pos_joint_space;
mat.affineTransform(pos, pos_joint_space);
diff --git a/indra/newview/llsky.h b/indra/newview/llsky.h
index 32599dcee2..d06f181357 100644
--- a/indra/newview/llsky.h
+++ b/indra/newview/llsky.h
@@ -28,7 +28,6 @@
#define LL_LLSKY_H
#include "llmath.h"
-//#include "vmath.h"
#include "v3math.h"
#include "v4math.h"
#include "v4color.h"
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 9e567e3262..6238a1145c 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -71,10 +71,10 @@ LLSLURL::LLSLURL(const std::string& slurl)
{
LLURI slurl_uri;
// parse the slurl as a uri
- if (slurl.find(':') == std::string::npos)
+ if (slurl.find("://") == std::string::npos)
{
- // There may be no scheme ('secondlife:' etc.) passed in. In that case
- // we want to normalize the slurl by putting the appropriate scheme
+ // There may be no scheme ('secondlife://', 'https://' etc.) passed in. In that
+ // case we want to normalize the slurl by putting the appropriate scheme
// in front of the slurl. So, we grab the appropriate slurl base
// from the grid manager which may be http://slurl.com/secondlife/ for maingrid, or
// https://<hostname>/region/ for Standalone grid (the word region, not the region name)
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index ea95d71b27..f1731af3be 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -238,11 +238,11 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y, LLColor4
{
F32 line_width ;
glGetFloatv(GL_LINE_WIDTH, &line_width) ;
- glLineWidth(2.0f * line_width) ;
+ //glLineWidth(2.0f * line_width) ;
LLColor4 color(0.0f, 0.0f, 0.0f, 1.0f) ;
gl_rect_2d( mPreviewRect.mLeft + offset_x, mPreviewRect.mTop + offset_y,
mPreviewRect.mRight + offset_x, mPreviewRect.mBottom + offset_y, color, false ) ;
- glLineWidth(line_width) ;
+ //glLineWidth(line_width) ;
//draw four alpha rectangles to cover areas outside of the snapshot image
if(!mKeepAspectRatio)
@@ -694,6 +694,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview )
static LLCachedControl<bool> freeze_time(gSavedSettings, "FreezeTime", false);
static LLCachedControl<bool> use_freeze_frame(gSavedSettings, "UseFreezeFrame", false);
static LLCachedControl<bool> render_ui(gSavedSettings, "RenderUIInSnapshot", false);
+ static LLCachedControl<bool> render_balance(gSavedSettings, "RenderBalanceInSnapshot", false);
static LLCachedControl<bool> render_hud(gSavedSettings, "RenderHUDInSnapshot", false);
static LLCachedControl<bool> render_no_post(gSavedSettings, "RenderSnapshotNoPost", false);
@@ -750,6 +751,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview )
render_hud,
false,
render_no_post,
+ render_balance,
previewp->mSnapshotBufferType,
previewp->getMaxImageSize()))
{
@@ -1066,7 +1068,7 @@ void LLSnapshotLivePreview::saveTexture(bool outfit_snapshot, std::string name)
tid, LLAssetType::AT_TEXTURE, res_name, res_desc, 0,
folder_type, inv_type,
PERM_ALL, LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
- expected_upload_cost, !outfit_snapshot));
+ expected_upload_cost, LLUUID::null, !outfit_snapshot));
upload_new_resource(assetUploadInfo);
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index a90ff73578..a147cb4657 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -1661,12 +1661,12 @@ void renderOctree(LLSpatialGroup* group)
gGL.diffuseColor4f(1,0,0,group->mBuilt);
gGL.flush();
- glLineWidth(5.f);
+ //glLineWidth(5.f);
const LLVector4a* bounds = group->getObjectBounds();
drawBoxOutline(bounds[0], bounds[1]);
- gGL.flush();
- glLineWidth(1.f);
+ //gGL.flush();
+ //glLineWidth(1.f);
gGL.flush();
const LLVOAvatar* lastAvatar = nullptr;
@@ -1978,12 +1978,11 @@ void renderBoundingBox(LLDrawable* drawable, bool set_color = true)
if (vobj && vobj->onActiveList())
{
gGL.flush();
- glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f));
- //glLineWidth(4.f*(sinf(gFrameTimeSeconds*2.f)*0.25f+0.75f));
- stop_glerror();
+ //glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f));
+ stop_glerror();
drawBoxOutline(pos,size);
gGL.flush();
- glLineWidth(1.f);
+ //glLineWidth(1.f);
}
else
{
@@ -2897,7 +2896,7 @@ public:
if (i == 1)
{
gGL.flush();
- glLineWidth(3.f);
+ //glLineWidth(3.f);
}
gGL.begin(LLRender::TRIANGLES);
@@ -2916,7 +2915,7 @@ public:
if (i == 1)
{
gGL.flush();
- glLineWidth(1.f);
+ //glLineWidth(1.f);
}
}
}
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 4956c188fb..b49c0119ed 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -1026,6 +1026,10 @@ void LLLocalSpeakerMgr::updateSpeakerList()
uuid_vec_t avatar_ids;
std::vector<LLVector3d> positions;
LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgent.getPositionGlobal(), CHAT_NORMAL_RADIUS);
+#ifdef LL_DISCORD
+ if (gSavedSettings.getBOOL("EnableDiscord"))
+ LLAppViewer::updateDiscordPartyCurrentSize((S32)avatar_ids.size());
+#endif
for(U32 i=0; i<avatar_ids.size(); i++)
{
setSpeaker(avatar_ids[i]);
diff --git a/indra/newview/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/llsprite.h b/indra/newview/llsprite.h
index 44439bd30c..d6e8e37ec9 100644
--- a/indra/newview/llsprite.h
+++ b/indra/newview/llsprite.h
@@ -27,8 +27,6 @@
#ifndef LL_LLSPRITE_H
#define LL_LLSPRITE_H
-////#include "vmath.h"
-//#include "llmath.h"
#include "v3math.h"
#include "v4math.h"
#include "v4color.h"
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 29ae386618..c3c7945763 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -61,6 +61,7 @@
#include "lllocationhistory.h"
#include "llgltfmateriallist.h"
#include "llimageworker.h"
+#include "llregex.h"
#include "llloginflags.h"
#include "llmd5.h"
@@ -217,7 +218,6 @@
#include "fsfloatersearch.h"
-
//
// exported globals
//
@@ -350,13 +350,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();
}
@@ -407,6 +405,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;
@@ -447,7 +446,26 @@ bool idle_startup()
system = osString.substr (begIdx, endIdx - begIdx);
system += "Locale";
- LLStringUtil::setLocale (LLTrans::getString(system));
+ std::string locale = LLTrans::getString(system);
+ if (locale != LLStringUtil::getLocale()) // is there a reason to do this on repeat?
+ {
+ LLStringUtil::setLocale(locale);
+
+ // Not all locales have AMPM, test it
+ if (LLStringOps::sAM.empty()) // Might already be overriden from LLAppViewer::init()
+ {
+ LLDate datetime(0.0);
+ std::string val = datetime.toHTTPDateString("%p");
+ if (val.empty())
+ {
+ LL_DEBUGS("InitInfo") << "Current locale \"" << locale << "\" "
+ << "doesn't support AM/PM time format" << LL_ENDL;
+ // fallback to declarations in strings.xml
+ LLStringOps::sAM = LLTrans::getString("dateTimeAM");
+ LLStringOps::sPM = LLTrans::getString("dateTimePM");
+ }
+ }
+ }
//note: Removing this line will cause incorrect button size in the login screen. -- bao.
gTextureList.updateImages(0.01f) ;
@@ -752,6 +770,10 @@ bool idle_startup()
LL_WARNS("AppInit") << "Unreliable timers detected (may be bad PCI chipset)!!" << LL_ENDL;
}
+#ifdef LL_DISCORD
+ LLAppViewer::initDiscordSocial();
+#endif
+
//
// Log on to system
//
@@ -2133,9 +2155,6 @@ bool idle_startup()
do_startup_frame();
- // We're successfully logged in.
- gSavedSettings.setBOOL("FirstLoginThisInstall", false);
-
LLFloaterReg::showInitialVisibleInstances();
LLFloaterGridStatus::getInstance()->startGridStatusTimer();
@@ -2481,6 +2500,27 @@ bool idle_startup()
LLPerfStats::StatsRecorder::setAutotuneInit();
+ // Display Avatar Welcome Pack the first time a user logs in
+ // (or clears their settings....)
+ if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
+ {
+ LLFloater* avatar_welcome_pack_floater = LLFloaterReg::findInstance("avatar_welcome_pack");
+ if (avatar_welcome_pack_floater != nullptr)
+ {
+ // There is a (very - 1 in ~50 times) hard to repro bug where the login
+ // page is not hidden when the AWP floater is presented. This (agressive)
+ // approach to always close it seems like the best fix for now.
+ LLPanelLogin::closePanel();
+
+ avatar_welcome_pack_floater->setVisible(true);
+ }
+ }
+
+ //// We're successfully logged in.
+ // 2025-06 Moved lower down in the state machine so the Avatar Welcome Pack
+ // floater display can be triggered correctly.
+ gSavedSettings.setBOOL("FirstLoginThisInstall", false);
+
return true;
}
@@ -2567,6 +2607,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.
@@ -2600,7 +2661,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;
});
}
@@ -3604,7 +3665,7 @@ bool process_login_success_response()
// Agent id needed for parcel info request in LLUrlEntryParcel
// to resolve parcel name.
- LLUrlEntryParcel::setAgentID(gAgentID);
+ LLUrlEntryBase::setAgentID(gAgentID);
text = response["session_id"].asString();
if(!text.empty()) gAgentSessionID.set(text);
@@ -3922,25 +3983,7 @@ bool process_login_success_response()
LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token);
}
-
- // Only save mfa_hash for future logins if the user wants their info remembered.
- if(response.has("mfa_hash")
- && gSavedSettings.getBOOL("RememberUser")
- && LLLoginInstance::getInstance()->saveMFA())
- {
- std::string grid(LLGridManager::getInstance()->getGridId());
- std::string user_id(gUserCredential->userID());
- gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]);
- // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically
- gSecAPIHandler->syncProtectedMap();
- }
- else if (!LLLoginInstance::getInstance()->saveMFA())
- {
- std::string grid(LLGridManager::getInstance()->getGridId());
- std::string user_id(gUserCredential->userID());
- gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id);
- gSecAPIHandler->syncProtectedMap();
- }
+ LLLoginInstance::getInstance()->saveMFAHash(response);
bool success = false;
// JC: gesture loading done below, when we have an asset system
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 1bab602364..c456c74f77 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -41,6 +41,7 @@
#include "llpanelpresetscamerapulldown.h"
#include "llpanelpresetspulldown.h"
#include "llpanelvolumepulldown.h"
+#include "llfloatermarketplace.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
#include "llhints.h"
@@ -115,6 +116,8 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mBtnVolume(NULL),
mBoxBalance(NULL),
mBalance(0),
+ mBalanceClicked(false),
+ mObscureBalance(false),
mHealth(100),
mSquareMetersCredit(0),
mSquareMetersCommitted(0),
@@ -126,8 +129,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
// status bar can possible overlay menus?
setMouseOpaque(false);
- mBalanceTimer = new LLFrameTimer();
- mHealthTimer = new LLFrameTimer();
mFpsUpdateTimer = new LLFrameTimer();
buildFromFile("panel_status_bar.xml");
@@ -135,12 +136,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
LLStatusBar::~LLStatusBar()
{
- delete mBalanceTimer;
- mBalanceTimer = NULL;
-
- delete mHealthTimer;
- mHealthTimer = NULL;
-
// LLView destructor cleans up children
}
@@ -173,10 +168,12 @@ bool LLStatusBar::postBuild()
getChild<LLUICtrl>("buyL")->setCommitCallback(
boost::bind(&LLStatusBar::onClickBuyCurrency, this));
- getChild<LLUICtrl>("goShop")->setCommitCallback(boost::bind(&LLWeb::loadURL, gSavedSettings.getString("MarketplaceURL"), LLStringUtil::null, LLStringUtil::null));
+ getChild<LLUICtrl>("goShop")->setCommitCallback(
+ boost::bind(&LLStatusBar::onClickShop, this));
mBoxBalance = getChild<LLTextBox>("balance");
- mBoxBalance->setClickedCallback( &LLStatusBar::onClickBalance, this );
+ mBoxBalance->setClickedCallback(&LLStatusBar::onClickRefreshBalance, this);
+ mBoxBalance->setDoubleClickCallback([this](LLUICtrl*, S32 x, S32 y, MASK mask) { onClickToggleBalance(); });
mIconPresetsCamera = getChild<LLIconCtrl>( "presets_icon_camera" );
mIconPresetsCamera->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterPresetsCamera, this));
@@ -196,12 +193,14 @@ bool LLStatusBar::postBuild()
gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLStatusBar::onVoiceChanged, this, _2));
+ gSavedSettings.getControl("ObscureBalanceInStatusBar")->getSignal()->connect(boost::bind(&LLStatusBar::onObscureBalanceChanged, this, _2));
if (!gSavedSettings.getBOOL("EnableVoiceChat") && LLAppViewer::instance()->isSecondInstance())
{
// Indicate that second instance started without sound
mBtnVolume->setImageUnselected(LLUI::getUIImage("VoiceMute_Off"));
}
+ mObscureBalance = gSavedSettings.getBOOL("ObscureBalanceInStatusBar");
// Adding Net Stat Graph
S32 x = getRect().getWidth() - 2;
@@ -307,9 +306,21 @@ void LLStatusBar::refresh()
mFpsUpdateTimer->reset();
S32 fps = (S32) llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, 50));
+ if(fps < 1) fps = 1;
+
+ S32 minFps = (S32) llround(LLTrace::get_frame_recording().getPeriodMinPerSec(LLStatViewer::FPS, 50));
+ S32 maxFps = (S32) llround(LLTrace::get_frame_recording().getPeriodMaxPerSec(LLStatViewer::FPS, 50));
+
+ F32 fpsQuality = (F32)minFps / (F32)fps;
+
std::string fpsStr = std::to_string(fps);
- //mTextFps->setText(fpsStr);
+
mTextFps->setLabel(fpsStr);
+
+ if(fpsQuality < 0.5) mTextFps->setColor(LLColor4(0.6,0.0,0.0));
+ else if(fpsQuality < 0.7) mTextFps->setColor(LLColor4(0.7,0.5,0.0));
+ else if(fpsQuality < 0.9) mTextFps->setColor(LLColor4(0.5,0.7,0.0));
+ else mTextFps->setColor(LLColor4(0.0, 0.7, 0.15));
}
// update clock every 10 seconds
@@ -334,6 +345,12 @@ void LLStatusBar::refresh()
mTextTime->setToolTip (dtStr);
}
+ if (mBalanceClicked && mBalanceClickTimer.getElapsedTimeF32() > 1.f)
+ {
+ mBalanceClicked = false;
+ sendMoneyBalanceRequest();
+ }
+
LLRect r;
const S32 MENU_RIGHT = gMenuBarView->getRightmostMenuEdge();
@@ -399,9 +416,17 @@ void LLStatusBar::setBalance(S32 balance)
std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance );
LLStringUtil::format_map_t string_args;
- string_args["[AMT]"] = llformat("%s", money_str.c_str());
+ if (mObscureBalance)
+ {
+ string_args["[AMT]"] = "****";
+ }
+ else
+ {
+ string_args["[AMT]"] = llformat("%s", money_str.c_str());
+ }
std::string label_str = getString("buycurrencylabel", string_args);
mBoxBalance->setValue(label_str);
+ mBoxBalance->setToolTipArg(LLStringExplicit("[AMT]"), llformat("%s", money_str.c_str()));
updateBalancePanelPosition();
@@ -421,8 +446,6 @@ void LLStatusBar::setBalance(S32 balance)
if( balance != mBalance )
{
- mBalanceTimer->reset();
- mBalanceTimer->setTimerExpirySec( ICON_TIMER_EXPIRY );
mBalance = balance;
}
}
@@ -474,9 +497,6 @@ void LLStatusBar::setHealth(S32 health)
}
}
}
-
- mHealthTimer->reset();
- mHealthTimer->setTimerExpirySec( ICON_TIMER_EXPIRY );
}
mHealth = health;
@@ -530,6 +550,15 @@ void LLStatusBar::onClickBuyCurrency()
LLFirstUse::receiveLindens(false);
}
+void LLStatusBar::onClickShop()
+{
+ LLFloaterReg::showInstanceOrBringToFront("marketplace");
+ if (LLFloaterMarketplace* marketplace = LLFloaterReg::getTypedInstance<LLFloaterMarketplace>("marketplace"))
+ {
+ marketplace->openMarketplace();
+ }
+}
+
void LLStatusBar::onMouseEnterPresetsCamera()
{
LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
@@ -636,13 +665,27 @@ static void onClickVolume(void* data)
}
//static
-void LLStatusBar::onClickBalance(void* )
+void LLStatusBar::onClickRefreshBalance(void* data)
{
- // Force a balance request message:
- LLStatusBar::sendMoneyBalanceRequest();
+ LLStatusBar* status_bar = (LLStatusBar*)data;
+
+ if (!status_bar->mBalanceClicked)
+ {
+ // Schedule a balance request message:
+ status_bar->mBalanceClicked = true;
+ status_bar->mBalanceClickTimer.reset();
+ }
// The refresh of the display (call to setBalance()) will be done by process_money_balance_reply()
}
+void LLStatusBar::onClickToggleBalance()
+{
+ mObscureBalance = !mObscureBalance;
+ gSavedSettings.setBOOL("ObscureBalanceInStatusBar", mObscureBalance);
+ setBalance(mBalance);
+ mBalanceClicked = false; // supress click
+}
+
//static
void LLStatusBar::onClickMediaToggle(void* data)
{
@@ -678,6 +721,12 @@ void LLStatusBar::onVoiceChanged(const LLSD& newvalue)
refresh();
}
+void LLStatusBar::onObscureBalanceChanged(const LLSD& newvalue)
+{
+ mObscureBalance = newvalue.asBoolean();
+ setBalance(mBalance);
+}
+
void LLStatusBar::onUpdateFilterTerm()
{
LLWString searchValue = utf8str_to_wstring( mFilterEdit->getValue() );
@@ -759,6 +808,10 @@ void LLStatusBar::updateBalancePanelPosition()
balance_bg_view->setShape(balance_bg_rect);
}
+void LLStatusBar::setBalanceVisible(bool visible)
+{
+ mBoxBalance->setVisible(visible);
+}
// Implements secondlife:///app/balance/request to request a L$ balance
// update via UDP message system. JC
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index 7e1ecf08ca..e54ccfe736 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -72,7 +72,8 @@ public:
void debitBalance(S32 debit);
void creditBalance(S32 credit);
- // Request the latest currency balance from the server
+ // Request the latest currency balance from the server.
+ // Reply at process_money_balance_reply()
static void sendMoneyBalanceRequest();
void setHealth(S32 percent);
@@ -93,13 +94,17 @@ public:
S32 getSquareMetersCommitted() const;
S32 getSquareMetersLeft() const;
+ void setBalanceVisible(bool visible);
+
LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; }
private:
void onClickBuyCurrency();
+ void onClickShop();
void onVolumeChanged(const LLSD& newvalue);
void onVoiceChanged(const LLSD& newvalue);
+ void onObscureBalanceChanged(const LLSD& newvalue);
void onMouseEnterPresetsCamera();
void onMouseEnterPresets();
@@ -107,7 +112,8 @@ private:
void onMouseEnterNearbyMedia();
static void onClickMediaToggle(void* data);
- static void onClickBalance(void* data);
+ static void onClickRefreshBalance(void* data);
+ void onClickToggleBalance();
static void onClickFps(void* data);
@@ -137,11 +143,12 @@ private:
LLFrameTimer *mFpsUpdateTimer;
S32 mBalance;
+ bool mBalanceClicked;
+ bool mObscureBalance;
+ LLTimer mBalanceClickTimer;
S32 mHealth;
S32 mSquareMetersCredit;
S32 mSquareMetersCommitted;
- LLFrameTimer* mBalanceTimer;
- LLFrameTimer* mHealthTimer;
LLPanelPresetsCameraPulldown* mPanelPresetsCameraPulldown;
LLPanelPresetsPulldown* mPanelPresetsPulldown;
LLPanelVolumePulldown* mPanelVolumePulldown;
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index 1826885069..64359b6cbe 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -28,9 +28,6 @@
#include "llsurface.h"
-#include "llrender.h"
-
-#include "llviewertexturelist.h"
#include "llpatchvertexarray.h"
#include "patch_dct.h"
#include "patch_code.h"
@@ -39,28 +36,25 @@
#include "llregionhandle.h"
#include "llagent.h"
#include "llagentcamera.h"
-#include "llappviewer.h"
#include "llworld.h"
#include "llviewercontrol.h"
#include "llviewertexture.h"
#include "llsurfacepatch.h"
-#include "llvosurfacepatch.h"
#include "llvowater.h"
#include "pipeline.h"
#include "llviewerregion.h"
-#include "llvlcomposition.h"
-#include "noise.h"
-#include "llviewercamera.h"
-#include "llglheaders.h"
#include "lldrawpoolterrain.h"
-#include "lldrawable.h"
#include "llworldmipmap.h"
extern LLPipeline gPipeline;
extern bool gShiftFrame;
-LLColor4U MAX_WATER_COLOR(0, 48, 96, 240);
+namespace
+{
+ static constexpr float MIN_TEXTURE_REQUEST_INTERVAL = 5.0f;
+}
+LLColor4U MAX_WATER_COLOR(0, 48, 96, 240);
S32 LLSurface::sTextureSize = 256;
@@ -74,18 +68,18 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) :
mType(type),
mDetailTextureScale(0.f),
mOriginGlobal(0.0, 0.0, 0.0),
- mSTexturep(NULL),
+ mSTexturep(nullptr),
mGridsPerPatchEdge(0),
mMetersPerGrid(1.0f),
mMetersPerEdge(1.0f),
mRegionp(regionp)
{
// Surface data
- mSurfaceZ = NULL;
- mNorm = NULL;
+ mSurfaceZ = nullptr;
+ mNorm = nullptr;
// Patch data
- mPatchList = NULL;
+ mPatchList = nullptr;
// One of each for each camera
mVisiblePatchCount = 0;
@@ -95,14 +89,14 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) :
mMinZ = 10000.f;
mMaxZ = -10000.f;
- mWaterObjp = NULL;
+ mWaterObjp = nullptr;
// In here temporarily.
mSurfacePatchUpdateCount = 0;
for (S32 i = 0; i < 8; i++)
{
- mNeighbors[i] = NULL;
+ mNeighbors[i] = nullptr;
}
}
@@ -110,7 +104,7 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) :
LLSurface::~LLSurface()
{
delete [] mSurfaceZ;
- mSurfaceZ = NULL;
+ mSurfaceZ = nullptr;
delete [] mNorm;
@@ -129,7 +123,7 @@ LLSurface::~LLSurface()
{
gPipeline.removePool(poolp);
// Don't enable this until we blitz the draw pool for it as well. -- djs
- mSTexturep = NULL;
+ mSTexturep = nullptr;
}
else
{
@@ -144,7 +138,7 @@ void LLSurface::initClasses()
void LLSurface::setRegion(LLViewerRegion *regionp)
{
mRegionp = regionp;
- mWaterObjp = NULL; // depends on regionp, needs recreating
+ mWaterObjp = nullptr; // depends on regionp, needs recreating
}
// Assumes that arguments are powers of 2, and that
@@ -211,16 +205,29 @@ LLViewerTexture* LLSurface::getSTexture()
void LLSurface::createSTexture()
{
- if (!mSTexturep)
+ if (mSTexturep.isNull())
+ {
+ mTimer.setTimerExpirySec(MIN_TEXTURE_REQUEST_INTERVAL);
+ }
+ else if (mSTexturep->hasGLTexture())
{
- U64 handle = mRegionp->getHandle();
+ // Unexpected: createSTexture() called when a valid texture already exists.
+ // This may indicate a logic error in the caller, as textures should not be recreated unnecessarily.
+ LL_WARNS() << "Called LLSurface::createSTexture() while we already have a valid texture!" << LL_ENDL;
+ return;
+ }
+ else if (!mTimer.checkExpirationAndReset(MIN_TEXTURE_REQUEST_INTERVAL))
+ {
+ // We haven't gotten a valid texture yet, but throttle the number of requests to avoid server flooding
+ return;
+ }
- U32 grid_x, grid_y;
+ U64 handle = mRegionp->getHandle();
+ U32 grid_x, grid_y;
- grid_from_region_handle(handle, &grid_x, &grid_y);
+ grid_from_region_handle(handle, &grid_x, &grid_y);
- mSTexturep = LLWorldMipmap::loadObjectsTile(grid_x, grid_y, 1);
- }
+ mSTexturep = LLWorldMipmap::loadObjectsTile(grid_x, grid_y, 1);
}
void LLSurface::initTextures()
@@ -285,7 +292,7 @@ void LLSurface::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegio
S32 i;
for (i = 0; i < 8; i++)
{
- if ( mNeighbors[i] != NULL )
+ if (mNeighbors[i] != nullptr)
{
uniqueRegions.push_back( mNeighbors[i]->getRegion() );
}
@@ -298,7 +305,7 @@ void LLSurface::getNeighboringRegionsStatus( std::vector<S32>& regions )
S32 i;
for (i = 0; i < 8; i++)
{
- if ( mNeighbors[i] != NULL )
+ if (mNeighbors[i] != nullptr)
{
regions.push_back( i );
}
@@ -498,7 +505,7 @@ void LLSurface::disconnectNeighbor(LLSurface *surfacep)
{
if (surfacep == mNeighbors[i])
{
- mNeighbors[i] = NULL;
+ mNeighbors[i] = nullptr;
}
}
@@ -518,7 +525,7 @@ void LLSurface::disconnectAllNeighbors()
if (mNeighbors[i])
{
mNeighbors[i]->disconnectNeighbor(this);
- mNeighbors[i] = NULL;
+ mNeighbors[i] = nullptr;
}
}
}
@@ -910,7 +917,7 @@ LLSurfacePatch *LLSurface::resolvePatchRegion(const F32 x, const F32 y) const
if(0 == mNumberOfPatches)
{
LL_WARNS() << "No patches for current region!" << LL_ENDL;
- return NULL;
+ return nullptr;
}
S32 old_index = index;
index = llclamp(old_index, 0, (mNumberOfPatches - 1));
@@ -996,7 +1003,7 @@ void LLSurface::createPatchData()
}
else
{
- patchp->setNeighborPatch(EAST, NULL);
+ patchp->setNeighborPatch(EAST, nullptr);
}
if (j < mPatchesPerEdge-1)
@@ -1005,7 +1012,7 @@ void LLSurface::createPatchData()
}
else
{
- patchp->setNeighborPatch(NORTH, NULL);
+ patchp->setNeighborPatch(NORTH, nullptr);
}
if (i > 0)
@@ -1014,7 +1021,7 @@ void LLSurface::createPatchData()
}
else
{
- patchp->setNeighborPatch(WEST, NULL);
+ patchp->setNeighborPatch(WEST, nullptr);
}
if (j > 0)
@@ -1023,7 +1030,7 @@ void LLSurface::createPatchData()
}
else
{
- patchp->setNeighborPatch(SOUTH, NULL);
+ patchp->setNeighborPatch(SOUTH, nullptr);
}
if (i < (mPatchesPerEdge-1) && j < (mPatchesPerEdge-1))
@@ -1032,7 +1039,7 @@ void LLSurface::createPatchData()
}
else
{
- patchp->setNeighborPatch(NORTHEAST, NULL);
+ patchp->setNeighborPatch(NORTHEAST, nullptr);
}
if (i > 0 && j < (mPatchesPerEdge-1))
@@ -1041,7 +1048,7 @@ void LLSurface::createPatchData()
}
else
{
- patchp->setNeighborPatch(NORTHWEST, NULL);
+ patchp->setNeighborPatch(NORTHWEST, nullptr);
}
if (i > 0 && j > 0)
@@ -1050,7 +1057,7 @@ void LLSurface::createPatchData()
}
else
{
- patchp->setNeighborPatch(SOUTHWEST, NULL);
+ patchp->setNeighborPatch(SOUTHWEST, nullptr);
}
if (i < (mPatchesPerEdge-1) && j > 0)
@@ -1059,7 +1066,7 @@ void LLSurface::createPatchData()
}
else
{
- patchp->setNeighborPatch(SOUTHEAST, NULL);
+ patchp->setNeighborPatch(SOUTHEAST, nullptr);
}
LLVector3d origin_global;
@@ -1077,7 +1084,7 @@ void LLSurface::destroyPatchData()
// Delete all of the cached patch data for these patches.
delete [] mPatchList;
- mPatchList = NULL;
+ mPatchList = nullptr;
mVisiblePatchCount = 0;
}
@@ -1105,12 +1112,12 @@ LLSurfacePatch *LLSurface::getPatch(const S32 x, const S32 y) const
if ((x < 0) || (x >= mPatchesPerEdge))
{
LL_ERRS() << "Asking for patch out of bounds" << LL_ENDL;
- return NULL;
+ return nullptr;
}
if ((y < 0) || (y >= mPatchesPerEdge))
{
LL_ERRS() << "Asking for patch out of bounds" << LL_ENDL;
- return NULL;
+ return nullptr;
}
return mPatchList + x + y*mPatchesPerEdge;
diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h
index 10a104730b..a599019ca5 100644
--- a/indra/newview/llsurface.h
+++ b/indra/newview/llsurface.h
@@ -27,17 +27,10 @@
#ifndef LL_LLSURFACE_H
#define LL_LLSURFACE_H
-//#include "vmath.h"
#include "v3math.h"
#include "v3dmath.h"
-#include "v4math.h"
-#include "m3math.h"
-#include "m4math.h"
-#include "llquaternion.h"
-
-#include "v4coloru.h"
-#include "v4color.h"
+#include "lltimer.h"
#include "llvowater.h"
#include "llpatchvertexarray.h"
#include "llviewertexture.h"
@@ -66,7 +59,7 @@ class LLGroupHeader;
class LLSurface
{
public:
- LLSurface(U32 type, LLViewerRegion *regionp = NULL);
+ LLSurface(U32 type, LLViewerRegion *regionp = nullptr);
virtual ~LLSurface();
static void initClasses(); // Do class initialization for LLSurface and its child classes.
@@ -170,14 +163,13 @@ public:
F32 mDetailTextureScale; // Number of times to repeat detail texture across this surface
-protected:
+private:
void createSTexture();
void initTextures();
void createPatchData(); // Allocates memory for patches.
void destroyPatchData(); // Deallocates memory for patches.
-protected:
LLVector3d mOriginGlobal; // In absolute frame
LLSurfacePatch *mPatchList; // Array of all patches
@@ -213,6 +205,7 @@ protected:
private:
LLViewerRegion *mRegionp; // Patch whose coordinate system this surface is using.
static S32 sTextureSize; // Size of the surface texture
+ LLTimer mTimer; // timer to throttle initial requests until the mSTexture is fully fetched
};
extern template bool LLSurface::idleUpdate</*PBR=*/false>(F32 max_update_time);
diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp
index 4315c4c6b0..875af76c10 100644
--- a/indra/newview/llsurfacepatch.cpp
+++ b/indra/newview/llsurfacepatch.cpp
@@ -201,7 +201,7 @@ LLVector2 LLSurfacePatch::getTexCoords(const U32 x, const U32 y) const
void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 *vertex, LLVector3 *normal,
- LLVector2 *tex1) const
+ LLVector2* tex0, LLVector2 *tex1) const
{
if (!mSurfacep || !mSurfacep->getRegion() || !mSurfacep->getGridsPerEdge() || !mVObjp)
{
@@ -220,6 +220,12 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3
pos_agent.mV[VZ] = *(mDataZ + point_offset);
*vertex = pos_agent-mVObjp->getRegion()->getOriginAgent();
+ // tex0 is used for ownership overlay
+ LLVector3 rel_pos = pos_agent - mSurfacep->getOriginAgent();
+ LLVector3 tex_pos = rel_pos * (1.f / (surface_stride * mSurfacep->getMetersPerGrid()));
+ tex0->mV[0] = tex_pos.mV[0];
+ tex0->mV[1] = tex_pos.mV[1];
+
tex1->mV[0] = mSurfacep->getRegion()->getCompositionXY(llfloor(mOriginRegion.mV[0])+x, llfloor(mOriginRegion.mV[1])+y);
const F32 xyScale = 4.9215f*7.f; //0.93284f;
diff --git a/indra/newview/llsurfacepatch.h b/indra/newview/llsurfacepatch.h
index f4831487c1..505fc8c24c 100644
--- a/indra/newview/llsurfacepatch.h
+++ b/indra/newview/llsurfacepatch.h
@@ -116,7 +116,7 @@ public:
void calcNormalFlat(LLVector3& normal_out, const U32 x, const U32 y, const U32 index /* 0 or 1 */);
void eval(const U32 x, const U32 y, const U32 stride,
- LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex1) const;
+ LLVector3 *vertex, LLVector3 *normal, LLVector2* tex0, LLVector2 *tex1) const;
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index dd7c6aa9e3..e02f76711c 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -127,6 +127,12 @@ void LLTeleportHistoryStorage::addItem(const std::string title, const LLVector3d
S32 removed_index = -1;
if (item_iter != mItems.end())
{
+ // When teleporting via history it's possible that there can be
+ // an offset applied to the position, so each new teleport can
+ // be a meter higher than the last.
+ // Avoid it by preserving original position.
+ item.mGlobalPos = item_iter->mGlobalPos;
+
removed_index = (S32)(item_iter - mItems.begin());
mItems.erase(item_iter);
}
diff --git a/indra/newview/llterrainpaintmap.cpp b/indra/newview/llterrainpaintmap.cpp
index 8ccde74c93..8cb926a110 100644
--- a/indra/newview/llterrainpaintmap.cpp
+++ b/indra/newview/llterrainpaintmap.cpp
@@ -86,9 +86,10 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&
return false;
}
gGL.getTexUnit(0)->disable();
- stop_glerror();
- scratch_target.bindTarget();
+ LOG_GLERROR("");
+
+ scratch_target.bindTarget("", 1);
glClearColor(0, 0, 0, 0);
scratch_target.clear();
@@ -204,8 +205,9 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&
{
LLVector3 scratch3;
LLVector3 pos3;
+ LLVector2 tex0_temp;
LLVector2 tex1_temp;
- patch->eval(i, j, stride, &pos3, &scratch3, &tex1_temp);
+ patch->eval(i, j, stride, &pos3, &scratch3, &tex0_temp, &tex1_temp);
(*pos++).set(pos3.mV[VX], pos3.mV[VY], pos3.mV[VZ]);
*tex1++ = tex1_temp;
vertex_total++;
@@ -275,7 +277,7 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&
LL_WARNS() << "Failed to copy framebuffer to paintmap" << LL_ENDL;
}
glGenerateMipmap(GL_TEXTURE_2D);
- stop_glerror();
+ LOG_GLERROR("LLTerrainPainMap::bakeHeightNoiseIntoPBRPaintMapRGB() - glGenerateMipmap");
scratch_target.flush();
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index be7653c011..1a7ce74ccc 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1347,27 +1347,40 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
}
for (U32 idx=0; idx<num_entries; idx++)
{
- Entry entry;
- S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry));
- if (bytes_read < sizeof(Entry))
+ try
+ {
+ Entry entry;
+ S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry));
+ if (bytes_read < sizeof(Entry))
+ {
+ LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL;
+ closeHeaderEntriesFile();
+ return 0;
+ }
+ entries.push_back(entry);
+ // LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL;
+ if (entry.mImageSize > entry.mBodySize)
+ {
+ mHeaderIDMap[entry.mID] = idx;
+ mTexturesSizeMap[entry.mID] = entry.mBodySize;
+ mTexturesSizeTotal += entry.mBodySize;
+ }
+ else
+ {
+ mFreeList.insert(idx);
+ }
+ }
+ catch (std::bad_alloc&)
{
- LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL;
+ // Too little ram yet very large cache?
+ // Should this actually crash viewer?
+ entries.clear();
+ LL_WARNS() << "Bad alloc trying to read texture entries from cache, mFreeList: " << (S32)mFreeList.size()
+ << ", added entries: " << idx << ", total entries: " << num_entries << LL_ENDL;
closeHeaderEntriesFile();
purgeAllTextures(false);
return 0;
}
- entries.push_back(entry);
-// LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL;
- if(entry.mImageSize > entry.mBodySize)
- {
- mHeaderIDMap[entry.mID] = idx;
- mTexturesSizeMap[entry.mID] = entry.mBodySize;
- mTexturesSizeTotal += entry.mBodySize;
- }
- else
- {
- mFreeList.insert(idx);
- }
}
closeHeaderEntriesFile();
return num_entries;
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 35057a910a..b2f2509e80 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -88,7 +88,8 @@ bool get_is_predefined_texture(LLUUID asset_id)
|| asset_id == DEFAULT_OBJECT_NORMAL
|| asset_id == BLANK_OBJECT_NORMAL
|| asset_id == IMG_WHITE
- || asset_id == LLUUID(SCULPT_DEFAULT_TEXTURE))
+ || asset_id == LLUUID(SCULPT_DEFAULT_TEXTURE)
+ || asset_id == BLANK_MATERIAL_ASSET_ID)
{
return true;
}
@@ -163,7 +164,6 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mFallbackImage(fallback_image),
mDefaultImageAssetID(default_image_asset_id),
mBlankImageAssetID(blank_image_asset_id),
- mTentative(tentative),
mAllowNoTexture(allow_no_texture),
mLabel(label),
mTentativeLabel(NULL),
@@ -185,8 +185,11 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mSetImageAssetIDCallback(NULL),
mOnUpdateImageStatsCallback(NULL),
mBakeTextureEnabled(false),
+ mLocalTextureEnabled(false),
+ mNoCopyTextureSelected(false),
mInventoryPickType(pick_type)
{
+ setTentative(tentative);
mCanApplyImmediately = can_apply_immediately;
buildFromFile("floater_texture_ctrl.xml");
setCanMinimize(false);
@@ -198,7 +201,7 @@ LLFloaterTexturePicker::~LLFloaterTexturePicker()
void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selection /*=true*/)
{
- if( ((mImageAssetID != image_id) || mTentative) && mActive)
+ if( ((mImageAssetID != image_id) || getTentative()) && mActive)
{
mNoCopyTextureSelected = false;
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
@@ -261,6 +264,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
if (set_selection)
{
+ // This is going to cause a callback
mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
}
}
@@ -276,6 +280,7 @@ void LLFloaterTexturePicker::setImageIDFromItem(const LLInventoryItem* itemp, bo
asset_id = BLANK_MATERIAL_ASSET_ID;
}
setImageID(asset_id, set_selection);
+ setTentative(false);
}
void LLFloaterTexturePicker::setActive( bool active )
@@ -524,6 +529,8 @@ bool LLFloaterTexturePicker::handleKeyHere(KEY key, MASK mask)
void LLFloaterTexturePicker::onOpen(const LLSD& key)
{
if (sLastPickerMode != 0
+ && (mLocalTextureEnabled || sLastPickerMode != 1)
+ && (mBakeTextureEnabled || sLastPickerMode != 2)
&& mModeSelector->selectByValue(sLastPickerMode))
{
changeMode();
@@ -592,7 +599,6 @@ bool LLFloaterTexturePicker::postBuild()
refreshInventoryFilter();
mInventoryPanel->setFilterPermMask(mImmediateFilterPermMask);
- mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
// Disable auto selecting first filtered item because it takes away
@@ -611,8 +617,25 @@ bool LLFloaterTexturePicker::postBuild()
if(!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL)
{
- mInventoryPanel->setSelection(findItemID(mImageAssetID, false), TAKE_FOCUS_NO);
+ LLViewerInventoryItem* itemp = findInvItem(mImageAssetID, false);
+ LLUUID item_id;
+ if (itemp)
+ {
+ item_id = itemp->getUUID();
+ }
+
+ mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
+
+ if (item_id.notNull() && itemp)
+ {
+ if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ mNoCopyTextureSelected = true;
+ }
+ }
}
+ // Don't call before setSelection, setSelection will mark view as dirty
+ mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
}
childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this);
@@ -654,7 +677,7 @@ void LLFloaterTexturePicker::draw()
bool valid_dims = updateImageStats();
// if we're inactive, gray out "apply immediate" checkbox
- mSelectBtn->setEnabled(mActive && mCanApply && valid_dims);
+ mSelectBtn->setEnabled(mActive && mCanApply && valid_dims && !getTentative());
mPipetteBtn->setEnabled(mActive);
mPipetteBtn->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
@@ -719,9 +742,9 @@ void LLFloaterTexturePicker::draw()
mTentativeLabel->setVisible( false );
}
- mDefaultBtn->setEnabled(mImageAssetID != mDefaultImageAssetID || mTentative);
- mBlankBtn->setEnabled((mImageAssetID != mBlankImageAssetID && mBlankImageAssetID.notNull()) || mTentative);
- mNoneBtn->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || mTentative));
+ mDefaultBtn->setEnabled(mImageAssetID != mDefaultImageAssetID || getTentative());
+ mBlankBtn->setEnabled((mImageAssetID != mBlankImageAssetID && mBlankImageAssetID.notNull()) || getTentative());
+ mNoneBtn->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || getTentative()));
LLFloater::draw();
@@ -774,7 +797,7 @@ void LLFloaterTexturePicker::draw()
}
// Draw Tentative Label over the image
- if( mTentative && !mViewModel->isDirty() )
+ if( getTentative() && !mViewModel->isDirty() )
{
mTentativeLabel->setVisible( true );
drawChild(mTentativeLabel);
@@ -804,12 +827,12 @@ void LLFloaterTexturePicker::draw()
}
}
-const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library)
+LLViewerInventoryItem* LLFloaterTexturePicker::findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const
{
if (asset_id.isNull())
{
// null asset id means, no material or texture assigned
- return LLUUID::null;
+ return nullptr;
}
LLUUID loockup_id = asset_id;
@@ -849,30 +872,41 @@ const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool co
// search for copyable version first
for (S32 i = 0; i < items.size(); i++)
{
- LLInventoryItem* itemp = items[i];
+ LLViewerInventoryItem* itemp = items[i];
LLPermissions item_permissions = itemp->getPermissions();
if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID()))
{
- if(!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(),gInventory.getLibraryRootFolderID()))
+ if (!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(), gInventory.getLibraryRootFolderID()))
{
- return itemp->getUUID();
+ return itemp;
}
}
}
// otherwise just return first instance, unless copyable requested
if (copyable_only)
{
- return LLUUID::null;
+ return nullptr;
}
else
{
- if(!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(),gInventory.getLibraryRootFolderID()))
+ if (!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(), gInventory.getLibraryRootFolderID()))
{
- return items[0]->getUUID();
+ return items[0];
}
}
}
+ return nullptr;
+}
+
+const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const
+{
+ LLViewerInventoryItem* itemp = findInvItem(asset_id, copyable_only, ignore_library);
+ if (itemp)
+ {
+ return itemp->getUUID();
+ }
+
return LLUUID::null;
}
@@ -977,6 +1011,9 @@ void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata)
if (self->mOwner)
{
self->setImageID( self->getDefaultImageAssetID() );
+ self->setTentative(false);
+ // Deselect in case inventory has a selected item with the same id
+ self->mInventoryPanel->getRootFolder()->clearSelection();
}
self->commitIfImmediateSet();
}
@@ -987,6 +1024,9 @@ void LLFloaterTexturePicker::onBtnBlank(void* userdata)
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
self->setCanApply(true, true);
self->setImageID( self->getBlankImageAssetID() );
+ self->setTentative(false);
+ // Deselect in case inventory has a selected item with the same id
+ self->mInventoryPanel->getRootFolder()->clearSelection();
self->commitIfImmediateSet();
}
@@ -997,21 +1037,12 @@ void LLFloaterTexturePicker::onBtnNone(void* userdata)
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
self->setCanApply(true, true);
self->setImageID( LLUUID::null );
+ self->setTentative(false);
+ // Deselect in case inventory has a selected item with null id
+ self->mInventoryPanel->getRootFolder()->clearSelection();
self->commitIfImmediateSet();
}
-/*
-// static
-void LLFloaterTexturePicker::onBtnRevert(void* userdata)
-{
- LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
- self->setImageID( self->mOriginalImageAssetID );
- // TODO: Change this to tell the owner to cancel. It needs to be
- // smart enough to restore multi-texture selections.
- self->mOwner->onFloaterCommit();
- self->mViewModel->resetDirty();
-}*/
-
// static
void LLFloaterTexturePicker::onBtnCancel(void* userdata)
{
@@ -1218,6 +1249,7 @@ void LLFloaterTexturePicker::onLocalScrollCommit(LLUICtrl* ctrl, void* userdata)
if (self->mSetImageAssetIDCallback)
{
self->mSetImageAssetIDCallback(inworld_id);
+ self->setTentative(false);
}
if (self->childGetValue("apply_immediate_check").asBoolean())
@@ -1296,6 +1328,7 @@ void LLFloaterTexturePicker::onBakeTextureSelect(LLUICtrl* ctrl, void *user_data
}
self->setImageID(imageID);
+ self->setTentative(false);
self->mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
if (!self->mPreviewSettingChanged)
@@ -1316,7 +1349,7 @@ void LLFloaterTexturePicker::onBakeTextureSelect(LLUICtrl* ctrl, void *user_data
void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply, bool inworld_image)
{
- mSelectBtn->setEnabled(can_apply);
+ mSelectBtn->setEnabled(can_apply && !getTentative()); // will be updated on draw
getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview && inworld_image);
getChildRef<LLUICtrl>("apply_immediate_check").setVisible(can_preview);
@@ -1490,7 +1523,13 @@ void LLFloaterTexturePicker::refreshInventoryFilter()
void LLFloaterTexturePicker::setLocalTextureEnabled(bool enabled)
{
+ mLocalTextureEnabled = enabled;
mModeSelector->setEnabledByValue(1, enabled);
+ if (!enabled && (mModeSelector->getValue().asInteger() == 2))
+ {
+ mModeSelector->selectByValue(0);
+ onModeSelect(0, this);
+ }
}
void LLFloaterTexturePicker::setBakeTextureEnabled(bool enabled)
@@ -1617,6 +1656,7 @@ void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te )
else
{
setImageID(te.getID());
+ setTentative(false);
}
mNoCopyTextureSelected = false;
@@ -1664,10 +1704,16 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)
mDefaultImageName(p.default_image_name),
mFallbackImage(p.fallback_image)
{
-
- // Default of defaults is white image for diff tex
- //
- setBlankImageAssetID(IMG_WHITE);
+ if (mInventoryPickType == PICK_MATERIAL)
+ {
+ setBlankImageAssetID(BLANK_MATERIAL_ASSET_ID);
+ }
+ else
+ {
+ // Default of defaults is white image for diff tex
+ //
+ setBlankImageAssetID(IMG_WHITE);
+ }
setAllowNoTexture(p.allow_no_texture);
setCanApplyImmediately(p.can_apply_immediately);
@@ -1830,6 +1876,17 @@ void LLTextureCtrl::clear()
setImageAssetID(LLUUID::null);
}
+void LLTextureCtrl::setTentative(bool tentative)
+{
+ LLFloater* floaterp = mFloaterHandle.get();
+
+ if (floaterp)
+ {
+ floaterp->setTentative(tentative);
+ }
+ LLUICtrl::setTentative(tentative);
+}
+
void LLTextureCtrl::setLabel(const std::string& label)
{
mLabel = label;
@@ -1877,11 +1934,9 @@ void LLTextureCtrl::showPicker(bool take_focus)
if (texture_floaterp)
{
texture_floaterp->setOnFloaterCommitCallback(boost::bind(&LLTextureCtrl::onFloaterCommit, this, _1, _2, _3, _4, _5));
- }
- if (texture_floaterp)
- {
texture_floaterp->setSetImageAssetIDCallback(boost::bind(&LLTextureCtrl::setImageAssetID, this, _1));
+ texture_floaterp->setLocalTextureEnabled(mAllowLocalTexture);
texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled && mInventoryPickType != PICK_MATERIAL);
}
@@ -1891,12 +1946,6 @@ void LLTextureCtrl::showPicker(bool take_focus)
floaterp->openFloater();
}
- LLFloaterTexturePicker* picker_floater = dynamic_cast<LLFloaterTexturePicker*>(floaterp);
- if (picker_floater)
- {
- picker_floater->setLocalTextureEnabled(mAllowLocalTexture);
- }
-
if (take_focus)
{
floaterp->setFocus(true);
@@ -2076,7 +2125,17 @@ void LLTextureCtrl::setOnTextureSelectedCallback(texture_selected_callback cb)
}
}
-void LLTextureCtrl::setImageAssetName(const std::string& name)
+void LLTextureCtrl::setAllowLocalTexture(bool b)
+{
+ mAllowLocalTexture = b;
+ LLFloaterTexturePicker* picker_floater = dynamic_cast<LLFloaterTexturePicker*>(mFloaterHandle.get());
+ if (picker_floater)
+ {
+ picker_floater->setLocalTextureEnabled(mAllowLocalTexture);
+ }
+}
+
+void LLTextureCtrl::setImageAssetName(const std::string& name)
{
LLPointer<LLUIImage> imagep = LLUI::getUIImage(name);
if(imagep)
@@ -2101,6 +2160,7 @@ void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id )
if( floaterp && getEnabled() )
{
floaterp->setImageID( asset_id );
+ floaterp->setTentative(getTentative());
floaterp->resetDirty();
}
}
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index df5e763139..467b8d1091 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -167,6 +167,8 @@ public:
// LLUICtrl interface
void clear() override;
+ void setTentative(bool b) override;
+
// Takes a UUID, wraps get/setImageAssetID
void setValue(const LLSD& value) override;
LLSD getValue() const override;
@@ -181,7 +183,7 @@ public:
void setAllowNoTexture( bool b ) { mAllowNoTexture = b; }
bool getAllowNoTexture() const { return mAllowNoTexture; }
- void setAllowLocalTexture(bool b) { mAllowLocalTexture = b; }
+ void setAllowLocalTexture(bool b);
bool getAllowLocalTexture() const { return mAllowLocalTexture; }
const LLUUID& getImageItemID() { return mImageItemID; }
@@ -338,7 +340,7 @@ public:
void setImageID(const LLUUID& image_asset_id, bool set_selection = true);
bool updateImageStats(); // true if within limits
const LLUUID& getAssetID() { return mImageAssetID; }
- const LLUUID& findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false);
+ const LLUUID& findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const;
void setCanApplyImmediately(bool b);
void setActive(bool active);
@@ -395,6 +397,7 @@ protected:
void refreshLocalList();
void refreshInventoryFilter();
void setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection = true);
+ LLViewerInventoryItem* findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const;
LLPointer<LLViewerTexture> mTexturep;
LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial;
@@ -405,7 +408,6 @@ protected:
LLUIImagePtr mFallbackImage; // What to show if currently selected texture is null.
LLUUID mDefaultImageAssetID;
LLUUID mBlankImageAssetID;
- bool mTentative;
bool mAllowNoTexture;
LLUUID mSpecialCurrentImageAssetID; // Used when the asset id has no corresponding texture in the user's inventory.
LLUUID mOriginalImageAssetID;
@@ -456,6 +458,7 @@ private:
set_on_update_image_stats_callback mOnUpdateImageStatsCallback;
bool mBakeTextureEnabled;
+ bool mLocalTextureEnabled;
static S32 sLastPickerMode;
};
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 087761cbd0..f7cb0ee7ed 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"
@@ -1294,10 +1295,19 @@ bool LLTextureFetchWorker::doWork(S32 param)
else
{
mCanUseCapability = false;
- mRegionRetryAttempt++;
- mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY);
- // ex: waiting for caps
- LL_INFOS_ONCE(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL;
+ if (gDisconnected)
+ {
+ // We lost connection or are shutting down.
+ mCanUseHTTP = false;
+ return true; // abort
+ }
+ else
+ {
+ // Ex: waiting for caps
+ mRegionRetryAttempt++;
+ mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY);
+ LL_INFOS_ONCE(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL;
+ }
}
}
else
@@ -1693,10 +1703,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
mHttpReplyOffset = 0;
mLoadedDiscard = mRequestedDiscard;
- if (mLoadedDiscard < 0)
+ if (mLoadedDiscard < 0 || (mLoadedDiscard > MAX_DISCARD_LEVEL && mFormattedImage->getCodec() == IMG_CODEC_J2C))
{
LL_WARNS(LOG_TXT) << mID << " mLoadedDiscard is " << mLoadedDiscard
- << ", should be >=0" << LL_ENDL;
+ << ", should be >=0 and <=" << MAX_DISCARD_LEVEL << LL_ENDL;
}
setState(DECODE_IMAGE);
if (mWriteToCacheState != NOT_WRITE)
@@ -1758,14 +1768,27 @@ bool LLTextureFetchWorker::doWork(S32 param)
LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: mLoadedDiscard < 0" << LL_ENDL;
return true;
}
+
+ llassert_always(mFormattedImage.notNull());
+ S32 discard = mHaveAllData && mFormattedImage->getCodec() != IMG_CODEC_J2C ? 0 : mLoadedDiscard;
+ if (discard > MAX_DISCARD_LEVEL) // only warn for j2c
+ {
+ // We encode j2c with fixed amount of discard levels,
+ // Trying to decode beyound that will fail.
+ LL_WARNS(LOG_TXT) << "Decode entered with invalid discard. ID = " << mID << LL_ENDL;
+
+ //abort, don't decode
+ setState(DONE);
+ LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: mLoadedDiscard > MAX_DISCARD_LEVEL" << LL_ENDL;
+ return true;
+ }
+
mDecodeTimer.reset();
mRawImage = NULL;
mAuxImage = NULL;
- llassert_always(mFormattedImage.notNull());
// if we have the entire image data (and the image is not J2C), decode the full res image
// DO NOT decode a higher res j2c than was requested. This is a waste of time and memory.
- S32 discard = mHaveAllData && mFormattedImage->getCodec() != IMG_CODEC_J2C ? 0 : mLoadedDiscard;
mDecoded = false;
setState(DECODE_IMAGE_UPDATE);
LL_DEBUGS(LOG_TXT) << mID << ": Decoding. Bytes: " << mFormattedImage->getDataSize() << " Discard: " << discard
@@ -2434,7 +2457,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());
@@ -2484,7 +2507,7 @@ LLTextureFetch::~LLTextureFetch()
}
S32 LLTextureFetch::createRequest(FTType f_type, const std::string& url, const LLUUID& id, const LLHost& host, F32 priority,
- S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux, bool can_use_http)
+ S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux, bool can_use_http)
{
LL_PROFILE_ZONE_SCOPED;
if (mDebugPause)
@@ -2496,13 +2519,13 @@ S32 LLTextureFetch::createRequest(FTType f_type, const std::string& url, const L
{
LL_DEBUGS("Avatar") << " requesting " << id << " " << w << "x" << h << " discard " << desired_discard << " type " << f_type << LL_ENDL;
}
- LLTextureFetchWorker* worker = getWorker(id) ;
+ LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
if (worker->mHost != host)
{
LL_WARNS(LOG_TXT) << "LLTextureFetch::createRequest " << id << " called with multiple hosts: "
- << host << " != " << worker->mHost << LL_ENDL;
+ << host << " != " << worker->mHost << LL_ENDL;
removeRequest(worker, true);
worker = NULL;
return CREATE_REQUEST_ERROR_MHOSTS;
@@ -2538,7 +2561,7 @@ S32 LLTextureFetch::createRequest(FTType f_type, const std::string& url, const L
// we really do get it.)
desired_size = MAX_IMAGE_DATA_SIZE;
}
- else if (w*h*c > 0)
+ else if (w * h * c > 0)
{
// If the requester knows the dimensions of the image,
// this will calculate how much data we need without having to parse the header
@@ -2596,14 +2619,15 @@ S32 LLTextureFetch::createRequest(FTType f_type, const std::string& url, const L
worker->lockWorkMutex(); // +Mw
worker->mActiveCount++;
worker->mNeedsAux = needs_aux;
- worker->setCanUseHTTP(can_use_http) ;
+ worker->setCanUseHTTP(can_use_http);
worker->unlockWorkMutex(); // -Mw
}
LL_DEBUGS(LOG_TXT) << "REQUESTED: " << id << " f_type " << fttype_to_string(f_type)
- << " Discard: " << desired_discard << " size " << desired_size << LL_ENDL;
+ << " Discard: " << desired_discard << " size " << desired_size << LL_ENDL;
return desired_discard;
}
+
// Threads: T*
//
// protected
@@ -2952,11 +2976,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/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 8ab90896dc..851d6c11a0 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -85,8 +85,9 @@ public:
};
// Threads: T* (but Tmain mostly)
+ // returns discard on success, fail code otherwise
S32 createRequest(FTType f_type, const std::string& url, const LLUUID& id, const LLHost& host, F32 priority,
- S32 w, S32 h, S32 c, S32 discard, bool needs_aux, bool can_use_http);
+ S32 w, S32 h, S32 c, S32 discard, bool needs_aux, bool can_use_http);
// Requests that a fetch operation be deleted from the queue.
// If @cancel is true, also stops any I/O operations pending.
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 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/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp
index ae21d3e733..b077262f06 100644
--- a/indra/newview/llthumbnailctrl.cpp
+++ b/indra/newview/llthumbnailctrl.cpp
@@ -111,7 +111,9 @@ void LLThumbnailCtrl::draw()
gl_draw_scaled_image( draw_rect.mLeft, draw_rect.mBottom, draw_rect.getWidth(), draw_rect.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
- mTexturep->setKnownDrawSize(draw_rect.getWidth(), draw_rect.getHeight());
+ // Thumbnails are usually 256x256 or smaller, either report that or
+ // some high value to get image with higher priority
+ mTexturep->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE);
}
else if( mImagep.notNull() )
{
@@ -238,12 +240,8 @@ void LLThumbnailCtrl::initImage()
{
// Should it support baked textures?
mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_THUMBNAIL);
-
mTexturep->forceToSaveRawImage(0);
-
- S32 desired_draw_width = MAX_IMAGE_SIZE;
- S32 desired_draw_height = MAX_IMAGE_SIZE;
- mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height);
+ mTexturep->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE);
}
}
else if (tvalue.isString())
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 84854a79d4..0f871dc1bb 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -421,7 +421,7 @@ void LLToast::setVisible(bool show)
if(mHideBtn)
mHideBtn->setVisible(show);
}
- LLFloater::setVisible(show);
+ LLModalDialog::setVisible(show);
if (mPanel
&& !mPanel->isDead()
&& mWrapperPanel
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index 3c3440d41a..95653dc19b 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -87,10 +87,21 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi
std::string timeStr = "[" + LLTrans::getString("TimeWeek") + "], ["
+ LLTrans::getString("TimeMonth") + "]/["
+ LLTrans::getString("TimeDay") + "]/["
- + LLTrans::getString("TimeYear") + "] ["
- + LLTrans::getString("TimeHour") + "]:["
- + LLTrans::getString("TimeMin") + "] ["
- + LLTrans::getString("TimeTimezone") + "]";
+ + LLTrans::getString("TimeYear") + "] [";
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ if (use_24h)
+ {
+ timeStr += LLTrans::getString("TimeHour") + "]:["
+ + LLTrans::getString("TimeMin") + "] ["
+ + LLTrans::getString("TimeTimezone") + "]";
+ }
+ else
+ {
+ timeStr += LLTrans::getString("TimeHour12") + "]:["
+ + LLTrans::getString("TimeMin") + "] ["
+ + LLTrans::getString("TimeAMPM") + "] ["
+ + LLTrans::getString("TimeTimezone") + "]";
+ }
const LLDate timeStamp = notification->getDate();
LLDate notice_date = timeStamp.notNull() ? timeStamp : payload["received_time"].asDate();
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index 0063e0b7fd..c1ec5fa183 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -110,7 +110,7 @@ bool LLToolBarView::postBuild()
{
mToolbars[i]->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));
mToolbars[i]->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4));
- mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4));
+ mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4,_5));
mToolbars[i]->setButtonAddCallback(boost::bind(LLToolBarView::onToolBarButtonAdded,_1));
mToolbars[i]->setButtonRemoveCallback(boost::bind(LLToolBarView::onToolBarButtonRemoved,_1));
}
@@ -624,8 +624,14 @@ bool LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetTyp
return false;
}
-bool LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* toolbar)
+bool LLToolBarView::handleDropTool( void* cargo_data, EDragAndDropType cargo_type, S32 x, S32 y, LLToolBar* toolbar)
{
+ if (cargo_type == DAD_PERSON)
+ {
+ // DAD_PERSON means that cargo_data contains an uuid, not an LLInventoryObject
+ resetDragTool(NULL);
+ return false;
+ }
bool handled = false;
LLInventoryObject* inv_item = static_cast<LLInventoryObject*>(cargo_data);
@@ -647,15 +653,18 @@ bool LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t
if (old_toolbar_loc != LLToolBarEnums::TOOLBAR_NONE)
{
llassert(gToolBarView->mDragToolbarButton);
- old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>();
- if (old_toolbar->isReadOnly() && toolbar->isReadOnly())
- {
- // do nothing
- }
- else
+ if (gToolBarView->mDragToolbarButton)
{
- int old_rank = LLToolBar::RANK_NONE;
- gToolBarView->removeCommand(command_id, old_rank);
+ old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>();
+ if (old_toolbar->isReadOnly() && toolbar->isReadOnly())
+ {
+ // do nothing
+ }
+ else
+ {
+ int old_rank = LLToolBar::RANK_NONE;
+ gToolBarView->removeCommand(command_id, old_rank);
+ }
}
}
diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h
index 7cecd81052..7212f099b7 100644
--- a/indra/newview/lltoolbarview.h
+++ b/indra/newview/lltoolbarview.h
@@ -92,7 +92,7 @@ public:
static void startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton);
static bool handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type);
- static bool handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar);
+ static bool handleDropTool(void* cargo_data, EDragAndDropType cargo_type, S32 x, S32 y, LLToolBar* toolbar);
static void resetDragTool(LLToolBarButton* toolbarButton);
LLInventoryObject* getDragItem();
LLView* getBottomToolbar() { return mBottomToolbarPanel; }
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 9d6f44c096..f78ff2226c 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -29,6 +29,8 @@
// library headers
#include "llnotificationsutil.h"
+#include <vector>
+#include <tuple>
// project headers
#include "llagent.h"
#include "llagentcamera.h"
@@ -1125,28 +1127,33 @@ void set_texture_to_material(LLViewerObject* hit_obj,
case LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR:
default:
{
- material->setBaseColorId(asset_id);
+ material->setBaseColorId(asset_id, true);
}
break;
case LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS:
{
- material->setOcclusionRoughnessMetallicId(asset_id);
+ material->setOcclusionRoughnessMetallicId(asset_id, true);
}
break;
case LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE:
{
- material->setEmissiveId(asset_id);
+ material->setEmissiveId(asset_id, true);
}
break;
case LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL:
{
- material->setNormalId(asset_id);
+ material->setNormalId(asset_id, true);
}
break;
}
+ // Update viewer side, needed for updating mSavedGLTFOverrideMaterials.
+ // Also for parity, we are immediately setting textures and materials,
+ // so we should immediate set overrides to.
+ hit_obj->setTEGLTFMaterialOverride(hit_face, material);
+ // update server
LLGLTFMaterialList::queueModify(hit_obj, hit_face, material);
}
@@ -1292,7 +1299,89 @@ void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj,
asset_id = BLANK_MATERIAL_ASSET_ID;
}
- hit_obj->setRenderMaterialID(hit_face, asset_id);
+ // Preserve existing texture transforms when switching to PBR material
+ LLTextureEntry* tep = hit_obj->getTE(hit_face);
+ F32 existing_scale_s = LLGLTFMaterial::TextureTransform().mScale.mV[0];
+ F32 existing_scale_t = LLGLTFMaterial::TextureTransform().mScale.mV[1];
+ F32 existing_offset_s = LLGLTFMaterial::TextureTransform().mOffset.mV[0];
+ F32 existing_offset_t = LLGLTFMaterial::TextureTransform().mOffset.mV[1];
+ F32 existing_rotation = LLGLTFMaterial::TextureTransform().mRotation;
+ bool should_preserve_transforms = false;
+ LLGLTFMaterial* preserved_override = nullptr;
+
+ if (tep && asset_id.notNull())
+ {
+ // Only preserve transforms from existing GLTF material override
+ // Do not fall back to texture entry transforms when switching between PBR materials
+ LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride();
+ if (existing_override)
+ {
+ // Check if existing override has non-default transforms
+ const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0];
+ const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
+
+ if (existing_transform.mScale != default_transform.mScale ||
+ existing_transform.mOffset != default_transform.mOffset ||
+ existing_transform.mRotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from current PBR material
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ preserved_override->mTextureTransform[i].mScale = existing_transform.mScale;
+ preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset;
+ preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation;
+ }
+ should_preserve_transforms = true;
+ }
+ // If existing override has default transforms, don't preserve anything
+ }
+ else
+ {
+ // No existing PBR material override - check texture entry transforms
+ // This handles the case of switching from Blinn-Phong to PBR material
+ F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
+ tep->getScale(&existing_scale_s, &existing_scale_t);
+ tep->getOffset(&existing_offset_s, &existing_offset_t);
+ existing_rotation = tep->getRotation();
+
+ const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
+ if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
+ existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
+ existing_rotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from texture entry
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLVector2 pbr_scale, pbr_offset;
+ F32 pbr_rotation;
+ LLGLTFMaterial::convertTextureTransformToPBR(
+ existing_scale_s, existing_scale_t,
+ existing_offset_s, existing_offset_t,
+ existing_rotation,
+ pbr_scale, pbr_offset, pbr_rotation);
+ preserved_override->mTextureTransform[i].mScale = pbr_scale;
+ preserved_override->mTextureTransform[i].mOffset = pbr_offset;
+ preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
+ }
+ should_preserve_transforms = true;
+ }
+ }
+ }
+
+ if (should_preserve_transforms && preserved_override)
+ {
+ // Apply material with preserved transforms
+ LLGLTFMaterialList::queueApply(hit_obj, hit_face, asset_id, preserved_override);
+ // Update local state
+ hit_obj->setRenderMaterialID(hit_face, asset_id, false, true);
+ tep->setGLTFMaterialOverride(preserved_override);
+ }
+ else
+ {
+ hit_obj->setRenderMaterialID(hit_face, asset_id);
+ }
dialog_refresh_all();
@@ -1328,7 +1417,134 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,
asset_id = BLANK_MATERIAL_ASSET_ID;
}
- hit_obj->setRenderMaterialIDs(asset_id);
+ // Preserve existing texture transforms when switching to PBR material for all faces
+ std::vector<std::pair<bool, LLGLTFMaterial*>> preserved_transforms(hit_obj->getNumTEs());
+
+ if (asset_id.notNull())
+ {
+ for (S32 te = 0; te < hit_obj->getNumTEs(); ++te)
+ {
+ LLTextureEntry* tep = hit_obj->getTE(te);
+ if (!tep) continue;
+
+ bool should_preserve = false;
+ LLGLTFMaterial* preserved_override = nullptr;
+
+ // Only preserve transforms from existing GLTF material override
+ // Do not fall back to texture entry transforms when switching between PBR materials
+ LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride();
+ if (existing_override)
+ {
+ // Check if existing override has non-default transforms
+ const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0];
+ const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
+
+ if (existing_transform.mScale != default_transform.mScale ||
+ existing_transform.mOffset != default_transform.mOffset ||
+ existing_transform.mRotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from current PBR material
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ preserved_override->mTextureTransform[i].mScale = existing_transform.mScale;
+ preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset;
+ preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation;
+ }
+ should_preserve = true;
+ }
+ else
+ {
+ // Existing override has default transforms, fall back to texture entry
+ F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
+ tep->getScale(&existing_scale_s, &existing_scale_t);
+ tep->getOffset(&existing_offset_s, &existing_offset_t);
+ existing_rotation = tep->getRotation();
+
+ if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
+ existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
+ existing_rotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from texture entry
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLVector2 pbr_scale, pbr_offset;
+ F32 pbr_rotation;
+ LLGLTFMaterial::convertTextureTransformToPBR(
+ existing_scale_s, existing_scale_t,
+ existing_offset_s, existing_offset_t,
+ existing_rotation,
+ pbr_scale, pbr_offset, pbr_rotation);
+ preserved_override->mTextureTransform[i].mScale = pbr_scale;
+ preserved_override->mTextureTransform[i].mOffset = pbr_offset;
+ preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
+ }
+ should_preserve = true;
+ }
+ }
+ }
+ else
+ {
+ // No existing PBR material override - check texture entry transforms
+ // This handles the case of switching from Blinn-Phong to PBR material
+ F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
+ tep->getScale(&existing_scale_s, &existing_scale_t);
+ tep->getOffset(&existing_offset_s, &existing_offset_t);
+ existing_rotation = tep->getRotation();
+
+ const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
+ if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
+ existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
+ existing_rotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from texture entry
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLVector2 pbr_scale, pbr_offset;
+ F32 pbr_rotation;
+ LLGLTFMaterial::convertTextureTransformToPBR(
+ existing_scale_s, existing_scale_t,
+ existing_offset_s, existing_offset_t,
+ existing_rotation,
+ pbr_scale, pbr_offset, pbr_rotation);
+ preserved_override->mTextureTransform[i].mScale = pbr_scale;
+ preserved_override->mTextureTransform[i].mOffset = pbr_offset;
+ preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
+ }
+ should_preserve = true;
+ }
+ }
+
+ preserved_transforms[te] = std::make_pair(should_preserve, preserved_override);
+ }
+ }
+
+ // Apply materials with preserved transforms
+ if (asset_id.notNull())
+ {
+ for (S32 te = 0; te < hit_obj->getNumTEs(); ++te)
+ {
+ LLGLTFMaterial* preserved_override = preserved_transforms[te].second;
+ if (preserved_override)
+ {
+ // Apply material with preserved transforms
+ LLGLTFMaterialList::queueApply(hit_obj, te, asset_id, preserved_override);
+ // Update local state
+ hit_obj->setRenderMaterialID(te, asset_id, false, true);
+ hit_obj->getTE(te)->setGLTFMaterialOverride(preserved_override);
+ }
+ else
+ {
+ hit_obj->setRenderMaterialID(te, asset_id);
+ }
+ }
+ }
+ else
+ {
+ hit_obj->setRenderMaterialIDs(asset_id);
+ }
dialog_refresh_all();
// send the update to the simulator
hit_obj->sendTEUpdate();
@@ -2156,7 +2372,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
{
if(mSource == SOURCE_LIBRARY)
{
- LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0));
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0, false));
copy_inventory_item(
gAgent.getID(),
item->getPermissions().getOwner(),
@@ -2167,7 +2383,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
}
else
{
- rez_attachment(item, 0);
+ rez_attachment(item, 0, false);
}
}
return ACCEPT_YES_SINGLE;
@@ -2351,6 +2567,47 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
return rv;
}
+
+bool is_water_exclusion_face(LLViewerObject* obj, S32 face)
+{
+ LLViewerTexture* image = obj->getTEImage(face);
+ if (!image)
+ return false;
+
+ // magic texture and alpha blending
+ bool exclude_water = (image->getID() == IMG_ALPHA_GRAD) && obj->isImageAlphaBlended(face);
+
+ // transparency
+ exclude_water &= (obj->getTE(face)->getColor().mV[VALPHA] == 1);
+
+ //absence of normal and specular textures
+ image = obj->getTENormalMap(face);
+ if (image && image != LLViewerFetchedTexture::sDefaultImagep)
+ exclude_water &= image->getID().isNull();
+ image = obj->getTESpecularMap(face);
+ if (image && image != LLViewerFetchedTexture::sDefaultImagep)
+ exclude_water &= image->getID().isNull();
+
+ return exclude_water;
+}
+
+bool is_water_exclusion_surface(LLViewerObject* obj, S32 face, bool all_faces)
+{
+ if (all_faces)
+ {
+ bool exclude_water = false;
+ for (S32 it_face = 0; it_face < obj->getNumTEs(); it_face++)
+ {
+ exclude_water |= is_water_exclusion_face(obj, it_face);
+ }
+ return exclude_water;
+ }
+ else
+ {
+ return is_water_exclusion_face(obj, face);
+ }
+}
+
EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
LLViewerObject* obj, S32 face, MASK mask, bool drop, EDragAndDropType cargo_type)
{
@@ -2441,7 +2698,13 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
else if (cargo_type == DAD_MATERIAL)
{
bool all_faces = mask & MASK_SHIFT;
- if (item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
+
+ if (is_water_exclusion_surface(obj, face, all_faces))
+ {
+ LLNotificationsUtil::add("WaterExclusionNoMaterial");
+ return ACCEPT_NO;
+ }
+ else if (item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
{
dropMaterial(obj, face, item, mSource, mSourceID, all_faces);
}
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 8cdc2e94f4..0a69be528f 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -72,6 +72,7 @@
#include "llweb.h"
#include "pipeline.h" // setHighlightObject
#include "lluiusage.h"
+#include "llcallingcard.h"
extern bool gDebugClicks;
@@ -1501,6 +1502,142 @@ static void handle_click_action_play()
}
}
+bool LLToolPie::shouldAllowFirstMediaInteraction(const LLPickInfo& pick, bool moap_flag)
+{
+ // Early failure cases
+ if(!pick.getObject())
+ {
+ LL_WARNS() << "pick.getObject() is NULL" << LL_ENDL;
+ return false;
+ }
+
+ static LLCachedControl<S32> FirstClickPref(gSavedSettings, "MediaFirstClickInteract", 1);
+
+ // Special / early-exit cases first, then checks get more complex and needy as we go down
+ // Feature disabled
+ if(FirstClickPref == MEDIA_FIRST_CLICK_NONE)
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref == MEDIA_FIRST_CLICK_NONE" << LL_ENDL;
+ return false;
+ }
+ // Every check beyond this point requires PRIM_MEDIA_FIRST_CLICK_INTERACT to be TRUE
+ if(!moap_flag && !(FirstClickPref & MEDIA_FIRST_CLICK_BYPASS_MOAP_FLAG))
+ {
+ LL_DEBUGS_ONCE() << "PRIM_MEDIA_FIRST_CLICK_INTERACT not set" << LL_ENDL;
+ return false;
+ }
+ // Any object with PRIM_MEDIA_FIRST_CLICK_INTERACT set to TRUE
+ if((FirstClickPref & MEDIA_FIRST_CLICK_ANY) == MEDIA_FIRST_CLICK_ANY)
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_ANY" << LL_ENDL;
+ return true;
+ }
+
+ // The following checks require some object information so we obtain that
+ LLPointer<LLViewerObject> object = pick.getObject();
+ if(object.isNull())
+ {
+ LL_WARNS() << "pick.getObject() is NULL" << LL_ENDL;
+ return false;
+ }
+
+ // HUD attachments
+ if((FirstClickPref & MEDIA_FIRST_CLICK_HUD) && object->isHUDAttachment())
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_HUD" << LL_ENDL;
+ return true;
+ }
+
+ // Further object detail required beyond this point
+ LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode();
+ if (hover_node == nullptr)
+ {
+ LL_WARNS() << "No Hover node" << LL_ENDL;
+ return false;
+ }
+ LLPermissions* perms = hover_node->mPermissions;
+ if(perms == nullptr)
+ {
+ LL_WARNS() << "LLSelectMgr::getInstance()->getHoverNode()->mPermissions is NULL" << LL_ENDL;
+ return false;
+ }
+ LLUUID owner_id = perms->getOwner();
+ LLUUID group_id = perms->getGroup();
+ if(owner_id.isNull() && group_id.isNull())
+ {
+ LL_WARNS() << "Owner information was not reliably obtained" << LL_ENDL;
+ return false;
+ }
+
+ // Own objects
+ if((FirstClickPref & MEDIA_FIRST_CLICK_OWN) && owner_id == gAgent.getID())
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_OWN" << LL_ENDL;
+ return true;
+ }
+
+ // Check if the object is owned by a friend of the agent
+ if(FirstClickPref & MEDIA_FIRST_CLICK_FRIEND)
+ {
+ if(LLAvatarTracker::instance().isBuddy(owner_id))
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_FRIEND. id: " << owner_id << LL_ENDL;
+ return true;
+ }
+ }
+
+ // Check for objects set to or owned by the active group
+ if(FirstClickPref & MEDIA_FIRST_CLICK_GROUP)
+ {
+ if(gAgent.isInGroup(group_id) || gAgent.isInGroup(owner_id))
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_GROUP. group_id:" << group_id << ", owner_id: " << owner_id << LL_ENDL;
+ return true;
+ }
+ }
+
+ // This check ensures that the following conditions are met:
+ // 1. The object is located in the same parcel as the agent.
+ // 2. One of the following is true:
+ // a. The object is owned by the same group as the parcel.
+ // b. The object is set to the same group as the parcel.
+ // c. The object is owned by the same owner as the parcel.
+ // Conditions 2a and 2b are mutually exclusive, our check is the same for both.
+ if(FirstClickPref & MEDIA_FIRST_CLICK_LAND)
+ {
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if(parcel == nullptr)
+ {
+ LL_WARNS() << "LLViewerParcelMgr::getInstance()->getAgentParcel() is NULL" << LL_ENDL;
+ return false;
+ }
+
+ // Same parcel as the agent only
+ if(!LLViewerParcelMgr::getInstance()->inAgentParcel(object->getPositionGlobal()))
+ {
+ LL_WARNS_ONCE() << "Object is not in the same parcel as the agent" << LL_ENDL;
+ return false;
+ }
+
+ LLUUID parcel_owner = parcel->getOwnerID();
+ LLUUID parcel_group = parcel->getGroupID();
+
+ // The parcel owner and group can't both be null
+ if(parcel_owner.isNull() && parcel_group.isNull())
+ {
+ LL_WARNS() << "Parcel owner and group are both null" << LL_ENDL;
+ return false;
+ }
+
+ if(owner_id == parcel_owner || group_id == parcel_group)
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_LAND. Parcel owner: " << parcel_owner << ", group_id:" << group_id << ", owner_id: " << owner_id << LL_ENDL;
+ return true;
+ }
+ }
+ return false;
+}
+
bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
{
//FIXME: how do we handle object in different parcel than us?
@@ -1535,6 +1672,16 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
{
// It's okay to give this a null impl
LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal);
+ if (shouldAllowFirstMediaInteraction(pick, mep->getFirstClickInteract()))
+ {
+ if (media_impl.notNull())
+ {
+ media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(true));
+ mMediaMouseCaptureID = mep->getMediaID();
+ setMouseCapture(true);
+ return true;
+ }
+ }
}
else
{
@@ -1647,7 +1794,7 @@ bool LLToolPie::handleMediaHover(const LLPickInfo& pick)
}
// If this is the focused media face, send mouse move events.
- if (LLViewerMediaFocus::getInstance()->isFocusedOnFace(objectp, pick.mObjectFace))
+ if (LLViewerMediaFocus::getInstance()->isFocusedOnFace(objectp, pick.mObjectFace) || (shouldAllowFirstMediaInteraction(pick, mep->getFirstClickInteract())))
{
media_impl->mouseMove(pick.mUVCoords, gKeyboard->currentMask(true));
gViewerWindow->setCursor(media_impl->getLastSetCursor());
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index b3884a6bfc..ec54e0207d 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -89,6 +89,22 @@ private:
void showVisualContextMenuEffect();
ECursorType cursorFromObject(LLViewerObject* object);
+ enum MediaFirstClickTypes
+ {
+ MEDIA_FIRST_CLICK_NONE = 0, // Special case: Feature is disabled
+ MEDIA_FIRST_CLICK_HUD = 1 << 0, // 0b00000001 (1)
+ MEDIA_FIRST_CLICK_OWN = 1 << 1, // 0b00000010 (2)
+ MEDIA_FIRST_CLICK_FRIEND = 1 << 2, // 0b00000100 (4)
+ MEDIA_FIRST_CLICK_GROUP = 1 << 3, // 0b00001000 (8)
+ MEDIA_FIRST_CLICK_LAND = 1 << 4, // 0b00010000 (16)
+
+ // Covers any object with PRIM_MEDIA_FIRST_CLICK_INTERACT (combines all previous flags)
+ MEDIA_FIRST_CLICK_ANY = (1 << 15) - 1, // 0b0111111111111111 (32767)
+
+ // Covers all media regardless of other rules or PRIM_MEDIA_FIRST_CLICK_INTERACT
+ MEDIA_FIRST_CLICK_BYPASS_MOAP_FLAG = 1 << 15 // 0b10000000000000000 (32768)
+ };
+ bool shouldAllowFirstMediaInteraction(const LLPickInfo& info, bool moap_flag);
bool handleMediaClick(const LLPickInfo& info);
bool handleMediaDblClick(const LLPickInfo& info);
bool handleMediaHover(const LLPickInfo& info);
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
index 7ef2c8d697..7d5386110d 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -62,7 +62,8 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId,
LLAssetType::EType assetType, std::string name, std::string description,
S32 compressionInfo, LLFolderType::EType destinationType,
LLInventoryType::EType inventoryType, U32 nextOWnerPerms,
- U32 groupPerms, U32 everyonePerms, S32 expectedCost, bool showInventory) :
+ U32 groupPerms, U32 everyonePerms, S32 expectedCost,
+ const LLUUID& destFolderId, bool showInventory) :
mTransactionId(transactId),
mAssetType(assetType),
mName(name),
@@ -75,7 +76,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId,
mEveryonePerms(everyonePerms),
mExpectedUploadCost(expectedCost),
mShowInventory(showInventory),
- mFolderId(LLUUID::null),
+ mFolderId(destFolderId),
mItemId(LLUUID::null),
mAssetId(LLAssetID::null)
{ }
@@ -84,7 +85,8 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId,
LLResourceUploadInfo::LLResourceUploadInfo(std::string name,
std::string description, S32 compressionInfo,
LLFolderType::EType destinationType, LLInventoryType::EType inventoryType,
- U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, S32 expectedCost, bool showInventory) :
+ U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, S32 expectedCost,
+ const LLUUID& destFolderId, bool showInventory) :
mName(name),
mDescription(description),
mCompressionInfo(compressionInfo),
@@ -97,7 +99,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(std::string name,
mShowInventory(showInventory),
mTransactionId(),
mAssetType(LLAssetType::AT_NONE),
- mFolderId(LLUUID::null),
+ mFolderId(destFolderId),
mItemId(LLUUID::null),
mAssetId(LLAssetID::null)
{
@@ -306,10 +308,10 @@ void LLResourceUploadInfo::assignDefaults()
}
else
{
- mFolderId = gInventory.findUserDefinedCategoryUUIDForType(
- (mDestinationFolderType == LLFolderType::FT_NONE) ?
- (LLFolderType::EType)mAssetType : mDestinationFolderType);
-}
+ mFolderId = gInventory.findUserDefinedCategoryUUIDForType(
+ (mDestinationFolderType == LLFolderType::FT_NONE) ?
+ (LLFolderType::EType)mAssetType : mDestinationFolderType);
+ }
}
std::string LLResourceUploadInfo::getDisplayName() const
@@ -366,10 +368,12 @@ LLNewFileResourceUploadInfo::LLNewFileResourceUploadInfo(
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
+ const LLUUID& destFolderId,
bool show_inventory) :
LLResourceUploadInfo(name, description, compressionInfo,
destinationType, inventoryType,
- nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory),
+ nextOWnerPerms, groupPerms, everyonePerms, expectedCost,
+ destFolderId, show_inventory),
mFileName(fileName),
mMaxImageSize(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT)
{
@@ -580,12 +584,13 @@ LLNewBufferedResourceUploadInfo::LLNewBufferedResourceUploadInfo(
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
+ const LLUUID& destFolderId,
bool show_inventory,
uploadFinish_f finish,
uploadFailure_f failure)
: LLResourceUploadInfo(name, description, compressionInfo,
destinationType, inventoryType,
- nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory)
+ nextOWnerPerms, groupPerms, everyonePerms, expectedCost, destFolderId, show_inventory)
, mBuffer(buffer)
, mFinishFn(finish)
, mFailureFn(failure)
diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h
index 365436ede0..c627e9dbb8 100644
--- a/indra/newview/llviewerassetupload.h
+++ b/indra/newview/llviewerassetupload.h
@@ -54,6 +54,7 @@ public:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
+ const LLUUID &destFolderId = LLUUID::null,
bool showInventory = true);
virtual ~LLResourceUploadInfo()
@@ -104,6 +105,7 @@ protected:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
+ const LLUUID& destFolderId = LLUUID::null,
bool showInventory = true);
LLResourceUploadInfo(
@@ -155,6 +157,7 @@ public:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
+ const LLUUID &destFolderId = LLUUID::null,
bool show_inventory = true);
virtual LLSD prepareUpload();
@@ -193,6 +196,7 @@ public:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
+ const LLUUID& destFolderId, // use null for default
bool show_inventory,
uploadFinish_f finish,
uploadFailure_f failure);
@@ -219,6 +223,7 @@ public:
typedef std::function<void(LLUUID itemId, LLUUID taskId, LLUUID newAssetId, LLSD response)> taskUploadFinish_f;
typedef std::function<bool(LLUUID itemId, LLUUID taskId, LLSD response, std::string reason)> uploadFailed_f;
+ // destFolderId is the folder to put the new item in, leave null for default
LLBufferedAssetUploadInfo(LLUUID itemId, LLAssetType::EType assetType, std::string buffer, invnUploadFinish_f finish, uploadFailed_f failed);
LLBufferedAssetUploadInfo(LLUUID itemId, LLPointer<LLImageFormatted> image, invnUploadFinish_f finish);
LLBufferedAssetUploadInfo(LLUUID taskId, LLUUID itemId, LLAssetType::EType assetType, std::string buffer, taskUploadFinish_f finish, uploadFailed_f failed);
diff --git a/indra/newview/llviewerattachmenu.cpp b/indra/newview/llviewerattachmenu.cpp
index f2557e299c..9828ab1fdf 100644
--- a/indra/newview/llviewerattachmenu.cpp
+++ b/indra/newview/llviewerattachmenu.cpp
@@ -116,12 +116,12 @@ void LLViewerAttachMenu::attachObjects(const uuid_vec_t& items, const std::strin
LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getLinkedItem(id);
if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
{
- rez_attachment(item, attachmentp); // don't replace if called from an "Attach To..." menu
+ rez_attachment(item, attachmentp, false); // don't replace if called from an "Attach To..." menu
}
else if(item && item->isFinished())
{
// must be in library. copy it to our inventory and put it on.
- LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, attachmentp));
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, attachmentp, false));
copy_inventory_item(gAgent.getID(),
item->getPermissions().getOwner(),
item->getUUID(),
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index b3b4f43e57..aa0cbac91f 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -390,6 +390,7 @@ void init_audio()
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose")));
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen")));
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndRestart")));
+ gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatMention")));
}
audio_update_volume(true);
@@ -541,8 +542,8 @@ void audio_update_wind(bool force_update)
// whereas steady-state avatar walk velocity is only 3.2 m/s.
// Without this the world feels desolate on first login when you are
// standing still.
- const F32 WIND_LEVEL = 0.5f;
- LLVector3 scaled_wind_vec = gWindVec * WIND_LEVEL;
+ static LLUICachedControl<F32> wind_level("AudioLevelWind", 0.5f);
+ LLVector3 scaled_wind_vec = gWindVec * wind_level;
// Mix in the avatar's motion, subtract because when you walk north,
// the apparent wind moves south.
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 6cf99b68b2..553c8d9b00 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -73,26 +73,26 @@ LLViewerCamera::LLViewerCamera() : LLCamera()
mAverageSpeed = 0.f;
mAverageAngularSpeed = 0.f;
- mCameraAngleChangedSignal = gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2));
-}
-
-LLViewerCamera::~LLViewerCamera()
-{
- mCameraAngleChangedSignal.disconnect();
+ LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl("CameraAngle");
+ if (cntrl_ptr.notNull())
+ {
+ cntrl_ptr->getCommitSignal()->connect([](LLControlVariable* control, const LLSD& value, const LLSD& previous)
+ {
+ LLViewerCamera::getInstance()->setDefaultFOV((F32)value.asReal());
+ });
+ }
}
-void LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVector3 &up_direction, const LLVector3 &point_of_interest)
+bool LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVector3 &up_direction, const LLVector3 &point_of_interest)
{
// do not update if avatar didn't move
if (!LLViewerJoystick::getInstance()->getCameraNeedsUpdate())
{
- return;
+ return true;
}
- LLVector3 last_position;
- LLVector3 last_axis;
- last_position = getOrigin();
- last_axis = getAtAxis();
+ LLVector3 last_position = getOrigin();
+ LLVector3 last_axis = getAtAxis();
mLastPointOfInterest = point_of_interest;
@@ -102,30 +102,49 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVecto
regp = gAgent.getRegion();
}
- F32 water_height = (NULL != regp) ? regp->getWaterHeight() : 0.f;
+ F32 water_height = regp ? regp->getWaterHeight() : 0.f;
LLVector3 origin = center;
+ // Move origin[VZ] far enough (up or down) from the water surface
+ static const F32 MIN_DIST_TO_WATER = 0.2f;
+ F32& zpos = origin.mV[VZ];
+ if (zpos < water_height + MIN_DIST_TO_WATER)
{
- if (origin.mV[2] > water_height)
+ if (zpos >= water_height)
{
- origin.mV[2] = llmax(origin.mV[2], water_height + 0.20f);
+ zpos = water_height + MIN_DIST_TO_WATER;
}
- else
+ else if (zpos > water_height - MIN_DIST_TO_WATER)
{
- origin.mV[2] = llmin(origin.mV[2], water_height - 0.20f);
+ zpos = water_height - MIN_DIST_TO_WATER;
}
}
- setOriginAndLookAt(origin, up_direction, point_of_interest);
+ LLVector3 at(point_of_interest - origin);
+ at.normalize();
+ if (at.isNull() || !at.isFinite())
+ return false;
+
+ LLVector3 left(up_direction % at);
+ left.normalize();
+ if (left.isNull() || !left.isFinite())
+ return false;
+
+ LLVector3 up = at % left;
+ up.normalize();
+ if (up.isNull() || !up.isFinite())
+ return false;
+
+ setOrigin(origin);
+ setAxes(at, left, up);
mVelocityDir = origin - last_position ;
F32 dpos = mVelocityDir.normVec() ;
LLQuaternion rotation;
rotation.shortestArc(last_axis, getAtAxis());
- F32 x, y, z;
- F32 drot;
+ F32 drot, x, y, z;
rotation.getAngleAxis(&drot, &x, &y, &z);
add(sVelocityStat, dpos);
@@ -139,13 +158,14 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVecto
mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f)));
// update screen pixel area
mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));
+
+ return true;
}
const LLMatrix4 &LLViewerCamera::getProjection() const
{
calcProjection(getFar());
return mProjectionMatrix;
-
}
const LLMatrix4 &LLViewerCamera::getModelview() const
@@ -158,13 +178,12 @@ const LLMatrix4 &LLViewerCamera::getModelview() const
void LLViewerCamera::calcProjection(const F32 far_distance) const
{
- F32 fov_y, z_far, z_near, aspect, f;
- fov_y = getView();
- z_far = far_distance;
- z_near = getNear();
- aspect = getAspect();
+ F32 fov_y = getView();
+ F32 z_far = far_distance;
+ F32 z_near = getNear();
+ F32 aspect = getAspect();
- f = 1/tan(fov_y*0.5f);
+ F32 f = 1 / tan(fov_y * 0.5f);
mProjectionMatrix.setZero();
mProjectionMatrix.mMatrix[0][0] = f/aspect;
@@ -270,9 +289,9 @@ void LLViewerCamera::updateFrustumPlanes(LLCamera& camera, bool ortho, bool zfli
}
void LLViewerCamera::setPerspective(bool for_selection,
- S32 x, S32 y_from_bot, S32 width, S32 height,
- bool limit_select_distance,
- F32 z_near, F32 z_far)
+ S32 x, S32 y_from_bot, S32 width, S32 height,
+ bool limit_select_distance,
+ F32 z_near, F32 z_far)
{
F32 fov_y, aspect;
fov_y = getView();
@@ -334,7 +353,7 @@ void LLViewerCamera::setPerspective(bool for_selection,
{
float offset = mZoomFactor - 1.f;
int pos_y = mZoomSubregion / llceil(mZoomFactor);
- int pos_x = mZoomSubregion - (pos_y*llceil(mZoomFactor));
+ int pos_x = mZoomSubregion - (pos_y * llceil(mZoomFactor));
glm::mat4 translate;
translate = glm::translate(glm::vec3(offset - (F32)pos_x * 2.f, offset - (F32)pos_y * 2.f, 0.f));
@@ -347,7 +366,7 @@ void LLViewerCamera::setPerspective(bool for_selection,
calcProjection(z_far); // Update the projection matrix cache
- proj_mat *= glm::perspective(fov_y,aspect,z_near,z_far);
+ proj_mat *= glm::perspective(fov_y, aspect, z_near, z_far);
gGL.loadMatrix(glm::value_ptr(proj_mat));
@@ -355,7 +374,7 @@ void LLViewerCamera::setPerspective(bool for_selection,
gGL.matrixMode(LLRender::MM_MODELVIEW);
- glm::mat4 modelview(glm::make_mat4((GLfloat*) OGL_TO_CFR_ROTATION));
+ glm::mat4 modelview(glm::make_mat4((GLfloat*)OGL_TO_CFR_ROTATION));
GLfloat ogl_matrix[16];
@@ -371,9 +390,9 @@ void LLViewerCamera::setPerspective(bool for_selection,
// however, it is also unused (the GL matricies are used for selection, (see LLCamera::sphereInFrustum())) and so i'm not
// comfortable hacking on it.
calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
- (F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f,
- (F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
- (F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f);
+ (F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f,
+ (F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
+ (F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f);
}
@@ -387,7 +406,6 @@ void LLViewerCamera::setPerspective(bool for_selection,
updateFrustumPlanes(*this);
}
-
// Uses the last GL matrices set in set_perspective to project a point from
// screen coordinates to the agent's region.
void LLViewerCamera::projectScreenToPosAgent(const S32 screen_x, const S32 screen_y, LLVector3* pos_agent) const
@@ -816,8 +834,3 @@ bool LLViewerCamera::isDefaultFOVChanged()
return false;
}
-void LLViewerCamera::updateCameraAngle(const LLSD& value)
-{
- setDefaultFOV((F32)value.asReal());
-}
-
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index a204b85d88..cb0994be0a 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -43,7 +43,6 @@ class alignas(16) LLViewerCamera : public LLCamera, public LLSimpleton<LLViewerC
LL_ALIGN_NEW
public:
LLViewerCamera();
- ~LLViewerCamera();
typedef enum
{
@@ -61,12 +60,11 @@ public:
static eCameraID sCurCameraID;
- void updateCameraLocation(const LLVector3 &center,
+ bool updateCameraLocation(const LLVector3 &center,
const LLVector3 &up_direction,
const LLVector3 &point_of_interest);
static void updateFrustumPlanes(LLCamera& camera, bool ortho = false, bool zflip = false, bool no_hacks = false);
- void updateCameraAngle(const LLSD& value);
void setPerspective(bool for_selection, S32 x, S32 y_from_bot, S32 width, S32 height, bool limit_select_distance, F32 z_near = 0, F32 z_far = 0);
const LLMatrix4 &getProjection() const;
@@ -77,12 +75,12 @@ public:
bool projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoordGL &out_point, const bool clamp = true) const;
bool projectPosAgentToScreenEdge(const LLVector3 &pos_agent, LLCoordGL &out_point) const;
+ F32 getCosHalfFov() const { return mCosHalfCameraFOV; }
+ F32 getAverageSpeed() const { return mAverageSpeed; }
+ F32 getAverageAngularSpeed() const { return mAverageAngularSpeed; }
LLVector3 getVelocityDir() const {return mVelocityDir;}
static LLTrace::CountStatHandle<>* getVelocityStat() {return &sVelocityStat; }
static LLTrace::CountStatHandle<>* getAngularVelocityStat() {return &sAngularVelocityStat; }
- F32 getCosHalfFov() {return mCosHalfCameraFOV;}
- F32 getAverageSpeed() {return mAverageSpeed ;}
- F32 getAverageAngularSpeed() {return mAverageAngularSpeed;}
void getPixelVectors(const LLVector3 &pos_agent, LLVector3 &up, LLVector3 &right);
LLVector3 roundToPixel(const LLVector3 &pos_agent);
@@ -90,21 +88,21 @@ public:
// Sets the current matrix
/* virtual */ void setView(F32 vertical_fov_rads); // NOTE: broadcasts to simulator
void setViewNoBroadcast(F32 vertical_fov_rads); // set FOV without broadcasting to simulator (for temporary local cameras)
+ F32 getDefaultFOV() const { return mCameraFOVDefault; }
void setDefaultFOV(F32 fov) ;
- F32 getDefaultFOV() { return mCameraFOVDefault; }
bool isDefaultFOVChanged();
bool cameraUnderWater() const;
bool areVertsVisible(LLViewerObject* volumep, bool all_verts);
- const LLVector3 &getPointOfInterest() { return mLastPointOfInterest; }
+ const LLVector3& getPointOfInterest() const { return mLastPointOfInterest; }
F32 getPixelMeterRatio() const { return mPixelMeterRatio; }
S32 getScreenPixelArea() const { return mScreenPixelArea; }
void setZoomParameters(F32 factor, S16 subregion) { mZoomFactor = factor; mZoomSubregion = subregion; }
- F32 getZoomFactor() { return mZoomFactor; }
- S16 getZoomSubRegion() { return mZoomSubregion; }
+ F32 getZoomFactor() const { return mZoomFactor; }
+ S16 getZoomSubRegion() const { return mZoomSubregion; }
protected:
void calcProjection(const F32 far_distance) const;
@@ -126,8 +124,6 @@ protected:
F32 mZoomFactor;
S16 mZoomSubregion;
- boost::signals2::connection mCameraAngleChangedSignal;
-
public:
};
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index 8b01c4ef88..2ca2c5c07d 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -36,6 +36,7 @@
#include "llviewerregion.h"
#include "llworld.h"
#include "llinstantmessage.h" //SYSTEM_FROM
+#include "llurlregistry.h"
// LLViewerChat
LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal;
@@ -222,6 +223,13 @@ void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg)
{
std::string tmpmsg = chat.mText;
+ // show @name instead of slurl for chat mentions
+ LLUrlMatch match;
+ while (LLUrlRegistry::instance().findUrl(tmpmsg, match, LLUrlRegistryNullCallback, false, true))
+ {
+ tmpmsg.replace(match.getStart(), match.getEnd() - match.getStart() + 1, match.getLabel());
+ }
+
if(chat.mChatStyle == CHAT_STYLE_IRC)
{
formated_msg = chat.mFromName + tmpmsg.substr(3);
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 9043a5a89e..c15fa52aa4 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -68,6 +68,8 @@
#include "llrender.h"
#include "llnavigationbar.h"
#include "llnotificationsutil.h"
+#include "llfloaterpreference.h"
+#include "llfloaterreg.h"
#include "llfloatertools.h"
#include "llpaneloutfitsinventory.h"
#include "llpanellogin.h"
@@ -150,6 +152,21 @@ static bool handleDebugAvatarJointsChanged(const LLSD& newvalue)
return true;
}
+static bool handleDebugQualityPerformanceChanged(const LLSD& newvalue)
+{
+ // control was set directly or after adjusting Preference setting, no need to update
+ if (gSavedSettings.getU32("RenderQualityPerformance") != gSavedSettings.getU32("DebugQualityPerformance"))
+ {
+ LLFloaterPreference* instance = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences");
+ if (instance)
+ {
+ gSavedSettings.setU32("RenderQualityPerformance", newvalue.asInteger());
+ instance->onChangeQuality(newvalue);
+ }
+ }
+ return true;
+}
+
static bool handleAvatarHoverOffsetChanged(const LLSD& newvalue)
{
if (isAgentAvatarValid())
@@ -448,6 +465,7 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
{
+ gPipeline.mReflectionMapManager.refreshSettings();
if (gPipeline.isInit())
{
LLPipeline::refreshCachedSettings();
@@ -460,6 +478,12 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
return true;
}
+static bool handleReflectionProbeCountChanged(const LLSD& newvalue)
+{
+ gPipeline.mReflectionMapManager.refreshSettings();
+ return true;
+}
+
#if LL_DARWIN
static bool handleAppleUseMultGLChanged(const LLSD& newvalue)
{
@@ -837,6 +861,7 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "RenderResolutionDivisor", handleRenderResolutionDivisorChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
+ setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeCount", handleReflectionProbeCountChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);
#if LL_DARWIN
setting_setup_signal_listener(gSavedSettings, "RenderAppleUseMultGL", handleAppleUseMultGLChanged);
@@ -939,6 +964,7 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "SpellCheckDictionary", handleSpellCheckChanged);
setting_setup_signal_listener(gSavedSettings, "LoginLocation", handleLoginLocationChanged);
setting_setup_signal_listener(gSavedSettings, "DebugAvatarJoints", handleDebugAvatarJointsChanged);
+ setting_setup_signal_listener(gSavedSettings, "DebugQualityPerformance", handleDebugQualityPerformanceChanged);
setting_setup_signal_listener(gSavedSettings, "TargetFPS", handleTargetFPSChanged);
setting_setup_signal_listener(gSavedSettings, "AutoTuneFPS", handleAutoTuneFPSChanged);
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 24f1be3d1c..314e32bffd 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -100,13 +100,13 @@
extern LLPointer<LLViewerTexture> gStartTexture;
extern bool gShiftFrame;
-LLPointer<LLViewerTexture> gDisconnectedImagep = NULL;
+LLPointer<LLViewerTexture> gDisconnectedImagep = nullptr;
// used to toggle renderer back on after teleport
bool gTeleportDisplay = false;
LLFrameTimer gTeleportDisplayTimer;
LLFrameTimer gTeleportArrivalTimer;
-const F32 RESTORE_GL_TIME = 5.f; // Wait this long while reloading textures before we raise the curtain
+constexpr F32 RESTORE_GL_TIME = 5.f; // Wait this long while reloading textures before we raise the curtain
bool gForceRenderLandFence = false;
bool gDisplaySwapBuffers = false;
@@ -120,9 +120,9 @@ bool gSnapshotNoPost = false;
bool gShaderProfileFrame = false;
// This is how long the sim will try to teleport you before giving up.
-const F32 TELEPORT_EXPIRY = 15.0f;
+constexpr F32 TELEPORT_EXPIRY = 15.0f;
// Additional time (in seconds) to wait per attachment
-const F32 TELEPORT_EXPIRY_PER_ATTACHMENT = 3.f;
+constexpr F32 TELEPORT_EXPIRY_PER_ATTACHMENT = 3.f;
U32 gRecentFrameCount = 0; // number of 'recent' frames
LLFrameTimer gRecentFPSTime;
@@ -130,8 +130,6 @@ LLFrameTimer gRecentMemoryTime;
LLFrameTimer gAssetStorageLogTime;
// Rendering stuff
-void pre_show_depth_buffer();
-void post_show_depth_buffer();
void render_ui(F32 zoom_factor = 1.f, int subfield = 0);
void swap();
void render_hud_attachments();
@@ -212,14 +210,19 @@ void display_update_camera()
F32 final_far = gAgentCamera.mDrawDistance;
if (gCubeSnapshot)
{
- final_far = gSavedSettings.getF32("RenderReflectionProbeDrawDistance");
+ static LLCachedControl<F32> reflection_probe_draw_distance(gSavedSettings, "RenderReflectionProbeDrawDistance", 64.f);
+ final_far = reflection_probe_draw_distance();
}
else if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode())
-
{
final_far *= 0.5f;
}
+ else if (LLViewerTexture::sDesiredDiscardBias > 2.f)
+ {
+ final_far = llmax(32.f, final_far / (LLViewerTexture::sDesiredDiscardBias - 1.f));
+ }
LLViewerCamera::getInstance()->setFar(final_far);
+ LLVOAvatar::sRenderDistance = llclamp(final_far, 16.f, 256.f);
gViewerWindow->setup3DRender();
if (!gCubeSnapshot)
@@ -233,16 +236,19 @@ void display_update_camera()
void display_stats()
{
LL_PROFILE_ZONE_SCOPED;
- const F32 FPS_LOG_FREQUENCY = 10.f;
+ constexpr F32 FPS_LOG_FREQUENCY = 10.f;
if (gRecentFPSTime.getElapsedTimeF32() >= FPS_LOG_FREQUENCY)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("DS - FPS");
+ LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecording();
+ F64 normalized_session_jitter = recording.getLastValue(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION);
+ F64 normalized_period_jitter = recording.getLastValue(LLStatViewer::NORMALIZED_FRAMTIME_JITTER_PERIOD);
F32 fps = gRecentFrameCount / FPS_LOG_FREQUENCY;
- LL_INFOS() << llformat("FPS: %.02f", fps) << LL_ENDL;
+ LL_INFOS() << llformat("FPS: %.02f SESSION JITTER: %.4f PERIOD JITTER: %.4f", fps, normalized_session_jitter, normalized_period_jitter) << LL_ENDL;
gRecentFrameCount = 0;
gRecentFPSTime.reset();
}
- F32 mem_log_freq = gSavedSettings.getF32("MemoryLogFrequency");
+ static LLCachedControl<F32> mem_log_freq(gSavedSettings, "MemoryLogFrequency", 600.f);
if (mem_log_freq > 0.f && gRecentMemoryTime.getElapsedTimeF32() >= mem_log_freq)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("DS - Memory");
@@ -252,7 +258,7 @@ void display_stats()
LLMemory::logMemoryInfo(true) ;
gRecentMemoryTime.reset();
}
- const F32 ASSET_STORAGE_LOG_FREQUENCY = 60.f;
+ constexpr F32 ASSET_STORAGE_LOG_FREQUENCY = 60.f;
if (gAssetStorageLogTime.getElapsedTimeF32() >= ASSET_STORAGE_LOG_FREQUENCY)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("DS - Asset Storage");
@@ -407,6 +413,7 @@ static void update_tp_display(bool minimized)
void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Render");
+ LL_PROFILE_GPU_ZONE("Render");
LLPerfStats::RecordSceneTime T (LLPerfStats::StatType_t::RENDER_DISPLAY); // render time capture - This is the main stat for overall rendering.
@@ -568,8 +575,10 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLImageGL::updateStats(gFrameTimeSeconds);
- LLVOAvatar::sRenderName = gSavedSettings.getS32("AvatarNameTagMode");
- LLVOAvatar::sRenderGroupTitles = (gSavedSettings.getBOOL("NameTagShowGroupTitles") && gSavedSettings.getS32("AvatarNameTagMode"));
+ static LLCachedControl<S32> avatar_name_tag_mode(gSavedSettings, "AvatarNameTagMode", 1);
+ static LLCachedControl<bool> name_tag_show_group_titles(gSavedSettings, "NameTagShowGroupTitles", true);
+ LLVOAvatar::sRenderName = avatar_name_tag_mode;
+ LLVOAvatar::sRenderGroupTitles = name_tag_show_group_titles && avatar_name_tag_mode > 0;
gPipeline.mBackfaceCull = true;
gFrameCount++;
@@ -704,11 +713,14 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
if (!gDisconnected && !LLApp::isExiting())
{
+ // =========== MIRRORS =============
+
// Render mirrors and associated hero probes before we render the rest of the scene.
// This ensures the scene state in the hero probes are exactly the same as the rest of the scene before we render it.
if (gPipeline.RenderMirrors && !gSnapshot)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Update hero probes");
+ LL_PROFILE_GPU_ZONE("hero manager")
gPipeline.mHeroProbeManager.update();
gPipeline.mHeroProbeManager.renderProbes();
}
@@ -729,12 +741,14 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
display_update_camera();
stop_glerror();
+ // =========== ENV: SKY, WATER =============
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Env Update");
// update all the sky/atmospheric/water settings
LLEnvironment::instance().update(LLViewerCamera::getInstance());
}
+ // =========== EFFECTS (?) =============
// *TODO: merge these two methods
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("HUD Update");
@@ -743,6 +757,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
stop_glerror();
}
+ // =========== GEOMETRY =============
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Update Geom");
const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds.value(); // 50 ms/second update time
@@ -773,6 +788,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLGLState::checkStates();
+ // =========== OCCLUSION =============
+
static LLCullResult result;
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater();
@@ -792,18 +809,24 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
}
gGL.setColorMask(true, true);
- glClearColor(0,0,0,0);
+ glClearColor(0.f, 0.f, 0.f, 0.f);
LLGLState::checkStates();
if (!for_snapshot)
{
- if (gFrameCount > 1 && !for_snapshot)
- { //for some reason, ATI 4800 series will error out if you
- //try to generate a shadow before the first frame is through
+
+ // =========== SHADOWS =============
+
+ S32 RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail");
+
+ if(RenderShadowDetail > 0 && gFrameCount > 1)
+ {
gPipeline.generateSunShadow(*LLViewerCamera::getInstance());
}
+ // =========== IMPOSTORS =============
+
LLVertexBuffer::unbind();
LLGLState::checkStates();
@@ -827,6 +850,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
glClear(GL_DEPTH_BUFFER_BIT);
}
+
+ // =========== IMAGES =============
+
//////////////////////////////////////
//
// Update images, using the image stats generated during object update/culling
@@ -865,6 +891,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLGLState::checkStates();
+
+ // =========== SORTING OBJECTS =============
+
///////////////////////////////////
//
// StateSort
@@ -898,6 +927,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLPipeline::sUseOcclusion = occlusion;
+
+ // =========== SKY =============
+
{
LLAppViewer::instance()->pingMainloopTimeout("Display:Sky");
LL_PROFILE_ZONE_NAMED_CATEGORY_ENVIRONMENT("update sky"); //LL_RECORD_BLOCK_TIME(FTM_UPDATE_SKY);
@@ -949,6 +981,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
// gGL.popMatrix();
//}
+
+ // =========== DEFERRED =============
+
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater();
LLGLState::checkStates();
@@ -957,10 +992,10 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
gGL.setColorMask(true, true);
- gPipeline.mRT->deferredScreen.bindTarget();
+ gPipeline.mRT->deferredScreen.bindTarget("", 1);
if (gUseWireframe)
{
- F32 g = 0.5f;
+ constexpr F32 g = 0.5f;
glClearColor(g, g, g, 1.f);
}
else
@@ -969,6 +1004,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
}
gPipeline.mRT->deferredScreen.clear();
+
+ // =========== RENDER GEOMETRY =============
+
gGL.setColorMask(true, false);
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderGeom");
@@ -979,11 +1017,16 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("display - 5")
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
- if (gSavedSettings.getBOOL("RenderDepthPrePass"))
+
+ // =========== RENDER DEPTH PREPASS (UNUSED) =============
+
+ static LLCachedControl<bool> render_depth_pre_pass(gSavedSettings, "RenderDepthPrePass", false);
+
+ if (render_depth_pre_pass)
{
gGL.setColorMask(false, false);
- static const U32 types[] = {
+ constexpr U32 types[] = {
LLRenderPass::PASS_SIMPLE,
LLRenderPass::PASS_FULLBRIGHT,
LLRenderPass::PASS_SHINY
@@ -1004,6 +1047,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
gPipeline.renderGeomDeferred(*LLViewerCamera::getInstance(), true);
}
+ // =========== UNBIND TEXTURES =============
+
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Texture Unbind");
for (S32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
@@ -1016,11 +1061,15 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
}
}
+ // =========== FLUSH =============
+
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");
LLRenderTarget &rt = (gPipeline.sRenderDeferred ? gPipeline.mRT->deferredScreen : gPipeline.mRT->screen);
rt.flush();
+ // =========== RENDER DEFERRED =============
+
if (LLPipeline::sRenderDeferred)
{
gPipeline.renderDeferredLighting();
@@ -1033,10 +1082,14 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLSceneMonitor::getInstance()->capture();
}
+ // =========== RENDER UI =============
+
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderUI");
if (!for_snapshot)
{
+ gGL.flush();
render_ui();
+ gGL.flush();
swap();
}
@@ -1047,8 +1100,6 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLAppViewer::instance()->pingMainloopTimeout("Display:FrameStats");
- stop_glerror();
-
display_stats();
LLAppViewer::instance()->pingMainloopTimeout("Display:Done");
@@ -1197,8 +1248,8 @@ void display_cube_face()
gGL.setColorMask(true, true);
- glClearColor(0, 0, 0, 0);
- gPipeline.generateSunShadow(*LLViewerCamera::getInstance());
+ glClearColor(0.f, 0.f, 0.f, 0.f);
+ //gPipeline.generateSunShadow(*LLViewerCamera::getInstance());
glClear(GL_DEPTH_BUFFER_BIT); // | GL_STENCIL_BUFFER_BIT);
@@ -1226,14 +1277,14 @@ void display_cube_face()
gGL.setColorMask(true, true);
- gPipeline.mRT->deferredScreen.bindTarget();
+ gPipeline.mRT->deferredScreen.bindTarget("", 1);
if (gUseWireframe)
{
glClearColor(0.5f, 0.5f, 0.5f, 1.f);
}
else
{
- glClearColor(1, 0, 1, 1);
+ glClearColor(1.f, 0.f, 1.f, 1.f);
}
gPipeline.mRT->deferredScreen.clear();
@@ -1274,11 +1325,12 @@ void render_hud_attachments()
{
LLPipeline::sRenderingHUDs = true;
LLCamera hud_cam = *LLViewerCamera::getInstance();
- hud_cam.setOrigin(-1.f,0,0);
- hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1));
+ hud_cam.setOrigin(-1.f, 0.f, 0.f);
+ hud_cam.setAxes(LLVector3(1.f, 0.f, 0.f), LLVector3(0.f, 1.f, 0.f), LLVector3(0.f, 0.f, 1.f));
LLViewerCamera::updateFrustumPlanes(hud_cam, true);
- bool render_particles = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) && gSavedSettings.getBOOL("RenderHUDParticles");
+ static LLCachedControl<bool> render_hud_particles(gSavedSettings, "RenderHUDParticles", false);
+ bool render_particles = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) && render_hud_particles;
//only render hud objects
gPipeline.pushRenderTypeMask();
@@ -1341,7 +1393,7 @@ void render_hud_attachments()
gPipeline.stateSort(hud_cam, result);
- gPipeline.renderGeomPostDeferred(hud_cam);
+ gPipeline.renderGeomPostDeferredOnlyHud(hud_cam);
LLSpatialGroup::sNoDelete = false;
//gPipeline.clearReferences();
@@ -1486,6 +1538,7 @@ void render_ui(F32 zoom_factor, int subfield)
{
LLGLState::checkStates();
+ gPipeline.disableLights();
LL_PROFILE_ZONE_NAMED_CATEGORY_UI("HUD");
render_hud_elements();
@@ -1505,7 +1558,8 @@ void render_ui(F32 zoom_factor, int subfield)
{
if (!gDisconnected)
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 3D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D);
+ LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 3D");
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D);
LLGLState::checkStates();
render_ui_3d();
LLGLState::checkStates();
@@ -1515,10 +1569,16 @@ void render_ui(F32 zoom_factor, int subfield)
render_disconnected_background();
}
}
+ else
+ {
+ // Make sure particle effects disappear
+ LLHUDObject::renderAllForTimer();
+ }
if (render_ui)
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 2D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D);
+ LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 2D");
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D);
LLHUDObject::renderAll();
render_ui_2d();
}
@@ -1638,10 +1698,11 @@ void render_ui_3d()
stop_glerror();
gUIProgram.bind();
- gGL.color4f(1, 1, 1, 1);
+ gGL.color4f(1.f, 1.f, 1.f, 1.f);
// Coordinate axes
- if (gSavedSettings.getBOOL("ShowAxes"))
+ static LLCachedControl<bool> show_axes(gSavedSettings, "ShowAxes");
+ if (show_axes())
{
draw_axes();
}
@@ -1661,7 +1722,7 @@ void render_ui_3d()
LLHUDObject::renderAllForTimer();
}
- stop_glerror();
+ LOG_GLERROR("render_ui_3d()");
}
void render_ui_2d()
@@ -1703,7 +1764,7 @@ void render_ui_2d()
gGL.pushMatrix();
S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);
S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2);
- gGL.scalef(LLUI::getScaleFactor().mV[0], LLUI::getScaleFactor().mV[1], 1.f);
+ gGL.scalef(LLUI::getScaleFactor().mV[VX], LLUI::getScaleFactor().mV[VY], 1.f);
gGL.translatef((F32)half_width, (F32)half_height, 0.f);
F32 zoom = gAgentCamera.mHUDCurZoom;
gGL.scalef(zoom,zoom,1.f);
@@ -1711,7 +1772,7 @@ void render_ui_2d()
gl_rect_2d(-half_width, half_height, half_width, -half_height, false);
gGL.popMatrix();
gUIProgram.unbind();
- stop_glerror();
+ LOG_GLERROR("");
}
@@ -1722,10 +1783,10 @@ void render_ui_2d()
LLView::sIsRectDirty = false;
LLRect t_rect;
- gPipeline.mUIScreen.bindTarget();
+ gPipeline.mUIScreen.bindTarget("", 1);
gGL.setColorMask(true, true);
{
- static const S32 pad = 8;
+ constexpr S32 pad = 8;
LLView::sDirtyRect.mLeft -= pad;
LLView::sDirtyRect.mRight += pad;
@@ -1778,17 +1839,17 @@ void render_ui_2d()
gViewerWindow->draw();
}
-
-
// reset current origin for font rendering, in case of tiling render
LLFontGL::sCurOrigin.set(0, 0);
+
+ LOG_GLERROR("render_ui_2d()");
}
void render_disconnected_background()
{
gUIProgram.bind();
- gGL.color4f(1,1,1,1);
+ gGL.color4f(1.f, 1.f, 1.f, 1.f);
if (!gDisconnectedImagep && gDisconnected)
{
LL_INFOS() << "Loading last bitmap..." << LL_ENDL;
@@ -1828,7 +1889,7 @@ void render_disconnected_background()
raw->expandToPowerOfTwo();
- gDisconnectedImagep = LLViewerTextureManager::getLocalTexture(raw.get(), false );
+ gDisconnectedImagep = LLViewerTextureManager::getLocalTexture(raw.get(), false);
gStartTexture = gDisconnectedImagep;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
@@ -1863,6 +1924,5 @@ void render_disconnected_background()
void display_cleanup()
{
- gDisconnectedImagep = NULL;
+ gDisconnectedImagep = nullptr;
}
-
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index caaf3e8fd8..b65ad3b3ec 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -21,6 +21,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -38,8 +39,8 @@
#include "llfloateraddpaymentmethod.h"
#include "llfloaterauction.h"
#include "llfloaterautoreplacesettings.h"
-#include "llfloateravatar.h"
#include "llfloateravatarpicker.h"
+#include "llfloateravatarwelcomepack.h"
#include "llfloateravatarrendersettings.h"
#include "llfloateravatartextures.h"
#include "llfloaterbanduration.h"
@@ -58,6 +59,7 @@
#include "llfloatercamera.h"
#include "llfloatercamerapresets.h"
#include "llfloaterchangeitemthumbnail.h"
+#include "llfloaterchatmentionpicker.h"
#include "llfloaterchatvoicevolume.h"
#include "llfloaterclassified.h"
#include "llfloaterconversationlog.h"
@@ -98,6 +100,7 @@
#include "llfloaterlinkreplace.h"
#include "llfloaterloadprefpreset.h"
#include "llfloatermap.h"
+#include "llfloatermarketplace.h"
#include "llfloatermarketplacelistings.h"
#include "llfloatermediasettings.h"
#include "llfloatermemleak.h"
@@ -334,8 +337,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAssociateListing>);
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
- LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
+ LLFloaterReg::add("avatar_welcome_pack", "floater_avatar_welcome_pack.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarWelcomePack>);
LLFloaterReg::add("avatar_render_settings", "floater_avatar_render_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarRenderSettings>);
LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>);
@@ -357,6 +360,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("chat_voice", "floater_voice_chat_volume.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatVoiceVolume>);
LLFloaterReg::add("change_item_thumbnail", "floater_change_item_thumbnail.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChangeItemThumbnail>);
LLFloaterReg::add("nearby_chat", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterIMNearbyChat::buildFloater);
+ LLFloaterReg::add("chat_mention_picker", "floater_chat_mention_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatMentionPicker>);
LLFloaterReg::add("classified", "floater_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterClassified>);
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
LLFloaterReg::add("conversation", "floater_conversation_log.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterConversationLog>);
@@ -424,6 +428,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/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index e2022cae37..ec5381ddfc 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -71,6 +71,9 @@
#include "llclipboard.h"
#include "llhttpretrypolicy.h"
#include "llsettingsvo.h"
+#include "llinventorylistener.h"
+
+LLInventoryListener sInventoryListener;
// do-nothing ops for use in callbacks.
void no_op_inventory_func(const LLUUID&) {}
@@ -416,7 +419,9 @@ void LLViewerInventoryItem::updateServer(bool is_new) const
<< LL_ENDL;
return;
}
- if(gAgent.getID() != mPermissions.getOwner())
+ LLUUID owner = mPermissions.getOwner();
+ if(gAgent.getID() != owner
+ && owner.notNull()) // incomplete?
{
// *FIX: deal with this better.
LL_WARNS(LOG_INV) << "LLViewerInventoryItem::updateServer() - for unowned item "
@@ -751,27 +756,30 @@ S32 LLViewerInventoryCategory::getViewerDescendentCount() const
return descendents_actual;
}
-LLSD LLViewerInventoryCategory::exportLLSD() const
+void LLViewerInventoryCategory::exportLLSD(LLSD & cat_data) const
{
- LLSD cat_data = LLInventoryCategory::exportLLSD();
+ LLInventoryCategory::exportLLSD(cat_data);
cat_data[INV_OWNER_ID] = mOwnerID;
cat_data[INV_VERSION] = mVersion;
-
- return cat_data;
}
-bool LLViewerInventoryCategory::importLLSD(const LLSD& cat_data)
+bool LLViewerInventoryCategory::importLLSD(const std::string& label, const LLSD& value)
{
- LLInventoryCategory::importLLSD(cat_data);
- if (cat_data.has(INV_OWNER_ID))
+ if (LLInventoryCategory::importLLSD(label, value))
{
- mOwnerID = cat_data[INV_OWNER_ID].asUUID();
+ return true;
}
- if (cat_data.has(INV_VERSION))
+ else if (label == INV_OWNER_ID)
{
- setVersion(cat_data[INV_VERSION].asInteger());
+ mOwnerID = value.asUUID();
+ return true;
}
- return true;
+ else if (label == INV_VERSION)
+ {
+ setVersion(value.asInteger());
+ return true;
+ }
+ return false;
}
bool LLViewerInventoryCategory::acceptItem(LLInventoryItem* inv_item)
@@ -966,7 +974,7 @@ void LLInventoryCallbackManager::fire(U32 callback_id, const LLUUID& item_id)
}
}
-void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp)
+void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp, bool replace)
{
if (inv_item.isNull())
return;
@@ -974,7 +982,7 @@ void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachme
LLViewerInventoryItem *item = gInventory.getItem(inv_item);
if (item)
{
- rez_attachment(item, attachmentp);
+ rez_attachment(item, attachmentp, replace);
}
}
@@ -1436,7 +1444,8 @@ void update_inventory_category(
if(obj)
{
if (LLFolderType::lookupIsProtectedType(obj->getPreferredType())
- && (updates.size() != 1 || !updates.has("thumbnail")))
+ && (updates.size() != 1
+ || !(updates.has("thumbnail") || updates.has("favorite"))))
{
LLNotificationsUtil::add("CannotModifyProtectedCategories");
return;
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 21a6606253..0dfbf0cced 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -232,8 +232,8 @@ public:
// How many descendents do we currently have information for in the InventoryModel?
S32 getViewerDescendentCount() const;
- LLSD exportLLSD() const;
- bool importLLSD(const LLSD& cat_data);
+ virtual void exportLLSD(LLSD &sd) const;
+ virtual bool importLLSD(const std::string& label, const LLSD& value);
void determineFolderType();
void changeType(LLFolderType::EType new_folder_type);
@@ -264,7 +264,7 @@ public:
class LLViewerJointAttachment;
-void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp);
+void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp, bool replace);
void activate_gesture_cb(const LLUUID& inv_item);
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index 7543fb3743..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);
@@ -881,6 +881,10 @@ void LLViewerJoystick::moveObjects(bool reset)
{
gAgent.clearAFK();
}
+ else
+ {
+ gAwayTriggerTimer.reset();
+ }
if (sDelta[0] || sDelta[1] || sDelta[2])
{
@@ -1055,6 +1059,10 @@ void LLViewerJoystick::moveAvatar(bool reset)
{
gAgent.clearAFK();
}
+ else
+ {
+ gAwayTriggerTimer.reset();
+ }
setCameraNeedsUpdate(true);
}
@@ -1267,10 +1275,17 @@ void LLViewerJoystick::moveFlycam(bool reset)
}
// Clear AFK state if moved beyond the deadzone
- if (!is_zero && gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
+ if (!is_zero)
+ {
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
}
+ else
+ {
+ gAwayTriggerTimer.reset();
+ }
+ }
sFlycamPosition += LLVector3(sDelta) * sFlycamRotation;
@@ -1331,6 +1346,10 @@ bool LLViewerJoystick::toggleFlycam()
{
gAgent.clearAFK();
}
+ else
+ {
+ gAwayTriggerTimer.reset();
+ }
mOverrideCamera = !mOverrideCamera;
if (mOverrideCamera)
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 569924298f..77ec31fd9d 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -83,6 +83,8 @@ extern bool gCubeSnapshot;
// *TODO: Consider enabling mipmaps (they have been disabled for a long time). Likely has a significant performance impact for tiled/high texture repeat media. Mip generation in a shader may also be an option if necessary.
constexpr bool USE_MIPMAPS = false;
+constexpr S32 MAX_MEDIA_INSTANCES_DEFAULT = 8;
+constexpr S32 MEDIA_INSTANCES_MIN_LIMIT = 6; // 4 'permanent' floaters plus reserve for dynamic ones
void init_threaded_picker_load_dialog(LLPluginClassMedia* plugin, LLFilePicker::ELoadFilter filter, bool get_multiple)
{
@@ -214,6 +216,7 @@ static bool sViewerMediaMuteListObserverInitialized = false;
LLViewerMedia::LLViewerMedia():
mAnyMediaShowing(false),
mAnyMediaPlaying(false),
+mMaxIntances(MAX_MEDIA_INSTANCES_DEFAULT),
mSpareBrowserMediaSource(NULL)
{
}
@@ -222,6 +225,7 @@ LLViewerMedia::~LLViewerMedia()
{
gIdleCallbacks.deleteFunction(LLViewerMedia::onIdle, NULL);
mTeleportFinishConnection.disconnect();
+ mMaxInstancesConnection.disconnect();
if (mSpareBrowserMediaSource != NULL)
{
delete mSpareBrowserMediaSource;
@@ -235,6 +239,35 @@ void LLViewerMedia::initSingleton()
gIdleCallbacks.addFunction(LLViewerMedia::onIdle, NULL);
mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
setTeleportFinishedCallback(boost::bind(&LLViewerMedia::onTeleportFinished, this));
+
+ LLControlVariable* ctrl = gSavedSettings.getControl("PluginInstancesTotal");
+ if (ctrl)
+ {
+ setMaxInstances(ctrl->getValue().asInteger());
+ mMaxInstancesConnection = ctrl->getSignal()->connect([this](LLControlVariable* control, const LLSD& new_val, const LLSD& old_val)
+ {
+ setMaxInstances(new_val.asInteger());
+ });
+ }
+ else
+ {
+ setMaxInstances(MAX_MEDIA_INSTANCES_DEFAULT);
+ }
+}
+
+void LLViewerMedia::setMaxInstances(S32 max_instances)
+{
+ const F32Gigabytes MIN_PHYSICAL_MEMORY(8);
+ LLMemory::updateMemoryInfo();
+ F32Gigabytes physical_mem = LLMemory::getMaxMemKB();
+ if (MIN_PHYSICAL_MEMORY > physical_mem)
+ {
+ mMaxIntances = llmax(max_instances - 2, MEDIA_INSTANCES_MIN_LIMIT);
+ }
+ else
+ {
+ mMaxIntances = llmax(max_instances, MEDIA_INSTANCES_MIN_LIMIT);
+ }
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -397,7 +430,7 @@ std::string LLViewerMedia::getCurrentUserAgent()
// This was also helpful:
// http://www.mozilla.org/build/revised-user-agent-strings.html
std::ostringstream codec;
- codec << "Megapahit/";
+ codec << "SecondLife/";
codec << LLVersionInfo::instance().getVersion();
codec << " (" << channel << "; " << skin_name << " skin)";
LL_INFOS() << codec.str() << LL_ENDL;
@@ -688,7 +721,6 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
static LLCachedControl<bool> inworld_media_enabled(gSavedSettings, "AudioStreamingMedia", true);
static LLCachedControl<bool> inworld_audio_enabled(gSavedSettings, "AudioStreamingMusic", true);
- static LLCachedControl<U32> max_instances(gSavedSettings, "PluginInstancesTotal", 8);
static LLCachedControl<U32> max_normal(gSavedSettings, "PluginInstancesNormal", 2);
static LLCachedControl<U32> max_low(gSavedSettings, "PluginInstancesLow", 4);
static LLCachedControl<F32> max_cpu(gSavedSettings, "PluginInstancesCPULimit", 0.9);
@@ -709,7 +741,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances))
+ if(pimpl->isForcedUnloaded() || (impl_count_total >= mMaxIntances))
{
// Never load muted or failed impls.
// Hard limit on the number of instances that will be loaded at one time
@@ -869,7 +901,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
sLowestLoadableImplInterest = 0.0f;
// Only do this calculation if we've hit the impl count limit -- up until that point we always need to load media data.
- if(lowest_interest_loadable && (impl_count_total >= (int)max_instances))
+ if(lowest_interest_loadable && (impl_count_total >= mMaxIntances))
{
// Get the interest value of this impl's object for use by isInterestingEnough
LLVOVolume *object = lowest_interest_loadable->getSomeObject();
@@ -1201,6 +1233,54 @@ LLCore::HttpHeaders::ptr_t LLViewerMedia::getHttpHeaders()
return headers;
}
+bool LLViewerMedia::getOpenIDCookie(LLMediaCtrl* media_instance) const
+{
+ if (mOpenIDCookie.empty())
+ {
+ return false;
+ }
+
+ std::string authority = mOpenIDURL.mAuthority;
+ std::string::size_type hostStart = authority.find('@');
+ if (hostStart == std::string::npos)
+ {
+ // no username/password
+ hostStart = 0;
+ }
+ else
+ {
+ // Hostname starts after the @.
+ // (If the hostname part is empty, this may put host_start at the end of the string. In that case, it will end up passing through an empty hostname, which is correct.)
+ ++hostStart;
+ }
+ std::string::size_type hostEnd = authority.rfind(':');
+ if ((hostEnd == std::string::npos) || (hostEnd < hostStart))
+ {
+ // no port
+ hostEnd = authority.size();
+ }
+
+ std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart);
+ std::string cookie_name = "";
+ std::string cookie_value = "";
+ std::string cookie_path = "";
+ bool httponly = true;
+ bool secure = true;
+ if (!parseRawCookie(mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure))
+ {
+ return false;
+ }
+ std::string cefUrl(std::string(mOpenIDURL.mURI) + "://" + std::string(mOpenIDURL.mAuthority));
+ if (media_instance && media_instance->getMediaPlugin())
+ {
+ media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
+ cookie_path, httponly, secure);
+
+ media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
+ cookie_host, cookie_path, httponly, secure);
+ }
+ return true;
+}
/////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMedia::setOpenIDCookie(const std::string& url)
@@ -1259,35 +1339,50 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
{
LLAppViewer::instance()->postToMainCoro([=]()
{
- LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
- if (media_instance)
+ std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart);
+ std::string cookie_name = "";
+ std::string cookie_value = "";
+ std::string cookie_path = "";
+ bool httponly = true;
+ bool secure = true;
+
+ LLViewerMedia* inst = getInstance();
+ if (parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure))
{
- LLViewerMedia* inst = getInstance();
- std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart);
- std::string cookie_name = "";
- std::string cookie_value = "";
- std::string cookie_path = "";
- bool httponly = true;
- bool secure = true;
- if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) &&
- media_instance->getMediaPlugin())
+ // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
+ // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
+ // For now, we use the URL for the OpenID POST request since it will have the same authority
+ // as the domain field.
+ // (Feels like there must be a less dirty way to construct a URL from component LLURL parts)
+ // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further
+ // down.
+ std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority));
+
+ // list of floater names and webbrowser therein to set the cookie that arrived via login into
+ struct MediaCookieInstance {
+ std::string floater_name;
+ std::string browser_name;
+ };
+ struct MediaCookieInstance media_cookie_instances[] = {
+ {"search", "webbrowser" },
+ {"marketplace", "webbrowser" },
+ {"destinations", "destination_guide_contents" },
+ };
+ for (MediaCookieInstance mci : media_cookie_instances)
{
- // 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);
+ LLFloater *floaterp = LLFloaterReg::findInstance(mci.floater_name);
+ if (floaterp)
+ {
+ LLMediaCtrl* media_instance = floaterp->getChild<LLMediaCtrl>(mci.browser_name);
+ if (media_instance && media_instance->getMediaPlugin())
+ {
+ media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
+ cookie_path, httponly, secure);
+
+ media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
+ cookie_host, cookie_path, httponly, secure);
+ }
+ }
}
}
});
@@ -3007,7 +3102,10 @@ void LLViewerMediaImpl::doMediaTexUpdate(LLViewerMediaTexture* media_tex, U8* da
// -Cosmic,2023-04-04
// Allocate GL texture based on LLImageRaw but do NOT copy to GL
LLGLuint tex_name = 0;
- media_tex->createGLTexture(0, raw, 0, true, LLGLTexture::OTHER, true, &tex_name);
+ if (!media_tex->createGLTexture(0, raw, 0, true, LLGLTexture::OTHER, true, &tex_name))
+ {
+ LL_WARNS("Media") << "Failed to create media texture" << LL_ENDL;
+ }
// copy just the subimage covered by the image raw to GL
media_tex->setSubImage(data, data_width, data_height, x_pos, y_pos, width, height, tex_name);
@@ -3076,7 +3174,10 @@ LLViewerMediaTexture* LLViewerMediaImpl::updateMediaImage()
mMediaSource->getTextureFormatSwapBytes());
int discard_level = 0;
- media_tex->createGLTexture(discard_level, raw);
+ if (!media_tex->createGLTexture(discard_level, raw))
+ {
+ LL_WARNS("Media") << "Failed to create media texture" << LL_ENDL;
+ }
// MEDIAOPT: set this dynamically on play/stop
// FIXME
@@ -3517,6 +3618,46 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
////////////////////////////////////////////////////////////////////////////////
// virtual
void
+LLViewerMediaImpl::undo()
+{
+ if (mMediaSource)
+ mMediaSource->undo();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+bool
+LLViewerMediaImpl::canUndo() const
+{
+ if (mMediaSource)
+ return mMediaSource->canUndo();
+ else
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void
+LLViewerMediaImpl::redo()
+{
+ if (mMediaSource)
+ mMediaSource->redo();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+bool
+LLViewerMediaImpl::canRedo() const
+{
+ if (mMediaSource)
+ return mMediaSource->canRedo();
+ else
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void
LLViewerMediaImpl::cut()
{
if (mMediaSource)
@@ -3574,6 +3715,46 @@ LLViewerMediaImpl::canPaste() const
return false;
}
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void
+LLViewerMediaImpl::doDelete()
+{
+ if (mMediaSource)
+ mMediaSource->doDelete();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+bool
+LLViewerMediaImpl::canDoDelete() const
+{
+ if (mMediaSource)
+ return mMediaSource->canDoDelete();
+ else
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void
+LLViewerMediaImpl::selectAll()
+{
+ if (mMediaSource)
+ mMediaSource->selectAll();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+bool
+LLViewerMediaImpl::canSelectAll() const
+{
+ if (mMediaSource)
+ return mMediaSource->canSelectAll();
+ else
+ return FALSE;
+}
+
void LLViewerMediaImpl::setUpdated(bool updated)
{
mIsUpdated = updated ;
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 5753615a43..1fc5bbc9e0 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -69,6 +69,7 @@ private:
};
class LLViewerMediaImpl;
+class LLMediaCtrl;
class LLViewerMedia: public LLSingleton<LLViewerMedia>
{
@@ -162,22 +163,26 @@ public:
LLSD getHeaders();
LLCore::HttpHeaders::ptr_t getHttpHeaders();
+ bool getOpenIDCookie(LLMediaCtrl* media_instance) const;
private:
void onAuthSubmit(const LLSD& notification, const LLSD& response);
- bool parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path, bool& httponly, bool& secure);
+ static bool parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path, bool& httponly, bool& secure);
void setOpenIDCookie(const std::string& url);
void onTeleportFinished();
static void openIDSetupCoro(std::string openidUrl, std::string openidToken);
static void getOpenIDCookieCoro(std::string url);
+ void setMaxInstances(S32 max_instances);
bool mAnyMediaShowing;
bool mAnyMediaPlaying;
+ S32 mMaxIntances = 8;
LLURL mOpenIDURL;
std::string mOpenIDCookie;
LLPluginClassMedia* mSpareBrowserMediaSource;
boost::signals2::connection mTeleportFinishConnection;
+ boost::signals2::connection mMaxInstancesConnection;
};
// Implementation functions not exported into header file
@@ -341,6 +346,12 @@ public:
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent);
// LLEditMenuHandler overrides
+ /*virtual*/ void undo();
+ /*virtual*/ bool canUndo() const;
+
+ /*virtual*/ void redo();
+ /*virtual*/ bool canRedo() const;
+
/*virtual*/ void cut();
/*virtual*/ bool canCut() const;
@@ -350,6 +361,12 @@ public:
/*virtual*/ void paste();
/*virtual*/ bool canPaste() const;
+ /*virtual*/ void doDelete();
+ /*virtual*/ bool canDoDelete() const;
+
+ /*virtual*/ void selectAll();
+ /*virtual*/ bool canSelectAll() const;
+
void addObject(LLVOVolume* obj) ;
void removeObject(LLVOVolume* obj) ;
const std::list< LLVOVolume* >* getObjectList() const ;
diff --git a/indra/newview/llviewermedia_streamingaudio.cpp b/indra/newview/llviewermedia_streamingaudio.cpp
index 21f5ba64d7..959de38364 100644
--- a/indra/newview/llviewermedia_streamingaudio.cpp
+++ b/indra/newview/llviewermedia_streamingaudio.cpp
@@ -61,13 +61,26 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url)
if(!mMediaPlugin)
return;
- if (!url.empty()) {
+ if (!url.empty())
+ {
LL_INFOS() << "Starting internet stream: " << url << LL_ENDL;
- mURL = url;
- mMediaPlugin->loadURI ( url );
+
+ mURL = url; // keep original url here for comparison purposes
+ std::string snt_url = url;
+ LLStringUtil::trim(snt_url);
+ size_t pos = snt_url.find(' ');
+ if (pos != std::string::npos)
+ {
+ // fmod permited having names after the url and people were using it.
+ // People label their streams this way, ignore the 'label'.
+ snt_url = snt_url.substr(0, pos);
+ }
+ mMediaPlugin->loadURI(snt_url);
mMediaPlugin->start();
LL_INFOS() << "Playing stream..." << LL_ENDL;
- } else {
+ }
+ else
+ {
LL_INFOS() << "setting stream to NULL"<< LL_ENDL;
mURL.clear();
mMediaPlugin->stop();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 63527d8594..374a2ae075 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -90,6 +90,7 @@
#include "lltoolface.h"
#include "llhints.h"
#include "llhudeffecttrail.h"
+#include "llhudeffectresetskeleton.h"
#include "llhudmanager.h"
#include "llimview.h"
#include "llinventorybridge.h"
@@ -295,6 +296,7 @@ void force_error_coroutine_crash();
void force_error_coroprocedure_crash();
void force_error_work_queue_crash();
void force_error_thread_crash();
+void force_exception_thread_crash();
void handle_force_delete();
void print_object_info();
@@ -1852,7 +1854,6 @@ class LLAdvancedAppearanceToXML : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- std::string emptyname;
LLViewerObject *obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
LLVOAvatar *avatar = NULL;
if (obj)
@@ -1879,7 +1880,7 @@ class LLAdvancedAppearanceToXML : public view_listener_t
}
if (avatar)
{
- avatar->dumpArchetypeXML(emptyname);
+ avatar->dumpArchetypeXML(LLStringUtil::null);
}
return true;
}
@@ -2676,6 +2677,15 @@ class LLAdvancedForceErrorThreadCrash : public view_listener_t
}
};
+class LLAdvancedForceExceptionThreadCrash : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ force_exception_thread_crash();
+ return true;
+ }
+};
+
class LLAdvancedForceErrorDisconnectViewer : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -4357,13 +4367,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
@@ -4506,7 +4509,7 @@ void handle_object_sit(LLViewerObject* object, const LLVector3& offset)
{
// get object selection offset
- if (object && object->getPCode() == LL_PCODE_VOLUME)
+ if (gAgent.isAllowedToSit() && object && object->getPCode() == LL_PCODE_VOLUME)
{
gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
@@ -5647,6 +5650,38 @@ class LLToolsEnablePathfindingRebakeRegion : public view_listener_t
}
};
+class LLToolsCheckSelectionLODMode : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string param = userdata.asString();
+ static LLCachedControl<S32> debug_selection_lods(gSavedSettings, "DebugSelectionLODs", 0);
+ if ("default" == param)
+ {
+ return debug_selection_lods() < 0;
+ }
+ else if ("high" == param)
+ {
+ return debug_selection_lods() == 3;
+ }
+ else if ("medium" == param)
+ {
+ return debug_selection_lods() == 2;
+ }
+ else if ("low" == param)
+ {
+ return debug_selection_lods() == 1;
+ }
+ else if ("lowest" == param)
+ {
+ return debug_selection_lods() == 0;
+ }
+
+ return false;
+ }
+};
+
+
// Round the position of all root objects to the grid
class LLToolsSnapObjectXY : public view_listener_t
{
@@ -6490,13 +6525,13 @@ void handle_look_at_selection(const LLSD& param)
}
}
-void handle_zoom_to_object(const LLUUID& object_id)
+bool handle_zoom_to_object(const LLUUID& object_id)
{
const F32 PADDING_FACTOR = 2.f;
LLViewerObject* object = gObjectList.findObject(object_id);
- if (object)
+ if (object && object->isReachable())
{
gAgentCamera.setFocusOnAvatar(false, ANIMATE);
@@ -6508,12 +6543,14 @@ void handle_zoom_to_object(const LLUUID& object_id)
obj_to_cam.normVec();
- LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
+ LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
- gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
+ gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
object_center_global,
object_id );
+ return true;
}
+ return false;
}
void handle_teleport_to_object(LLUUID object_id)
@@ -6673,8 +6710,18 @@ class LLAvatarResetSkeleton : public view_listener_t
{
if (LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()))
{
+ if(avatar->getID() == gAgentID)
+ {
+ LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true);
+ effectp->setSourceObject(gAgentAvatarp);
+ effectp->setTargetObject((LLViewerObject*)avatar);
+ effectp->setResetAnimations(false);
+ }
+ else
+ {
avatar->resetSkeleton(false);
}
+ }
return true;
}
};
@@ -6697,8 +6744,18 @@ class LLAvatarResetSkeletonAndAnimations : public view_listener_t
{
if (LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()))
{
+ if(avatar->getID() == gAgentID)
+ {
+ LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true);
+ effectp->setSourceObject(gAgentAvatarp);
+ effectp->setTargetObject((LLViewerObject*)avatar);
+ effectp->setResetAnimations(true);
+ }
+ else
+ {
avatar->resetSkeleton(true);
}
+ }
return true;
}
};
@@ -6725,11 +6782,24 @@ class LLAvatarResetSelfSkeletonAndAnimations : public view_listener_t
{
if (LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()))
{
- avatar->resetSkeleton(true);
+ if(avatar->getID() == gAgentID)
+ {
+ LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true);
+ effectp->setSourceObject(gAgentAvatarp);
+ effectp->setTargetObject((LLViewerObject*)avatar);
+ effectp->setResetAnimations(true);
+ }
+ else
+ {
+ avatar->resetSkeleton(true);
+ }
}
else
{
- gAgentAvatarp->resetSkeleton(true);
+ LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true);
+ effectp->setSourceObject(gAgentAvatarp);
+ effectp->setTargetObject(gAgentAvatarp);
+ effectp->setResetAnimations(true);
}
return true;
}
@@ -7700,6 +7770,7 @@ bool enable_detach(const LLSD&)
// Only enable detach if all faces of object are selected
if (!object ||
!object->isAttachment() ||
+ object->isLocked() ||
!LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES ))
{
return false;
@@ -8575,6 +8646,36 @@ class LLToolsSelectBySurrounding : public view_listener_t
}
};
+class LLToolsSelectionLODMode : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string param = userdata.asString();
+ if ("default" == param)
+ {
+ gSavedSettings.setS32("DebugSelectionLODs", -1);
+ }
+ else if ("high" == param)
+ {
+ gSavedSettings.setS32("DebugSelectionLODs", 3);
+ }
+ else if ("medium" == param)
+ {
+ gSavedSettings.setS32("DebugSelectionLODs", 2);
+ }
+ else if ("low" == param)
+ {
+ gSavedSettings.setS32("DebugSelectionLODs", 1);
+ }
+ else if ("lowest" == param)
+ {
+ gSavedSettings.setS32("DebugSelectionLODs", 0);
+ }
+
+ return true;
+ }
+};
+
class LLToolsShowHiddenSelection : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -8813,6 +8914,11 @@ void force_error_thread_crash()
LLAppViewer::instance()->forceErrorThreadCrash();
}
+void force_exception_thread_crash()
+{
+ LLAppViewer::instance()->forceExceptionThreadCrash();
+}
+
class LLToolsUseSelectionForGrid : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -9809,6 +9915,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsSelectInvisibleObjects(), "Tools.SelectInvisibleObjects");
view_listener_t::addMenu(new LLToolsSelectReflectionProbes(), "Tools.SelectReflectionProbes");
view_listener_t::addMenu(new LLToolsSelectBySurrounding(), "Tools.SelectBySurrounding");
+ view_listener_t::addMenu(new LLToolsSelectionLODMode(), "Tools.SelectionLODMode");
view_listener_t::addMenu(new LLToolsShowHiddenSelection(), "Tools.ShowHiddenSelection");
view_listener_t::addMenu(new LLToolsShowSelectionLightRadius(), "Tools.ShowSelectionLightRadius");
view_listener_t::addMenu(new LLToolsEditLinkedParts(), "Tools.EditLinkedParts");
@@ -9841,6 +9948,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsEnablePathfindingView(), "Tools.EnablePathfindingView");
view_listener_t::addMenu(new LLToolsDoPathfindingRebakeRegion(), "Tools.DoPathfindingRebakeRegion");
view_listener_t::addMenu(new LLToolsEnablePathfindingRebakeRegion(), "Tools.EnablePathfindingRebakeRegion");
+ view_listener_t::addMenu(new LLToolsCheckSelectionLODMode(), "Tools.ToolsCheckSelectionLODMode");
// Help menu
// most items use the ShowFloater method
@@ -10018,6 +10126,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedForceErrorCoroprocedureCrash(), "Advanced.ForceErrorCoroprocedureCrash");
view_listener_t::addMenu(new LLAdvancedForceErrorWorkQueueCrash(), "Advanced.ForceErrorWorkQueueCrash");
view_listener_t::addMenu(new LLAdvancedForceErrorThreadCrash(), "Advanced.ForceErrorThreadCrash");
+ view_listener_t::addMenu(new LLAdvancedForceExceptionThreadCrash(), "Advanced.ForceExceptionThreadCrash");
view_listener_t::addMenu(new LLAdvancedForceErrorDisconnectViewer(), "Advanced.ForceErrorDisconnectViewer");
// Advanced (toplevel)
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 68ba740f67..6c9d56cffb 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -73,7 +73,7 @@ void handle_buy();
void handle_take(bool take_separate = false);
void handle_take_copy();
void handle_look_at_selection(const LLSD& param);
-void handle_zoom_to_object(const LLUUID& object_id);
+bool handle_zoom_to_object(const LLUUID& object_id);
void handle_teleport_to_object(LLUUID object_id);
void handle_object_return();
void handle_object_delete();
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index ce66dbc03f..801ff3c212 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -69,6 +69,7 @@
#include "llviewerassetupload.h"
// linden libraries
+#include "llfilesystem.h"
#include "llnotificationsutil.h"
#include "llsdserialize.h"
#include "llsdutil.h"
@@ -94,7 +95,7 @@ class LLFileEnableUploadModel : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) LLFloaterReg::findInstance("upload_model");
- if (fmp && fmp->isModelLoading())
+ if (fmp && !fmp->isDead() && fmp->isModelLoading())
{
return false;
}
@@ -478,13 +479,19 @@ const bool check_file_extension(const std::string& filename, LLFilePicker::ELoad
return true;
}
-const void upload_single_file(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type)
+void upload_single_file(
+ const std::vector<std::string>& filenames,
+ LLFilePicker::ELoadFilter type,
+ const LLUUID& dest)
{
std::string filename = filenames[0];
if (!check_file_extension(filename, type)) return;
if (!filename.empty())
{
+ LLSD args;
+ args["filename"] = filename;
+ args["dest"] = dest;
if (type == LLFilePicker::FFLOAD_WAV)
{
// pre-qualify wavs to make sure the format is acceptable
@@ -499,12 +506,12 @@ const void upload_single_file(const std::vector<std::string>& filenames, LLFileP
}
else
{
- LLFloaterReg::showInstance("upload_sound", LLSD(filename));
+ LLFloaterReg::showInstance("upload_sound", args);
}
}
if (type == LLFilePicker::FFLOAD_IMAGE)
{
- LLFloaterReg::showInstance("upload_image", LLSD(filename));
+ LLFloaterReg::showInstance("upload_image", args);
}
if (type == LLFilePicker::FFLOAD_ANIM)
{
@@ -512,11 +519,11 @@ const void upload_single_file(const std::vector<std::string>& filenames, LLFileP
LLStringUtil::toLower(filename_lc);
if (filename_lc.rfind(".anim") != std::string::npos)
{
- LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
+ LLFloaterReg::showInstance("upload_anim_anim", args);
}
else
{
- LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
+ LLFloaterReg::showInstance("upload_anim_bvh", args);
}
}
}
@@ -544,16 +551,9 @@ void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k)
if (LLResourceUploadInfo::findAssetTypeAndCodecOfExtension(ext, asset_type, codec))
{
bool resource_upload = false;
- if (asset_type == LLAssetType::AT_TEXTURE && allow_2k)
+ if (asset_type == LLAssetType::AT_TEXTURE)
{
- LLPointer<LLImageFormatted> image_frmted = LLImageFormatted::createFromType(codec);
- if (gDirUtilp->fileExists(filename) && image_frmted && image_frmted->load(filename))
- {
- S32 biased_width = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getWidth(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
- S32 biased_height = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getHeight(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
- expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(biased_width, biased_height);
- resource_upload = true;
- }
+ resource_upload = true;
}
else if (LLAgentBenefitsMgr::current().findUploadCost(asset_type, expected_upload_cost))
{
@@ -562,23 +562,115 @@ void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k)
if (resource_upload)
{
- LLNewFileResourceUploadInfo* info_p = new LLNewFileResourceUploadInfo(
- filename,
- asset_name,
- asset_name, 0,
- LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms("Uploads"),
- LLFloaterPerms::getGroupPerms("Uploads"),
- LLFloaterPerms::getEveryonePerms("Uploads"),
- expected_upload_cost);
-
- if (!allow_2k)
+ if (asset_type == LLAssetType::AT_TEXTURE)
{
- info_p->setMaxImageSize(1024);
- }
- LLResourceUploadInfo::ptr_t uploadInfo(info_p);
+ std::string exten = gDirUtilp->getExtension(filename);
+ U32 codec = LLImageBase::getCodecFromExtension(exten);
+
+ // Load the image
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
+ if (image.isNull())
+ {
+ LL_WARNS() << "Failed to create image container for " << filename << LL_ENDL;
+ continue;
+ }
+ if (!image->load(filename))
+ {
+ LL_WARNS() << "Failed to load image: " << filename << LL_ENDL;
+ continue;
+ }
+ // Decompress or expand it in a raw image structure
+ LLPointer<LLImageRaw> raw_image = new LLImageRaw;
+ if (!image->decode(raw_image, 0.0f))
+ {
+ LL_WARNS() << "Failed to decode image: " << filename << LL_ENDL;
+ continue;
+ }
+ // Check the image constraints
+ if ((image->getComponents() != 3) && (image->getComponents() != 4))
+ {
+ LL_WARNS() << "Attempted to upload a texture that has " << image->getComponents()
+ << " components, but only 3 (RGB) or 4 (RGBA) are allowed." << LL_ENDL;
+ continue;
+ }
+ // Downscale images to fit the max_texture_dimensions_*, or 1024 if allow_2k is false
+ S32 max_width = allow_2k ? gSavedSettings.getS32("max_texture_dimension_X") : 1024;
+ S32 max_height = allow_2k ? gSavedSettings.getS32("max_texture_dimension_Y") : 1024;
+
+ S32 orig_width = raw_image->getWidth();
+ S32 orig_height = raw_image->getHeight();
+
+ if (orig_width > max_width || orig_height > max_height)
+ {
+ // Calculate scale factors
+ F32 width_scale = (F32)max_width / (F32)orig_width;
+ F32 height_scale = (F32)max_height / (F32)orig_height;
+ F32 scale = llmin(width_scale, height_scale);
+
+ // Calculate new dimensions, preserving aspect ratio
+ S32 new_width = LLImageRaw::contractDimToPowerOfTwo(llclamp((S32)llroundf(orig_width * scale), 4, max_width));
+ S32 new_height = LLImageRaw::contractDimToPowerOfTwo(llclamp((S32)llroundf(orig_height * scale), 4, max_height));
+
+ if (!raw_image->scale(new_width, new_height))
+ {
+ LL_WARNS() << "Failed to scale image from " << orig_width << "x" << orig_height << " to " << new_width << "x"
+ << new_height << LL_ENDL;
+ continue;
+ }
+
+ // Inform the resident about the resized image
+ LLSD subs;
+ subs["[ORIGINAL_WIDTH]"] = orig_width;
+ subs["[ORIGINAL_HEIGHT]"] = orig_height;
+ subs["[NEW_WIDTH]"] = new_width;
+ subs["[NEW_HEIGHT]"] = new_height;
+ subs["[MAX_WIDTH]"] = max_width;
+ subs["[MAX_HEIGHT]"] = max_height;
+ LLNotificationsUtil::add("ImageUploadResized", subs);
+ }
- upload_new_resource(uploadInfo);
+ raw_image->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+
+ LLTransactionID tid;
+ tid.generate();
+ LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ LLPointer<LLImageJ2C> formatted = new LLImageJ2C;
+
+ if (formatted->encode(raw_image, 0.0f))
+ {
+ LLFileSystem fmt_file(new_asset_id, LLAssetType::AT_TEXTURE, LLFileSystem::WRITE);
+ fmt_file.write(formatted->getData(), formatted->getDataSize());
+
+ LLResourceUploadInfo::ptr_t assetUploadInfo(new LLResourceUploadInfo(
+ tid, LLAssetType::AT_TEXTURE,
+ asset_name,
+ asset_name, 0,
+ LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
+ LLAgentBenefitsMgr::current().getTextureUploadCost(raw_image->getWidth(), raw_image->getHeight())
+ ));
+
+ upload_new_resource(assetUploadInfo);
+ }
+ }
+ else
+ {
+ LLNewFileResourceUploadInfo* info_p = new LLNewFileResourceUploadInfo(
+ filename,
+ asset_name,
+ asset_name, 0,
+ LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
+ expected_upload_cost);
+ LLResourceUploadInfo::ptr_t uploadInfo(info_p);
+
+ upload_new_resource(uploadInfo);
+ }
}
}
@@ -647,8 +739,31 @@ bool get_bulk_upload_expected_cost(
LLPointer<LLImageFormatted> image_frmted = LLImageFormatted::createFromType(codec);
if (gDirUtilp->fileExists(filename) && image_frmted && image_frmted->load(filename))
{
- S32 biased_width = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getWidth(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
- S32 biased_height = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getHeight(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ S32 biased_width, biased_height;
+
+ S32 max_width = allow_2k ? gSavedSettings.getS32("max_texture_dimension_X") : 1024;
+ S32 max_height = allow_2k ? gSavedSettings.getS32("max_texture_dimension_Y") : 1024;
+
+ S32 orig_width = image_frmted->getWidth();
+ S32 orig_height = image_frmted->getHeight();
+
+ if (orig_width > max_width || orig_height > max_height)
+ {
+ // Calculate scale factors
+ F32 width_scale = (F32)max_width / (F32)orig_width;
+ F32 height_scale = (F32)max_height / (F32)orig_height;
+ F32 scale = llmin(width_scale, height_scale);
+
+ // Calculate new dimensions, preserving aspect ratio
+ biased_width = LLImageRaw::contractDimToPowerOfTwo(llclamp((S32)llroundf(orig_width * scale), 4, max_width));
+ biased_height = LLImageRaw::contractDimToPowerOfTwo(llclamp((S32)llroundf(orig_height * scale), 4, max_height));
+ }
+ else
+ {
+ biased_width = LLImageRaw::biasedDimToPowerOfTwo(orig_width, LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ biased_height = LLImageRaw::biasedDimToPowerOfTwo(orig_height, LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ }
+
total_cost += LLAgentBenefitsMgr::current().getTextureUploadCost(biased_width, biased_height);
S32 area = biased_width * biased_height;
if (area >= LLAgentBenefits::MIN_2K_TEXTURE_AREA)
@@ -709,7 +824,7 @@ bool get_bulk_upload_expected_cost(
return file_count > 0;
}
-const void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_2k)
+void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_2k, const LLUUID& dest)
{
S32 expected_upload_cost;
S32 expected_upload_count;
@@ -721,6 +836,7 @@ const void upload_bulk(const std::vector<std::string>& filtered_filenames, bool
key["upload_cost"] = expected_upload_cost;
key["upload_count"] = expected_upload_count;
key["has_2k_textures"] = (textures_2k_count > 0);
+ key["dest"] = dest;
LLSD array;
for (const std::string& str : filtered_filenames)
@@ -754,7 +870,7 @@ const void upload_bulk(const std::vector<std::string>& filtered_filenames, bool
}
-const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k)
+void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k, const LLUUID& dest)
{
// TODO:
// Check user balance for entire cost
@@ -776,7 +892,7 @@ const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::
filtered_filenames.push_back(filename);
}
}
- upload_bulk(filtered_filenames, allow_2k);
+ upload_bulk(filtered_filenames, allow_2k, dest);
}
class LLFileUploadImage : public view_listener_t
@@ -787,7 +903,7 @@ class LLFileUploadImage : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_IMAGE, false);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_IMAGE, false);
return true;
}
};
@@ -796,7 +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;
}
};
@@ -818,7 +950,7 @@ class LLFileUploadSound : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_WAV, false);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_WAV, false);
return true;
}
};
@@ -831,7 +963,7 @@ class LLFileUploadAnim : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_ANIM, false);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_ANIM, false);
return true;
}
};
@@ -844,7 +976,7 @@ class LLFileUploadBulk : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true), LLFilePicker::FFLOAD_ALL, true);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true, LLUUID::null), LLFilePicker::FFLOAD_ALL, true);
return true;
}
};
@@ -932,6 +1064,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
bool render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot");
bool render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot");
bool render_no_post = gSavedSettings.getBOOL("RenderSnapshotNoPost");
+ bool render_balance = gSavedSettings.getBOOL("RenderBalanceInSnapshot");
bool high_res = gSavedSettings.getBOOL("HighResSnapshot");
if (high_res)
@@ -952,6 +1085,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
render_hud,
false,
render_no_post,
+ render_balance,
LLSnapshotModel::SNAPSHOT_TYPE_COLOR,
high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side
{
@@ -1132,7 +1266,7 @@ LLUUID upload_new_resource(
name, desc, compression_info,
destination_folder_type, inv_type,
next_owner_perms, group_perms, everyone_perms,
- expected_upload_cost, show_inventory));
+ expected_upload_cost, LLUUID::null, show_inventory));
upload_new_resource(uploadInfo, callback, userdata);
return LLUUID::null;
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index d99f9dc4c6..8f7df48a2e 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -74,6 +74,17 @@ bool get_bulk_upload_expected_cost(
void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k);
+void upload_single_file(
+ const std::vector<std::string>& filenames,
+ LLFilePicker::ELoadFilter type,
+ const LLUUID& dest);
+
+void upload_bulk(
+ const std::vector<std::string>& filenames,
+ LLFilePicker::ELoadFilter type,
+ bool allow_2k,
+ const LLUUID& dest);
+
//consider moving all file pickers below to more suitable place
class LLFilePickerThread : public LLThread
{ //multi-threaded file picker (runs system specific file picker in background and calls "notify" from main thread)
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 4cd2622460..c54feba06b 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2139,6 +2139,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
EInstantMessage dialog = (EInstantMessage)d;
LLHost sender = msg->getSender();
+ LLSD metadata;
+ if (msg->getNumberOfBlocksFast(_PREHASH_MetaData) > 0)
+ {
+ S32 metadata_size = msg->getSizeFast(_PREHASH_MetaData, 0, _PREHASH_Data);
+ std::string metadata_buffer;
+ metadata_buffer.resize(metadata_size, 0);
+
+ msg->getBinaryDataFast(_PREHASH_MetaData, _PREHASH_Data, &metadata_buffer[0], metadata_size, 0, metadata_size );
+ std::stringstream metadata_stream(metadata_buffer);
+ if (LLSDSerialize::fromBinary(metadata, metadata_stream, metadata_size) == LLSDParser::PARSE_FAILURE)
+ {
+ metadata.clear();
+ }
+ }
+
LLIMProcessing::processNewMessage(from_id,
from_group,
to_id,
@@ -2153,7 +2168,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
position,
binary_bucket,
binary_bucket_size,
- sender);
+ sender,
+ metadata);
}
void send_do_not_disturb_message (LLMessageSystem* msg, const LLUUID& from_id, const LLUUID& session_id)
@@ -2587,6 +2603,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
msg_notify["session_id"] = LLUUID();
msg_notify["from_id"] = chat.mFromID;
msg_notify["source_type"] = chat.mSourceType;
+ // used to check if there is agent mention in the message
+ msg_notify["message"] = mesg;
on_new_message(msg_notify);
}
@@ -3054,6 +3072,11 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
}
}
+#ifdef LL_DISCORD
+ if (gSavedSettings.getBOOL("EnableDiscord"))
+ LLAppViewer::updateDiscordActivity();
+#endif
+
if ( LLTracker::isTracking(NULL) )
{
// Check distance to beacon, if < 5m, remove beacon
@@ -3136,7 +3159,10 @@ void process_crossed_region(LLMessageSystem* msg, void**)
return;
}
LL_INFOS("Messaging") << "process_crossed_region()" << LL_ENDL;
- gAgentAvatarp->resetRegionCrossingTimer();
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->resetRegionCrossingTimer();
+ }
U32 sim_ip;
msg->getIPAddrFast(_PREHASH_RegionData, _PREHASH_SimIP, sim_ip);
@@ -3191,6 +3217,7 @@ void send_agent_update(bool force_send, bool send_reliable)
static F64 last_send_time = 0.0;
static U32 last_control_flags = 0;
+ static bool control_flags_follow_up = false;
static U8 last_render_state = 0;
static U8 last_flags = AU_FLAGS_NONE;
static LLQuaternion last_body_rot,
@@ -3268,6 +3295,20 @@ void send_agent_update(bool force_send, bool send_reliable)
break;
}
+ // example:
+ // user taps crouch (control_flags 4128), viewer sends 4128 then immediately 0
+ // server starts crouching motion but does not stop it, only once viewer sends 0
+ // second time will server stop the motion. follow_up exists to make sure all
+ // states like 'crouch' motion are properly cleared server side.
+ //
+ // P.S. Server probably shouldn't require a reminder to stop a motion,
+ // but at the moment it does.
+ if (control_flags_follow_up)
+ {
+ send_update = true;
+ break;
+ }
+
// check translation
constexpr F32 TRANSLATE_THRESHOLD = 0.01f;
if ((last_camera_pos_agent - camera_pos_agent).magVec() > TRANSLATE_THRESHOLD)
@@ -3346,6 +3387,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.
@@ -3354,25 +3403,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);
@@ -3401,6 +3450,7 @@ void send_agent_update(bool force_send, bool send_reliable)
// remember last update data
last_send_time = now;
+ control_flags_follow_up = last_control_flags != control_flags;
last_control_flags = control_flags;
last_render_state = render_state;
last_flags = flags;
@@ -3650,7 +3700,7 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
gObjectList.killObject(objectp);
}
- if(delete_object)
+ if(delete_object && regionp)
{
regionp->killCacheEntry(local_id);
}
@@ -4194,6 +4244,8 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data)
{
LL_WARNS("Messaging") << "Received sit approval for unknown object " << sitObjectID << LL_ENDL;
}
+
+ gAgent.setSitObjectID(sitObjectID);
}
void process_clear_follow_cam_properties(LLMessageSystem *mesgsys, void **user_data)
@@ -5059,6 +5111,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
false, //UI
gSavedSettings.getBOOL("RenderHUDInSnapshot"),
false,
+ false,
LLSnapshotModel::SNAPSHOT_TYPE_COLOR,
LLSnapshotModel::SNAPSHOT_FORMAT_PNG);
}
@@ -5164,6 +5217,7 @@ static void process_special_alert_messages(const std::string & message)
false,
gSavedSettings.getBOOL("RenderHUDInSnapshot"),
false,
+ false,
LLSnapshotModel::SNAPSHOT_TYPE_COLOR,
LLSnapshotModel::SNAPSHOT_FORMAT_PNG);
}
@@ -6661,7 +6715,6 @@ void process_initiate_download(LLMessageSystem* msg, void**)
(void**)new std::string(viewer_filename));
}
-
void process_script_teleport_request(LLMessageSystem* msg, void**)
{
if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return;
@@ -6675,6 +6728,11 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)
msg->getString("Data", "SimName", sim_name);
msg->getVector3("Data", "SimPosition", pos);
msg->getVector3("Data", "LookAt", look_at);
+ U32 flags = (BEACON_SHOW_MAP | BEACON_FOCUS_MAP);
+ if (msg->has("Options"))
+ {
+ msg->getU32("Options", "Flags", flags);
+ }
LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance();
if(instance)
@@ -6685,7 +6743,13 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)
<< LL_ENDL;
instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]);
- LLFloaterReg::showInstance("world_map", "center");
+ if (flags & BEACON_SHOW_MAP)
+ {
+ bool old_auto_focus = instance->getAutoFocus();
+ instance->setAutoFocus(flags & BEACON_FOCUS_MAP);
+ instance->openFloater("center");
+ instance->setAutoFocus(old_auto_focus);
+ }
}
// remove above two lines and replace with below line
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index b8c9594aa7..da2ca0aca4 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/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index c5e81dd179..c13e541da0 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -310,6 +310,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mAttachmentItemID(LLUUID::null),
mLastUpdateType(OUT_UNKNOWN),
mLastUpdateCached(false),
+ mLocked(false),
mCachedMuteListUpdateTime(0),
mCachedOwnerInMuteList(false),
mRiggedAttachedWarned(false)
@@ -2325,6 +2326,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
// Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
setRotation(new_rot * mAngularVelocityRot);
+ if ((mFlags & FLAGS_SERVER_AUTOPILOT) && asAvatar() && asAvatar()->isSelf())
+ {
+ gAgent.resetAxes();
+ gAgent.rotate(new_rot);
+ gAgentCamera.resetView();
+ }
setChanged(ROTATED | SILHOUETTE);
}
@@ -4178,8 +4185,11 @@ void LLViewerObject::boostTexturePriority(bool boost_children /* = true */)
if (isSculpted() && !isMesh())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID sculpt_id = sculpt_params->getSculptTexture();
- LLViewerTextureManager::getFetchedTexture(sculpt_id, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLGLTexture::BOOST_SELECTED);
+ if (sculpt_params)
+ {
+ LLUUID sculpt_id = sculpt_params->getSculptTexture();
+ LLViewerTextureManager::getFetchedTexture(sculpt_id, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLGLTexture::BOOST_SELECTED);
+ }
}
if (boost_children)
@@ -5081,11 +5091,10 @@ void LLViewerObject::setNumTEs(const U8 num_tes)
if (base_material && override_material)
{
tep->setGLTFMaterialOverride(new LLGLTFMaterial(*override_material));
-
- LLGLTFMaterial* render_material = new LLFetchedGLTFMaterial();
- *render_material = *base_material;
- render_material->applyOverride(*override_material);
- tep->setGLTFRenderMaterial(render_material);
+ }
+ if (base_material)
+ {
+ initRenderMaterial(i);
}
}
}
@@ -5261,6 +5270,9 @@ void LLViewerObject::updateTEMaterialTextures(U8 te)
});
}
getTE(te)->setGLTFMaterial(mat);
+ initRenderMaterial(te);
+ mat = (LLFetchedGLTFMaterial*) getTE(te)->getGLTFRenderMaterial();
+ llassert(mat == nullptr || dynamic_cast<LLFetchedGLTFMaterial*>(getTE(te)->getGLTFRenderMaterial()) != nullptr);
}
else if (mat_id.isNull() && mat != nullptr)
{
@@ -5650,6 +5662,42 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri
return retval;
}
+// Set render material if there are overrides or if the base material is has a
+// baked texture. Otherwise, set it to null.
+// If you are setting the material override and not sending an update message,
+// you should probably call this function.
+S32 LLViewerObject::initRenderMaterial(U8 te)
+{
+ LL_PROFILE_ZONE_SCOPED;
+
+ LLTextureEntry* tep = getTE(te);
+ if (!tep) { return 0; }
+ const LLFetchedGLTFMaterial* base_material = static_cast<LLFetchedGLTFMaterial*>(tep->getGLTFMaterial());
+ llassert(base_material);
+ if (!base_material) { return 0; }
+ const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride();
+ LLFetchedGLTFMaterial* render_material = nullptr;
+ bool need_render_material = override_material;
+ if (!need_render_material)
+ {
+ for (const LLUUID& texture_id : base_material->mTextureId)
+ {
+ if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(texture_id))
+ {
+ need_render_material = true;
+ break;
+ }
+ }
+ }
+ if (need_render_material)
+ {
+ render_material = new LLFetchedGLTFMaterial(*base_material);
+ if (override_material) { render_material->applyOverride(*override_material); }
+ render_material->clearFetchedTextures();
+ }
+ return tep->setGLTFRenderMaterial(render_material);
+}
+
S32 LLViewerObject::setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* override_mat)
{
LL_PROFILE_ZONE_SCOPED;
@@ -5683,22 +5731,13 @@ S32 LLViewerObject::setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* override_ma
if (retval)
{
+ retval = initRenderMaterial(te) | retval;
if (override_mat)
{
- LLFetchedGLTFMaterial* render_mat = new LLFetchedGLTFMaterial(*src_mat);
- render_mat->applyOverride(*override_mat);
- tep->setGLTFRenderMaterial(render_mat);
- retval = TEM_CHANGE_TEXTURE;
-
for (LLGLTFMaterial::local_tex_map_t::value_type &val : override_mat->mTrackingIdToLocalTexture)
{
LLLocalBitmapMgr::getInstance()->associateGLTFMaterial(val.first, override_mat);
}
-
- }
- else if (tep->setGLTFRenderMaterial(nullptr))
- {
- retval = TEM_CHANGE_TEXTURE;
}
}
@@ -7568,25 +7607,15 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat
// the overrides have not changed due to being only texture
// transforms. Re-apply the overrides to the render material here,
// if present.
- const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride();
- if (override_material)
+ // Also, sometimes, the material has baked textures, which requires
+ // a copy unique to this object.
+ // Currently, we do not deduplicate render materials.
+ new_material->onMaterialComplete([obj_id = getID(), te]()
{
- new_material->onMaterialComplete([obj_id = getID(), te]()
- {
- LLViewerObject* obj = gObjectList.findObject(obj_id);
- if (!obj) { return; }
- LLTextureEntry* tep = obj->getTE(te);
- if (!tep) { return; }
- const LLGLTFMaterial* new_material = tep->getGLTFMaterial();
- if (!new_material) { return; }
- const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride();
- if (!override_material) { return; }
- LLGLTFMaterial* render_material = new LLFetchedGLTFMaterial();
- *render_material = *new_material;
- render_material->applyOverride(*override_material);
- tep->setGLTFRenderMaterial(render_material);
- });
- }
+ LLViewerObject* obj = gObjectList.findObject(obj_id);
+ if (!obj) { return; }
+ obj->initRenderMaterial(te);
+ });
}
}
@@ -7708,6 +7737,51 @@ void LLViewerObject::clearTEWaterExclusion(const U8 te)
}
}
+bool LLViewerObject::isReachable()
+{
+ LLViewerRegion* agent_region = gAgent.getRegion();
+ LLViewerRegion* object_region = getRegion();
+
+ if (!agent_region || !object_region)
+ {
+ return false;
+ }
+ if (agent_region == object_region)
+ {
+ return true;
+ }
+
+ std::unordered_set<LLViewerRegion*> visited;
+ std::queue<LLViewerRegion*> pending;
+ visited.insert(agent_region);
+ pending.push(agent_region);
+
+ while (!pending.empty())
+ {
+ LLViewerRegion* current = pending.front();
+ pending.pop();
+
+ std::vector<LLViewerRegion*> neighbors;
+ current->getNeighboringRegions(neighbors);
+
+ for (LLViewerRegion* neighbor : neighbors)
+ {
+ if (!neighbor) continue;
+
+ if (neighbor == object_region)
+ {
+ return true;
+ }
+ // region's neighbors were not checked
+ if (visited.insert(neighbor).second)
+ {
+ pending.push(neighbor);
+ }
+ }
+ }
+ return false;
+}
+
class ObjectPhysicsProperties : public LLHTTPNode
{
public:
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 2b52ea2076..6e26da74e7 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -249,6 +249,9 @@ public:
// Accessor functions
LLViewerRegion* getRegion() const { return mRegionp; }
+ // Check if object is reachable from agent region by traversing loaded neighboring regions
+ bool isReachable();
+
bool isSelected() const { return mUserSelected; }
// Check whole linkset
bool isAnySelected() const;
@@ -389,6 +392,7 @@ public:
/*virtual*/ S32 setTEGlow(const U8 te, const F32 glow);
/*virtual*/ S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);
/*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams);
+ S32 initRenderMaterial(const U8 te);
virtual S32 setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* mat);
// Used by Materials update functions to properly kick off rebuilds
@@ -974,10 +978,14 @@ public:
LLJointRiggingInfoTab mJointRiggingInfoTab;
+ bool isLocked() const { return mLocked; }
+ void setLocked(bool locked) { mLocked = locked; }
+
private:
LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory.
EObjectUpdateType mLastUpdateType;
bool mLastUpdateCached;
+ bool mLocked;
public:
// reflection probe state
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index c15fd86f71..0a6197a67a 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1070,7 +1070,7 @@ void LLViewerObjectList::fetchObjectCostsCoro(std::string url)
if (diff.empty())
{
- LL_INFOS() << "No outstanding object IDs to request. Pending count: " << mPendingObjectCost.size() << LL_ENDL;
+ LL_DEBUGS() << "No outstanding object IDs to request. Pending count: " << mPendingObjectCost.size() << LL_ENDL;
return;
}
@@ -1205,7 +1205,7 @@ void LLViewerObjectList::fetchPhisicsFlagsCoro(std::string url)
if (idList.size() < 1)
{
- LL_INFOS() << "No outstanding object physics flags to request." << LL_ENDL;
+ LL_DEBUGS() << "No outstanding object physics flags to request." << LL_ENDL;
return;
}
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 8e6657b4b9..432da2e990 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -42,6 +42,7 @@
// Viewer includes
#include "llagent.h"
#include "llagentaccess.h"
+#include "llcallbacklist.h"
#include "llviewerparcelaskplay.h"
#include "llviewerwindow.h"
#include "llviewercontrol.h"
@@ -1327,12 +1328,12 @@ const S32 LLViewerParcelMgr::getAgentParcelId() const
return INVALID_PARCEL_ID;
}
-void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region)
+void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel)
{
if(!parcel)
return;
- LLViewerRegion *region = use_agent_region ? gAgent.getRegion() : LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
+ LLViewerRegion *region = LLWorld::getInstance()->getRegionFromID(parcel->getRegionID());
if (!region)
return;
@@ -1676,10 +1677,16 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
// Actually extract the data.
if (parcel)
{
+ // store region_id in the parcel so we can find it again later
+ LLViewerRegion* parcel_region = LLWorld::getInstance()->getRegion(msg->getSender());
+ if (parcel_region)
+ {
+ parcel->setRegionID(parcel_region->getRegionID());
+ }
+
if (local_id == parcel_mgr.mAgentParcel->getLocalID())
{
// Parcels in different regions can have same ids.
- LLViewerRegion* parcel_region = LLWorld::getInstance()->getRegion(msg->getSender());
LLViewerRegion* agent_region = gAgent.getRegion();
if (parcel_region && agent_region && parcel_region->getRegionID() == agent_region->getRegionID())
{
@@ -1750,6 +1757,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
{
instance->mTeleportFinishedSignal(instance->mTeleportInProgressPosition, false);
}
+ instance->postTeleportFinished(instance->mTeleportWithinRegion);
+ instance->mTeleportWithinRegion = false;
}
parcel->setParcelEnvironmentVersion(parcel_environment_version);
LL_DEBUGS("ENVIRONMENT") << "Parcel environment version is " << parcel->getParcelEnvironmentVersion() << LL_ENDL;
@@ -2719,6 +2728,8 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos
// Local teleport. We already have the agent parcel data.
// Emit the signal immediately.
getInstance()->mTeleportFinishedSignal(new_pos, local);
+
+ postTeleportFinished(true);
}
else
{
@@ -2727,12 +2738,14 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos
// Let's wait for the update and then emit the signal.
mTeleportInProgressPosition = new_pos;
mTeleportInProgress = true;
+ mTeleportWithinRegion = local;
}
}
void LLViewerParcelMgr::onTeleportFailed()
{
mTeleportFailedSignal();
+ LLEventPumps::instance().obtain("LLTeleport").post(llsd::map("success", false));
}
bool LLViewerParcelMgr::getTeleportInProgress()
@@ -2740,3 +2753,20 @@ bool LLViewerParcelMgr::getTeleportInProgress()
return mTeleportInProgress // case where parcel data arrives after teleport
|| gAgent.getTeleportState() > LLAgent::TELEPORT_NONE; // For LOCAL, no mTeleportInProgress
}
+
+void LLViewerParcelMgr::postTeleportFinished(bool local)
+{
+ auto post = []()
+ {
+ LLEventPumps::instance().obtain("LLTeleport").post(llsd::map("success", true));
+ };
+ if (local)
+ {
+ static LLCachedControl<F32> teleport_local_delay(gSavedSettings, "TeleportLocalDelay");
+ doAfterInterval(post, teleport_local_delay + 0.5f);
+ }
+ else
+ {
+ post();
+ }
+}
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 974ea39359..1925cd23ed 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -219,7 +219,7 @@ public:
// containing the southwest corner of the selection.
// If want_reply_to_update, simulator will send back a ParcelProperties
// message.
- void sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region = false);
+ void sendParcelPropertiesUpdate(LLParcel* parcel);
// Takes an Access List flag, like AL_ACCESS or AL_BAN
void sendParcelAccessListUpdate(U32 which);
@@ -295,6 +295,8 @@ public:
void onTeleportFailed();
bool getTeleportInProgress();
+ void postTeleportFinished(bool local);
+
static bool isParcelOwnedByAgent(const LLParcel* parcelp, U64 group_proxy_power);
static bool isParcelModifiableByAgent(const LLParcel* parcelp, U64 group_proxy_power);
@@ -344,7 +346,9 @@ private:
std::vector<LLParcelObserver*> mObservers;
+ // Used to communicate between onTeleportFinished() and processParcelProperties()
bool mTeleportInProgress;
+ bool mTeleportWithinRegion{ false };
LLVector3d mTeleportInProgressPosition;
teleport_finished_signal_t mTeleportFinishedSignal;
teleport_failed_signal_t mTeleportFailedSignal;
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index da03d3b015..0bb03cdd60 100755
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -33,6 +33,7 @@
#include "llfloaterreg.h"
#include "llgl.h"
#include "llrender.h"
+#include "lluicolor.h"
#include "v4color.h"
#include "v2math.h"
@@ -50,8 +51,8 @@
#include "pipeline.h"
-static const U8 OVERLAY_IMG_COMPONENTS = 4;
-static const F32 LINE_WIDTH = 0.0625f;
+static constexpr U8 OVERLAY_IMG_COMPONENTS = 4;
+static constexpr F32 LINE_WIDTH = 0.0625f;
bool LLViewerParcelOverlay::sColorSetInitialized = false;
LLUIColor LLViewerParcelOverlay::sAvailColor;
@@ -91,7 +92,7 @@ LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_
// Initialize the GL texture with empty data.
//
// Create the base texture.
- U8 *raw = mImageRaw->getData();
+ U8* raw = mImageRaw->getData();
const S32 COUNT = mParcelGridsPerEdge * mParcelGridsPerEdge * OVERLAY_IMG_COMPONENTS;
for (S32 i = 0; i < COUNT; i++)
{
@@ -158,10 +159,10 @@ bool LLViewerParcelOverlay::encroachesOwned(const std::vector<LLBBox>& boxes) co
LLVector3 min = boxes[i].getMinAgent();
LLVector3 max = boxes[i].getMaxAgent();
- S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
for (S32 row = top; row <= bottom; row++)
{
@@ -186,10 +187,10 @@ bool LLViewerParcelOverlay::encroachesOnUnowned(const std::vector<LLBBox>& boxes
LLVector3 min = boxes[i].getMinAgent();
LLVector3 max = boxes[i].getMaxAgent();
- S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
for (S32 row = top; row <= bottom; row++)
{
@@ -223,10 +224,10 @@ bool LLViewerParcelOverlay::encroachesOnNearbyParcel(const std::vector<LLBBox>&
return true;
}
- S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 bottom = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
- S32 top = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 bottom = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
+ S32 top = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f));
const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge;
@@ -348,11 +349,11 @@ void LLViewerParcelOverlay::updateOverlayTexture()
const LLColor4U auction = sAuctionColor.get();
// Create the base texture.
- U8 *raw = mImageRaw->getData();
+ U8* raw = mImageRaw->getData();
const S32 COUNT = mParcelGridsPerEdge * mParcelGridsPerEdge;
S32 max = mOverlayTextureIdx + mParcelGridsPerEdge;
if (max > COUNT) max = COUNT;
- S32 pixel_index = mOverlayTextureIdx*OVERLAY_IMG_COMPONENTS;
+ S32 pixel_index = mOverlayTextureIdx * OVERLAY_IMG_COMPONENTS;
S32 i;
for (i = mOverlayTextureIdx; i < max; i++)
{
@@ -361,7 +362,7 @@ void LLViewerParcelOverlay::updateOverlayTexture()
U8 r,g,b,a;
// Color stored in low three bits
- switch( ownership & 0x7 )
+ switch (ownership & 0x7)
{
case PARCEL_PUBLIC:
r = avail.mV[VRED];
@@ -407,10 +408,10 @@ void LLViewerParcelOverlay::updateOverlayTexture()
break;
}
- raw[pixel_index + 0] = (U8)r;
- raw[pixel_index + 1] = (U8)g;
- raw[pixel_index + 2] = (U8)b;
- raw[pixel_index + 3] = (U8)a;
+ raw[pixel_index + VRED] = (U8)r;
+ raw[pixel_index + VGREEN] = (U8)g;
+ raw[pixel_index + VBLUE] = (U8)b;
+ raw[pixel_index + VALPHA] = (U8)a;
pixel_index += OVERLAY_IMG_COMPONENTS;
}
@@ -431,11 +432,10 @@ void LLViewerParcelOverlay::updateOverlayTexture()
}
}
-
-void LLViewerParcelOverlay::uncompressLandOverlay(S32 chunk, U8 *packed_overlay)
+void LLViewerParcelOverlay::uncompressLandOverlay(S32 chunk, U8* packed_overlay)
{
// Unpack the message data into the ownership array
- S32 size = mParcelGridsPerEdge * mParcelGridsPerEdge;
+ S32 size = mParcelGridsPerEdge * mParcelGridsPerEdge;
S32 chunk_size = size / PARCEL_OVERLAY_CHUNKS;
memcpy(mOwnership + chunk*chunk_size, packed_overlay, chunk_size); /*Flawfinder: ignore*/
@@ -460,7 +460,7 @@ void LLViewerParcelOverlay::updatePropertyLines()
mEdges.clear();
- const F32 GRID_STEP = PARCEL_GRID_STEP_METERS;
+ constexpr F32 GRID_STEP = PARCEL_GRID_STEP_METERS;
const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge;
for (S32 row = 0; row < GRIDS_PER_EDGE; row++)
@@ -537,16 +537,16 @@ void LLViewerParcelOverlay::addPropertyLine(F32 start_x, F32 start_y, F32 dx, F3
auto split = [&](const LLVector3& start, F32 x, F32 y, F32 z, F32 part)
{
- F32 new_x = start.mV[0] + (x - start.mV[0]) * part;
- F32 new_y = start.mV[1] + (y - start.mV[1]) * part;
- F32 new_z = start.mV[2] + (z - start.mV[2]) * part;
+ F32 new_x = start.mV[VX] + (x - start.mV[VX]) * part;
+ F32 new_y = start.mV[VY] + (y - start.mV[VY]) * part;
+ F32 new_z = start.mV[VZ] + (z - start.mV[VZ]) * part;
edge.vertices.emplace_back(new_x, new_y, new_z);
};
auto checkForSplit = [&]()
{
const LLVector3& last_outside = edge.vertices.back();
- F32 z0 = last_outside.mV[2];
+ F32 z0 = last_outside.mV[VZ];
F32 z1 = outside_z;
if ((z0 >= water_z && z1 >= water_z) || (z0 < water_z && z1 < water_z))
return;
@@ -581,7 +581,7 @@ void LLViewerParcelOverlay::addPropertyLine(F32 start_x, F32 start_y, F32 dx, F3
outside_y += dy * (dy - LINE_WIDTH);
// Middle part, full width
- const S32 GRID_STEP = (S32)PARCEL_GRID_STEP_METERS;
+ constexpr S32 GRID_STEP = (S32)PARCEL_GRID_STEP_METERS;
for (S32 i = 1; i < GRID_STEP; i++)
{
inside_z = land.resolveHeightRegion( inside_x, inside_y );
@@ -711,7 +711,7 @@ void LLViewerParcelOverlay::renderPropertyLines()
bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build");
- const F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f;
+ constexpr F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f;
for (const Edge& edge : mEdges)
{
@@ -744,7 +744,7 @@ void LLViewerParcelOverlay::renderPropertyLines()
else
{
LLVector3 visible = vertex;
- visible.mV[2] = water_z;
+ visible.mV[VZ] = water_z;
gGL.vertex3fv(visible.mV);
}
}
@@ -758,7 +758,7 @@ void LLViewerParcelOverlay::renderPropertyLines()
gGL.begin(LLRender::TRIANGLE_STRIP);
LLColor4U color = edge.color;
- color.mV[3] /= 4;
+ color.mV[VALPHA] /= 4;
gGL.color4ubv(color.mV);
for (const LLVector3& vertex : edge.vertices)
@@ -792,7 +792,7 @@ void grid_2d_part_lines(const F32 left, const F32 top, const F32 right, const F3
gGL.end();
}
-void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_meter, const F32 *parcel_outline_color)
+void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_meter, const F32* parcel_outline_color)
{
static LLCachedControl<bool> show(gSavedSettings, "MiniMapShowPropertyLines");
@@ -803,13 +803,13 @@ void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_me
LLVector3 origin_agent = mRegion->getOriginAgent();
LLVector3 rel_region_pos = origin_agent - gAgentCamera.getCameraPositionAgent();
- F32 region_left = rel_region_pos.mV[0] * scale_pixels_per_meter;
- F32 region_bottom = rel_region_pos.mV[1] * scale_pixels_per_meter;
+ F32 region_left = rel_region_pos.mV[VX] * scale_pixels_per_meter;
+ F32 region_bottom = rel_region_pos.mV[VY] * scale_pixels_per_meter;
F32 map_parcel_width = PARCEL_GRID_STEP_METERS * scale_pixels_per_meter;
const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glLineWidth(1.0f);
+ //glLineWidth(1.0f);
gGL.color4fv(parcel_outline_color);
for (S32 i = 0; i <= GRIDS_PER_EDGE; i++)
{
diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h
index 03ae464cb8..50bef02ddf 100644
--- a/indra/newview/llviewerparceloverlay.h
+++ b/indra/newview/llviewerparceloverlay.h
@@ -34,12 +34,11 @@
#include "llframetimer.h"
#include "lluuid.h"
#include "llviewertexture.h"
-#include "llgl.h"
-#include "lluicolor.h"
class LLViewerRegion;
class LLVector3;
class LLColor4U;
+class LLUIColor;
class LLVector2;
class LLViewerParcelOverlay : public LLGLUpdate
@@ -65,19 +64,18 @@ public:
bool isSoundLocal(const LLVector3& pos) const;
- bool isBuildCameraAllowed(const LLVector3& pos) const;
F32 getOwnedRatio() const;
// Returns the number of vertices drawn
void renderPropertyLines();
void renderPropertyLinesOnMinimap(F32 scale_pixels_per_meter, const F32* parcel_outline_color);
- U8 ownership( const LLVector3& pos) const;
- U8 parcelLineFlags( const LLVector3& pos) const;
+ U8 ownership(const LLVector3& pos) const;
+ U8 parcelLineFlags(const LLVector3& pos) const;
U8 parcelLineFlags(S32 row, S32 col) const;
// MANIPULATE
- void uncompressLandOverlay(S32 chunk, U8 *compressed_overlay);
+ void uncompressLandOverlay(S32 chunk, U8* compressed_overlay);
// Indicate property lines and overlay texture need to be rebuilt.
void setDirty();
@@ -88,8 +86,7 @@ public:
private:
// This is in parcel rows and columns, not grid rows and columns
// Stored in bottom three bits.
- U8 ownership(S32 row, S32 col) const
- { return parcelFlags(row, col, (U8)0x7); }
+ U8 ownership(S32 row, S32 col) const { return parcelFlags(row, col, (U8)0x7); }
U8 parcelFlags(S32 row, S32 col, U8 flags) const;
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 697433148b..a085bc4d91 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -38,7 +38,6 @@
#include "llregionhandle.h"
#include "llsurface.h"
#include "message.h"
-//#include "vmath.h"
#include "v3math.h"
#include "v4math.h"
@@ -3720,12 +3719,6 @@ bool LLViewerRegion::bakesOnMeshEnabled() const
mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean());
}
-bool LLViewerRegion::meshRezEnabled() const
-{
- return (mSimulatorFeatures.has("MeshRezEnabled") &&
- mSimulatorFeatures["MeshRezEnabled"].asBoolean());
-}
-
bool LLViewerRegion::dynamicPathfindingEnabled() const
{
return ( mSimulatorFeatures.has("DynamicPathfindingEnabled") &&
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index d0ec1fe877..ca994c6b06 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -43,6 +43,7 @@
#include "m4math.h" // LLMatrix4
#include "llframetimer.h"
#include "llreflectionmap.h"
+#include "llviewerobject.h"
#include "llpointer.h"
// Surface id's
@@ -333,7 +334,6 @@ public:
void getInfo(LLSD& info);
- bool meshRezEnabled() const;
bool meshUploadEnabled() const;
bool bakesOnMeshEnabled() const;
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 7ef13c3a35..23387d8613 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -137,6 +137,10 @@ LLGLSLShader gGlowProgram;
LLGLSLShader gGlowExtractProgram;
LLGLSLShader gPostScreenSpaceReflectionProgram;
+LLGLSLShader gBloomExtractProgram;
+LLGLSLShader gBloomBlurProgram;
+LLGLSLShader gBloomCombineProgram;
+
// Deferred rendering shaders
LLGLSLShader gDeferredImpostorProgram;
LLGLSLShader gDeferredDiffuseProgram;
@@ -196,8 +200,13 @@ LLGLSLShader gDeferredCoFProgram;
LLGLSLShader gDeferredDoFCombineProgram;
LLGLSLShader gDeferredPostTonemapProgram;
LLGLSLShader gNoPostTonemapProgram;
+LLGLSLShader gDeferredPostTonemapGammaCorrectProgram;
+LLGLSLShader gNoPostTonemapGammaCorrectProgram;
+LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram;
+LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram;
LLGLSLShader gDeferredPostGammaCorrectProgram;
LLGLSLShader gLegacyPostGammaCorrectProgram;
+LLGLSLShader gHDRGammaCorrectProgram;
LLGLSLShader gExposureProgram;
LLGLSLShader gExposureProgramNoFade;
LLGLSLShader gLuminanceProgram;
@@ -206,6 +215,7 @@ LLGLSLShader gSMAAEdgeDetectProgram[4];
LLGLSLShader gSMAABlendWeightsProgram[4];
LLGLSLShader gSMAANeighborhoodBlendProgram[4];
LLGLSLShader gCASProgram;
+LLGLSLShader gCASLegacyGammaProgram;
LLGLSLShader gDeferredPostNoDoFProgram;
LLGLSLShader gDeferredPostNoDoFNoiseProgram;
LLGLSLShader gDeferredWLSkyProgram;
@@ -443,8 +453,14 @@ void LLViewerShaderMgr::finalizeShaderList()
mShaderList.push_back(&gHUDPBRAlphaProgram);
mShaderList.push_back(&gDeferredPostTonemapProgram);
mShaderList.push_back(&gNoPostTonemapProgram);
+ mShaderList.push_back(&gDeferredPostTonemapGammaCorrectProgram);
+ mShaderList.push_back(&gNoPostTonemapGammaCorrectProgram);
+ mShaderList.push_back(&gDeferredPostTonemapLegacyGammaCorrectProgram);
+ mShaderList.push_back(&gNoPostTonemapLegacyGammaCorrectProgram);
+ mShaderList.push_back(&gCASLegacyGammaProgram);
mShaderList.push_back(&gDeferredPostGammaCorrectProgram); // for gamma
mShaderList.push_back(&gLegacyPostGammaCorrectProgram);
+ mShaderList.push_back(&gHDRGammaCorrectProgram);
mShaderList.push_back(&gDeferredDiffuseProgram);
mShaderList.push_back(&gDeferredBumpProgram);
mShaderList.push_back(&gDeferredPBROpaqueProgram);
@@ -545,7 +561,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 +723,10 @@ void LLViewerShaderMgr::setShaders()
loaded = loaded && loadShadersDeferred();
llassert(loaded);
- persistShaderCacheMetadata();
+ if (!LLAppViewer::instance()->isSecondInstance())
+ {
+ persistShaderCacheMetadata();
+ }
if (gViewerWindow)
{
@@ -802,9 +825,12 @@ std::string LLViewerShaderMgr::loadBasicShaders()
if (shadow_detail >= 1)
{
- attribs["SUN_SHADOW"] = "1";
+ if(shadow_detail < 3)
+ {
+ attribs["SUN_SHADOW"] = "1";
+ }
- if (shadow_detail >= 2)
+ if (shadow_detail > 1)
{
attribs["SPOT_SHADOW"] = "1";
}
@@ -864,7 +890,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()
std::vector<S32> index_channels;
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsHelpersF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) );
- index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mShaderLevel[SHADER_WINDLIGHT]) );
+ //index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mShaderLevel[SHADER_WINDLIGHT]) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsFuncs.glsl", mShaderLevel[SHADER_WINDLIGHT] ) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) );
index_channels.push_back(-1); shaders.push_back( make_pair( "environment/waterFogF.glsl", mShaderLevel[SHADER_WATER] ) );
@@ -902,8 +928,9 @@ bool LLViewerShaderMgr::loadShadersWater()
bool success = true;
bool terrainWaterSuccess = true;
+ S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1 &&
- gSavedSettings.getS32("RenderShadowDetail") > 0;
+ shadow_detail > 0 && shadow_detail < 3;
if (mShaderLevel[SHADER_WATER] == 0)
{
@@ -1003,6 +1030,52 @@ bool LLViewerShaderMgr::loadShadersEffects()
if (success)
{
+ gBloomExtractProgram.mName = "Bloom Extract Shader";
+ gBloomExtractProgram.mShaderFiles.clear();
+ gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractV.glsl", GL_VERTEX_SHADER));
+ gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractF.glsl", GL_FRAGMENT_SHADER));
+ gBloomExtractProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomExtractProgram.createShader();
+ if (!success)
+ {
+ LL_WARNS() << "gBloomExtractProgram creation ERROR" << LL_ENDL;
+ //LLPipeline::sRenderGlow = false;
+ }
+ }
+
+ if (success)
+ {
+ gBloomBlurProgram.mName = "Bloom Blur Shader";
+ gBloomBlurProgram.mShaderFiles.clear();
+ gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurV.glsl", GL_VERTEX_SHADER));
+ gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurF.glsl", GL_FRAGMENT_SHADER));
+ gBloomBlurProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomBlurProgram.createShader();
+ if(!success)
+ {
+ LL_WARNS() << "gBloomBlurProgram creation ERROR" << LL_ENDL;
+ }
+ }
+
+ if (success)
+ {
+ gBloomCombineProgram.mName = "Bloom Combine Shader";
+ gBloomCombineProgram.mShaderFiles.clear();
+ gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineV.glsl", GL_VERTEX_SHADER));
+ gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineF.glsl", GL_FRAGMENT_SHADER));
+ gBloomCombineProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomCombineProgram.createShader();
+ if(!success)
+ {
+ LL_WARNS() << "gBloomCombineProgram creation ERROR" << LL_ENDL;
+ }
+ }
+
+ if (success)
+ {
gGlowProgram.mName = "Glow Shader (Post)";
gGlowProgram.mShaderFiles.clear();
gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowV.glsl", GL_VERTEX_SHADER));
@@ -1107,8 +1180,14 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gLuminanceProgram.unload();
gDeferredPostGammaCorrectProgram.unload();
gLegacyPostGammaCorrectProgram.unload();
+ gHDRGammaCorrectProgram.unload();
gDeferredPostTonemapProgram.unload();
gNoPostTonemapProgram.unload();
+ gDeferredPostTonemapGammaCorrectProgram.unload();
+ gNoPostTonemapGammaCorrectProgram.unload();
+ gDeferredPostTonemapLegacyGammaCorrectProgram.unload();
+ gNoPostTonemapLegacyGammaCorrectProgram.unload();
+
for (auto i = 0; i < 4; ++i)
{
gFXAAProgram[i].unload();
@@ -1117,6 +1196,7 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gSMAANeighborhoodBlendProgram[i].unload();
}
gCASProgram.unload();
+ gCASLegacyGammaProgram.unload();
gEnvironmentMapProgram.unload();
gDeferredWLSkyProgram.unload();
gDeferredWLCloudProgram.unload();
@@ -2450,6 +2530,21 @@ bool LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gHDRGammaCorrectProgram.mName = "HDR Gamma Correction Post Process";
+ gHDRGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gHDRGammaCorrectProgram.mFeatures.isDeferred = true;
+ gHDRGammaCorrectProgram.mShaderFiles.clear();
+ gHDRGammaCorrectProgram.clearPermutations();
+ //gHDRGammaCorrectProgram.addPermutation("HDR_GAMMA", "1");
+ gHDRGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gHDRGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/MPHDRDisplayGammaF.glsl", GL_FRAGMENT_SHADER));
+ gHDRGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gHDRGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
gDeferredPostTonemapProgram.mName = "Deferred Tonemap Post Process";
gDeferredPostTonemapProgram.mFeatures.hasSrgb = true;
gDeferredPostTonemapProgram.mFeatures.isDeferred = true;
@@ -2479,6 +2574,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 +2825,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..f503401510 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -250,12 +250,18 @@ extern LLGLSLShader gSMAAEdgeDetectProgram[4];
extern LLGLSLShader gSMAABlendWeightsProgram[4];
extern LLGLSLShader gSMAANeighborhoodBlendProgram[4];
extern LLGLSLShader gCASProgram;
+extern LLGLSLShader gCASLegacyGammaProgram;
extern LLGLSLShader gDeferredPostNoDoFProgram;
extern LLGLSLShader gDeferredPostNoDoFNoiseProgram;
extern LLGLSLShader gDeferredPostGammaCorrectProgram;
extern LLGLSLShader gLegacyPostGammaCorrectProgram;
+extern LLGLSLShader gHDRGammaCorrectProgram;
extern LLGLSLShader gDeferredPostTonemapProgram;
extern LLGLSLShader gNoPostTonemapProgram;
+extern LLGLSLShader gDeferredPostTonemapGammaCorrectProgram;
+extern LLGLSLShader gNoPostTonemapGammaCorrectProgram;
+extern LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram;
+extern LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram;
extern LLGLSLShader gExposureProgram;
extern LLGLSLShader gExposureProgramNoFade;
extern LLGLSLShader gLuminanceProgram;
@@ -298,6 +304,10 @@ extern LLGLSLShader gHUDPBRAlphaProgram;
// GLTF shaders
extern LLGLSLShader gGLTFPBRMetallicRoughnessProgram;
+extern LLGLSLShader gBloomExtractProgram;
+extern LLGLSLShader gBloomBlurProgram;
+extern LLGLSLShader gBloomCombineProgram;
+
// Encodes detail level for dropping textures, in accordance with the GLTF spec where possible
// 0 is highest detail, -1 drops emissive, etc
// Dropping metallic roughness is off-spec - Reserve for potato machines as needed
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index ad503cbac7..59bb78f8f4 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -220,7 +220,22 @@ SimMeasurement<F64Megabytes > SIM_PHYSICS_MEM("physicsmemoryallocated", "", LL
LLTrace::SampleStatHandle<F64Milliseconds > FRAMETIME_JITTER("frametimejitter", "Average delta between successive frame times"),
FRAMETIME("frametime", "Measured frame time"),
- SIM_PING("simpingstat");
+ SIM_PING("simpingstat"),
+ FRAMETIME_JITTER_99TH("frametimejitter99", "99th percentile of frametime jitter over the last 5 seconds."),
+ FRAMETIME_JITTER_95TH("frametimejitter95", "99th percentile of frametime jitter over the last 5 seconds."),
+ FRAMETIME_99TH("frametime99", "99th percentile of frametime over the last 5 seconds."),
+ FRAMETIME_95TH("frametime95", "99th percentile of frametime over the last 5 seconds."),
+ FRAMETIME_JITTER_CUMULATIVE("frametimejitcumulative", "Cumulative frametime jitter over the session."),
+ FRAMETIME_JITTER_STDDEV("frametimejitterstddev", "Standard deviation of frametime jitter in a 5 second period."),
+ FRAMETIME_STDDEV("frametimestddev", "Standard deviation of frametime in a 5 second period.");
+
+LLTrace::SampleStatHandle<U32> FRAMETIME_JITTER_EVENTS("frametimeevents", "Number of frametime events in the session. Applies when jitter exceeds 10% of the previous frame."),
+ FRAMETIME_JITTER_EVENTS_PER_MINUTE("frametimeeventspm", "Average number of frametime events per minute."),
+ FRAMETIME_JITTER_EVENTS_LAST_MINUTE("frametimeeventslastmin", "Number of frametime events in the last minute.");
+
+LLTrace::SampleStatHandle<F64> NOTRMALIZED_FRAMETIME_JITTER_SESSION("normalizedframetimejitter", "Normalized frametime jitter over the session.");
+LLTrace::SampleStatHandle<F64> NFTV("nftv", "Normalized frametime variation.");
+LLTrace::SampleStatHandle<F64> NORMALIZED_FRAMTIME_JITTER_PERIOD("normalizedframetimejitterperiod", "Normalized frametime jitter over the last 5 seconds.");
LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Meters> > AGENT_POSITION_SNAP("agentpositionsnap", "agent position corrections");
@@ -264,16 +279,128 @@ void LLViewerStats::resetStats()
getRecording().reset();
}
+// Helper for calculating Nth percentile with linear interpolation
+template<typename T>
+T calcPercentile(const std::vector<T>& sorted, double percent)
+{
+ if (sorted.empty())
+ return T(0);
+ double idx = percent * (sorted.size() - 1);
+ size_t idx_below = static_cast<size_t>(std::floor(idx));
+ size_t idx_above = static_cast<size_t>(std::ceil(idx));
+ if (idx_below == idx_above)
+ return sorted[idx_below];
+ double weight_above = idx - idx_below;
+ return sorted[idx_below] * (1.0 - weight_above) + sorted[idx_above] * weight_above;
+}
+
+template<typename T>
+T calcStddev(const std::vector<T>& values)
+{
+ if (values.size() < 2)
+ return T(0);
+ double sum = 0, sq_sum = 0;
+ for (const auto& v : values)
+ {
+ double d = v.value();
+ sum += d;
+ sq_sum += d * d;
+ }
+ double mean = sum / values.size();
+ double variance = (sq_sum / values.size()) - (mean * mean);
+ return T(std::sqrt(variance));
+}
+
void LLViewerStats::updateFrameStats(const F64Seconds time_diff)
{
if (gFrameCount && mLastTimeDiff > (F64Seconds)0.0)
{
+ mTotalTime += time_diff;
sample(LLStatViewer::FRAMETIME, time_diff);
// old stats that were never really used
F64Seconds jit = (F64Seconds)std::fabs((mLastTimeDiff - time_diff));
sample(LLStatViewer::FRAMETIME_JITTER, jit);
- }
+ mTotalFrametimeJitter += jit;
+ sample(LLStatViewer::FRAMETIME_JITTER_CUMULATIVE, mTotalFrametimeJitter);
+ sample(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION, mTotalFrametimeJitter / mTotalTime);
+
+ mLastNoramlizedSessionJitter = mTotalFrametimeJitter / mTotalTime;
+
+ static LLCachedControl<F32> frameTimeEventThreshold(gSavedSettings, "StatsFrametimeEventThreshold", 0.1f);
+
+ if (time_diff - mLastTimeDiff > mLastTimeDiff * frameTimeEventThreshold())
+ {
+ sample(LLStatViewer::FRAMETIME_JITTER_EVENTS, mFrameJitterEvents++);
+ mFrameJitterEventsLastMinute++;
+ }
+
+ mFrameTimes.push_back(time_diff);
+ mFrameTimesJitter.push_back(jit);
+
+ mLastFrameTimeSample += time_diff;
+ mTimeSinceLastEventSample += time_diff;
+
+ static LLCachedControl<S32> frameTimeSampleSeconds(gSavedSettings, "StatsFrametimeSampleSeconds", 5);
+
+ if (mLastFrameTimeSample >= frameTimeSampleSeconds())
+ {
+ std::sort(mFrameTimes.begin(), mFrameTimes.end());
+ std::sort(mFrameTimesJitter.begin(), mFrameTimesJitter.end());
+
+ // Use new helpers for calculations
+ F64Seconds frame_time_stddev = calcStddev(mFrameTimes);
+ sample(LLStatViewer::FRAMETIME_STDDEV, frame_time_stddev);
+ F64Seconds ninety_ninth_percentile = calcPercentile(mFrameTimes, 0.99);
+ F64Seconds ninety_fifth_percentile = calcPercentile(mFrameTimes, 0.95);
+ sample(LLStatViewer::FRAMETIME_99TH, ninety_ninth_percentile);
+ sample(LLStatViewer::FRAMETIME_95TH, ninety_fifth_percentile);
+
+ frame_time_stddev = calcStddev(mFrameTimesJitter);
+ sample(LLStatViewer::FRAMETIME_JITTER_STDDEV, frame_time_stddev);
+
+ ninety_ninth_percentile = calcPercentile(mFrameTimesJitter, 0.99);
+ ninety_fifth_percentile = calcPercentile(mFrameTimesJitter, 0.95);
+ sample(LLStatViewer::FRAMETIME_JITTER_99TH, ninety_ninth_percentile);
+ sample(LLStatViewer::FRAMETIME_JITTER_95TH, ninety_fifth_percentile);
+
+ F64 averageFrameTime = 0;
+ for (const auto& frame_time : mFrameTimes)
+ {
+ averageFrameTime += frame_time.value();
+ }
+ averageFrameTime /= mFrameTimes.size();
+
+ sample(LLStatViewer::NFTV, frame_time_stddev / averageFrameTime);
+ mLastNormalizedFrametimeVariance = frame_time_stddev / averageFrameTime;
+
+ // Add up all of the jitter values.
+ F64 totalJitter = 0;
+ for (const auto& frame_jitter : mFrameTimesJitter)
+ {
+ totalJitter += frame_jitter.value();
+ }
+
+ mLastNormalizedPeriodJitter = totalJitter / mLastFrameTimeSample;
+
+ sample(LLStatViewer::NORMALIZED_FRAMTIME_JITTER_PERIOD, mLastNormalizedPeriodJitter);
+
+ mFrameTimes.clear();
+ mFrameTimesJitter.clear();
+ mLastFrameTimeSample = F64Seconds(0);
+ }
+
+ if (mTimeSinceLastEventSample >= 60)
+ {
+ mEventMinutes++;
+ // Calculate average events per minute
+ U64 frame_time_events_per_minute = (U64)mFrameJitterEvents / mEventMinutes;
+ sample(LLStatViewer::FRAMETIME_JITTER_EVENTS_PER_MINUTE, frame_time_events_per_minute);
+ sample(LLStatViewer::FRAMETIME_JITTER_EVENTS_LAST_MINUTE, mFrameJitterEventsLastMinute);
+ mFrameJitterEventsLastMinute = 0;
+ mTimeSinceLastEventSample = F64Seconds(0);
+ }
+ }
mLastTimeDiff = time_diff;
}
@@ -546,6 +673,11 @@ void send_viewer_stats(bool include_preferences)
// send fps only for time app spends in foreground
agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32();
+
+ agent["normalized_session_jitter"] = LLViewerStats::instance().getLastNormalizedSessionJitter();
+ agent["normalized_frametime_variance"] = LLViewerStats::instance().getLastNormalizedFrametimeVariance();
+ agent["normalized_period_jitter"] = LLViewerStats::instance().getLastNormalizedPeriodJitter();
+
agent["version"] = LLVersionInfo::instance().getChannelAndVersion();
std::string language = LLUI::getLanguage();
agent["language"] = language;
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 8aed1c537e..1ac8b2f66b 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -229,6 +229,9 @@ extern LLTrace::EventStatHandle<F64Seconds > AVATAR_EDIT_TIME,
extern LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > OBJECT_CACHE_HIT_RATE;
+extern LLTrace::SampleStatHandle<F64> NOTRMALIZED_FRAMETIME_JITTER_SESSION;
+extern LLTrace::SampleStatHandle<F64> NORMALIZED_FRAMTIME_JITTER_PERIOD;
+
}
class LLViewerStats : public LLSingleton<LLViewerStats>
@@ -271,10 +274,30 @@ public:
LLTrace::Recording& getRecording() { return mRecording; }
const LLTrace::Recording& getRecording() const { return mRecording; }
+ F64 getLastNormalizedSessionJitter() const { return mLastNoramlizedSessionJitter; }
+ F64 getLastNormalizedFrametimeVariance() const { return mLastNormalizedFrametimeVariance; }
+ F64 getLastNormalizedPeriodJitter() const { return mLastNormalizedPeriodJitter; }
+
private:
LLTrace::Recording mRecording;
F64Seconds mLastTimeDiff; // used for time stat updates
+ F64Seconds mTotalFrametimeJitter;
+
+ U32 mFrameJitterEvents = 0;
+ U32 mFrameJitterEventsLastMinute = 0;
+ U32 mEventMinutes = 0;
+ F64Seconds mTotalTime;
+
+ F64Seconds mLastFrameTimeSample; // used for frame time stats
+ F64Seconds mTimeSinceLastEventSample;
+ std::vector<F64Seconds> mFrameTimes; // used for frame time stats
+ std::vector<F64Seconds> mFrameTimesJitter; // used for frame time jitter stats
+
+ F64 mLastNoramlizedSessionJitter; // used for frame time jitter stats
+ F64 mLastNormalizedFrametimeVariance; // Used when submitting jitter stats
+ F64 mLastNormalizedPeriodJitter;
+
};
static const F32 SEND_STATS_PERIOD = 300.0f;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 4a9dd1c1b6..c7513ded62 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -406,7 +406,10 @@ void LLViewerTextureManager::init()
}
}
}
- imagep->createGLTexture(0, image_raw);
+ if (!imagep->createGLTexture(0, image_raw))
+ {
+ LL_WARNS() << "Failed to create default texture " << IMG_DEFAULT << LL_ENDL;
+ }
image_raw = NULL;
#else
LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, true, LLGLTexture::BOOST_UI);
@@ -524,12 +527,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 +552,6 @@ void LLViewerTexture::updateClass()
}
was_low = is_low;
- was_sys_low = is_sys_low;
if (is_low)
{
@@ -561,8 +570,13 @@ void LLViewerTexture::updateClass()
sEvaluationTimer.reset();
// lower discard bias over time when at least 10% of budget is free
- const F32 FREE_PERCENTAGE_TRESHOLD = -0.1f;
- if (sDesiredDiscardBias > 1.f && over_pct < FREE_PERCENTAGE_TRESHOLD)
+ constexpr F32 FREE_PERCENTAGE_TRESHOLD = -0.1f;
+ constexpr U32 FREE_SYS_MEM_TRESHOLD = 100;
+ static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
+ const S32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory() + FREE_SYS_MEM_TRESHOLD);
+ if (sDesiredDiscardBias > 1.f
+ && over_pct < FREE_PERCENTAGE_TRESHOLD
+ && getFreeSystemMemory() > MIN_FREE_MAIN_MEMORY)
{
static LLCachedControl<F32> high_mem_discard_decrement(gSavedSettings, "RenderHighMemMinDiscardDecrement", .1f);
@@ -629,24 +643,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
@@ -1107,6 +1151,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
mOrigHeight = 0;
mHasAux = false;
mNeedsAux = false;
+ mLastWorkerDiscardLevel = -1;
mRequestedDiscardLevel = -1;
mRequestedDownloadPriority = 0.f;
mFullyLoaded = false;
@@ -1259,12 +1304,11 @@ void LLViewerFetchedTexture::loadFromFastCache()
if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL)
{
- S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS;
- S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS;
- if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height))
+ if (mRawImage && (mRawImage->getWidth() > DEFAULT_THUMBNAIL_DIMENSIONS || mRawImage->getHeight() > DEFAULT_THUMBNAIL_DIMENSIONS))
{
- // scale oversized icon, no need to give more work to gl
- mRawImage->scale(expected_width, expected_height);
+ // Scale oversized thumbnail
+ // thumbnails aren't supposed to go over DEFAULT_THUMBNAIL_DIMENSIONS
+ mRawImage->scale(DEFAULT_THUMBNAIL_DIMENSIONS, DEFAULT_THUMBNAIL_DIMENSIONS);
}
}
@@ -1957,9 +2001,9 @@ bool LLViewerFetchedTexture::processFetchResults(S32& desired_discard, S32 curre
bool LLViewerFetchedTexture::updateFetch()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled", false);
+ static LLCachedControl<bool> textures_decode_disabled(gSavedSettings, "TextureDecodeDisabled", false);
- if(textures_decode_disabled) // don't fetch the surface textures in wireframe mode
+ if (textures_decode_disabled) // don't fetch the surface textures in wireframe mode
{
return false;
}
@@ -1994,7 +2038,7 @@ bool LLViewerFetchedTexture::updateFetch()
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - callback pending");
return false; // process any raw image data in callbacks before replacing
}
- if(mInFastCacheList)
+ if (mInFastCacheList)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - in fast cache");
return false;
@@ -2019,7 +2063,7 @@ bool LLViewerFetchedTexture::updateFetch()
if (mAuxRawImage.notNull()) sAuxCount--;
// keep in mind that fetcher still might need raw image, don't modify original
bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mFetchState, mRawImage, mAuxRawImage,
- mLastHttpGetStatus);
+ mLastHttpGetStatus);
if (mRawImage.notNull()) sRawCount++;
if (mAuxRawImage.notNull())
{
@@ -2035,7 +2079,7 @@ bool LLViewerFetchedTexture::updateFetch()
else
{
mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority,
- mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP);
+ mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP);
}
if (!processFetchResults(desired_discard, current_discard, fetch_discard, decode_priority))
@@ -2046,7 +2090,7 @@ bool LLViewerFetchedTexture::updateFetch()
if (mIsFetching)
{
static const F32 MAX_HOLD_TIME = 5.0f; //seconds to wait before canceling fecthing if decode_priority is 0.f.
- if(decode_priority > 0.0f || mStopFetchingTimer.getElapsedTimeF32() > MAX_HOLD_TIME)
+ if (decode_priority > 0.0f || mStopFetchingTimer.getElapsedTimeF32() > MAX_HOLD_TIME)
{
mStopFetchingTimer.reset();
LLAppViewer::getTextureFetch()->updateRequestPriority(mID, decode_priority);
@@ -2062,7 +2106,7 @@ bool LLViewerFetchedTexture::updateFetch()
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - priority <= 0");
make_request = false;
}
- else if(mDesiredDiscardLevel > getMaxDiscardLevel())
+ else if (mDesiredDiscardLevel > getMaxDiscardLevel())
{
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - desired > max");
make_request = false;
@@ -2103,7 +2147,7 @@ bool LLViewerFetchedTexture::updateFetch()
if (make_request)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - make request");
- S32 w=0, h=0, c=0;
+ S32 w = 0, h = 0, c = 0;
if (getDiscardLevel() >= 0)
{
w = mGLTexturep->getWidth(0);
@@ -2112,7 +2156,7 @@ bool LLViewerFetchedTexture::updateFetch()
}
const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
- if (override_tex_discard_level != 0)
+ if (override_tex_discard_level != 0 && override_tex_discard_level <= MAX_DISCARD_LEVEL)
{
desired_discard = override_tex_discard_level;
}
@@ -2121,18 +2165,19 @@ bool LLViewerFetchedTexture::updateFetch()
S32 fetch_request_response = -1;
S32 worker_discard = -1;
fetch_request_response = LLAppViewer::getTextureFetch()->createRequest(mFTType, mUrl, getID(), getTargetHost(), decode_priority,
- w, h, c, desired_discard, needsAux(), mCanUseHTTP);
+ w, h, c, desired_discard, needsAux(), mCanUseHTTP);
if (fetch_request_response >= 0) // positive values and 0 are discard values
{
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - request created");
mHasFetcher = true;
mIsFetching = true;
+ mLastWorkerDiscardLevel = worker_discard;
// in some cases createRequest can modify discard, as an example
// bake textures are always at discard 0
mRequestedDiscardLevel = llmin(desired_discard, fetch_request_response);
mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority,
- mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP);
+ mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP);
}
else if (fetch_request_response == LLTextureFetch::CREATE_REQUEST_ERROR_TRANSITION)
{
@@ -2146,7 +2191,7 @@ bool LLViewerFetchedTexture::updateFetch()
S32 decoded_discard;
bool decoded;
S32 fetch_state = LLAppViewer::getTextureFetch()->getLastFetchState(mID, desired_discard, decoded_discard, decoded);
- if (fetch_state > 1 && decoded && decoded_discard >=0 && decoded_discard <= desired_discard)
+ if (fetch_state > 1 && decoded && decoded_discard >= 0 && decoded_discard <= desired_discard)
{
// worker actually has the image
if (mRawImage.notNull()) sRawCount--;
@@ -2770,11 +2815,9 @@ void LLViewerFetchedTexture::saveRawImage()
}
else if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL)
{
- S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS;
- S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS;
- if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)
+ if (mRawImage->getWidth() > DEFAULT_THUMBNAIL_DIMENSIONS || mRawImage->getHeight() > DEFAULT_THUMBNAIL_DIMENSIONS)
{
- mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents());
+ mSavedRawImage = new LLImageRaw(DEFAULT_THUMBNAIL_DIMENSIONS, DEFAULT_THUMBNAIL_DIMENSIONS, mRawImage->getComponents());
mSavedRawImage->copyScaled(mRawImage);
}
else
@@ -2973,7 +3016,7 @@ void LLViewerLODTexture::processTextureStats()
// restrict texture resolution to download based on RenderMaxTextureResolution
static LLCachedControl<U32> max_texture_resolution(gSavedSettings, "RenderMaxTextureResolution", 2048);
// sanity clamp debug setting to avoid settings hack shenanigans
- max_tex_res = (F32)llclamp((S32)max_texture_resolution, 512, MAX_IMAGE_SIZE_DEFAULT);
+ max_tex_res = (F32)llclamp((S32)max_texture_resolution, 128, MAX_IMAGE_SIZE_DEFAULT);
mMaxVirtualSize = llmin(mMaxVirtualSize, max_tex_res * max_tex_res);
}
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index e1582c74bd..2937651995 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -115,6 +115,8 @@ public:
static void initClass();
static void updateClass();
static bool isSystemMemoryLow();
+ static bool isSystemMemoryCritical();
+ static F32 getSystemMemoryBudgetFactor();
LLViewerTexture(bool usemipmaps = true);
LLViewerTexture(const LLUUID& id, bool usemipmaps) ;
@@ -189,6 +191,8 @@ private:
friend class LLBumpImageList;
friend class LLUIImageList;
+ static U32Megabytes getFreeSystemMemory();
+
protected:
friend class LLViewerTextureList;
LLUUID mID;
@@ -444,6 +448,7 @@ protected:
bool mKnownDrawSizeChanged ;
std::string mUrl;
+ S32 mLastWorkerDiscardLevel;
S32 mRequestedDiscardLevel;
F32 mRequestedDownloadPriority;
S32 mFetchState;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 40daac887d..5bbcd8f09f 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -921,6 +921,7 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
bool on_screen = false;
U32 face_count = 0;
+ U32 max_faces_to_check = 1024;
// get adjusted bias based on image resolution
LLImageGL* img = imagep->getGLTexture();
@@ -933,13 +934,15 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
{
- for (S32 fi = 0; fi < imagep->getNumFaces(i); ++fi)
+ face_count += imagep->getNumFaces(i);
+ S32 faces_to_check = (face_count > max_faces_to_check) ? 0 : imagep->getNumFaces(i);
+
+ for (S32 fi = 0; fi < faces_to_check; ++fi)
{
LLFace* face = (*(imagep->getFaceList(i)))[fi];
if (face && face->getViewerObject())
{
- ++face_count;
F32 radius;
F32 cos_angle_to_view_dir;
@@ -1002,11 +1005,10 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
}
}
- if (face_count > 1024)
+ if (face_count > max_faces_to_check)
{ // this texture is used in so many places we should just boost it and not bother checking its vsize
// this is especially important because the above is not time sliced and can hit multiple ms for a single texture
- imagep->setBoostLevel(LLViewerFetchedTexture::BOOST_HIGH);
- // Do we ever remove it? This also sets texture nodelete!
+ max_vsize = MAX_IMAGE_AREA;
}
if (imagep->getType() == LLViewerTexture::LOD_TEXTURE && imagep->getBoostLevel() == LLViewerTexture::BOOST_NONE)
@@ -1144,6 +1146,8 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
// just in case we downres textures, bind downresmap and copy program
gPipeline.mDownResMap.bindTarget();
+ //gPipeline.mDownResMap.clear();
+
gCopyProgram.bind();
gPipeline.mScreenTriangleVB->setBuffer();
@@ -1153,7 +1157,7 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
// do at least 5 and make sure we don't get too far behind even if it violates
// the time limit. If we don't downscale quickly the viewer will hit swap and may
// freeze.
- S32 min_count = (S32)mCreateTextureList.size() / 20 + 5;
+ S32 min_count = (S32)mCreateTextureList.size() / 20 + 3;
create_timer.reset();
while (!mDownScaleQueue.empty())
@@ -1205,6 +1209,8 @@ F32 LLViewerTextureList::updateImagesLoadingFastCache(F32 max_time)
enditer = iter;
LLViewerFetchedTexture *imagep = *curiter;
imagep->loadFromFastCache();
+ if (timer.getElapsedTimeF32() > max_time)
+ break;
}
mFastCacheList.erase(mFastCacheList.begin(), enditer);
return timer.getElapsedTimeF32();
@@ -1316,7 +1322,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
LLTimer timer;
//loading from fast cache
- updateImagesLoadingFastCache(max_time);
+ max_time -= updateImagesLoadingFastCache(max_time);
// Update texture stats and priorities
std::vector<LLPointer<LLViewerFetchedTexture> > image_list;
@@ -1447,6 +1453,15 @@ bool LLViewerTextureList::createUploadFile(const std::string& filename,
image->setLastError("Couldn't load the image to be uploaded.");
return false;
}
+
+ // calcDataSizeJ2C assumes maximum size is 2048 and for bigger images can
+ // assign discard to bring imige to needed size, but upload does the scaling
+ // as needed, so just reset discard.
+ // Assume file is full and has 'discard' 0 data.
+ // Todo: probably a better idea to have some setMaxDimentions in J2C
+ // called when loading from a local file
+ image->setDiscardLevel(0);
+
// Decompress or expand it in a raw image structure
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
if (!image->decode(raw_image, 0.0f))
diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp
index 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 ef6409c23b..ef24bcf598 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;
@@ -1424,11 +1429,17 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask
mWindow->showCursorFromMouseMove();
- if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME
- && !gDisconnected)
+ if (!gDisconnected)
+ {
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
}
+ else
+ {
+ gAwayTriggerTimer.reset();
+ }
+ }
}
void LLViewerWindow::handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask)
@@ -1455,18 +1466,43 @@ void LLViewerWindow::handleMouseLeave(LLWindow *window)
LLToolTipMgr::instance().blockToolTips();
}
-bool LLViewerWindow::handleCloseRequest(LLWindow *window)
+bool LLViewerWindow::handleCloseRequest(LLWindow *window, bool from_user)
{
if (!LLApp::isExiting() && !LLApp::isStopped())
{
- // User has indicated they want to close, but we may need to ask
- // about modified documents.
- LLAppViewer::instance()->userQuit();
- // Don't quit immediately
+ if (from_user)
+ {
+ // User has indicated they want to close, but we may need to ask
+ // about modified documents.
+ LLAppViewer::instance()->userQuit();
+ // Don't quit immediately
+ }
+ else
+ {
+ // OS is asking us to quit, assume we have time and start cleanup
+ LLAppViewer::instance()->requestQuit();
+ }
}
return false;
}
+bool LLViewerWindow::handleSessionExit(LLWindow* window)
+{
+ if (!LLApp::isExiting() && !LLApp::isStopped())
+ {
+ // Viewer received WM_ENDSESSION and app will be killed soon if it doesn't respond
+ LLAppViewer* app = LLAppViewer::instance();
+ app->sendSimpleLogoutRequest();
+ app->earlyExitNoNotify();
+
+ // Not viewer's fault, remove marker files so
+ // that statistics won't consider this to be a crash
+ app->removeMarkerFiles();
+ return false;
+ }
+ return true;
+}
+
void LLViewerWindow::handleQuit(LLWindow *window)
{
if (gNonInteractive)
@@ -1547,6 +1583,10 @@ bool LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, bool repeated)
{
gAgent.clearAFK();
}
+ else
+ {
+ gAwayTriggerTimer.reset();
+ }
// *NOTE: We want to interpret KEY_RETURN later when it arrives as
// a Unicode char, not as a keydown. Otherwise when client frame
@@ -1882,7 +1922,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
p.ignore_pixel_depth,
0,
max_core_count,
- max_gl_version); //don't use window level anti-aliasing
+ max_gl_version); //don't use window level anti-aliasing, windows only
if (NULL == mWindow)
{
@@ -1967,7 +2007,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
LL_DEBUGS("Window") << "Loading feature tables." << LL_ENDL;
// Initialize OpenGL Renderer
- LLVertexBuffer::initClass(mWindow);
+ LLVertexBuffer::initClass(mWindow, gSavedSettings.getU32("MPVertexBufferMode"));
LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ;
if (!gGL.init(true))
{
@@ -2026,6 +2066,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
std::string LLViewerWindow::getLastSnapshotDir()
{
+ static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
return sSnapshotDir;
}
@@ -2283,24 +2324,23 @@ void LLViewerWindow::initWorldUI()
gToolBarView->setVisible(true);
}
- if (!gNonInteractive)
+ // Don't preload cef instances on low end hardware
+ const F32Gigabytes MIN_PHYSICAL_MEMORY(8);
+ F32Gigabytes physical_mem = LLMemory::getMaxMemKB();
+ if (physical_mem <= 0)
{
- LLMediaCtrl* destinations = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
- if (destinations)
- {
- destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- std::string url = gSavedSettings.getString("DestinationGuideURL");
- url = LLWeb::expandURLSubstitutions(url, LLSD());
- destinations->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
- }
- LLMediaCtrl* avatar_picker = LLFloaterReg::getInstance("avatar")->findChild<LLMediaCtrl>("avatar_picker_contents");
- if (avatar_picker)
- {
- avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- std::string url = gSavedSettings.getString("AvatarPickerURL");
- url = LLWeb::expandURLSubstitutions(url, LLSD());
- avatar_picker->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
- }
+ LLMemory::updateMemoryInfo();
+ physical_mem = LLMemory::getMaxMemKB();
+ }
+
+ if (!gNonInteractive && physical_mem > MIN_PHYSICAL_MEMORY)
+ {
+ LL_INFOS() << "Preloading cef instances" << LL_ENDL;
+
+ LLFloaterReg::getInstance("destinations");
+ LLFloaterReg::getInstance("avatar_welcome_pack");
+ LLFloaterReg::getInstance("search");
+ LLFloaterReg::getInstance("marketplace");
}
}
@@ -3017,7 +3057,8 @@ bool LLViewerWindow::handleKey(KEY key, MASK mask)
{
if ((focusedFloaterName == "nearby_chat") || (focusedFloaterName == "im_container") || (focusedFloaterName == "impanel"))
{
- if (gSavedSettings.getBOOL("ArrowKeysAlwaysMove"))
+ LLCachedControl<bool> key_move(gSavedSettings, "ArrowKeysAlwaysMove");
+ if (key_move())
{
// let Control-Up and Control-Down through for chat line history,
if (!(key == KEY_UP && mask == MASK_CONTROL)
@@ -3031,10 +3072,9 @@ bool LLViewerWindow::handleKey(KEY key, MASK mask)
case KEY_RIGHT:
case KEY_UP:
case KEY_DOWN:
- case KEY_PAGE_UP:
- case KEY_PAGE_DOWN:
- case KEY_HOME:
- case KEY_END:
+ case KEY_PAGE_UP: //jump
+ case KEY_PAGE_DOWN: // down
+ case KEY_HOME: // toggle fly
// when chatbar is empty or ArrowKeysAlwaysMove set,
// pass arrow keys on to avatar...
return false;
@@ -3289,7 +3329,31 @@ void LLViewerWindow::clearPopups()
void LLViewerWindow::moveCursorToCenter()
{
- if (! gSavedSettings.getBOOL("DisableMouseWarp"))
+ bool mouse_warp = false;
+ LLCachedControl<S32> mouse_warp_mode(gSavedSettings, "MouseWarpMode", 1);
+
+ switch (mouse_warp_mode())
+ {
+ case 0:
+ // For Windows:
+ // Mouse usually uses 'delta' position since it isn't aware of own location, keep it centered.
+ // Touch screen reports absolute or virtual absolute position and warping a physical
+ // touch is pointless, so don't move it.
+ //
+ // MacOS
+ // If 'decoupled', CGAssociateMouseAndMouseCursorPosition can make mouse stay in
+ // one place and not move, do not move it (needs testing).
+ mouse_warp = mWindow->isWrapMouse();
+ break;
+ case 1:
+ mouse_warp = true;
+ break;
+ default:
+ mouse_warp = false;
+ break;
+ }
+
+ if (mouse_warp)
{
S32 x = getWorldViewWidthScaled() / 2;
S32 y = getWorldViewHeightScaled() / 2;
@@ -3848,7 +3912,7 @@ void LLViewerWindow::updateLayout()
void LLViewerWindow::updateMouseDelta()
{
-#if LL_WINDOWS
+#if LL_WINDOWS && !LL_SDL
LLCoordCommon delta;
mWindow->getCursorDelta(&delta);
S32 dx = delta.mX;
@@ -4724,6 +4788,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.
@@ -4778,11 +4843,22 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
// Check if there is enough free space to save snapshot
#ifdef LL_WINDOWS
- boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir));
+ boost::filesystem::path b_path(ll_convert<std::wstring>(lastSnapshotDir));
#else
boost::filesystem::path b_path(lastSnapshotDir);
#endif
- if (!boost::filesystem::is_directory(b_path))
+ boost::system::error_code ec;
+ if (!boost::filesystem::is_directory(b_path, ec) || ec.failed())
+ {
+ LLSD args;
+ args["PATH"] = lastSnapshotDir;
+ LLNotificationsUtil::add("SnapshotToLocalDirNotExist", args);
+ resetSnapshotLoc();
+ failure_cb();
+ return;
+ }
+ boost::filesystem::space_info b_space = boost::filesystem::space(b_path, ec);
+ if (ec.failed())
{
LLSD args;
args["PATH"] = lastSnapshotDir;
@@ -4791,7 +4867,6 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
failure_cb();
return;
}
- boost::filesystem::space_info b_space = boost::filesystem::space(b_path);
if (b_space.free < image->getDataSize())
{
LLSD args;
@@ -4808,8 +4883,13 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
LLNotificationsUtil::add("SnapshotToComputerFailed", args);
failure_cb();
+
+ // Shouldn't there be a return here?
}
+ static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot"));
+ static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
+
// Look for an unused file name
auto is_snapshot_name_loc_set = isSnapshotLocSet();
std::string filepath;
@@ -4817,13 +4897,21 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
auto err = 0;
auto extension("." + image->getExtension());
auto now = LLDate::now();
+ static LLCachedControl<bool> snapshot_timestamp(gSavedSettings, "SnapshotTimestamp", true);
do
{
filepath = sSnapshotDir;
filepath += gDirUtilp->getDirDelimiter();
filepath += sSnapshotBaseName;
+ if (snapshot_timestamp)
+ {
filepath += now.toLocalDateString("_%Y-%m-%d_%H%M%S");
filepath += llformat("%.2d", i);
+ }
+ else if (is_snapshot_name_loc_set)
+ {
+ filepath += llformat("_%.3d", i);
+ }
filepath += extension;
llstat stat_info;
@@ -4862,12 +4950,12 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height)
}
}
-bool LLViewerWindow::saveSnapshot(const std::string& filepath, S32 image_width, S32 image_height, bool show_ui, bool show_hud, bool do_rebuild, LLSnapshotModel::ESnapshotLayerType type, LLSnapshotModel::ESnapshotFormat format)
+bool LLViewerWindow::saveSnapshot(const std::string& filepath, S32 image_width, S32 image_height, bool show_ui, bool show_hud, bool do_rebuild, bool show_balance, LLSnapshotModel::ESnapshotLayerType type, LLSnapshotModel::ESnapshotFormat format)
{
LL_INFOS() << "Saving snapshot to: " << filepath << LL_ENDL;
LLPointer<LLImageRaw> raw = new LLImageRaw;
- bool success = rawSnapshot(raw, image_width, image_height, true, false, show_ui, show_hud, do_rebuild);
+ bool success = rawSnapshot(raw, image_width, image_height, true, false, show_ui, show_hud, do_rebuild, show_balance);
if (success)
{
@@ -4917,8 +5005,8 @@ void LLViewerWindow::playSnapshotAnimAndSound()
bool LLViewerWindow::isSnapshotLocSet() const
{
- std::string snapshot_dir = sSnapshotDir;
- return !snapshot_dir.empty();
+ static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
+ return !sSnapshotDir().empty();
}
void LLViewerWindow::resetSnapshotLoc() const
@@ -4928,14 +5016,14 @@ void LLViewerWindow::resetSnapshotLoc() const
bool LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type)
{
- return rawSnapshot(raw, preview_width, preview_height, false, false, show_ui, show_hud, do_rebuild, no_post, type);
+ return rawSnapshot(raw, preview_width, preview_height, false, false, show_ui, show_hud, do_rebuild, no_post, gSavedSettings.getBOOL("RenderBalanceInSnapshot"), type);
}
// Saves the image from the screen to a raw image
// Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy
// the results over to the final raw image.
bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height,
- bool keep_window_aspect, bool is_texture, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type, S32 max_size)
+ bool keep_window_aspect, bool is_texture, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, bool show_balance, LLSnapshotModel::ESnapshotLayerType type, S32 max_size)
{
if (!raw)
{
@@ -4993,6 +5081,8 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// If the user wants the UI, limit the output size to the available screen size
image_width = llmin(image_width, window_width);
image_height = llmin(image_height, window_height);
+
+ setBalanceVisible(show_balance);
}
S32 original_width = 0;
@@ -5070,11 +5160,13 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
}
else
{
+ setBalanceVisible(true);
return false;
}
if (raw->isBufferInvalid())
{
+ setBalanceVisible(true);
return false;
}
@@ -5161,7 +5253,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
glReadPixels(
subimage_x_offset, out_y + subimage_y_offset,
read_width, 1,
- GL_DEPTH_COMPONENT, GL_FLOAT,
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
depth_line_buffer->getData()// current output pixel is beginning of buffer...
);
@@ -5250,6 +5342,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
{
send_agent_resume();
}
+ setBalanceVisible(true);
return ret;
}
@@ -5715,6 +5808,14 @@ void LLViewerWindow::setProgressCancelButtonVisible( bool b, const std::string&
}
}
+void LLViewerWindow::setBalanceVisible(bool visible)
+{
+ if (gStatusBar)
+ {
+ gStatusBar->setBalanceVisible(visible);
+ }
+}
+
LLProgressView *LLViewerWindow::getProgressView() const
{
return mProgressView;
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index ac0dfa3fe4..61aa84394c 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -197,7 +197,8 @@ public:
/*virtual*/ bool handleUnicodeChar(llwchar uni_char, MASK mask); // NOT going to handle extended
/*virtual*/ bool handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ bool handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
- /*virtual*/ bool handleCloseRequest(LLWindow *window);
+ /*virtual*/ bool handleCloseRequest(LLWindow *window, bool from_user);
+ /*virtual*/ bool handleSessionExit(LLWindow* window);
/*virtual*/ void handleQuit(LLWindow *window);
/*virtual*/ bool handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ bool handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
@@ -364,9 +365,11 @@ public:
// snapshot functionality.
// perhaps some of this should move to llfloatershapshot? -MG
- bool saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, bool show_ui = true, bool show_hud = true, bool do_rebuild = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP);
- bool rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool keep_window_aspect = true, bool is_texture = false,
- bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool no_post = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE);
+ bool saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool show_balance = true,
+ LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP);
+ bool rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool keep_window_aspect = true, bool is_texture = false,
+ bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool no_post = false, bool show_balance = true,
+ LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE);
bool simpleSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, const int num_render_passes);
@@ -462,6 +465,8 @@ public:
void calcDisplayScale();
static LLRect calcScaledRect(const LLRect & rect, const LLVector2& display_scale);
+ void setBalanceVisible(bool visible);
+
static std::string getLastSnapshotDir();
LLView* getFloaterSnapRegion() { return mFloaterSnapRegion; }
diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp
index da7e18af5c..3119c31613 100644
--- a/indra/newview/llviewerwindowlistener.cpp
+++ b/indra/newview/llviewerwindowlistener.cpp
@@ -100,7 +100,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
}
type = found->second;
}
- bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, showhud, rebuild, type);
+ bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, showhud, rebuild, true /*L$ Balance*/, type);
sendReply(LLSDMap("ok", ok), event);
}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 1cca2161fe..910f711a9d 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -123,8 +123,8 @@ extern F32 ANIM_SPEED_MAX;
extern F32 ANIM_SPEED_MIN;
extern U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG;
-const F32 MAX_HOVER_Z = 2.0;
-const F32 MIN_HOVER_Z = -2.0;
+const F32 MAX_HOVER_Z = 3.0;
+const F32 MIN_HOVER_Z = -3.0;
const F32 MIN_ATTACHMENT_COMPLEXITY = 0.f;
const F32 DEFAULT_MAX_ATTACHMENT_COMPLEXITY = 1.0e6f;
@@ -576,7 +576,7 @@ private:
// joint states to be animated
//-------------------------------------------------------------------------
LLPointer<LLJointState> mPelvisState;
- LLCharacter* mCharacter;
+ LLCharacter* mCharacter;
};
/**
@@ -679,11 +679,13 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mVisuallyMuteSetting(AV_RENDER_NORMALLY),
mMutedAVColor(LLColor4::white /* used for "uninitialize" */),
mFirstFullyVisible(true),
+ mWaitingForMeshes(false),
mFirstDecloudTime(-1.f),
mFullyLoaded(false),
mPreviousFullyLoaded(false),
mFullyLoadedInitialized(false),
mLastCloudAttachmentCount(-1),
+ mFullyLoadedFrameCounter(0),
mVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
mLoadedCallbacksPaused(false),
mLoadedCallbackTextures(0),
@@ -777,11 +779,9 @@ std::string LLVOAvatar::avString() const
{
return " " + getFullname() + " ";
}
- else
- {
- std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus());
- return " Avatar '" + getFullname() + "' " + viz_string + " ";
- }
+
+ std::string status = LLVOAvatar::rezStatusToString(getRezzedStatus());
+ return " Avatar '" + getDebugName() + "' " + status + " ";
}
void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string comment)
@@ -804,10 +804,10 @@ void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string c
if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
{
LLSD args;
- args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
- args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32());
+ args["EXISTENCE"] = llformat("%d", (U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["TIME"] = llformat("%d", (U32)mRuthDebugTimer.getElapsedTimeF32());
args["NAME"] = getFullname();
- LLNotificationsUtil::add(notification_name,args);
+ LLNotificationsUtil::add(notification_name, args);
}
}
@@ -818,15 +818,14 @@ LLVOAvatar::~LLVOAvatar()
{
sInstances.remove(this);
- if (gSavedSettings.getBOOL("IMShowArrivalsDepartures"))
+ static LLCachedControl<bool> show_arrival_departures(gSavedSettings, "IMShowArrivalsDepartures", false);
+ if (show_arrival_departures && !isSelf())
{
- LLAvatarName av_name;
- LLAvatarNameCache::get(getID(), &av_name);
- auto display_name = av_name.getDisplayName();
- if (!display_name.empty())
+ auto full_name = getFullname();
+ if (!full_name.empty())
{
- LLChat chat{llformat("%s left.", display_name.c_str())};
- chat.mFromName = display_name;
+ LLChat chat{llformat("%s left.", full_name.c_str())};
+ chat.mFromName = full_name;
chat.mFromID = getID();
LLSD args;
args["COLOR"] = "ChatHistoryTextColor";
@@ -835,14 +834,14 @@ LLVOAvatar::~LLVOAvatar()
}
if (!mFullyLoaded)
{
- debugAvatarRezTime("AvatarRezLeftCloudNotification","left after ruth seconds as cloud");
+ debugAvatarRezTime("AvatarRezLeftCloudNotification", "left after ruth seconds as cloud");
}
else
{
- debugAvatarRezTime("AvatarRezLeftNotification","left sometime after declouding");
+ debugAvatarRezTime("AvatarRezLeftNotification", "left sometime after declouding");
}
- if(mTuned)
+ if (mTuned)
{
LLPerfStats::tunedAvatars--;
mTuned = false;
@@ -936,12 +935,12 @@ bool LLVOAvatar::isFullyTextured() const
bool LLVOAvatar::hasGray() const
{
- return !getIsCloud() && !isFullyTextured();
+ return !getHasMissingParts() && !isFullyTextured();
}
S32 LLVOAvatar::getRezzedStatus() const
{
- if (getIsCloud()) return 0;
+ if (getHasMissingParts()) return 0;
bool textured = isFullyTextured();
bool all_baked_loaded = allBakedTexturesCompletelyDownloaded();
if (textured && all_baked_loaded && getAttachmentCount() == mSimAttachments.size()) return 4;
@@ -984,34 +983,49 @@ bool LLVOAvatar::areAllNearbyInstancesBaked(S32& grey_avatars)
++grey_avatars;
}
}
- return !grey_avatars;
+ return grey_avatars == 0;
}
// static
-void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars)
+void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars, S32& pending_meshes, S32& control_avatars)
{
counts.clear();
counts.resize(5);
avg_cloud_time = 0;
cloud_avatars = 0;
+ pending_meshes = 0;
+ control_avatars = 0;
S32 count_avg = 0;
for (LLCharacter* character : LLCharacter::sInstances)
{
- if (LLVOAvatar* inst = (LLVOAvatar*)character)
+ LLVOAvatar* inst = (LLVOAvatar*)character;
+ if (inst && !inst->isUIAvatar() && !inst->isSelf())
{
- S32 rez_status = inst->getRezzedStatus();
- counts[rez_status]++;
- F32 time = inst->getFirstDecloudTime();
- if (time >= 0)
+ if (inst->isControlAvatar())
{
- avg_cloud_time+=time;
- count_avg++;
+ control_avatars++;
}
- if (!inst->isFullyLoaded() || time < 0)
+ else
{
- // still renders as cloud
- cloud_avatars++;
+ S32 rez_status = inst->getRezzedStatus();
+ counts[rez_status]++;
+ F32 time = inst->getFirstDecloudTime();
+ if (time >= 0)
+ {
+ avg_cloud_time += time;
+ count_avg++;
+ }
+ if (!inst->isFullyLoaded() || time < 0)
+ {
+ // still renders as cloud
+ cloud_avatars++;
+ if (rez_status >= 4
+ && inst->mWaitingForMeshes)
+ {
+ pending_meshes++;
+ }
+ }
}
}
}
@@ -1028,7 +1042,7 @@ std::string LLVOAvatar::rezStatusToString(S32 rez_status)
switch (rez_status)
{
case 0:
- return "cloud";
+ return "missing parts";
case 1:
return "gray";
case 2:
@@ -1191,7 +1205,7 @@ void LLVOAvatar::initClass()
LLControlAvatar::sRegionChangedSlot = gAgent.addRegionChangedCallback(&LLControlAvatar::onRegionChanged);
- sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.j2c");
+ sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.png");
}
@@ -2583,31 +2597,21 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
{
mDebugExistenceTimer.reset();
debugAvatarRezTime("AvatarRezArrivedNotification", "avatar arrived");
- if (gSavedSettings.getBOOL("IMShowArrivalsDepartures"))
- {
- uuid_vec_t uuids;
- std::vector<LLVector3d> positions;
- LLWorld::getInstance()->getAvatars(&uuids, &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("MPVNearMeRange"));
- auto pos_it = positions.begin();
- auto id_it = uuids.begin();
- for (;pos_it != positions.end() && id_it != uuids.end(); ++pos_it, ++id_it)
- {
- if (*id_it == getID() && !isSelf())
- {
- LLAvatarName av_name;
- LLAvatarNameCache::get(getID(), &av_name);
- auto display_name = av_name.getDisplayName();
- if (!display_name.empty())
- {
- LLChat chat{llformat("%s arrived (%.1f m).", display_name.c_str(), dist_vec(*pos_it, gAgent.getPositionGlobal()))};
- chat.mFromName = display_name;
- chat.mFromID = getID();
- LLSD args;
- args["COLOR"] = "ChatHistoryTextColor";
- LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
- }
- break;
- }
+ static LLCachedControl<bool> show_arrival_departures(gSavedSettings, "IMShowArrivalsDepartures", false);
+ if (show_arrival_departures && !isSelf())
+ {
+ auto full_name = getFullname();
+ if (!full_name.empty())
+ {
+ auto avatarsPositions = gAgent.getAvatarsPositions();
+ auto id = getID();
+ auto avatarPosition = avatarsPositions[id];
+ LLChat chat{std::string{full_name + " arrived" + (avatarPosition.isExactlyZero() ? "" : llformat(" (%.1f m)", dist_vec(avatarPosition, gAgent.getPositionGlobal()))) + "."}};
+ chat.mFromName = full_name;
+ chat.mFromID = id;
+ LLSD args;
+ args["COLOR"] = "ChatHistoryTextColor";
+ LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
}
}
}
@@ -3010,7 +3014,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
if (LLVOAvatar::sJointDebug)
{
- LL_INFOS() << getFullname() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << LL_ENDL;
+ LL_INFOS() << getDebugName() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << LL_ENDL;
}
LLJoint::sNumUpdates = 0;
@@ -3230,17 +3234,17 @@ F32 LLVOAvatar::calcMorphAmount() const
void LLVOAvatar::idleUpdateLipSync(bool voice_enabled)
{
// Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync
- if ( voice_enabled
+ if (voice_enabled
&& mLastRezzedStatus > 0 // no point updating lip-sync for clouds
&& LLVoiceVisualizer::getLipSyncEnabled()
- && LLVoiceClient::getInstance()->getIsSpeaking( mID ) )
+ && LLVoiceClient::getInstance()->getIsSpeaking(mID))
{
F32 ooh_morph_amount = 0.0f;
F32 aah_morph_amount = 0.0f;
mVoiceVisualizer->lipSyncOohAah( ooh_morph_amount, aah_morph_amount );
- if( mOohMorph )
+ if (mOohMorph)
{
F32 ooh_weight = mOohMorph->getMinWeight()
+ ooh_morph_amount * (mOohMorph->getMaxWeight() - mOohMorph->getMinWeight());
@@ -3248,7 +3252,7 @@ void LLVOAvatar::idleUpdateLipSync(bool voice_enabled)
mOohMorph->setWeight( ooh_weight);
}
- if( mAahMorph )
+ if (mAahMorph)
{
F32 aah_weight = mAahMorph->getMinWeight()
+ aah_morph_amount * (mAahMorph->getMaxWeight() - mAahMorph->getMinWeight());
@@ -3517,7 +3521,7 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name)
is_muted = isInMuteList();
}
bool is_friend = isBuddy();
- bool is_cloud = getIsCloud();
+ bool is_cloud = getHasMissingParts();
if (is_appearance != mNameAppearance)
{
@@ -4335,8 +4339,8 @@ void LLVOAvatar::computeUpdatePeriod()
{
const LLVector4a* ext = mDrawable->getSpatialExtents();
LLVector4a size;
- size.setSub(ext[1],ext[0]);
- F32 mag = size.getLength3().getF32()*0.5f;
+ size.setSub(ext[1], ext[0]);
+ F32 mag = size.getLength3().getF32() * 0.5f;
const S32 UPDATE_RATE_SLOW = 64;
const S32 UPDATE_RATE_MED = 48;
@@ -4346,14 +4350,14 @@ void LLVOAvatar::computeUpdatePeriod()
{ // visually muted avatars update at lowest rate
mUpdatePeriod = UPDATE_RATE_SLOW;
}
- else if (! shouldImpostor()
- || mDrawable->mDistanceWRTCamera < 1.f + mag)
+ else if (!shouldImpostor()
+ || mDrawable->mDistanceWRTCamera < 1.f + mag)
{ // first 25% of max visible avatars are not impostored
// also, don't impostor avatars whose bounding box may be penetrating the
// impostor camera near clip plane
mUpdatePeriod = 1;
}
- else if ( shouldImpostor(4.0) )
+ else if (shouldImpostor(4.0))
{ //background avatars are REALLY slow updating impostors
mUpdatePeriod = UPDATE_RATE_SLOW;
}
@@ -4362,7 +4366,7 @@ void LLVOAvatar::computeUpdatePeriod()
// Don't update cloud avatars too often
mUpdatePeriod = UPDATE_RATE_SLOW;
}
- else if ( shouldImpostor(3.0) )
+ else if (shouldImpostor(3.0))
{ //back 25% of max visible avatars are slow updating impostors
mUpdatePeriod = UPDATE_RATE_MED;
}
@@ -4793,14 +4797,6 @@ bool LLVOAvatar::updateCharacter(LLAgent &agent)
}
bool visible = isVisible();
- bool is_control_avatar = isControlAvatar(); // capture state to simplify tracing
- bool is_attachment = false;
-
- if (is_control_avatar)
- {
- LLControlAvatar *cav = dynamic_cast<LLControlAvatar*>(this);
- is_attachment = cav && cav->mRootVolp && cav->mRootVolp->isAttachment(); // For attached animated objects
- }
// For fading out the names above heads, only let the timer
// run if we're visible.
@@ -5474,7 +5470,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel)
gGL.begin(LLRender::LINES);
gGL.color4f(1.f,1.f,1.f,1.f);
F32 thickness = llmax(F32(5.0f-5.0f*(gFrameTimeSeconds-mLastImpostorUpdateFrameTime)),1.0f);
- glLineWidth(thickness);
+ //glLineWidth(thickness);
gGL.vertex3fv((pos+left-up).mV);
gGL.vertex3fv((pos-left-up).mV);
gGL.vertex3fv((pos-left-up).mV);
@@ -6211,8 +6207,11 @@ void LLVOAvatar::resetAnimations()
flushAllMotions();
}
-// Override selectively based on avatar sex and whether we're using new
-// animations.
+//-----------------------------------------------------------------------------
+// remapMotionID()
+// Override selectively based on avatar sex and whether we're using new animations.
+//-----------------------------------------------------------------------------
+// virtual
LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
{
static LLCachedControl<bool> use_new_walk_run(gSavedSettings, "UseNewWalkRun");
@@ -6262,7 +6261,6 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
}
return result;
-
}
//-----------------------------------------------------------------------------
@@ -6270,6 +6268,7 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
// id is the asset if of the animation to start
// time_offset is the offset into the animation at which to start playing
//-----------------------------------------------------------------------------
+// virtual
bool LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
{
LL_DEBUGS("Motion") << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << LL_ENDL;
@@ -6292,6 +6291,7 @@ bool LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
//-----------------------------------------------------------------------------
// stopMotion()
//-----------------------------------------------------------------------------
+// virtual
bool LLVOAvatar::stopMotion(const LLUUID& id, bool stop_immediate)
{
LL_DEBUGS("Motion") << "Motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << LL_ENDL;
@@ -6331,6 +6331,7 @@ void LLVOAvatar::stopMotionFromSource(const LLUUID& source_id)
//-----------------------------------------------------------------------------
// addDebugText()
//-----------------------------------------------------------------------------
+// virtual
void LLVOAvatar::addDebugText(const std::string& text)
{
mDebugText.append(1, '\n');
@@ -6338,8 +6339,22 @@ void LLVOAvatar::addDebugText(const std::string& text)
}
//-----------------------------------------------------------------------------
+// getDebugName()
+//-----------------------------------------------------------------------------
+// virtual
+std::string LLVOAvatar::getDebugName() const
+{
+#if LL_RELEASE_WITH_DEBUG_INFO
+ return getFullname();
+#else
+ return getID().asString();
+#endif // LL_RELEASE_WITH_DEBUG_INFO
+}
+
+//-----------------------------------------------------------------------------
// getID()
//-----------------------------------------------------------------------------
+// virtual
const LLUUID& LLVOAvatar::getID() const
{
return mID;
@@ -6349,13 +6364,14 @@ const LLUUID& LLVOAvatar::getID() const
// getJoint()
//-----------------------------------------------------------------------------
// RN: avatar joints are multi-rooted to include screen-based attachments
-LLJoint *LLVOAvatar::getJoint( const std::string &name )
+// virtual
+LLJoint* LLVOAvatar::getJoint(std::string_view name)
{
joint_map_t::iterator iter = mJointMap.find(name);
- LLJoint* jointp = NULL;
+ LLJoint* jointp = nullptr;
- if (iter == mJointMap.end() || iter->second == NULL)
+ if (iter == mJointMap.end() || iter->second == nullptr)
{ //search for joint and cache found joint in lookup table
if (mJointAliasMap.empty())
{
@@ -6372,7 +6388,7 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name )
canonical_name = name;
}
jointp = mRoot->findJoint(canonical_name);
- mJointMap[name] = jointp;
+ mJointMap[std::string(name)] = jointp;
}
else
{ //return cached pointer
@@ -6418,6 +6434,16 @@ LLJoint *LLVOAvatar::getJoint( S32 joint_num )
return pJoint;
}
+void LLVOAvatar::initAllJoints()
+{
+ getJointAliases();
+ for (auto& alias : mJointAliasMap)
+ {
+ mJointMap[alias.first] = mRoot->findJoint(alias.second);
+ }
+ // ignore mScreen and mRoot
+}
+
//-----------------------------------------------------------------------------
// getRiggedMeshID
//
@@ -6464,6 +6490,7 @@ bool LLVOAvatar::jointIsRiggedTo(const LLJoint *joint) const
void LLVOAvatar::clearAttachmentOverrides()
{
+
for (S32 i=0; i<LL_CHARACTER_MAX_ANIMATED_JOINTS; i++)
{
LLJoint *pJoint = getJoint(i);
@@ -6494,6 +6521,7 @@ void LLVOAvatar::clearAttachmentOverrides()
//-----------------------------------------------------------------------------
void LLVOAvatar::rebuildAttachmentOverrides()
{
+
LL_DEBUGS("AnimatedObjects") << "rebuilding" << LL_ENDL;
clearAttachmentOverrides();
@@ -6542,6 +6570,7 @@ void LLVOAvatar::rebuildAttachmentOverrides()
// -----------------------------------------------------------------------------
void LLVOAvatar::updateAttachmentOverrides()
{
+
LL_DEBUGS("AnimatedObjects") << "updating" << LL_ENDL;
std::set<LLUUID> meshes_seen;
@@ -6617,11 +6646,11 @@ void LLVOAvatar::updateAttachmentOverrides()
}
}
pelvis_fixups = mPelvisFixups;
- //dumpArchetypeXML(getFullname() + "_paranoid_updated");
+ //dumpArchetypeXML(getDebugName() + "_paranoid_updated");
// Rebuild and compare
rebuildAttachmentOverrides();
- //dumpArchetypeXML(getFullname() + "_paranoid_rebuilt");
+ //dumpArchetypeXML(getDebugName() + "_paranoid_rebuilt");
bool mismatched = false;
for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++)
{
@@ -6850,22 +6879,22 @@ void LLVOAvatar::showAttachmentOverrides(bool verbose) const
{
std::stringstream ss;
std::copy(pos_names.begin(), pos_names.end(), std::ostream_iterator<std::string>(ss, ","));
- LL_INFOS() << getFullname() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL;
+ LL_INFOS() << avString() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL;
}
else
{
- LL_DEBUGS("Avatar") << getFullname() << " no attachment positions defined for any joints" << "\n" << LL_ENDL;
+ LL_DEBUGS("Avatar") << avString() << " no attachment positions defined for any joints" << "\n" << LL_ENDL;
}
if (scale_names.size())
{
std::stringstream ss;
std::copy(scale_names.begin(), scale_names.end(), std::ostream_iterator<std::string>(ss, ","));
- LL_INFOS() << getFullname() << " attachment scales defined for joints: " << ss.str() << "\n" << LL_ENDL;
+ LL_INFOS() << getDebugName() << " attachment scales defined for joints: " << ss.str() << "\n" << LL_ENDL;
}
else
{
- LL_INFOS() << getFullname() << " no attachment scales defined for any joints" << "\n" << LL_ENDL;
+ LL_INFOS() << getDebugName() << " no attachment scales defined for any joints" << "\n" << LL_ENDL;
}
if (!verbose)
@@ -8234,7 +8263,7 @@ bool LLVOAvatar::isVisible() const
}
// Determine if we have enough avatar data to render
-bool LLVOAvatar::getIsCloud() const
+bool LLVOAvatar::getHasMissingParts() const
{
if (mIsDummy)
{
@@ -8252,7 +8281,7 @@ bool LLVOAvatar::getIsCloud() const
void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status)
{
// State machine for rezzed status. Statuses are -1 on startup, 0
- // = cloud, 1 = gray, 2 = downloading, 3 = waiting for attachments, 4 = full.
+ // Statuses are -1 on startup, 0 = cloud, 1 = gray, 2 = downloading, 3 = waiting for attachments, 4 = full.
// Purpose is to collect time data for each it takes avatar to reach
// various loading landmarks: gray, textured (partial), textured fully.
@@ -8272,7 +8301,7 @@ void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status)
if (rez_status < mLastRezzedStatus)
{
// load level has decreased. start phase timers for higher load levels.
- for (S32 i = rez_status+1; i <= mLastRezzedStatus; i++)
+ for (S32 i = rez_status + 1; i <= mLastRezzedStatus; i++)
{
startPhase("load_" + LLVOAvatar::rezStatusToString(i));
}
@@ -8280,7 +8309,7 @@ void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status)
else if (rez_status > mLastRezzedStatus)
{
// load level has increased. stop phase timers for lower and equal load levels.
- for (S32 i = llmax(mLastRezzedStatus+1,1); i <= rez_status; i++)
+ for (S32 i = llmax(mLastRezzedStatus + 1, 1); i <= rez_status; i++)
{
stopPhase("load_" + LLVOAvatar::rezStatusToString(i));
stopPhase("first_load_" + LLVOAvatar::rezStatusToString(i), false);
@@ -8441,8 +8470,12 @@ bool LLVOAvatar::updateIsFullyLoaded()
|| (mLoadedCallbackTextures < mCallbackTextureList.size() && mLastTexCallbackAddedTime.getElapsedTimeF32() < MAX_TEXTURE_WAIT_TIME_SEC)
|| !mPendingAttachment.empty()
|| (rez_status < 3 && !isFullyBaked())
- || hasPendingAttachedMeshes()
);
+ if (!loading)
+ {
+ mWaitingForMeshes = hasPendingAttachedMeshes();
+ loading = mWaitingForMeshes;
+ }
// compare amount of attachments to one reported by simulator
if (!isSelf() && mLastCloudAttachmentCount < mSimAttachments.size() && mSimAttachments.size() > 0)
@@ -8521,19 +8554,19 @@ bool LLVOAvatar::processFullyLoadedChange(bool loading)
F32 first_use_delay = FIRST_APPEARANCE_CLOUD_MIN_DELAY;
if (!isSelf() && loading)
{
- // Note that textures can causes 60s delay on thier own
- // so this delay might end up on top of textures' delay
- first_use_delay = llclamp(
- mFirstAppearanceMessageTimer.getElapsedTimeF32(),
- FIRST_APPEARANCE_CLOUD_MIN_DELAY,
- FIRST_APPEARANCE_CLOUD_MAX_DELAY);
+ // Note that textures can causes 60s delay on thier own
+ // so this delay might end up on top of textures' delay
+ first_use_delay = llclamp(
+ mFirstAppearanceMessageTimer.getElapsedTimeF32(),
+ FIRST_APPEARANCE_CLOUD_MIN_DELAY,
+ FIRST_APPEARANCE_CLOUD_MAX_DELAY);
- if (shouldImpostor())
- {
- // Impostors are less of a priority,
- // let them stay cloud longer
- first_use_delay *= FIRST_APPEARANCE_CLOUD_IMPOSTOR_MODIFIER;
- }
+ if (shouldImpostor())
+ {
+ // Impostors are less of a priority,
+ // let them stay cloud longer
+ first_use_delay *= FIRST_APPEARANCE_CLOUD_IMPOSTOR_MODIFIER;
+ }
}
mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > first_use_delay);
}
@@ -8550,12 +8583,12 @@ bool LLVOAvatar::processFullyLoadedChange(bool loading)
// did our loading state "change" from last call?
// FIXME runway - why are we updating every 30 calls even if nothing has changed?
// This causes updateLOD() to run every 30 frames, among other things.
+ bool fully_loaded_changed = (mFullyLoaded != mPreviousFullyLoaded);
const S32 UPDATE_RATE = 30;
bool changed =
((mFullyLoaded != mPreviousFullyLoaded) || // if the value is different from the previous call
- (!mFullyLoadedInitialized) || // if we've never been called before
- (mFullyLoadedFrameCounter % UPDATE_RATE == 0)); // every now and then issue a change
- bool fully_loaded_changed = (mFullyLoaded != mPreviousFullyLoaded);
+ (!mFullyLoadedInitialized) || // if we've never been called before
+ (mFullyLoadedFrameCounter % UPDATE_RATE == 0)); // every now and then issue a change
mPreviousFullyLoaded = mFullyLoaded;
mFullyLoadedInitialized = true;
@@ -8573,6 +8606,7 @@ bool LLVOAvatar::processFullyLoadedChange(bool loading)
mNeedsImpostorUpdate = true;
mLastImpostorUpdateReason = 6;
}
+
return changed;
}
@@ -8928,6 +8962,7 @@ void LLVOAvatar::updateMeshTextures()
bool is_ltda = layerset
&& layerset->getViewerComposite()->isInitialized()
&& layerset->isLocalTextureDataAvailable();
+#ifndef __aarch64__
mBakedTextureDebugText += llformat("%4d %4s %4d %4d %4d %4d %4s\n",
i,
(layerset?"*":"0"),
@@ -8936,6 +8971,7 @@ void LLVOAvatar::updateMeshTextures()
is_layer_baked[i],
use_lkg_baked_layer[i],
last_id_string.c_str());
+#endif
}
for (U32 i=0; i < mBakedTextureDatas.size(); i++)
@@ -9467,12 +9503,12 @@ void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value)
void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix,
const LLAppearanceMessageContents& contents)
{
- std::string outfilename = get_sequential_numbered_file_name(dump_prefix,".xml");
+ std::string outfilename = get_sequential_numbered_file_name(dump_prefix, ".xml");
const std::vector<F32>& params_for_dump = contents.mParamWeights;
const LLTEContents& tec = contents.mTEContents;
LLAPRFile outfile;
- std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename);
+ std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, outfilename);
outfile.open(fullpath, LL_APR_WB );
apr_file_t* file = outfile.getFileHandle();
if (!file)
@@ -9685,7 +9721,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
static LLCachedControl<bool> enable_verbose_dumps(gSavedSettings, "DebugAvatarAppearanceMessage");
static LLCachedControl<bool> block_avatar_appearance_messages(gSavedSettings, "BlockAvatarAppearanceMessages");
- std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_";
+ std::string dump_prefix = getDebugName() + (isSelf() ? "_s_" : "_o_");
if (block_avatar_appearance_messages)
{
LL_WARNS() << "Blocking AvatarAppearance message" << LL_ENDL;
@@ -10319,17 +10355,13 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara
std::string outprefix(prefix);
if (outprefix.empty())
{
- outprefix = getFullname() + (isSelf()?"_s":"_o");
+ outprefix = getDebugName() + (isSelf() ? "_s" : "_o");
}
- if (outprefix.empty())
- {
- outprefix = std::string("new_archetype");
- }
- std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml");
+ std::string outfilename = get_sequential_numbered_file_name(outprefix, ".xml");
LLAPRFile outfile;
LLWearableType *wr_inst = LLWearableType::getInstance();
- std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename);
+ std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, outfilename);
if (APR_SUCCESS == outfile.open(fullpath, LL_APR_WB ))
{
apr_file_t* file = outfile.getFileHandle();
@@ -10815,7 +10847,7 @@ void LLVOAvatar::updateRiggingInfo()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
- LL_DEBUGS("RigSpammish") << getFullname() << " updating rig tab" << LL_ENDL;
+ LL_DEBUGS("RigSpammish") << getDebugName() << " updating rig tab" << LL_ENDL;
// use a local static for scratch space to avoid reallocation here
static std::vector<LLVOVolume*> volumes;
@@ -11006,8 +11038,7 @@ void LLVOAvatar::idleUpdateRenderComplexity()
bool autotune = LLPerfStats::tunables.userAutoTuneEnabled && !mIsControlAvatar && !isSelf();
if (autotune && !isDead())
{
- static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64);
- F32 radius = render_far_clip * render_far_clip;
+ F32 radius = sRenderDistance * sRenderDistance;
bool is_nearby = true;
if ((dist_vec_squared(getPositionGlobal(), gAgent.getPositionGlobal()) > radius) &&
@@ -11039,8 +11070,7 @@ void LLVOAvatar::updateNearbyAvatarCount()
if (agent_update_timer.getElapsedTimeF32() > 1.0f)
{
S32 avs_nearby = 0;
- static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64);
- F32 radius = render_far_clip * render_far_clip;
+ F32 radius = sRenderDistance * sRenderDistance;
for (LLCharacter* character : LLCharacter::sInstances)
{
LLVOAvatar* avatar = (LLVOAvatar*)character;
@@ -11812,16 +11842,24 @@ void LLVOAvatar::readProfileQuery(S32 retries)
}
else
- { // wait until next frame
- LLUUID id = getID();
+ {
+ // wait until next frame
+ const LLUUID id = getID();
- LL::WorkQueue::getInstance("mainloop")->post([id, retries] {
- LLVOAvatar* avatar = (LLVOAvatar*) gObjectList.findObject(id);
- if(avatar)
+ LL::WorkQueue::getInstance("mainloop")->post([id, retries]
+ {
+ LLViewerObject* object = gObjectList.findObject(id);
+ if (object
+ && !object->isDead()
+ && object->isAvatar()) // probably excessive, pcode isn't supposed to change
{
- avatar->readProfileQuery(retries);
+ LLVOAvatar* avatar = (LLVOAvatar*)object;
+ if (avatar)
+ {
+ avatar->readProfileQuery(retries);
+ }
}
- });
+ });
}
}
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index a2232d21a2..1e563c4869 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -202,8 +202,9 @@ public:
void startDefaultMotions();
void dumpAnimationState();
- virtual LLJoint* getJoint(const std::string &name);
+ virtual LLJoint* getJoint(std::string_view name);
LLJoint* getJoint(S32 num);
+ void initAllJoints();
//if you KNOW joint_num is a valid animated joint index, use getSkeletonJoint for efficiency
inline LLJoint* getSkeletonJoint(S32 joint_num) { return mSkeleton[joint_num]; }
@@ -232,6 +233,7 @@ public:
virtual void onActiveOverrideMeshesChanged();
/*virtual*/ const LLUUID& getID() const;
+ /*virtual*/ std::string getDebugName() const;
/*virtual*/ void addDebugText(const std::string& text);
/*virtual*/ F32 getTimeDilation();
/*virtual*/ void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm);
@@ -329,16 +331,16 @@ public:
// avatar render cost
- U32 getVisualComplexity() { return mVisualComplexity; };
+ U32 getVisualComplexity() { return mVisualComplexity; };
// surface area calculation
- F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; };
+ F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; };
- U32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server
- void setReportedVisualComplexity(U32 value) { mReportedVisualComplexity = value; };
+ U32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server
+ void setReportedVisualComplexity(U32 value) { mReportedVisualComplexity = value; };
- S32 getUpdatePeriod() { return mUpdatePeriod; };
- const LLColor4 & getMutedAVColor() { return mMutedAVColor; };
+ S32 getUpdatePeriod() { return mUpdatePeriod; };
+ const LLColor4 & getMutedAVColor() { return mMutedAVColor; };
static void updateImpostorRendering(U32 newMaxNonImpostorsValue);
void idleUpdateBelowWater();
@@ -399,15 +401,14 @@ public:
bool isTooComplex() const;
bool visualParamWeightsAreDefault();
- virtual bool getIsCloud() const;
+ virtual bool getHasMissingParts() const;
bool isFullyTextured() const;
bool hasGray() const;
- S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded.
+ S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = waiting for attachments, 4 = full.
void updateRezzedStatusTimers(S32 status);
S32 mLastRezzedStatus;
-
void startPhase(const std::string& phase_name);
void stopPhase(const std::string& phase_name, bool err_check = true);
void clearPhases();
@@ -426,6 +427,7 @@ protected:
private:
bool mFirstFullyVisible;
+ bool mWaitingForMeshes;
F32 mFirstDecloudTime;
LLFrameTimer mFirstAppearanceMessageTimer;
@@ -722,7 +724,7 @@ public:
bool isFullyBaked();
static bool areAllNearbyInstancesBaked(S32& grey_avatars);
- static void getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars);
+ static void getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars, S32& pending_meshes, S32& control_avatars);
static std::string rezStatusToString(S32 status);
//--------------------------------------------------------------------
@@ -741,7 +743,7 @@ protected:
LLViewerTexLayerSet* getTexLayerSet(const U32 index) const { return dynamic_cast<LLViewerTexLayerSet*>(mBakedTextureDatas[index].mTexLayerSet); }
- LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
+ LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList;
bool mLoadedCallbacksPaused;
S32 mLoadedCallbackTextures; // count of 'loaded' baked textures, filled from mCallbackTextureList
LLFrameTimer mLastTexCallbackAddedTime;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index f23af5afa4..653c7e82eb 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -225,6 +225,8 @@ void LLVOAvatarSelf::initInstance()
doPeriodically(update_avatar_rez_metrics, 5.0);
doPeriodically(boost::bind(&LLVOAvatarSelf::checkStuckAppearance, this), 30.0);
+ initAllJoints(); // mesh thread uses LLVOAvatarSelf as a joint source
+
mInitFlags |= 1<<2;
}
@@ -695,17 +697,17 @@ void LLVOAvatarSelf::idleUpdate(LLAgent &agent, const F64 &time)
}
// virtual
-LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
+LLJoint* LLVOAvatarSelf::getJoint(std::string_view name)
{
std::lock_guard lock(mJointMapMutex);
- LLJoint *jointp = NULL;
+ LLJoint* jointp = nullptr;
jointp = LLVOAvatar::getJoint(name);
if (!jointp && mScreenp)
{
jointp = mScreenp->findJoint(name);
if (jointp)
{
- mJointMap[name] = jointp;
+ mJointMap[std::string(name)] = jointp;
}
}
if (jointp && jointp != mScreenp && jointp != mRoot)
@@ -1925,7 +1927,7 @@ void LLVOAvatarSelf::dumpTotalLocalTextureByteCount()
LL_INFOS() << "Total Avatar LocTex GL:" << (gl_bytes/1024) << "KB" << LL_ENDL;
}
-bool LLVOAvatarSelf::getIsCloud() const
+bool LLVOAvatarSelf::getHasMissingParts() const
{
// Let people know why they're clouded without spamming them into oblivion.
bool do_warn = false;
@@ -2235,14 +2237,18 @@ void LLVOAvatarSelf::appearanceChangeMetricsCoro(std::string url)
std::vector<S32> rez_counts;
F32 avg_time;
S32 total_cloud_avatars;
- LLVOAvatar::getNearbyRezzedStats(rez_counts, avg_time, total_cloud_avatars);
+ S32 waiting_for_meshes;
+ S32 control_avatars;
+ LLVOAvatar::getNearbyRezzedStats(rez_counts, avg_time, total_cloud_avatars, waiting_for_meshes, control_avatars);
for (S32 rez_stat = 0; rez_stat < rez_counts.size(); ++rez_stat)
{
std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat);
msg["nearby"][rez_status_name] = rez_counts[rez_stat];
}
+ msg["nearby"]["waiting_for_meshes"] = waiting_for_meshes;
msg["nearby"]["avg_decloud_time"] = avg_time;
msg["nearby"]["cloud_total"] = total_cloud_avatars;
+ msg["nearby"]["animeshes"] = control_avatars;
// std::vector<std::string> bucket_fields("timer_name","is_self","grid_x","grid_y","is_using_server_bake");
std::vector<std::string> by_fields;
@@ -2824,6 +2830,12 @@ void LLVOAvatarSelf::setHoverOffset(const LLVector3& hover_offset, bool send_upd
//------------------------------------------------------------------------
bool LLVOAvatarSelf::needsRenderBeam()
{
+ static LLCachedControl<bool> enable_selection_hints(gSavedSettings, "EnableSelectionHints", true);
+ if (!enable_selection_hints)
+ {
+ return false;
+ }
+
LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
bool is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing());
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index f9bea41b1d..45985b2a80 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -90,7 +90,7 @@ public:
/*virtual*/ bool hasMotionFromSource(const LLUUID& source_id);
/*virtual*/ void stopMotionFromSource(const LLUUID& source_id);
/*virtual*/ void requestStopMotion(LLMotion* motion);
- /*virtual*/ LLJoint* getJoint(const std::string &name);
+ /*virtual*/ LLJoint* getJoint(std::string_view name);
/*virtual*/ void renderJoints();
@@ -129,7 +129,7 @@ public:
// Loading state
//--------------------------------------------------------------------
public:
- /*virtual*/ bool getIsCloud() const;
+ /*virtual*/ bool getHasMissingParts() const;
//--------------------------------------------------------------------
// Region state
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 27c105c8d6..5d456b1a19 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -486,14 +486,21 @@ void LLVOCacheEntry::updateDebugSettings()
//min radius: all objects within this radius remain loaded in memory
static LLCachedControl<F32> min_radius(gSavedSettings,"SceneLoadMinRadius");
static const F32 MIN_RADIUS = 1.0f;
- const F32 draw_radius = gAgentCamera.mDrawDistance;
+
+ F32 draw_radius = gAgentCamera.mDrawDistance;
+ if (LLViewerTexture::isSystemMemoryCritical())
+ {
+ // Factor is intended to go from 1.0 to 2.0
+ // For safety cap reduction at 50%, we don't want to go below half of draw distance
+ draw_radius = llmax(draw_radius / LLViewerTexture::getSystemMemoryBudgetFactor(), draw_radius / 2.f);
+ }
const F32 clamped_min_radius = llclamp((F32) min_radius, MIN_RADIUS, draw_radius); // [1, mDrawDistance]
sNearRadius = MIN_RADIUS + ((clamped_min_radius - MIN_RADIUS) * adjust_factor);
// a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold
- static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction");
+ static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction", .75f);
const F32 min_radius_plus_one = sNearRadius + 1.f;
- const F32 max_radius = rear_max_radius_frac * gAgentCamera.mDrawDistance;
+ const F32 max_radius = rear_max_radius_frac * draw_radius;
const F32 clamped_max_radius = llclamp(max_radius, min_radius_plus_one, draw_radius); // [sNearRadius, mDrawDistance]
sRearFarRadius = min_radius_plus_one + ((clamped_max_radius - min_radius_plus_one) * adjust_factor);
@@ -1875,11 +1882,11 @@ void LLVOCache::removeGenericExtrasForHandle(U64 handle)
}
// NOTE: when removing the extras, we must also remove the objects so the simulator will send us a full upddate with the valid overrides
- auto* entry = mHandleEntryMap[handle];
- if (entry)
+ handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle);
+ if (iter != mHandleEntryMap.end())
{
- LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << entry->mHandle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL;
- removeEntry(entry);
+ LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << handle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL;
+ removeEntry(iter->second);
}
else
{
diff --git a/indra/newview/llvoicecallhandler.cpp b/indra/newview/llvoicecallhandler.cpp
index 25b0e69436..d2c947fef2 100644
--- a/indra/newview/llvoicecallhandler.cpp
+++ b/indra/newview/llvoicecallhandler.cpp
@@ -38,6 +38,11 @@ public:
{
}
+ virtual bool canHandleUntrusted(const LLSD &params, const LLSD &query_map, LLMediaCtrl *web, const std::string &nav_type)
+ {
+ return (nav_type == NAV_TYPE_CLICKED || nav_type == NAV_TYPE_EXTERNAL);
+ }
+
bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
//Make sure we have some parameters
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index cf128f381a..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,10 +367,17 @@ void LLVoiceChannel::resume()
{
if (sSuspended)
{
+ sSuspended = false; // needs to be before activate() so that observers will be able to read state
if (LLVoiceClient::getInstance()->voiceEnabled())
{
if (sSuspendedVoiceChannel)
{
+ if (sSuspendedVoiceChannel->callStarted())
+ {
+ // should have channel data already, restart
+ sSuspendedVoiceChannel->setState(STATE_READY);
+ }
+ // won't do anything if call is already started
sSuspendedVoiceChannel->activate();
}
else
@@ -376,7 +385,6 @@ void LLVoiceChannel::resume()
LLVoiceChannelProximal::getInstance()->activate();
}
}
- sSuspended = false;
}
}
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 e5eb2f8008..59e8db7752 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -26,7 +26,7 @@
#include "llvoiceclient.h"
#include "llvoicevivox.h"
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
#include "llvoicewebrtc.h"
#endif
#include "llviewernetwork.h"
@@ -122,7 +122,7 @@ LLVoiceModuleInterface *getVoiceModule(const std::string &voice_server_type)
{
return (LLVoiceModuleInterface *) LLVivoxVoiceClient::getInstance();
}
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
else if (voice_server_type == WEBRTC_VOICE_SERVER_TYPE)
{
return (LLVoiceModuleInterface *) LLWebRTCVoiceClient::getInstance();
@@ -169,7 +169,7 @@ void LLVoiceClient::init(LLPumpIO *pump)
{
// Initialize all of the voice modules
m_servicePump = pump;
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->init(pump);
#endif
LLVivoxVoiceClient::getInstance()->init(pump);
@@ -182,7 +182,7 @@ void LLVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &age
mRegionChangedCallbackSlot.disconnect();
}
mRegionChangedCallbackSlot = gAgent.addRegionChangedCallback(boost::bind(&LLVoiceClient::onRegionChanged, this));
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->userAuthorized(user_id, agentID);
#endif
LLVivoxVoiceClient::getInstance()->userAuthorized(user_id, agentID);
@@ -294,7 +294,7 @@ void LLVoiceClient::setNonSpatialVoiceModule(const std::string &voice_server_typ
void LLVoiceClient::setHidden(bool hidden)
{
LL_INFOS("Voice") << "( " << (hidden ? "true" : "false") << " )" << LL_ENDL;
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->setHidden(hidden);
#endif
LLVivoxVoiceClient::getInstance()->setHidden(hidden);
@@ -302,7 +302,16 @@ void LLVoiceClient::setHidden(bool hidden)
void LLVoiceClient::terminate()
{
- if (mSpatialVoiceModule) mSpatialVoiceModule->terminate();
+#if !__FreeBSD__ && !_M_ARM64
+ if (LLVivoxVoiceClient::instanceExists())
+ {
+ LLWebRTCVoiceClient::getInstance()->terminate();
+ }
+#endif
+ if (LLVivoxVoiceClient::instanceExists())
+ {
+ LLVivoxVoiceClient::getInstance()->terminate();
+ }
mSpatialVoiceModule = NULL;
m_servicePump = NULL;
@@ -337,7 +346,7 @@ void LLVoiceClient::updateSettings()
updateMicMuteLogic();
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->updateSettings();
#endif
LLVivoxVoiceClient::getInstance()->updateSettings();
@@ -348,7 +357,7 @@ void LLVoiceClient::updateSettings()
void LLVoiceClient::tuningStart()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->tuningStart();
#endif
LLVivoxVoiceClient::getInstance()->tuningStart();
@@ -356,7 +365,7 @@ void LLVoiceClient::tuningStart()
void LLVoiceClient::tuningStop()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->tuningStop();
#endif
LLVivoxVoiceClient::getInstance()->tuningStop();
@@ -364,7 +373,7 @@ void LLVoiceClient::tuningStop()
bool LLVoiceClient::inTuningMode()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->inTuningMode();
#else
return LLVivoxVoiceClient::getInstance()->inTuningMode();
@@ -373,7 +382,7 @@ bool LLVoiceClient::inTuningMode()
void LLVoiceClient::tuningSetMicVolume(float volume)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->tuningSetMicVolume(volume);
#else
LLVivoxVoiceClient::getInstance()->tuningSetMicVolume(volume);
@@ -382,7 +391,7 @@ void LLVoiceClient::tuningSetMicVolume(float volume)
void LLVoiceClient::tuningSetSpeakerVolume(float volume)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->tuningSetSpeakerVolume(volume);
#else
LLVivoxVoiceClient::getInstance()->tuningSetSpeakerVolume(volume);
@@ -391,7 +400,7 @@ void LLVoiceClient::tuningSetSpeakerVolume(float volume)
float LLVoiceClient::tuningGetEnergy(void)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->tuningGetEnergy();
#else
return LLVivoxVoiceClient::getInstance()->tuningGetEnergy();
@@ -403,7 +412,7 @@ float LLVoiceClient::tuningGetEnergy(void)
bool LLVoiceClient::deviceSettingsAvailable()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->deviceSettingsAvailable();
#else
return LLVivoxVoiceClient::getInstance()->deviceSettingsAvailable();
@@ -412,7 +421,7 @@ bool LLVoiceClient::deviceSettingsAvailable()
bool LLVoiceClient::deviceSettingsUpdated()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->deviceSettingsUpdated();
#else
return LLVivoxVoiceClient::getInstance()->deviceSettingsUpdated();
@@ -421,7 +430,7 @@ bool LLVoiceClient::deviceSettingsUpdated()
void LLVoiceClient::refreshDeviceLists(bool clearCurrentList)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->refreshDeviceLists(clearCurrentList);
#else
LLVivoxVoiceClient::getInstance()->refreshDeviceLists(clearCurrentList);
@@ -431,7 +440,7 @@ void LLVoiceClient::refreshDeviceLists(bool clearCurrentList)
void LLVoiceClient::setCaptureDevice(const std::string& name)
{
LLVivoxVoiceClient::getInstance()->setCaptureDevice(name);
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->setCaptureDevice(name);
#endif
}
@@ -439,14 +448,14 @@ void LLVoiceClient::setCaptureDevice(const std::string& name)
void LLVoiceClient::setRenderDevice(const std::string& name)
{
LLVivoxVoiceClient::getInstance()->setRenderDevice(name);
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->setRenderDevice(name);
#endif
}
const LLVoiceDeviceList& LLVoiceClient::getCaptureDevices()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->getCaptureDevices();
#else
return LLVivoxVoiceClient::getInstance()->getCaptureDevices();
@@ -456,7 +465,7 @@ const LLVoiceDeviceList& LLVoiceClient::getCaptureDevices()
const LLVoiceDeviceList& LLVoiceClient::getRenderDevices()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->getRenderDevices();
#else
return LLVivoxVoiceClient::getInstance()->getRenderDevices();
@@ -469,7 +478,7 @@ const LLVoiceDeviceList& LLVoiceClient::getRenderDevices()
void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants) const
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->getParticipantList(participants);
#endif
LLVivoxVoiceClient::getInstance()->getParticipantList(participants);
@@ -477,7 +486,7 @@ void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants) const
bool LLVoiceClient::isParticipant(const LLUUID &speaker_id) const
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->isParticipant(speaker_id) ||
#else
return
@@ -574,7 +583,7 @@ void LLVoiceClient::activateSpatialChannel(bool activate)
bool LLVoiceClient::isCurrentChannel(const LLSD& channelInfo)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->isCurrentChannel(channelInfo) ||
#else
return
@@ -584,7 +593,7 @@ bool LLVoiceClient::isCurrentChannel(const LLSD& channelInfo)
bool LLVoiceClient::compareChannels(const LLSD &channelInfo1, const LLSD &channelInfo2)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->compareChannels(channelInfo1, channelInfo2) ||
#else
return
@@ -630,7 +639,7 @@ LLVoiceP2POutgoingCallInterface *LLVoiceClient::getOutgoingCallInterface(const L
void LLVoiceClient::setVoiceVolume(F32 volume)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->setVoiceVolume(volume);
#endif
LLVivoxVoiceClient::getInstance()->setVoiceVolume(volume);
@@ -638,7 +647,7 @@ void LLVoiceClient::setVoiceVolume(F32 volume)
void LLVoiceClient::setMicGain(F32 gain)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->setMicGain(gain);
#endif
LLVivoxVoiceClient::getInstance()->setMicGain(gain);
@@ -687,7 +696,7 @@ bool LLVoiceClient::voiceEnabled()
void LLVoiceClient::setVoiceEnabled(bool enabled)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
if (LLWebRTCVoiceClient::instanceExists())
{
LLWebRTCVoiceClient::getInstance()->setVoiceEnabled(enabled);
@@ -715,7 +724,7 @@ void LLVoiceClient::updateMicMuteLogic()
// Either of these always overrides any other PTT setting.
new_mic_mute = true;
}
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->setMuteMic(new_mic_mute);
#endif
LLVivoxVoiceClient::getInstance()->setMuteMic(new_mic_mute);
@@ -812,7 +821,7 @@ bool LLVoiceClient::getVoiceEnabled(const LLUUID& id) const
std::string LLVoiceClient::getDisplayName(const LLUUID& id) const
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
std::string result = LLWebRTCVoiceClient::getInstance()->getDisplayName(id);
if (result.empty())
{
@@ -826,7 +835,7 @@ std::string LLVoiceClient::getDisplayName(const LLUUID& id) const
bool LLVoiceClient::isVoiceWorking() const
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLVivoxVoiceClient::getInstance()->isVoiceWorking() ||
LLWebRTCVoiceClient::getInstance()->isVoiceWorking();
#else
@@ -846,7 +855,7 @@ bool LLVoiceClient::isOnlineSIP(const LLUUID& id)
bool LLVoiceClient::getIsSpeaking(const LLUUID& id)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->getIsSpeaking(id) ||
#else
return
@@ -858,7 +867,7 @@ bool LLVoiceClient::getIsModeratorMuted(const LLUUID& id)
{
// don't bother worrying about p2p calls, as
// p2p calls don't have mute.
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->getIsModeratorMuted(id) ||
#else
return
@@ -868,7 +877,7 @@ bool LLVoiceClient::getIsModeratorMuted(const LLUUID& id)
F32 LLVoiceClient::getCurrentPower(const LLUUID& id)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return std::fmax(LLVivoxVoiceClient::getInstance()->getCurrentPower(id),
LLWebRTCVoiceClient::getInstance()->getCurrentPower(id));
#else
@@ -885,7 +894,7 @@ bool LLVoiceClient::getOnMuteList(const LLUUID& id)
F32 LLVoiceClient::getUserVolume(const LLUUID& id)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return std::fmax(LLVivoxVoiceClient::getInstance()->getUserVolume(id), LLWebRTCVoiceClient::getInstance()->getUserVolume(id));
#else
return LLVivoxVoiceClient::getInstance()->getUserVolume(id);
@@ -894,7 +903,7 @@ F32 LLVoiceClient::getUserVolume(const LLUUID& id)
void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->setUserVolume(id, volume);
#endif
LLVivoxVoiceClient::getInstance()->setUserVolume(id, volume);
@@ -906,7 +915,7 @@ void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume)
void LLVoiceClient::addObserver(LLVoiceClientStatusObserver* observer)
{
LLVivoxVoiceClient::getInstance()->addObserver(observer);
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->addObserver(observer);
#endif
}
@@ -917,7 +926,7 @@ void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
{
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
}
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
if (LLWebRTCVoiceClient::instanceExists())
{
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
@@ -928,7 +937,7 @@ void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
void LLVoiceClient::addObserver(LLFriendObserver* observer)
{
LLVivoxVoiceClient::getInstance()->addObserver(observer);
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->addObserver(observer);
#endif
}
@@ -939,7 +948,7 @@ void LLVoiceClient::removeObserver(LLFriendObserver* observer)
{
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
}
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
if (LLWebRTCVoiceClient::instanceExists())
{
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
@@ -950,7 +959,7 @@ void LLVoiceClient::removeObserver(LLFriendObserver* observer)
void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)
{
LLVivoxVoiceClient::getInstance()->addObserver(observer);
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->addObserver(observer);
#endif
}
@@ -961,7 +970,7 @@ void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer)
{
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
}
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
if (LLWebRTCVoiceClient::instanceExists())
{
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
@@ -1029,7 +1038,7 @@ class LLViewerRequiredVoiceVersion : public LLHTTPNode
{
voiceModule = (LLVoiceModuleInterface *) LLVivoxVoiceClient::getInstance();
}
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
else if (voice_server_type == "webrtc")
{
voiceModule = (LLVoiceModuleInterface *) LLWebRTCVoiceClient::getInstance();
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 14f0b52174..40de236c90 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -1023,7 +1023,6 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
std::string old_log = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SLVoice.old");
if (gDirUtilp->fileExists(new_log))
{
- LLFile::remove(old_log, ENOENT);
LLFile::rename(new_log, old_log);
}
diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp
index c2b74eb1dd..447f1b652a 100644
--- a/indra/newview/llvoicewebrtc.cpp
+++ b/indra/newview/llvoicewebrtc.cpp
@@ -52,6 +52,7 @@
#include "llcachename.h"
#include "llimview.h" // for LLIMMgr
#include "llworld.h"
+#include "llviewerregion.h"
#include "llparcel.h"
#include "llviewerparcelmgr.h"
#include "llfirstuse.h"
@@ -81,9 +82,15 @@ const std::string WEBRTC_VOICE_SERVER_TYPE = "webrtc";
namespace {
- const F32 MAX_AUDIO_DIST = 50.0f;
- const F32 VOLUME_SCALE_WEBRTC = 0.01f;
- const F32 LEVEL_SCALE_WEBRTC = 0.008f;
+ const F32 MAX_AUDIO_DIST = 50.0f;
+ const F32 VOLUME_SCALE_WEBRTC = 0.01f;
+ const F32 TUNING_LEVEL_SCALE = 0.01f;
+ const F32 TUNING_LEVEL_START_POINT = 0.8f;
+ const F32 LEVEL_SCALE = 0.005f;
+ const F32 LEVEL_START_POINT = 0.18f;
+ const uint32_t SET_HIDDEN_RESTORE_DELAY_MS = 200; // 200 ms to unmute again after hiding during teleport
+ const uint32_t MUTE_FADE_DELAY_MS = 500; // 20ms fade followed by 480ms silence gets rid of the click just after unmuting.
+ // This is because the buffers and processing is cleared by the silence.
const F32 SPEAKING_AUDIO_LEVEL = 0.30;
@@ -200,7 +207,6 @@ bool LLWebRTCVoiceClient::sShuttingDown = false;
LLWebRTCVoiceClient::LLWebRTCVoiceClient() :
mHidden(false),
- mTuningMode(false),
mTuningMicGain(0.0),
mTuningSpeakerVolume(50), // Set to 50 so the user can hear themselves when he sets his mic volume
mDevicesListUpdated(false),
@@ -267,6 +273,11 @@ void LLWebRTCVoiceClient::cleanupSingleton()
void LLWebRTCVoiceClient::init(LLPumpIO* pump)
{
// constructor will set up LLVoiceClient::getInstance()
+ initWebRTC();
+}
+
+void LLWebRTCVoiceClient::initWebRTC()
+{
llwebrtc::init(this);
mWebRTCDeviceInterface = llwebrtc::getDeviceInterface();
@@ -282,10 +293,13 @@ void LLWebRTCVoiceClient::terminate()
return;
}
+ LL_INFOS("Voice") << "Terminating WebRTC" << LL_ENDL;
+
mVoiceEnabled = false;
+ sShuttingDown = true; // so that coroutines won't post more work.
llwebrtc::terminate();
- sShuttingDown = true;
+ mWebRTCDeviceInterface = nullptr;
}
//---------------------------------------------------
@@ -336,35 +350,57 @@ void LLWebRTCVoiceClient::updateSettings()
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
setVoiceEnabled(LLVoiceClient::getInstance()->voiceEnabled());
- static LLCachedControl<S32> sVoiceEarLocation(gSavedSettings, "VoiceEarLocation");
- setEarLocation(sVoiceEarLocation);
-
- static LLCachedControl<std::string> sInputDevice(gSavedSettings, "VoiceInputAudioDevice");
- setCaptureDevice(sInputDevice);
+ if (mVoiceEnabled)
+ {
+ static LLCachedControl<S32> sVoiceEarLocation(gSavedSettings, "VoiceEarLocation");
+ setEarLocation(sVoiceEarLocation);
- static LLCachedControl<std::string> sOutputDevice(gSavedSettings, "VoiceOutputAudioDevice");
- setRenderDevice(sOutputDevice);
+ static LLCachedControl<std::string> sInputDevice(gSavedSettings, "VoiceInputAudioDevice");
+ setCaptureDevice(sInputDevice);
- LL_INFOS("Voice") << "Input device: " << std::quoted(sInputDevice()) << ", output device: " << std::quoted(sOutputDevice()) << LL_ENDL;
+ static LLCachedControl<std::string> sOutputDevice(gSavedSettings, "VoiceOutputAudioDevice");
+ setRenderDevice(sOutputDevice);
- static LLCachedControl<F32> sMicLevel(gSavedSettings, "AudioLevelMic");
- setMicGain(sMicLevel);
+ LL_INFOS("Voice") << "Input device: " << std::quoted(sInputDevice()) << ", output device: " << std::quoted(sOutputDevice())
+ << LL_ENDL;
- llwebrtc::LLWebRTCDeviceInterface::AudioConfig config;
+ static LLCachedControl<F32> sMicLevel(gSavedSettings, "AudioLevelMic");
+ setMicGain(sMicLevel);
- static LLCachedControl<bool> sEchoCancellation(gSavedSettings, "VoiceEchoCancellation", true);
- config.mEchoCancellation = sEchoCancellation;
+ llwebrtc::LLWebRTCDeviceInterface::AudioConfig config;
- static LLCachedControl<bool> sAGC(gSavedSettings, "VoiceAutomaticGainControl", true);
- config.mAGC = sAGC;
+ bool audioConfigChanged = false;
- static LLCachedControl<U32> sNoiseSuppressionLevel(gSavedSettings,
- "VoiceNoiseSuppressionLevel",
- llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel::NOISE_SUPPRESSION_LEVEL_VERY_HIGH);
- config.mNoiseSuppressionLevel = (llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel) (U32)sNoiseSuppressionLevel;
+ static LLCachedControl<bool> sEchoCancellation(gSavedSettings, "VoiceEchoCancellation", true);
+ if (sEchoCancellation != config.mEchoCancellation)
+ {
+ config.mEchoCancellation = sEchoCancellation;
+ audioConfigChanged = true;
+ }
- mWebRTCDeviceInterface->setAudioConfig(config);
+ static LLCachedControl<bool> sAGC(gSavedSettings, "VoiceAutomaticGainControl", true);
+ if (sAGC != config.mAGC)
+ {
+ config.mAGC = sAGC;
+ audioConfigChanged = true;
+ }
+ static LLCachedControl<U32> sNoiseSuppressionLevel(
+ gSavedSettings,
+ "VoiceNoiseSuppressionLevel",
+ llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel::NOISE_SUPPRESSION_LEVEL_VERY_HIGH);
+ auto noiseSuppressionLevel =
+ (llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel)(U32)sNoiseSuppressionLevel;
+ if (noiseSuppressionLevel != config.mNoiseSuppressionLevel)
+ {
+ config.mNoiseSuppressionLevel = noiseSuppressionLevel;
+ audioConfigChanged = true;
+ }
+ if (audioConfigChanged && mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setAudioConfig(config);
+ }
+ }
}
// Observers
@@ -661,7 +697,10 @@ LLVoiceDeviceList& LLWebRTCVoiceClient::getCaptureDevices()
void LLWebRTCVoiceClient::setCaptureDevice(const std::string& name)
{
- mWebRTCDeviceInterface->setCaptureDevice(name);
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setCaptureDevice(name);
+ }
}
void LLWebRTCVoiceClient::setDevicesListUpdated(bool state)
{
@@ -692,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);
}
@@ -731,14 +787,20 @@ LLVoiceDeviceList& LLWebRTCVoiceClient::getRenderDevices()
void LLWebRTCVoiceClient::setRenderDevice(const std::string& name)
{
- mWebRTCDeviceInterface->setRenderDevice(name);
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setRenderDevice(name);
+ }
}
void LLWebRTCVoiceClient::tuningStart()
{
if (!mIsInTuningMode)
{
- mWebRTCDeviceInterface->setTuningMode(true);
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setTuningMode(true);
+ }
mIsInTuningMode = true;
}
}
@@ -747,7 +809,10 @@ void LLWebRTCVoiceClient::tuningStop()
{
if (mIsInTuningMode)
{
- mWebRTCDeviceInterface->setTuningMode(false);
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setTuningMode(false);
+ }
mIsInTuningMode = false;
}
}
@@ -759,7 +824,14 @@ bool LLWebRTCVoiceClient::inTuningMode()
void LLWebRTCVoiceClient::tuningSetMicVolume(float volume)
{
- mTuningMicGain = volume;
+ if (volume != mTuningMicGain)
+ {
+ mTuningMicGain = volume;
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setTuningMicGain(volume);
+ }
+ }
}
void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume)
@@ -771,21 +843,14 @@ void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume)
}
}
-float LLWebRTCVoiceClient::getAudioLevel()
+float LLWebRTCVoiceClient::tuningGetEnergy(void)
{
- if (mIsInTuningMode)
+ if (!mWebRTCDeviceInterface)
{
- return (1.0f - mWebRTCDeviceInterface->getTuningAudioLevel() * LEVEL_SCALE_WEBRTC) * mTuningMicGain / 2.1f;
- }
- else
- {
- return (1.0f - mWebRTCDeviceInterface->getPeerConnectionAudioLevel() * LEVEL_SCALE_WEBRTC) * mMicGain / 2.1f;
+ return 0.f;
}
-}
-
-float LLWebRTCVoiceClient::tuningGetEnergy(void)
-{
- return getAudioLevel();
+ float rms = mWebRTCDeviceInterface->getTuningAudioLevel();
+ return TUNING_LEVEL_START_POINT - TUNING_LEVEL_SCALE * rms;
}
bool LLWebRTCVoiceClient::deviceSettingsAvailable()
@@ -811,7 +876,10 @@ void LLWebRTCVoiceClient::refreshDeviceLists(bool clearCurrentList)
clearCaptureDevices();
clearRenderDevices();
}
- mWebRTCDeviceInterface->refreshDevices();
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->refreshDevices();
+ }
}
@@ -821,6 +889,11 @@ void LLWebRTCVoiceClient::setHidden(bool hidden)
if (inSpatialChannel())
{
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setMute(mHidden || mMuteMic,
+ mHidden ? 0 : SET_HIDDEN_RESTORE_DELAY_MS); // delay 200ms so as to not pile up mutes/unmutes.
+ }
if (mHidden)
{
// get out of the channel entirely
@@ -985,7 +1058,9 @@ void LLWebRTCVoiceClient::updatePosition(void)
LLWebRTCVoiceClient::participantStatePtr_t participant = findParticipantByID("Estate", gAgentID);
if(participant)
{
- participant->mRegion = gAgent.getRegion()->getRegionID();
+ if (participant->mRegion != region->getRegionID()) {
+ participant->mRegion = region->getRegionID();
+ }
}
}
}
@@ -1109,13 +1184,14 @@ void LLWebRTCVoiceClient::sendPositionUpdate(bool force)
// Update our own volume on our participant, so it'll show up
// in the UI. This is done on all sessions, so switching
// sessions retains consistent volume levels.
-void LLWebRTCVoiceClient::updateOwnVolume() {
- F32 audio_level = 0.0;
- if (!mMuteMic && !mTuningMode)
+void LLWebRTCVoiceClient::updateOwnVolume()
+{
+ F32 audio_level = 0.0f;
+ if (!mMuteMic && mWebRTCDeviceInterface)
{
- audio_level = getAudioLevel();
+ float rms = mWebRTCDeviceInterface->getPeerConnectionAudioLevel();
+ audio_level = LEVEL_START_POINT - LEVEL_SCALE * rms;
}
-
sessionState::for_each(boost::bind(predUpdateOwnVolume, _1, audio_level));
}
@@ -1512,6 +1588,17 @@ void LLWebRTCVoiceClient::setMuteMic(bool muted)
}
mMuteMic = muted;
+
+ if (mIsInTuningMode)
+ {
+ return;
+ }
+
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setMute(muted, muted ? MUTE_FADE_DELAY_MS : 0); // delay for 40ms on mute to allow buffers to empty
+ }
+
// when you're hidden, your mic is always muted.
if (!mHidden)
{
@@ -1550,7 +1637,10 @@ void LLWebRTCVoiceClient::setMicGain(F32 gain)
if (gain != mMicGain)
{
mMicGain = gain;
- mWebRTCDeviceInterface->setPeerConnectionGain(gain);
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setMicGain(gain);
+ }
}
}
@@ -1734,6 +1824,15 @@ void LLWebRTCVoiceClient::onChangeDetailed(const LLMute& mute)
}
}
+void LLWebRTCVoiceClient::userAuthorized(const std::string& user_id, const LLUUID& agentID)
+{
+ if (sShuttingDown)
+ {
+ sShuttingDown = false; // was terminated, restart
+ initWebRTC();
+ }
+}
+
void LLWebRTCVoiceClient::predSetUserMute(const LLWebRTCVoiceClient::sessionStatePtr_t &session, const LLUUID &id, bool mute)
{
session->setUserMute(id, mute);
@@ -1999,6 +2098,33 @@ bool LLWebRTCVoiceClient::sessionState::processConnectionStates()
return !mWebRTCConnections.empty();
}
+// Helper function to check if a region supports WebRTC voice
+bool LLWebRTCVoiceClient::estateSessionState::isRegionWebRTCEnabled(const LLUUID& regionID)
+{
+ LLViewerRegion* region = LLWorld::getInstance()->getRegionFromID(regionID);
+ if (!region)
+ {
+ LL_WARNS("Voice") << "Could not find region " << regionID
+ << " for voice server type validation" << LL_ENDL;
+ return false;
+ }
+
+ LLSD simulatorFeatures;
+ region->getSimulatorFeatures(simulatorFeatures);
+
+ bool isWebRTCEnabled = simulatorFeatures.has("VoiceServerType") &&
+ simulatorFeatures["VoiceServerType"].asString() == "webrtc";
+
+ if (!isWebRTCEnabled)
+ {
+ LL_DEBUGS("Voice") << "Region " << regionID << " VoiceServerType is not 'webrtc' (got: "
+ << (simulatorFeatures.has("VoiceServerType") ? simulatorFeatures["VoiceServerType"].asString() : "none") << ")"
+ << LL_ENDL;
+ }
+
+ return isWebRTCEnabled;
+}
+
// processing of spatial voice connection states requires special handling.
// as neighboring regions need to be started up or shut down depending
// on our location.
@@ -2023,6 +2149,13 @@ bool LLWebRTCVoiceClient::estateSessionState::processConnectionStates()
// shut down connections to neighbors that are too far away.
spatialConnection.get()->shutDown();
}
+ else if (!isRegionWebRTCEnabled(regionID))
+ {
+ // shut down connections to neighbors that no longer support WebRTC voice.
+ LL_DEBUGS("Voice") << "Shutting down connection to neighbor region " << regionID
+ << " - no longer supports WebRTC voice" << LL_ENDL;
+ spatialConnection.get()->shutDown();
+ }
if (!spatialConnection.get()->isShuttingDown())
{
neighbor_ids.erase(regionID);
@@ -2032,11 +2165,20 @@ bool LLWebRTCVoiceClient::estateSessionState::processConnectionStates()
// add new connections for new neighbors
for (auto &neighbor : neighbor_ids)
{
- connectionPtr_t connection(new LLVoiceWebRTCSpatialConnection(neighbor, INVALID_PARCEL_ID, mChannelID));
+ // Only connect if the region supports WebRTC voice server type
+ if (isRegionWebRTCEnabled(neighbor))
+ {
+ connectionPtr_t connection(new LLVoiceWebRTCSpatialConnection(neighbor, INVALID_PARCEL_ID, mChannelID));
- mWebRTCConnections.push_back(connection);
- connection->setMuteMic(mMuted);
- connection->setSpeakerVolume(mSpeakerVolume);
+ mWebRTCConnections.push_back(connection);
+ connection->setMuteMic(mMuted); // mute will be set for primary connection when that connection comes up
+ connection->setSpeakerVolume(mSpeakerVolume);
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Skipping neighbor region " << neighbor
+ << " - does not support WebRTC voice" << LL_ENDL;
+ }
}
}
return LLWebRTCVoiceClient::sessionState::processConnectionStates();
@@ -2259,7 +2401,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
return;
}
- bool iceCompleted = false;
LLSD body;
if (!connection->mIceCandidates.empty() || connection->mIceCompleted)
{
@@ -2298,7 +2439,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
LLSD body_candidate;
body_candidate["completed"] = true;
body["candidate"] = body_candidate;
- iceCompleted = connection->mIceCompleted;
connection->mIceCompleted = false;
}
@@ -2386,6 +2526,7 @@ void LLVoiceWebRTCConnection::OnAudioEstablished(llwebrtc::LLWebRTCAudioInterfac
}
LL_DEBUGS("Voice") << "On AudioEstablished." << LL_ENDL;
mWebRTCAudioInterface = audio_interface;
+ mWebRTCAudioInterface->setMute(true); // mute will be set appropriately later when we finish setting up.
setVoiceConnectionState(VOICE_STATE_SESSION_ESTABLISHED);
});
}
@@ -2546,6 +2687,11 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro(connectionPtr_t connectio
void LLVoiceWebRTCSpatialConnection::requestVoiceConnection()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
+ if (LLWebRTCVoiceClient::isShuttingDown())
+ {
+ mOutstandingRequests--;
+ return;
+ }
LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID);
@@ -2745,7 +2891,12 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
}
// update the peer connection with the various characteristics of
// this connection.
- mWebRTCAudioInterface->setMute(mMuted);
+ // For spatial this connection will come up as muted, but will be set to the appropriate
+ // value later on when we determine the regions we connect to.
+ if (!isSpatial())
+ {
+ mWebRTCAudioInterface->setMute(mMuted);
+ }
mWebRTCAudioInterface->setReceiveVolume(mSpeakerVolume);
LLWebRTCVoiceClient::getInstance()->OnConnectionEstablished(mChannelID, mRegionID);
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_DATA_CHANNEL);
@@ -2790,6 +2941,10 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
if (primary != mPrimary)
{
mPrimary = primary;
+ if (mWebRTCAudioInterface)
+ {
+ mWebRTCAudioInterface->setMute(mMuted || !mPrimary);
+ }
sendJoin();
}
}
@@ -2843,9 +2998,13 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
}
// else was already posted by llwebrtc::terminate().
break;
+ }
+
case VOICE_STATE_WAIT_FOR_CLOSE:
break;
+
case VOICE_STATE_CLOSED:
+ {
if (!mShutDown)
{
mVoiceConnectionState = VOICE_STATE_START_SESSION;
@@ -2921,7 +3080,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
return;
}
boost::json::object voice_data = voice_data_parsed.as_object();
- bool new_participant = false;
boost::json::object mute;
boost::json::object user_gain;
for (auto &participant_elem : voice_data)
@@ -2974,7 +3132,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);
@@ -3092,10 +3249,7 @@ LLVoiceWebRTCSpatialConnection::LLVoiceWebRTCSpatialConnection(const LLUUID &reg
LLVoiceWebRTCConnection(regionID, channelID),
mParcelLocalID(parcelLocalID)
{
- if (gAgent.getRegion())
- {
- mPrimary = (regionID == gAgent.getRegion()->getRegionID());
- }
+ mPrimary = false; // will be set to primary after connection established
}
LLVoiceWebRTCSpatialConnection::~LLVoiceWebRTCSpatialConnection()
@@ -3104,23 +3258,20 @@ LLVoiceWebRTCSpatialConnection::~LLVoiceWebRTCSpatialConnection()
void LLVoiceWebRTCSpatialConnection::setMuteMic(bool muted)
{
- if (mMuted != muted)
+ mMuted = muted;
+ if (mWebRTCAudioInterface)
{
- mMuted = muted;
- if (mWebRTCAudioInterface)
+ LLViewerRegion *regionp = gAgent.getRegion();
+ if (regionp && mRegionID == regionp->getRegionID())
{
- LLViewerRegion *regionp = gAgent.getRegion();
- if (regionp && mRegionID == regionp->getRegionID())
- {
- mWebRTCAudioInterface->setMute(muted);
- }
- else
- {
- // Always mute this agent with respect to neighboring regions.
- // Peers don't want to hear this agent from multiple regions
- // as that'll echo.
- mWebRTCAudioInterface->setMute(true);
- }
+ mWebRTCAudioInterface->setMute(muted);
+ }
+ else
+ {
+ // Always mute this agent with respect to neighboring regions.
+ // Peers don't want to hear this agent from multiple regions
+ // as that'll echo.
+ mWebRTCAudioInterface->setMute(true);
}
}
}
@@ -3148,6 +3299,12 @@ void LLVoiceWebRTCAdHocConnection::requestVoiceConnection()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
+ if (LLWebRTCVoiceClient::isShuttingDown())
+ {
+ mOutstandingRequests--;
+ return;
+ }
+
LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID);
LL_DEBUGS("Voice") << "Requesting voice connection." << LL_ENDL;
diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h
index 946a80e874..0c658803db 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);
@@ -351,6 +351,9 @@ public:
bool isSpatial() override { return true; }
bool isEstate() override { return true; }
bool isCallbackPossible() override { return false; }
+
+ private:
+ bool isRegionWebRTCEnabled(const LLUUID& regionID);
};
class parcelSessionState : public sessionState
@@ -440,10 +443,8 @@ public:
boost::signals2::connection mAvatarNameCacheConnection;
private:
-
- // helper function to retrieve the audio level
- // Used in multiple places.
- float getAudioLevel();
+ // init or restart the WebRTC device interface.
+ void initWebRTC();
// Coroutine support methods
//---
@@ -455,7 +456,6 @@ private:
LL::WorkQueue::weak_t mMainQueue;
- bool mTuningMode;
F32 mTuningMicGain;
int mTuningSpeakerVolume;
bool mDevicesListUpdated; // set to true when the device list has been updated
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index 294d36b0a9..bc326a74a8 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -245,6 +245,7 @@ bool LLVOSurfacePatch::updateLOD()
void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
+ LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp)
{
@@ -259,18 +260,21 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,
updateMainGeometry(facep,
verticesp,
normalsp,
+ texCoords0p,
texCoords1p,
indicesp,
index_offset);
updateNorthGeometry(facep,
verticesp,
normalsp,
+ texCoords0p,
texCoords1p,
indicesp,
index_offset);
updateEastGeometry(facep,
verticesp,
normalsp,
+ texCoords0p,
texCoords1p,
indicesp,
index_offset);
@@ -279,6 +283,7 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,
void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
+ LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset)
@@ -317,9 +322,10 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
{
x = i * render_stride;
y = j * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
}
@@ -381,6 +387,7 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
+ LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset)
@@ -414,9 +421,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * render_stride;
y = 16 - render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -425,9 +433,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
{
x = i * render_stride;
y = 16;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -460,9 +469,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * render_stride;
y = 16 - render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -472,9 +482,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * render_stride;
y = 16;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -514,9 +525,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * north_stride;
y = 16 - render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -526,9 +538,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * north_stride;
y = 16;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -564,6 +577,7 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
+ LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset)
@@ -592,9 +606,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16 - render_stride;
y = i * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -603,9 +618,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
{
x = 16;
y = i * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -638,9 +654,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16 - render_stride;
y = i * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
// Iterate through the east patch's points
@@ -649,9 +666,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16;
y = i * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -690,9 +708,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16 - render_stride;
y = i * east_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
// Iterate through the east patch's points
@@ -701,9 +720,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16;
y = i * east_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
+ texCoords0p++;
texCoords1p++;
}
@@ -1022,12 +1042,14 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
LLStrider<LLVector3> vertices_start;
LLStrider<LLVector3> normals_start;
LLStrider<LLVector4a> tangents_start;
+ LLStrider<LLVector2> texcoords0_start; // ownership overlay
LLStrider<LLVector2> texcoords2_start;
LLStrider<U16> indices_start;
llassert_always(buffer->getVertexStrider(vertices_start));
llassert_always(buffer->getNormalStrider(normals_start));
llassert_always(buffer->getTangentStrider(tangents_start));
+ llassert_always(buffer->getTexCoord0Strider(texcoords0_start));
llassert_always(buffer->getTexCoord1Strider(texcoords2_start));
llassert_always(buffer->getIndexStrider(indices_start));
@@ -1037,6 +1059,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
{
LLStrider<LLVector3> vertices = vertices_start;
LLStrider<LLVector3> normals = normals_start;
+ LLStrider<LLVector2> texcoords0 = texcoords0_start;
LLStrider<LLVector2> texcoords2 = texcoords2_start;
LLStrider<U16> indices = indices_start;
@@ -1049,7 +1072,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
facep->setVertexBuffer(buffer);
LLVOSurfacePatch* patchp = (LLVOSurfacePatch*) facep->getViewerObject();
- patchp->getTerrainGeometry(vertices, normals, texcoords2, indices);
+ patchp->getTerrainGeometry(vertices, normals, texcoords0, texcoords2, indices);
indices_index += facep->getIndicesCount();
index_offset += facep->getGeomCount();
diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h
index af5f05774b..c93a58d2d9 100644
--- a/indra/newview/llvosurfacepatch.h
+++ b/indra/newview/llvosurfacepatch.h
@@ -57,6 +57,7 @@ public:
/*virtual*/ void updateFaceSize(S32 idx);
void getTerrainGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
+ LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp);
@@ -109,18 +110,21 @@ protected:
void updateMainGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
+ LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset);
void updateNorthGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
+ LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset);
void updateEastGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
+ LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 3fb7a3c156..4f828cc0ff 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -352,8 +352,11 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
if (isSculpted())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- sculpt_id = sculpt_params->getSculptTexture();
- sculpt_type = sculpt_params->getSculptType();
+ if (sculpt_params)
+ {
+ sculpt_id = sculpt_params->getSculptTexture();
+ sculpt_type = sculpt_params->getSculptType();
+ }
LL_DEBUGS("ObjectUpdate") << "uuid " << mID << " set sculpt_id " << sculpt_id << LL_ENDL;
}
@@ -860,8 +863,11 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
// animated faces get moved to a smaller partition to reduce
// side-effects of their updates (see shrinkWrap in
// LLVOVolume::animateTextures).
- mDrawable->getSpatialGroup()->dirtyGeom();
- gPipeline.markRebuild(mDrawable->getSpatialGroup());
+ if (mDrawable->getSpatialGroup())
+ {
+ mDrawable->getSpatialGroup()->dirtyGeom();
+ gPipeline.markRebuild(mDrawable->getSpatialGroup());
+ }
}
}
@@ -1188,12 +1194,15 @@ void LLVOVolume::updateSculptTexture()
if (isSculpted() && !isMesh())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID id = sculpt_params->getSculptTexture();
- if (id.notNull())
+ if (sculpt_params)
{
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_SCULPTED, LLViewerTexture::LOD_TEXTURE);
- mSculptTexture->forceToSaveRawImage(0, F32_MAX);
- mSculptTexture->setKnownDrawSize(256, 256);
+ LLUUID id = sculpt_params->getSculptTexture();
+ if (id.notNull())
+ {
+ mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_SCULPTED, LLViewerTexture::LOD_TEXTURE);
+ mSculptTexture->forceToSaveRawImage(0, F32_MAX);
+ mSculptTexture->setKnownDrawSize(256, 256);
+ }
}
mSkinInfoUnavaliable = false;
@@ -1481,6 +1490,7 @@ bool LLVOVolume::calcLOD()
const LLVector3* box = avatar->getLastAnimExtents();
LLVector3 diag = box[1] - box[0];
radius = diag.magVec() * 0.5f;
+ LL_DEBUGS("DynamicBox") << avatar->getDebugName() << " diag " << diag << " radius " << radius << LL_ENDL;
}
else
{
@@ -1491,6 +1501,7 @@ bool LLVOVolume::calcLOD()
const LLVector3* box = avatar->getLastAnimExtents();
LLVector3 diag = box[1] - box[0];
radius = diag.magVec(); // preserve old BinRadius behavior - 2x off
+ LL_DEBUGS("DynamicBox") << avatar->getDebugName() << " diag " << diag << " radius " << radius << LL_ENDL;
}
if (distance <= 0.f || radius <= 0.f)
{
@@ -1555,11 +1566,16 @@ bool LLVOVolume::calcLOD()
mLODAdjustedDistance = distance;
+ static LLCachedControl<S32> debug_selection_lods(gSavedSettings, "DebugSelectionLODs", 0);
if (isHUDAttachment())
{
// HUDs always show at highest detail
cur_detail = 3;
}
+ else if (isSelected() && debug_selection_lods() >= 0)
+ {
+ cur_detail = llmin(debug_selection_lods(), 3);
+ }
else
{
cur_detail = computeLODDetail(ll_round(distance, 0.01f), ll_round(radius, 0.01f), lod_factor);
@@ -2640,6 +2656,17 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
}
viewer_media_t media_impl = LLViewerMedia::getInstance()->updateMediaImpl(mep, previous_url, update_from_self);
+ static LLCachedControl<bool> media_autoplay_huds(gSavedSettings, "MediaAutoPlayHuds", true);
+ bool was_loaded = media_impl->hasMedia();
+ if (isHUDAttachment() && media_autoplay_huds && !was_loaded)
+ {
+ std::string url = mep->getCurrentURL();
+ if (media_impl->getCurrentMediaURL() != url)
+ {
+ media_impl->navigateTo(url, "", false, true);
+ }
+ }
+
addMediaImpl(media_impl, texture_index) ;
}
else
@@ -3573,12 +3600,15 @@ bool LLVOVolume::isMesh() const
if (isSculpted())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- U8 sculpt_type = sculpt_params->getSculptType();
-
- if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
- // mesh is a mesh
+ if (sculpt_params)
{
- return true;
+ U8 sculpt_type = sculpt_params->getSculptType();
+
+ if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ // mesh is a mesh
+ {
+ return true;
+ }
}
}
@@ -3780,7 +3810,12 @@ bool LLVOVolume::canBeAnimatedObject() const
bool LLVOVolume::isAnimatedObject() const
{
- LLVOVolume *root_vol = (LLVOVolume*)getRootEdit();
+ LLViewerObject *root_obj = getRootEdit();
+ if (root_obj->getPCode() != LL_PCODE_VOLUME)
+ {
+ return false; // at the moment only volumes can be animated
+ }
+ LLVOVolume* root_vol = (LLVOVolume*)root_obj;
mIsAnimatedObject = root_vol->getExtendedMeshFlags() & LLExtendedMeshParams::ANIMATED_MESH_ENABLED_FLAG;
return mIsAnimatedObject;
}
@@ -4990,7 +5025,7 @@ void LLRiggedVolume::update(
else
{
face_begin = face_index;
- face_end = face_begin + 1;
+ face_end = llmin(face_begin + 1, volume->getNumVolumeFaces());
}
for (S32 i = face_begin; i < face_end; ++i)
{
@@ -6729,7 +6764,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
&& te->getShiny()
&& can_be_shiny)
{ //shiny
- if (tex->getPrimaryFormat() == GL_ALPHA)
+ if (tex && tex->getPrimaryFormat() == GL_ALPHA)
{ //invisiprim+shiny
if (!facep->getViewerObject()->isAttachment() && !facep->getViewerObject()->isRiggedMesh())
{
@@ -6769,7 +6804,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
}
else
{ //not alpha and not shiny
- if (!is_alpha && tex->getPrimaryFormat() == GL_ALPHA)
+ if (!is_alpha && tex && tex->getPrimaryFormat() == GL_ALPHA)
{ //invisiprim
if (!facep->getViewerObject()->isAttachment() && !facep->getViewerObject()->isRiggedMesh())
{
diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp
index 0a1d346266..bf171fe954 100644
--- a/indra/newview/llwatchdog.cpp
+++ b/indra/newview/llwatchdog.cpp
@@ -29,7 +29,7 @@
#include "llwatchdog.h"
#include "llthread.h"
-const U32 WATCHDOG_SLEEP_TIME_USEC = 1000000;
+constexpr U32 WATCHDOG_SLEEP_TIME_USEC = 1000000U;
// This class runs the watchdog timing thread.
class LLWatchdogTimerThread : public LLThread
@@ -51,7 +51,7 @@ public:
mSleepMsecs = 1;
}
- /* virtual */ void run()
+ void run() override
{
while(!mStopping)
{
@@ -83,7 +83,7 @@ void LLWatchdogEntry::start()
void LLWatchdogEntry::stop()
{
// this can happen very late in the shutdown sequence
- if (! LLWatchdog::wasDeleted())
+ if (!LLWatchdog::wasDeleted())
{
LLWatchdog::getInstance()->remove(this);
}
@@ -117,7 +117,7 @@ void LLWatchdogTimeout::setTimeout(F32 d)
mTimeout = d;
}
-void LLWatchdogTimeout::start(const std::string& state)
+void LLWatchdogTimeout::start(std::string_view state)
{
if (mTimeout == 0)
{
@@ -139,9 +139,9 @@ void LLWatchdogTimeout::stop()
mTimer.stop();
}
-void LLWatchdogTimeout::ping(const std::string& state)
+void LLWatchdogTimeout::ping(std::string_view state)
{
- if(!state.empty())
+ if (!state.empty())
{
mPingState = state;
}
@@ -151,7 +151,7 @@ void LLWatchdogTimeout::ping(const std::string& state)
// LLWatchdog
LLWatchdog::LLWatchdog()
:mSuspectsAccessMutex()
- ,mTimer(NULL)
+ ,mTimer(nullptr)
,mLastClockCount(0)
{
}
@@ -176,7 +176,7 @@ void LLWatchdog::remove(LLWatchdogEntry* e)
void LLWatchdog::init()
{
- if(!mSuspectsAccessMutex && !mTimer)
+ if (!mSuspectsAccessMutex && !mTimer)
{
mSuspectsAccessMutex = new LLMutex();
mTimer = new LLWatchdogTimerThread();
@@ -191,17 +191,17 @@ void LLWatchdog::init()
void LLWatchdog::cleanup()
{
- if(mTimer)
+ if (mTimer)
{
mTimer->stop();
delete mTimer;
- mTimer = NULL;
+ mTimer = nullptr;
}
- if(mSuspectsAccessMutex)
+ if (mSuspectsAccessMutex)
{
delete mSuspectsAccessMutex;
- mSuspectsAccessMutex = NULL;
+ mSuspectsAccessMutex = nullptr;
}
mLastClockCount = 0;
@@ -214,12 +214,12 @@ void LLWatchdog::run()
// Check the time since the last call to run...
// If the time elapsed is two times greater than the regualr sleep time
// reset the active timeouts.
- const U32 TIME_ELAPSED_MULTIPLIER = 2;
+ constexpr U32 TIME_ELAPSED_MULTIPLIER = 2;
U64 current_time = LLTimer::getTotalTime();
U64 current_run_delta = current_time - mLastClockCount;
mLastClockCount = current_time;
- if(current_run_delta > (WATCHDOG_SLEEP_TIME_USEC * TIME_ELAPSED_MULTIPLIER))
+ if (current_run_delta > (WATCHDOG_SLEEP_TIME_USEC * TIME_ELAPSED_MULTIPLIER))
{
LL_INFOS() << "Watchdog thread delayed: resetting entries." << LL_ENDL;
for (const auto& suspect : mSuspects)
@@ -233,7 +233,7 @@ void LLWatchdog::run()
std::find_if(mSuspects.begin(),
mSuspects.end(),
[](const LLWatchdogEntry* suspect){ return ! suspect->isAlive(); });
- if(result != mSuspects.end())
+ if (result != mSuspects.end())
{
// error!!!
if(mTimer)
@@ -251,7 +251,7 @@ void LLWatchdog::run()
void LLWatchdog::lockThread()
{
- if(mSuspectsAccessMutex != NULL)
+ if (mSuspectsAccessMutex)
{
mSuspectsAccessMutex->lock();
}
@@ -259,7 +259,7 @@ void LLWatchdog::lockThread()
void LLWatchdog::unlockThread()
{
- if(mSuspectsAccessMutex != NULL)
+ if (mSuspectsAccessMutex)
{
mSuspectsAccessMutex->unlock();
}
diff --git a/indra/newview/llwatchdog.h b/indra/newview/llwatchdog.h
index fe8932e298..1931c582b0 100644
--- a/indra/newview/llwatchdog.h
+++ b/indra/newview/llwatchdog.h
@@ -56,14 +56,14 @@ public:
LLWatchdogTimeout();
virtual ~LLWatchdogTimeout();
- /* virtual */ bool isAlive() const;
- /* virtual */ void reset();
- /* virtual */ void start() { start(""); }
- /* virtual */ void stop();
+ bool isAlive() const override;
+ void reset() override;
+ void start() override { start(""); }
+ void stop() override;
- void start(const std::string& state);
+ void start(std::string_view state);
void setTimeout(F32 d);
- void ping(const std::string& state);
+ void ping(std::string_view state);
const std::string& getState() {return mPingState; }
private:
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 8ce1a745c3..cc593fe7b4 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -33,7 +33,6 @@
#include "llagentwearables.h"
#include "llappearancemgr.h"
-#include "llinventoryfunctions.h"
#include "llinventoryicon.h"
#include "llgesturemgr.h"
#include "lltransutil.h"
@@ -41,15 +40,6 @@
#include "llviewermenu.h"
#include "llvoavatarself.h"
-class LLFindOutfitItems : public LLInventoryCollectFunctor
-{
-public:
- LLFindOutfitItems() {}
- virtual ~LLFindOutfitItems() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-};
-
bool LLFindOutfitItems::operator()(LLInventoryCategory* cat,
LLInventoryItem* item)
{
@@ -195,6 +185,7 @@ LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item
// virtual
void LLPanelWearableOutfitItem::updateItem(const std::string& name,
+ bool favorite,
EItemState item_state)
{
std::string search_label = name;
@@ -225,7 +216,7 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
}
}
- LLPanelInventoryListItemBase::updateItem(search_label, item_state);
+ LLPanelInventoryListItemBase::updateItem(search_label, favorite, item_state);
}
//////////////////////////////////////////////////////////////////////////
@@ -452,6 +443,7 @@ LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryIt
}
void LLPanelAttachmentListItem::updateItem(const std::string& name,
+ bool favorite,
EItemState item_state)
{
std::string title_joint = name;
@@ -469,7 +461,7 @@ void LLPanelAttachmentListItem::updateItem(const std::string& name,
title_joint = title_joint + " (" + trans_name + ")";
}
- LLPanelInventoryListItemBase::updateItem(title_joint, item_state);
+ LLPanelInventoryListItemBase::updateItem(title_joint, favorite, item_state);
}
//////////////////////////////////////////////////////////////////////////
@@ -497,7 +489,7 @@ bool LLPanelDummyClothingListItem::postBuild()
addWidgetToRightSide("btn_add_panel");
setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, false));
- updateItem(wearableTypeToString(mWearableType));
+ updateItem(wearableTypeToString(mWearableType), false);
// Make it look loke clothing item - reserve space for 'delete' button
setLeftWidgetsWidth(getChildView("item_icon")->getRect().mLeft);
@@ -931,8 +923,8 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()
registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));
registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id));
registrar.add("Wearable.TakeOffDetach",
- boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op));
+ boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op));
// Register handlers for clothing.
registrar.add("Clothing.TakeOff",
boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op));
@@ -942,6 +934,7 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()
// Register handlers for attachments.
registrar.add("Attachment.Detach",
boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op));
+ registrar.add("Attachment.Favorite", boost::bind(toggle_favorites, ids));
registrar.add("Attachment.Touch", boost::bind(handle_attachment_touch, selected_id));
registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id));
registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2));
@@ -975,6 +968,8 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
U32 n_touchable = 0; // number of touchable items among the selected ones
bool can_be_worn = true;
+ bool can_favorite = false;
+ bool can_unfavorite = false;
for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
{
@@ -996,6 +991,15 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
const bool is_editable = get_is_item_editable(id);
const bool is_touchable = enable_attachment_touch(id);
const bool is_already_worn = gAgentWearables.selfHasWearable(wearable_type);
+
+ LLUUID linked_id = item->getLinkedUUID();
+ LLViewerInventoryItem* linked_item = gInventory.getItem(linked_id);
+ if (linked_item)
+ {
+ can_favorite |= !linked_item->getIsFavorite();
+ can_unfavorite |= linked_item->getIsFavorite();
+ }
+
if (is_worn)
{
++n_worn;
@@ -1019,7 +1023,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
if (can_be_worn)
{
- can_be_worn = get_can_item_be_worn(item->getLinkedUUID());
+ can_be_worn = get_can_item_be_worn(linked_id);
}
} // for
@@ -1041,6 +1045,8 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
setMenuItemEnabled(menu, "create_new", LLAppearanceMgr::instance().canAddWearables(ids));
setMenuItemVisible(menu, "show_original", !standalone);
setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items);
+ setMenuItemVisible(menu, "favorites_add", can_favorite);
+ setMenuItemVisible(menu, "favorites_remove", can_unfavorite);
setMenuItemVisible(menu, "take_off", mask == MASK_CLOTHING && n_worn == n_items);
setMenuItemVisible(menu, "detach", mask == MASK_ATTACHMENT && n_worn == n_items);
setMenuItemVisible(menu, "take_off_or_detach", mask == (MASK_ATTACHMENT|MASK_CLOTHING));
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index 3fe1059176..915a557239 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -32,6 +32,7 @@
#include "llsingleton.h"
// newview
+#include "llinventoryfunctions.h"
#include "llinventoryitemslist.h"
#include "llinventorylistitem.h"
#include "lllistcontextmenu.h"
@@ -94,6 +95,7 @@ public:
* Updates item name and (worn) suffix.
*/
/*virtual*/ void updateItem(const std::string& name,
+ bool favorite,
EItemState item_state = IS_DEFAULT);
void onAddWearable();
@@ -147,6 +149,7 @@ public:
/** Set item title. Joint name is added to the title in parenthesis */
/*virtual*/ void updateItem(const std::string& name,
+ bool favorite,
EItemState item_state = IS_DEFAULT);
protected:
@@ -507,4 +510,12 @@ protected:
LLWearableType::EType mMenuWearableType;
};
+class LLFindOutfitItems : public LLInventoryCollectFunctor
+{
+public:
+ LLFindOutfitItems() {}
+ virtual ~LLFindOutfitItems() {}
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+};
+
#endif //LL_LLWEARABLEITEMSLIST_H
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 899733ccc3..47e1815bc2 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1372,10 +1372,8 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
F32 LLWorld::getNearbyAvatarsAndMaxGPUTime(std::vector<LLVOAvatar*> &valid_nearby_avs)
{
- static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64);
-
F32 nearby_max_complexity = 0;
- F32 radius = render_far_clip * render_far_clip;
+ F32 radius = LLVOAvatar::sRenderDistance * LLVOAvatar::sRenderDistance;
for (LLCharacter* character : LLCharacter::sInstances)
{
diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp
index 7962c28e6d..153bee3aef 100644
--- a/indra/newview/llworldmap.cpp
+++ b/indra/newview/llworldmap.cpp
@@ -32,6 +32,7 @@
#include "message.h"
#include "lltracker.h"
#include "lluistring.h"
+#include "llviewercontrol.h"
#include "llviewertexturelist.h"
#include "lltrans.h"
#include "llgltexture.h"
@@ -492,9 +493,20 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID&
case MAP_ITEM_MATURE_EVENT:
case MAP_ITEM_ADULT_EVENT:
{
- std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:["
- +LLTrans::getString ("TimeMin")+"] ["
- +LLTrans::getString ("TimeAMPM")+"]";
+ std::string timeStr;
+
+ static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
+ if (use_24h)
+ {
+ timeStr = "[" + LLTrans::getString("TimeHour") + "]:["
+ + LLTrans::getString("TimeMin") + "]";
+ }
+ else
+ {
+ timeStr = "[" + LLTrans::getString("TimeHour12") + "]:["
+ + LLTrans::getString("TimeMin") + "] ["
+ + LLTrans::getString("TimeAMPM") + "]";
+ }
LLSD substitution;
substitution["datetime"] = (S32) extra;
LLStringUtil::format (timeStr, substitution);
diff --git a/indra/newview/mpfloatertuning.cpp b/indra/newview/mpfloatertuning.cpp
index 1a3e4cf718..23f8c21e70 100644
--- a/indra/newview/mpfloatertuning.cpp
+++ b/indra/newview/mpfloatertuning.cpp
@@ -39,47 +39,37 @@ MPFloaterTuning::MPFloaterTuning(const LLSD& key) : LLFloater(key)
{
}
-void MPFloaterTuning::syncFromPreferenceSetting(void *user_data)
-{
- MPFloaterTuning *self = static_cast<MPFloaterTuning*>(user_data);
+bool MPFloaterTuning::postBuild()
+{
U32 fps = gSavedSettings.getU32("MaxFPS");
if(fps==0) fps=132;
- LLSliderCtrl* fpsSliderCtrl = self->getChild<LLSliderCtrl>("fpsSlider");
- fpsSliderCtrl->setValue(fps,FALSE);
+ mFpsSlider = getChild<LLSliderCtrl>("fpsSliderCtrl");
+ mFpsSlider->setCommitCallback(boost::bind(&MPFloaterTuning::onFpsSliderChanged, this));
- LLTextBox* fpsText = self->getChild<LLTextBox>("fpsText");
- if(fps>120) fpsText->setValue("no limit");
- else fpsText->setValue(std::to_string(fps)+" fps");
-}
-
-bool MPFloaterTuning::postBuild()
-{
- LLSliderCtrl* fpsSliderCtrl = getChild<LLSliderCtrl>("fpsSlider");
- fpsSliderCtrl->setMinValue(12);
- fpsSliderCtrl->setMaxValue(132);
- fpsSliderCtrl->setSliderMouseUpCallback(boost::bind(&MPFloaterTuning::onFinalCommit,this));
+ mFpsSlider->setValue(fps, false);
- LLTextBox* fpsText = getChild<LLTextBox>("fpsText");
- fpsText->setValue("");
+ mFpsTextBox = getChild<LLTextBox>("fpsTextCtrl");
+ mFpsTextBox->setValue("");
- syncFromPreferenceSetting(this);
+ if(fps>120) mFpsTextBox->setValue("no limit");
+ else if(fps==0) mFpsTextBox->setValue("no limit");
+ else mFpsTextBox->setValue(std::to_string(fps)+" fps");
- return TRUE;
+ return true;
}
// Do send-to-the-server work when slider drag completes, or new
// value entered as text.
-void MPFloaterTuning::onFinalCommit()
+void MPFloaterTuning::onFpsSliderChanged()
{
- LLSliderCtrl* fpsSliderCtrl = getChild<LLSliderCtrl>("fpsSlider");
- U32 fps = (U32)fpsSliderCtrl->getValueF32();
+ U32 fps = (U32)mFpsSlider->getValueF32();
gSavedSettings.setU32("MaxFPS",fps);
- LLTextBox* fpsText = getChild<LLTextBox>("fpsText");
- if(fps>120) fpsText->setValue("no limit");
- else fpsText->setValue(std::to_string(fps)+" fps");
+ if(fps>120) mFpsTextBox->setValue("no limit");
+ else if(fps==0) mFpsTextBox->setValue("no limit");
+ else mFpsTextBox->setValue(std::to_string(fps)+" fps");
}
void MPFloaterTuning::onClose(bool app_quitting)
diff --git a/indra/newview/mpfloatertuning.h b/indra/newview/mpfloatertuning.h
index 9e9c7f174f..bebdaa9952 100644
--- a/indra/newview/mpfloatertuning.h
+++ b/indra/newview/mpfloatertuning.h
@@ -29,20 +29,28 @@
#include "llfloater.h"
+class LLSliderCtrl;
+class LLTextBox;
+
class MPFloaterTuning: public LLFloater
{
-public:
+ public:
+
MPFloaterTuning(const LLSD& key);
bool postBuild();
void onFinalCommit();
- static void syncFromPreferenceSetting(void *user_data);
-
- //void updateEditEnabled();
/*virtual*/ void onClose(bool app_quitting);
+
+ private:
+
+ LLSliderCtrl* mFpsSlider = nullptr;
+ LLTextBox* mFpsTextBox = nullptr;
+
+ void onFpsSliderChanged();
};
#endif
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 076459a7b2..1415e40ed8 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -121,7 +121,7 @@
#include "SMAAAreaTex.h"
#include "SMAASearchTex.h"
-
+#include "llerror.h"
#ifndef LL_WINDOWS
#define A_GCC 1
#pragma GCC diagnostic ignored "-Wunused-function"
@@ -141,10 +141,9 @@ bool LLPipeline::WindLightUseAtmosShaders;
bool LLPipeline::RenderDeferred;
F32 LLPipeline::RenderDeferredSunWash;
U32 LLPipeline::RenderFSAAType;
-U32 LLPipeline::RenderResolutionDivisor;
+F32 LLPipeline::RenderResolutionDivisor;
bool LLPipeline::RenderUIBuffer;
S32 LLPipeline::RenderShadowDetail;
-S32 LLPipeline::MPRenderShadowOpti;
S32 LLPipeline::RenderShadowSplits;
bool LLPipeline::RenderDeferredSSAO;
F32 LLPipeline::RenderShadowResolutionScale;
@@ -229,6 +228,9 @@ const F32 ALPHA_BLEND_CUTOFF = 0.598f;
const F32 DEFERRED_LIGHT_FALLOFF = 0.5f;
const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
+const U32 SHADOWS_RESX = 512;
+const U32 SHADOWS_RESY = 512;
+
extern S32 gBoxFrame;
extern bool gDisplaySwapBuffers;
extern bool gDebugGL;
@@ -268,6 +270,7 @@ LLTrace::BlockTimerStatHandle FTM_STATESORT("Sort Draw State");
LLTrace::BlockTimerStatHandle FTM_PIPELINE("Pipeline");
LLTrace::BlockTimerStatHandle FTM_CLIENT_COPY("Client Copy");
LLTrace::BlockTimerStatHandle FTM_RENDER_DEFERRED("Deferred Shading");
+LLTrace::BlockTimerStatHandle FTM_RENDER_SHADOWS("Shadows");
LLTrace::BlockTimerStatHandle FTM_RENDER_UI_HUD("HUD");
LLTrace::BlockTimerStatHandle FTM_RENDER_UI_3D("3D");
@@ -346,19 +349,25 @@ void validate_framebuffer_object();
// target -- RenderTarget to add attachments to
bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false)
{
- U32 orm = GL_RGBA;
+ U32 orm = GL_RGBA8;
+/*
+ U32 norm = GL_RGBA16;
+*/
U32 norm = GL_RGBA16F;
U32 emissive = GL_RGB16F;
static LLCachedControl<bool> has_emissive(gSavedSettings, "RenderEnableEmissiveBuffer", false);
static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);
+ static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0);
+ static LLCachedControl<bool> MPHDRDisplay(gSavedSettings, "MPHDRDisplay", false);
+
bool hdr = has_hdr() && gGLManager.mGLVersion > 4.05f;
- if (!hdr)
+ if (!hdr || MPColorPrecision != 2)
{
norm = GL_RGB10_A2;
- emissive = GL_RGB;
}
+ if (!hdr || (!MPHDRDisplay && MPColorPrecision == 1)) emissive = GL_RGB8;
bool valid = true;
valid = valid && target.addColorAttachment(orm); // frag-data[1] specular OR PBR ORM
@@ -427,9 +436,11 @@ void LLPipeline::init()
sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
+ mReflectionMapManager.refreshSettings();
+
mInitialized = true;
- stop_glerror();
+ LOG_GLERROR("LLPipeline::init()");
//create render pass pools
getPool(LLDrawPool::POOL_WATEREXCLUSION);
@@ -479,6 +490,10 @@ void LLPipeline::init()
gSavedSettings.setBOOL("RenderPerformanceTest", true);
}
+#if LL_DARWIN
+ mHDRDisplay = gSavedSettings.getBOOL("MPHDRDisplay");
+#endif
+
mOldRenderDebugMask = mRenderDebugMask;
mBackfaceCull = true;
@@ -527,7 +542,6 @@ void LLPipeline::init()
connectRefreshCachedSettingsSafe("RenderResolutionDivisor");
connectRefreshCachedSettingsSafe("RenderUIBuffer");
connectRefreshCachedSettingsSafe("RenderShadowDetail");
- connectRefreshCachedSettingsSafe("MPRenderShadowOpti");
connectRefreshCachedSettingsSafe("RenderShadowSplits");
connectRefreshCachedSettingsSafe("RenderDeferredSSAO");
connectRefreshCachedSettingsSafe("RenderShadowResolutionScale");
@@ -601,7 +615,6 @@ void LLPipeline::init()
connectRefreshCachedSettingsSafe("RenderMirrors");
connectRefreshCachedSettingsSafe("RenderHeroProbeUpdateRate");
connectRefreshCachedSettingsSafe("RenderHeroProbeConservativeUpdateMultiplier");
- connectRefreshCachedSettingsSafe("RenderAutoHideSurfaceAreaLimit");
LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl("CollectFontVertexBuffers");
if (cntrl_ptr.notNull())
@@ -702,7 +715,8 @@ void LLPipeline::cleanup()
void LLPipeline::destroyGL()
{
- stop_glerror();
+ LOG_GLERROR("LLPipeline::destroyGL()");
+
unloadShaders();
mHighlightFaces.clear();
@@ -731,9 +745,9 @@ void LLPipeline::resizeShadowTexture()
{
releaseSunShadowTargets();
releaseSpotShadowTargets();
- GLuint resX = gViewerWindow->getWorldViewWidthRaw();
- GLuint resY = gViewerWindow->getWorldViewHeightRaw();
- allocateShadowBuffer(resX, resY);
+ //GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+ //GLuint resY = gViewerWindow->getWorldViewHeightRaw();
+ allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY);
gResizeShadowTexture = false;
}
@@ -763,6 +777,12 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
return ret == FBO_SUCCESS_FULLRES;
}
+void LLPipeline::renderTriangle()
+{
+ gPipeline.mScreenTriangleVB->setBuffer();
+ gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+}
+
LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY)
{
@@ -807,13 +827,15 @@ LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY)
return ret;
}
-bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
+bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY, U32 type_)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);
bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr();
+ static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0);
+
if (mRT == &mMainRT)
{ // hacky -- allocate auxillary buffer
@@ -826,14 +848,14 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mRT = &mAuxillaryRT;
U32 res = mReflectionMapManager.mProbeResolution * 4; //multiply by 4 because probes will be 16x super sampled
- allocateScreenBufferInternal(res, res);
+ allocateScreenBufferInternal(res, res, 1);
if (RenderMirrors)
{
mHeroProbeManager.initReflectionMaps();
res = mHeroProbeManager.mProbeResolution; // We also scale the hero probe RT to the probe res since we don't super sample it.
mRT = &mHeroProbeRT;
- allocateScreenBufferInternal(res, res);
+ allocateScreenBufferInternal(res, res, 2);
}
mRT = &mMainRT;
@@ -844,28 +866,33 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mRT->width = resX;
mRT->height = resY;
- U32 res_mod = RenderResolutionDivisor;
+ F32 res_mod = fmin(RenderResolutionDivisor, 4.0);
- if (res_mod > 1 && res_mod < resX && res_mod < resY)
+ if (res_mod >= 0.5 && res_mod <= 4.0)
{
- resX /= res_mod;
- resY /= res_mod;
+ resX = (U32)(floor((F32)resX / res_mod));
+ resY = (U32)(floor((F32)resY / res_mod));
}
S32 shadow_detail = RenderShadowDetail;
bool ssao = RenderDeferredSSAO;
//allocate deferred rendering color buffers
- if (!mRT->deferredScreen.allocate(resX, resY, GL_RGBA, true)) return false;
+
+ GLuint deferredScreenFormat = GL_RGBA8;
+ if((hdr && MPColorPrecision == 2)) deferredScreenFormat = GL_RGBA16F;
+
+ if (!mRT->deferredScreen.allocate(resX, resY, deferredScreenFormat, true)) return false;
if (!addDeferredAttachments(mRT->deferredScreen)) return false;
- GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA;
+ GLuint screenFormat = GL_RGBA16F;
+ if(!hdr && !mHDRDisplay && MPColorPrecision == 1) screenFormat = GL_RGB10_A2;
if (!mRT->screen.allocate(resX, resY, GL_RGBA16F)) return false;
mRT->deferredScreen.shareDepthBuffer(mRT->screen);
- if (shadow_detail > 0 || ssao || RenderDepthOfField)
+ if (hdr || shadow_detail > 0 || ssao || RenderDepthOfField)
{ //only need mRT->deferredLight for shadows OR ssao OR dof
if (!mRT->deferredLight.allocate(resX, resY, screenFormat)) return false;
}
@@ -874,13 +901,17 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mRT->deferredLight.release();
}
- allocateShadowBuffer(resX, resY);
+ //allocateShadowBuffer(resX, resY);
+ if(type_ == 0) allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY);
if (!gCubeSnapshot) // hack to not re-allocate various targets for cube snapshots
{
+ GLuint UIFormat = GL_RGBA8;
+ //if(mHDRDisplay && MPColorPrecision == 2) UIFormat = GL_RGBA16F;
+
if (RenderUIBuffer)
{
- if (!mUIScreen.allocate(resX, resY, GL_RGBA))
+ if (!mUIScreen.allocate(resX, resY, UIFormat))
{
return false;
}
@@ -888,10 +919,16 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
if (RenderFSAAType > 0)
{
- if (!mFXAAMap.allocate(resX, resY, GL_RGBA)) return false;
+ GLuint AAFormat = GL_RGBA8;
+ if(mHDRDisplay && MPColorPrecision != 1)
+ {
+ AAFormat = GL_RGBA16F;
+ }
+
+ if (!mFXAAMap.allocate(resX, resY, AAFormat)) return false;
if (RenderFSAAType == 2)
{
- if (!mSMAABlendBuffer.allocate(resX, resY, GL_RGBA, false)) return false;
+ if (!mSMAABlendBuffer.allocate(resX, resY, AAFormat, false)) return false;
}
}
else
@@ -900,19 +937,36 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mSMAABlendBuffer.release();
}
+ //mDummyRT.allocate(8, 8, GL_RGBA8, false);
+
//water reflection texture (always needed as scratch space whether or not transparent water is enabled)
mWaterDis.allocate(resX, resY, screenFormat, true);
if(RenderScreenSpaceReflections)
{
- mSceneMap.allocate(resX, resY, screenFormat, true);
+ //mSceneMap.allocate(resX, resY, screenFormat, true);
+ //We plan a setting. For now e go with a reasonable value
+ mSceneMap.allocate(512, 512, screenFormat, true);
}
else
{
mSceneMap.release();
}
- mPostMap.allocate(resX, resY, screenFormat);
+/*
+ mPostPingMap.allocate(resX, resY, GL_RGBA);
+ mPostPongMap.allocate(resX, resY, GL_RGBA);
+*/
+ if((hdr && MPColorPrecision == 2) || mHDRDisplay)
+ {
+ mPostMaps[0].allocate(resX, resY, screenFormat);
+ mPostMaps[1].allocate(resX, resY, screenFormat);
+ }
+ else
+ {
+ mPostMaps[0].allocate(resX, resY, GL_RGBA);
+ mPostMaps[1].allocate(resX, resY, GL_RGBA);
+ }
// The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes.
// Should we ever make water not just a plane, it also aids with that as well as the water planes will be rendered into the mask.
@@ -925,9 +979,9 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
// used to scale down textures
// See LLViwerTextureList::updateImagesCreateTextures and LLImageGL::scaleDown
- mDownResMap.allocate(1024, 1024, GL_RGBA);
+ mDownResMap.allocate(1024, 1024, GL_RGBA8);
- mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA);
+ mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA8);
}
//HACK make screenbuffer allocations start failing after 30 seconds
if (gSavedSettings.getBOOL("SimulateFBOFailure"))
@@ -937,7 +991,7 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
gGL.getTexUnit(0)->disable();
- stop_glerror();
+ LOG_GLERROR("LLPipeline::allocateScreenBufferInternal end");
return true;
}
@@ -951,15 +1005,18 @@ bool LLPipeline::allocateShadowBuffer(U32 resX, U32 resY)
S32 shadow_detail = RenderShadowDetail;
F32 scale = gCubeSnapshot ? 1.0f : llmax(0.5f, RenderShadowResolutionScale); // Don't scale probe shadow maps
- U32 sun_shadow_map_width = BlurHappySize(resX, scale);
- U32 sun_shadow_map_height = BlurHappySize(resY, scale);
+ //U32 sun_shadow_map_width = BlurHappySize(resX, scale);
+ //U32 sun_shadow_map_height = BlurHappySize(resY, scale);
+ U32 sun_shadow_map_width = resX * scale;
+ U32 sun_shadow_map_height = resY * scale;
- if (shadow_detail > 0)
+ if (shadow_detail > 0 && shadow_detail < 3)
{ //allocate 4 sun shadow maps
for (U32 i = 0; i < 4; i++)
{
- if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true))
+ if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_NONE))
{
+ LL_WARNS() << "failed allocating shadow buffer " << i << " w:" << sun_shadow_map_width << " h:" << sun_shadow_map_height << LL_ENDL;
return false;
}
}
@@ -1059,10 +1116,9 @@ void LLPipeline::refreshCachedSettings()
RenderDeferred = true; // DEPRECATED -- gSavedSettings.getBOOL("RenderDeferred");
RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");
RenderFSAAType = gSavedSettings.getU32("RenderFSAAType");
- RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor");
+ RenderResolutionDivisor = gSavedSettings.getF32("RenderResolutionDivisor");
RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer");
RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail");
- MPRenderShadowOpti = gSavedSettings.getS32("MPRenderShadowOpti");
RenderShadowSplits = gSavedSettings.getS32("RenderShadowSplits");
RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO");
RenderShadowResolutionScale = gSavedSettings.getF32("RenderShadowResolutionScale");
@@ -1153,6 +1209,13 @@ void LLPipeline::releaseGLBuffers()
{
assertInitialized();
+ mBloomMap.release();
+
+ for (U32 i = 0; i < 2; i++)
+ {
+ mBloomBlur[i].release();
+ }
+
if (mNoiseMap)
{
LLImageGL::deleteTextures(1, &mNoiseMap);
@@ -1177,6 +1240,8 @@ void LLPipeline::releaseGLBuffers()
mSMAASearchMap = 0;
}
+ //mDummyRT.release();
+
releaseLUTBuffers();
mWaterDis.release();
@@ -1185,7 +1250,12 @@ void LLPipeline::releaseGLBuffers()
mWaterExclusionMask.release();
- mPostMap.release();
+/*
+ mPostPingMap.release();
+ mPostPongMap.release();
+*/
+ mPostMaps[0].release();
+ mPostMaps[1].release();
mFXAAMap.release();
@@ -1273,26 +1343,38 @@ void LLPipeline::releaseSpotShadowTargets()
void LLPipeline::createGLBuffers()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
- stop_glerror();
+ LOG_GLERROR("LLPipeline::createGLBuffers()");
assertInitialized();
- stop_glerror();
-
GLuint resX = gViewerWindow->getWorldViewWidthRaw();
GLuint resY = gViewerWindow->getWorldViewHeightRaw();
// allocate screen space glow buffers
const U32 glow_res = llmax(1, llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow")));
const bool glow_hdr = gSavedSettings.getBOOL("RenderGlowHDR");
- const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA;
+ static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0);
+
+ U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA8;
+ if(MPColorPrecision == 2) glow_color_fmt = GL_RGBA16F;
+
for (U32 i = 0; i < 3; i++)
{
mGlow[i].allocate(512, glow_res, glow_color_fmt);
}
+ mBloomMap.allocate(512, 256, glow_color_fmt);
+
+ for (U32 i = 0; i < 2; i++)
+ {
+ mBloomBlur[i].allocate(512, 256, glow_color_fmt);
+ }
+
allocateScreenBuffer(resX, resY);
- mRT->width = 0;
- mRT->height = 0;
+ // Do not zero out mRT dimensions here. allocateScreenBuffer() above
+ // already sets the correct dimensions. Zeroing them caused resizeShadowTexture()
+ // to fail if called immediately after createGLBuffers (e.g., post graphics change).
+ // mRT->width = 0;
+ // mRT->height = 0;
if (!mNoiseMap)
@@ -1311,7 +1393,7 @@ void LLPipeline::createGLBuffers()
LLImageGL::generateTextures(1, &mNoiseMap);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mNoiseMap);
- LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F, noiseRes, noiseRes, GL_RGB, GL_FLOAT, noise, false);
+ LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB8, noiseRes, noiseRes, GL_RGB, GL_UNSIGNED_INT, noise, false);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
@@ -1326,7 +1408,7 @@ void LLPipeline::createGLBuffers()
LLImageGL::generateTextures(1, &mTrueNoiseMap);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTrueNoiseMap);
- LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F, noiseRes, noiseRes, GL_RGB,GL_FLOAT, noise, false);
+ LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F, noiseRes, noiseRes, GL_RGB, GL_FLOAT, noise, false);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
@@ -1395,7 +1477,7 @@ void LLPipeline::createGLBuffers()
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB, raw_image->getWidth(),
raw_image->getHeight(), format, GL_UNSIGNED_BYTE, raw_image->getData(), false);
- stop_glerror();
+ LOG_GLERROR("LLPipeline::createGLBuffers after setManualImage");
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
@@ -1455,11 +1537,7 @@ void LLPipeline::createLUTBuffers()
}
U32 pix_format = GL_R16F;
-#if 0 && LL_DARWIN
- // Need to work around limited precision with 10.6.8 and older drivers
- //
- pix_format = GL_R32F;
-#endif
+
LLImageGL::generateTextures(1, &mLightFunc);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, pix_format, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false);
@@ -1472,7 +1550,7 @@ void LLPipeline::createLUTBuffers()
}
mPbrBrdfLut.allocate(512, 512, GL_RG16F);
- mPbrBrdfLut.bindTarget();
+ mPbrBrdfLut.bindTarget("mPbrBrdfLut", 1);
if (gDeferredGenBrdfLutProgram.isComplete())
{
@@ -1496,13 +1574,13 @@ void LLPipeline::createLUTBuffers()
mPbrBrdfLut.flush();
mExposureMap.allocate(1, 1, GL_R16F);
- mExposureMap.bindTarget();
+ mExposureMap.bindTarget("mExposureMap", 1);
glClearColor(1, 1, 1, 0);
mExposureMap.clear();
glClearColor(0, 0, 0, 0);
mExposureMap.flush();
- mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE);
+ mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_AUTO);
mLastExposure.allocate(1, 1, GL_R16F);
}
@@ -2527,7 +2605,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result)
gSky.mVOSkyp->mDrawable->setVisible(camera);
sCull->pushDrawable(gSky.mVOSkyp->mDrawable);
gSky.updateCull();
- stop_glerror();
+ LOG_GLERROR("LLPipeline::updateCull sky");
}
if (hasRenderType(LLPipeline::RENDER_TYPE_WL_SKY) &&
@@ -2537,6 +2615,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result)
{
gSky.mVOWLSkyp->mDrawable->setVisible(camera);
sCull->pushDrawable(gSky.mVOWLSkyp->mDrawable);
+ LOG_GLERROR("LLPipeline::updateCull pushDrawable");
}
}
@@ -2689,6 +2768,8 @@ void LLPipeline::doOcclusion(LLCamera& camera)
gGL.setColorMask(true, true);
}
+
+ LOG_GLERROR("LLPipeline::doOcclusion()");
}
bool LLPipeline::updateDrawableGeom(LLDrawable* drawablep)
@@ -2858,6 +2939,7 @@ void LLPipeline::updateGeom(F32 max_dtime)
}
updateMovedList(mMovedBridge);
+ LOG_GLERROR("LLPipeline::updateGeom()");
}
void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
@@ -3856,6 +3938,8 @@ void render_hud_elements()
}
gUIProgram.unbind();
+
+ LOG_GLERROR("LLPipeline::render_hud_elements()");
}
static inline void bindHighlightProgram(LLGLSLShader& program)
@@ -3960,6 +4044,8 @@ void LLPipeline::renderHighlights()
unbindHighlightProgram(gHighlightSpecularProgram);
}
}
+
+ LOG_GLERROR("LLPipeline::renderHighlights()");
}
//debug use
@@ -3969,6 +4055,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
{
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomDeferred");
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; //LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY);
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY);
LL_PROFILE_GPU_ZONE("renderGeomDeferred");
llassert(!sRenderingHUDs);
@@ -3997,6 +4084,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion && !LLGLSLShader::sProfileEnabled;
setupHWLights();
+ LOG_GLERROR("LLPipeline::renderGeomDeferred() setupHWLights");
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("deferred pools");
@@ -4085,7 +4173,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
}
}
iter1 = iter2;
- stop_glerror();
+ LOG_GLERROR("");
}
gGLLastMatrix = NULL;
@@ -4102,12 +4190,91 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
}
}
+// Render the geometry for the attached huds
+// This fixes the slow down due to attached huds
+void LLPipeline::renderGeomPostDeferredOnlyHud(LLCamera& camera)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
+ LL_PROFILE_GPU_ZONE("renderGeomPostDeferred");
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED);
+
+ U32 cur_type = 0;
+
+ LLGLEnable cull(GL_CULL_FACE);
+
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ gGL.setColorMask(true, false);
+
+ pool_set_t::iterator iter1 = mPools.begin();
+
+ while ( iter1 != mPools.end() )
+ {
+ LLDrawPool *poolp = *iter1;
+
+ cur_type = poolp->getType();
+
+ pool_set_t::iterator iter2 = iter1;
+ if (hasRenderType(poolp->getType()) && poolp->getNumPostDeferredPasses() > 0)
+ {
+ LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("deferred poolrender");
+
+ gGLLastMatrix = NULL;
+ gGL.loadMatrix(gGLModelView);
+
+ for( S32 i = 0; i < poolp->getNumPostDeferredPasses(); i++ )
+ {
+ LLVertexBuffer::unbind();
+ poolp->beginPostDeferredPass(i);
+ for (iter2 = iter1; iter2 != mPools.end(); iter2++)
+ {
+ LLDrawPool *p = *iter2;
+ if (p->getType() != cur_type)
+ {
+ break;
+ }
+
+ p->renderPostDeferred(i);
+ }
+ poolp->endPostDeferredPass(i);
+ LLVertexBuffer::unbind();
+
+ if (gDebugGL || gDebugPipeline)
+ {
+ LLGLState::checkStates(GL_FALSE);
+ }
+ }
+ }
+ else
+ {
+ // Skip all pools of this type
+ for (iter2 = iter1; iter2 != mPools.end(); iter2++)
+ {
+ LLDrawPool *p = *iter2;
+ if (p->getType() != cur_type)
+ {
+ break;
+ }
+ }
+ }
+ iter1 = iter2;
+ LOG_GLERROR("after pools");
+ }
+
+ gGLLastMatrix = NULL;
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.loadMatrix(gGLModelView);
+
+ LOG_GLERROR("LLPipeline::renderGeomPostDeferredOnlyHud()");
+}
+
+
// Render all of our geometry that's required after our deferred pass.
// This is gonna be stuff like alpha, water, etc.
void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
LL_PROFILE_GPU_ZONE("renderGeomPostDeferred");
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED);
if (gUseWireframe)
{
@@ -4136,8 +4303,11 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
// do water haze just before pre water alpha
U32 water_haze_pass = LLDrawPool::POOL_ALPHA_PRE_WATER;
+ if(!done_atmospherics)
+ {
calcNearbyLights(camera);
setupHWLights();
+ }
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.setColorMask(true, false);
@@ -4224,7 +4394,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
}
}
iter1 = iter2;
- stop_glerror();
+ LOG_GLERROR("after pools");
}
gGLLastMatrix = NULL;
@@ -4244,6 +4414,8 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
+
+ LOG_GLERROR("LLPipeline::renderGeomPostDeferred()");
}
void LLPipeline::renderGeomShadow(LLCamera& camera)
@@ -4303,11 +4475,12 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
}
}
iter1 = iter2;
- stop_glerror();
+ LOG_GLERROR("");
}
gGLLastMatrix = NULL;
gGL.loadMatrix(gGLModelView);
+ LOG_GLERROR("LLPipeline::renderGeomShadow()");
}
@@ -4336,9 +4509,9 @@ void LLPipeline::renderPhysicsDisplay()
gGL.flush();
gDebugProgram.bind();
- LLGLEnable(GL_POLYGON_OFFSET_LINE);
+ LLGLEnable polygon_offset_line(GL_POLYGON_OFFSET_LINE);
glPolygonOffset(3.f, 3.f);
- glLineWidth(3.f);
+ //glLineWidth(3.f);
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -4380,7 +4553,7 @@ void LLPipeline::renderPhysicsDisplay()
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
}
- glLineWidth(1.f);
+ //glLineWidth(1.f);
gDebugProgram.unbind();
}
@@ -4465,7 +4638,7 @@ void LLPipeline::renderDebug()
if ( pathfindingConsole->isRenderNavMesh() )
{
gGL.flush();
- glLineWidth(2.0f);
+ //glLineWidth(2.0f);
LLGLEnable cull(GL_CULL_FACE);
LLGLDisable blend(GL_BLEND);
@@ -4489,7 +4662,7 @@ void LLPipeline::renderDebug()
gGL.flush();
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
- glLineWidth(1.0f);
+ //glLineWidth(1.0f);
gGL.flush();
}
//User designated path
@@ -4545,7 +4718,6 @@ void LLPipeline::renderDebug()
LLGLDisable cull(i >= 2 ? GL_CULL_FACE : 0);
gGL.flush();
-
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
//get rid of some z-fighting
@@ -4605,11 +4777,11 @@ void LLPipeline::renderDebug()
gPathfindingProgram.uniform1f(sTint, 1.f);
gPathfindingProgram.uniform1f(sAlphaScale, 1.f);
- glLineWidth(gSavedSettings.getF32("PathfindingLineWidth"));
+ //glLineWidth(gSavedSettings.getF32("PathfindingLineWidth"));
LLGLDisable blendOut(GL_BLEND);
llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] );
gGL.flush();
- glLineWidth(1.f);
+ //glLineWidth(1.f);
}
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
@@ -4632,7 +4804,7 @@ void LLPipeline::renderDebug()
LLGLEnable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
gGL.flush();
- glLineWidth(2.0f);
+ //glLineWidth(2.0f);
LLGLEnable cull(GL_CULL_FACE);
gPathfindingProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint"));
@@ -4659,7 +4831,7 @@ void LLPipeline::renderDebug()
gPathfindingProgram.bind();
gGL.flush();
- glLineWidth(1.0f);
+ //glLineWidth(1.0f);
}
glPolygonOffset(0.f, 0.f);
@@ -4796,12 +4968,11 @@ void LLPipeline::renderDebug()
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("probe debug display");
bindDeferredShader(gReflectionProbeDisplayProgram, NULL);
- mScreenTriangleVB->setBuffer();
LLGLEnable blend(GL_BLEND);
LLGLDepthTest depth(GL_FALSE);
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
unbindDeferredShader(gReflectionProbeDisplayProgram);
}
@@ -5752,6 +5923,8 @@ void LLPipeline::setupHWLights()
mSunDiffuse.setVec(psky->getSunlightColor());
mMoonDiffuse.setVec(psky->getMoonlightColor());
+ if(!mHDRDisplay)
+ {
F32 max_color = llmax(mSunDiffuse.mV[0], mSunDiffuse.mV[1], mSunDiffuse.mV[2]);
if (max_color > 1.f)
{
@@ -5765,6 +5938,7 @@ void LLPipeline::setupHWLights()
mMoonDiffuse *= 1.f/max_color;
}
mMoonDiffuse.clamp();
+ }
// prevent underlighting from having neither lightsource facing us
if (!sun_up && !moon_up)
@@ -6790,6 +6964,8 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
facep->clearVertexBuffer();
}
}
+
+ LOG_GLERROR("LLPipeline::resetVertexBuffers()");
}
void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool rigged)
@@ -6809,6 +6985,7 @@ void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
+ LOG_GLERROR("LLPipeline::renderObjects()");
}
void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged)
@@ -6837,6 +7014,7 @@ void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged)
{
LL::GLTFSceneManager::instance().render(true, true);
}
+ LOG_GLERROR("LLPipeline::renderGLTFObjects()");
}
// Currently only used for shadows -Cosmic,2023-04-19
@@ -6917,6 +7095,7 @@ void LLPipeline::renderAlphaObjects(bool rigged)
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
+ LOG_GLERROR("LLPipeline::renderAlphaObjects()");
}
// Currently only used for shadows -Cosmic,2023-04-19
@@ -6935,6 +7114,7 @@ void LLPipeline::renderMaskedObjects(U32 type, bool texture, bool batch_texture,
}
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
+ LOG_GLERROR("LLPipeline::renderMaskedObjects()");
}
// Currently only used for shadows -Cosmic,2023-04-19
@@ -6953,6 +7133,7 @@ void LLPipeline::renderFullbrightMaskedObjects(U32 type, bool texture, bool batc
}
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
+ LOG_GLERROR("LLPipeline::renderFullbrightMaskedObjects()");
}
void apply_cube_face_rotation(U32 face)
@@ -7015,13 +7196,13 @@ void LLPipeline::bindScreenToTexture()
}
-static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom");
+static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Post processing");
void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex)
{
- dst->bindTarget();
+ dst->bindTarget("visualizeBuffers", 1);
gDeferredBufferVisualProgram.bind();
- gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_BILINEAR, bufferIndex);
+ gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT, bufferIndex);
static LLStaticHashedString mipLevel("mipLevel");
if (RenderBufferVisualization != 4)
@@ -7029,8 +7210,7 @@ void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32
else
gDeferredBufferVisualProgram.uniform1f(mipLevel, 8);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
gDeferredBufferVisualProgram.unbind();
dst->flush();
}
@@ -7041,7 +7221,8 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst)
{
LL_PROFILE_GPU_ZONE("luminance sample");
- dst->bindTarget();
+ dst->bindTarget("generateLuminance", 0);
+ dst->clear();
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
@@ -7072,14 +7253,18 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst)
static LLStaticHashedString diffuse_luminance_scale_s("diffuse_luminance_scale");
gLuminanceProgram.uniform1f(diffuse_luminance_scale_s, diffuse_luminance_scale);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
+
+ gLuminanceProgram.unbind();
+
dst->flush();
// note -- unbind AFTER the glGenerateMipMap so time in generatemipmap can be profiled under "Luminance"
// also note -- keep an eye on the performance of glGenerateMipmap, might need to replace it with a mip generation shader
- gLuminanceProgram.unbind();
+ //gLuminanceProgram.unbind();
}
+
+ LOG_GLERROR("LLPipeline::generateLuminance()");
}
void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history) {
@@ -7090,17 +7275,15 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool
if (use_history)
{
// copy last frame's exposure into mLastExposure
- mLastExposure.bindTarget();
+ mLastExposure.bindTarget("mLastExposure", 1);
gCopyProgram.bind();
gGL.getTexUnit(0)->bind(dst);
-
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-
+ renderTriangle();
mLastExposure.flush();
}
- dst->bindTarget();
+ dst->bindTarget("generateExposure", 1);
+ dst->clear();
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
@@ -7183,27 +7366,33 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool
shader->uniform4f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max, dynamic_exposure_speed_error);
shader->uniform4f(dynamic_exposure_params2, sky->getHDROffset(should_auto_adjust()), exp_min, exp_max, dynamic_exposure_speed_target);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
if (use_history)
{
gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage());
}
+
+ //shader->unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE);
+ //shader->unbindTexture(LLShaderMgr::EXPOSURE_MAP);
shader->unbind();
dst->flush();
}
+
+ LOG_GLERROR("LLPipeline::generateExposure()");
}
extern LLPointer<LLImageGL> gEXRImage;
-void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
+void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst, bool gamma_correct)
{
- dst->bindTarget();
+/*
+ LL_PROFILE_GPU_ZONE("tonemap");
+*/
+
+ dst->bindTarget("tonemap", 1);
// gamma correct lighting
{
- LL_PROFILE_GPU_ZONE("tonemap");
-
static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false);
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
@@ -7215,17 +7404,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;
+ //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);
@@ -7235,29 +7440,42 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
static LLStaticHashedString tonemap_mix("tonemap_mix");
static LLStaticHashedString tonemap_type("tonemap_type");
- shader.uniform1f(s_exposure, e);
+ shader->uniform1f(s_exposure, e);
static LLCachedControl<U32> tonemap_type_setting(gSavedSettings, "RenderTonemapType", 0U);
- shader.uniform1i(tonemap_type, tonemap_type_setting);
- shader.uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust()));
+ shader->uniform1i(tonemap_type, tonemap_type_setting);
+ shader->uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust()));
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
+/*
gGL.getTexUnit(channel)->unbind(src->getUsage());
- shader.unbind();
+*/
+ shader->unbind();
}
dst->flush();
+ LOG_GLERROR("LLPipeline::tonemap()");
}
void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst)
{
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+
+/*
+ LL_PROFILE_GPU_ZONE("gamma correct");
+
dst->bindTarget();
+*/
// gamma correct lighting
{
+/*
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+*/
+
LL_PROFILE_GPU_ZONE("gamma correct");
- LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ dst->bindTarget("gammaCorrect", 1);
+ dst->clear(GL_COLOR_BUFFER_BIT);
static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false);
static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", false);
@@ -7266,16 +7484,29 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst)
LLGLSLShader& shader = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f ? gLegacyPostGammaCorrectProgram :
gDeferredPostGammaCorrectProgram;
+ static LLCachedControl<F32> mp_hdr_gamma(gSavedSettings, "MPHDRGamma", false);
+ if(mHDRDisplay) shader = gHDRGammaCorrectProgram;
+
shader.bind();
shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
- shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight());
+ //screensize isn't a uniform in the shader, we comment out for now
+ //shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight());
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ if(mHDRDisplay)
+ {
+ shader.uniform1f(LLShaderMgr::GAMMA, (GLfloat)mp_hdr_gamma);
+ shader.uniform1f(LLShaderMgr::MP_HDR_BOOST, 1.0);
+ }
+ renderTriangle();
+
+ //shader.unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE);
shader.unbind();
+
+ dst->flush();
}
- dst->flush();
+
+ LOG_GLERROR("LLPipeline::gammaCorrect()");
}
void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst)
@@ -7288,7 +7519,7 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget*
LLRenderTarget& depth_src = mRT->deferredScreen;
- dst->bindTarget();
+ dst->bindTarget("copyScreenSpaceReflections", 1);
dst->clear();
gCopyDepthProgram.bind();
@@ -7298,19 +7529,25 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget*
gGL.getTexUnit(diff_map)->bind(src);
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
dst->flush();
}
+ LOG_GLERROR("LLPipeline::copyScreenSpaceReflection()");
}
void LLPipeline::generateGlow(LLRenderTarget* src)
{
+ LL_PROFILE_GPU_ZONE("glow generate");
if (sRenderGlow)
{
LL_PROFILE_GPU_ZONE("glow");
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_GLOW);
+
+/*
mGlow[2].bindTarget();
+*/
+ mGlow[2].bindTarget("mGlow[2]", 1);
mGlow[2].clear();
gGlowExtractProgram.bind();
@@ -7350,14 +7587,13 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
gGL.color4f(1, 1, 1, 1);
gPipeline.enableLightsFullbright();
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-
+ renderTriangle();
+ //gGlowExtractProgram.unbindTexture(LLShaderMgr::DIFFUSE_MAP);
+ gGlowExtractProgram.unbindTexture(LLShaderMgr::GLOW_NOISE_MAP);
+ gGlowExtractProgram.unbind();
mGlow[2].flush();
}
- gGlowExtractProgram.unbind();
-
// power of two between 1 and 1024
U32 glowResPow = RenderGlowResolutionPow;
const U32 glow_res = llmax(1, llmin(1024, 1 << glowResPow));
@@ -7377,7 +7613,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
for (S32 i = 0; i < kernel; i++)
{
- mGlow[i % 2].bindTarget();
+ mGlow[i % 2].bindTarget("mGlow[i % 2]", 1);
mGlow[i % 2].clear();
if (i == 0)
@@ -7398,8 +7634,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta);
}
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
mGlow[i % 2].flush();
}
@@ -7409,25 +7644,32 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
}
else // !sRenderGlow, skip the glow ping-pong and just clear the result target
{
- mGlow[1].bindTarget();
+ mGlow[1].bindTarget("mGlow[1]", 1);
mGlow[1].clear();
mGlow[1].flush();
}
+ LOG_GLERROR("LLPipeline::generateGlow()");
}
-void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
+bool LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
{
- static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f);
- if (cas_sharpness == 0.0f || !gCASProgram.isComplete())
- {
- gPipeline.copyRenderTarget(src, dst);
- return;
- }
+ LL_PROFILE_GPU_ZONE("cas");
+
+ static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.0f);
LLGLSLShader* sharpen_shader = &gCASProgram;
+ static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", false);
+
+ LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+ bool legacy_gamma = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f;
+ if(legacy_gamma)
+ {
+ sharpen_shader = &gCASLegacyGammaProgram;
+ }
// Bind setup:
- dst->bindTarget();
+ dst->bindTarget("applyCAS", 1);
+ dst->clear();
sharpen_shader->bind();
@@ -7449,32 +7691,67 @@ void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
sharpen_shader->uniform2f(out_screen_res, (AF1)dst->getWidth(), (AF1)dst->getHeight());
}
- sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
-
- // Draw
- gPipeline.mScreenTriangleVB->setBuffer();
- gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-
+ S32 channel = sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
+ renderTriangle();
+ //sharpen_shader->unbindTexture(channel);
sharpen_shader->unbind();
dst->flush();
+
+ return true;
+}
+
+bool LLPipeline::generateFXAABuffer(LLRenderTarget* src)
+{
+ llassert(!gCubeSnapshot);
+ bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete();
+
+ if(!multisample) return false;
+
+ LL_PROFILE_GPU_ZONE("aa");
+
+ // bake out texture2D with RGBL for FXAA shader
+ mFXAAMap.bindTarget("applyFXAA", 1);
+ mFXAAMap.clear(GL_COLOR_BUFFER_BIT);
+
+ LLGLSLShader* shader = &gGlowCombineFXAAProgram;
+ shader->bind();
+
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
+ if (channel > -1)
+ {
+ src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
+ }
+
+ {
+ LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
+ renderTriangle();
+ }
+
+ //shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
+ shader->unbind();
+
+ mFXAAMap.flush();
+
+ return true;
}
-void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
+bool LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
{
+ LL_PROFILE_GPU_ZONE("FXAA");
{
llassert(!gCubeSnapshot);
bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete();
- // Present everything.
- if (multisample)
+ if(!multisample) return false;
+
{
LL_PROFILE_GPU_ZONE("aa");
S32 width = dst->getWidth();
S32 height = dst->getHeight();
// bake out texture2D with RGBL for FXAA shader
- mFXAAMap.bindTarget();
+ mFXAAMap.bindTarget("applyFXAA", 1);
mFXAAMap.clear(GL_COLOR_BUFFER_BIT);
LLGLSLShader* shader = &gGlowCombineFXAAProgram;
@@ -7488,8 +7765,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
{
LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
@@ -7497,7 +7773,8 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
mFXAAMap.flush();
- dst->bindTarget();
+ dst->bindTarget("applyFXAA", 1);
+ dst->clear();
static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
@@ -7511,12 +7788,14 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
}
+ /*
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+ */
F32 scale_x = (F32)width / mFXAAMap.getWidth();
F32 scale_y = (F32)height / mFXAAMap.getHeight();
@@ -7532,29 +7811,34 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
S32 depth_channel = shader->getTextureChannel(LLShaderMgr::DEFERRED_DEPTH);
gGL.getTexUnit(depth_channel)->bind(&mRT->deferredScreen, true);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
+ }
+
+ if (channel > -1)
+ {
+ shader->unbindTexture(channel);
}
shader->unbind();
dst->flush();
}
- else {
- copyRenderTarget(src, dst);
- }
}
+
+ return true;
}
-void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
+bool LLPipeline::generateSMAABuffers(LLRenderTarget* src)
{
llassert(!gCubeSnapshot);
- if(RenderFSAAType < 2) return;
+ if(RenderFSAAType < 2) return false;
bool multisample = gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();
+ if(!multisample) return false;
+
// Present everything.
if (multisample)
{
- LL_PROFILE_GPU_ZONE("aa");
+ LL_PROFILE_GPU_ZONE("SMAA Edge");
static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
@@ -7574,50 +7858,44 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
LLRenderTarget& dest = mFXAAMap;
LLGLSLShader& edge_shader = gSMAAEdgeDetectProgram[fsaa_quality];
- dest.bindTarget();
+ dest.bindTarget("generateSMAABuffers", 1);
dest.clear(GL_COLOR_BUFFER_BIT);
edge_shader.bind();
edge_shader.uniform4fv(sSmaaRTMetrics, 1, rt_metrics);
- S32 channel = edge_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
+ S32 channel = edge_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE);
+
if (channel > -1)
{
if (!use_sample)
{
- src->bindTexture(0, channel, LLTexUnit::TFO_POINT);
+ src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
else
{
gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap);
gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
}
+ gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
- //if (use_stencil)
- //{
- // glStencilFunc(GL_ALWAYS, 1, 0xFF);
- // glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
- // glStencilMask(0xFF);
- //}
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
+ edge_shader.unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE);
+ gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE);
edge_shader.unbind();
dest.flush();
-
- gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE);
}
{
- //LLGLState stencil(GL_STENCIL_TEST, use_stencil);
-
// Bind setup:
LLRenderTarget& dest = mSMAABlendBuffer;
LLGLSLShader& blend_weights_shader = gSMAABlendWeightsProgram[fsaa_quality];
- dest.bindTarget();
+ dest.bindTarget("mSMAABlendBuffer", 1);
dest.clear(GL_COLOR_BUFFER_BIT);
blend_weights_shader.bind();
@@ -7644,17 +7922,8 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
gGL.getTexUnit(search_tex_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
- //if (use_stencil)
- //{
- // glStencilFunc(GL_EQUAL, 1, 0xFF);
- // glStencilMask(0x00);
- //}
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
- //if (use_stencil)
- //{
- // glStencilFunc(GL_ALWAYS, 0, 0xFF);
- //}
+ renderTriangle();
+
blend_weights_shader.unbind();
dest.flush();
gGL.getTexUnit(edge_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
@@ -7662,10 +7931,15 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
gGL.getTexUnit(search_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
}
}
+
+ LOG_GLERROR("LLPipeline::generateSMAABuffers()");
+
+ return true;
}
-void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
+bool LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
{
+ LL_PROFILE_GPU_ZONE("SMAA");
llassert(!gCubeSnapshot);
bool multisample = false;
@@ -7675,10 +7949,9 @@ void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
multisample = gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();
}
- // Present everything.
- if (multisample)
+ if(!multisample) return false;
+
{
- LL_PROFILE_GPU_ZONE("aa");
static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
@@ -7690,16 +7963,13 @@ void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
static LLCachedControl<bool> use_sample(gSavedSettings, "RenderSMAAUseSample", false);
- //static LLCachedControl<bool> use_stencil(gSavedSettings, "RenderSMAAUseStencil", true);
{
- //LLGLDisable stencil(GL_STENCIL_TEST);
-
// Bind setup:
LLRenderTarget* bound_target = dst;
LLGLSLShader& blend_shader = gSMAANeighborhoodBlendProgram[fsaa_quality];
- bound_target->bindTarget();
+ bound_target->bindTarget("applySMAA", 1);
bound_target->clear(GL_COLOR_BUFFER_BIT);
blend_shader.bind();
@@ -7718,36 +7988,30 @@ void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
mSMAABlendBuffer.bindTexture(0, blend_channel, LLTexUnit::TFO_BILINEAR);
}
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-
- bound_target->flush();
- blend_shader.unbind();
+ renderTriangle();
gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(blend_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
+ blend_shader.unbind();
+ bound_target->flush();
}
}
- else
- {
- copyRenderTarget(src, dst);
- }
+
+ LOG_GLERROR("LLPipeline::applySMAA()");
+ return true;
}
void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst)
{
LL_PROFILE_GPU_ZONE("copyRenderTarget");
- dst->bindTarget();
-
+ dst->bindTarget("copyRenderTarget", 1);
+ dst->clear(GL_COLOR_BUFFER_BIT);
gDeferredPostNoDoFProgram.bind();
gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src);
- gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
+ //gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
- {
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
- }
+ renderTriangle();
gDeferredPostNoDoFProgram.unbind();
@@ -7756,9 +8020,13 @@ void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst)
void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)
{
- // Go ahead and do our glow combine here in our destination. We blit this later into the front buffer.
+ LL_PROFILE_GPU_ZONE("glow combine");
+/*
+ // Go ahead and do our glow combine here in our destination. We blit this later into the front buffer.
dst->bindTarget();
+*/
+ dst->bindTarget("combineGlow", 1);
{
@@ -7767,26 +8035,28 @@ void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)
gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src);
gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
dst->flush();
+ LOG_GLERROR("LLPipeline::combineGlow()");
}
-void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
+bool LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
{
+ LL_PROFILE_GPU_ZONE("dof");
{
bool dof_enabled =
(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
RenderDepthOfField &&
!gCubeSnapshot;
+ if(!dof_enabled) return false;
+
gViewerWindow->setup3DViewport();
if (dof_enabled)
{
- LL_PROFILE_GPU_ZONE("dof");
LLGLDisable blend(GL_BLEND);
// depth of field focal plane calculations
@@ -7890,7 +8160,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
F32 magnification = focal_length / (subject_distance - focal_length);
{ // build diffuse+bloom+CoF
- mRT->deferredLight.bindTarget();
+ mRT->deferredLight.bindTarget("renderDOF", 1);
gDeferredCoFProgram.bind();
@@ -7907,8 +8177,8 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
+
gDeferredCoFProgram.unbind();
mRT->deferredLight.flush();
}
@@ -7917,7 +8187,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
U32 dof_height = (U32)(mRT->screen.getHeight() * CameraDoFResScale);
{ // perform DoF sampling at half-res (preserve alpha channel)
- src->bindTarget();
+ src->bindTarget("DoF sampling", 1);
glViewport(0, 0, dof_width, dof_height);
gGL.setColorMask(true, false);
@@ -7929,8 +8199,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
gDeferredPostProgram.unbind();
@@ -7940,7 +8209,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
{ // combine result based on alpha
- dst->bindTarget();
+ dst->bindTarget("DoF combine", 1);
glViewport(0, 0, dst->getWidth(), dst->getHeight());
gDeferredDoFCombineProgram.bind();
@@ -7953,19 +8222,134 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth());
gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_HEIGHT, (dof_height - 1) / (F32)src->getHeight());
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
- gDeferredDoFCombineProgram.unbind();
+ renderTriangle();
+ gDeferredDoFCombineProgram.unbind();
dst->flush();
}
}
- else
- {
- copyRenderTarget(src, dst);
- }
}
+
+ return true;
+}
+
+bool LLPipeline::renderBloom(LLRenderTarget* src, LLRenderTarget* dst)
+{
+ static LLCachedControl<U32> mp_render_bloom(gSavedSettings, "MPRenderBloom", 0);
+
+ if(mp_render_bloom < 1) return false;
+
+ static LLCachedControl<F32> mp_bloom_extract_brightness(gSavedSettings, "MPBloomExtractBrightness", 0.10);
+ static LLCachedControl<F32> mp_bloom_radius(gSavedSettings, "MPBloomBlurRadius", 1.5);
+ static LLCachedControl<F32> mp_bloom_radius_add(gSavedSettings, "MPBloomBlurRadiusAdd", 0);
+ static LLCachedControl<F32> mp_bloom_strength(gSavedSettings, "MPBloomStrength", 1.0);
+ static LLCachedControl<F32> mp_bloom_metal(gSavedSettings, "MPBloomExtractMetal", 0.2);
+ static LLCachedControl<F32> mp_bloom_nonmetal(gSavedSettings, "MPBloomExtractNonMetal", 0.2);
+
+ F32 clampValue = 1.0;
+ if(mHDRDisplay) clampValue = 11.0;
+
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDisable blend(GL_BLEND);
+
+ mBloomMap.bindTarget("mBloomMap", 1);
+
+ glClearColor(0, 0, 0, 0);
+ mBloomMap.clear();
+
+ gBloomExtractProgram.bind();
+ gBloomExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, &mRT->screen);
+ gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 1);
+ //gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE, &mGlow[1], false, LLTexUnit::TFO_POINT, 0);
+ gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 3);
+
+ gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_BRIGHTNESS, 1.0 - mp_bloom_extract_brightness);
+ gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_METAL, mp_bloom_metal);
+ gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_NONMETAL, mp_bloom_nonmetal);
+
+ renderTriangle();
+
+ gBloomExtractProgram.unbindTexture(LLShaderMgr::DIFFUSE_MAP);
+ gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM);
+ gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE);
+ gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2);
+
+ gBloomExtractProgram.unbind();
+ mBloomMap.flush();
+
+
+ // ping pong blur
+
+ S16 horizontal = 1, first_iteration = true;
+ unsigned int amount = mp_render_bloom;
+ if(amount > 10) amount = 10;
+
+ F32 radius = mp_bloom_radius;
+
+ gBloomBlurProgram.bind();
+
+
+ // Iteration 0
+
+ gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius);
+
+ mBloomBlur[0].bindTarget("", 1);
+ //mBloomBlur[0].clear();
+ gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0);
+ gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomMap);
+ renderTriangle();
+ mBloomBlur[0].flush();
+
+ mBloomBlur[1].bindTarget("", 1);
+ gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1);
+ gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]);
+ renderTriangle();
+ mBloomBlur[1].flush();
+
+
+ // additional iterations
+
+ for (unsigned int i = 1; i < amount; i++)
+ {
+ radius += mp_bloom_radius_add;
+ gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius);
+
+ mBloomBlur[0].bindTarget("", 1);
+ gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0);
+ gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[1]);
+ renderTriangle();
+ mBloomBlur[0].flush();
+
+ mBloomBlur[1].bindTarget("", 1);
+ gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1);
+ gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]);
+ renderTriangle();
+ mBloomBlur[1].flush();
+ }
+
+ gBloomBlurProgram.unbindTexture(LLShaderMgr::BLOOM_EMAP);
+ gBloomBlurProgram.unbind();
+
+
+ // combine
+
+ dst->bindTarget("bloom combine", 1);
+ //dst->clear();
+
+ gBloomCombineProgram.bind();
+
+ gBloomCombineProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, src);
+ gBloomCombineProgram.bindTexture(LLShaderMgr::BLOOM_BMAP, &mBloomBlur[1]);
+ gBloomCombineProgram.uniform1f(LLShaderMgr::BLOOM_STRENGTH, mp_bloom_strength);
+ gBloomCombineProgram.uniform1f(LLShaderMgr::BLOOM_CLAMP, clampValue);
+
+ renderTriangle();
+
+ gBloomCombineProgram.unbind();
+ dst->flush();
+
+ return true;
}
void LLPipeline::renderFinalize()
@@ -7984,38 +8368,55 @@ void LLPipeline::renderFinalize()
LLGLDisable blend(GL_BLEND);
LLGLDisable cull(GL_CULL_FACE);
- enableLightsFullbright();
-
gGL.setColorMask(true, true);
glClearColor(0, 0, 0, 0);
static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);
bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr();
- if (hdr)
+ bool apply_cas = false;
+ static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.0f);
+ if (cas_sharpness > 0.0f && gCASProgram.isComplete() && gCASLegacyGammaProgram.isComplete() && !mHDRDisplay) apply_cas = true;
+
+ U16 activeRT = 0;
+
+ if (hdr && !mHDRDisplay)
{
copyScreenSpaceReflections(&mRT->screen, &mSceneMap);
generateLuminance(&mRT->screen, &mLuminanceMap);
-
generateExposure(&mLuminanceMap, &mExposureMap);
- tonemap(&mRT->screen, &mPostMap);
-
- applyCAS(&mPostMap, &mRT->screen);
+ if (apply_cas)
+ {
+ tonemap(&mRT->screen, &mRT->deferredLight, false);
+ applyCAS(&mRT->deferredLight, &mPostMaps[activeRT]);
+ }
+ else
+ {
+ tonemap(&mRT->screen, &mPostMaps[activeRT], true);
+ }
+ }
+ else
+ {
+ if(mHDRDisplay) copyScreenSpaceReflections(&mRT->screen, &mSceneMap);
+ gammaCorrect(&mRT->screen, &mPostMaps[activeRT]);
}
+ generateFXAABuffer(&mRT->screen);
generateSMAABuffers(&mRT->screen);
- gammaCorrect(&mRT->screen, &mPostMap);
+ generateGlow(&mPostMaps[activeRT]);
- LLVertexBuffer::unbind();
-
- applySMAA(&mPostMap, &mRT->screen);
-
- generateGlow(&mRT->screen);
+ if(hdr)
+ {
+ if(renderBloom(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
+ {
+ activeRT = 1 - activeRT;
+ }
+ }
- combineGlow(&mRT->screen, &mPostMap);
+ LLVertexBuffer::unbind();
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
@@ -8023,15 +8424,25 @@ void LLPipeline::renderFinalize()
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
- renderDoF(&mPostMap, &mRT->screen);
+ combineGlow(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]);
+ activeRT = 1 - activeRT;
- LLRenderTarget* finalBuffer = &mRT->screen;
- if (RenderFSAAType == 1)
+ if(renderDoF(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
{
- applyFXAA(&mRT->screen, &mPostMap);
- finalBuffer = &mPostMap;
+ activeRT = 1 - activeRT;
}
+ if(applyFXAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
+ {
+ activeRT = 1 - activeRT;
+ }
+ else if(applySMAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
+ {
+ activeRT = 1 - activeRT;
+ }
+
+ LLRenderTarget* finalBuffer = &mPostMaps[activeRT];
+
if (RenderBufferVisualization > -1)
{
switch (RenderBufferVisualization)
@@ -8061,6 +8472,36 @@ void LLPipeline::renderFinalize()
}
break;
}
+ case 7:
+ visualizeBuffers(&mBloomMap, finalBuffer, 0);
+ break;
+ case 8:
+ visualizeBuffers(&mBloomBlur[1], finalBuffer, 0);
+ break;
+ case 9:
+ visualizeBuffers(&mPostMaps[activeRT], finalBuffer, 0);
+ break;
+ case 10:
+ visualizeBuffers(&mGlow[0], finalBuffer, 0);
+ break;
+ case 11:
+ visualizeBuffers(&mGlow[1], finalBuffer, 0);
+ break;
+ case 12:
+ visualizeBuffers(&mGlow[2], finalBuffer, 0);
+ break;
+ case 13:
+ visualizeBuffers(&mSceneMap, finalBuffer, 0);
+ break;
+ case 14:
+ visualizeBuffers(&mRT->screen, finalBuffer, 0);
+ break;
+ case 15:
+ visualizeBuffers(&mRT->deferredLight, finalBuffer, 0);
+ break;
+ case 16:
+ visualizeBuffers(&mPostMaps[1-activeRT], finalBuffer, 0);
+ break;
default:
break;
}
@@ -8078,12 +8519,15 @@ void LLPipeline::renderFinalize()
{
LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
+ gDeferredPostNoDoFNoiseProgram.unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE);
+ gDeferredPostNoDoFNoiseProgram.unbindTexture(LLShaderMgr::DEFERRED_DEPTH);
gDeferredPostNoDoFNoiseProgram.unbind();
+ //gGL.flush();
+
gGL.setSceneBlendType(LLRender::BT_ALPHA);
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
@@ -8104,6 +8548,7 @@ void LLPipeline::renderFinalize()
// flush calls made to "addTrianglesDrawn" so far to stats machinery
recordTrianglesDrawn();
+ LOG_GLERROR("LLPipeline::renderFinalize()");
}
void LLPipeline::bindLightFunc(LLGLSLShader& shader)
@@ -8123,6 +8568,8 @@ void LLPipeline::bindLightFunc(LLGLSLShader& shader)
void LLPipeline::bindShadowMaps(LLGLSLShader& shader)
{
+ LOG_GLERROR("bindShadowMaps() 1");
+
for (U32 i = 0; i < 4; i++)
{
LLRenderTarget* shadow_target = getSunShadowTarget(i);
@@ -8136,15 +8583,20 @@ void LLPipeline::bindShadowMaps(LLGLSLShader& shader)
}
}
- for (U32 i = 4; i < 6; i++)
+ LOG_GLERROR("bindShadowMaps() 2");
+
+ if(RenderShadowDetail > 1)
{
- S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0 + i);
- if (channel > -1)
+ for (U32 i = 4; i < 6; i++)
{
- LLRenderTarget* shadow_target = getSpotShadowTarget(i - 4);
- if (shadow_target)
+ S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0 + i);
+ if (channel > -1)
{
- gGL.getTexUnit(channel)->bind(shadow_target, true);
+ LLRenderTarget* shadow_target = getSpotShadowTarget(i - 4);
+ if (shadow_target)
+ {
+ gGL.getTexUnit(channel)->bind(shadow_target, true);
+ }
}
}
}
@@ -8244,7 +8696,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
bindLightFunc(shader);
- stop_glerror();
+ LOG_GLERROR("bindDeferredShader()");
light_target = light_target ? light_target : deferred_light_target;
channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, light_target->getUsage());
@@ -8260,11 +8712,11 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
}
}
- stop_glerror();
+ LOG_GLERROR("bindDeferredShader() 2");
bindShadowMaps(shader);
- stop_glerror();
+ LOG_GLERROR("bindDeferredShader() 3");
F32 mat[16*6];
for (U32 i = 0; i < 16; i++)
@@ -8279,7 +8731,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_SHADOW_MATRIX, 6, false, mat);
- stop_glerror();
+ LOG_GLERROR("bindDeferredShader() 4");
if (!LLPipeline::sReflectionProbesEnabled)
{
@@ -8433,6 +8885,8 @@ void LLPipeline::renderDeferredLighting()
return;
}
+ LOG_GLERROR("renderDeferredLighting begin");
+
llassert(!sRenderingHUDs);
F32 light_scale = 1.f;
@@ -8474,10 +8928,10 @@ void LLPipeline::renderDeferredLighting()
tc_moon = mat * tc_moon;
mTransformedMoonDir.set(tc_moon);
- if ((RenderDeferredSSAO && !gCubeSnapshot) || RenderShadowDetail > 0)
+ if ((RenderDeferredSSAO && !gCubeSnapshot) || (!gCubeSnapshot && RenderShadowDetail > 0 && RenderShadowDetail < 4))
{
LL_PROFILE_GPU_ZONE("sun program");
- deferred_light_target->bindTarget();
+ deferred_light_target->bindTarget("sun_shader", 1);
{ // paint shadow/SSAO light map (direct lighting lightmap)
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - sun shadow");
@@ -8509,7 +8963,7 @@ void LLPipeline::renderDeferredLighting()
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - soften shadow");
LL_PROFILE_GPU_ZONE("soften shadow");
// blur lightmap
- screen_target->bindTarget();
+ screen_target->bindTarget("SSAO", 1);
glClearColor(1, 1, 1, 1);
screen_target->clear(GL_COLOR_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
@@ -8542,8 +8996,7 @@ void LLPipeline::renderDeferredLighting()
{
LLGLDisable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
screen_target->flush();
@@ -8551,21 +9004,20 @@ void LLPipeline::renderDeferredLighting()
bindDeferredShader(gDeferredBlurLightProgram, screen_target);
- deferred_light_target->bindTarget();
+ deferred_light_target->bindTarget("blur light", 1);
gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f);
{
LLGLDisable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
deferred_light_target->flush();
unbindDeferredShader(gDeferredBlurLightProgram);
}
- screen_target->bindTarget();
+ screen_target->bindTarget("renderDeferredLighting screen_target", 1);
// clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
glClearColor(0, 0, 0, 0);
screen_target->clear(GL_COLOR_BUFFER_BIT);
@@ -8598,8 +9050,7 @@ void LLPipeline::renderDeferredLighting()
LLGLDisable blend(GL_BLEND);
// full screen blit
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
unbindDeferredShader(gDeferredSoftenProgram);
@@ -8815,8 +9266,7 @@ void LLPipeline::renderDeferredLighting()
gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0);
far_z = 0.f;
count = 0;
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
unbindDeferredShader(gDeferredMultiLightProgram[idx]);
}
}
@@ -8852,6 +9302,9 @@ void LLPipeline::renderDeferredLighting()
gDeferredMultiSpotLightProgram.uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0);
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ /*
+ gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ */
}
gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
@@ -8914,11 +9367,14 @@ void LLPipeline::renderDeferredLighting()
}
}
gGL.setColorMask(true, true);
+
+ LOG_GLERROR("renderDeferredLighting end");
}
void LLPipeline::doAtmospherics()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
+ LOG_GLERROR("doAtmospherics begin");
if (sImpostorRender)
{ // do not attempt atmospherics on impostors
@@ -8936,7 +9392,7 @@ void LLPipeline::doAtmospherics()
LLRenderTarget& dst = gPipeline.mWaterDis;
mRT->screen.flush();
- dst.bindTarget();
+ dst.bindTarget("doAtmospherics dst", 1);
gCopyDepthProgram.bind();
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
@@ -8946,11 +9402,10 @@ void LLPipeline::doAtmospherics()
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
gGL.setColorMask(false, false);
- gPipeline.mScreenTriangleVB->setBuffer();
- gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
dst.flush();
- mRT->screen.bindTarget();
+ mRT->screen.bindTarget("atmospherics", 1);
}
LLGLEnable blend(GL_BLEND);
@@ -8972,13 +9427,14 @@ void LLPipeline::doAtmospherics()
LLGLDepthTest depth(GL_FALSE);
// full screen blit
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
unbindDeferredShader(haze_shader);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
+
+ LOG_GLERROR("doAtmospherics end");
}
void LLPipeline::doWaterHaze()
@@ -9000,7 +9456,7 @@ void LLPipeline::doWaterHaze()
LLRenderTarget& dst = gPipeline.mWaterDis;
mRT->screen.flush();
- dst.bindTarget();
+ dst.bindTarget("water haze copy depth", 1);
gCopyDepthProgram.bind();
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
@@ -9010,11 +9466,10 @@ void LLPipeline::doWaterHaze()
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
gGL.setColorMask(false, false);
- gPipeline.mScreenTriangleVB->setBuffer();
- gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
dst.flush();
- mRT->screen.bindTarget();
+ mRT->screen.bindTarget("water haze", 1);
}
LLGLEnable blend(GL_BLEND);
@@ -9040,8 +9495,7 @@ void LLPipeline::doWaterHaze()
LLGLDepthTest depth(GL_FALSE);
// full screen blit
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
else
{
@@ -9063,11 +9517,13 @@ void LLPipeline::doWaterHaze()
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
+
+ LOG_GLERROR("after doWaterHaze()");
}
void LLPipeline::doWaterExclusionMask()
{
- mWaterExclusionMask.bindTarget();
+ mWaterExclusionMask.bindTarget("", 1);
glClearColor(1, 1, 1, 1);
mWaterExclusionMask.clear();
mWaterExclusionPool->render();
@@ -9220,6 +9676,7 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
}
}
+ LOG_GLERROR("setupSpotLight() end");
}
void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
@@ -9227,7 +9684,7 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
LLRenderTarget* deferred_target = &mRT->deferredScreen;
LLRenderTarget* deferred_light_target = &mRT->deferredLight;
- stop_glerror();
+ LOG_GLERROR("unbindDeferredShader() begin");
shader.disableTexture(LLShaderMgr::NORMAL_MAP, deferred_target->getUsage());
shader.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, deferred_target->getUsage());
shader.disableTexture(LLShaderMgr::DEFERRED_SPECULAR, deferred_target->getUsage());
@@ -9276,6 +9733,8 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->activate();
shader.unbind();
+
+ LOG_GLERROR("unbindDeferredShader() end");
}
void LLPipeline::setEnvMat(LLGLSLShader& shader)
@@ -9298,7 +9757,6 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader)
S32 channel = shader.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
bool bound = false;
-
if (channel > -1 && mReflectionMapManager.mTexture.notNull())
{
mReflectionMapManager.mTexture->bind(channel);
@@ -9331,6 +9789,11 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader)
}
// reflection probe shaders generally sample the scene map as well for SSR
+
+ //if(RenderScreenSpaceReflections)
+ //{
+ //LL_WARNS() << "binding SSR to reflection maps" << LL_ENDL;
+
channel = shader.enableTexture(LLShaderMgr::SCENE_MAP);
if (channel > -1)
{
@@ -9356,8 +9819,10 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader)
{
gGL.getTexUnit(channel)->bind(&mSceneMap, true);
}
+ //}
+ LOG_GLERROR("bindReflectionProbes() end");
}
void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader)
@@ -9371,6 +9836,8 @@ void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader)
gGL.getTexUnit(channel)->enable(LLTexUnit::TT_TEXTURE);
}
}
+
+ LOG_GLERROR("unbindReflectionProbes() end");
}
@@ -9429,11 +9896,13 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MASKED("Alpha Masked");
static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_BLEND("Alpha Blend");
static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_TREE("Alpha Tree");
static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_GRASS("Alpha Grass");
+static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MATERIAL("Alpha Material");
static LLTrace::BlockTimerStatHandle FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED("Fullbright Alpha Masked");
void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCamera& shadow_cam, LLCullResult& result, bool depth_clamp)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);
LL_PROFILE_GPU_ZONE("renderShadow");
LLPipeline::sShadowRender = true;
@@ -9467,11 +9936,12 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_LESS);
+ //static LLCachedControl<bool> sShadowAlternative(gSavedSettings, "MPShadowAlternative", false);
+
updateCull(shadow_cam, result);
stateSort(shadow_cam, result);
- //generate shadow map
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.loadMatrix(glm::value_ptr(proj));
@@ -9494,6 +9964,7 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
}
};
+
LLVertexBuffer::unbind();
for (int j = 0; j < 2; ++j) // 0 -- static, 1 -- rigged
{
@@ -9510,8 +9981,10 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
gGL.setColorMask(false, false);
}
- LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE);
+ LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple");
LL_PROFILE_GPU_ZONE("shadow simple");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE);
+
gGL.getTexUnit(0)->disable();
for (U32 type : types)
@@ -9532,13 +10005,15 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow geom");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_GEOM);
renderGeomShadow(shadow_cam);
}
- if(MPRenderShadowOpti < 3)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha");
LL_PROFILE_GPU_ZONE("shadow alpha");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA);
+
const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0;
U32 target_width = LLRenderTarget::sCurResX;
@@ -9549,6 +10024,7 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked");
LL_PROFILE_GPU_ZONE("shadow alpha masked");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MASKED);
gDeferredShadowAlphaMaskProgram.bind(rigged);
LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up);
LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width);
@@ -9558,12 +10034,15 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend");
LL_PROFILE_GPU_ZONE("shadow alpha blend");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_BLEND);
renderAlphaObjects(rigged);
}
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked");
LL_PROFILE_GPU_ZONE("shadow alpha masked");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED);
+
gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged);
LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up);
LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width);
@@ -9573,6 +10052,8 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass");
LL_PROFILE_GPU_ZONE("shadow alpha grass");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_GRASS);
+
gDeferredTreeShadowProgram.bind(rigged);
LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF);
@@ -9584,6 +10065,8 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha material");
LL_PROFILE_GPU_ZONE("shadow alpha material");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MATERIAL);
+
renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, true, false, rigged);
renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, true, false, rigged);
renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, true, false, rigged);
@@ -9866,16 +10349,24 @@ public:
void LLPipeline::generateSunShadow(LLCamera& camera)
{
- if (!sRenderDeferred || RenderShadowDetail <= 0 || (MPRenderShadowOpti > 0 && gCubeSnapshot))
+ if (!sRenderDeferred || RenderShadowDetail <= 0)
{
return;
}
+ if(gCubeSnapshot)
+ {
+ LL_WARNS() << "generateSunShadow() gCubeSnapshot" << LL_ENDL;
+ return;
+ }
+
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_GEN_SUN_SHADOW);
LL_PROFILE_GPU_ZONE("generateSunShadow");
LLDisableOcclusionCulling no_occlusion;
+ U32 splits = 4;
+
bool skip_avatar_update = false;
if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
{
@@ -9980,7 +10471,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLPlane shadow_near_clip;
{
LLVector3 p = camera.getOrigin(); // gAgent.getPositionAgent();
- p += caster_dir * RenderFarClip*2.f;
+ p += caster_dir * RenderFarClip*1.1f;
shadow_near_clip.setVec(p, caster_dir);
}
@@ -10053,30 +10544,38 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
update_min_max(min, max, fp[i]);
}
- near_clip = llclamp(-max.mV[2], 0.01f, 4.0f);
- F32 far_clip = llclamp(-min.mV[2]*2.f, 16.0f, 512.0f);
+ static LLCachedControl<F32> maxDist(gSavedSettings, "MPRenderShadowMaxDist", 128);
- //far_clip = llmin(far_clip, 128.f);
+ near_clip = llclamp(-max.mV[2], 0.01f, 4.0f);
+ F32 far_clip = llclamp(-min.mV[2]*1.1, 16.0f, maxDist);
far_clip = llmin(far_clip, camera.getFar());
F32 range = far_clip-near_clip;
- LLVector3 split_exp = RenderShadowSplitExponent;
+ F32 closestDist = 2.0;
+ F32 closeDist = 10.0;
- F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) );
+ mSunClipPlanes.mV[0] = near_clip + closestDist;
+ mSunClipPlanes.mV[1] = near_clip + closeDist;
+ mSunClipPlanes.mV[2] = mSunClipPlanes.mV[1] + (range-closeDist)*0.4;
+ mSunClipPlanes.mV[3] = far_clip;
+ /*
+ LLVector3 split_exp = RenderShadowSplitExponent;
+ F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) );
da = powf(da, split_exp.mV[2]);
F32 sxp = split_exp.mV[1] + (split_exp.mV[0]-split_exp.mV[1])*da;
- for (U32 i = 0; i < 4; ++i)
+ for (U32 i = 0; i < splits; ++i)
{
- F32 x = (F32)(i+1)/4.f;
+ F32 x = (F32)(i+1)/(F32)splits;
x = powf(x, sxp);
mSunClipPlanes.mV[i] = near_clip+range*x;
}
+ */
- mSunClipPlanes.mV[0] *= 1.25f; //bump back first split for transition padding
+ //mSunClipPlanes.mV[0] *= 1.1f; //bump back first split for transition padding
}
if (gCubeSnapshot)
@@ -10090,13 +10589,17 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
// convenience array of 4 near clip plane distances
F32 dist[] = { near_clip, mSunClipPlanes.mV[0], mSunClipPlanes.mV[1], mSunClipPlanes.mV[2], mSunClipPlanes.mV[3] };
- if (mSunDiffuse == LLColor4::black)
+ if (mSunDiffuse == LLColor4::black || RenderShadowDetail == 3)
{ //sun diffuse is totally black shadows don't matter
skipRenderingShadows();
}
else
{
- for (S32 j = 0; j < (gCubeSnapshot ? 2 : 4); j++)
+ S32 begin = 0;
+ S32 end = splits-1;
+ if(gCubeSnapshot) end = 1;
+
+ for (S32 j = begin; j <= end; j++)
{
if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot)
{
@@ -10134,8 +10637,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f;
delta.normVec();
F32 dp = delta*pn;
- frust[i] = eye + (delta*dist[j]*0.75f)/dp;
- frust[i+4] = eye + (delta*dist[j+1]*1.25f)/dp;
+ frust[i] = eye + (delta*dist[j]*0.9f)/dp;
+ frust[i+4] = eye + (delta*dist[j+1]*1.1f)/dp;
}
shadow_cam.calcAgentFrustumPlanes(frust);
@@ -10148,12 +10651,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
std::vector<LLVector3> fp;
- U32 splits = 3;
- if(MPRenderShadowOpti == 1) splits = 2;
- else if(MPRenderShadowOpti >= 2) splits = 1;
-
- if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir)
- || j > splits)
+ if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir))
{
//no possible shadow receivers
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot)
@@ -10163,7 +10661,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
mShadowCamera[j+4] = shadow_cam;
}
- mRT->shadow[j].bindTarget();
+ mRT->shadow[j].bindTarget("", 1);
{
LLGLDepthTest depth(GL_TRUE);
mRT->shadow[j].clear();
@@ -10453,8 +10951,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
stop_glerror();
- mRT->shadow[j].bindTarget();
- mRT->shadow[j].getViewport(gGLViewport);
+ mRT->shadow[j].bindTarget("mRT->shadow[j] (rendering)", 1);
+ //mRT->shadow[j].getViewport(gGLViewport);
+ //mRT->shadow[j].getViewport(0, 0, SHADOWS_RESX, SHADOWS_RESY);
mRT->shadow[j].clear();
{
@@ -10602,8 +11101,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
//
- mSpotShadow[i].bindTarget();
- mSpotShadow[i].getViewport(gGLViewport);
+ mSpotShadow[i].bindTarget("mSpotShadow[i]", 1);
+ //mSpotShadow[i].getViewport(gGLViewport);
mSpotShadow[i].clear();
static LLCullResult result[2];
@@ -10651,6 +11150,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
{
gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
}
+
+ LOG_GLERROR("LLPipeline::generateSunShadow()");
}
void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture)
@@ -10666,6 +11167,8 @@ void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture)
pass->renderGroup(group,type,texture);
}
}
+
+ LOG_GLERROR("LLPipeline::renderGroups()");
}
void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture)
@@ -10681,6 +11184,8 @@ void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture)
pass->renderRiggedGroup(group, type, texture);
}
}
+
+ LOG_GLERROR("LLPipeline::renderRiggedGroups()");
}
void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments)
@@ -10697,7 +11202,7 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments)
LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr;
- mRT->deferredScreen.bindTarget();
+ mRT->deferredScreen.bindTarget("mRT->deferredScreen in profileAvatar", 1);
mRT->deferredScreen.clear();
if (!profile_attachments)
@@ -10751,6 +11256,8 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments)
{
cur_shader->bind();
}
+
+ LOG_GLERROR("LLPipeline::profileAvatar()");
}
void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool for_profile, LLViewerObject* specific_attachment)
@@ -10971,7 +11478,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
{
if (!avatar->mImpostor.isComplete())
{
- avatar->mImpostor.allocate(resX, resY, GL_RGBA, true);
+ avatar->mImpostor.allocate(resX, resY, GL_RGBA8, true);
if (LLPipeline::sRenderDeferred)
{
@@ -10987,7 +11494,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
avatar->mImpostor.resize(resX, resY);
}
- avatar->mImpostor.bindTarget();
+ avatar->mImpostor.bindTarget("avatar->mImpostor", 1);
}
}
@@ -11124,6 +11631,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
}
LLVertexBuffer::unbind();
+
+ LOG_GLERROR("LLPipeline::generateImpostor()");
+
LLGLState::checkStates();
}
@@ -11448,7 +11958,7 @@ void LLPipeline::skipRenderingShadows()
for (S32 j = 0; j < 4; j++)
{
- mRT->shadow[j].bindTarget();
+ mRT->shadow[j].bindTarget("skip rendering shadows", 1);
mRT->shadow[j].clear();
mRT->shadow[j].flush();
}
@@ -11487,21 +11997,24 @@ public:
}
};
-
+// Called from LLViewHighlightTransparent when "Highlight Transparent" is toggled
void LLPipeline::rebuildDrawInfo()
{
- for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
- iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
+ const U32 types_to_traverse[] =
{
- LLViewerRegion* region = *iter;
-
- LLOctreeDirty dirty;
-
- LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_VOLUME);
- dirty.traverse(part->mOctree);
+ LLViewerRegion::PARTITION_VOLUME,
+ LLViewerRegion::PARTITION_BRIDGE,
+ LLViewerRegion::PARTITION_AVATAR
+ };
- part = region->getSpatialPartition(LLViewerRegion::PARTITION_BRIDGE);
- dirty.traverse(part->mOctree);
+ LLOctreeDirty dirty;
+ for (LLViewerRegion* region : LLWorld::getInstance()->getRegionList())
+ {
+ for (U32 type : types_to_traverse)
+ {
+ LLSpatialPartition* part = region->getSpatialPartition(type);
+ dirty.traverse(part->mOctree);
+ }
}
}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index da9b8189e2..41e428fce9 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -125,11 +125,14 @@ public:
private:
//implementation of above, wrapped for easy error handling
eFBOStatus doAllocateScreenBuffer(U32 resX, U32 resY);
+ void renderTriangle();
+
public:
//attempt to allocate screen buffers at resX, resY
//returns true if allocation successful, false otherwise
- bool allocateScreenBufferInternal(U32 resX, U32 resY);
+ //type 0 = screen, 1 = probe, 2 = mirror
+ bool allocateScreenBufferInternal(U32 resX, U32 resY, U32 type_ = 0);
bool allocateShadowBuffer(U32 resX, U32 resY);
// rebuild all LLVOVolume render batches
@@ -155,18 +158,21 @@ public:
void copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst);
void generateLuminance(LLRenderTarget* src, LLRenderTarget* dst);
void generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history = true);
- void tonemap(LLRenderTarget* src, LLRenderTarget* dst);
+ void tonemap(LLRenderTarget* src, LLRenderTarget* dst, bool gamma_correct);
void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst);
void generateGlow(LLRenderTarget* src);
- void applyCAS(LLRenderTarget* src, LLRenderTarget* dst);
- void applyFXAA(LLRenderTarget* src, LLRenderTarget* dst);
- void generateSMAABuffers(LLRenderTarget* src);
- void applySMAA(LLRenderTarget* src, LLRenderTarget* dst);
- void renderDoF(LLRenderTarget* src, LLRenderTarget* dst);
+ bool applyCAS(LLRenderTarget* src, LLRenderTarget* dst);
+ bool generateFXAABuffer(LLRenderTarget* src);
+ bool applyFXAA(LLRenderTarget* src, LLRenderTarget* dst);
+ bool generateSMAABuffers(LLRenderTarget* src);
+ bool applySMAA(LLRenderTarget* src, LLRenderTarget* dst);
+ bool renderDoF(LLRenderTarget* src, LLRenderTarget* dst);
void copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst);
void combineGlow(LLRenderTarget* src, LLRenderTarget* dst);
void visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex);
+ bool renderBloom(LLRenderTarget* src, LLRenderTarget* dst);
+
void init();
void cleanup();
bool isInit() { return mInitialized; };
@@ -308,6 +314,7 @@ public:
void renderGeomDeferred(LLCamera& camera, bool do_occlusion = false);
void renderGeomPostDeferred(LLCamera& camera);
+ void renderGeomPostDeferredOnlyHud(LLCamera& camera);
void renderGeomShadow(LLCamera& camera);
void bindLightFunc(LLGLSLShader& shader);
@@ -729,13 +736,22 @@ public:
LLRenderTarget mExposureMap;
LLRenderTarget mLastExposure;
+ LLRenderTarget mBloomMap;
+ LLRenderTarget mBloomBlur[2];
+
// tonemapped and gamma corrected render ready for post
- LLRenderTarget mPostMap;
+/*
+ LLRenderTarget mPostPingMap;
+ LLRenderTarget mPostPongMap;
+*/
+ LLRenderTarget mPostMaps[2];
// FXAA helper target
LLRenderTarget mFXAAMap;
LLRenderTarget mSMAABlendBuffer;
+ //LLRenderTarget mDummyRT;
+
// render ui to buffer target
LLRenderTarget mUIScreen;
@@ -812,6 +828,9 @@ public:
bool mShadersLoaded;
U32 mTransformFeedbackPrimitives; //number of primitives expected to be generated by transform feedback
+
+ bool mHDRDisplay;
+
protected:
bool mRenderTypeEnabled[NUM_RENDER_TYPES];
std::stack<std::string> mRenderTypeEnableStack;
@@ -1008,10 +1027,9 @@ public:
static bool RenderDeferred;
static F32 RenderDeferredSunWash;
static U32 RenderFSAAType;
- static U32 RenderResolutionDivisor;
+ static F32 RenderResolutionDivisor;
static bool RenderUIBuffer;
static S32 RenderShadowDetail;
- static S32 MPRenderShadowOpti;
static S32 RenderShadowSplits;
static bool RenderDeferredSSAO;
static F32 RenderShadowResolutionScale;
diff --git a/indra/newview/res/ll_icon_small.ico b/indra/newview/res/ll_icon_small.ico
new file mode 100644
index 0000000000..9cc41f3e4a
--- /dev/null
+++ b/indra/newview/res/ll_icon_small.ico
Binary files differ
diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h
index e904f4a1a8..1d3289d784 100644
--- a/indra/newview/res/resource.h
+++ b/indra/newview/res/resource.h
@@ -30,6 +30,7 @@
#define IDREMOVE 3
#define IDI_LL_ICON 103
#define IDC_GRABHAND 104
+#define IDI_LL_ICON_SMALL 105
#define IDC_CURSOR1 134
#define IDC_CURSOR2 136
#define IDC_CURSOR3 147
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 4ee26a312a..b88390d78c 100755
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -56,6 +56,7 @@ END
// remains consistent on all systems.
IDI_LL_ICON ICON "ll_icon.ico"
IDI_LCD_LL_ICON ICON "icon1.ico"
+IDI_LL_ICON_SMALL ICON "ll_icon_small.ico"
/////////////////////////////////////////////////////////////////////////////
//
@@ -152,13 +153,13 @@ BEGIN
BEGIN
BLOCK "040904b0"
BEGIN
- VALUE "CompanyName", "Linden Lab"
- VALUE "FileDescription", "Second Life"
+ VALUE "CompanyName", "Megapahit"
+ VALUE "FileDescription", "Megapahit viewer"
VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}"
- VALUE "InternalName", "Second Life"
- VALUE "LegalCopyright", "Copyright (c) 2020, Linden Research, Inc."
- VALUE "OriginalFilename", "SecondLife.exe"
- VALUE "ProductName", "Second Life"
+ VALUE "InternalName", "Megapahit"
+ VALUE "LegalCopyright", "Copyright (c) 2026, Megapahit."
+ VALUE "OriginalFilename", "Megapahit.exe"
+ VALUE "ProductName", "Megapahit viewer"
VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}"
END
END
diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h
index e39328fdd6..4437adcf1b 100644
--- a/indra/newview/rlvdefines.h
+++ b/indra/newview/rlvdefines.h
@@ -93,6 +93,15 @@ namespace Rlv
Version = 0,
VersionNew,
VersionNum,
+ GetSitID,
+ Sit,
+ SitGround,
+ Unsit,
+ Detach,
+ RemOutfit,
+ GetInv,
+ Attach,
+ AttachOver,
GetCommand,
Count,
diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp
index 6c4b439105..2cc06b3bbc 100644
--- a/indra/newview/rlvhandler.cpp
+++ b/indra/newview/rlvhandler.cpp
@@ -28,8 +28,14 @@
#include "llviewerprecompiledheaders.h"
#include "llagent.h"
#include "llstartup.h"
+#include "llappearancemgr.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llmoveview.h"
#include "llviewercontrol.h"
+#include "llviewermenu.h"
#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
#include "rlvcommon.h"
#include "rlvhandler.h"
@@ -109,6 +115,9 @@ ECmdRet RlvHandler::processCommand(std::reference_wrapper<const RlvCommand> rlvC
switch (rlvCmd.get().getParamType())
{
case EParamType::Reply:
+ case EParamType::Force:
+ case EParamType::Remove:
+ case EParamType::Add:
eRet = rlvCmd.get().processCommand();
break;
case EParamType::Unknown:
@@ -222,4 +231,206 @@ ECmdRet ReplyHandler<EBehaviour::VersionNum>::onCommand(const RlvCommand& rlvCmd
return ECmdRet::Succeeded;
}
+template<> template<>
+ECmdRet ReplyHandler<EBehaviour::GetSitID>::onCommand(const RlvCommand& rlvCmd, std::string& strReply)
+{
+ if (gAgent.isSitting())
+ gAgent.getSitObjectID().toString(strReply);
+ else
+ strReply = "00000000-0000-0000-0000-000000000000";
+ return ECmdRet::Succeeded;
+}
+
+template<> template<>
+ECmdRet ReplyHandler<EBehaviour::GetInv>::onCommand(const RlvCommand& rlvCmd, std::string& strReply)
+{
+ auto folderID = gInventory.getRootFolderID();
+ LLNameCategoryCollector has_name("#RLV");
+ if (!gInventory.hasMatchingDirectDescendent(folderID, has_name))
+ return ECmdRet::FailedNoSharedRoot;
+ folderID = findDescendentCategoryIDByName(folderID, "#RLV");
+ strReply = "";
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ std::vector<std::string> optionList;
+ auto option = rlvCmd.getOption();
+ if (!option.empty())
+ {
+ Util::parseStringList(option, optionList, "/");
+ auto optIter = optionList.begin();
+ for(; optionList.end() != optIter; ++optIter)
+ {
+ auto name = *optIter;
+ if (!name.empty())
+ folderID = findDescendentCategoryIDByName(folderID, name);
+ }
+ }
+ gInventory.getDirectDescendentsOf(folderID, cats, items);
+ auto iter = cats->begin();
+ for(; cats->end() != iter; ++iter)
+ {
+ auto name = (*iter)->getName();
+ if (name.front() == '.')
+ continue;
+ if (iter != cats->begin())
+ strReply.append(",");
+ strReply.append(name);
+ }
+ return ECmdRet::Succeeded;
+}
+
+// Force
+
+ECmdRet CommandHandlerBaseImpl<EParamType::Force>::processCommand(const RlvCommand& rlvCmd, ForceHandlerFunc* pHandler)
+{
+ return (*pHandler)(rlvCmd);
+}
+
+template<> template<>
+ECmdRet ForceHandler<EBehaviour::Sit>::onCommand(const RlvCommand& rlvCmd)
+{
+ handle_object_sit(LLUUID{rlvCmd.getOption()});
+ return ECmdRet::Succeeded;
+}
+
+template<> template<>
+ECmdRet ForceHandler<EBehaviour::SitGround>::onCommand(const RlvCommand& rlvCmd)
+{
+ gAgent.sitDown();
+ return ECmdRet::Succeeded;
+}
+
+template<> template<>
+ECmdRet ForceHandler<EBehaviour::Unsit>::onCommand(const RlvCommand& rlvCmd)
+{
+ gAgent.standUp();
+ return ECmdRet::Succeeded;
+}
+
+template<> template<>
+ECmdRet ForceHandler<EBehaviour::RemOutfit>::onCommand(const RlvCommand& rlvCmd)
+{
+ std::vector<std::string> optionList;
+ auto option = rlvCmd.getOption();
+ if (option.empty())
+ {
+ LLAppearanceMgr::instance().removeAllClothesFromAvatar();
+ }
+ else
+ {
+ LLWearableType::EType type = LLWearableType::getInstance()->typeNameToType(option);
+ if (type >= LLWearableType::WT_SHAPE
+ && type < LLWearableType::WT_COUNT
+ && (gAgentWearables.getWearableCount(type) > 0))
+ {
+ U32 wearable_index = gAgentWearables.getWearableCount(type) - 1;
+ LLUUID item_id = gAgentWearables.getWearableItemID(type,wearable_index);
+ LLAppearanceMgr::instance().removeItemFromAvatar(item_id);
+ }
+ }
+ return ECmdRet::Succeeded;
+}
+
+#define RESTRAINED_LOVE_OUTFIT(A) \
+ auto folderID = gInventory.getRootFolderID();\
+ LLNameCategoryCollector has_name("#RLV");\
+ if (!gInventory.hasMatchingDirectDescendent(folderID, has_name))\
+ return ECmdRet::FailedNoSharedRoot;\
+ folderID = findDescendentCategoryIDByName(folderID, "#RLV");\
+ std::vector<std::string> optionList;\
+ auto option = rlvCmd.getOption();\
+ if (!option.empty())\
+ {\
+ folderID = findDescendentCategoryIDByName(folderID, option);\
+ if (folderID == LLUUID::null)\
+ {\
+ Util::parseStringList(option, optionList, "/");\
+ auto iter = optionList.begin();\
+ for(; optionList.end() != iter; ++iter)\
+ {\
+ auto name = *iter;\
+ if (!name.empty())\
+ folderID = findDescendentCategoryIDByName(folderID, name);\
+ }\
+ }\
+ A\
+ }\
+ return ECmdRet::Succeeded;
+
+#define RESTRAINED_LOVE_REPLACE \
+ LLAppearanceMgr::instance().replaceCurrentOutfit(folderID);
+
+#define RESTRAINED_LOVE_ADD \
+ LLAppearanceMgr::instance().addCategoryToCurrentOutfit(folderID);
+
+template<> template<>
+ECmdRet ForceHandler<EBehaviour::Attach>::onCommand(const RlvCommand& rlvCmd)
+{
+ RESTRAINED_LOVE_OUTFIT(RESTRAINED_LOVE_REPLACE);
+}
+
+template<> template<>
+ECmdRet ForceHandler<EBehaviour::AttachOver>::onCommand(const RlvCommand& rlvCmd)
+{
+ RESTRAINED_LOVE_OUTFIT(RESTRAINED_LOVE_ADD);
+}
+
+template<> template<>
+ECmdRet ForceHandler<EBehaviour::Detach>::onCommand(const RlvCommand& rlvCmd)
+{
+ auto folderID = gInventory.getRootFolderID();
+ LLNameCategoryCollector has_name("#RLV");
+ if (!gInventory.hasMatchingDirectDescendent(folderID, has_name))
+ return ECmdRet::FailedNoSharedRoot;
+ folderID = findDescendentCategoryIDByName(folderID, "#RLV");
+ std::vector<std::string> optionList;
+ auto option = rlvCmd.getOption();
+ if (!option.empty())
+ {
+ LLNameCategoryCollector is_named(option);
+ if (gInventory.hasMatchingDirectDescendent(folderID, is_named))
+ {
+ folderID = findDescendentCategoryIDByName(folderID, option);
+ LLAppearanceMgr::instance().takeOffOutfit(folderID);
+ }
+ }
+ return ECmdRet::Succeeded;
+}
+
+// AddRem
+
+ECmdRet CommandHandlerBaseImpl<EParamType::AddRem>::processCommand(const RlvCommand& rlvCmd, BhvrHandlerFunc* pHandler, BhvrToggleHandlerFunc* pToggleHandler)
+{
+ auto param = rlvCmd.getParam();
+ bool toggle = false;
+ if (param == "y")
+ toggle = true;
+ else if (param != "n")
+ return ECmdRet::FailedParam;
+ return (*pHandler)(rlvCmd, toggle);
+}
+
+template<> template<>
+ECmdRet BehaviourToggleHandler<EBehaviour::Sit>::onCommand(const RlvCommand& rlvCmd, bool& toggle)
+{
+ gAgent.setAllowedToSit(toggle);
+ return ECmdRet::Succeeded;
+}
+
+template<> template<>
+ECmdRet BehaviourToggleHandler<EBehaviour::Unsit>::onCommand(const RlvCommand& rlvCmd, bool& toggle)
+{
+ gAgent.setAllowedToStand(toggle);
+ if (gAgent.isSitting())
+ LLPanelStandStopFlying::getInstance()->setVisibleStandButton(toggle);
+ return ECmdRet::Succeeded;
+}
+
+template<> template<>
+ECmdRet BehaviourToggleHandler<EBehaviour::Detach>::onCommand(const RlvCommand& rlvCmd, bool& toggle)
+{
+ gObjectList.findObject(rlvCmd.getObjectID())->setLocked(!toggle);
+ return ECmdRet::Succeeded;
+}
+
// ============================================================================
diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp
index 7cb1473c8c..2c14434194 100644
--- a/indra/newview/rlvhelper.cpp
+++ b/indra/newview/rlvhelper.cpp
@@ -50,10 +50,26 @@ BehaviourDictionary::BehaviourDictionary()
// Reply-only
//
addEntry(new ReplyProcessor<EBehaviour::GetCommand>("getcommand"));
+ addEntry(new ReplyProcessor<EBehaviour::GetSitID>("getsitid"));
+ addEntry(new ReplyProcessor<EBehaviour::GetInv>("getinv"));
addEntry(new ReplyProcessor<EBehaviour::Version, VersionReplyHandler>("version"));
addEntry(new ReplyProcessor<EBehaviour::VersionNew, VersionReplyHandler>("versionnew"));
addEntry(new ReplyProcessor<EBehaviour::VersionNum>("versionnum"));
+ // Force
+ addEntry(new ForceProcessor<EBehaviour::Sit>("sit"));
+ addEntry(new ForceProcessor<EBehaviour::SitGround>("sitground"));
+ addEntry(new ForceProcessor<EBehaviour::Unsit>("unsit"));
+ addEntry(new ForceProcessor<EBehaviour::RemOutfit>("remoutfit"));
+ addEntry(new ForceProcessor<EBehaviour::Attach>("attach"));
+ addEntry(new ForceProcessor<EBehaviour::AttachOver>("attachover"));
+ addEntry(new ForceProcessor<EBehaviour::Detach>("detach"));
+
+ // AddRem
+ addEntry(new BehaviourProcessor<EBehaviour::Sit>("sit"));
+ addEntry(new BehaviourProcessor<EBehaviour::Unsit>("unsit"));
+ addEntry(new BehaviourProcessor<EBehaviour::Detach>("detach"));
+
// Populate mString2InfoMap (the tuple <behaviour, type> should be unique)
for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList)
{
diff --git a/indra/newview/skins/contrast/textures/build/Object_Cone_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Cone_Selected.png
deleted file mode 100644
index 4aeb96c3ae..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Cone_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Cube_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Cube_Selected.png
deleted file mode 100644
index 9c9d4f506a..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Cube_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Cylinder_Selected.png
deleted file mode 100644
index 50bd865cfc..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Cylinder_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Grass_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Grass_Selected.png
deleted file mode 100644
index 19cf732d91..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Grass_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone_Selected.png
deleted file mode 100644
index ae65f1d5e6..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder_Selected.png
deleted file mode 100644
index c837e953da..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere_Selected.png
deleted file mode 100644
index 2d1e035d41..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Prism_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Prism_Selected.png
deleted file mode 100644
index 6ec9e72c54..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Prism_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Pyramid_Selected.png
deleted file mode 100644
index ffb878dc72..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Pyramid_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Ring_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Ring_Selected.png
deleted file mode 100644
index ccc1f6d221..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Ring_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Sphere_Selected.png
deleted file mode 100644
index ee015e1786..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Sphere_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Tetrahedron_Selected.png
deleted file mode 100644
index 1afb115ce5..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Tetrahedron_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Torus_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Torus_Selected.png
deleted file mode 100644
index ff1cce3a79..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Torus_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Tree_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Tree_Selected.png
deleted file mode 100644
index f21b0e4043..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Tree_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Tube_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Tube_Selected.png
deleted file mode 100644
index 5653f06af1..0000000000
--- a/indra/newview/skins/contrast/textures/build/Object_Tube_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/cloud-particle.j2c b/indra/newview/skins/contrast/textures/cloud-particle.j2c
deleted file mode 100644
index 6c03bf6d05..0000000000
--- a/indra/newview/skins/contrast/textures/cloud-particle.j2c
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/default_land_picture.png b/indra/newview/skins/contrast/textures/default_land_picture.png
new file mode 100644
index 0000000000..c53a5f6aa0
--- /dev/null
+++ b/indra/newview/skins/contrast/textures/default_land_picture.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/default_profile_picture.png b/indra/newview/skins/contrast/textures/default_profile_picture.png
new file mode 100644
index 0000000000..5bade1cb36
--- /dev/null
+++ b/indra/newview/skins/contrast/textures/default_profile_picture.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/SL_Logo.png b/indra/newview/skins/contrast/textures/icons/SL_Logo.png
deleted file mode 100644
index 8234387058..0000000000
--- a/indra/newview/skins/contrast/textures/icons/SL_Logo.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/hand.png b/indra/newview/skins/contrast/textures/icons/hand.png
deleted file mode 100644
index 3f497eefbb..0000000000
--- a/indra/newview/skins/contrast/textures/icons/hand.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/see_on_map.png b/indra/newview/skins/contrast/textures/icons/see_on_map.png
deleted file mode 100644
index fc7057cacd..0000000000
--- a/indra/newview/skins/contrast/textures/icons/see_on_map.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/see_them_on_map.png b/indra/newview/skins/contrast/textures/icons/see_them_on_map.png
deleted file mode 100644
index d309980c13..0000000000
--- a/indra/newview/skins/contrast/textures/icons/see_them_on_map.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/see_them_online.png b/indra/newview/skins/contrast/textures/icons/see_them_online.png
deleted file mode 100644
index 135e6cdd82..0000000000
--- a/indra/newview/skins/contrast/textures/icons/see_them_online.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Info_Off.png b/indra/newview/skins/contrast/textures/navbar/Info_Off.png
deleted file mode 100644
index 64722255a3..0000000000
--- a/indra/newview/skins/contrast/textures/navbar/Info_Off.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Info_Over.png b/indra/newview/skins/contrast/textures/navbar/Info_Over.png
deleted file mode 100644
index 84f1d03129..0000000000
--- a/indra/newview/skins/contrast/textures/navbar/Info_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Info_Press.png b/indra/newview/skins/contrast/textures/navbar/Info_Press.png
deleted file mode 100644
index 169105829e..0000000000
--- a/indra/newview/skins/contrast/textures/navbar/Info_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/textures.xml b/indra/newview/skins/contrast/textures/textures.xml
deleted file mode 100644
index f824816183..0000000000
--- a/indra/newview/skins/contrast/textures/textures.xml
+++ /dev/null
@@ -1,934 +0,0 @@
-<!--
-This file contains metadata about how to load, display, and scale textures for rendering in the UI.
-Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
-to them by filename (relative to textures directory).
-NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry
-with the same filename but different name
-
-<texture
- name="MyTexture" (mandatory)
- - this is the name you reference the texture by in XUI. For example, <button image_unselected="MyTexture"/>
- file_name="images/my_texture.png" (optional)
- - this is the path to the actual file asset, relative to the current skins "textures" directory.
- If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case.
- NOTE: you need to provide an extension on the filename (".png", ".tga", ".jpg") for us to decode the image properly
- preload="true" (optional, false by default)
- - If true, we will attempt to load the image before displaying any UI.
- If false, we will load in the background after initializing the UI.
- use_mips="true" (currently unused)
- scale.left="1"
- scale.bottom="1"
- scale.top="15"
- scale.right="31"
- - Specifies the segmentation for 9-slice image scaling. Specifically, the pixel offsets from the LOWER LEFT corner
- that define the region of the image that is stretched to make the whole image fit in the required space.
- In this example, if the source image is 32x16 pixels, we have defined a center region that starts one pixel up
- and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left
- corner. The end result is that the image will keep a 1 pixel border all around while stretching to fit the required
- region.
--->
-
-<textures version="101">
- <!-- Please add new files alphabetically to prevent merge conflicts. JC -->
- <texture name="Accordion_ArrowClosed_Off" file_name="containers/Accordion_ArrowClosed_Off.png" preload="false" />
- <texture name="Accordion_ArrowClosed_Press" file_name="containers/Accordion_ArrowClosed_Press.png" preload="false" />
- <texture name="Accordion_ArrowOpened_Off" file_name="containers/Accordion_ArrowOpened_Off.png" preload="false" />
- <texture name="Accordion_ArrowOpened_Press" file_name="containers/Accordion_ArrowOpened_Press.png" preload="false" />
- <texture name="Accordion_Off" file_name="containers/Accordion_Off.png" preload="false" />
- <texture name="Accordion_Press" file_name="containers/Accordion_Press.png" preload="false" />
- <texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" />
- <texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" />
-
- <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
-
- <texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" />
- <texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" />
- <texture name="AddItem_Press" file_name="icons/AddItem_Press.png" preload="false" />
-
- <texture name="add_payment_image_center" file_name="windows/add_payment_image_center.png" preload="true" />
- <texture name="add_payment_image_left" file_name="windows/add_payment_image_left.png" preload="true" />
- <texture name="add_payment_image_right" file_name="windows/add_payment_image_right.png" preload="true" />
-
- <texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" />
- <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
-
- <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
- <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
- <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
-
- <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
- <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
- <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
- <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
-
- <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
- <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
- <texture name="VoiceMute_Off" file_name="icons/VoiceMute_Off.png" preload="false" />
-
- <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
- <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
-
- <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
-
- <texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
- <texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
- <texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
-
- <texture name="Error_Tag_Background" file_name="widgets/Error_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
- <texture name="New_Tag_Background" file_name="widgets/New_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
- <texture name="New_Tag_Border" file_name="widgets/New_Tag_Border.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
-
- <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
- <texture name="Badge_Border" file_name="widgets/Badge_Border.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
-
- <texture name="Blank" file_name="Blank.png" preload="false" />
-
- <texture name="BreadCrumbBtn_Left_Disabled" file_name="widgets/BreadCrumbBtn_Left_Disabled.png" preload="false"/>
- <texture name="BreadCrumbBtn_Left_Off" file_name="widgets/BreadCrumbBtn_Left_Off.png" preload="false"/>
- <texture name="BreadCrumbBtn_Left_Over" file_name="widgets/BreadCrumbBtn_Left_Over.png" preload="false"/>
- <texture name="BreadCrumbBtn_Left_Press" file_name="widgets/BreadCrumbBtn_Left_Press.png" preload="false"/>
-
- <texture name="BreadCrumbBtn_Middle_Disabled" file_name="widgets/BreadCrumbBtn_Middle_Disabled.png" preload="false"/>
- <texture name="BreadCrumbBtn_Middle_Off" file_name="widgets/BreadCrumbBtn_Middle_Off.png" preload="false"/>
- <texture name="BreadCrumbBtn_Middle_Over" file_name="widgets/BreadCrumbBtn_Middle_Over.png" preload="false"/>
- <texture name="BreadCrumbBtn_Middle_Press" file_name="widgets/BreadCrumbBtn_Middle_Press.png" preload="false"/>
-
- <texture name="BreadCrumbBtn_Right_Disabled" file_name="widgets/BreadCrumbBtn_Right_Disabled.png" preload="false"/>
- <texture name="BreadCrumbBtn_Right_Off" file_name="widgets/BreadCrumbBtn_Right_Off.png" preload="false"/>
- <texture name="BreadCrumbBtn_Right_Over" file_name="widgets/BreadCrumbBtn_Right_Over.png" preload="false"/>
- <texture name="BreadCrumbBtn_Right_Press" file_name="widgets/BreadCrumbBtn_Right_Press.png" preload="false"/>
-
- <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="0" scale.top="1" scale.right="0" scale.bottom="0" />
- <texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
-
- <texture name="Cam_Avatar_Off" file_name="bottomtray/Cam_Avatar_Off.png" preload="true" />
- <texture name="Cam_FreeCam_Off" file_name="bottomtray/Cam_FreeCam_Off.png" preload="false" />
- <texture name="Cam_Orbit_Off" file_name="bottomtray/Cam_Orbit_Off.png" preload="false" />
- <texture name="Cam_Pan_Off" file_name="bottomtray/Cam_Pan_Off.png" preload="false" />
-
- <texture name="Cam_Preset_Back_Off" file_name="bottomtray/Cam_Preset_Back_Off.png" preload="false" />
- <texture name="Cam_Preset_Back_On" file_name="bottomtray/Cam_Preset_Back_On.png" preload="false" />
- <texture name="Cam_Preset_Eye_Off" file_name="bottomtray/Cam_Preset_Eye_Off.png" preload="false" />
- <texture name="Cam_Preset_Front_Off" file_name="bottomtray/Cam_Preset_Front_Off.png" preload="false" />
- <texture name="Cam_Preset_Front_On" file_name="bottomtray/Cam_Preset_Front_On.png" preload="false" />
- <texture name="Cam_Preset_Side_Off" file_name="bottomtray/Cam_Preset_Side_Off.png" preload="false" />
- <texture name="Cam_Preset_Side_On" file_name="bottomtray/Cam_Preset_Side_On.png" preload="false" />
-
- <texture name="Cam_Rotate_In" file_name="bottomtray/Cam_Rotate_In.png" preload="false" />
- <texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" />
- <texture name="Cam_Rotate_Center" file_name="bottomtray/Cam_Rotate_Center.png" preload="false" />
- <texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" />
- <texture name="Cam_Tracking_Out" file_name="bottomtray/Cam_Tracking_Out.png" preload="false" />
- <texture name="Cam_Tracking_Center" file_name="bottomtray/Cam_Tracking_Center.png" preload="false" />
-
- <texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" />
- <texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" />
- <texture name="Checkbox_Off" file_name="widgets/Checkbox_Off.png" preload="true" />
- <texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />
- <texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />
- <texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
- <texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" />
-
- <texture name="Checker" file_name="checker.png" preload="false" />
-
- <texture name="Command_360_Capture_Icon" file_name="toolbar_icons/360_capture.png" preload="true" />
- <texture name="Command_AboutLand_Icon" file_name="toolbar_icons/land.png" preload="true" />
- <texture name="Command_Appearance_Icon" file_name="toolbar_icons/appearance.png" preload="true" />
- <texture name="Command_Avatar_Icon" file_name="toolbar_icons/avatars.png" preload="true" />
- <texture name="Command_Build_Icon" file_name="toolbar_icons/build.png" preload="true" />
- <texture name="Command_Chat_Icon" file_name="toolbar_icons/chat.png" preload="true" />
- <texture name="Command_Compass_Icon" file_name="toolbar_icons/land.png" preload="true" />
- <texture name="Command_Destinations_Icon" file_name="toolbar_icons/destinations.png" preload="true" />
- <texture name="Command_Gestures_Icon" file_name="toolbar_icons/gestures.png" preload="true" />
- <texture name="Command_Grid_Status_Icon" file_name="toolbar_icons/grid_status.png" preload="true" />
- <texture name="Command_HowTo_Icon" file_name="toolbar_icons/howto.png" preload="true" />
- <texture name="Command_Inventory_Icon" file_name="toolbar_icons/inventory.png" preload="true" />
- <texture name="Command_Map_Icon" file_name="toolbar_icons/map.png" preload="true" />
- <texture name="Command_Marketplace_Icon" file_name="toolbar_icons/marketplace.png" preload="true" />
- <texture name="Command_MktListings_Icon" file_name="toolbar_icons/mktlistings.png" preload="true" />
- <texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" />
- <texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" />
- <texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
- <texture name="Command_Environments_Icon" file_name="toolbar_icons/environments.png" preload="true" />
- <texture name="Command_People_Icon" file_name="toolbar_icons/people.png" preload="true" />
- <texture name="Command_Performance_Icon" file_name="toolbar_icons/performance.png" preload="true" />
- <texture name="Command_Picks_Icon" file_name="toolbar_icons/picks.png" preload="true" />
- <texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" />
- <texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" />
- <texture name="Command_Profile_Icon" file_name="toolbar_icons/profile.png" preload="true" />
- <texture name="Command_Report_Abuse_Icon" file_name="toolbar_icons/report_abuse.png" preload="true" />
- <texture name="Command_Search_Icon" file_name="toolbar_icons/search.png" preload="true" />
- <texture name="Command_Snapshot_Icon" file_name="toolbar_icons/snapshot.png" preload="true" />
- <texture name="Command_Speak_Icon" file_name="toolbar_icons/speak.png" preload="true" />
- <texture name="Command_View_Icon" file_name="toolbar_icons/view.png" preload="true" />
- <texture name="Command_Voice_Icon" file_name="toolbar_icons/nearbyvoice.png" preload="true" />
- <texture name="Command_FavoriteFolder_Icon" file_name="toolbar_icons/favorite_folder.png" preload="true" />
- <texture name="Command_Resync_Animations" file_name="toolbar_icons/resync_animations.png" preload="true" />
- <texture name="Caret_Bottom_Icon" file_name="toolbar_icons/caret_bottom.png" preload="true" scale.left="1" scale.top="23" scale.right="15" scale.bottom="1" />
- <texture name="Caret_Right_Icon" file_name="toolbar_icons/caret_right.png" preload="true" scale.left="5" scale.top="15" scale.right="28" scale.bottom="1" />
- <texture name="Caret_Left_Icon" file_name="toolbar_icons/caret_left.png" preload="true" scale.left="1" scale.top="15" scale.right="23" scale.bottom="1" />
-
- <texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
-
- <texture name="Container" file_name="containers/Container.png" preload="false" />
-
- <texture name="Conv_toolbar_add_person" file_name="icons/Conv_toolbar_add_person.png" preload="false" />
- <texture name="Conv_toolbar_arrow_ne" file_name="icons/Conv_toolbar_arrow_ne.png" preload="false" />
- <texture name="Conv_toolbar_arrow_sw" file_name="icons/Conv_toolbar_arrow_sw.png" preload="false" />
- <texture name="Conv_toolbar_call_log" file_name="icons/Conv_toolbar_call_log.png" preload="false" />
- <texture name="Conv_toolbar_close" file_name="icons/Conv_toolbar_close.png" preload="false" />
- <texture name="Conv_toolbar_collapse" file_name="icons/Conv_toolbar_collapse.png" preload="false" />
- <texture name="Conv_collapse_to_one_line" file_name="icons/collapse_to_one_line.png" preload="false" />
- <texture name="Conv_expand_one_line" file_name="icons/expand_one_liner.png" preload="false" />
- <texture name="Conv_toolbar_expand" file_name="icons/Conv_toolbar_expand.png" preload="false" />
- <texture name="Conv_toolbar_hang_up" file_name="icons/Conv_toolbar_hang_up.png" preload="false" />
- <texture name="Conv_toolbar_open_call" file_name="icons/Conv_toolbar_open_call.png" preload="false" />
- <texture name="Conv_toolbar_plus" file_name="icons/Conv_toolbar_plus.png" preload="false" />
- <texture name="Conv_toolbar_sort" file_name="icons/Conv_toolbar_sort.png" preload="false" />
- <texture name="Conv_log_inbox" file_name="icons/Conv_log_inbox.png" preload="false" />
-
- <texture name="Copy" file_name="icons/Copy.png" preload="false" />
- <texture name="CopyBright" file_name="icons/CopyBright.png" preload="false" />
-
- <texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
-
- <texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
- <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
- <texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
- <texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />
-
- <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
- <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
- <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
- <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
-
- <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
-
- <texture name="Emoji_Picker_Icon" file_name="icons/emoji_picker_icon.png" preload="true" />
- <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" />
- <texture name="Edit_Wrench" file_name="icons/Edit_Wrench.png" preload="false" />
-
- <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" />
-
- <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" />
- <texture name="Presets_Icon_Graphic" file_name="icons/Presets_Icon_Graphic.png" preload="true" />
- <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
- <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
- <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" />
- <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" />
- <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" />
-
-
- <texture name="Flag" file_name="navbar/Flag.png" preload="false" />
-
- <texture name="Flyout_Left" file_name="windows/Flyout_Left.png" preload="false" />
- <texture name="Flyout_Pointer" file_name="windows/Flyout_Pointer.png" preload="false" />
- <texture name="Flyout_Right" file_name="windows/Flyout_Right.png" preload="false" />
-
- <texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" />
- <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
- <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
- <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
-
- <texture name="Generic_Experience" file_name="Blank.png" preload="false" />
- <texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
- <texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
- <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" />
- <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" />
- <texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
- <texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
-
- <texture name="Group_Notices" file_name="icons/Group_Notices.png" preload="false" />
-
- <texture name="Hand" file_name="icons/hand.png" preload="false" />
-
- <texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" />
-
- <texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" />
- <texture name="Hierarchy_View_On" file_name="icons/Hierarchy_View_On.png" preload="false" />
-
-
- <texture name="Home_Off" file_name="navbar/Home_Off.png" preload="false" />
- <texture name="Horizontal Drag Handle" file_name="widgets/horizontal_drag_handle.png" scale.left="8" scale.right="120" scale.bottom="1" scale.top="6" scale_type="scale_outer"/>
-
- <texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" />
- <texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" />
- <texture name="Icon_Close_Toast" file_name="windows/Icon_Close_Toast.png" preload="true" />
-
- <texture name="Icon_Copy" file_name="icons/copy_clipboard.png" preload="true" />
-
- <texture name="Icon_Delete" file_name="icons/delete_icon.png" preload="true" />
-
- <texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" />
- <texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" />
-
- <texture name="Icon_File_Upload" file_name="icons/file_upload.png" preload="true" />
-
- <texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" />
-
- <texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" />
- <texture name="Icon_Gear_Foreground" file_name="windows/Icon_Gear_Foreground.png" preload="false" />
- <texture name="Icon_Gear_Press" file_name="windows/Icon_Gear_Press.png" preload="false" />
- <texture name="Icon_Gear" file_name="windows/Icon_Gear.png" preload="false" />
-
- <texture name="Icon_Help_Foreground" file_name="windows/Icon_Help_Foreground.png" preload="true" />
- <texture name="Icon_Help_Press" file_name="windows/Icon_Help_Press.png" preload="true" />
-
- <texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" />
- <texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" />
-
- <texture name="Icon_Paste" file_name="icons/paste_clipboard.png" preload="true" />
-
- <texture name="Icon_Restore_Foreground" file_name="windows/Icon_Restore_Foreground.png" preload="false" />
- <texture name="Icon_Restore_Press" file_name="windows/Icon_Restore_Press.png" preload="false" />
-
- <texture name="Icon_Snapshot" file_name="icons/snapshot_icon.png" preload="true" />
-
- <texture name="Icon_Use_Texture" file_name="icons/texture_icon.png" preload="true" />
-
- <texture name="Info" file_name="icons/Info.png" preload="false" />
- <texture name="Info_Small" file_name="icons/Info_Small.png" preload="false" />
- <texture name="Info_Off" file_name="navbar/Info_Off.png" preload="false" />
- <texture name="Info_Over" file_name="icons/Info_Over.png" preload="false" />
- <texture name="Info_Press" file_name="navbar/Info_Press.png" preload="false" />
-
- <texture name="Inspector_Background" file_name="windows/Inspector_Background.png" preload="false"
- scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
- <texture name="Inspector_Hover" file_name="windows/Inspector_Hover.png" preload="false" />
- <texture name="Inspector_I" file_name="windows/Inspector_I.png" preload="false" />
-
- <texture name="Inv_Alpha" file_name="icons/Inv_Alpha.png" preload="false" />
- <texture name="Inv_Animation" file_name="icons/Inv_Animation.png" preload="false" />
- <texture name="Inv_BodyShape" file_name="icons/Inv_BodyShape.png" preload="false" />
- <texture name="Inv_CallingCard" file_name="icons/Inv_CallingCard.png" preload="false" />
- <texture name="Inv_Clothing" file_name="icons/Inv_Clothing.png" preload="false" />
- <texture name="Inv_Eye" file_name="icons/Inv_Eye.png" preload="false" />
- <texture name="Inv_FolderClosed" file_name="icons/Inv_FolderClosed.png" preload="false" />
- <texture name="Inv_FolderOpen" file_name="icons/Inv_FolderOpen.png" preload="false" />
- <texture name="Inv_Gesture" file_name="icons/Inv_Gesture.png" preload="false" />
- <texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />
- <texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />
- <texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" />
- <texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" />
- <texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />
- <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
- <texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" />
- <texture name="Inv_LostClosed" file_name="icons/Inv_LostClosed.png" preload="false" />
- <texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" />
- <texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
- <texture name="Inv_Material" file_name="icons/Inv_Material.png" preload="false" />
- <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" />
- <texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
- <texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
- <texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" />
- <texture name="Inv_Pants" file_name="icons/Inv_Pants.png" preload="false" />
- <texture name="Inv_Script" file_name="icons/Inv_Script.png" preload="false" />
- <texture name="Inv_Shirt" file_name="icons/Inv_Shirt.png" preload="false" />
- <texture name="Inv_Shoe" file_name="icons/Inv_Shoe.png" preload="false" />
- <texture name="Inv_Skin" file_name="icons/Inv_Skin.png" preload="false" />
- <texture name="Inv_Skirt" file_name="icons/Inv_Skirt.png" preload="false" />
- <texture name="Inv_Snapshot" file_name="icons/Inv_Snapshot.png" preload="false" />
- <texture name="Inv_Socks" file_name="icons/Inv_Socks.png" preload="false" />
- <texture name="Inv_Sound" file_name="icons/Inv_Sound.png" preload="false" />
- <texture name="Inv_StockFolderClosed" file_name="icons/Inv_StockFolderClosed.png" preload="false" />
- <texture name="Inv_StockFolderOpen" file_name="icons/Inv_StockFolderOpen.png" preload="false" />
- <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
- <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
- <texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
- <texture name="Inv_Universal" file_name="icons/Inv_Universal.png" preload="false" />
- <texture name="Inv_Physics" file_name="icons/Inv_Physics.png" preload="false" />
- <texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" />
- <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" />
- <texture name="Inv_TrashOpen" file_name="icons/Inv_TrashOpen.png" preload="false" />
- <texture name="Inv_Underpants" file_name="icons/Inv_Underpants.png" preload="false" />
- <texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" />
- <texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" />
- <texture name="Inv_Settings" file_name="icons/Inv_Settings.png" preload="false" />
- <texture name="Inv_SettingsSky" file_name="icons/Inv_SettingsSky.png" preload="false" />
- <texture name="Inv_SettingsWater" file_name="icons/Inv_SettingsWater.png" preload="false" />
- <texture name="Inv_SettingsDay" file_name="icons/Inv_SettingsDay.png" preload="false" />
-
- <texture name="Inv_Invalid" file_name="icons/Inv_Invalid.png" preload="false" />
- <texture name="Inv_Unknown" file_name="icons/Inv_UnknownObject.png" preload="false" />
- <texture name="Inv_VersionFolderClosed" file_name="icons/Inv_VersionFolderClosed.png" preload="false" />
- <texture name="Inv_VersionFolderOpen" file_name="icons/Inv_VersionFolderOpen.png" preload="false" />
-
- <texture name="Inv_Toolbar_SearchVisibility" file_name="icons/Inv_Toolbar_SearchVisibility.png" preload="false" />
-
- <texture name="Landmarks_overlay" file_name="navbar/Landmarks.png" preload="false" />
-
- <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>
- <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/>
-
- <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
- <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
-
- <texture name="List_View_Disabled" file_name="icons/List_View_Disabled.png" preload="false" />
- <texture name="List_View_On" file_name="icons/List_View_On.png" preload="false" />
-
- <texture name="Lock" file_name="icons/Lock.png" preload="false" />
- <texture name="Lock2" file_name="navbar/Lock.png" preload="false" />
-
- <texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" />
-
- <texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" />
-
- <texture name="Marketplace_Dropzone_Background" file_name="widgets/Marketplace_Dropzone_Background.png" preload="true" />
- <texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
- <texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
-
- <texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" />
-
- <texture name="MinusItem_Disabled" file_name="icons/MinusItem_Disabled.png" preload="false" />
- <texture name="MinusItem_Off" file_name="icons/MinusItem_Off.png" preload="false" />
- <texture name="MinusItem_Press" file_name="icons/MinusItem_Press.png" preload="false" />
-
- <texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" />
-
- <texture name="ModelImport_Status_Good" file_name="green_checkmark.png" preload="false"/>
- <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/>
- <texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/>
-
- <texture name="MouseLook_View_Off" file_name="bottomtray/Mouselook_View_Off.png" preload="false" />
- <texture name="MouseLook_View_On" file_name="bottomtray/Mouselook_View_On.png" preload="false" />
-
- <texture name="Move_Fly_Off" file_name="bottomtray/Move_Fly_Off.png" preload="false" />
- <texture name="Move_Run_Off" file_name="bottomtray/Move_Run_Off.png" preload="false" />
- <texture name="Move_Walk_Off" file_name="bottomtray/Move_Walk_Off.png" preload="false" />
- <texture name="Movement_Backward_Off" file_name="bottomtray/Movement_Backward_Off.png" preload="false" />
- <texture name="Movement_Backward_On" file_name="bottomtray/Movement_Backward_On.png" preload="false" />
- <texture name="Movement_Down_Off" file_name="bottomtray/Movement_Down_Off.png" preload="false" />
- <texture name="Movement_Down_On" file_name="bottomtray/Movement_Down_On.png" preload="false" />
- <texture name="Movement_Forward_Off" file_name="bottomtray/Movement_Forward_Off.png" preload="false" />
- <texture name="Movement_Forward_On" file_name="bottomtray/Movement_Forward_On.png" preload="false" />
- <texture name="Movement_Left_Off" file_name="bottomtray/Movement_Left_Off.png" preload="false" />
- <texture name="Movement_Left_On" file_name="bottomtray/Movement_Left_On.png" preload="false" />
- <texture name="Movement_Right_Off" file_name="bottomtray/Movement_Right_Off.png" preload="false" />
- <texture name="Movement_Right_On" file_name="bottomtray/Movement_Right_On.png" preload="false" />
- <texture name="Movement_TurnLeft_Off" file_name="bottomtray/Movement_TurnLeft_Off.png" preload="false" />
- <texture name="Movement_TurnLeft_On" file_name="bottomtray/Movement_TurnLeft_On.png" preload="false" />
- <texture name="Movement_TurnRight_Off" file_name="bottomtray/Movement_TurnRight_Off.png" preload="false" />
- <texture name="Movement_TurnRight_On" file_name="bottomtray/Movement_TurnRight_On.png" preload="false" />
- <texture name="Movement_Up_Off" file_name="bottomtray/Movement_Up_Off.png" preload="false" />
- <texture name="Movement_Up_On" file_name="bottomtray/Movement_Up_On.png" preload="false" />
-
- <texture name="NavBar_BG" file_name="navbar/NavBar_BG.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
- <texture name="NavBar_BG_NoFav_Bevel" file_name="navbar/NavBar_BG_NoFav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
- <texture name="NavBar_BG_NoNav_Bevel" file_name="navbar/NavBar_BG_NoNav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
-
- <texture name="Nearby_chat_icon" file_name="icons/nearby_chat_icon.png" preload="false" />
-
- <texture name="Notices_Unread" file_name="bottomtray/Notices_Unread.png" preload="true" />
-
- <texture name="NoEntryLines" file_name="world/NoEntryLines.png" use_mips="true" preload="false" />
- <texture name="NoEntryPassLines" file_name="world/NoEntryPassLines.png" use_mips="true" preload="false" />
-
- <texture name="Object_Cone" file_name="build/Object_Cone.png" preload="false" />
- <texture name="Object_Cone_Selected" file_name="build/Object_Cone_Selected.png" preload="false" />
- <texture name="Object_Cube" file_name="build/Object_Cube.png" preload="false" />
- <texture name="Object_Cube_Selected" file_name="build/Object_Cube_Selected.png" preload="false" />
- <texture name="Object_Cylinder" file_name="build/Object_Cylinder.png" preload="false" />
- <texture name="Object_Cylinder_Selected" file_name="build/Object_Cylinder_Selected.png" preload="false" />
- <texture name="Object_Grass" file_name="build/Object_Grass.png" preload="false" />
- <texture name="Object_Grass_Selected" file_name="build/Object_Grass_Selected.png" preload="false" />
- <texture name="Object_Hemi_Cone" file_name="build/Object_Hemi_Cone.png" preload="false" />
- <texture name="Object_Hemi_Cone_Selected" file_name="build/Object_Hemi_Cone_Selected.png" preload="false" />
- <texture name="Object_Hemi_Cylinder" file_name="build/Object_Hemi_Cylinder.png" preload="false" />
- <texture name="Object_Hemi_Cylinder_Selected" file_name="build/Object_Hemi_Cylinder_Selected.png" preload="false" />
- <texture name="Object_Hemi_Sphere" file_name="build/Object_Hemi_Sphere.png" preload="false" />
- <texture name="Object_Hemi_Sphere_Selected" file_name="build/Object_Hemi_Sphere_Selected.png" preload="false" />
- <texture name="Object_Prism" file_name="build/Object_Prism.png" preload="false" />
- <texture name="Object_Prism_Selected" file_name="build/Object_Prism_Selected.png" preload="false" />
- <texture name="Object_Pyramid" file_name="build/Object_Pyramid.png" preload="false" />
- <texture name="Object_Pyramid_Selected" file_name="build/Object_Pyramid_Selected.png" preload="false" />
- <texture name="Object_Ring" file_name="build/Object_Ring.png" preload="false" />
- <texture name="Object_Ring_Selected" file_name="build/Object_Ring_Selected.png" preload="false" />
- <texture name="Object_Sphere" file_name="build/Object_Sphere.png" preload="false" />
- <texture name="Object_Sphere_Selected" file_name="build/Object_Sphere_Selected.png" preload="false" />
- <texture name="Object_Tetrahedron" file_name="build/Object_Tetrahedron.png" preload="false" />
- <texture name="Object_Tetrahedron_Selected" file_name="build/Object_Tetrahedron_Selected.png" preload="false" />
- <texture name="Object_Torus" file_name="build/Object_Torus.png" preload="false" />
- <texture name="Object_Torus_Selected" file_name="build/Object_Torus_Selected.png" preload="false" />
- <texture name="Object_Tree" file_name="build/Object_Tree.png" preload="false" />
- <texture name="Object_Tree_Selected" file_name="build/Object_Tree_Selected.png" preload="false" />
- <texture name="Object_Tube" file_name="build/Object_Tube.png" preload="false" />
- <texture name="Object_Tube_Selected" file_name="build/Object_Tube_Selected.png" preload="false" />
-
- <texture name="Object_View_Off" file_name="bottomtray/Object_View_Off.png" preload="false" />
- <texture name="Object_View_On" file_name="bottomtray/Object_View_On.png" preload="false" />
-
- <texture name="OptionsMenu_Disabled" file_name="icons/OptionsMenu_Disabled.png" preload="false" />
- <texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" />
- <texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" />
-
- <texture name="ClipboardSmallMenu_Disabled" file_name="icons/ClipboardSmallMenu_Disabled.png" preload="false" />
- <texture name="ClipboardSmallMenu_Off" file_name="icons/ClipboardSmallMenu_Off.png" preload="false" />
- <texture name="ClipboardSmallMenu_Press" file_name="icons/ClipboardSmallMenu_Press.png" preload="false" />
- <texture name="ClipboardMenu_Disabled" file_name="icons/ClipboardMenu_Disabled.png" preload="false" />
- <texture name="ClipboardMenu_Off" file_name="icons/ClipboardMenu_Off.png" preload="false" />
- <texture name="ClipboardMenu_Press" file_name="icons/ClipboardMenu_Press.png" preload="false" />
-
- <texture name="OutboxStatus_Success" file_name="green_checkmark.png" preload="false" />
- <texture name="OutboxStatus_Warning" file_name="icons/pop_up_caution.png" preload="false" />
- <texture name="OutboxStatus_Error" file_name="red_x.png" preload="false" />
-
- <texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" />
-
- <texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" />
-
- <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" />
- <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" />
- <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" />
- <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" />
- <texture name="Parcel_Fly_Dark" file_name="icons/Parcel_Fly_Dark.png" preload="false" />
- <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" />
- <texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" />
- <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" />
- <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" />
- <texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" />
- <texture name="Parcel_PushNo_Dark" file_name="icons/Parcel_PushNo_Dark.png" preload="false" />
- <texture name="Parcel_R_Dark" file_name="icons/Parcel_R_Dark.png" preload="false" />
- <texture name="Parcel_Scripts_Dark" file_name="icons/Parcel_Scripts_Dark.png" preload="false" />
- <texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
- <texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
- <texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
- <texture name="Parcel_SeeAVsOff_Dark" file_name="icons/Parcel_SeeAVsOff_Dark.png" preload="false" />
- <texture name="Parcel_SeeAVsOn_Dark" file_name="icons/Parcel_SeeAVsOn_Dark.png" preload="false" />
- <texture name="Parcel_SeeAVsOff_Light" file_name="icons/Parcel_SeeAVsOff_Light.png" preload="false" />
- <texture name="Parcel_SeeAVsOn_Light" file_name="icons/Parcel_SeeAVsOn_Light.png" preload="false" />
-
- <texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
- <texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />
- <texture name="Parcel_ForSale_Light" file_name="icons/Parcel_ForSale_Light.png" preload="false" />
- <texture name="Parcel_M_Light" file_name="icons/Parcel_M_Light.png" preload="false" />
- <texture name="Parcel_PG_Light" file_name="icons/Parcel_PG_Light.png" preload="false" />
- <texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" />
- <texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" />
- <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
- <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" />
- <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" />
-
- <texture name="Pathfinding_Dirty" file_name="icons/Pathfinding_Dirty.png" preload="false" />
- <texture name="Pathfinding_Disabled" file_name="icons/Pathfinding_Disabled.png" preload="false" />
-
- <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
- <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
- <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
- <texture name="Person_Check" file_name="icons/Person_Check.png" preload="false" />
- <texture name="Person_Star" file_name="icons/Person_Star.png" preload="false" />
-
- <texture name="Permission_Visible_Online" file_name="icons/see_me_online.png" preload="false" />
- <texture name="Permission_Visible_Map" file_name="icons/see_on_map.png" preload="false" />
- <texture name="Permission_Edit_Objects_Mine" file_name="icons/edit_mine.png" preload="false" />
- <texture name="Permission_Edit_Objects_Theirs" file_name="icons/edit_theirs.png" preload="false" />
-
- <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
- <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
- <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
-
- <texture name="Profile_Badge_Beta" file_name="icons/profile_badge_beta.png" preload="true"/>
- <texture name="Profile_Badge_Beta_Lifetime" file_name="icons/profile_badge_beta_lifetime.png" preload="true"/>
- <texture name="Profile_Badge_Lifetime" file_name="icons/profile_badge_lifetime.png" preload="true"/>
- <texture name="Profile_Badge_Linden" file_name="icons/profile_badge_linden.png" preload="true"/>
- <texture name="Profile_Badge_Pplus_Lifetime" file_name="icons/profile_badge_pplus_lifetime.png" preload="true"/>
- <texture name="Profile_Badge_Premium_Lifetime" file_name="icons/profile_badge_premium_lifetime.png" preload="true"/>
- <texture name="Profile_Group_Visibility_Off" file_name="icons/profile_group_visibility_eye_off.png" preload="true"/>
- <texture name="Profile_Group_Visibility_Off_Pressed" file_name="icons/profile_group_visibility_eye_off_pressed.png" preload="true"/>
- <texture name="Profile_Group_Visibility_On" file_name="icons/profile_group_visibility_eye_on.png" preload="true"/>
- <texture name="Profile_Group_Visibility_On_Pressed" file_name="icons/profile_group_visibility_eye_on_pressed.png" preload="true"/>
- <texture name="Profile_Friend_Offline" file_name="icons/Profile_Friend_Offline.png" preload="true"/>
- <texture name="Profile_Friend_Online" file_name="icons/Profile_Friend_Online.png" preload="true"/>
- <texture name="Profile_Perm_Find_Disabled" file_name="icons/Profile_Perm_Find_Disabled.png" preload="true"/>
- <texture name="Profile_Perm_Find_Enabled" file_name="icons/Profile_Perm_Find_Enabled.png" preload="true"/>
- <texture name="Profile_Perm_Objects_Disabled" file_name="icons/Profile_Perm_Objects_Disabled.png" preload="true"/>
- <texture name="Profile_Perm_Objects_Enabled" file_name="icons/Profile_Perm_Objects_Enabled.png" preload="true"/>
- <texture name="Profile_Perm_Online_Disabled" file_name="icons/Profile_Perm_Online_Disabled.png" preload="true"/>
- <texture name="Profile_Perm_Online_Enabled" file_name="icons/Profile_Perm_Online_Enabled.png" preload="true"/>
-
- <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
- <texture name="ProgressBarSolid" file_name="widgets/ProgressBarSolid.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
- <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" />
-
- <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
-
- <texture name="PushButton_Login" file_name="widgets/PushButton_Login.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Login_Over" file_name="widgets/PushButton_Login_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Login_Pressed" file_name="widgets/PushButton_Login_Pressed.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
-
-
- <texture name="RadioButton_Press" file_name="widgets/RadioButton_Press.png" preload="true" />
- <texture name="RadioButton_On_Press" file_name="widgets/RadioButton_On_Press.png" preload="true" />
- <texture name="RadioButton_Off" file_name="widgets/RadioButton_Off.png" preload="true" />
- <texture name="RadioButton_On" file_name="widgets/RadioButton_On.png" preload="true" />
- <texture name="RadioButton_Disabled" file_name="widgets/RadioButton_Disabled.png" preload="true" />
- <texture name="RadioButton_On_Disabled" file_name="widgets/RadioButton_On_Disabled.png" preload="true" />
-
-
- <texture name="Refresh_Off" file_name="icons/Refresh_Off.png" preload="true" />
-
- <texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" />
-
- <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="58" scale.bottom="6" />
- <texture name="Rounded_Rect_Top" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="8" scale.right="58" scale.bottom="0" clip.left="0" clip.right="64" clip.bottom="16" clip.top="32" />
- <texture name="Rounded_Rect_Bottom" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="16" scale.right="58" scale.bottom="8" clip.left="0" clip.right="64" clip.bottom="0" clip.top="16" />
- <texture name="Rounded_Rect_Left" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="32" scale.bottom="6" clip.left="0" clip.right="32" clip.bottom="0" clip.top="32" />
- <texture name="Rounded_Rect_Right" file_name="Rounded_Rect.png" preload="true" scale.left="0" scale.top="26" scale.right="26" scale.bottom="6" clip.left="32" clip.right="64" clip.bottom="0" clip.top="32" />
- <texture name="Rounded_Square" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
- <texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" />
-
- <texture name="ScrollArrow_Down" file_name="widgets/ScrollArrow_Down.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
- <texture name="ScrollArrow_Left" file_name="widgets/ScrollArrow_Left.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
- <texture name="ScrollArrow_Right" file_name="widgets/ScrollArrow_Right.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
- <texture name="ScrollArrow_Up" file_name="widgets/ScrollArrow_Up.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
-
- <texture name="ScrollThumb_Horiz" file_name="widgets/ScrollThumb_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
- <texture name="ScrollThumb_Vert" file_name="widgets/ScrollThumb_Vert.png" preload="true" scale.left="4" scale.top="53" scale.bottom="10" scale.right="4" />
- <texture name="ScrollTrack_Vert" file_name="widgets/ScrollTrack_Vert.png" preload="true" scale.left="2" scale.top="40" scale.bottom="13" scale.right="0" />
- <texture name="ScrollTrack_Horiz" file_name="widgets/ScrollTrack_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
-
-
- <texture name="Search" file_name="navbar/Search.png" preload="false" />
-
- <texture name="Search_Icon" file_name="icons/Search_Icon.png" preload="false" />
-
- <texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Left_Selected_Over" file_name="widgets/SegmentedBtn_Left_Selected_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Left_Selected_Press" file_name="widgets/SegmentedBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Left_Selected_Disabled" file_name="widgets/SegmentedBtn_Left_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
-
- <texture name="SegmentedBtn_Middle_Disabled" file_name="widgets/SegmentedBtn_Middle_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Middle_Selected" file_name="widgets/SegmentedBtn_Middle_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Middle_Selected_Press" file_name="widgets/SegmentedBtn_Middle_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Middle_Selected_Disabled" file_name="widgets/SegmentedBtn_Middle_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
-
- <texture name="SegmentedBtn_Right_Off" file_name="widgets/SegmentedBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Right_Over" file_name="widgets/SegmentedBtn_Right_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Right_Press" file_name="widgets/SegmentedBtn_Right_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Right_Disabled" file_name="widgets/SegmentedBtn_Right_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Right_Selected" file_name="widgets/SegmentedBtn_Right_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
-
- <texture name="Shirt_Large" file_name="icons/Shirt_Large.png" preload="false" />
-
- <texture name="Sidebar_Icon_Dock_Foreground" file_name="taskpanel/Sidebar_Icon_Dock_Foreground.png" preload="false" />
- <texture name="Sidebar_Icon_Dock_Press" file_name="taskpanel/Sidebar_Icon_Dock_Press.png" preload="false" />
- <texture name="Sidebar_Icon_Undock_Foreground" file_name="taskpanel/Sidebar_Icon_Undock_Foreground.png" preload="false" />
- <texture name="Sidebar_Icon_Undock_Press" file_name="taskpanel/Sidebar_Icon_Undock_Press.png" preload="false" />
-
- <texture name="Shop" file_name="icons/Shop.png" preload="false" />
-
- <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
- <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" />
-
- <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
- <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
- <texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" />
- <texture name="SliderThumb_Disabled" file_name="widgets/SliderThumb_Disabled.png" />
- <texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" />
-
- <texture name="SL_Logo" file_name="icons/MP_Logo.png" preload="true" />
- <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" />
- <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" />
-
- <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" />
- <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" />
- <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" />
- <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" />
- <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
-
- <texture name="login_mp_logo" file_name="windows/login_mp_logo.png" preload="true" />
- <texture name="login_mp_logo_small" file_name="windows/login_mp_logo_small.png" preload="true" />
- <texture name="first_login_image" file_name="windows/first_login_image.jpg" preload="true" />
-
- <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" />
- <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" />
- <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" />
- <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />
-
- <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="true" />
- <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
- <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
-
- <texture name="Sync_Disabled" file_name="icons/Sync_Disabled.png" preload="true" />
- <texture name="Sync_Enabled" file_name="icons/Sync_Enabled.png" preload="true" />
- <texture name="Sync_Progress_1" file_name="icons/Sync_Progress_1.png" preload="true" />
- <texture name="Sync_Progress_2" file_name="icons/Sync_Progress_2.png" preload="true" />
- <texture name="Sync_Progress_3" file_name="icons/Sync_Progress_3.png" preload="true" />
- <texture name="Sync_Progress_4" file_name="icons/Sync_Progress_4.png" preload="true" />
- <texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" />
- <texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" />
-
- <texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />
- <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" />
- <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" />
- <texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" />
- <texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" />
- <texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" />
- <texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" />
-
- <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
- <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
- <texture name="TabTop_Right_Flashing" file_name="containers/TabTop_Right_Flashing.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
- <texture name="TabTop_Middle_Off" file_name="containers/TabTop_Middle_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
- <texture name="TabTop_Middle_Selected" file_name="containers/TabTop_Middle_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
- <texture name="TabTop_Left_Off" file_name="containers/TabTop_Left_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
- <texture name="TabTop_Left_Selected" file_name="containers/TabTop_Left_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
-
- <texture name="TaskPanel_Tab_Off" file_name="taskpanel/TaskPanel_Tab_Off.png" preload="false" scale.left="4" scale.top="29" scale.right="36" scale.bottom="4" />
- <texture name="TaskPanel_Tab_Selected" file_name="taskpanel/TaskPanel_Tab_Selected.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" />
-
- <texture name="TextField_Search_Disabled" file_name="widgets/TextField_Search_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
- <texture name="TextField_Off" file_name="widgets/TextField_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
- <texture name="TextField_Search_Active" file_name="widgets/TextField_Search_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
- <texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
- <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
- <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
- <texture name="TextField_Search_Highlight" file_name="widgets/TextField_Search_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
-
- <texture name="Thumbnail_Fallback" file_name="icons/thumbnail_fallback_icon.png" preload="true" />
-
- <texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" />
- <texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true"
- scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
- <texture name="Toast_Over" file_name="windows/Toast_Over.png" preload="true"
- scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
-
- <texture name="Tool_Create" file_name="build/Tool_Create.png" preload="false" />
- <texture name="Tool_Dozer" file_name="build/Tool_Dozer.png" preload="false" />
- <texture name="Tool_Face" file_name="build/Tool_Face.png" preload="false" />
- <texture name="Tool_Grab" file_name="build/Tool_Grab.png" preload="false" />
- <texture name="Tool_Zoom" file_name="build/Tool_Zoom.png" preload="false" />
-
- <texture name="Toolbar_Left_Flash" file_name="containers/Toolbar_Left_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Left_Over" file_name="containers/Toolbar_Left_Over.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Left_Selected" file_name="containers/Toolbar_Left_Selected.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Middle_Off" file_name="containers/Toolbar_Middle_Off.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Middle_Over" file_name="containers/Toolbar_Middle_Over.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Middle_Selected" file_name="containers/Toolbar_Middle_Selected.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Middle_Flash" file_name="containers/Toolbar_Middle_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
- <texture name="Toolbar_Right_Over" file_name="containers/Toolbar_Right_Over.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
- <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
- <texture name="Toolbar_Right_Flash" file_name="containers/Toolbar_Right_Flash.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
-
- <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
-
- <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
- <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
- <texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" />
-
- <texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />
-
- <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" />
-
- <texture name="Video_URL_Off" file_name="icons/Video_URL_Off.png" preload="true" />
-
- <texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120" scale_type="scale_outer"/>
-
- <texture name="VirtualTrackball_Moon_Back" file_name="widgets/track_control_moon_back.png" />
- <texture name="VirtualTrackball_Moon_Front" file_name="widgets/track_control_moon_front.png" />
- <texture name="VirtualTrackball_Rotate_Bottom" file_name="widgets/track_control_rotate_bottom.png" />
- <texture name="VirtualTrackball_Rotate_Left" file_name="widgets/track_control_rotate_left_side.png" />
- <texture name="VirtualTrackball_Rotate_Right" file_name="widgets/track_control_rotate_right_side.png" />
- <texture name="VirtualTrackball_Rotate_Top" file_name="widgets/track_control_rotate_top.png" />
- <texture name="VirtualTrackball_Rotate_Bottom_Active" file_name="widgets/track_control_rotate_bottom_active.png" />
- <texture name="VirtualTrackball_Rotate_Left_Active" file_name="widgets/track_control_rotate_left_side_active.png" />
- <texture name="VirtualTrackball_Rotate_Right_Active" file_name="widgets/track_control_rotate_right_side_active.png" />
- <texture name="VirtualTrackball_Rotate_Top_Active" file_name="widgets/track_control_rotate_top_active.png" />
- <texture name="VirtualTrackball_Sphere" file_name="widgets/track_control_sphere.png" />
- <texture name="VirtualTrackball_Sun_Back" file_name="widgets/track_control_sun_back.png" />
- <texture name="VirtualTrackball_Sun_Front" file_name="widgets/track_control_sun_front.png" />
-
- <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
- scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
-
- <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
- <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
- <texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" />
- <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
- <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
-
- <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
-
- <texture name="Add_Icon" file_name="icons/add_icon.png" preload="false" />
- <texture name="Remove_Icon" file_name="icons/remove_icon.png" preload="false" />
-
- <texture name="Web_Profile_Off" file_name="icons/Web_Profile_Off.png" preload="false" />
-
- <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
-
- <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true"
- scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
- <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true"
- scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
- <texture name="Window_NoTitle_Background" file_name="windows/Window_Background.png" preload="true"
- scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
- <texture name="Window_NoTitle_Foreground" file_name="windows/Window_Foreground.png" preload="true"
- scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
-
- <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
-
- <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
- <texture name="UnZoom_Off" file_name="icons/UnZoom_Off.png" preload="false" />
-
- <texture name="pixiesmall.j2c" use_mips="true" />
- <texture name="script_error.j2c" use_mips="true" />
- <texture name="silhouette.j2c" use_mips="true" />
- <texture name="foot_shadow.j2c" use_mips="true" />
- <texture name="cloud-particle.j2c" use_mips="true" />
- <texture name="transparent.j2c" use_mips="true" />
-
- <!--WARNING OLD ART BELOW *do not use*-->
- <texture name="icn_media_web.tga" preload="true" />
- <texture name="icn_media_movie.tga" preload="true" />
-
- <texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" />
- <texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" />
- <texture name="jump_right_out.tga" file_name="widgets/jump_right_out.png" />
- <texture name="jump_right_in.tga" file_name="widgets/jump_right_in.png" />
-
- <texture name="scrollbutton_left_out_blue.tga" file_name="widgets/ScrollArrow_Left_Opaque.png" />
- <texture name="scrollbutton_left_in_blue.tga" file_name="widgets/ScrollArrow_Left_Over_Opaque.png" />
- <texture name="scrollbutton_right_out_blue.tga" file_name="widgets/ScrollArrow_Right_Opaque.png" />
- <texture name="scrollbutton_right_in_blue.tga" file_name="widgets/ScrollArrow_Right_Over_Opaque.png" />
- <texture name="scrollbutton_up_out_blue.tga" file_name="widgets/ScrollArrow_Up_Opaque.png" />
- <texture name="scrollbutton_up_in_blue.tga" file_name="widgets/ScrollArrow_Up_Over_Opaque.png" />
- <texture name="scrollbutton_down_out_blue.tga" file_name="widgets/ScrollArrow_Down_Opaque.png" />
- <texture name="scrollbutton_down_in_blue.tga" file_name="widgets/ScrollArrow_Down_Over_Opaque.png" />
-
- <texture name="up_arrow.tga" file_name="up_arrow.png" />
- <texture name="down_arrow.tga" file_name="down_arrow.png" />
- <texture name="arrow_down.tga" />
-
- <texture name="tearoffbox.tga" />
- <texture name="tearoff_pressed.tga" />
-
- <texture name="color_swatch_alpha.tga" preload="true" />
-
- <texture name="button_anim_pause.tga" />
- <texture name="button_anim_pause_selected.tga" />
- <texture name="button_anim_play.tga" />
- <texture name="button_anim_play_selected.tga" />
- <texture name="crosshairs.tga" />
- <texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" />
-
- <texture name="icon_avatar_offline.tga" />
- <texture name="icon_avatar_online.tga" />
- <texture name="icon_diurnal.tga" />
- <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />
- <texture name="icon_top_pick.tga" />
-
- <texture name="lag_status_critical.tga" />
- <texture name="lag_status_good.tga" />
- <texture name="lag_status_warning.tga" />
-
- <texture name="legend.tga" />
-
- <texture name="map_avatar_16.tga" />
- <texture name="map_avatar_8.tga" />
- <texture name="map_event.tga" />
- <texture name="map_home.tga" />
- <texture name="map_infohub.tga" />
- <texture name="map_telehub.tga" />
- <texture name="map_track_16.tga" />
- <texture name="map_ui_collapse_icon.png" />
- <texture name="map_ui_expand_icon.png" />
-
- <texture name="notify_caution_icon.tga" />
-
- <texture name="default_land_picture.j2c" />
- <texture name="default_profile_picture.j2c" />
- <texture name="locked_image.j2c" />
- <texture name="badge_note.j2c" />
- <texture name="badge_warn.j2c" />
- <texture name="badge_ok.j2c" />
- <texture name="materials_ui_x_24.png" />
-
- <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" />
- <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" />
- <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" />
- <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" />
- <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" />
- <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" />
- <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" />
- <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" />
- <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" />
- <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" />
- <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" />
- <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" />
-
- <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/>
- <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
- <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
- <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
-
- <texture name="hint_background" file_name="windows/hint_background.png" preload="false" scale.left="8" scale.top="70" scale.right="195" scale.bottom="11"/>
- <texture name="hint_arrow_left" file_name="windows/hint_arrow_left.png" preload="false"/>
- <texture name="hint_arrow_right" file_name="windows/hint_arrow_right.png" preload="false"/>
- <texture name="hint_arrow_up" file_name="windows/hint_arrow_up.png" preload="false"/>
- <texture name="hint_arrow_down" file_name="windows/hint_arrow_down.png" preload="false"/>
- <texture name="hint_arrow_lower_left" file_name="windows/hint_arrow_lower_left.png" preload="false"/>
-
- <texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>
- <texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>
- <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
- <texture name="NavBar Separator" file_name="navbar/separator.png"/>
-
- <texture name="Default_Outfit_Photo" file_name="icons/Default_Outfit_Photo.png" preload="true"/>
- <texture name="Notification_Condense" file_name="icons/Icon_Notification_Condense.png" preload="true"/>
- <texture name="Notification_Expand" file_name="icons/Icon_Notification_Expand.png" preload="true"/>
- <texture name="System_Notification" file_name="icons/MP_Logo.png" preload="true"/>
- <texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/>
- <texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/>
-
- <texture name="Single_Folder_Mode" file_name="icons/single_folder_mode.png" preload="true"/>
- <texture name="Multi_Folder_Mode" file_name="icons/multi_folder_mode.png" preload="true"/>
- <texture name="Single_Folder_Back" file_name="icons/single_folder_back.png" preload="true"/>
- <texture name="Single_Folder_Forward" file_name="icons/single_folder_forward.png" preload="true"/>
- <texture name="Single_Folder_Up" file_name="icons/single_folder_up.png" preload="true"/>
- <texture name="Icon_Color_Palette" file_name="icons/Icon_Color_Palette.png" preload="false"/>
- <texture name="Icon_Font_Size" file_name="icons/Icon_Font_Size.png" preload="false"/>
-
- <texture name="Icon_Place" file_name="megapahit/icon_place.png" preload="false" />
- <texture name="Icon_Auction" file_name="megapahit/icon_land_auction.png" preload="false" />
- <texture name="Icon_For_Sale" file_name="megapahit/icon_land_forsale.png" preload="false" />
- <texture name="Icon_Group" file_name="megapahit/icon_group.png" preload="false" />
- <texture name="Icon_Legacy_Event_PG" file_name="icons/Parcel_PG_Dark.png" preload="false" />
- <texture name="Icon_Legacy_Event_Mature" file_name="icons/Parcel_M_Dark.png" preload="false" />
- <texture name="Icon_Legacy_Event_Adult" file_name="icons/Parcel_R_Dark.png" preload="false" />
-
- <texture name="ProgressLarge_1" file_name="icons/ProgressLarge_1.png" preload="true" />
- <texture name="ProgressLarge_2" file_name="icons/ProgressLarge_2.png" preload="true" />
- <texture name="ProgressLarge_3" file_name="icons/ProgressLarge_3.png" preload="true" />
- <texture name="ProgressLarge_4" file_name="icons/ProgressLarge_4.png" preload="true" />
- <texture name="ProgressLarge_5" file_name="icons/ProgressLarge_5.png" preload="true" />
- <texture name="ProgressLarge_6" file_name="icons/ProgressLarge_6.png" preload="true" />
- <texture name="ProgressLarge_7" file_name="icons/ProgressLarge_7.png" preload="true" />
- <texture name="ProgressLarge_8" file_name="icons/ProgressLarge_8.png" preload="true" />
- <texture name="ProgressLarge_9" file_name="icons/ProgressLarge_9.png" preload="true" />
- <texture name="ProgressLarge_10" file_name="icons/ProgressLarge_10.png" preload="true" />
- <texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" />
- <texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" />
-
-</textures>
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_sphere.png b/indra/newview/skins/contrast/textures/widgets/track_control_sphere.png
deleted file mode 100644
index 6ba8d3877f..0000000000
--- a/indra/newview/skins/contrast/textures/widgets/track_control_sphere.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/colors.xml b/indra/newview/skins/contrast_gold/colors.xml
new file mode 100644
index 0000000000..7249e4e6eb
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/colors.xml
@@ -0,0 +1,1001 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<colors>
+
+ <!-- Named Colors -->
+ <color
+ name="EmphasisColor"
+ value="0.857 0.668 0.308 1" />
+ <color
+ name="EmphasisColor_13"
+ value="0.857 0.668 0.308 0.13" />
+ <color
+ name="EmphasisColor_35"
+ value="0.857 0.668 0.308 0.35" />
+ <color
+ name="BeaconColor"
+ value="0.857 0.668 0.308 1" />
+ <color
+ name="White"
+ value="1 1 1 1" />
+ <color
+ name="White_05"
+ value="1 1 1 0.05" />
+ <color
+ name="White_10"
+ value="1 1 1 0.1" />
+ <color
+ name="White_25"
+ value="1 1 1 0.25" />
+ <color
+ name="White_50"
+ value="1 1 1 0.5" />
+ <color
+ name="LtGray"
+ value="0.7 0.7 0.7 1" />
+ <color
+ name="LtGray_35"
+ value="0.7 0.7 0.7 0.35" />
+ <color
+ name="LtGray_50"
+ value="0.7 0.7 0.7 0.50" />
+ <color
+ name="Gray"
+ value="0.4 0.4 0.4 1" />
+ <color
+ name="DkGray0"
+ value="0.05 0.05 0.05 1" />
+ <color
+ name="DkGray"
+ value="0.08 0.08 0.08 1" />
+ <color
+ name="DkGray_66"
+ value="0.08 0.08 0.08 .66" />
+ <color
+ name="DkGray2"
+ value="0.1 0.1 0.1 1" />
+ <color
+ name="MouseGray"
+ value="0.12 0.12 0.12 1" />
+ <color
+ name="Black"
+ value="0 0 0 1" />
+ <color
+ name="Black_10"
+ value="0 0 0 0.1" />
+ <color
+ name="Black_25"
+ value="0 0 0 0.25" />
+ <color
+ name="Black_50"
+ value="0 0 0 0.5" />
+ <color
+ name="FrogGreen"
+ value="0.26 0.33 0.42 1" />
+ <!-- ^(Not actually green) -->
+ <color
+ name="Red"
+ value="1 0 0 1" />
+ <color
+ name="Blue"
+ value="0 0 1 1" />
+ <color
+ name="Yellow"
+ value="1 1 0 1" />
+ <color
+ name="Green"
+ value="0 1 0 1" />
+ <color
+ name="Transparent"
+ value="0 0 0 0" />
+ <color
+ name="Purple"
+ value="1 0 1 1" />
+ <color
+ name="Lime"
+ value=".8 1 .73 1" />
+ <color
+ name="LtYellow"
+ value="1 1 .79 1" />
+ <color
+ name="DrYellow"
+ value="1 0.86 0 1" />
+ <color
+ name="LtOrange"
+ value="1 .85 .73 1" />
+ <color
+ name="MdBlue"
+ value=".07 .38 .51 1" />
+ <color
+ name="DkBlue"
+ value=".06 .06 .3 1" />
+ <color
+ name="LtRed"
+ value="1 0.2 0.2 1" />
+ <color
+ name="LtGreen"
+ value="0.2 1 0.2 1" />
+ <color
+ name="Red_80"
+ value="1 0 0 0.8" />
+ <color
+ name="DkRed"
+ value="0.3 0.06 0.06 1" />
+ <color
+ name="Green_80"
+ value="0 1 0 0.8" />
+ <color
+ name="Blue_80"
+ value="0 0 1 0.8" />
+ <color
+ name="Orange"
+ value="1 .82 .46 1" />
+
+ <!-- This color name makes potentially unused colors show up bright purple.
+ Leave this here until all Unused? are removed below, otherwise
+ the viewer generates many warnings on startup. -->
+ <color
+ name="Unused?"
+ value=".831 1 0 1" />
+
+ <!-- UI Definitions -->
+
+ <color
+ name="AccordionHeaderTextColor"
+ reference="Gray" />
+ <color
+ name="AgentChatColor"
+ reference="White" />
+ <color
+ name="AlertBoxColor"
+ value="0.24 0.24 0.24 1" />
+ <color
+ name="AlertCautionBoxColor"
+ value="1 0.82 0.46 1" />
+ <color
+ name="AlertCautionTextColor"
+ reference="LtYellow" />
+ <color
+ name="AvatarListItemIconDefaultColor"
+ reference="White" />
+ <color
+ name="AvatarListItemIconOnlineColor"
+ reference="White" />
+ <color
+ name="AvatarListItemIconOfflineColor"
+ value="0.5 0.5 0.5 0.5" />
+ <color
+ name="AvatarListItemIconVoiceInvitedColor"
+ reference="AvatarListItemIconOfflineColor" />
+ <color
+ name="AvatarListItemIconVoiceJoinedColor"
+ reference="AvatarListItemIconOnlineColor" />
+ <color
+ name="AvatarListItemIconVoiceLeftColor"
+ reference="AvatarListItemIconOfflineColor" />
+ <color
+ name="BadgeImageColor"
+ value="1.0 0.40 0.0 1.0" />
+ <color
+ name="BadgeBorderColor"
+ value="0.9 0.9 0.9 1.0" />
+ <color
+ name="BadgeLabelColor"
+ reference="White" />
+ <color
+ name="ButtonBorderColor"
+ reference="Unused?" />
+ <color
+ name="ButtonCautionImageColor"
+ reference="Unused?" />
+ <color
+ name="ButtonColor"
+ reference="Unused?" />
+ <color
+ name="ButtonFlashBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonImageColor"
+ reference="White" />
+ <color
+ name="ButtonLabelColor"
+ reference="LtGray" />
+ <color
+ name="ButtonLabelDisabledColor"
+ reference="White_25" />
+ <color
+ name="ButtonLabelSelectedColor"
+ reference="White" />
+ <color
+ name="ButtonLabelSelectedDisabledColor"
+ reference="White_25" />
+ <color
+ name="ButtonSelectedBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonSelectedColor"
+ reference="Unused?" />
+ <color
+ name="ButtonUnselectedBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonUnselectedFgColor"
+ reference="Unused?" />
+ <color
+ name="ChatHistoryBgColor"
+ reference="Transparent" />
+ <color
+ name="ChatHistoryTextColor"
+ reference="LtGray" />
+ <color
+ name="ChicletFlashColor"
+ value="0.114 0.65 0.1" />
+ <color
+ name="ColorDropShadow"
+ reference="Black_50" />
+ <color
+ name="ColorPaletteEntry01"
+ reference="Black" />
+ <color
+ name="ColorPaletteEntry02"
+ reference="Gray" />
+ <color
+ name="ColorPaletteEntry03"
+ value="0.5 0 0 1" />
+ <color
+ name="ColorPaletteEntry04"
+ value="0.5 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry05"
+ value="0 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry06"
+ value="0 0.5 0.5 1" />
+ <color
+ name="ColorPaletteEntry07"
+ value="0 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry08"
+ value="0.5 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry09"
+ value="0.5 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry10"
+ value="0 0.25 0.25 1" />
+ <color
+ name="ColorPaletteEntry11"
+ value="0 0.5 1 1" />
+ <color
+ name="ColorPaletteEntry12"
+ value="0 0.25 0.5 1" />
+ <color
+ name="ColorPaletteEntry13"
+ value="0.5 0 1 1" />
+ <color
+ name="ColorPaletteEntry14"
+ value="0.5 0.25 0 1" />
+ <color
+ name="ColorPaletteEntry15"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry16"
+ reference="LtYellow" />
+ <color
+ name="ColorPaletteEntry17"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry18"
+ reference="LtGray" />
+ <color
+ name="ColorPaletteEntry19"
+ reference="Red" />
+ <color
+ name="ColorPaletteEntry20"
+ reference="Yellow" />
+ <color
+ name="ColorPaletteEntry21"
+ reference="Green" />
+ <color
+ name="ColorPaletteEntry22"
+ value="0 1 1 1" />
+ <color
+ name="ColorPaletteEntry23"
+ reference="Blue" />
+ <color
+ name="ColorPaletteEntry24"
+ reference="Purple" />
+ <color
+ name="ColorPaletteEntry25"
+ value="1 1 0.5 1" />
+ <color
+ name="ColorPaletteEntry26"
+ value="0 1 0.5 1" />
+ <color
+ name="ColorPaletteEntry27"
+ value="0.5 1 1 1" />
+ <color
+ name="ColorPaletteEntry28"
+ value="0.5 0.5 1 1" />
+ <color
+ name="ColorPaletteEntry29"
+ value="1 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry30"
+ value="1 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry31"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry32"
+ reference="White" />
+ <color
+ name="ComboListBgColor"
+ reference="DkGray" />
+ <color
+ name="ConsoleBackground"
+ reference="Black" />
+ <color
+ name="ContextSilhouetteColor"
+ reference="EmphasisColor" />
+ <color
+ name="ConversationFriendColor"
+ value="0.5 0.7 0.85 1" />
+ <color
+ name="DefaultHighlightDark"
+ reference="White_10" />
+ <color
+ name="DefaultHighlightLight"
+ reference="White_25" />
+ <color
+ name="DefaultShadowDark"
+ reference="Black_50" />
+ <color
+ name="DefaultShadowLight"
+ reference="Black_50" />
+ <color
+ name="EffectColor"
+ reference="White" />
+ <color
+ name="FilterBackgroundColor"
+ reference="Black" />
+ <color
+ name="FilterTextColor"
+ reference="EmphasisColor" />
+ <color
+ name="FloaterButtonImageColor"
+ reference="Gray" />
+ <color
+ name="FloaterDefaultBackgroundColor"
+ reference="DkGray_66" />
+ <color
+ name="FloaterFocusBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="FloaterFocusBorderColor"
+ reference="Black_50" />
+ <color
+ name="FloaterUnfocusBorderColor"
+ reference="Black_50" />
+ <color
+ name="FocusColor"
+ reference="EmphasisColor" />
+ <color
+ name="FolderViewLoadingMessageTextColor"
+ value="0.3344 0.545 0.645 1" />
+ <color
+ name="FpsTextColor"
+ value="0.34 0.51 0.64 0.8" />
+ <color
+ name="GridFocusPointColor"
+ reference="White_50" />
+ <color
+ name="GridlineBGColor"
+ value="0.92 0.92 1 0.78" />
+ <color
+ name="GridlineColor"
+ reference="White" />
+ <color
+ name="GridlineShadowColor"
+ value="0 0 0 0.31" />
+ <color
+ name="GroupNotifyBoxColor"
+ value="0.3344 0.5456 0.5159 1" />
+ <color
+ name="GroupNotifyTextColor"
+ reference="White"/>
+ <color
+ name="GroupNotifyDimmedTextColor"
+ reference="LtGray" />
+ <color
+ name="GroupOverTierColor"
+ value="0.43 0.06 0.06 1" />
+ <color
+ name="HTMLLinkColor"
+ reference="EmphasisColor" />
+ <color
+ name="HealthTextColor"
+ reference="White" />
+ <color
+ name="HelpBgColor"
+ reference="Unused?" />
+ <color
+ name="HelpFgColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollHighlightColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollShadowColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollThumbColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollTrackColor"
+ reference="Unused?" />
+ <color
+ name="HighlightChildColor"
+ reference="Yellow" />
+ <color
+ name="HighlightInspectColor"
+ value="1 0 1 1" />
+ <color
+ name="HighlightParentColor"
+ value="0.5 0.65 0.8 1" />
+ <color
+ name="IMHistoryBgColor"
+ reference="Unused?" />
+ <color
+ name="IMHistoryTextColor"
+ reference="Unused?" />
+ <color
+ name="IconDisabledColor"
+ reference="White_25" />
+ <color
+ name="IconEnabledColor"
+ reference="White" />
+ <color
+ name="InventoryBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="InventoryFocusOutlineColor"
+ reference="White_25" />
+ <color
+ name="InventoryItemSuffixColor"
+ reference="White_25" />
+ <color
+ name="InventoryItemLibraryColor"
+ reference="EmphasisColor" />
+ <color
+ name="InventoryItemLinkColor"
+ reference="LtGray_50" />
+ <color
+ name="InventoryMouseOverColor"
+ reference="LtGray_35" />
+ <color
+ name="InventorySearchStatusColor"
+ reference="EmphasisColor" />
+ <color
+ name="LabelDisabledColor"
+ reference="White_25" />
+ <color
+ name="LabelSelectedColor"
+ reference="White" />
+ <color
+ name="LabelSelectedDisabledColor"
+ reference="White_25" />
+ <color
+ name="LabelTextColor"
+ reference="LtGray" />
+ <color
+ name="LoginProgressBarBgColor"
+ reference="Unused?" />
+ <color
+ name="LoginProgressBarFgColor"
+ reference="Unused?" />
+ <color
+ name="LoginProgressBoxBorderColor"
+ value="0.857 0.668 0.308 0" />
+ <color
+ name="LoginProgressBoxCenterColor"
+ value="0 0 0 0.78" />
+ <color
+ name="LoginProgressBoxShadowColor"
+ value="0 0 0 0.78" />
+ <color
+ name="LoginProgressBoxTextColor"
+ reference="White" />
+ <color
+ name="MapAvatarColor"
+ reference="White" />
+ <color
+ name="MapAvatarFriendColor"
+ value="0.5 0.7 0.85 1" />
+ <color
+ name="MapAvatarSelfColor"
+ value="0.53125 0 0.498047 1" />
+ <color
+ name="MapFrustumColor"
+ reference="White_10" />
+ <color
+ name="MapParcelOutlineColor"
+ value="1 1 1 0.5" />
+ <color
+ name="MapTrackColor"
+ reference="Red" />
+ <color
+ name="MapTrackColorUnder"
+ reference="Blue" />
+ <color
+ name="MapTrackDisabledColor"
+ value="0.5 0 0 1" />
+ <color
+ name="MenuBarBgColor"
+ reference="MouseGray" />
+ <color
+ name="MenuBarGodBgColor"
+ reference="FrogGreen" />
+ <color
+ name="MenuDefaultBgColor"
+ reference="DkGray2" />
+ <color
+ name="MenuItemDisabledColor"
+ reference="LtGray_50" />
+ <color
+ name="MenuItemEnabledColor"
+ reference="LtGray" />
+ <color
+ name="MenuItemHighlightBgColor"
+ reference="EmphasisColor_35" />
+ <color
+ name="MenuItemFlashBgColor"
+ reference="BeaconColor" />
+ <color
+ name="MenuItemHighlightFgColor"
+ reference="White" />
+ <color
+ name="MenuNonProductionBgColor"
+ reference="Black" />
+ <color
+ name="MenuNonProductionGodBgColor"
+ value="0.263 0.325 0.345 1" />
+ <color
+ name="MenuPopupBgColor"
+ reference="DkGray2" />
+ <color
+ name="ModelUploaderLabels"
+ value="1 0.6 0 1" />
+ <color
+ name="MultiSliderDisabledThumbColor"
+ reference="Black" />
+ <color
+ name="MultiSliderThumbCenterColor"
+ reference="White" />
+ <color
+ name="MultiSliderThumbCenterSelectedColor"
+ reference="Green" />
+ <color
+ name="MultiSliderThumbOutlineColor"
+ reference="Unused?" />
+ <color
+ name="MultiSliderTrackColor"
+ reference="LtGray" />
+ <color
+ name="MultiSliderTriangleColor"
+ reference="Yellow" />
+ <!--
+ <color
+ name="NameTagBackground"
+ value="0.85 0.85 0.85 0.80" />
+ -->
+ <color
+ name="NameTagBackground"
+ value="0 0 0 1" />
+ <color
+ name="NameTagChat"
+ reference="White" />
+ <color
+ name="NameTagFriend"
+ value="0.5 0.7 0.85 1" />
+ <color
+ name="NameTagLegacy"
+ reference="White" />
+ <color
+ name="NameTagMatch"
+ reference="White" />
+ <color
+ name="NameTagMismatch"
+ reference="White" />
+ <color
+ name="NetMapBackgroundColor"
+ value="0 0 0 1" />
+ <color
+ name="NetMapGroupOwnAboveWater"
+ value="0.85 0 0.85 1" />
+ <color
+ name="NetMapGroupOwnBelowWater"
+ value="0.63 0 0.63 1" />
+ <color
+ name="NetMapOtherOwnAboveWater"
+ value="0.24 0.24 0.24 1" />
+ <color
+ name="NetMapOtherOwnBelowWater"
+ value="0.12 0.12 0.12 1" />
+ <color
+ name="NetMapYouOwnAboveWater"
+ value="0 0.85 0.85 1" />
+ <color
+ name="NetMapYouOwnBelowWater"
+ value="0 0.63 0.63 1" />
+ <color
+ name="NotifyBoxColor"
+ value="LtGray" />
+ <color
+ name="NotifyCautionBoxColor"
+ value="1 0.82 0.46 1" />
+ <color
+ name="NotifyCautionWarnColor"
+ reference="White" />
+ <color
+ name="NotifyTextColor"
+ reference="White" />
+ <color
+ name="ObjectBubbleColor"
+ reference="DkGray_66" />
+ <color
+ name="ObjectChatColor"
+ reference="LtYellow" />
+ <color
+ name="OverdrivenColor"
+ reference="Red" />
+ <color
+ name="PanelDefaultBackgroundColor"
+ reference="DkGray" />
+ <color
+ name="PanelDefaultHighlightLight"
+ reference="White_50" />
+ <color
+ name="PanelFocusBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="PanelNotificationBackground"
+ value="1 0.3 0.3 0" />
+ <color
+ name="ParcelHoverColor"
+ reference="White" />
+ <color
+ name="PathfindingErrorColor"
+ reference="LtRed" />
+ <color
+ name="PathfindingWarningColor"
+ reference="DrYellow" />
+ <color
+ name="PathfindingGoodColor"
+ reference="LtGreen" />
+ <color
+ name="MaterialErrorColor"
+ reference="LtRed" />
+ <color
+ name="MaterialWarningColor"
+ reference="DrYellow" />
+ <color
+ name="MaterialGoodColor"
+ reference="LtGreen" />
+ <color
+ name="PathfindingDefaultBeaconColor"
+ reference="Red_80" />
+ <color
+ name="PathfindingDefaultBeaconTextColor"
+ reference="White" />
+ <color
+ name="PathfindingLinksetBeaconColor"
+ reference="Blue_80" />
+ <color
+ name="PathfindingCharacterBeaconColor"
+ reference="Red_80" />
+ <color
+ name="PieMenuBgColor"
+ value="0.24 0.24 0.24 0.59" />
+ <color
+ name="PieMenuLineColor"
+ value="0 0 0 0.5" />
+ <color
+ name="PieMenuSelectedColor"
+ value="0.72 0.72 0.74 0.3" />
+ <color
+ name="PropertyColorAuction"
+ value="0.5 0 1 0.4" />
+ <color
+ name="PropertyColorAvail"
+ reference="Transparent" />
+ <color
+ name="PropertyColorForSale"
+ value="1 0.5 0 0.4" />
+ <color
+ name="PropertyColorGroup"
+ value="0 0.72 0.72 0.4" />
+ <color
+ name="PropertyColorOther"
+ value="1 0 0 0.4" />
+ <color
+ name="PropertyColorSelf"
+ value="0 1 0 0.4" />
+ <color
+ name="ScriptBgReadOnlyColor"
+ value="0.39 0.39 0.39 1" />
+ <color
+ name="ScriptErrorColor"
+ reference="Red" />
+ <color
+ name="ScrollBGStripeColor"
+ reference="Transparent" />
+ <color
+ name="ScrollBgReadOnlyColor"
+ reference="Transparent" />
+ <color
+ name="ScrollBgWriteableColor"
+ reference="White_05" />
+ <color
+ name="ScrollDisabledColor"
+ reference="White_25" />
+ <color
+ name="ScrollHighlightedColor"
+ reference="Unused?" />
+ <color
+ name="ScrollHoveredColor"
+ reference="EmphasisColor_13" />
+ <color
+ name="ScrollSelectedBGColor"
+ reference="EmphasisColor_35" />
+ <color
+ name="ScrollSelectedFGColor"
+ reference="White" />
+ <color
+ name="ScrollUnselectedColor"
+ reference="LtGray" />
+ <color
+ name="ScrollbarThumbColor"
+ reference="White" />
+ <color
+ name="ScrollbarTrackColor"
+ reference="Black" />
+ <color
+ name="SelectedOutfitTextColor"
+ reference="EmphasisColor" />
+ <color
+ name="SilhouetteChildColor"
+ value="0.13 0.42 0.77 1" />
+ <color
+ name="SilhouetteParentColor"
+ reference="Yellow" />
+ <color
+ name="SliderDisabledThumbColor"
+ reference="White_25" />
+ <color
+ name="SliderThumbCenterColor"
+ reference="White" />
+ <color
+ name="SliderThumbOutlineColor"
+ reference="White" />
+ <color
+ name="SliderTrackColor"
+ reference="Unused?" />
+ <color
+ name="SpeakingColor"
+ reference="FrogGreen" />
+ <color
+ name="SystemChatColor"
+ reference="LtGray" />
+ <color
+ name="TextBgFocusColor"
+ reference="White" />
+ <color
+ name="TextBgReadOnlyColor"
+ reference="White_05" />
+ <color
+ name="TextBgWriteableColor"
+ reference="LtGray" />
+ <color
+ name="TextCursorColor"
+ reference="Black" />
+ <color
+ name="TextDefaultColor"
+ reference="Black" />
+ <color
+ name="TextEmbeddedItemColor"
+ value="0 0 0.5 1" />
+ <color
+ name="TextEmbeddedItemReadOnlyColor"
+ reference="Unused?" />
+ <color
+ name="TextFgColor"
+ value="0.102 0.102 0.102 1" />
+ <color
+ name="TextFgReadOnlyColor"
+ reference="LtGray" />
+ <color
+ name="TextFgTentativeColor"
+ value="0.4 0.4 0.4 1" />
+ <color
+ name="TimeTextColor"
+ reference="LtGray" />
+ <color
+ name="TitleBarFocusColor"
+ reference="White_10" />
+ <color
+ name="ToastBackground"
+ value="0.15 0.15 0.15 0" />
+ <color
+ name="ToolTipBgColor"
+ value="0.937 0.89 0.655 1" />
+ <color
+ name="ToolTipBorderColor"
+ value="0.812 0.753 0.451 1" />
+ <color
+ name="ToolTipTextColor"
+ reference="DkGray2" />
+ <color
+ name="InspectorTipTextColor"
+ reference="LtGray" />
+ <color
+ name="UserChatColor"
+ reference="White" />
+ <color
+ name="llOwnerSayChatColor"
+ reference="LtOrange" />
+
+ <!-- New Colors -->
+ <color
+ name="OutputMonitorMutedColor"
+ reference="DkGray2" />
+ <color
+ name="SysWellItemUnselected"
+ value="0 0 0 0" />
+ <color
+ name="SysWellItemSelected"
+ value="0.3 0.3 0.3 1.0" />
+ <color
+ name="ColorSwatchBorderColor"
+ value="0.45098 0.517647 0.607843 1"/>
+ <color
+ name="ChatTeleportSeparatorColor"
+ reference="Black" />
+ <color
+ name="ChatTimestampColor"
+ reference="White" />
+ <color
+ name="MenuBarBetaBgColor"
+ reference="DkBlue" />
+ <color
+ name="MenuBarProjectBgColor"
+ reference="MdBlue" />
+ <color
+ name="MenuBarTestBgColor"
+ reference="DkRed" />
+ <color
+ name="MeshImportTableNormalColor"
+ value="1 1 1 1"/>
+ <color
+ name="MeshImportTableHighlightColor"
+ value="0.2 0.8 1 1"/>
+
+ <color
+ name="DirectChatColor"
+ reference="LtOrange" />
+
+ <color
+ name="ToolbarDropZoneColor"
+ value=".48 .69 1 .5" />
+ <color
+ name="PanelNotificationListItem"
+ value="0.3 0.3 0.3 .3" />
+
+ <!-- profiles -->
+ <color
+ name="StatusUserOnline"
+ reference="White" />
+ <color
+ name="StatusUserOffline"
+ reference="LtGray_35" />
+ <!-- Groups visible in own profiles -->
+ <color
+ name="GroupVisibleInProfile"
+ reference="TextBgFocusColor" />
+ <color
+ name="GroupHiddenInProfile"
+ reference="Gray" />
+
+
+ <!-- Generic color names (legacy) -->
+ <color
+ name="white"
+ value="1 1 1 1"/>
+ <color
+ name="black"
+ value="0 0 0 1"/>
+ <color
+ name="red"
+ value="1 0 0 1"/>
+ <color
+ name="green"
+ value="0 1 0 1"/>
+ <color
+ name="blue"
+ value="0 0 1 1"/>
+
+ <!--Resize bar colors -->
+
+ <color
+ name="ResizebarBorderLight"
+ value="0.231 0.231 0.231 1"/>
+
+ <color
+ name="ResizebarBorderDark"
+ value="0.133 0.133 0.133 1"/>
+
+ <color
+ name="ResizebarBody"
+ value="0.208 0.208 0.208 1"/>
+
+ <!-- syntax highlighting (LSL Scripts) -->
+ <color
+ name="ScriptText"
+ reference="Black" />
+ <color
+ name="ScriptBackground"
+ reference="White" />
+ <color
+ name="ScriptCursorColor"
+ reference="Black" />
+ <color
+ name="SyntaxLslComment"
+ value="0 0.5 0 1" />
+ <color
+ name="SyntaxLslConstant"
+ value="0 0.6 0.6 1" />
+ <color
+ name="SyntaxLslControlFlow"
+ value="0.4 0 0.8 1" />
+ <color
+ name="SyntaxLslControlLabel"
+ value="0 0 0.8 1" />
+ <color
+ name="SyntaxLslDataType"
+ value="0.8 0.4 0 1" />
+ <color
+ name="SyntaxLslDeprecated"
+ value="0.9 0.0 0.66, 1" />
+ <color
+ name="SyntaxLslEvent"
+ value="0 0.3 0.5 1" />
+ <color
+ name="SyntaxLslFunction"
+ value="0.3 0 0.5 1" />
+ <color
+ name="SyntaxLslGodMode"
+ value="0.7 .2 .35 1" />
+ <color
+ name="SyntaxLslStringLiteral"
+ value="1 0.14 0 1" />
+ <color
+ name="OutfitGalleryItemSelected"
+ reference="EmphasisColor_35" />
+ <color
+ name="OutfitGalleryItemWorn"
+ reference="EmphasisColor_13" />
+ <color
+ name="OutfitGalleryItemUnselected"
+ value="0.4 0.4 0.4 1" />
+ <color
+ name="PanelGray"
+ value="0.27 0.27 0.27 1" />
+ <color
+ name="PerformanceMid"
+ value="1 0.8 0 1" />
+ <color
+ name="OutfitSnapshotMacMask"
+ value="0.115 0.115 0.115 1"/>
+ <color
+ name="OutfitSnapshotMacMask2"
+ value="0.1 0.1 0.1 1"/>
+</colors>
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Center.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Center.png
new file mode 100644
index 0000000000..446daf6a90
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Center.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_In.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_In.png
new file mode 100644
index 0000000000..479c98903e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_In.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Out.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Out.png
new file mode 100644
index 0000000000..cc4e6f99ff
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Out.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Center.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Center.png
new file mode 100644
index 0000000000..dbafbcc9f0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Center.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_In.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_In.png
new file mode 100644
index 0000000000..041a42ecf9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_In.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Out.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Out.png
new file mode 100644
index 0000000000..cffead1703
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Out.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/ChatBarHandle.png b/indra/newview/skins/contrast_gold/textures/bottomtray/ChatBarHandle.png
new file mode 100644
index 0000000000..50239c8af8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/ChatBarHandle.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/DownArrow.png b/indra/newview/skins/contrast_gold/textures/bottomtray/DownArrow.png
new file mode 100644
index 0000000000..82f58b22b9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/DownArrow.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_Off.png
new file mode 100644
index 0000000000..4dddc2b391
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_On.png
new file mode 100644
index 0000000000..1af8e6b956
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_Off.png
new file mode 100644
index 0000000000..2893c9a9f1
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_On.png
new file mode 100644
index 0000000000..4f97611db1
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_Off.png
new file mode 100644
index 0000000000..80d227b6a7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_On.png
new file mode 100644
index 0000000000..f01c9f3c63
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_Off.png
new file mode 100644
index 0000000000..3602efa9d9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_On.png
new file mode 100644
index 0000000000..a120d46e99
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_Off.png
new file mode 100644
index 0000000000..9c3fc37dfe
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_On.png
new file mode 100644
index 0000000000..c241ac75df
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_Off.png
new file mode 100644
index 0000000000..282e8d62de
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_On.png
new file mode 100644
index 0000000000..20ce7b9296
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_Off.png
new file mode 100644
index 0000000000..5039e57c32
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_On.png
new file mode 100644
index 0000000000..7b3d2e8dd8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_Off.png
new file mode 100644
index 0000000000..a49c43c2cf
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_On.png
new file mode 100644
index 0000000000..ecce0d0192
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_Off.png
new file mode 100644
index 0000000000..e9dea7e17e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_On.png
new file mode 100644
index 0000000000..7a348ba22e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Unread_Chiclet.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Unread_Chiclet.png
new file mode 100644
index 0000000000..e8fe243dc7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Unread_Chiclet.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl1.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl1.png
new file mode 100644
index 0000000000..3072512301
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl1.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl2.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl2.png
new file mode 100644
index 0000000000..28872be28f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl2.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl3.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl3.png
new file mode 100644
index 0000000000..14ec77b99a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl3.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Off.png
new file mode 100644
index 0000000000..48be51e9af
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_On.png
new file mode 100644
index 0000000000..823acfc583
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit.png
new file mode 100644
index 0000000000..84711ddc29
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit_Selected.png
new file mode 100644
index 0000000000..9b9468c574
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/cloud-particle.png b/indra/newview/skins/contrast_gold/textures/cloud-particle.png
new file mode 100644
index 0000000000..2196e764f7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/cloud-particle.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Off.png
new file mode 100644
index 0000000000..19c842b816
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Press.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Press.png
new file mode 100644
index 0000000000..b9879dcc8a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Off.png
new file mode 100644
index 0000000000..d506cda5c9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Press.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Press.png
new file mode 100644
index 0000000000..08f7493a02
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Off.png
new file mode 100644
index 0000000000..ec2c3f0b47
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_Over.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Over.png
new file mode 100644
index 0000000000..9ce484130f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_Press.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Press.png
new file mode 100644
index 0000000000..36edc1c7c4
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Selected.png
new file mode 100644
index 0000000000..9a6b4b4a27
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Container.png b/indra/newview/skins/contrast_gold/textures/containers/Container.png
new file mode 100644
index 0000000000..511eb94386
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Container.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Off.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Off.png
new file mode 100644
index 0000000000..3aad7243bc
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Selected.png
new file mode 100644
index 0000000000..cbf5721766
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle.png
new file mode 100644
index 0000000000..4d2ab77048
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Off.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Off.png
new file mode 100644
index 0000000000..586593314f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Selected.png
new file mode 100644
index 0000000000..4d2ab77048
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right.png
new file mode 100644
index 0000000000..fce7b8771d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Flashing.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Flashing.png
new file mode 100644
index 0000000000..fd13bb699d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Flashing.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Off.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Off.png
new file mode 100644
index 0000000000..4db77fbfde
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Selected.png
new file mode 100644
index 0000000000..fce7b8771d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Flash.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Flash.png
new file mode 100644
index 0000000000..8935aa949b
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Flash.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Off.png
new file mode 100644
index 0000000000..92ea6428a9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Over.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Over.png
new file mode 100644
index 0000000000..31e0f84278
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Selected.png
new file mode 100644
index 0000000000..13af7b9039
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Flash.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Flash.png
new file mode 100644
index 0000000000..dd73d655e9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Flash.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Off.png
new file mode 100644
index 0000000000..17029352fc
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Over.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Over.png
new file mode 100644
index 0000000000..f9bf4b69ab
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Selected.png
new file mode 100644
index 0000000000..ba963bd6d3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Flash.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Flash.png
new file mode 100644
index 0000000000..f6b775c2a0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Flash.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Off.png
new file mode 100644
index 0000000000..3cc431f70d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Over.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Over.png
new file mode 100644
index 0000000000..794731f9fc
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Selected.png
new file mode 100644
index 0000000000..b65ceb7edb
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/default_land_picture.j2c b/indra/newview/skins/contrast_gold/textures/default_land_picture.j2c
new file mode 100644
index 0000000000..d2a8726404
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/default_land_picture.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/default_land_picture.png b/indra/newview/skins/contrast_gold/textures/default_land_picture.png
new file mode 100644
index 0000000000..c53a5f6aa0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/default_land_picture.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/default_profile_picture.j2c b/indra/newview/skins/contrast_gold/textures/default_profile_picture.j2c
new file mode 100644
index 0000000000..09e03af0e9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/default_profile_picture.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/default_profile_picture.png b/indra/newview/skins/contrast_gold/textures/default_profile_picture.png
new file mode 100644
index 0000000000..5bade1cb36
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/default_profile_picture.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/AddItem_Disabled.png b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Disabled.png
new file mode 100644
index 0000000000..d21b72b973
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/AddItem_Off.png b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Off.png
new file mode 100644
index 0000000000..64108d133a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/AddItem_Press.png b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Press.png
new file mode 100644
index 0000000000..3168f51757
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Off.png b/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Off.png
new file mode 100644
index 0000000000..dd89920fae
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Over.png b/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Over.png
new file mode 100644
index 0000000000..a4fbec4144
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Audio_Off.png b/indra/newview/skins/contrast_gold/textures/icons/Audio_Off.png
new file mode 100644
index 0000000000..4f6f5512c8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Audio_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Audio_Press.png b/indra/newview/skins/contrast_gold/textures/icons/Audio_Press.png
new file mode 100644
index 0000000000..0268a0f9fb
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Audio_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Condense.png b/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Condense.png
new file mode 100644
index 0000000000..3a19e79f82
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Condense.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Expand.png b/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Expand.png
new file mode 100644
index 0000000000..f5331feb02
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Expand.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Info.png b/indra/newview/skins/contrast_gold/textures/icons/Info.png
new file mode 100644
index 0000000000..e05a585f0b
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Info.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Info_Over.png b/indra/newview/skins/contrast_gold/textures/icons/Info_Over.png
new file mode 100644
index 0000000000..95fd5fa424
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Info_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Info_Small.png b/indra/newview/skins/contrast_gold/textures/icons/Info_Small.png
new file mode 100644
index 0000000000..c4ce13e132
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Info_Small.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/MP_Logo.png b/indra/newview/skins/contrast_gold/textures/icons/MP_Logo.png
new file mode 100644
index 0000000000..b01e8f4ea3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/MP_Logo.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Disabled.png b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Disabled.png
new file mode 100644
index 0000000000..b62ed35182
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Off.png b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Off.png
new file mode 100644
index 0000000000..eb7b8838f7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Press.png b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Press.png
new file mode 100644
index 0000000000..2dc6081cb0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Dark.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Dark.png
new file mode 100644
index 0000000000..ab5a1680a7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Light.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Light.png
new file mode 100644
index 0000000000..2db94e37c9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Dark.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Dark.png
new file mode 100644
index 0000000000..e1f7613d04
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Light.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Light.png
new file mode 100644
index 0000000000..04d13027d2
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_R_Light.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_R_Light.png
new file mode 100644
index 0000000000..dbf43152b3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_R_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/ProgressLarge_8.png b/indra/newview/skins/contrast_gold/textures/icons/ProgressLarge_8.png
new file mode 100644
index 0000000000..df0e825cef
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/ProgressLarge_8.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoiceMute_Off.png b/indra/newview/skins/contrast_gold/textures/icons/VoiceMute_Off.png
new file mode 100644
index 0000000000..425ba267a5
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/VoiceMute_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl1.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl1.png
new file mode 100644
index 0000000000..3072512301
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl1.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl2.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl2.png
new file mode 100644
index 0000000000..28872be28f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl2.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl3.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl3.png
new file mode 100644
index 0000000000..a4a171bd81
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl3.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Off.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Off.png
new file mode 100644
index 0000000000..533663a4fa
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_On.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_On.png
new file mode 100644
index 0000000000..823acfc583
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/add_icon.png b/indra/newview/skins/contrast_gold/textures/icons/add_icon.png
new file mode 100644
index 0000000000..b5b09ae6e0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/add_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/back_arrow_off.png b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_off.png
new file mode 100644
index 0000000000..0adf0b677e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/back_arrow_over.png b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_over.png
new file mode 100644
index 0000000000..13ce6a8e4d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/back_arrow_press.png b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_press.png
new file mode 100644
index 0000000000..311a90ac22
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/check_mark.png b/indra/newview/skins/contrast_gold/textures/icons/check_mark.png
new file mode 100644
index 0000000000..ea59769d38
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/check_mark.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/see_me_online.png b/indra/newview/skins/contrast_gold/textures/icons/see_me_online.png
new file mode 100644
index 0000000000..5684e27f43
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/see_me_online.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/icons/unknown_icon.png b/indra/newview/skins/contrast_gold/textures/icons/unknown_icon.png
new file mode 100644
index 0000000000..9a4e7f8616
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/icons/unknown_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/megapahit/icon_group.png b/indra/newview/skins/contrast_gold/textures/megapahit/icon_group.png
new file mode 100644
index 0000000000..f3872dea3f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/megapahit/icon_group.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_auction.png b/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_auction.png
new file mode 100644
index 0000000000..550703968f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_auction.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_forsale.png b/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_forsale.png
new file mode 100644
index 0000000000..209bb868ea
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_forsale.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/megapahit/icon_place.png b/indra/newview/skins/contrast_gold/textures/megapahit/icon_place.png
new file mode 100644
index 0000000000..60cf42424a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/megapahit/icon_place.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/model_wizard/progress_bar_bg.png b/indra/newview/skins/contrast_gold/textures/model_wizard/progress_bar_bg.png
new file mode 100644
index 0000000000..7c6920205f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/model_wizard/progress_bar_bg.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/model_wizard/progress_light.png b/indra/newview/skins/contrast_gold/textures/model_wizard/progress_light.png
new file mode 100644
index 0000000000..be6b263fb6
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/model_wizard/progress_light.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Over.png b/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Over.png
new file mode 100644
index 0000000000..3d9c758574
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Press.png b/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Press.png
new file mode 100644
index 0000000000..69b0d43900
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Active.png b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Active.png
new file mode 100644
index 0000000000..6d42f52963
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Active.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Off.png b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Off.png
new file mode 100644
index 0000000000..82d044d817
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Over.png b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Over.png
new file mode 100644
index 0000000000..74861fdb58
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Press.png b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Press.png
new file mode 100644
index 0000000000..6670667022
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG.png b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG.png
new file mode 100644
index 0000000000..6a91700ae0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoFav_Bevel.png b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoFav_Bevel.png
new file mode 100644
index 0000000000..c61dcde58c
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoFav_Bevel.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoNav_Bevel.png b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoNav_Bevel.png
new file mode 100644
index 0000000000..9e3da34596
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoNav_Bevel.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Row_Selection.png b/indra/newview/skins/contrast_gold/textures/navbar/Row_Selection.png
new file mode 100644
index 0000000000..d3870fb640
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/Row_Selection.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/navbar/separator.png b/indra/newview/skins/contrast_gold/textures/navbar/separator.png
new file mode 100644
index 0000000000..c1d74e5a64
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/navbar/separator.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/textures.xml b/indra/newview/skins/contrast_gold/textures/textures.xml
new file mode 100644
index 0000000000..00082fb556
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/textures.xml
@@ -0,0 +1,934 @@
+<!--
+This file contains metadata about how to load, display, and scale textures for rendering in the UI.
+Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
+to them by filename (relative to textures directory).
+NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry
+with the same filename but different name
+
+<texture
+ name="MyTexture" (mandatory)
+ - this is the name you reference the texture by in XUI. For example, <button image_unselected="MyTexture"/>
+ file_name="images/my_texture.png" (optional)
+ - this is the path to the actual file asset, relative to the current skins "textures" directory.
+ If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case.
+ NOTE: you need to provide an extension on the filename (".png", ".tga", ".jpg") for us to decode the image properly
+ preload="true" (optional, false by default)
+ - If true, we will attempt to load the image before displaying any UI.
+ If false, we will load in the background after initializing the UI.
+ use_mips="true" (currently unused)
+ scale.left="1"
+ scale.bottom="1"
+ scale.top="15"
+ scale.right="31"
+ - Specifies the segmentation for 9-slice image scaling. Specifically, the pixel offsets from the LOWER LEFT corner
+ that define the region of the image that is stretched to make the whole image fit in the required space.
+ In this example, if the source image is 32x16 pixels, we have defined a center region that starts one pixel up
+ and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left
+ corner. The end result is that the image will keep a 1 pixel border all around while stretching to fit the required
+ region.
+-->
+
+<textures version="101">
+ <!-- Please add new files alphabetically to prevent merge conflicts. JC -->
+ <texture name="Accordion_ArrowClosed_Off" file_name="containers/Accordion_ArrowClosed_Off.png" preload="false" />
+ <texture name="Accordion_ArrowClosed_Press" file_name="containers/Accordion_ArrowClosed_Press.png" preload="false" />
+ <texture name="Accordion_ArrowOpened_Off" file_name="containers/Accordion_ArrowOpened_Off.png" preload="false" />
+ <texture name="Accordion_ArrowOpened_Press" file_name="containers/Accordion_ArrowOpened_Press.png" preload="false" />
+ <texture name="Accordion_Off" file_name="containers/Accordion_Off.png" preload="false" />
+ <texture name="Accordion_Press" file_name="containers/Accordion_Press.png" preload="false" />
+ <texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" />
+ <texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" />
+
+ <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
+
+ <texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" />
+ <texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" />
+ <texture name="AddItem_Press" file_name="icons/AddItem_Press.png" preload="false" />
+
+ <texture name="add_payment_image_center" file_name="windows/add_payment_image_center.png" preload="true" />
+ <texture name="add_payment_image_left" file_name="windows/add_payment_image_left.png" preload="true" />
+ <texture name="add_payment_image_right" file_name="windows/add_payment_image_right.png" preload="true" />
+
+ <texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" />
+ <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
+
+ <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
+ <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
+ <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
+
+ <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
+ <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
+ <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
+ <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
+
+ <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
+ <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
+ <texture name="VoiceMute_Off" file_name="icons/VoiceMute_Off.png" preload="false" />
+
+ <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
+ <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
+
+ <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
+
+ <texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
+ <texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
+ <texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
+
+ <texture name="Error_Tag_Background" file_name="widgets/Error_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="New_Tag_Background" file_name="widgets/New_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="New_Tag_Border" file_name="widgets/New_Tag_Border.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+
+ <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="Badge_Border" file_name="widgets/Badge_Border.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+
+ <texture name="Blank" file_name="Blank.png" preload="false" />
+
+ <texture name="BreadCrumbBtn_Left_Disabled" file_name="widgets/BreadCrumbBtn_Left_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Off" file_name="widgets/BreadCrumbBtn_Left_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Over" file_name="widgets/BreadCrumbBtn_Left_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Press" file_name="widgets/BreadCrumbBtn_Left_Press.png" preload="false"/>
+
+ <texture name="BreadCrumbBtn_Middle_Disabled" file_name="widgets/BreadCrumbBtn_Middle_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Off" file_name="widgets/BreadCrumbBtn_Middle_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Over" file_name="widgets/BreadCrumbBtn_Middle_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Press" file_name="widgets/BreadCrumbBtn_Middle_Press.png" preload="false"/>
+
+ <texture name="BreadCrumbBtn_Right_Disabled" file_name="widgets/BreadCrumbBtn_Right_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Off" file_name="widgets/BreadCrumbBtn_Right_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Over" file_name="widgets/BreadCrumbBtn_Right_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Press" file_name="widgets/BreadCrumbBtn_Right_Press.png" preload="false"/>
+
+ <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="0" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+
+ <texture name="Cam_Avatar_Off" file_name="bottomtray/Cam_Avatar_Off.png" preload="true" />
+ <texture name="Cam_FreeCam_Off" file_name="bottomtray/Cam_FreeCam_Off.png" preload="false" />
+ <texture name="Cam_Orbit_Off" file_name="bottomtray/Cam_Orbit_Off.png" preload="false" />
+ <texture name="Cam_Pan_Off" file_name="bottomtray/Cam_Pan_Off.png" preload="false" />
+
+ <texture name="Cam_Preset_Back_Off" file_name="bottomtray/Cam_Preset_Back_Off.png" preload="false" />
+ <texture name="Cam_Preset_Back_On" file_name="bottomtray/Cam_Preset_Back_On.png" preload="false" />
+ <texture name="Cam_Preset_Eye_Off" file_name="bottomtray/Cam_Preset_Eye_Off.png" preload="false" />
+ <texture name="Cam_Preset_Front_Off" file_name="bottomtray/Cam_Preset_Front_Off.png" preload="false" />
+ <texture name="Cam_Preset_Front_On" file_name="bottomtray/Cam_Preset_Front_On.png" preload="false" />
+ <texture name="Cam_Preset_Side_Off" file_name="bottomtray/Cam_Preset_Side_Off.png" preload="false" />
+ <texture name="Cam_Preset_Side_On" file_name="bottomtray/Cam_Preset_Side_On.png" preload="false" />
+
+ <texture name="Cam_Rotate_In" file_name="bottomtray/Cam_Rotate_In.png" preload="false" />
+ <texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" />
+ <texture name="Cam_Rotate_Center" file_name="bottomtray/Cam_Rotate_Center.png" preload="false" />
+ <texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" />
+ <texture name="Cam_Tracking_Out" file_name="bottomtray/Cam_Tracking_Out.png" preload="false" />
+ <texture name="Cam_Tracking_Center" file_name="bottomtray/Cam_Tracking_Center.png" preload="false" />
+
+ <texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" />
+ <texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" />
+ <texture name="Checkbox_Off" file_name="widgets/Checkbox_Off.png" preload="true" />
+ <texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />
+ <texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />
+ <texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
+ <texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" />
+
+ <texture name="Checker" file_name="checker.png" preload="false" />
+
+ <texture name="Command_360_Capture_Icon" file_name="toolbar_icons/360_capture.png" preload="true" />
+ <texture name="Command_AboutLand_Icon" file_name="toolbar_icons/land.png" preload="true" />
+ <texture name="Command_Appearance_Icon" file_name="toolbar_icons/appearance.png" preload="true" />
+ <texture name="Command_Avatar_Icon" file_name="toolbar_icons/avatars.png" preload="true" />
+ <texture name="Command_Build_Icon" file_name="toolbar_icons/build.png" preload="true" />
+ <texture name="Command_Chat_Icon" file_name="toolbar_icons/chat.png" preload="true" />
+ <texture name="Command_Compass_Icon" file_name="toolbar_icons/land.png" preload="true" />
+ <texture name="Command_Destinations_Icon" file_name="toolbar_icons/destinations.png" preload="true" />
+ <texture name="Command_Gestures_Icon" file_name="toolbar_icons/gestures.png" preload="true" />
+ <texture name="Command_Grid_Status_Icon" file_name="toolbar_icons/grid_status.png" preload="true" />
+ <texture name="Command_HowTo_Icon" file_name="toolbar_icons/howto.png" preload="true" />
+ <texture name="Command_Inventory_Icon" file_name="toolbar_icons/inventory.png" preload="true" />
+ <texture name="Command_Map_Icon" file_name="toolbar_icons/map.png" preload="true" />
+ <texture name="Command_Marketplace_Icon" file_name="toolbar_icons/marketplace.png" preload="true" />
+ <texture name="Command_MktListings_Icon" file_name="toolbar_icons/mktlistings.png" preload="true" />
+ <texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" />
+ <texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" />
+ <texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
+ <texture name="Command_Environments_Icon" file_name="toolbar_icons/environments.png" preload="true" />
+ <texture name="Command_People_Icon" file_name="toolbar_icons/people.png" preload="true" />
+ <texture name="Command_Performance_Icon" file_name="toolbar_icons/performance.png" preload="true" />
+ <texture name="Command_Picks_Icon" file_name="toolbar_icons/picks.png" preload="true" />
+ <texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" />
+ <texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" />
+ <texture name="Command_Profile_Icon" file_name="toolbar_icons/profile.png" preload="true" />
+ <texture name="Command_Report_Abuse_Icon" file_name="toolbar_icons/report_abuse.png" preload="true" />
+ <texture name="Command_Search_Icon" file_name="toolbar_icons/search.png" preload="true" />
+ <texture name="Command_Snapshot_Icon" file_name="toolbar_icons/snapshot.png" preload="true" />
+ <texture name="Command_Speak_Icon" file_name="toolbar_icons/speak.png" preload="true" />
+ <texture name="Command_View_Icon" file_name="toolbar_icons/view.png" preload="true" />
+ <texture name="Command_Voice_Icon" file_name="toolbar_icons/nearbyvoice.png" preload="true" />
+ <texture name="Command_FavoriteFolder_Icon" file_name="toolbar_icons/favorite_folder.png" preload="true" />
+ <texture name="Command_Resync_Animations" file_name="toolbar_icons/resync_animations.png" preload="true" />
+ <texture name="Caret_Bottom_Icon" file_name="toolbar_icons/caret_bottom.png" preload="true" scale.left="1" scale.top="23" scale.right="15" scale.bottom="1" />
+ <texture name="Caret_Right_Icon" file_name="toolbar_icons/caret_right.png" preload="true" scale.left="5" scale.top="15" scale.right="28" scale.bottom="1" />
+ <texture name="Caret_Left_Icon" file_name="toolbar_icons/caret_left.png" preload="true" scale.left="1" scale.top="15" scale.right="23" scale.bottom="1" />
+
+ <texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+
+ <texture name="Container" file_name="containers/Container.png" preload="false" />
+
+ <texture name="Conv_toolbar_add_person" file_name="icons/Conv_toolbar_add_person.png" preload="false" />
+ <texture name="Conv_toolbar_arrow_ne" file_name="icons/Conv_toolbar_arrow_ne.png" preload="false" />
+ <texture name="Conv_toolbar_arrow_sw" file_name="icons/Conv_toolbar_arrow_sw.png" preload="false" />
+ <texture name="Conv_toolbar_call_log" file_name="icons/Conv_toolbar_call_log.png" preload="false" />
+ <texture name="Conv_toolbar_close" file_name="icons/Conv_toolbar_close.png" preload="false" />
+ <texture name="Conv_toolbar_collapse" file_name="icons/Conv_toolbar_collapse.png" preload="false" />
+ <texture name="Conv_collapse_to_one_line" file_name="icons/collapse_to_one_line.png" preload="false" />
+ <texture name="Conv_expand_one_line" file_name="icons/expand_one_liner.png" preload="false" />
+ <texture name="Conv_toolbar_expand" file_name="icons/Conv_toolbar_expand.png" preload="false" />
+ <texture name="Conv_toolbar_hang_up" file_name="icons/Conv_toolbar_hang_up.png" preload="false" />
+ <texture name="Conv_toolbar_open_call" file_name="icons/Conv_toolbar_open_call.png" preload="false" />
+ <texture name="Conv_toolbar_plus" file_name="icons/Conv_toolbar_plus.png" preload="false" />
+ <texture name="Conv_toolbar_sort" file_name="icons/Conv_toolbar_sort.png" preload="false" />
+ <texture name="Conv_log_inbox" file_name="icons/Conv_log_inbox.png" preload="false" />
+
+ <texture name="Copy" file_name="icons/Copy.png" preload="false" />
+ <texture name="CopyBright" file_name="icons/CopyBright.png" preload="false" />
+
+ <texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
+
+ <texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
+ <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
+ <texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
+ <texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />
+
+ <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+
+ <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
+
+ <texture name="Emoji_Picker_Icon" file_name="icons/emoji_picker_icon.png" preload="true" />
+ <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" />
+ <texture name="Edit_Wrench" file_name="icons/Edit_Wrench.png" preload="false" />
+
+ <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" />
+
+ <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" />
+ <texture name="Presets_Icon_Graphic" file_name="icons/Presets_Icon_Graphic.png" preload="true" />
+ <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
+ <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
+ <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" />
+ <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" />
+ <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" />
+
+
+ <texture name="Flag" file_name="navbar/Flag.png" preload="false" />
+
+ <texture name="Flyout_Left" file_name="windows/Flyout_Left.png" preload="false" />
+ <texture name="Flyout_Pointer" file_name="windows/Flyout_Pointer.png" preload="false" />
+ <texture name="Flyout_Right" file_name="windows/Flyout_Right.png" preload="false" />
+
+ <texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" />
+ <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
+ <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
+ <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
+
+ <texture name="Generic_Experience" file_name="Blank.png" preload="false" />
+ <texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
+ <texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
+ <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" />
+ <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" />
+ <texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
+ <texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
+
+ <texture name="Group_Notices" file_name="icons/Group_Notices.png" preload="false" />
+
+ <texture name="Hand" file_name="icons/hand.png" preload="false" />
+
+ <texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" />
+
+ <texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" />
+ <texture name="Hierarchy_View_On" file_name="icons/Hierarchy_View_On.png" preload="false" />
+
+
+ <texture name="Home_Off" file_name="navbar/Home_Off.png" preload="false" />
+ <texture name="Horizontal Drag Handle" file_name="widgets/horizontal_drag_handle.png" scale.left="8" scale.right="120" scale.bottom="1" scale.top="6" scale_type="scale_outer"/>
+
+ <texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" />
+ <texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" />
+ <texture name="Icon_Close_Toast" file_name="windows/Icon_Close_Toast.png" preload="true" />
+
+ <texture name="Icon_Copy" file_name="icons/copy_clipboard.png" preload="true" />
+
+ <texture name="Icon_Delete" file_name="icons/delete_icon.png" preload="true" />
+
+ <texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" />
+ <texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" />
+
+ <texture name="Icon_File_Upload" file_name="icons/file_upload.png" preload="true" />
+
+ <texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" />
+
+ <texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" />
+ <texture name="Icon_Gear_Foreground" file_name="windows/Icon_Gear_Foreground.png" preload="false" />
+ <texture name="Icon_Gear_Press" file_name="windows/Icon_Gear_Press.png" preload="false" />
+ <texture name="Icon_Gear" file_name="windows/Icon_Gear.png" preload="false" />
+
+ <texture name="Icon_Help_Foreground" file_name="windows/Icon_Help_Foreground.png" preload="true" />
+ <texture name="Icon_Help_Press" file_name="windows/Icon_Help_Press.png" preload="true" />
+
+ <texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" />
+ <texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" />
+
+ <texture name="Icon_Paste" file_name="icons/paste_clipboard.png" preload="true" />
+
+ <texture name="Icon_Restore_Foreground" file_name="windows/Icon_Restore_Foreground.png" preload="false" />
+ <texture name="Icon_Restore_Press" file_name="windows/Icon_Restore_Press.png" preload="false" />
+
+ <texture name="Icon_Snapshot" file_name="icons/snapshot_icon.png" preload="true" />
+
+ <texture name="Icon_Use_Texture" file_name="icons/texture_icon.png" preload="true" />
+
+ <texture name="Info" file_name="icons/Info.png" preload="false" />
+ <texture name="Info_Small" file_name="icons/Info_Small.png" preload="false" />
+ <texture name="Info_Off" file_name="navbar/Info_Off.png" preload="false" />
+ <texture name="Info_Over" file_name="icons/Info_Over.png" preload="false" />
+ <texture name="Info_Press" file_name="navbar/Info_Press.png" preload="false" />
+
+ <texture name="Inspector_Background" file_name="windows/Inspector_Background.png" preload="false"
+ scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
+ <texture name="Inspector_Hover" file_name="windows/Inspector_Hover.png" preload="false" />
+ <texture name="Inspector_I" file_name="windows/Inspector_I.png" preload="false" />
+
+ <texture name="Inv_Alpha" file_name="icons/Inv_Alpha.png" preload="false" />
+ <texture name="Inv_Animation" file_name="icons/Inv_Animation.png" preload="false" />
+ <texture name="Inv_BodyShape" file_name="icons/Inv_BodyShape.png" preload="false" />
+ <texture name="Inv_CallingCard" file_name="icons/Inv_CallingCard.png" preload="false" />
+ <texture name="Inv_Clothing" file_name="icons/Inv_Clothing.png" preload="false" />
+ <texture name="Inv_Eye" file_name="icons/Inv_Eye.png" preload="false" />
+ <texture name="Inv_FolderClosed" file_name="icons/Inv_FolderClosed.png" preload="false" />
+ <texture name="Inv_FolderOpen" file_name="icons/Inv_FolderOpen.png" preload="false" />
+ <texture name="Inv_Gesture" file_name="icons/Inv_Gesture.png" preload="false" />
+ <texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />
+ <texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />
+ <texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" />
+ <texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" />
+ <texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />
+ <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
+ <texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" />
+ <texture name="Inv_LostClosed" file_name="icons/Inv_LostClosed.png" preload="false" />
+ <texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" />
+ <texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
+ <texture name="Inv_Material" file_name="icons/Inv_Material.png" preload="false" />
+ <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" />
+ <texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
+ <texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
+ <texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" />
+ <texture name="Inv_Pants" file_name="icons/Inv_Pants.png" preload="false" />
+ <texture name="Inv_Script" file_name="icons/Inv_Script.png" preload="false" />
+ <texture name="Inv_Shirt" file_name="icons/Inv_Shirt.png" preload="false" />
+ <texture name="Inv_Shoe" file_name="icons/Inv_Shoe.png" preload="false" />
+ <texture name="Inv_Skin" file_name="icons/Inv_Skin.png" preload="false" />
+ <texture name="Inv_Skirt" file_name="icons/Inv_Skirt.png" preload="false" />
+ <texture name="Inv_Snapshot" file_name="icons/Inv_Snapshot.png" preload="false" />
+ <texture name="Inv_Socks" file_name="icons/Inv_Socks.png" preload="false" />
+ <texture name="Inv_Sound" file_name="icons/Inv_Sound.png" preload="false" />
+ <texture name="Inv_StockFolderClosed" file_name="icons/Inv_StockFolderClosed.png" preload="false" />
+ <texture name="Inv_StockFolderOpen" file_name="icons/Inv_StockFolderOpen.png" preload="false" />
+ <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
+ <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
+ <texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
+ <texture name="Inv_Universal" file_name="icons/Inv_Universal.png" preload="false" />
+ <texture name="Inv_Physics" file_name="icons/Inv_Physics.png" preload="false" />
+ <texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" />
+ <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" />
+ <texture name="Inv_TrashOpen" file_name="icons/Inv_TrashOpen.png" preload="false" />
+ <texture name="Inv_Underpants" file_name="icons/Inv_Underpants.png" preload="false" />
+ <texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" />
+ <texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" />
+ <texture name="Inv_Settings" file_name="icons/Inv_Settings.png" preload="false" />
+ <texture name="Inv_SettingsSky" file_name="icons/Inv_SettingsSky.png" preload="false" />
+ <texture name="Inv_SettingsWater" file_name="icons/Inv_SettingsWater.png" preload="false" />
+ <texture name="Inv_SettingsDay" file_name="icons/Inv_SettingsDay.png" preload="false" />
+
+ <texture name="Inv_Invalid" file_name="icons/Inv_Invalid.png" preload="false" />
+ <texture name="Inv_Unknown" file_name="icons/Inv_UnknownObject.png" preload="false" />
+ <texture name="Inv_VersionFolderClosed" file_name="icons/Inv_VersionFolderClosed.png" preload="false" />
+ <texture name="Inv_VersionFolderOpen" file_name="icons/Inv_VersionFolderOpen.png" preload="false" />
+
+ <texture name="Inv_Toolbar_SearchVisibility" file_name="icons/Inv_Toolbar_SearchVisibility.png" preload="false" />
+
+ <texture name="Landmarks_overlay" file_name="navbar/Landmarks.png" preload="false" />
+
+ <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>
+ <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/>
+
+ <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+ <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+
+ <texture name="List_View_Disabled" file_name="icons/List_View_Disabled.png" preload="false" />
+ <texture name="List_View_On" file_name="icons/List_View_On.png" preload="false" />
+
+ <texture name="Lock" file_name="icons/Lock.png" preload="false" />
+ <texture name="Lock2" file_name="navbar/Lock.png" preload="false" />
+
+ <texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" />
+
+ <texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" />
+
+ <texture name="Marketplace_Dropzone_Background" file_name="widgets/Marketplace_Dropzone_Background.png" preload="true" />
+ <texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
+ <texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
+
+ <texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" />
+
+ <texture name="MinusItem_Disabled" file_name="icons/MinusItem_Disabled.png" preload="false" />
+ <texture name="MinusItem_Off" file_name="icons/MinusItem_Off.png" preload="false" />
+ <texture name="MinusItem_Press" file_name="icons/MinusItem_Press.png" preload="false" />
+
+ <texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" />
+
+ <texture name="ModelImport_Status_Good" file_name="green_checkmark.png" preload="false"/>
+ <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/>
+ <texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/>
+
+ <texture name="MouseLook_View_Off" file_name="bottomtray/Mouselook_View_Off.png" preload="false" />
+ <texture name="MouseLook_View_On" file_name="bottomtray/Mouselook_View_On.png" preload="false" />
+
+ <texture name="Move_Fly_Off" file_name="bottomtray/Move_Fly_Off.png" preload="false" />
+ <texture name="Move_Run_Off" file_name="bottomtray/Move_Run_Off.png" preload="false" />
+ <texture name="Move_Walk_Off" file_name="bottomtray/Move_Walk_Off.png" preload="false" />
+ <texture name="Movement_Backward_Off" file_name="bottomtray/Movement_Backward_Off.png" preload="false" />
+ <texture name="Movement_Backward_On" file_name="bottomtray/Movement_Backward_On.png" preload="false" />
+ <texture name="Movement_Down_Off" file_name="bottomtray/Movement_Down_Off.png" preload="false" />
+ <texture name="Movement_Down_On" file_name="bottomtray/Movement_Down_On.png" preload="false" />
+ <texture name="Movement_Forward_Off" file_name="bottomtray/Movement_Forward_Off.png" preload="false" />
+ <texture name="Movement_Forward_On" file_name="bottomtray/Movement_Forward_On.png" preload="false" />
+ <texture name="Movement_Left_Off" file_name="bottomtray/Movement_Left_Off.png" preload="false" />
+ <texture name="Movement_Left_On" file_name="bottomtray/Movement_Left_On.png" preload="false" />
+ <texture name="Movement_Right_Off" file_name="bottomtray/Movement_Right_Off.png" preload="false" />
+ <texture name="Movement_Right_On" file_name="bottomtray/Movement_Right_On.png" preload="false" />
+ <texture name="Movement_TurnLeft_Off" file_name="bottomtray/Movement_TurnLeft_Off.png" preload="false" />
+ <texture name="Movement_TurnLeft_On" file_name="bottomtray/Movement_TurnLeft_On.png" preload="false" />
+ <texture name="Movement_TurnRight_Off" file_name="bottomtray/Movement_TurnRight_Off.png" preload="false" />
+ <texture name="Movement_TurnRight_On" file_name="bottomtray/Movement_TurnRight_On.png" preload="false" />
+ <texture name="Movement_Up_Off" file_name="bottomtray/Movement_Up_Off.png" preload="false" />
+ <texture name="Movement_Up_On" file_name="bottomtray/Movement_Up_On.png" preload="false" />
+
+ <texture name="NavBar_BG" file_name="navbar/NavBar_BG.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="NavBar_BG_NoFav_Bevel" file_name="navbar/NavBar_BG_NoFav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="NavBar_BG_NoNav_Bevel" file_name="navbar/NavBar_BG_NoNav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+
+ <texture name="Nearby_chat_icon" file_name="icons/nearby_chat_icon.png" preload="false" />
+
+ <texture name="Notices_Unread" file_name="bottomtray/Notices_Unread.png" preload="true" />
+
+ <texture name="NoEntryLines" file_name="world/NoEntryLines.png" use_mips="true" preload="false" />
+ <texture name="NoEntryPassLines" file_name="world/NoEntryPassLines.png" use_mips="true" preload="false" />
+
+ <texture name="Object_Cone" file_name="build/Object_Cone.png" preload="false" />
+ <texture name="Object_Cone_Selected" file_name="build/Object_Cone_Selected.png" preload="false" />
+ <texture name="Object_Cube" file_name="build/Object_Cube.png" preload="false" />
+ <texture name="Object_Cube_Selected" file_name="build/Object_Cube_Selected.png" preload="false" />
+ <texture name="Object_Cylinder" file_name="build/Object_Cylinder.png" preload="false" />
+ <texture name="Object_Cylinder_Selected" file_name="build/Object_Cylinder_Selected.png" preload="false" />
+ <texture name="Object_Grass" file_name="build/Object_Grass.png" preload="false" />
+ <texture name="Object_Grass_Selected" file_name="build/Object_Grass_Selected.png" preload="false" />
+ <texture name="Object_Hemi_Cone" file_name="build/Object_Hemi_Cone.png" preload="false" />
+ <texture name="Object_Hemi_Cone_Selected" file_name="build/Object_Hemi_Cone_Selected.png" preload="false" />
+ <texture name="Object_Hemi_Cylinder" file_name="build/Object_Hemi_Cylinder.png" preload="false" />
+ <texture name="Object_Hemi_Cylinder_Selected" file_name="build/Object_Hemi_Cylinder_Selected.png" preload="false" />
+ <texture name="Object_Hemi_Sphere" file_name="build/Object_Hemi_Sphere.png" preload="false" />
+ <texture name="Object_Hemi_Sphere_Selected" file_name="build/Object_Hemi_Sphere_Selected.png" preload="false" />
+ <texture name="Object_Prism" file_name="build/Object_Prism.png" preload="false" />
+ <texture name="Object_Prism_Selected" file_name="build/Object_Prism_Selected.png" preload="false" />
+ <texture name="Object_Pyramid" file_name="build/Object_Pyramid.png" preload="false" />
+ <texture name="Object_Pyramid_Selected" file_name="build/Object_Pyramid_Selected.png" preload="false" />
+ <texture name="Object_Ring" file_name="build/Object_Ring.png" preload="false" />
+ <texture name="Object_Ring_Selected" file_name="build/Object_Ring_Selected.png" preload="false" />
+ <texture name="Object_Sphere" file_name="build/Object_Sphere.png" preload="false" />
+ <texture name="Object_Sphere_Selected" file_name="build/Object_Sphere_Selected.png" preload="false" />
+ <texture name="Object_Tetrahedron" file_name="build/Object_Tetrahedron.png" preload="false" />
+ <texture name="Object_Tetrahedron_Selected" file_name="build/Object_Tetrahedron_Selected.png" preload="false" />
+ <texture name="Object_Torus" file_name="build/Object_Torus.png" preload="false" />
+ <texture name="Object_Torus_Selected" file_name="build/Object_Torus_Selected.png" preload="false" />
+ <texture name="Object_Tree" file_name="build/Object_Tree.png" preload="false" />
+ <texture name="Object_Tree_Selected" file_name="build/Object_Tree_Selected.png" preload="false" />
+ <texture name="Object_Tube" file_name="build/Object_Tube.png" preload="false" />
+ <texture name="Object_Tube_Selected" file_name="build/Object_Tube_Selected.png" preload="false" />
+
+ <texture name="Object_View_Off" file_name="bottomtray/Object_View_Off.png" preload="false" />
+ <texture name="Object_View_On" file_name="bottomtray/Object_View_On.png" preload="false" />
+
+ <texture name="OptionsMenu_Disabled" file_name="icons/OptionsMenu_Disabled.png" preload="false" />
+ <texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" />
+ <texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" />
+
+ <texture name="ClipboardSmallMenu_Disabled" file_name="icons/ClipboardSmallMenu_Disabled.png" preload="false" />
+ <texture name="ClipboardSmallMenu_Off" file_name="icons/ClipboardSmallMenu_Off.png" preload="false" />
+ <texture name="ClipboardSmallMenu_Press" file_name="icons/ClipboardSmallMenu_Press.png" preload="false" />
+ <texture name="ClipboardMenu_Disabled" file_name="icons/ClipboardMenu_Disabled.png" preload="false" />
+ <texture name="ClipboardMenu_Off" file_name="icons/ClipboardMenu_Off.png" preload="false" />
+ <texture name="ClipboardMenu_Press" file_name="icons/ClipboardMenu_Press.png" preload="false" />
+
+ <texture name="OutboxStatus_Success" file_name="green_checkmark.png" preload="false" />
+ <texture name="OutboxStatus_Warning" file_name="icons/pop_up_caution.png" preload="false" />
+ <texture name="OutboxStatus_Error" file_name="red_x.png" preload="false" />
+
+ <texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" />
+
+ <texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" />
+
+ <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" />
+ <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" />
+ <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" />
+ <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" />
+ <texture name="Parcel_Fly_Dark" file_name="icons/Parcel_Fly_Dark.png" preload="false" />
+ <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" />
+ <texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" />
+ <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" />
+ <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" />
+ <texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" />
+ <texture name="Parcel_PushNo_Dark" file_name="icons/Parcel_PushNo_Dark.png" preload="false" />
+ <texture name="Parcel_R_Dark" file_name="icons/Parcel_R_Dark.png" preload="false" />
+ <texture name="Parcel_Scripts_Dark" file_name="icons/Parcel_Scripts_Dark.png" preload="false" />
+ <texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
+ <texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
+ <texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Dark" file_name="icons/Parcel_SeeAVsOff_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Dark" file_name="icons/Parcel_SeeAVsOn_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Light" file_name="icons/Parcel_SeeAVsOff_Light.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Light" file_name="icons/Parcel_SeeAVsOn_Light.png" preload="false" />
+
+ <texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
+ <texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />
+ <texture name="Parcel_ForSale_Light" file_name="icons/Parcel_ForSale_Light.png" preload="false" />
+ <texture name="Parcel_M_Light" file_name="icons/Parcel_M_Light.png" preload="false" />
+ <texture name="Parcel_PG_Light" file_name="icons/Parcel_PG_Light.png" preload="false" />
+ <texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" />
+ <texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" />
+ <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
+ <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" />
+ <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" />
+
+ <texture name="Pathfinding_Dirty" file_name="icons/Pathfinding_Dirty.png" preload="false" />
+ <texture name="Pathfinding_Disabled" file_name="icons/Pathfinding_Disabled.png" preload="false" />
+
+ <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
+ <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
+ <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
+ <texture name="Person_Check" file_name="icons/Person_Check.png" preload="false" />
+ <texture name="Person_Star" file_name="icons/Person_Star.png" preload="false" />
+
+ <texture name="Permission_Visible_Online" file_name="icons/see_me_online.png" preload="false" />
+ <texture name="Permission_Visible_Map" file_name="icons/see_on_map.png" preload="false" />
+ <texture name="Permission_Edit_Objects_Mine" file_name="icons/edit_mine.png" preload="false" />
+ <texture name="Permission_Edit_Objects_Theirs" file_name="icons/edit_theirs.png" preload="false" />
+
+ <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
+ <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
+ <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
+
+ <texture name="Profile_Badge_Beta" file_name="icons/profile_badge_beta.png" preload="true"/>
+ <texture name="Profile_Badge_Beta_Lifetime" file_name="icons/profile_badge_beta_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Lifetime" file_name="icons/profile_badge_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Linden" file_name="icons/profile_badge_linden.png" preload="true"/>
+ <texture name="Profile_Badge_Pplus_Lifetime" file_name="icons/profile_badge_pplus_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Premium_Lifetime" file_name="icons/profile_badge_premium_lifetime.png" preload="true"/>
+ <texture name="Profile_Group_Visibility_Off" file_name="icons/profile_group_visibility_eye_off.png" preload="true"/>
+ <texture name="Profile_Group_Visibility_Off_Pressed" file_name="icons/profile_group_visibility_eye_off_pressed.png" preload="true"/>
+ <texture name="Profile_Group_Visibility_On" file_name="icons/profile_group_visibility_eye_on.png" preload="true"/>
+ <texture name="Profile_Group_Visibility_On_Pressed" file_name="icons/profile_group_visibility_eye_on_pressed.png" preload="true"/>
+ <texture name="Profile_Friend_Offline" file_name="icons/Profile_Friend_Offline.png" preload="true"/>
+ <texture name="Profile_Friend_Online" file_name="icons/Profile_Friend_Online.png" preload="true"/>
+ <texture name="Profile_Perm_Find_Disabled" file_name="icons/Profile_Perm_Find_Disabled.png" preload="true"/>
+ <texture name="Profile_Perm_Find_Enabled" file_name="icons/Profile_Perm_Find_Enabled.png" preload="true"/>
+ <texture name="Profile_Perm_Objects_Disabled" file_name="icons/Profile_Perm_Objects_Disabled.png" preload="true"/>
+ <texture name="Profile_Perm_Objects_Enabled" file_name="icons/Profile_Perm_Objects_Enabled.png" preload="true"/>
+ <texture name="Profile_Perm_Online_Disabled" file_name="icons/Profile_Perm_Online_Disabled.png" preload="true"/>
+ <texture name="Profile_Perm_Online_Enabled" file_name="icons/Profile_Perm_Online_Enabled.png" preload="true"/>
+
+ <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
+ <texture name="ProgressBarSolid" file_name="widgets/ProgressBarSolid.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
+ <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" />
+
+ <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
+ <texture name="PushButton_Login" file_name="widgets/PushButton_Login.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Login_Over" file_name="widgets/PushButton_Login_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Login_Pressed" file_name="widgets/PushButton_Login_Pressed.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
+
+ <texture name="RadioButton_Press" file_name="widgets/RadioButton_Press.png" preload="true" />
+ <texture name="RadioButton_On_Press" file_name="widgets/RadioButton_On_Press.png" preload="true" />
+ <texture name="RadioButton_Off" file_name="widgets/RadioButton_Off.png" preload="true" />
+ <texture name="RadioButton_On" file_name="widgets/RadioButton_On.png" preload="true" />
+ <texture name="RadioButton_Disabled" file_name="widgets/RadioButton_Disabled.png" preload="true" />
+ <texture name="RadioButton_On_Disabled" file_name="widgets/RadioButton_On_Disabled.png" preload="true" />
+
+
+ <texture name="Refresh_Off" file_name="icons/Refresh_Off.png" preload="true" />
+
+ <texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" />
+
+ <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="58" scale.bottom="6" />
+ <texture name="Rounded_Rect_Top" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="8" scale.right="58" scale.bottom="0" clip.left="0" clip.right="64" clip.bottom="16" clip.top="32" />
+ <texture name="Rounded_Rect_Bottom" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="16" scale.right="58" scale.bottom="8" clip.left="0" clip.right="64" clip.bottom="0" clip.top="16" />
+ <texture name="Rounded_Rect_Left" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="32" scale.bottom="6" clip.left="0" clip.right="32" clip.bottom="0" clip.top="32" />
+ <texture name="Rounded_Rect_Right" file_name="Rounded_Rect.png" preload="true" scale.left="0" scale.top="26" scale.right="26" scale.bottom="6" clip.left="32" clip.right="64" clip.bottom="0" clip.top="32" />
+ <texture name="Rounded_Square" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
+ <texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" />
+
+ <texture name="ScrollArrow_Down" file_name="widgets/ScrollArrow_Down.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
+ <texture name="ScrollArrow_Left" file_name="widgets/ScrollArrow_Left.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
+ <texture name="ScrollArrow_Right" file_name="widgets/ScrollArrow_Right.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
+ <texture name="ScrollArrow_Up" file_name="widgets/ScrollArrow_Up.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
+
+ <texture name="ScrollThumb_Horiz" file_name="widgets/ScrollThumb_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
+ <texture name="ScrollThumb_Vert" file_name="widgets/ScrollThumb_Vert.png" preload="true" scale.left="4" scale.top="53" scale.bottom="10" scale.right="4" />
+ <texture name="ScrollTrack_Vert" file_name="widgets/ScrollTrack_Vert.png" preload="true" scale.left="2" scale.top="40" scale.bottom="13" scale.right="0" />
+ <texture name="ScrollTrack_Horiz" file_name="widgets/ScrollTrack_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
+
+
+ <texture name="Search" file_name="navbar/Search.png" preload="false" />
+
+ <texture name="Search_Icon" file_name="icons/Search_Icon.png" preload="false" />
+
+ <texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected_Over" file_name="widgets/SegmentedBtn_Left_Selected_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected_Press" file_name="widgets/SegmentedBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected_Disabled" file_name="widgets/SegmentedBtn_Left_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+
+ <texture name="SegmentedBtn_Middle_Disabled" file_name="widgets/SegmentedBtn_Middle_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Middle_Selected" file_name="widgets/SegmentedBtn_Middle_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Middle_Selected_Press" file_name="widgets/SegmentedBtn_Middle_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Middle_Selected_Disabled" file_name="widgets/SegmentedBtn_Middle_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+
+ <texture name="SegmentedBtn_Right_Off" file_name="widgets/SegmentedBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Over" file_name="widgets/SegmentedBtn_Right_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Press" file_name="widgets/SegmentedBtn_Right_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Disabled" file_name="widgets/SegmentedBtn_Right_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Selected" file_name="widgets/SegmentedBtn_Right_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+
+ <texture name="Shirt_Large" file_name="icons/Shirt_Large.png" preload="false" />
+
+ <texture name="Sidebar_Icon_Dock_Foreground" file_name="taskpanel/Sidebar_Icon_Dock_Foreground.png" preload="false" />
+ <texture name="Sidebar_Icon_Dock_Press" file_name="taskpanel/Sidebar_Icon_Dock_Press.png" preload="false" />
+ <texture name="Sidebar_Icon_Undock_Foreground" file_name="taskpanel/Sidebar_Icon_Undock_Foreground.png" preload="false" />
+ <texture name="Sidebar_Icon_Undock_Press" file_name="taskpanel/Sidebar_Icon_Undock_Press.png" preload="false" />
+
+ <texture name="Shop" file_name="icons/Shop.png" preload="false" />
+
+ <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
+ <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" />
+
+ <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
+ <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
+ <texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" />
+ <texture name="SliderThumb_Disabled" file_name="widgets/SliderThumb_Disabled.png" />
+ <texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" />
+
+ <texture name="SL_Logo" file_name="icons/MP_Logo.png" preload="true" />
+ <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" />
+ <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" />
+
+ <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" />
+ <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" />
+ <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" />
+ <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" />
+ <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
+
+ <texture name="login_mp_logo" file_name="windows/login_mp_logo.png" preload="true" />
+ <texture name="login_mp_logo_small" file_name="windows/login_mp_logo_small.png" preload="true" />
+ <texture name="first_login_image" file_name="windows/first_login_image.jpg" preload="true" />
+
+ <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" />
+ <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" />
+ <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" />
+ <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />
+
+ <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="true" />
+ <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
+ <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
+
+ <texture name="Sync_Disabled" file_name="icons/Sync_Disabled.png" preload="true" />
+ <texture name="Sync_Enabled" file_name="icons/Sync_Enabled.png" preload="true" />
+ <texture name="Sync_Progress_1" file_name="icons/Sync_Progress_1.png" preload="true" />
+ <texture name="Sync_Progress_2" file_name="icons/Sync_Progress_2.png" preload="true" />
+ <texture name="Sync_Progress_3" file_name="icons/Sync_Progress_3.png" preload="true" />
+ <texture name="Sync_Progress_4" file_name="icons/Sync_Progress_4.png" preload="true" />
+ <texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" />
+ <texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" />
+
+ <texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />
+ <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" />
+ <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" />
+ <texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" />
+ <texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" />
+ <texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" />
+ <texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" />
+
+ <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Right_Flashing" file_name="containers/TabTop_Right_Flashing.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Middle_Off" file_name="containers/TabTop_Middle_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
+ <texture name="TabTop_Middle_Selected" file_name="containers/TabTop_Middle_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
+ <texture name="TabTop_Left_Off" file_name="containers/TabTop_Left_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
+ <texture name="TabTop_Left_Selected" file_name="containers/TabTop_Left_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
+
+ <texture name="TaskPanel_Tab_Off" file_name="taskpanel/TaskPanel_Tab_Off.png" preload="false" scale.left="4" scale.top="29" scale.right="36" scale.bottom="4" />
+ <texture name="TaskPanel_Tab_Selected" file_name="taskpanel/TaskPanel_Tab_Selected.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" />
+
+ <texture name="TextField_Search_Disabled" file_name="widgets/TextField_Search_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Off" file_name="widgets/TextField_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Search_Active" file_name="widgets/TextField_Search_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Search_Highlight" file_name="widgets/TextField_Search_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+
+ <texture name="Thumbnail_Fallback" file_name="icons/thumbnail_fallback_icon.png" preload="true" />
+
+ <texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" />
+ <texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true"
+ scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
+ <texture name="Toast_Over" file_name="windows/Toast_Over.png" preload="true"
+ scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
+
+ <texture name="Tool_Create" file_name="build/Tool_Create.png" preload="false" />
+ <texture name="Tool_Dozer" file_name="build/Tool_Dozer.png" preload="false" />
+ <texture name="Tool_Face" file_name="build/Tool_Face.png" preload="false" />
+ <texture name="Tool_Grab" file_name="build/Tool_Grab.png" preload="false" />
+ <texture name="Tool_Zoom" file_name="build/Tool_Zoom.png" preload="false" />
+
+ <texture name="Toolbar_Left_Flash" file_name="containers/Toolbar_Left_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Over" file_name="containers/Toolbar_Left_Over.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Selected" file_name="containers/Toolbar_Left_Selected.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Off" file_name="containers/Toolbar_Middle_Off.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Over" file_name="containers/Toolbar_Middle_Over.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Selected" file_name="containers/Toolbar_Middle_Selected.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Flash" file_name="containers/Toolbar_Middle_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Over" file_name="containers/Toolbar_Right_Over.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Flash" file_name="containers/Toolbar_Right_Flash.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+
+ <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
+
+ <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
+ <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
+ <texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" />
+
+ <texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />
+
+ <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" />
+
+ <texture name="Video_URL_Off" file_name="icons/Video_URL_Off.png" preload="true" />
+
+ <texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120" scale_type="scale_outer"/>
+
+ <texture name="VirtualTrackball_Moon_Back" file_name="widgets/track_control_moon_back.png" />
+ <texture name="VirtualTrackball_Moon_Front" file_name="widgets/track_control_moon_front.png" />
+ <texture name="VirtualTrackball_Rotate_Bottom" file_name="widgets/track_control_rotate_bottom.png" />
+ <texture name="VirtualTrackball_Rotate_Left" file_name="widgets/track_control_rotate_left_side.png" />
+ <texture name="VirtualTrackball_Rotate_Right" file_name="widgets/track_control_rotate_right_side.png" />
+ <texture name="VirtualTrackball_Rotate_Top" file_name="widgets/track_control_rotate_top.png" />
+ <texture name="VirtualTrackball_Rotate_Bottom_Active" file_name="widgets/track_control_rotate_bottom_active.png" />
+ <texture name="VirtualTrackball_Rotate_Left_Active" file_name="widgets/track_control_rotate_left_side_active.png" />
+ <texture name="VirtualTrackball_Rotate_Right_Active" file_name="widgets/track_control_rotate_right_side_active.png" />
+ <texture name="VirtualTrackball_Rotate_Top_Active" file_name="widgets/track_control_rotate_top_active.png" />
+ <texture name="VirtualTrackball_Sphere" file_name="widgets/track_control_sphere.png" />
+ <texture name="VirtualTrackball_Sun_Back" file_name="widgets/track_control_sun_back.png" />
+ <texture name="VirtualTrackball_Sun_Front" file_name="widgets/track_control_sun_front.png" />
+
+ <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
+ scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
+
+ <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
+ <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
+ <texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" />
+ <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
+ <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
+
+ <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
+
+ <texture name="Add_Icon" file_name="icons/add_icon.png" preload="false" />
+ <texture name="Remove_Icon" file_name="icons/remove_icon.png" preload="false" />
+
+ <texture name="Web_Profile_Off" file_name="icons/Web_Profile_Off.png" preload="false" />
+
+ <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
+ <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true"
+ scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
+ <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true"
+ scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
+ <texture name="Window_NoTitle_Background" file_name="windows/Window_Background.png" preload="true"
+ scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
+ <texture name="Window_NoTitle_Foreground" file_name="windows/Window_Foreground.png" preload="true"
+ scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
+
+ <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
+
+ <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
+ <texture name="UnZoom_Off" file_name="icons/UnZoom_Off.png" preload="false" />
+
+ <texture name="pixiesmall.j2c" use_mips="true" />
+ <texture name="script_error.j2c" use_mips="true" />
+ <texture name="silhouette.j2c" use_mips="true" />
+ <texture name="foot_shadow.j2c" use_mips="true" />
+ <texture name="cloud-particle.png" use_mips="true" />
+ <texture name="transparent.j2c" use_mips="true" />
+
+ <!--WARNING OLD ART BELOW *do not use*-->
+ <texture name="icn_media_web.tga" preload="true" />
+ <texture name="icn_media_movie.tga" preload="true" />
+
+ <texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" />
+ <texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" />
+ <texture name="jump_right_out.tga" file_name="widgets/jump_right_out.png" />
+ <texture name="jump_right_in.tga" file_name="widgets/jump_right_in.png" />
+
+ <texture name="scrollbutton_left_out_blue.tga" file_name="widgets/ScrollArrow_Left_Opaque.png" />
+ <texture name="scrollbutton_left_in_blue.tga" file_name="widgets/ScrollArrow_Left_Over_Opaque.png" />
+ <texture name="scrollbutton_right_out_blue.tga" file_name="widgets/ScrollArrow_Right_Opaque.png" />
+ <texture name="scrollbutton_right_in_blue.tga" file_name="widgets/ScrollArrow_Right_Over_Opaque.png" />
+ <texture name="scrollbutton_up_out_blue.tga" file_name="widgets/ScrollArrow_Up_Opaque.png" />
+ <texture name="scrollbutton_up_in_blue.tga" file_name="widgets/ScrollArrow_Up_Over_Opaque.png" />
+ <texture name="scrollbutton_down_out_blue.tga" file_name="widgets/ScrollArrow_Down_Opaque.png" />
+ <texture name="scrollbutton_down_in_blue.tga" file_name="widgets/ScrollArrow_Down_Over_Opaque.png" />
+
+ <texture name="up_arrow.tga" file_name="up_arrow.png" />
+ <texture name="down_arrow.tga" file_name="down_arrow.png" />
+ <texture name="arrow_down.tga" />
+
+ <texture name="tearoffbox.tga" />
+ <texture name="tearoff_pressed.tga" />
+
+ <texture name="color_swatch_alpha.tga" preload="true" />
+
+ <texture name="button_anim_pause.tga" />
+ <texture name="button_anim_pause_selected.tga" />
+ <texture name="button_anim_play.tga" />
+ <texture name="button_anim_play_selected.tga" />
+ <texture name="crosshairs.tga" />
+ <texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" />
+
+ <texture name="icon_avatar_offline.tga" />
+ <texture name="icon_avatar_online.tga" />
+ <texture name="icon_diurnal.tga" />
+ <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />
+ <texture name="icon_top_pick.tga" />
+
+ <texture name="lag_status_critical.tga" />
+ <texture name="lag_status_good.tga" />
+ <texture name="lag_status_warning.tga" />
+
+ <texture name="legend.tga" />
+
+ <texture name="map_avatar_16.tga" />
+ <texture name="map_avatar_8.tga" />
+ <texture name="map_event.tga" />
+ <texture name="map_home.tga" />
+ <texture name="map_infohub.tga" />
+ <texture name="map_telehub.tga" />
+ <texture name="map_track_16.tga" />
+ <texture name="map_ui_collapse_icon.png" />
+ <texture name="map_ui_expand_icon.png" />
+
+ <texture name="notify_caution_icon.tga" />
+
+ <texture name="default_land_picture.j2c" file_name="default_land_picture.png"/>
+ <texture name="default_profile_picture.j2c" file_name="default_profile_picture.png"/>
+ <texture name="locked_image.j2c" />
+ <texture name="badge_note.j2c" />
+ <texture name="badge_warn.j2c" />
+ <texture name="badge_ok.j2c" />
+ <texture name="materials_ui_x_24.png" />
+
+ <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" />
+ <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" />
+ <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" />
+ <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" />
+ <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" />
+ <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" />
+ <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" />
+ <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" />
+ <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" />
+ <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" />
+ <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" />
+ <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" />
+
+ <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/>
+ <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+ <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+ <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+
+ <texture name="hint_background" file_name="windows/hint_background.png" preload="false" scale.left="8" scale.top="70" scale.right="195" scale.bottom="11"/>
+ <texture name="hint_arrow_left" file_name="windows/hint_arrow_left.png" preload="false"/>
+ <texture name="hint_arrow_right" file_name="windows/hint_arrow_right.png" preload="false"/>
+ <texture name="hint_arrow_up" file_name="windows/hint_arrow_up.png" preload="false"/>
+ <texture name="hint_arrow_down" file_name="windows/hint_arrow_down.png" preload="false"/>
+ <texture name="hint_arrow_lower_left" file_name="windows/hint_arrow_lower_left.png" preload="false"/>
+
+ <texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>
+ <texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>
+ <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
+ <texture name="NavBar Separator" file_name="navbar/separator.png"/>
+
+ <texture name="Default_Outfit_Photo" file_name="icons/Default_Outfit_Photo.png" preload="true"/>
+ <texture name="Notification_Condense" file_name="icons/Icon_Notification_Condense.png" preload="true"/>
+ <texture name="Notification_Expand" file_name="icons/Icon_Notification_Expand.png" preload="true"/>
+ <texture name="System_Notification" file_name="icons/MP_Logo.png" preload="true"/>
+ <texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/>
+ <texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/>
+
+ <texture name="Single_Folder_Mode" file_name="icons/single_folder_mode.png" preload="true"/>
+ <texture name="Multi_Folder_Mode" file_name="icons/multi_folder_mode.png" preload="true"/>
+ <texture name="Single_Folder_Back" file_name="icons/single_folder_back.png" preload="true"/>
+ <texture name="Single_Folder_Forward" file_name="icons/single_folder_forward.png" preload="true"/>
+ <texture name="Single_Folder_Up" file_name="icons/single_folder_up.png" preload="true"/>
+ <texture name="Icon_Color_Palette" file_name="icons/Icon_Color_Palette.png" preload="false"/>
+ <texture name="Icon_Font_Size" file_name="icons/Icon_Font_Size.png" preload="false"/>
+
+ <texture name="Icon_Place" file_name="megapahit/icon_place.png" preload="false" />
+ <texture name="Icon_Auction" file_name="megapahit/icon_land_auction.png" preload="false" />
+ <texture name="Icon_For_Sale" file_name="megapahit/icon_land_forsale.png" preload="false" />
+ <texture name="Icon_Group" file_name="megapahit/icon_group.png" preload="false" />
+ <texture name="Icon_Legacy_Event_PG" file_name="icons/Parcel_PG_Dark.png" preload="false" />
+ <texture name="Icon_Legacy_Event_Mature" file_name="icons/Parcel_M_Dark.png" preload="false" />
+ <texture name="Icon_Legacy_Event_Adult" file_name="icons/Parcel_R_Dark.png" preload="false" />
+
+ <texture name="ProgressLarge_1" file_name="icons/ProgressLarge_1.png" preload="true" />
+ <texture name="ProgressLarge_2" file_name="icons/ProgressLarge_2.png" preload="true" />
+ <texture name="ProgressLarge_3" file_name="icons/ProgressLarge_3.png" preload="true" />
+ <texture name="ProgressLarge_4" file_name="icons/ProgressLarge_4.png" preload="true" />
+ <texture name="ProgressLarge_5" file_name="icons/ProgressLarge_5.png" preload="true" />
+ <texture name="ProgressLarge_6" file_name="icons/ProgressLarge_6.png" preload="true" />
+ <texture name="ProgressLarge_7" file_name="icons/ProgressLarge_7.png" preload="true" />
+ <texture name="ProgressLarge_8" file_name="icons/ProgressLarge_8.png" preload="true" />
+ <texture name="ProgressLarge_9" file_name="icons/ProgressLarge_9.png" preload="true" />
+ <texture name="ProgressLarge_10" file_name="icons/ProgressLarge_10.png" preload="true" />
+ <texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" />
+ <texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" />
+
+</textures>
diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_bottom.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_bottom.png
new file mode 100644
index 0000000000..5f6a01eaa1
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_bottom.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_left.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_left.png
new file mode 100644
index 0000000000..0b8090314c
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_left.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_right.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_right.png
new file mode 100644
index 0000000000..044751560f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_right.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting.png
new file mode 100644
index 0000000000..eeb43d165d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting_selected.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting_selected.png
new file mode 100644
index 0000000000..79d812ee3e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting_selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Down.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Down.png
new file mode 100644
index 0000000000..8b592ed840
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Down.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Left.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Left.png
new file mode 100644
index 0000000000..04416541b9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Left.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Right.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Right.png
new file mode 100644
index 0000000000..e57452a558
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Right.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Down.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Down.png
new file mode 100644
index 0000000000..8694cdf2d4
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Down.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Left.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Left.png
new file mode 100644
index 0000000000..a1b82d5101
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Left.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Right.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Right.png
new file mode 100644
index 0000000000..0e05d76852
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Right.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Up.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Up.png
new file mode 100644
index 0000000000..348bc4c019
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Up.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Up.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Up.png
new file mode 100644
index 0000000000..8b3da09d79
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Up.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Badge_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/Badge_Background.png
new file mode 100644
index 0000000000..5abc1bf489
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Badge_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Badge_Border.png b/indra/newview/skins/contrast_gold/textures/widgets/Badge_Border.png
new file mode 100644
index 0000000000..57d3be2320
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Badge_Border.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png
new file mode 100644
index 0000000000..e18872b6f6
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Off.png
new file mode 100644
index 0000000000..699ddd9bf3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Over.png
new file mode 100644
index 0000000000..12854bdb12
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Press.png
new file mode 100644
index 0000000000..1f04a1e9e8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png
new file mode 100644
index 0000000000..2cf3de24c0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Off.png
new file mode 100644
index 0000000000..52bcf88258
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Over.png
new file mode 100644
index 0000000000..efdd13003a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Press.png
new file mode 100644
index 0000000000..3c66b1f1cc
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png
new file mode 100644
index 0000000000..d9c9692114
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Off.png
new file mode 100644
index 0000000000..4935dae42e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Over.png
new file mode 100644
index 0000000000..6eeec08248
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Press.png
new file mode 100644
index 0000000000..2d6d08522b
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Disabled.png
new file mode 100644
index 0000000000..8439f82e29
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Off.png
new file mode 100644
index 0000000000..cb9a04d84f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On.png
new file mode 100644
index 0000000000..0ec090504a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Disabled.png
new file mode 100644
index 0000000000..5759f7de69
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Press.png
new file mode 100644
index 0000000000..ba46e91c55
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Press.png
new file mode 100644
index 0000000000..5f5a33d878
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Disabled.png
new file mode 100644
index 0000000000..ebeb813349
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Hover.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Hover.png
new file mode 100644
index 0000000000..1377d35e1a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Hover.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Off.png
new file mode 100644
index 0000000000..4f573cf6fa
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_On.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_On.png
new file mode 100644
index 0000000000..1d1ea1bd87
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Selected.png
new file mode 100644
index 0000000000..d87e46aba7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpOff.png
new file mode 100644
index 0000000000..5a067aca7c
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpOff.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpSelected.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpSelected.png
new file mode 100644
index 0000000000..34b0c70cb0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpSelected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DisclosureArrow_Opened_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/DisclosureArrow_Opened_Off.png
new file mode 100644
index 0000000000..115ec7a11f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/DisclosureArrow_Opened_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown.png
new file mode 100644
index 0000000000..30e14f8684
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Disabled.png
new file mode 100644
index 0000000000..fbc1f58aa5
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Off.png
new file mode 100644
index 0000000000..e21cd20ba9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown_On.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_On.png
new file mode 100644
index 0000000000..dc19edd130
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Press.png
new file mode 100644
index 0000000000..dc19edd130
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropTarget.png b/indra/newview/skins/contrast_gold/textures/widgets/DropTarget.png
new file mode 100644
index 0000000000..01e7a88861
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/DropTarget.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Error_Tag_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/Error_Tag_Background.png
new file mode 100644
index 0000000000..439fce3dd3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Error_Tag_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Alert.png b/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Alert.png
new file mode 100644
index 0000000000..76e078100f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Alert.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Background.png
new file mode 100644
index 0000000000..6e71ef7b72
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Over.png
new file mode 100644
index 0000000000..0ec8de776e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Select.png b/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Select.png
new file mode 100644
index 0000000000..6dd7b3c638
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Select.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Off.png
new file mode 100644
index 0000000000..37cd0f6108
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Selected.png
new file mode 100644
index 0000000000..3d9d474966
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Marketplace_Dropzone_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/Marketplace_Dropzone_Background.png
new file mode 100644
index 0000000000..9eb4a5c55d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Marketplace_Dropzone_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Background.png
new file mode 100644
index 0000000000..3631d90825
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Border.png b/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Border.png
new file mode 100644
index 0000000000..d9b78eeea4
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Border.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ProgressBar.png b/indra/newview/skins/contrast_gold/textures/widgets/ProgressBar.png
new file mode 100644
index 0000000000..85a8559ceb
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ProgressBar.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ProgressBarSolid.png b/indra/newview/skins/contrast_gold/textures/widgets/ProgressBarSolid.png
new file mode 100644
index 0000000000..59a798464d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ProgressBarSolid.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ProgressTrack.png b/indra/newview/skins/contrast_gold/textures/widgets/ProgressTrack.png
new file mode 100644
index 0000000000..f4be9f5ccd
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ProgressTrack.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Disabled.png
new file mode 100644
index 0000000000..e99ec4b14b
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login.png
new file mode 100644
index 0000000000..8e7d932ab1
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Over.png
new file mode 100644
index 0000000000..038ba23be2
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Pressed.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Pressed.png
new file mode 100644
index 0000000000..828aa1a139
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Pressed.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Off.png
new file mode 100644
index 0000000000..8d0b56ade0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On.png
new file mode 100644
index 0000000000..cdbcf6be4d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On_Selected.png
new file mode 100644
index 0000000000..cdbcf6be4d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Over.png
new file mode 100644
index 0000000000..db8ad9d691
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Press.png
new file mode 100644
index 0000000000..cdbcf6be4d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected.png
new file mode 100644
index 0000000000..cdbcf6be4d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Disabled.png
new file mode 100644
index 0000000000..c44b0d2083
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Press.png
new file mode 100644
index 0000000000..cdbcf6be4d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Disabled.png
new file mode 100644
index 0000000000..32ec25fe0e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Off.png
new file mode 100644
index 0000000000..5d267af5dc
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On.png
new file mode 100644
index 0000000000..e6bf0db157
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Disabled.png
new file mode 100644
index 0000000000..72aae43618
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Press.png
new file mode 100644
index 0000000000..f3883b82b3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Press.png
new file mode 100644
index 0000000000..0025256045
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down.png
new file mode 100644
index 0000000000..768909d447
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Opaque.png
new file mode 100644
index 0000000000..1c57521e9e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png
new file mode 100644
index 0000000000..3db7be9ffa
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left.png
new file mode 100644
index 0000000000..9ef73f48a5
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Opaque.png
new file mode 100644
index 0000000000..0fb0671036
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png
new file mode 100644
index 0000000000..464130c359
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right.png
new file mode 100644
index 0000000000..8a59274b8a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Opaque.png
new file mode 100644
index 0000000000..ab1f1ac90b
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png
new file mode 100644
index 0000000000..e5a94429a3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up.png
new file mode 100644
index 0000000000..064580f0c8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Opaque.png
new file mode 100644
index 0000000000..2cc4857d27
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png
new file mode 100644
index 0000000000..2018b53af9
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Horiz.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Horiz.png
new file mode 100644
index 0000000000..9afc907c1c
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Horiz.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Vert.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Vert.png
new file mode 100644
index 0000000000..ede643e528
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Vert.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Horiz.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Horiz.png
new file mode 100644
index 0000000000..35da770073
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Horiz.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Vert.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Vert.png
new file mode 100644
index 0000000000..cf67c23133
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Vert.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Disabled.png
new file mode 100644
index 0000000000..ba63751690
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Off.png
new file mode 100644
index 0000000000..1a9f7e9d71
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Over.png
new file mode 100644
index 0000000000..e4fcf491ba
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Press.png
new file mode 100644
index 0000000000..dbe6651dc8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected.png
new file mode 100644
index 0000000000..dbe6651dc8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png
new file mode 100644
index 0000000000..fb91d76860
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png
new file mode 100644
index 0000000000..fb91d76860
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png
new file mode 100644
index 0000000000..fb91d76860
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Disabled.png
new file mode 100644
index 0000000000..d9f05d33ec
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected.png
new file mode 100644
index 0000000000..d2342f6538
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
new file mode 100644
index 0000000000..5e3b275c46
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
new file mode 100644
index 0000000000..5e3b275c46
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Disabled.png
new file mode 100644
index 0000000000..ecd2144d6d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Off.png
new file mode 100644
index 0000000000..1901d5e843
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_On_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_On_Selected.png
new file mode 100644
index 0000000000..a09415cd59
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_On_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Over.png
new file mode 100644
index 0000000000..534c30cddc
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Press.png
new file mode 100644
index 0000000000..a97612ce2f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected.png
new file mode 100644
index 0000000000..a97612ce2f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png
new file mode 100644
index 0000000000..ca7551a267
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png
new file mode 100644
index 0000000000..d7e9451f76
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Disabled.png
new file mode 100644
index 0000000000..5cfa3ae4e1
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Off.png
new file mode 100644
index 0000000000..66cdcbeb94
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Press.png
new file mode 100644
index 0000000000..0bf8e43e81
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Horiz.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Horiz.png
new file mode 100644
index 0000000000..720830f83f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Horiz.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Vert.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Vert.png
new file mode 100644
index 0000000000..c01db44707
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Vert.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Off.png
new file mode 100644
index 0000000000..ff21034095
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Press.png
new file mode 100644
index 0000000000..7349132503
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Off.png
new file mode 100644
index 0000000000..133845bdbc
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Press.png
new file mode 100644
index 0000000000..3dce7733c2
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Active.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Active.png
new file mode 100644
index 0000000000..66c3867b81
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Active.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Disabled.png
new file mode 100644
index 0000000000..baf747f581
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Off.png
new file mode 100644
index 0000000000..a35562f950
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Active.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Active.png
new file mode 100644
index 0000000000..572535f1ab
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Active.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Disabled.png
new file mode 100644
index 0000000000..94b4b158f7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Highlight.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Highlight.png
new file mode 100644
index 0000000000..7768da04e8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Highlight.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Off.png
new file mode 100644
index 0000000000..fccd38c807
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Tooltip.png b/indra/newview/skins/contrast_gold/textures/widgets/Tooltip.png
new file mode 100644
index 0000000000..1be53bdaa2
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/Tooltip.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/bevel_background.png b/indra/newview/skins/contrast_gold/textures/widgets/bevel_background.png
new file mode 100644
index 0000000000..6304124aec
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/bevel_background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/buy_off.png b/indra/newview/skins/contrast_gold/textures/widgets/buy_off.png
new file mode 100644
index 0000000000..f623b501e2
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/buy_off.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/buy_over.png b/indra/newview/skins/contrast_gold/textures/widgets/buy_over.png
new file mode 100644
index 0000000000..25d4173242
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/buy_over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/buy_press.png b/indra/newview/skins/contrast_gold/textures/widgets/buy_press.png
new file mode 100644
index 0000000000..3195431c84
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/buy_press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/horizontal_drag_handle.png b/indra/newview/skins/contrast_gold/textures/widgets/horizontal_drag_handle.png
new file mode 100644
index 0000000000..631d653968
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/horizontal_drag_handle.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/jump_left_in.png b/indra/newview/skins/contrast_gold/textures/widgets/jump_left_in.png
new file mode 100644
index 0000000000..073606628c
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/jump_left_in.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/jump_left_out.png b/indra/newview/skins/contrast_gold/textures/widgets/jump_left_out.png
new file mode 100644
index 0000000000..71d5c5c36a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/jump_left_out.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/jump_right_in.png b/indra/newview/skins/contrast_gold/textures/widgets/jump_right_in.png
new file mode 100644
index 0000000000..96f8501932
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/jump_right_in.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/widgets/jump_right_out.png b/indra/newview/skins/contrast_gold/textures/widgets/jump_right_out.png
new file mode 100644
index 0000000000..9c02f5f649
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/widgets/jump_right_out.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/vertical_drag_handle.png b/indra/newview/skins/contrast_gold/textures/widgets/vertical_drag_handle.png
index d78e898a9c..d78e898a9c 100644
--- a/indra/newview/skins/contrast/textures/widgets/vertical_drag_handle.png
+++ b/indra/newview/skins/contrast_gold/textures/widgets/vertical_drag_handle.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Dragbar.png b/indra/newview/skins/contrast_gold/textures/windows/Dragbar.png
new file mode 100644
index 0000000000..3a998abdc3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Dragbar.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Flyout_Left.png b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Left.png
new file mode 100644
index 0000000000..3110d7f6b5
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Left.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Flyout_Pointer.png b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Pointer.png
new file mode 100644
index 0000000000..4076bb393e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Pointer.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Flyout_Right.png b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Right.png
new file mode 100644
index 0000000000..4c55cd6287
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Right.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Foreground.png
new file mode 100644
index 0000000000..cb516886a2
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Press.png
new file mode 100644
index 0000000000..283981f6ea
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Toast.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Toast.png
new file mode 100644
index 0000000000..b08ffbc742
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Toast.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Foreground.png
new file mode 100644
index 0000000000..7508fcb25e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Press.png
new file mode 100644
index 0000000000..3f2c560398
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear.png
new file mode 100644
index 0000000000..7cf85bece4
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Background.png
new file mode 100644
index 0000000000..09d83e62e4
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Foreground.png
new file mode 100644
index 0000000000..fa998eee5d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Press.png
new file mode 100644
index 0000000000..603fa2f388
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Foreground.png
new file mode 100644
index 0000000000..1bde4c040a
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Press.png
new file mode 100644
index 0000000000..f3b885283f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Foreground.png
new file mode 100644
index 0000000000..942efb40f7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Press.png
new file mode 100644
index 0000000000..1fe37b7a2e
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Foreground.png
new file mode 100644
index 0000000000..7840deccb8
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Press.png
new file mode 100644
index 0000000000..33258a0bc5
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Undock_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Undock_Foreground.png
new file mode 100644
index 0000000000..df826226e6
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Undock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Inspector_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Inspector_Background.png
new file mode 100644
index 0000000000..3053269b84
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Inspector_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Inspector_Hover.png b/indra/newview/skins/contrast_gold/textures/windows/Inspector_Hover.png
new file mode 100644
index 0000000000..0cb846eba0
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Inspector_Hover.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Inspector_I.png b/indra/newview/skins/contrast_gold/textures/windows/Inspector_I.png
new file mode 100644
index 0000000000..e5899c55a7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Inspector_I.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Resize_Corner.png b/indra/newview/skins/contrast_gold/textures/windows/Resize_Corner.png
new file mode 100644
index 0000000000..4a533011df
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Resize_Corner.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Toast_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Toast_Background.png
new file mode 100644
index 0000000000..00676350ca
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Toast_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Toast_CloseBtn.png b/indra/newview/skins/contrast_gold/textures/windows/Toast_CloseBtn.png
new file mode 100644
index 0000000000..f37d8d085d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Toast_CloseBtn.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Toast_Over.png b/indra/newview/skins/contrast_gold/textures/windows/Toast_Over.png
new file mode 100644
index 0000000000..5191e0858d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Toast_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Volume_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Volume_Background.png
new file mode 100644
index 0000000000..439e9fd2a1
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Volume_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Wearables_Divider.png b/indra/newview/skins/contrast_gold/textures/windows/Wearables_Divider.png
new file mode 100644
index 0000000000..8795ccd661
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Wearables_Divider.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Window_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Window_Background.png
new file mode 100644
index 0000000000..1df5943e1b
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Window_Background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/Window_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Window_Foreground.png
new file mode 100644
index 0000000000..988ec48eb7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/Window_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/first_login_image.jpg b/indra/newview/skins/contrast_gold/textures/windows/first_login_image.jpg
new file mode 100644
index 0000000000..860fed4ac7
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/first_login_image.jpg
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_down.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_down.png
new file mode 100644
index 0000000000..b449d3be7c
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_down.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_left.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_left.png
new file mode 100644
index 0000000000..d93d621067
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_left.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_lower_left.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_lower_left.png
new file mode 100644
index 0000000000..5e8def5a5b
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_lower_left.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_right.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_right.png
new file mode 100644
index 0000000000..3524487fb3
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_right.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_up.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_up.png
new file mode 100644
index 0000000000..aca440d712
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_up.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_background.png b/indra/newview/skins/contrast_gold/textures/windows/hint_background.png
new file mode 100644
index 0000000000..d045bc5e29
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/hint_background.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo.png b/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo.png
new file mode 100644
index 0000000000..7526374ba2
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo_small.png b/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo_small.png
new file mode 100644
index 0000000000..779d8ff649
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo_small.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo.png b/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo.png
new file mode 100644
index 0000000000..e4d4eb3ebf
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo_small.png b/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo_small.png
new file mode 100644
index 0000000000..36fb15de08
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo_small.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/startup_logo.png b/indra/newview/skins/contrast_gold/textures/windows/startup_logo.png
new file mode 100644
index 0000000000..6a81a6451d
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/startup_logo.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/windows/yellow_gradient.png b/indra/newview/skins/contrast_gold/textures/windows/yellow_gradient.png
new file mode 100644
index 0000000000..4a07282ecb
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/windows/yellow_gradient.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/world/CameraDragDot.png b/indra/newview/skins/contrast_gold/textures/world/CameraDragDot.png
new file mode 100644
index 0000000000..2ccf098e0f
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/world/CameraDragDot.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/world/NoEntryLines.png b/indra/newview/skins/contrast_gold/textures/world/NoEntryLines.png
new file mode 100644
index 0000000000..b295ba1281
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/world/NoEntryLines.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/textures/world/NoEntryPassLines.png b/indra/newview/skins/contrast_gold/textures/world/NoEntryPassLines.png
new file mode 100644
index 0000000000..34900e2c02
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/textures/world/NoEntryPassLines.png
Binary files differ
diff --git a/indra/newview/skins/contrast_gold/xui/en/panel_progress.xml b/indra/newview/skins/contrast_gold/xui/en/panel_progress.xml
new file mode 100644
index 0000000000..7bf851a234
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/xui/en/panel_progress.xml
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel
+ follows="left|bottom|right|top"
+ height="768"
+ layout="topleft"
+ left="0"
+ name="login_progress_panel"
+ top="768"
+ width="1024">
+ <layout_stack
+ follows="left|right|top|bottom"
+ height="768"
+ layout="topleft"
+ left="0"
+ name="horizontal_centering"
+ orientation="horizontal"
+ top="0"
+ width="1024">
+ <layout_panel
+ layout="topleft"
+ min_width="10"
+ name="left"
+ width="150" />
+ <layout_panel
+ height="768"
+ layout="topleft"
+ min_width="670"
+ name="center"
+ width="670">
+ <layout_stack
+ follows="left|right|top|bottom"
+ height="768"
+ layout="topleft"
+ left="0"
+ orientation="vertical"
+ name="vertical_centering1"
+ top="0"
+ width="670">
+ <layout_panel
+ height="200"
+ layout="topleft"
+ min_height="10"
+ name="panel3"
+ width="670" />
+ <layout_panel
+ auto_resize="false"
+ height="255"
+ layout="topleft"
+ min_height="255"
+ name="panel4"
+ width="670">
+ <icon
+ color="LoginProgressBoxCenterColor"
+ follows="left|right|bottom|top"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left="0"
+ top="0"
+ height="255"
+ width="670" />
+ <layout_stack
+ follows="left|right|top|bottom"
+ height="255"
+ layout="topleft"
+ left="0"
+ orientation="vertical"
+ name="vertical_centering2"
+ animate="false"
+ top="0"
+ width="670">
+ <layout_panel
+ auto_resize="false"
+ height="30"
+ layout="topleft"
+ min_height="30"
+ name="panel_top_spacer"
+ width="670">
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="100"
+ layout="topleft"
+ min_height="100"
+ name="panel_login"
+ width="670">
+ <text
+ follows="left|right|top"
+ layout="topleft"
+ font="SansSerifHuge"
+ font_shadow="none"
+ halign="left"
+ height="20"
+ left="47"
+ top="32"
+ right="-47"
+ name="title_text"
+ text_color="LoginProgressBoxTextColor"/>
+ <text
+ follows="left|right|top"
+ layout="topleft"
+ font="SansSerif"
+ font_shadow="none"
+ halign="left"
+ height="20"
+ top_pad="5"
+ right="-47"
+ left_delta="0"
+ name="progress_text"
+ text_color="LoginProgressBoxTextColor"
+ word_wrap="true"/>
+ <progress_bar
+ color_bar="0.857 0.668 0.308 0.96"
+ follows="left|right|top"
+ layout="topleft"
+ image_fill="ProgressBarSolid"
+ height="16"
+ left="45"
+ top_pad="5"
+ name="login_progress_bar"
+ right="-45" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="90"
+ layout="topleft"
+ min_height="90"
+ name="panel_motd"
+ width="670">
+ <text
+ follows="left|right|top|bottom"
+ font="SansSerifLarge"
+ font_shadow="none"
+ halign="left"
+ valign="center"
+ height="80"
+ layout="topleft"
+ left="45"
+ line_spacing.pixels="2"
+ name="message_text"
+ text_color="LoginProgressBoxTextColor"
+ top="7"
+ right="-90"
+ word_wrap="true"/>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="40"
+ layout="topleft"
+ min_height="40"
+ name="panel_icons"
+ width="670">
+ <!--Logos are tied to following label from code-->
+ <text
+ follows="left|right|top"
+ layout="topleft"
+ font="SansSerifLarge"
+ font_shadow="none"
+ halign="left"
+ height="16"
+ width="240"
+ left="47"
+ top="6"
+ line_spacing.pixels="2"
+ name="logos_lbl"
+ text_color="LoginProgressBoxTextColor">
+ Megapahit uses
+ </text>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel
+ height="200"
+ layout="topleft"
+ min_width="10"
+ name="panel5"
+ width="670" />
+ </layout_stack>
+ </layout_panel>
+ <layout_panel
+ layout="topleft"
+ min_width="10"
+ name="right"
+ width="150" />
+ </layout_stack>
+ <button
+ follows="right|bottom"
+ height="22"
+ layout="topleft"
+ left="-106"
+ name="cancel_btn"
+ top="700"
+ width="90" />
+ <web_browser
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="login_media_panel"
+ width="1024"
+ height="768"
+ top="0"/>
+</panel>
diff --git a/indra/newview/skins/contrast_gold/xui/en/widgets/progress_bar.xml b/indra/newview/skins/contrast_gold/xui/en/widgets/progress_bar.xml
new file mode 100644
index 0000000000..e55950dd33
--- /dev/null
+++ b/indra/newview/skins/contrast_gold/xui/en/widgets/progress_bar.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<progress_bar image_bar="ProgressTrack"
+ image_fill="ProgressBar"
+ color_bar.red="0,664"
+ color_bar.green="0,467"
+ color_bar.blue="0,156"
+ color_bar.alpha="1"
+ color_bg.red="0,664"
+ color_bg.green="0,467"
+ color_bg.blue="0,156"
+ color_bg.alpha="1"
+ />
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index bc9aef8974..699b727212 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -458,6 +458,9 @@
name="InventoryBackgroundColor"
reference="DkGray2" />
<color
+ name="InventoryFavoriteColor"
+ reference="Yellow" />
+ <color
name="InventoryFocusOutlineColor"
reference="White_25" />
<color
@@ -590,7 +593,7 @@
-->
<color
name="NameTagBackground"
- value="0 0 0 1" />
+ value="0.101 0.101 0.101 0.6" />
<color
name="NameTagChat"
reference="White" />
@@ -1004,4 +1007,16 @@
<color
name="OutfitSnapshotMacMask2"
value="0.1 0.1 0.1 1"/>
+ <color
+ name="ChatMentionFont"
+ value="0.3 0.82 1 1" />
+ <color
+ name="ChatMentionHighlight"
+ value="0.82 0.91 0.98 0.15" />
+ <color
+ name="ChatSelfMentionHighlight"
+ value="1 1 0 0.35" />
+ <color
+ name="MentionFlashBgColor"
+ value="1 1 0 0.5" />
</colors>
diff --git a/indra/newview/skins/default/textures/3p_icons/fmod_logo.png b/indra/newview/skins/default/textures/3p_icons/fmod_logo.png
new file mode 100644
index 0000000000..5a50e0ad34
--- /dev/null
+++ b/indra/newview/skins/default/textures/3p_icons/fmod_logo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/3p_icons/havok_logo.png b/indra/newview/skins/default/textures/3p_icons/havok_logo.png
new file mode 100644
index 0000000000..ff1ea3a72e
--- /dev/null
+++ b/indra/newview/skins/default/textures/3p_icons/havok_logo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/cloud-particle.j2c b/indra/newview/skins/default/textures/cloud-particle.j2c
deleted file mode 100644
index 6c03bf6d05..0000000000
--- a/indra/newview/skins/default/textures/cloud-particle.j2c
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/cloud-particle.png b/indra/newview/skins/default/textures/cloud-particle.png
new file mode 100644
index 0000000000..f2080ddb9f
--- /dev/null
+++ b/indra/newview/skins/default/textures/cloud-particle.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Icon_Pointer.png b/indra/newview/skins/default/textures/icons/Icon_Pointer.png
new file mode 100644
index 0000000000..021942a8aa
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Icon_Pointer.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.png b/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.png
new file mode 100644
index 0000000000..b71b202234
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.png b/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.png
new file mode 100644
index 0000000000..7d55fb5cfe
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/MP_Logo.png b/indra/newview/skins/default/textures/icons/MP_Logo.png
index 54c47d4508..6aba54189f 100644
--- a/indra/newview/skins/default/textures/icons/MP_Logo.png
+++ b/indra/newview/skins/default/textures/icons/MP_Logo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/fps_button.png b/indra/newview/skins/default/textures/megapahit/fps_button.png
new file mode 100644
index 0000000000..fa436a620d
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/fps_button.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png
new file mode 100644
index 0000000000..1a27570786
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png
new file mode 100644
index 0000000000..f4c28e4bc9
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png
new file mode 100644
index 0000000000..64c8933a78
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png
new file mode 100644
index 0000000000..c90767b9ac
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png
new file mode 100644
index 0000000000..aeaa52b53b
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png
new file mode 100644
index 0000000000..026fbaf56d
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Info_Off.png b/indra/newview/skins/default/textures/navbar/Info_Off.png
index 64722255a3..6399cd6715 100644
--- a/indra/newview/skins/default/textures/navbar/Info_Off.png
+++ b/indra/newview/skins/default/textures/navbar/Info_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Info_Over.png b/indra/newview/skins/default/textures/navbar/Info_Over.png
index 84f1d03129..a296d2014f 100644
--- a/indra/newview/skins/default/textures/navbar/Info_Over.png
+++ b/indra/newview/skins/default/textures/navbar/Info_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Info_Press.png b/indra/newview/skins/default/textures/navbar/Info_Press.png
index 169105829e..2afc4a9143 100644
--- a/indra/newview/skins/default/textures/navbar/Info_Press.png
+++ b/indra/newview/skins/default/textures/navbar/Info_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index f824816183..40ee205090 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -87,7 +87,7 @@ with the same filename but different name
<texture name="BreadCrumbBtn_Left_Off" file_name="widgets/BreadCrumbBtn_Left_Off.png" preload="false"/>
<texture name="BreadCrumbBtn_Left_Over" file_name="widgets/BreadCrumbBtn_Left_Over.png" preload="false"/>
<texture name="BreadCrumbBtn_Left_Press" file_name="widgets/BreadCrumbBtn_Left_Press.png" preload="false"/>
-
+
<texture name="BreadCrumbBtn_Middle_Disabled" file_name="widgets/BreadCrumbBtn_Middle_Disabled.png" preload="false"/>
<texture name="BreadCrumbBtn_Middle_Off" file_name="widgets/BreadCrumbBtn_Middle_Off.png" preload="false"/>
<texture name="BreadCrumbBtn_Middle_Over" file_name="widgets/BreadCrumbBtn_Middle_Over.png" preload="false"/>
@@ -194,7 +194,7 @@ with the same filename but different name
<texture name="Copy" file_name="icons/Copy.png" preload="false" />
<texture name="CopyBright" file_name="icons/CopyBright.png" preload="false" />
-
+
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
<texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
@@ -246,7 +246,7 @@ with the same filename but different name
<texture name="Group_Notices" file_name="icons/Group_Notices.png" preload="false" />
<texture name="Hand" file_name="icons/hand.png" preload="false" />
-
+
<texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" />
<texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" />
@@ -259,16 +259,16 @@ with the same filename but different name
<texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" />
<texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" />
<texture name="Icon_Close_Toast" file_name="windows/Icon_Close_Toast.png" preload="true" />
-
+
<texture name="Icon_Copy" file_name="icons/copy_clipboard.png" preload="true" />
-
+
<texture name="Icon_Delete" file_name="icons/delete_icon.png" preload="true" />
<texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" />
<texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" />
<texture name="Icon_File_Upload" file_name="icons/file_upload.png" preload="true" />
-
+
<texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" />
<texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" />
@@ -281,14 +281,14 @@ with the same filename but different name
<texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" />
<texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" />
-
+
<texture name="Icon_Paste" file_name="icons/paste_clipboard.png" preload="true" />
<texture name="Icon_Restore_Foreground" file_name="windows/Icon_Restore_Foreground.png" preload="false" />
<texture name="Icon_Restore_Press" file_name="windows/Icon_Restore_Press.png" preload="false" />
<texture name="Icon_Snapshot" file_name="icons/snapshot_icon.png" preload="true" />
-
+
<texture name="Icon_Use_Texture" file_name="icons/texture_icon.png" preload="true" />
<texture name="Info" file_name="icons/Info.png" preload="false" />
@@ -308,6 +308,8 @@ with the same filename but different name
<texture name="Inv_CallingCard" file_name="icons/Inv_CallingCard.png" preload="false" />
<texture name="Inv_Clothing" file_name="icons/Inv_Clothing.png" preload="false" />
<texture name="Inv_Eye" file_name="icons/Inv_Eye.png" preload="false" />
+ <texture name="Inv_Favorite_Star_Content" file_name="icons/Inv_Favorite_Star_Content.png" preload="false" />
+ <texture name="Inv_Favorite_Star_Full" file_name="icons/Inv_Favorite_Star_Full.png" preload="false" />
<texture name="Inv_FolderClosed" file_name="icons/Inv_FolderClosed.png" preload="false" />
<texture name="Inv_FolderOpen" file_name="icons/Inv_FolderOpen.png" preload="false" />
<texture name="Inv_Gesture" file_name="icons/Inv_Gesture.png" preload="false" />
@@ -322,7 +324,7 @@ with the same filename but different name
<texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" />
<texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
<texture name="Inv_Material" file_name="icons/Inv_Material.png" preload="false" />
- <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" />
+ <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" />
<texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
<texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
<texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" />
@@ -377,7 +379,7 @@ with the same filename but different name
<texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" />
<texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" />
-
+
<texture name="Marketplace_Dropzone_Background" file_name="widgets/Marketplace_Dropzone_Background.png" preload="true" />
<texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
<texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
@@ -393,7 +395,7 @@ with the same filename but different name
<texture name="ModelImport_Status_Good" file_name="green_checkmark.png" preload="false"/>
<texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/>
<texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/>
-
+
<texture name="MouseLook_View_Off" file_name="bottomtray/Mouselook_View_Off.png" preload="false" />
<texture name="MouseLook_View_On" file_name="bottomtray/Mouselook_View_On.png" preload="false" />
@@ -549,7 +551,7 @@ with the same filename but different name
<texture name="Profile_Perm_Objects_Enabled" file_name="icons/Profile_Perm_Objects_Enabled.png" preload="true"/>
<texture name="Profile_Perm_Online_Disabled" file_name="icons/Profile_Perm_Online_Disabled.png" preload="true"/>
<texture name="Profile_Perm_Online_Enabled" file_name="icons/Profile_Perm_Online_Enabled.png" preload="true"/>
-
+
<texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
<texture name="ProgressBarSolid" file_name="widgets/ProgressBarSolid.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
<texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" />
@@ -742,7 +744,7 @@ with the same filename but different name
<texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" />
<texture name="Video_URL_Off" file_name="icons/Video_URL_Off.png" preload="true" />
-
+
<texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120" scale_type="scale_outer"/>
<texture name="VirtualTrackball_Moon_Back" file_name="widgets/track_control_moon_back.png" />
@@ -758,7 +760,7 @@ with the same filename but different name
<texture name="VirtualTrackball_Sphere" file_name="widgets/track_control_sphere.png" />
<texture name="VirtualTrackball_Sun_Back" file_name="widgets/track_control_sun_back.png" />
<texture name="VirtualTrackball_Sun_Front" file_name="widgets/track_control_sun_front.png" />
-
+
<texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
@@ -767,7 +769,7 @@ with the same filename but different name
<texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" />
<texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
<texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
-
+
<texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
<texture name="Add_Icon" file_name="icons/add_icon.png" preload="false" />
@@ -796,7 +798,7 @@ with the same filename but different name
<texture name="script_error.j2c" use_mips="true" />
<texture name="silhouette.j2c" use_mips="true" />
<texture name="foot_shadow.j2c" use_mips="true" />
- <texture name="cloud-particle.j2c" use_mips="true" />
+ <texture name="cloud-particle.png" use_mips="true" />
<texture name="transparent.j2c" use_mips="true" />
<!--WARNING OLD ART BELOW *do not use*-->
@@ -882,7 +884,7 @@ with the same filename but different name
<texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
<texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
<texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
-
+
<texture name="hint_background" file_name="windows/hint_background.png" preload="false" scale.left="8" scale.top="70" scale.right="195" scale.bottom="11"/>
<texture name="hint_arrow_left" file_name="windows/hint_arrow_left.png" preload="false"/>
<texture name="hint_arrow_right" file_name="windows/hint_arrow_right.png" preload="false"/>
@@ -931,4 +933,15 @@ with the same filename but different name
<texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" />
<texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" />
+ <texture name="Icon_Pointer" file_name="icons/Icon_Pointer.png" preload="false"/>
+
+ <texture name="mp_fpsButton" file_name="megapahit/fps_button.png" preload="false" />
+
+ <texture name="mp_red_bullet" file_name="megapahit/mp_red_bullet.png" preload="false" />
+ <texture name="mp_yellow_bullet" file_name="megapahit/mp_yellow_bullet.png" preload="false" />
+ <texture name="mp_green_bullet" file_name="megapahit/mp_green_bullet.png" preload="false" />
+ <texture name="mp_blue_bullet" file_name="megapahit/mp_blue_bullet.png" preload="false" />
+ <texture name="mp_help_bullet" file_name="megapahit/mp_help_bullet.png" preload="false" />
+ <texture name="mp_info_bullet" file_name="megapahit/mp_info_bullet.png" preload="false" />
+
</textures>
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Off.png b/indra/newview/skins/default/textures/widgets/ComboButton_Off.png
index 4f573cf6fa..8c315a9d25 100644
--- a/indra/newview/skins/default/textures/widgets/ComboButton_Off.png
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png
index 5a067aca7c..34edea9421 100644
--- a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.png
index ba63751690..ef50fb5d51 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.png
index 1a9f7e9d71..191dbf08fc 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.png
index e4fcf491ba..d5882bce85 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.png
index dbe6651dc8..ddaab1cfcd 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png
index dbe6651dc8..c8634b1294 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png
index b78f2bc62e..465ce8d7da 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.png
index f2abcb3ce0..9ff1e05a52 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.png
index 9a14e7c69d..4775dab43b 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png
index d9f05d33ec..65d082b993 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png
index d2342f6538..12f55c599e 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
index 7b612ade9c..6a023156c5 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
index eb08fed30e..457644e69a 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.png
index ecd2144d6d..ccea8fc784 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.png
index 1901d5e843..f90ede3b71 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png
index ffcb2772e0..524d3b6bfd 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.png
index 534c30cddc..cadcec085a 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.png
index a97612ce2f..889d06a690 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.png
index a97612ce2f..aa3906d236 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png
index d8f02b3730..255fd1c415 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.png
index 3d93e5e73b..a69d0b525f 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png
index edd485afed..e888e1e045 100644
--- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png
+++ b/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/first_login_image.jpg b/indra/newview/skins/default/textures/windows/first_login_image.jpg
index 860fed4ac7..30f31341ed 100644
--- a/indra/newview/skins/default/textures/windows/first_login_image.jpg
+++ b/indra/newview/skins/default/textures/windows/first_login_image.jpg
Binary files differ
diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml
index 604eb7c58f..4ea34975e1 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -5,7 +5,7 @@
[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
<floater.string name="AboutPosition">
- Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
[SERVER_VERSION]
[SERVER_RELEASE_NOTES_URL]
</floater.string>
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/da/sidepanel_item_info.xml b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
index d52845160b..e5ad86b315 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
@@ -15,6 +15,9 @@
<panel.string name="acquiredDate">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</panel.string>
+ <panel.string name="acquiredDateAMPM">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local]
+ </panel.string>
<panel.string name="origin_inventory">
(Beholdning)
</panel.string>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index a7dff91311..18fbd92292 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -1,8 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
- It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
- that are returned from one component and may appear in many places-->
<strings>
<string name="CAPITALIZED_APP_NAME">
MEGAPAHIT
@@ -554,9 +550,9 @@ Prøv venligst om lidt igen.
<string name="mesh">
mesh
</string>
- <string name="settings">
- indstillinger
- </string>
+ <string name="settings">
+ indstillinger
+ </string>
<string name="AvatarEditingAppearance">
(Redigering Udseende)
</string>
@@ -819,10 +815,10 @@ Prøv venligst om lidt igen.
Du vil nu blive dirigeret til lokal stemme chat
</string>
<string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS].
+ '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS].
</string>
<string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS].
+ '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS].
</string>
<string name="ScriptTakeMoney">
Tag Linden dollars (L$) fra dig
@@ -933,16 +929,16 @@ Prøv venligst om lidt igen.
Vælg bibliotek
</string>
<string name="AvatarSetNotAway">
- Sæt &quot;til stede&quot;
+ Sæt "til stede"
</string>
<string name="AvatarSetAway">
- Sæt &quot;væk&quot;
+ Sæt "væk"
</string>
<string name="AvatarSetNotBusy">
- Sæt &quot;ledig&quot;
+ Sæt "ledig"
</string>
<string name="AvatarSetBusy">
- Sæt &quot;optaget&quot;
+ Sæt "optaget"
</string>
<string name="shape">
Form
@@ -1169,8 +1165,10 @@ Prøv venligst om lidt igen.
<string name="InventoryNoTexture">
Du har ikke en kopi af denne tekstur i din beholdning
</string>
- <string name="Unconstrained">Ikke låst</string>
- <string name="no_transfer" value=" (ikke overdragbar)"/>
+ <string name="Unconstrained">
+ Ikke låst
+ </string>
+ <string name="no_transfer" value=" (ikke overdragbar)"/>
<string name="no_modify" value=" (ikke redigere)"/>
<string name="no_copy" value=" (ikke kopiere)"/>
<string name="worn" value=" (båret)"/>
@@ -1568,16 +1566,16 @@ Prøv venligst om lidt igen.
nulstil
</string>
<string name="RunQueueTitle">
- Sæt &quot;running&quot; fremskridt
+ Sæt "running" fremskridt
</string>
<string name="RunQueueStart">
- sæt til &quot;running&quot;
+ sæt til "running"
</string>
<string name="NotRunQueueTitle">
- Sæt &quot;Not Running&quot; fremskridt
+ Sæt "Not Running" fremskridt
</string>
<string name="NotRunQueueStart">
- sæt til &quot;not running&quot;
+ sæt til "not running"
</string>
<string name="CompileSuccessful">
Kompleret uden fejl!
@@ -1589,7 +1587,7 @@ Prøv venligst om lidt igen.
Gemt.
</string>
<string name="ObjectOutOfRange">
- Script (&quot;object out of range&quot;)
+ Script ("object out of range")
</string>
<string name="GodToolsObjectOwnedBy">
Objekt [OBJECT] ejet af [OWNER]
@@ -1660,13 +1658,13 @@ Prøv venligst om lidt igen.
Memory brugt: [COUNT] kb
</string>
<string name="ScriptLimitsParcelScriptURLs">
- Parcel Script URL&apos;er
+ Parcel Script URL'er
</string>
<string name="ScriptLimitsURLsUsed">
- URL&apos;er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige
+ URL'er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige
</string>
<string name="ScriptLimitsURLsUsedSimple">
- URL&apos;er brugt: [COUNT]
+ URL'er brugt: [COUNT]
</string>
<string name="ScriptLimitsRequestError">
Fejl ved anmodning om information
@@ -1813,7 +1811,7 @@ Prøv venligst om lidt igen.
Nyt script
</string>
<string name="BusyModeResponseDefault">
- Beboeren du sendte en besked er &apos;optaget&apos;, hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning.
+ Beboeren du sendte en besked er 'optaget', hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning.
</string>
<string name="MuteByName">
(Efter navn)
@@ -2121,11 +2119,11 @@ Hvis fejlen stadig bliver ved, kan det være nødvendigt at afinstallere [APP_NA
</string>
<string name="MBAlreadyRunning">
[APP_NAME] kører allerede.
-Undersøg din &quot;task bar&quot; for at se efter minimeret version af programmet.
+Undersøg din "task bar" for at se efter minimeret version af programmet.
Hvis fejlen fortsætter, prøv at genstarte din computer.
</string>
<string name="MBFrozenCrashed">
- [APP_NAME] ser ud til at være &quot;frosset&quot; eller gået ned tidligere.
+ [APP_NAME] ser ud til at være "frosset" eller gået ned tidligere.
Ønsker du at sende en fejlrapport?
</string>
<string name="MBAlert">
@@ -2161,39 +2159,39 @@ Afvikler i vindue.
Fejl ved nedlukning
</string>
<string name="MBDevContextErr">
- Kan ikke oprette &quot;GL device context&quot;
+ Kan ikke oprette "GL device context"
</string>
<string name="MBPixelFmtErr">
- Kan ikke finde passende &quot;pixel format&quot;
+ Kan ikke finde passende "pixel format"
</string>
<string name="MBPixelFmtDescErr">
- Kan ikke finde &quot;pixel format&quot; beskrivelse
+ Kan ikke finde "pixel format" beskrivelse
</string>
<string name="MBTrueColorWindow">
- [APP_NAME] kræver &quot;True Color (32-bit)&quot; for at kunne køre.
-Gå venligst til din computers skærmopsætning og sæt &quot;color mode&quot; til 32-bit.
+ [APP_NAME] kræver "True Color (32-bit)" for at kunne køre.
+Gå venligst til din computers skærmopsætning og sæt "color mode" til 32-bit.
</string>
<string name="MBAlpha">
- [APP_NAME] kan ikke køre, da den ikke kan finde en &quot;8 bit alpha channel&quot;. Normalt skyldes dette et problem med en video driver.
+ [APP_NAME] kan ikke køre, da den ikke kan finde en "8 bit alpha channel". Normalt skyldes dette et problem med en video driver.
Venligst undersøg om du har de nyeste drivere til dit videokort installeret.
-Din skærm skal også være sat op til at køre &quot;True Color (32-bit)&quot; i din displayopsætning.
+Din skærm skal også være sat op til at køre "True Color (32-bit)" i din displayopsætning.
Hvis du bliver ved med at modtage denne besked, kontakt [SUPPORT_SITE].
</string>
<string name="MBPixelFmtSetErr">
- Kan ikke sætte &quot;pixel format&quot;
+ Kan ikke sætte "pixel format"
</string>
<string name="MBGLContextErr">
- Kan ikke oprette &quot;GL rendering context&quot;
+ Kan ikke oprette "GL rendering context"
</string>
<string name="MBGLContextActErr">
- Kan ikke aktivere &quot;GL rendering context&quot;
+ Kan ikke aktivere "GL rendering context"
</string>
<string name="MBVideoDrvErr">
[APP_NAME] kan ikke afvikles da driverne til dit videokort ikke blev installeret korrekt, er forældede, eller du benytter hardware der ikke er supporteret. Undersøg venligst om du har installeret de nyeste drivere til dit grafikkort, og selv om du har de nyeste, prøv at geninstallere dem.
Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
</string>
- <string name="5 O&apos;Clock Shadow">
+ <string name="5 O'Clock Shadow">
Skægstubbe
</string>
<string name="All White">
@@ -3328,7 +3326,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
Skævt ansigt
</string>
<string name="Shear Front">
- &quot;Måne&quot;
+ "Måne"
</string>
<string name="Shear Left Up">
Venstre op
@@ -3463,7 +3461,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
Sparsomt
</string>
<string name="Spiked Hair">
- Hår med &quot;spikes&quot;
+ Hår med "spikes"
</string>
<string name="Square">
Firkantet
@@ -3723,6 +3721,10 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="conference-title-incoming">
Konference med [AGENT_NAME]
</string>
+ <string name="bot_warning">
+ Du chatter med en bot, [NAME]. Del ikke personlige oplysninger.
+Læs mere på https://second.life/scripted-agents.
+ </string>
<string name="no_session_message">
(IM session eksisterer ikke)
</string>
@@ -3763,7 +3765,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
En gruppe moderator har deaktiveret din tekst chat.
</string>
<string name="muted_error">
- Du er blevet &quot;blokeret&quot;.
+ Du er blevet "blokeret".
</string>
<string name="add_session_event">
Ikke muligt at tilføge brugere til samtale med [RECIPIENT].
@@ -3793,7 +3795,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
[SOURCES] har sagt noget nyt
</string>
<string name="session_initialization_timed_out_error">
- Initialisering af session er &quot;timed out&quot;
+ Initialisering af session er "timed out"
</string>
<string name="Home position set.">
Hjemmeposition sat.
@@ -4026,7 +4028,7 @@ Krænkelsesanmeldelse
Kvinde - Latter
</string>
<string name="Female - Looking good">
- Kvinde - &quot;Ser godt ud&quot;
+ Kvinde - "Ser godt ud"
</string>
<string name="Female - Over here">
Kvinde - Herovre
@@ -4140,7 +4142,7 @@ Krænkelsesanmeldelse
<string name="ExternalEditorNotFound">
Kan ikke benytte deb eksterne editor der er angivet.
Prøv at omkrandse stien til editor med anførselstegn.
-(f.eks. &quot;/stil til min editor&quot; &quot;%s&quot;)
+(f.eks. "/stil til min editor" "%s")
</string>
<string name="ExternalEditorCommandParseError">
Fejl ved håndtering af kommando til ekstern editor.
@@ -4464,10 +4466,10 @@ Prøv at omkrandse stien til editor med anførselstegn.
Viser pejlelys for fysiske objekter (grøn)
</string>
<string name="BeaconScripted">
- Viser pejlelys for &quot;scriptede&quot; objekter (rød)
+ Viser pejlelys for "scriptede" objekter (rød)
</string>
<string name="BeaconScriptedTouch">
- Viser pejlelys for &quot;scriptede&quot; objekter med berøringsfunktion (rød)
+ Viser pejlelys for "scriptede" objekter med berøringsfunktion (rød)
</string>
<string name="BeaconSound">
Viser pejlelys for lyd (gul)
diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml
index 0d89fae986..79ec69fd9b 100644
--- a/indra/newview/skins/default/xui/da/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/da/teleport_strings.xml
@@ -21,8 +21,8 @@ Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for a
Prøv igen om lidt.
</message>
<message name="NoHelpIslandTP">
- Du kan ikke teleportere tilbage til Welcome Island.
-Gå til &apos;Welcome Island Puclic&apos; for at prøve tutorial igen.
+ Du kan ikke teleportere tilbage til Welcome Island.
+Gå til 'Welcome Island Puclic' for at prøve tutorial igen.
</message>
<message name="noaccess_tport">
Beklager, du har ikke adgang til denne teleport destination.
diff --git a/indra/newview/skins/default/xui/de/floater_search.xml b/indra/newview/skins/default/xui/de/floater_search.xml
deleted file mode 100644
index bd39bf2bce..0000000000
--- a/indra/newview/skins/default/xui/de/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Wird geladen...
- </floater.string>
- <floater.string name="done_text">
- Fertig
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Suche wiederholen, um aktuellen Gott-Level zu berücksichtigen
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/panel_progress.xml b/indra/newview/skins/default/xui/de/panel_progress.xml
index c9bed9fd9b..a3813c91d0 100644
--- a/indra/newview/skins/default/xui/de/panel_progress.xml
+++ b/indra/newview/skins/default/xui/de/panel_progress.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" ?>
<panel name="login_progress_panel">
+ <layout_panel name="panel_icons"/>
<layout_stack name="vertical_centering"/>
<layout_panel name="panel4"/>
<layout_panel name="center"/>
<layout_stack name="horizontal_centering">
+ <text name="logos_lbl">Megapahit verwendet</text>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
index 602424821f..09447cbbaf 100644
--- a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
@@ -7,7 +7,7 @@
<combo_box.item label="Klein (128x128)" name="Small(128x128)"/>
<combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>
<combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Aktuelles Fenster (512x512)" name="CurrentWindow"/>
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
<combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<spinner label="Breite x Höhe" name="inventory_snapshot_width"/>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
index dab20d63eb..2a51f10894 100644
--- a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="Auf Datenträger speichern" name="save_to_computer_btn"/>
- <button label="In Inventar speichern ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="In Inventar speichern" name="save_to_inventory_btn"/>
<button label="Im Profil-Feed teilen" name="save_to_profile_btn"/>
<button label="Auf Facebook teilen" name="send_to_facebook_btn"/>
<button label="Auf Twitter teilen" name="send_to_twitter_btn"/>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
index 168bb14248..3570ccacd2 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
@@ -21,6 +21,9 @@
<panel.string name="acquiredDate">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</panel.string>
+ <panel.string name="acquiredDateAMPM">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local]
+ </panel.string>
<panel.string name="origin_inventory">
(Inventar)
</panel.string>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 4bed43dd1d..a17eb22d89 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1,618 +1,1686 @@
<?xml version="1.0" ?>
<strings>
- <string name="SECOND_LIFE">Second Life</string>
- <string name="APP_NAME">Megapahit</string>
- <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string>
- <string name="SECOND_LIFE_GRID">Second Life-Grid:</string>
- <string name="SUPPORT_SITE">Second Life Support-Portal</string>
- <string name="StartupDetectingHardware">Hardware wird erfasst...</string>
- <string name="StartupLoading">[APP_NAME] wird geladen...</string>
- <string name="StartupClearingCache">Cache wird gelöscht...</string>
- <string name="StartupInitializingTextureCache">Textur-Cache wird initialisiert...</string>
- <string name="StartupRequireDriverUpdate">Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber.</string>
- <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]Bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>
- <string name="BuildConfig">Build-Konfiguration [BUILD_CONFIG]</string>
- <string name="AboutPosition">Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Megapahit
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ MEGAPAHIT
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Second Life-Grid:
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life Support-Portal
+ </string>
+ <string name="StartupDetectingHardware">
+ Hardware wird erfasst...
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME] wird geladen...
+ </string>
+ <string name="StartupClearingCache">
+ Cache wird gelöscht...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Textur-Cache wird initialisiert...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber.
+ </string>
+ <string name="AboutHeader">
+ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]Bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </string>
+ <string name="BuildConfig">
+ Build-Konfiguration [BUILD_CONFIG]
+ </string>
+ <string name="AboutPosition">
+ Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(globale Koordinaten [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]</string>
- <string name="AboutSystem">CPU: [CPU]
+[SERVER_RELEASE_NOTES_URL]
+ </string>
+ <string name="AboutSystem">
+ CPU: [CPU]
Speicher: [MEMORY_MB] MB
Betriebssystemversion: [OS_VERSION]
Grafikkartenhersteller: [GRAPHICS_CARD_VENDOR]
-Grafikkarte: [GRAPHICS_CARD]</string>
- <string name="AboutDriver">Windows-Grafiktreiberversion: [GRAPHICS_DRIVER_VERSION]</string>
- <string name="AboutOGL">OpenGL-Version: [OPENGL_VERSION]</string>
- <string name="AboutSettings">Fenstergröße: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Grafikkarte: [GRAPHICS_CARD]
+ </string>
+ <string name="AboutDriver">
+ Windows-Grafiktreiberversion: [GRAPHICS_DRIVER_VERSION]
+ </string>
+ <string name="AboutOGL">
+ OpenGL-Version: [OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Fenstergröße: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
Schriftgrößenanpassung: [FONT_SIZE_ADJUSTMENT] pt
UI-Skalierung: [UI_SCALE]
Sichtweite: [DRAW_DISTANCE] m
Bandbreite: [NET_BANDWITH] kbit/s
LOD-Faktor: [LOD_FACTOR]
Darstellungsqualität: [RENDER_QUALITY]
-Texturspeicher: [TEXTURE_MEMORY] MB</string>
- <string name="AboutOSXHiDPI">HiDPI-Anzeigemodus: [HIDPI]</string>
- <string name="AboutLibs">J2C-Decoderversion: [J2C_VERSION]
+Texturspeicher: [TEXTURE_MEMORY] MB
+ </string>
+ <string name="AboutOSXHiDPI">
+ HiDPI-Anzeigemodus: [HIDPI]
+ </string>
+ <string name="AboutLibs">
+ J2C-Decoderversion: [J2C_VERSION]
Audiotreiberversion: [AUDIO_DRIVER_VERSION]
[LIBCEF_VERSION]
LibVLC-Version: [LIBVLC_VERSION]
-Voice-Server-Version: [VOICE_VERSION]</string>
- <string name="AboutTraffic">Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1] %)</string>
- <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>
- <string name="ErrorFetchingServerReleaseNotesURL">Fehler beim Abrufen der URL für die Server-Versionshinweise.</string>
- <string name="BuildConfiguration">Build-Konfiguration</string>
- <string name="ProgressRestoring">Wird wiederhergestellt...</string>
- <string name="ProgressChangingResolution">Auflösung wird geändert...</string>
- <string name="Fullbright">Fullbright (Legacy)</string>
- <string name="LoginInProgress">Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten.</string>
- <string name="LoginInProgressNoFrozen">Anmeldung erfolgt...</string>
- <string name="LoginAuthenticating">Authentifizierung</string>
- <string name="LoginMaintenance">Account wird aktualisiert...</string>
- <string name="LoginAttempt">Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER]</string>
- <string name="LoginPrecaching">Welt wird geladen...</string>
- <string name="LoginInitializingBrowser">Integrierter Webbrowser wird initialisiert...</string>
- <string name="LoginInitializingMultimedia">Multimedia wird initialisiert...</string>
- <string name="LoginInitializingFonts">Schriftarten werden geladen...</string>
- <string name="LoginVerifyingCache">Cache-Dateien werden überprüft (dauert 60-90 Sekunden)...</string>
- <string name="LoginProcessingResponse">Antwort wird verarbeitet...</string>
- <string name="LoginInitializingWorld">Welt wird initialisiert...</string>
- <string name="LoginDecodingImages">Bilder werden entpackt...</string>
- <string name="LoginInitializingQuicktime">QuickTime wird initialisiert...</string>
- <string name="LoginQuicktimeNotFound">QuickTime nicht gefunden - Initialisierung nicht möglich.</string>
- <string name="LoginQuicktimeOK">QuickTime wurde initialisiert.</string>
- <string name="LoginRequestSeedCapGrant">Regionsfähigkeiten anfordern...</string>
- <string name="LoginRetrySeedCapGrant">Regionsfähigkeiten anfordern. Versuch [NUMBER]...</string>
- <string name="LoginWaitingForRegionHandshake">Region-Handshake...</string>
- <string name="LoginConnectingToRegion">Region-Verbindung...</string>
- <string name="LoginDownloadingClothing">Kleidung wird geladen...</string>
- <string name="InvalidCertificate">Der Server hat ein ungültiges oder korruptes Zertifikate zurückgegeben. Bitte kontaktieren Sie den Grid-Administrator.</string>
- <string name="CertInvalidHostname">Ein ungültiger Hostname wurde verwendet, um auf den Server zuzugreifen. Bitte überprüfen Sie Ihre SLURL oder den Grid-Hostnamen.</string>
- <string name="CertExpired">Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator.</string>
- <string name="CertKeyUsage">Das vom Server ausgegebene Zertifikat konnte nicht für SSL verwendet werden. Bitte kontaktieren Sie Ihren Grid-Administrator.</string>
- <string name="CertBasicConstraints">In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator.</string>
- <string name="CertInvalidSignature">Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.</string>
- <string name="LoginFailedNoNetwork">Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.</string>
- <string name="LoginFailedHeader">Anmeldung fehlgeschlagen</string>
- <string name="Quit">Beenden</string>
- <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
- <string name="AgniGridLabel">Second Life Main Grid (Agni)</string>
- <string name="AditiGridLabel">Second Life Beta Test Grid (Aditi)</string>
- <string name="ViewerDownloadURL">http://secondlife.com/download</string>
- <string name="LoginFailedViewerNotPermitted">Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
+Voice-Server-Version: [VOICE_VERSION]
+ </string>
+ <string name="AboutTraffic">
+ Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1] %)
+ </string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
+ <string name="ErrorFetchingServerReleaseNotesURL">
+ Fehler beim Abrufen der URL für die Server-Versionshinweise.
+ </string>
+ <string name="BuildConfiguration">
+ Build-Konfiguration
+ </string>
+ <string name="ProgressRestoring">
+ Wird wiederhergestellt...
+ </string>
+ <string name="ProgressChangingResolution">
+ Auflösung wird geändert...
+ </string>
+ <string name="Fullbright">
+ Fullbright (Legacy)
+ </string>
+ <string name="LoginInProgress">
+ Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Anmeldung erfolgt...
+ </string>
+ <string name="LoginAuthenticating">
+ Authentifizierung
+ </string>
+ <string name="LoginMaintenance">
+ Account wird aktualisiert...
+ </string>
+ <string name="LoginAttempt">
+ Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Welt wird geladen...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Integrierter Webbrowser wird initialisiert...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Multimedia wird initialisiert...
+ </string>
+ <string name="LoginInitializingFonts">
+ Schriftarten werden geladen...
+ </string>
+ <string name="LoginVerifyingCache">
+ Cache-Dateien werden überprüft (dauert 60-90 Sekunden)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Antwort wird verarbeitet...
+ </string>
+ <string name="LoginInitializingWorld">
+ Welt wird initialisiert...
+ </string>
+ <string name="LoginDecodingImages">
+ Bilder werden entpackt...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTime wird initialisiert...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime nicht gefunden - Initialisierung nicht möglich.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime wurde initialisiert.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Regionsfähigkeiten anfordern...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Regionsfähigkeiten anfordern. Versuch [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Region-Handshake...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Region-Verbindung...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Kleidung wird geladen...
+ </string>
+ <string name="InvalidCertificate">
+ Der Server hat ein ungültiges oder korruptes Zertifikate zurückgegeben. Bitte kontaktieren Sie den Grid-Administrator.
+ </string>
+ <string name="CertInvalidHostname">
+ Ein ungültiger Hostname wurde verwendet, um auf den Server zuzugreifen. Bitte überprüfen Sie Ihre SLURL oder den Grid-Hostnamen.
+ </string>
+ <string name="CertExpired">
+ Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="CertKeyUsage">
+ Das vom Server ausgegebene Zertifikat konnte nicht für SSL verwendet werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="CertBasicConstraints">
+ In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="CertInvalidSignature">
+ Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
+ </string>
+ <string name="LoginFailedHeader">
+ Anmeldung fehlgeschlagen
+ </string>
+ <string name="Quit">
+ Beenden
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/?sourceid=[sourceid]
+ </string>
+ <string name="AgniGridLabel">
+ Second Life Main Grid (Agni)
+ </string>
+ <string name="AditiGridLabel">
+ Second Life Beta Test Grid (Aditi)
+ </string>
+ <string name="ViewerDownloadURL">
+ http://secondlife.com/download
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
http://secondlife.com/download
Weitere Informationen finden Sie auf der folgenden FAQ-Seite:
-http://secondlife.com/viewer-access-faq</string>
- <string name="LoginIntermediateOptionalUpdateAvailable">Optionales Viewer-Update verfügbar: [VERSION]</string>
- <string name="LoginFailedRequiredUpdate">Erforderliches Viewer-Update: [VERSION]</string>
- <string name="LoginFailedAlreadyLoggedIn">Dieser Agent ist bereits angemeldet.</string>
- <string name="LoginFailedAuthenticationFailed">Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden.
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Optionales Viewer-Update verfügbar: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Erforderliches Viewer-Update: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Dieser Agent ist bereits angemeldet.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden.
Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben:
* Benutzername (wie robertschmidt12 oder warme.sonne)
* Kennwort
-Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.</string>
- <string name="LoginFailedPasswordChanged">Ihr Kennwort wurde aus Sicherheitsgründen geändert.
+Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Ihr Kennwort wurde aus Sicherheitsgründen geändert.
Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
-Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.</string>
- <string name="LoginFailedPasswordReset">Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen.
+Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen.
Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
-Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.</string>
- <string name="LoginFailedEmployeesOnly">Second Life ist vorübergehend wegen Wartung geschlossen.
+Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life ist vorübergehend wegen Wartung geschlossen.
Nur Mitarbeiter können sich anmelden.
-Aktuelle Informationen finden Sie unter www.secondlife.com/status.</string>
- <string name="LoginFailedPremiumOnly">Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben.
+Aktuelle Informationen finden Sie unter www.secondlife.com/status.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben.
-Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen.</string>
- <string name="LoginFailedComputerProhibited">Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich.
+Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich.
Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an
-support@secondlife.com.</string>
- <string name="LoginFailedAcountSuspended">Ihr Konto ist erst ab
-[TIME] Pacific Time wieder verfügbar.</string>
- <string name="LoginFailedAccountDisabled">Ihre Anfrage kann derzeit nicht bearbeitet werden.
-Bitte wenden Sie sich unter http://secondlife.com/support an den Second Life-Support.</string>
- <string name="LoginFailedTransformError">Nicht übereinstimmende Daten bei der Anmeldung festgestellt.
-Wenden Sie sich an support@secondlife.com.</string>
- <string name="LoginFailedAccountMaintenance">An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt.
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Ihre Anfrage kann derzeit nicht bearbeitet werden.
+Bitte wenden Sie sich unter http://secondlife.com/support an den Second Life-Support.
+ </string>
+ <string name="LoginFailedTransformError">
+ Nicht übereinstimmende Daten bei der Anmeldung festgestellt.
+Wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt.
Ihr Konto ist erst ab
[TIME] Pacific Time wieder verfügbar.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string>
- <string name="LoginFailedPendingLogoutFault">Abmeldeanforderung führte zu einem Simulatorfehler.</string>
- <string name="LoginFailedPendingLogout">Das System meldet Sie gerade ab.
-Bitte warten Sie eine Minute, bevor Sie sich erneut einloggen.</string>
- <string name="LoginFailedUnableToCreateSession">Es kann keine gültige Sitzung erstellt werden.</string>
- <string name="LoginFailedUnableToConnectToSimulator">Es kann keine Simulatorverbindung hergestellt werden.</string>
- <string name="LoginFailedRestrictedHours">Mit Ihrem Konto ist der Zugriff auf Second Life
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Abmeldeanforderung führte zu einem Simulatorfehler.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Das System meldet Sie gerade ab.
+Bitte warten Sie eine Minute, bevor Sie sich erneut einloggen.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Es kann keine gültige Sitzung erstellt werden.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Es kann keine Simulatorverbindung hergestellt werden.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Mit Ihrem Konto ist der Zugriff auf Second Life
nur zwischen [START] und [END] Pacific Time möglich.
Schauen Sie während dieses Zeitraums vorbei.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string>
- <string name="LoginFailedIncorrectParameters">Falsche Parameter.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string>
- <string name="LoginFailedFirstNameNotAlphanumeric">Vorname muss alphanumerisch sein.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string>
- <string name="LoginFailedLastNameNotAlphanumeric">Nachname muss alphanumerisch sein.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string>
- <string name="LogoutFailedRegionGoingOffline">Die Region wird gerade offline geschaltet.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string>
- <string name="LogoutFailedAgentNotInRegion">Agent nicht in Region.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string>
- <string name="LogoutFailedPendingLogin">Die Region war gerade dabei, eine andere Sitzung anzumelden.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string>
- <string name="LogoutFailedLoggingOut">Die Region war gerade dabei, die vorherige Sitzung abzumelden.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string>
- <string name="LogoutFailedStillLoggingOut">Die Region ist noch immer dabei, die vorherige Sitzung abzumelden.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string>
- <string name="LogoutSucceeded">Die Region hat soeben die letzte Sitzung abgemeldet.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string>
- <string name="LogoutFailedLogoutBegun">Die Region hat den Abmeldevorgang gestartet.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string>
- <string name="LoginFailedLoggingOutSession">Das System hat begonnen, Ihre letzte Sitzung abzumelden.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string>
- <string name="AgentLostConnection">In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.</string>
- <string name="SavingSettings">Ihr Einstellungen werden gespeichert...</string>
- <string name="LoggingOut">Abmeldung erfolgt...</string>
- <string name="ShuttingDown">Programm wird beendet...</string>
- <string name="YouHaveBeenDisconnected">Die Verbindung zu der Region ist abgebrochen.</string>
- <string name="SentToInvalidRegion">Sie wurden in eine ungültige Region geschickt.</string>
- <string name="TestingDisconnect">Verbindungsabbruch wird getestet</string>
- <string name="SocialFacebookConnecting">Mit Facebook verbinden...</string>
- <string name="SocialFacebookPosting">Posten...</string>
- <string name="SocialFacebookDisconnecting">Facebook-Verbindung trennen...</string>
- <string name="SocialFacebookErrorConnecting">Problem beim Verbinden mit Facebook</string>
- <string name="SocialFacebookErrorPosting">Problem beim Posten auf Facebook</string>
- <string name="SocialFacebookErrorDisconnecting">Problem beim Trennen der Facebook-Verbindung</string>
- <string name="SocialFlickrConnecting">Verbinden mit Flickr...</string>
- <string name="SocialFlickrPosting">Posten...</string>
- <string name="SocialFlickrDisconnecting">Flickr-Verbindung wird getrennt...</string>
- <string name="SocialFlickrErrorConnecting">Problem beim Verbinden mit Flickr</string>
- <string name="SocialFlickrErrorPosting">Problem beim Posten auf Flickr</string>
- <string name="SocialFlickrErrorDisconnecting">Problem beim Trennen der Flickr-Verbindung</string>
- <string name="SocialTwitterConnecting">Verbinden mit Twitter...</string>
- <string name="SocialTwitterPosting">Posten...</string>
- <string name="SocialTwitterDisconnecting">Twitter-Verbindung wird getrennt...</string>
- <string name="SocialTwitterErrorConnecting">Problem beim Verbinden mit Twitter</string>
- <string name="SocialTwitterErrorPosting">Problem beim Posten auf Twitter</string>
- <string name="SocialTwitterErrorDisconnecting">Problem beim Trennen der Twitter-Verbindung</string>
- <string name="BlackAndWhite">Schwarzweiß</string>
- <string name="Colors1970">Farben der Siebziger Jahre</string>
- <string name="Intense">Intensiv</string>
- <string name="Newspaper">Zeitungspapier</string>
- <string name="Sepia">Sepia</string>
- <string name="Spotlight">Spotlight</string>
- <string name="Video">Video</string>
- <string name="Autocontrast">Autokontrast</string>
- <string name="LensFlare">Blendenfleck</string>
- <string name="Miniature">Miniatur</string>
- <string name="Toycamera">Spielzeugkamera</string>
- <string name="TooltipPerson">Person</string>
- <string name="TooltipNoName">(namenlos)</string>
- <string name="TooltipOwner">Eigentümer:</string>
- <string name="TooltipPublic">Öffentlich</string>
- <string name="TooltipIsGroup">(Gruppe)</string>
- <string name="TooltipForSaleL$">Zum Verkauf: [AMOUNT] L$</string>
- <string name="TooltipFlagGroupBuild">Gruppenbau</string>
- <string name="TooltipFlagNoBuild">Bauen aus</string>
- <string name="TooltipFlagNoEdit">Gruppenbau</string>
- <string name="TooltipFlagNotSafe">Unsicher</string>
- <string name="TooltipFlagNoFly">Fliegen aus</string>
- <string name="TooltipFlagGroupScripts">Gruppenskripte</string>
- <string name="TooltipFlagNoScripts">Skripte aus</string>
- <string name="TooltipLand">Land:</string>
- <string name="TooltipMustSingleDrop">Sie können nur ein einzelnes Objekt hierher ziehen</string>
- <string name="TooltipTooManyWearables">Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ &gt; „Debug-Einstellungen anzeigen“ &gt; „WearFolderLimit“ ändern.</string>
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Falsche Parameter.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Vorname muss alphanumerisch sein.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Nachname muss alphanumerisch sein.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Die Region wird gerade offline geschaltet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Agent nicht in Region.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Die Region war gerade dabei, eine andere Sitzung anzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Die Region war gerade dabei, die vorherige Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Die Region ist noch immer dabei, die vorherige Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutSucceeded">
+ Die Region hat soeben die letzte Sitzung abgemeldet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Die Region hat den Abmeldevorgang gestartet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Das System hat begonnen, Ihre letzte Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="AgentLostConnection">
+ In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
+ </string>
+ <string name="SavingSettings">
+ Ihr Einstellungen werden gespeichert...
+ </string>
+ <string name="LoggingOut">
+ Abmeldung erfolgt...
+ </string>
+ <string name="ShuttingDown">
+ Programm wird beendet...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Die Verbindung zu der Region ist abgebrochen.
+ </string>
+ <string name="SentToInvalidRegion">
+ Sie wurden in eine ungültige Region geschickt.
+ </string>
+ <string name="TestingDisconnect">
+ Verbindungsabbruch wird getestet
+ </string>
+ <string name="SocialFacebookConnecting">
+ Mit Facebook verbinden...
+ </string>
+ <string name="SocialFacebookPosting">
+ Posten...
+ </string>
+ <string name="SocialFacebookDisconnecting">
+ Facebook-Verbindung trennen...
+ </string>
+ <string name="SocialFacebookErrorConnecting">
+ Problem beim Verbinden mit Facebook
+ </string>
+ <string name="SocialFacebookErrorPosting">
+ Problem beim Posten auf Facebook
+ </string>
+ <string name="SocialFacebookErrorDisconnecting">
+ Problem beim Trennen der Facebook-Verbindung
+ </string>
+ <string name="SocialFlickrConnecting">
+ Verbinden mit Flickr...
+ </string>
+ <string name="SocialFlickrPosting">
+ Posten...
+ </string>
+ <string name="SocialFlickrDisconnecting">
+ Flickr-Verbindung wird getrennt...
+ </string>
+ <string name="SocialFlickrErrorConnecting">
+ Problem beim Verbinden mit Flickr
+ </string>
+ <string name="SocialFlickrErrorPosting">
+ Problem beim Posten auf Flickr
+ </string>
+ <string name="SocialFlickrErrorDisconnecting">
+ Problem beim Trennen der Flickr-Verbindung
+ </string>
+ <string name="SocialTwitterConnecting">
+ Verbinden mit Twitter...
+ </string>
+ <string name="SocialTwitterPosting">
+ Posten...
+ </string>
+ <string name="SocialTwitterDisconnecting">
+ Twitter-Verbindung wird getrennt...
+ </string>
+ <string name="SocialTwitterErrorConnecting">
+ Problem beim Verbinden mit Twitter
+ </string>
+ <string name="SocialTwitterErrorPosting">
+ Problem beim Posten auf Twitter
+ </string>
+ <string name="SocialTwitterErrorDisconnecting">
+ Problem beim Trennen der Twitter-Verbindung
+ </string>
+ <string name="BlackAndWhite">
+ Schwarzweiß
+ </string>
+ <string name="Colors1970">
+ Farben der Siebziger Jahre
+ </string>
+ <string name="Intense">
+ Intensiv
+ </string>
+ <string name="Newspaper">
+ Zeitungspapier
+ </string>
+ <string name="Sepia">
+ Sepia
+ </string>
+ <string name="Spotlight">
+ Spotlight
+ </string>
+ <string name="Video">
+ Video
+ </string>
+ <string name="Autocontrast">
+ Autokontrast
+ </string>
+ <string name="LensFlare">
+ Blendenfleck
+ </string>
+ <string name="Miniature">
+ Miniatur
+ </string>
+ <string name="Toycamera">
+ Spielzeugkamera
+ </string>
+ <string name="TooltipPerson">
+ Person
+ </string>
+ <string name="TooltipNoName">
+ (namenlos)
+ </string>
+ <string name="TooltipOwner">
+ Eigentümer:
+ </string>
+ <string name="TooltipPublic">
+ Öffentlich
+ </string>
+ <string name="TooltipIsGroup">
+ (Gruppe)
+ </string>
+ <string name="TooltipForSaleL$">
+ Zum Verkauf: [AMOUNT] L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Gruppenbau
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Bauen aus
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Gruppenbau
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Unsicher
+ </string>
+ <string name="TooltipFlagNoFly">
+ Fliegen aus
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Gruppenskripte
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Skripte aus
+ </string>
+ <string name="TooltipLand">
+ Land:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Sie können nur ein einzelnes Objekt hierher ziehen
+ </string>
+ <string name="TooltipTooManyWearables">
+ Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ &gt; „Debug-Einstellungen anzeigen“ &gt; „WearFolderLimit“ ändern.
+ </string>
<string name="TooltipPrice" value="[AMOUNT] L$"/>
- <string name="TooltipSLIcon">Führt zu einer Seite in der offiziellen Domäne SecondLife.com oder LindenLab.com.</string>
- <string name="TooltipOutboxDragToWorld">Sie können keine Objekte aus dem Marktplatz-Auflistungsordner rezzen</string>
- <string name="TooltipOutboxWorn">Sie können Objekte, die Sie tragen, nicht in den Marktplatz-Auflistungsordner stellen</string>
- <string name="TooltipOutboxFolderLevels">Tiefe der verschachtelten Ordner überschreitet [AMOUNT]. Reduzieren Sie die Ordnertiefe. Verpacken Sie ggf. einige Artikel.</string>
- <string name="TooltipOutboxTooManyFolders">Anzahl von Unterordnern überschreitet [AMOUNT]. Reduzieren Sie die Anzahl von Ordnern in Ihrer Auflistung. Verpacken Sie ggf. einige Artikel.</string>
- <string name="TooltipOutboxTooManyObjects">Anzahl von Objekten überschreitet [AMOUNT]. Um mehr als [AMOUNT] Objekte in einer Auflistung verkaufen zu können, müssen Sie einige davon verpacken.</string>
- <string name="TooltipOutboxTooManyStockItems">Anzahl von Bestandsobjekten überschreitet [AMOUNT].</string>
- <string name="TooltipOutboxCannotDropOnRoot">Sie können Objekte oder Ordner nur in der Registerkarte „ALLE“ oder „NICHT VERKNüPFT“ ablegen. Klicken Sie auf eine dieser Registerkarten und versuchen Sie dann erneut, Ihre Objekte bzw. Ordner zu verschieben.</string>
- <string name="TooltipOutboxNoTransfer">Mindestens eines dieser Objekte kann nicht verkauft oder übertragen werden</string>
- <string name="TooltipOutboxNotInInventory">Sie können nur Objekte aus Ihrem Inventar in den Marktplatz einstellen</string>
- <string name="TooltipOutboxLinked">Sie können keine verknüpften Objekte oder Ordner in den Marktplatz einstellen</string>
- <string name="TooltipOutboxCallingCard">Sie können Visitenkarten nicht in den Marktplatz einstellen</string>
- <string name="TooltipOutboxDragActive">Sie können keine gelistete Auflistung entfernen</string>
- <string name="TooltipOutboxCannotMoveRoot">Der Stammordner mit Marktplatz-Auflistungen kann nicht verschoben werden.</string>
- <string name="TooltipOutboxMixedStock">Alle Objekte in einem Bestandsordner müssen vom gleichen Typ sein und die gleiche Berechtigung haben</string>
- <string name="TooltipDragOntoOwnChild">Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben</string>
- <string name="TooltipDragOntoSelf">Sie können einen Ordner nicht in sich selbst verschieben</string>
- <string name="TooltipHttpUrl">Anklicken, um Webseite anzuzeigen</string>
- <string name="TooltipSLURL">Anklicken, um Informationen zu diesem Standort anzuzeigen</string>
- <string name="TooltipAgentUrl">Anklicken, um das Profil dieses Einwohners anzuzeigen</string>
- <string name="TooltipAgentInspect">Mehr über diesen Einwohner</string>
- <string name="TooltipAgentMute">Klicken, um diesen Einwohner stummzuschalten</string>
- <string name="TooltipAgentUnmute">Klicken, um diesen Einwohner freizuschalten</string>
- <string name="TooltipAgentIM">Klicken, um diesem Einwohner eine IM zu schicken.</string>
- <string name="TooltipAgentPay">Klicken, um diesen Einwohner zu bezahlen</string>
- <string name="TooltipAgentOfferTeleport">Klicken, um diesem Einwohner einen Teleport anzubieten.</string>
- <string name="TooltipAgentRequestFriend">Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken.</string>
- <string name="TooltipGroupUrl">Anklicken, um Beschreibung der Gruppe anzuzeigen</string>
- <string name="TooltipEventUrl">Anklicken, um Beschreibung der Veranstaltung anzuzeigen</string>
- <string name="TooltipClassifiedUrl">Anklicken, um diese Anzeige anzuzeigen</string>
- <string name="TooltipParcelUrl">Anklicken, um Beschreibung der Parzelle anzuzeigen</string>
- <string name="TooltipTeleportUrl">Anklicken, um zu diesem Standort zu teleportieren</string>
- <string name="TooltipObjectIMUrl">Anklicken, um Beschreibung des Objekts anzuzeigen</string>
- <string name="TooltipMapUrl">Klicken, um diese Position auf der Karte anzuzeigen</string>
- <string name="TooltipSLAPP">Anklicken, um Befehl secondlife:// auszuführen</string>
+ <string name="TooltipSLIcon">
+ Führt zu einer Seite in der offiziellen Domäne SecondLife.com oder LindenLab.com.
+ </string>
+ <string name="TooltipOutboxDragToWorld">
+ Sie können keine Objekte aus dem Marktplatz-Auflistungsordner rezzen
+ </string>
+ <string name="TooltipOutboxWorn">
+ Sie können Objekte, die Sie tragen, nicht in den Marktplatz-Auflistungsordner stellen
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Tiefe der verschachtelten Ordner überschreitet [AMOUNT]. Reduzieren Sie die Ordnertiefe. Verpacken Sie ggf. einige Artikel.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Anzahl von Unterordnern überschreitet [AMOUNT]. Reduzieren Sie die Anzahl von Ordnern in Ihrer Auflistung. Verpacken Sie ggf. einige Artikel.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Anzahl von Objekten überschreitet [AMOUNT]. Um mehr als [AMOUNT] Objekte in einer Auflistung verkaufen zu können, müssen Sie einige davon verpacken.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Anzahl von Bestandsobjekten überschreitet [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Sie können Objekte oder Ordner nur in der Registerkarte „ALLE“ oder „NICHT VERKNüPFT“ ablegen. Klicken Sie auf eine dieser Registerkarten und versuchen Sie dann erneut, Ihre Objekte bzw. Ordner zu verschieben.
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Mindestens eines dieser Objekte kann nicht verkauft oder übertragen werden
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Sie können nur Objekte aus Ihrem Inventar in den Marktplatz einstellen
+ </string>
+ <string name="TooltipOutboxLinked">
+ Sie können keine verknüpften Objekte oder Ordner in den Marktplatz einstellen
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Sie können Visitenkarten nicht in den Marktplatz einstellen
+ </string>
+ <string name="TooltipOutboxDragActive">
+ Sie können keine gelistete Auflistung entfernen
+ </string>
+ <string name="TooltipOutboxCannotMoveRoot">
+ Der Stammordner mit Marktplatz-Auflistungen kann nicht verschoben werden.
+ </string>
+ <string name="TooltipOutboxMixedStock">
+ Alle Objekte in einem Bestandsordner müssen vom gleichen Typ sein und die gleiche Berechtigung haben
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Sie können einen Ordner nicht in sich selbst verschieben
+ </string>
+ <string name="TooltipHttpUrl">
+ Anklicken, um Webseite anzuzeigen
+ </string>
+ <string name="TooltipSLURL">
+ Anklicken, um Informationen zu diesem Standort anzuzeigen
+ </string>
+ <string name="TooltipAgentUrl">
+ Anklicken, um das Profil dieses Einwohners anzuzeigen
+ </string>
+ <string name="TooltipAgentInspect">
+ Mehr über diesen Einwohner
+ </string>
+ <string name="TooltipAgentMute">
+ Klicken, um diesen Einwohner stummzuschalten
+ </string>
+ <string name="TooltipAgentUnmute">
+ Klicken, um diesen Einwohner freizuschalten
+ </string>
+ <string name="TooltipAgentIM">
+ Klicken, um diesem Einwohner eine IM zu schicken.
+ </string>
+ <string name="TooltipAgentPay">
+ Klicken, um diesen Einwohner zu bezahlen
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Klicken, um diesem Einwohner einen Teleport anzubieten.
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken.
+ </string>
+ <string name="TooltipGroupUrl">
+ Anklicken, um Beschreibung der Gruppe anzuzeigen
+ </string>
+ <string name="TooltipEventUrl">
+ Anklicken, um Beschreibung der Veranstaltung anzuzeigen
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Anklicken, um diese Anzeige anzuzeigen
+ </string>
+ <string name="TooltipParcelUrl">
+ Anklicken, um Beschreibung der Parzelle anzuzeigen
+ </string>
+ <string name="TooltipTeleportUrl">
+ Anklicken, um zu diesem Standort zu teleportieren
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Anklicken, um Beschreibung des Objekts anzuzeigen
+ </string>
+ <string name="TooltipMapUrl">
+ Klicken, um diese Position auf der Karte anzuzeigen
+ </string>
+ <string name="TooltipSLAPP">
+ Anklicken, um Befehl secondlife:// auszuführen
+ </string>
<string name="CurrentURL" value=" CurrentURL: [CurrentURL]"/>
- <string name="TooltipEmail">Klicken, um eine E-Mail zu verfassen</string>
- <string name="SLurlLabelTeleport">Teleportieren nach</string>
- <string name="SLurlLabelShowOnMap">Karte anzeigen für</string>
- <string name="SLappAgentMute">Stummschalten</string>
- <string name="SLappAgentUnmute">Stummschaltung aufheben</string>
- <string name="SLappAgentIM">IM</string>
- <string name="SLappAgentPay">Bezahlen</string>
- <string name="SLappAgentOfferTeleport">Teleportangebot an</string>
- <string name="SLappAgentRequestFriend">Freundschaftsangebot</string>
- <string name="SLappAgentRemoveFriend">Entfernen von Freunden</string>
- <string name="BUTTON_CLOSE_DARWIN">Schließen (⌘W)</string>
- <string name="BUTTON_CLOSE_WIN">Schließen (Strg+W)</string>
- <string name="BUTTON_CLOSE_CHROME">Schließen</string>
- <string name="BUTTON_RESTORE">Wiederherstellen</string>
- <string name="BUTTON_MINIMIZE">Minimieren</string>
- <string name="BUTTON_TEAR_OFF">Abnehmen</string>
- <string name="BUTTON_DOCK">Andocken</string>
- <string name="BUTTON_HELP">Hilfe anzeigen</string>
- <string name="TooltipNotecardNotAllowedTypeDrop">Objekte dieses Typs können nicht an Notizkarten
-für diese Region angehängt werden.</string>
- <string name="TooltipNotecardOwnerRestrictedDrop">An Notizkarten können nur Objekte ohne
+ <string name="TooltipEmail">
+ Klicken, um eine E-Mail zu verfassen
+ </string>
+ <string name="SLurlLabelTeleport">
+ Teleportieren nach
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Karte anzeigen für
+ </string>
+ <string name="SLappAgentMute">
+ Stummschalten
+ </string>
+ <string name="SLappAgentUnmute">
+ Stummschaltung aufheben
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Bezahlen
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Teleportangebot an
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Freundschaftsangebot
+ </string>
+ <string name="SLappAgentRemoveFriend">
+ Entfernen von Freunden
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Schließen (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Schließen (Strg+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Schließen
+ </string>
+ <string name="BUTTON_RESTORE">
+ Wiederherstellen
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimieren
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Abnehmen
+ </string>
+ <string name="BUTTON_DOCK">
+ Andocken
+ </string>
+ <string name="BUTTON_HELP">
+ Hilfe anzeigen
+ </string>
+ <string name="TooltipNotecardNotAllowedTypeDrop">
+ Objekte dieses Typs können nicht an Notizkarten
+für diese Region angehängt werden.
+ </string>
+ <string name="TooltipNotecardOwnerRestrictedDrop">
+ An Notizkarten können nur Objekte ohne
Berechtigungseinschränkungen für den
-nächsten Eigentümer angehängt werden.</string>
- <string name="Searching">Suchen...</string>
- <string name="NoneFound">Nicht gefunden.</string>
- <string name="RetrievingData">Laden...</string>
- <string name="ReleaseNotes">Versionshinweise</string>
- <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string>
- <string name="LoadingData">Wird geladen...</string>
- <string name="AvatarNameNobody">(niemand)</string>
- <string name="AvatarNameWaiting">(wartet)</string>
- <string name="AvatarNameMultiple">(mehrere)</string>
- <string name="GroupNameNone">(keiner)</string>
- <string name="AssetErrorNone">Kein Fehler</string>
- <string name="AssetErrorRequestFailed">Asset-Anforderung: fehlgeschlagen</string>
- <string name="AssetErrorNonexistentFile">Asset-Anforderung: Datei existiert nicht</string>
- <string name="AssetErrorNotInDatabase">Asset-Anforderung: Asset in Datenbank nicht gefunden</string>
- <string name="AssetErrorEOF">Ende der Datei</string>
- <string name="AssetErrorCannotOpenFile">Datei kann nicht geöffnet werden</string>
- <string name="AssetErrorFileNotFound">Datei nicht gefunden</string>
- <string name="AssetErrorTCPTimeout">Zeitüberschreitung bei Dateiübertragung</string>
- <string name="AssetErrorCircuitGone">Verbindung verloren</string>
- <string name="AssetErrorPriceMismatch">Viewer und Server sind sich nicht über Preis einig</string>
- <string name="AssetErrorUnknownStatus">Status unbekannt</string>
- <string name="AssetUploadServerUnreacheble">Dienst nicht verfügbar.</string>
- <string name="AssetUploadServerDifficulties">Auf dem Server sind unerwartete Probleme aufgetreten.</string>
- <string name="AssetUploadServerUnavaliable">Dienst nicht verfügbar oder Zeitüberschreitung beim Upload.</string>
- <string name="AssetUploadRequestInvalid">Fehler bei der Upload-Anforderung. Um das Problem zu lösen,
-besuchen Sie bitte http://secondlife.com/support</string>
- <string name="SettingValidationError">Validierung für das Importieren der Einstellungen [NAME] fehlgeschlagen</string>
- <string name="SettingImportFileError">[FILE] konnte nicht geöffnet werden</string>
- <string name="SettingParseFileError">[FILE] konnte nicht geöffnet werden</string>
- <string name="SettingTranslateError">Altes Windlight [NAME] konnte nicht übernommen werden</string>
- <string name="texture">Textur</string>
- <string name="sound">Sound</string>
- <string name="calling card">Visitenkarte</string>
- <string name="landmark">Landmarke</string>
- <string name="legacy script">Skript (veraltet)</string>
- <string name="clothing">Kleidung</string>
- <string name="object">Objekt</string>
- <string name="note card">Notizkarte</string>
- <string name="folder">Ordner</string>
- <string name="root">Hauptverzeichnis</string>
- <string name="lsl2 script">LSL2 Skript</string>
- <string name="lsl bytecode">LSL Bytecode</string>
- <string name="tga texture">tga-Textur</string>
- <string name="body part">Körperteil</string>
- <string name="snapshot">Foto</string>
- <string name="lost and found">Fundbüro</string>
- <string name="targa image">targa-Bild</string>
- <string name="trash">Papierkorb</string>
- <string name="jpeg image">jpeg-Bild</string>
- <string name="animation">Animation</string>
- <string name="gesture">Geste</string>
- <string name="simstate">simstate</string>
- <string name="favorite">Favoriten</string>
- <string name="symbolic link">Link</string>
- <string name="symbolic folder link">Link zu Ordner</string>
- <string name="settings blob">Einstellungen</string>
- <string name="mesh">mesh</string>
- <string name="AvatarEditingAppearance">(Aussehen wird bearbeitet)</string>
- <string name="AvatarAway">Abwesend</string>
- <string name="AvatarDoNotDisturb">Nicht stören</string>
- <string name="AvatarMuted">Ignoriert</string>
- <string name="anim_express_afraid">Ängstlich</string>
- <string name="anim_express_anger">Verärgert</string>
- <string name="anim_away">Abwesend</string>
- <string name="anim_backflip">Rückwärtssalto</string>
- <string name="anim_express_laugh">Lachkrampf</string>
- <string name="anim_express_toothsmile">Grinsen</string>
- <string name="anim_blowkiss">Kusshand</string>
- <string name="anim_express_bored">Gelangweilt</string>
- <string name="anim_bow">Verbeugen</string>
- <string name="anim_clap">Klatschen</string>
- <string name="anim_courtbow">Diener</string>
- <string name="anim_express_cry">Weinen</string>
- <string name="anim_dance1">Tanz 1</string>
- <string name="anim_dance2">Tanz 2</string>
- <string name="anim_dance3">Tanz 3</string>
- <string name="anim_dance4">Tanz 4</string>
- <string name="anim_dance5">Tanz 5</string>
- <string name="anim_dance6">Tanz 6</string>
- <string name="anim_dance7">Tanz 7</string>
- <string name="anim_dance8">Tanz 8</string>
- <string name="anim_express_disdain">Verachten</string>
- <string name="anim_drink">Trinken</string>
- <string name="anim_express_embarrased">Verlegen</string>
- <string name="anim_angry_fingerwag">Drohen</string>
- <string name="anim_fist_pump">Faust pumpen</string>
- <string name="anim_yoga_float">Yogaflieger</string>
- <string name="anim_express_frown">Stirnrunzeln</string>
- <string name="anim_impatient">Ungeduldig</string>
- <string name="anim_jumpforjoy">Freudensprung</string>
- <string name="anim_kissmybutt">LMA</string>
- <string name="anim_express_kiss">Küssen</string>
- <string name="anim_laugh_short">Lachen</string>
- <string name="anim_musclebeach">Posen</string>
- <string name="anim_no_unhappy">Nein (Bedauernd)</string>
- <string name="anim_no_head">Nein</string>
- <string name="anim_nyanya">Ällabätsch</string>
- <string name="anim_punch_onetwo">Eins-Zwei-Punch</string>
- <string name="anim_express_open_mouth">Mund offen</string>
- <string name="anim_peace">Friede</string>
- <string name="anim_point_you">Auf anderen zeigen</string>
- <string name="anim_point_me">Auf mich zeigen</string>
- <string name="anim_punch_l">Linker Haken</string>
- <string name="anim_punch_r">Rechter Haken</string>
- <string name="anim_rps_countdown">SSP zählen</string>
- <string name="anim_rps_paper">SSP Papier</string>
- <string name="anim_rps_rock">SSP Stein</string>
- <string name="anim_rps_scissors">SSP Schere</string>
- <string name="anim_express_repulsed">Angewidert</string>
- <string name="anim_kick_roundhouse_r">Rundkick</string>
- <string name="anim_express_sad">Traurig</string>
- <string name="anim_salute">Salutieren</string>
- <string name="anim_shout">Rufen</string>
- <string name="anim_express_shrug">Schulterzucken</string>
- <string name="anim_express_smile">Lächeln</string>
- <string name="anim_smoke_idle">Zigarette halten</string>
- <string name="anim_smoke_inhale">Rauchen</string>
- <string name="anim_smoke_throw_down">Zigarette wegwerfen</string>
- <string name="anim_express_surprise">Überraschung</string>
- <string name="anim_sword_strike_r">Schwerthieb</string>
- <string name="anim_angry_tantrum">Wutanfall</string>
- <string name="anim_express_tongue_out">Zunge rausstrecken</string>
- <string name="anim_hello">Winken</string>
- <string name="anim_whisper">Flüstern</string>
- <string name="anim_whistle">Pfeifen</string>
- <string name="anim_express_wink">Zwinkern</string>
- <string name="anim_wink_hollywood">Zwinkern (Hollywood)</string>
- <string name="anim_express_worry">Sorgenvoll</string>
- <string name="anim_yes_happy">Ja (Erfreut)</string>
- <string name="anim_yes_head">Ja</string>
- <string name="multiple_textures">Mehrfach</string>
- <string name="use_texture">Textur verwenden</string>
- <string name="manip_hint1">Zum Einrasten Mauscursor</string>
- <string name="manip_hint2">über Lineal bewegen</string>
- <string name="texture_loading">Wird geladen...</string>
- <string name="worldmap_offline">Offline</string>
- <string name="worldmap_item_tooltip_format">[PRICE] L$ für [AREA] m²</string>
- <string name="worldmap_results_none_found">Nicht gefunden.</string>
- <string name="Ok">OK</string>
- <string name="Premature end of file">Unvollständige Datei</string>
- <string name="ST_NO_JOINT">HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden.</string>
- <string name="NearbyChatTitle">Chat in der Nähe</string>
- <string name="NearbyChatLabel">(Chat in der Nähe)</string>
- <string name="whisper">flüstert:</string>
- <string name="shout">ruft:</string>
- <string name="ringing">Verbindung mit In-Welt-Voice-Chat...</string>
- <string name="connected">Verbunden</string>
- <string name="unavailable">Der aktuelle Standort unterstützt keine Voice-Kommunikation</string>
- <string name="hang_up">Verbindung mit In-Welt-Voice-Chat getrennt</string>
- <string name="reconnect_nearby">Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden</string>
- <string name="ScriptQuestionCautionChatGranted">Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].</string>
- <string name="ScriptQuestionCautionChatDenied">Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].</string>
- <string name="AdditionalPermissionsRequestHeader">Wenn Sie dem Objekt Zugriff auf Ihr Konto gewähren, kann dieses außerdem:</string>
- <string name="ScriptTakeMoney">Linden-Dollar (L$) von Ihnen nehmen</string>
- <string name="ActOnControlInputs">Steuerung festlegen</string>
- <string name="RemapControlInputs">Steuerung neu zuweisen</string>
- <string name="AnimateYourAvatar">Avatar animieren</string>
- <string name="AttachToYourAvatar">An Avatar anhängen</string>
- <string name="ReleaseOwnership">Eigentum aufgeben und öffentlich machen</string>
- <string name="LinkAndDelink">Mit Objekten verknüpfen und davon trennen</string>
- <string name="AddAndRemoveJoints">Verbindungen zu anderen Objekten hinzufügen und entfernen</string>
- <string name="ChangePermissions">Berechtigungen ändern</string>
- <string name="TrackYourCamera">Kameraverfolgung</string>
- <string name="ControlYourCamera">Kamerasteuerung</string>
- <string name="TeleportYourAgent">Sie teleportieren</string>
- <string name="ForceSitAvatar">Ihren Avatar zwingen, sich zu setzen</string>
- <string name="ChangeEnvSettings">Umgebungseinstellungen ändern</string>
- <string name="NotConnected">Nicht verbunden</string>
- <string name="AgentNameSubst">(Sie)</string>
+nächsten Eigentümer angehängt werden.
+ </string>
+ <string name="Searching">
+ Suchen...
+ </string>
+ <string name="NoneFound">
+ Nicht gefunden.
+ </string>
+ <string name="RetrievingData">
+ Laden...
+ </string>
+ <string name="ReleaseNotes">
+ Versionshinweise
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ https://megapahit.net/
+ </string>
+ <string name="LoadingData">
+ Wird geladen...
+ </string>
+ <string name="AvatarNameNobody">
+ (niemand)
+ </string>
+ <string name="AvatarNameWaiting">
+ (wartet)
+ </string>
+ <string name="AvatarNameMultiple">
+ (mehrere)
+ </string>
+ <string name="GroupNameNone">
+ (keiner)
+ </string>
+ <string name="AssetErrorNone">
+ Kein Fehler
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Asset-Anforderung: fehlgeschlagen
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Asset-Anforderung: Datei existiert nicht
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Asset-Anforderung: Asset in Datenbank nicht gefunden
+ </string>
+ <string name="AssetErrorEOF">
+ Ende der Datei
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Datei kann nicht geöffnet werden
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Datei nicht gefunden
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Zeitüberschreitung bei Dateiübertragung
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Verbindung verloren
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Viewer und Server sind sich nicht über Preis einig
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Status unbekannt
+ </string>
+ <string name="AssetUploadServerUnreacheble">
+ Dienst nicht verfügbar.
+ </string>
+ <string name="AssetUploadServerDifficulties">
+ Auf dem Server sind unerwartete Probleme aufgetreten.
+ </string>
+ <string name="AssetUploadServerUnavaliable">
+ Dienst nicht verfügbar oder Zeitüberschreitung beim Upload.
+ </string>
+ <string name="AssetUploadRequestInvalid">
+ Fehler bei der Upload-Anforderung. Um das Problem zu lösen,
+besuchen Sie bitte http://secondlife.com/support
+ </string>
+ <string name="SettingValidationError">
+ Validierung für das Importieren der Einstellungen [NAME] fehlgeschlagen
+ </string>
+ <string name="SettingImportFileError">
+ [FILE] konnte nicht geöffnet werden
+ </string>
+ <string name="SettingParseFileError">
+ [FILE] konnte nicht geöffnet werden
+ </string>
+ <string name="SettingTranslateError">
+ Altes Windlight [NAME] konnte nicht übernommen werden
+ </string>
+ <string name="texture">
+ Textur
+ </string>
+ <string name="sound">
+ Sound
+ </string>
+ <string name="calling card">
+ Visitenkarte
+ </string>
+ <string name="landmark">
+ Landmarke
+ </string>
+ <string name="legacy script">
+ Skript (veraltet)
+ </string>
+ <string name="clothing">
+ Kleidung
+ </string>
+ <string name="object">
+ Objekt
+ </string>
+ <string name="note card">
+ Notizkarte
+ </string>
+ <string name="folder">
+ Ordner
+ </string>
+ <string name="root">
+ Hauptverzeichnis
+ </string>
+ <string name="lsl2 script">
+ LSL2 Skript
+ </string>
+ <string name="lsl bytecode">
+ LSL Bytecode
+ </string>
+ <string name="tga texture">
+ tga-Textur
+ </string>
+ <string name="body part">
+ Körperteil
+ </string>
+ <string name="snapshot">
+ Foto
+ </string>
+ <string name="lost and found">
+ Fundbüro
+ </string>
+ <string name="targa image">
+ targa-Bild
+ </string>
+ <string name="trash">
+ Papierkorb
+ </string>
+ <string name="jpeg image">
+ jpeg-Bild
+ </string>
+ <string name="animation">
+ Animation
+ </string>
+ <string name="gesture">
+ Geste
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ Favoriten
+ </string>
+ <string name="symbolic link">
+ Link
+ </string>
+ <string name="symbolic folder link">
+ Link zu Ordner
+ </string>
+ <string name="settings blob">
+ Einstellungen
+ </string>
+ <string name="mesh">
+ mesh
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Aussehen wird bearbeitet)
+ </string>
+ <string name="AvatarAway">
+ Abwesend
+ </string>
+ <string name="AvatarDoNotDisturb">
+ Nicht stören
+ </string>
+ <string name="AvatarMuted">
+ Ignoriert
+ </string>
+ <string name="anim_express_afraid">
+ Ängstlich
+ </string>
+ <string name="anim_express_anger">
+ Verärgert
+ </string>
+ <string name="anim_away">
+ Abwesend
+ </string>
+ <string name="anim_backflip">
+ Rückwärtssalto
+ </string>
+ <string name="anim_express_laugh">
+ Lachkrampf
+ </string>
+ <string name="anim_express_toothsmile">
+ Grinsen
+ </string>
+ <string name="anim_blowkiss">
+ Kusshand
+ </string>
+ <string name="anim_express_bored">
+ Gelangweilt
+ </string>
+ <string name="anim_bow">
+ Verbeugen
+ </string>
+ <string name="anim_clap">
+ Klatschen
+ </string>
+ <string name="anim_courtbow">
+ Diener
+ </string>
+ <string name="anim_express_cry">
+ Weinen
+ </string>
+ <string name="anim_dance1">
+ Tanz 1
+ </string>
+ <string name="anim_dance2">
+ Tanz 2
+ </string>
+ <string name="anim_dance3">
+ Tanz 3
+ </string>
+ <string name="anim_dance4">
+ Tanz 4
+ </string>
+ <string name="anim_dance5">
+ Tanz 5
+ </string>
+ <string name="anim_dance6">
+ Tanz 6
+ </string>
+ <string name="anim_dance7">
+ Tanz 7
+ </string>
+ <string name="anim_dance8">
+ Tanz 8
+ </string>
+ <string name="anim_express_disdain">
+ Verachten
+ </string>
+ <string name="anim_drink">
+ Trinken
+ </string>
+ <string name="anim_express_embarrased">
+ Verlegen
+ </string>
+ <string name="anim_angry_fingerwag">
+ Drohen
+ </string>
+ <string name="anim_fist_pump">
+ Faust pumpen
+ </string>
+ <string name="anim_yoga_float">
+ Yogaflieger
+ </string>
+ <string name="anim_express_frown">
+ Stirnrunzeln
+ </string>
+ <string name="anim_impatient">
+ Ungeduldig
+ </string>
+ <string name="anim_jumpforjoy">
+ Freudensprung
+ </string>
+ <string name="anim_kissmybutt">
+ LMA
+ </string>
+ <string name="anim_express_kiss">
+ Küssen
+ </string>
+ <string name="anim_laugh_short">
+ Lachen
+ </string>
+ <string name="anim_musclebeach">
+ Posen
+ </string>
+ <string name="anim_no_unhappy">
+ Nein (Bedauernd)
+ </string>
+ <string name="anim_no_head">
+ Nein
+ </string>
+ <string name="anim_nyanya">
+ Ällabätsch
+ </string>
+ <string name="anim_punch_onetwo">
+ Eins-Zwei-Punch
+ </string>
+ <string name="anim_express_open_mouth">
+ Mund offen
+ </string>
+ <string name="anim_peace">
+ Friede
+ </string>
+ <string name="anim_point_you">
+ Auf anderen zeigen
+ </string>
+ <string name="anim_point_me">
+ Auf mich zeigen
+ </string>
+ <string name="anim_punch_l">
+ Linker Haken
+ </string>
+ <string name="anim_punch_r">
+ Rechter Haken
+ </string>
+ <string name="anim_rps_countdown">
+ SSP zählen
+ </string>
+ <string name="anim_rps_paper">
+ SSP Papier
+ </string>
+ <string name="anim_rps_rock">
+ SSP Stein
+ </string>
+ <string name="anim_rps_scissors">
+ SSP Schere
+ </string>
+ <string name="anim_express_repulsed">
+ Angewidert
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Rundkick
+ </string>
+ <string name="anim_express_sad">
+ Traurig
+ </string>
+ <string name="anim_salute">
+ Salutieren
+ </string>
+ <string name="anim_shout">
+ Rufen
+ </string>
+ <string name="anim_express_shrug">
+ Schulterzucken
+ </string>
+ <string name="anim_express_smile">
+ Lächeln
+ </string>
+ <string name="anim_smoke_idle">
+ Zigarette halten
+ </string>
+ <string name="anim_smoke_inhale">
+ Rauchen
+ </string>
+ <string name="anim_smoke_throw_down">
+ Zigarette wegwerfen
+ </string>
+ <string name="anim_express_surprise">
+ Überraschung
+ </string>
+ <string name="anim_sword_strike_r">
+ Schwerthieb
+ </string>
+ <string name="anim_angry_tantrum">
+ Wutanfall
+ </string>
+ <string name="anim_express_tongue_out">
+ Zunge rausstrecken
+ </string>
+ <string name="anim_hello">
+ Winken
+ </string>
+ <string name="anim_whisper">
+ Flüstern
+ </string>
+ <string name="anim_whistle">
+ Pfeifen
+ </string>
+ <string name="anim_express_wink">
+ Zwinkern
+ </string>
+ <string name="anim_wink_hollywood">
+ Zwinkern (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Sorgenvoll
+ </string>
+ <string name="anim_yes_happy">
+ Ja (Erfreut)
+ </string>
+ <string name="anim_yes_head">
+ Ja
+ </string>
+ <string name="multiple_textures">
+ Mehrfach
+ </string>
+ <string name="use_texture">
+ Textur verwenden
+ </string>
+ <string name="manip_hint1">
+ Zum Einrasten Mauscursor
+ </string>
+ <string name="manip_hint2">
+ über Lineal bewegen
+ </string>
+ <string name="texture_loading">
+ Wird geladen...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [PRICE] L$ für [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ Nicht gefunden.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Unvollständige Datei
+ </string>
+ <string name="ST_NO_JOINT">
+ HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden.
+ </string>
+ <string name="NearbyChatTitle">
+ Chat in der Nähe
+ </string>
+ <string name="NearbyChatLabel">
+ (Chat in der Nähe)
+ </string>
+ <string name="whisper">
+ flüstert:
+ </string>
+ <string name="shout">
+ ruft:
+ </string>
+ <string name="ringing">
+ Verbindung mit In-Welt-Voice-Chat...
+ </string>
+ <string name="connected">
+ Verbunden
+ </string>
+ <string name="unavailable">
+ Der aktuelle Standort unterstützt keine Voice-Kommunikation
+ </string>
+ <string name="hang_up">
+ Verbindung mit In-Welt-Voice-Chat getrennt
+ </string>
+ <string name="reconnect_nearby">
+ Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].
+ </string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Wenn Sie dem Objekt Zugriff auf Ihr Konto gewähren, kann dieses außerdem:
+ </string>
+ <string name="ScriptTakeMoney">
+ Linden-Dollar (L$) von Ihnen nehmen
+ </string>
+ <string name="ActOnControlInputs">
+ Steuerung festlegen
+ </string>
+ <string name="RemapControlInputs">
+ Steuerung neu zuweisen
+ </string>
+ <string name="AnimateYourAvatar">
+ Avatar animieren
+ </string>
+ <string name="AttachToYourAvatar">
+ An Avatar anhängen
+ </string>
+ <string name="ReleaseOwnership">
+ Eigentum aufgeben und öffentlich machen
+ </string>
+ <string name="LinkAndDelink">
+ Mit Objekten verknüpfen und davon trennen
+ </string>
+ <string name="AddAndRemoveJoints">
+ Verbindungen zu anderen Objekten hinzufügen und entfernen
+ </string>
+ <string name="ChangePermissions">
+ Berechtigungen ändern
+ </string>
+ <string name="TrackYourCamera">
+ Kameraverfolgung
+ </string>
+ <string name="ControlYourCamera">
+ Kamerasteuerung
+ </string>
+ <string name="TeleportYourAgent">
+ Sie teleportieren
+ </string>
+ <string name="ForceSitAvatar">
+ Ihren Avatar zwingen, sich zu setzen
+ </string>
+ <string name="ChangeEnvSettings">
+ Umgebungseinstellungen ändern
+ </string>
+ <string name="NotConnected">
+ Nicht verbunden
+ </string>
+ <string name="AgentNameSubst">
+ (Sie)
+ </string>
<string name="JoinAnExperience"/>
- <string name="SilentlyManageEstateAccess">Beim Verwalten von Grundbesitzzugangslisten Warnhinweise unterdrücken</string>
- <string name="OverrideYourAnimations">Ihre Standardanimationen ersetzen</string>
- <string name="ScriptReturnObjects">Objekte in Ihrem Namen zurückgeben</string>
- <string name="UnknownScriptPermission">(unbekannt)</string>
- <string name="SIM_ACCESS_PG">Generell</string>
- <string name="SIM_ACCESS_MATURE">Moderat</string>
- <string name="SIM_ACCESS_ADULT">Adult</string>
- <string name="SIM_ACCESS_DOWN">Offline</string>
- <string name="SIM_ACCESS_MIN">Unbekannt</string>
- <string name="land_type_unknown">(unbekannt)</string>
- <string name="Estate / Full Region">Grundstück / Vollständige Region</string>
- <string name="Estate / Homestead">Grundbesitz/Homestead</string>
- <string name="Mainland / Homestead">Mainland/Homestead</string>
- <string name="Mainland / Full Region">Mainland / Vollständige Region</string>
- <string name="all_files">Alle Dateien</string>
- <string name="sound_files">Sounds</string>
- <string name="animation_files">Animationen</string>
- <string name="image_files">Bilder</string>
- <string name="save_file_verb">Speichern</string>
- <string name="load_file_verb">Laden</string>
- <string name="targa_image_files">Targa-Bilder</string>
- <string name="bitmap_image_files">Bitmap-Bilder</string>
- <string name="png_image_files">PNG-Bilder</string>
- <string name="save_texture_image_files">Targa- oder PNG-Bilder</string>
- <string name="avi_movie_file">AVI-Filmdatei</string>
- <string name="xaf_animation_file">XAF Anim-Datei</string>
- <string name="xml_file">XML-Datei</string>
- <string name="raw_file">RAW-Datei</string>
- <string name="compressed_image_files">Komprimierte Bilder</string>
- <string name="load_files">Dateien laden</string>
- <string name="choose_the_directory">Verzeichnis auswählen</string>
- <string name="script_files">Skripts</string>
- <string name="dictionary_files">Wörterbücher</string>
- <string name="shape">Form</string>
- <string name="skin">Haut</string>
- <string name="hair">Haare</string>
- <string name="eyes">Augen</string>
- <string name="shirt">Hemd</string>
- <string name="pants">Hose</string>
- <string name="shoes">Schuhe</string>
- <string name="socks">Socken</string>
- <string name="jacket">Jacke</string>
- <string name="gloves">Handschuhe</string>
- <string name="undershirt">Unterhemd</string>
- <string name="underpants">Unterhose</string>
- <string name="skirt">Rock</string>
- <string name="alpha">Alpha</string>
- <string name="tattoo">Tätowierung</string>
- <string name="universal">Universal</string>
- <string name="physics">Physik</string>
- <string name="invalid">ungültig</string>
- <string name="none">keine</string>
- <string name="shirt_not_worn">Hemd nicht getragen</string>
- <string name="pants_not_worn">Hosen nicht getragen</string>
- <string name="shoes_not_worn">Schuhe nicht getragen</string>
- <string name="socks_not_worn">Socken nicht getragen</string>
- <string name="jacket_not_worn">Jacke nicht getragen</string>
- <string name="gloves_not_worn">Handschuhe nicht getragen</string>
- <string name="undershirt_not_worn">Unterhemd nicht getragen</string>
- <string name="underpants_not_worn">Unterhose nicht getragen</string>
- <string name="skirt_not_worn">Rock nicht getragen</string>
- <string name="alpha_not_worn">Alpha nicht getragen</string>
- <string name="tattoo_not_worn">Tätowierung nicht getragen</string>
- <string name="universal_not_worn">Universal nicht getragen</string>
- <string name="physics_not_worn">Physik nicht getragen</string>
- <string name="invalid_not_worn">ungültig</string>
- <string name="create_new_shape">Neue Form/Gestalt erstellen</string>
- <string name="create_new_skin">Neue Haut erstellen</string>
- <string name="create_new_hair">Neue Haare erstellen</string>
- <string name="create_new_eyes">Neue Augen erstellen</string>
- <string name="create_new_shirt">Neues Hemd erstellen</string>
- <string name="create_new_pants">Neue Hose erstellen</string>
- <string name="create_new_shoes">Neue Schuhe erstellen</string>
- <string name="create_new_socks">Neue Socken erstellen</string>
- <string name="create_new_jacket">Neue Jacke erstellen</string>
- <string name="create_new_gloves">Neue Handschuhe erstellen</string>
- <string name="create_new_undershirt">Neues Unterhemd erstellen</string>
- <string name="create_new_underpants">Neue Unterhose erstellen</string>
- <string name="create_new_skirt">Neuer Rock erstellen</string>
- <string name="create_new_alpha">Neue Alpha erstellen</string>
- <string name="create_new_tattoo">Neue Tätowierung erstellen</string>
- <string name="create_new_universal">Neues Universal erstellen</string>
- <string name="create_new_physics">Neue Physik erstellen</string>
- <string name="create_new_invalid">ungültig</string>
- <string name="NewWearable">Neue/r/s [WEARABLE_ITEM]</string>
- <string name="next">Weiter</string>
- <string name="ok">OK</string>
- <string name="GroupNotifyGroupNotice">Gruppenmitteilung</string>
- <string name="GroupNotifyGroupNotices">Gruppenmitteilungen</string>
- <string name="GroupNotifySentBy">Gesendet von</string>
- <string name="GroupNotifyAttached">Im Anhang:</string>
- <string name="GroupNotifyViewPastNotices">Alte Mitteilungen anzeigen oder hier Auswahl treffen, um keine Mitteilungen mehr zu erhalten.</string>
- <string name="GroupNotifyOpenAttachment">Anlage öffnen</string>
- <string name="GroupNotifySaveAttachment">Siehe Anhang</string>
- <string name="TeleportOffer">Teleport-Angebot</string>
- <string name="StartUpNotifications">Sie haben neue Benachrichtigungen erhalten, während Sie abwesend waren.</string>
- <string name="OverflowInfoChannelString">Sie haben noch %d weitere Benachrichtigungen</string>
- <string name="BodyPartsRightArm">Rechter Arm</string>
- <string name="BodyPartsHead">Kopf</string>
- <string name="BodyPartsLeftArm">Linker Arm</string>
- <string name="BodyPartsLeftLeg">Linkes Bein</string>
- <string name="BodyPartsTorso">Oberkörper</string>
- <string name="BodyPartsRightLeg">Rechtes Bein</string>
- <string name="BodyPartsEnhancedSkeleton">Erweitertes Skelett</string>
- <string name="GraphicsQualityLow">Niedrig</string>
- <string name="GraphicsQualityMid">Mittel</string>
- <string name="GraphicsQualityHigh">Hoch</string>
- <string name="LeaveMouselook">ESC drücken, um zur Normalansicht zurückzukehren</string>
- <string name="InventoryNoMatchingItems">Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche].</string>
- <string name="InventoryNoMatchingRecentItems">Sie haben nicht das Richtige gefunden? Versuchen Sie [secondlife:///app/inventory/filters Show filters].</string>
- <string name="PlacesNoMatchingItems">Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche].</string>
- <string name="FavoritesNoMatchingItems">Landmarke hier hin ziehen, um diese hinzuzufügen.</string>
- <string name="MarketplaceNoMatchingItems">Keine übereinstimmenden Objekte gefunden. Überprüfen Sie die Schreibweise des Suchbegriffs und versuchen Sie es noch einmal.</string>
- <string name="InventoryNoTexture">Sie haben keine Kopie dieser Textur in Ihrem Inventar.</string>
- <string name="InventoryInboxNoItems">Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.</string>
- <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
- <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string>
- <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
- <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
- <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
- <string name="InventoryPlayAnimationTooltip">Fenster mit Spieloptionen öffnen.</string>
- <string name="InventoryPlayGestureTooltip">Ausgewählte Geste inworld ausführen.</string>
- <string name="InventoryPlaySoundTooltip">Fenster mit Spieloptionen öffnen.</string>
- <string name="InventoryOutboxNotMerchantTitle">Jeder kann Artikel im Marktplatz verkaufen.</string>
+ <string name="SilentlyManageEstateAccess">
+ Beim Verwalten von Grundbesitzzugangslisten Warnhinweise unterdrücken
+ </string>
+ <string name="OverrideYourAnimations">
+ Ihre Standardanimationen ersetzen
+ </string>
+ <string name="ScriptReturnObjects">
+ Objekte in Ihrem Namen zurückgeben
+ </string>
+ <string name="UnknownScriptPermission">
+ (unbekannt)
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Generell
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderat
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adult
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Offline
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Unbekannt
+ </string>
+ <string name="land_type_unknown">
+ (unbekannt)
+ </string>
+ <string name="Estate / Full Region">
+ Grundstück / Vollständige Region
+ </string>
+ <string name="Estate / Homestead">
+ Grundbesitz/Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Mainland/Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Mainland / Vollständige Region
+ </string>
+ <string name="all_files">
+ Alle Dateien
+ </string>
+ <string name="sound_files">
+ Sounds
+ </string>
+ <string name="animation_files">
+ Animationen
+ </string>
+ <string name="image_files">
+ Bilder
+ </string>
+ <string name="save_file_verb">
+ Speichern
+ </string>
+ <string name="load_file_verb">
+ Laden
+ </string>
+ <string name="targa_image_files">
+ Targa-Bilder
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap-Bilder
+ </string>
+ <string name="png_image_files">
+ PNG-Bilder
+ </string>
+ <string name="save_texture_image_files">
+ Targa- oder PNG-Bilder
+ </string>
+ <string name="avi_movie_file">
+ AVI-Filmdatei
+ </string>
+ <string name="xaf_animation_file">
+ XAF Anim-Datei
+ </string>
+ <string name="xml_file">
+ XML-Datei
+ </string>
+ <string name="raw_file">
+ RAW-Datei
+ </string>
+ <string name="compressed_image_files">
+ Komprimierte Bilder
+ </string>
+ <string name="load_files">
+ Dateien laden
+ </string>
+ <string name="choose_the_directory">
+ Verzeichnis auswählen
+ </string>
+ <string name="script_files">
+ Skripts
+ </string>
+ <string name="dictionary_files">
+ Wörterbücher
+ </string>
+ <string name="shape">
+ Form
+ </string>
+ <string name="skin">
+ Haut
+ </string>
+ <string name="hair">
+ Haare
+ </string>
+ <string name="eyes">
+ Augen
+ </string>
+ <string name="shirt">
+ Hemd
+ </string>
+ <string name="pants">
+ Hose
+ </string>
+ <string name="shoes">
+ Schuhe
+ </string>
+ <string name="socks">
+ Socken
+ </string>
+ <string name="jacket">
+ Jacke
+ </string>
+ <string name="gloves">
+ Handschuhe
+ </string>
+ <string name="undershirt">
+ Unterhemd
+ </string>
+ <string name="underpants">
+ Unterhose
+ </string>
+ <string name="skirt">
+ Rock
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tätowierung
+ </string>
+ <string name="universal">
+ Universal
+ </string>
+ <string name="physics">
+ Physik
+ </string>
+ <string name="invalid">
+ ungültig
+ </string>
+ <string name="none">
+ keine
+ </string>
+ <string name="shirt_not_worn">
+ Hemd nicht getragen
+ </string>
+ <string name="pants_not_worn">
+ Hosen nicht getragen
+ </string>
+ <string name="shoes_not_worn">
+ Schuhe nicht getragen
+ </string>
+ <string name="socks_not_worn">
+ Socken nicht getragen
+ </string>
+ <string name="jacket_not_worn">
+ Jacke nicht getragen
+ </string>
+ <string name="gloves_not_worn">
+ Handschuhe nicht getragen
+ </string>
+ <string name="undershirt_not_worn">
+ Unterhemd nicht getragen
+ </string>
+ <string name="underpants_not_worn">
+ Unterhose nicht getragen
+ </string>
+ <string name="skirt_not_worn">
+ Rock nicht getragen
+ </string>
+ <string name="alpha_not_worn">
+ Alpha nicht getragen
+ </string>
+ <string name="tattoo_not_worn">
+ Tätowierung nicht getragen
+ </string>
+ <string name="universal_not_worn">
+ Universal nicht getragen
+ </string>
+ <string name="physics_not_worn">
+ Physik nicht getragen
+ </string>
+ <string name="invalid_not_worn">
+ ungültig
+ </string>
+ <string name="create_new_shape">
+ Neue Form/Gestalt erstellen
+ </string>
+ <string name="create_new_skin">
+ Neue Haut erstellen
+ </string>
+ <string name="create_new_hair">
+ Neue Haare erstellen
+ </string>
+ <string name="create_new_eyes">
+ Neue Augen erstellen
+ </string>
+ <string name="create_new_shirt">
+ Neues Hemd erstellen
+ </string>
+ <string name="create_new_pants">
+ Neue Hose erstellen
+ </string>
+ <string name="create_new_shoes">
+ Neue Schuhe erstellen
+ </string>
+ <string name="create_new_socks">
+ Neue Socken erstellen
+ </string>
+ <string name="create_new_jacket">
+ Neue Jacke erstellen
+ </string>
+ <string name="create_new_gloves">
+ Neue Handschuhe erstellen
+ </string>
+ <string name="create_new_undershirt">
+ Neues Unterhemd erstellen
+ </string>
+ <string name="create_new_underpants">
+ Neue Unterhose erstellen
+ </string>
+ <string name="create_new_skirt">
+ Neuer Rock erstellen
+ </string>
+ <string name="create_new_alpha">
+ Neue Alpha erstellen
+ </string>
+ <string name="create_new_tattoo">
+ Neue Tätowierung erstellen
+ </string>
+ <string name="create_new_universal">
+ Neues Universal erstellen
+ </string>
+ <string name="create_new_physics">
+ Neue Physik erstellen
+ </string>
+ <string name="create_new_invalid">
+ ungültig
+ </string>
+ <string name="NewWearable">
+ Neue/r/s [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Weiter
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Gruppenmitteilung
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Gruppenmitteilungen
+ </string>
+ <string name="GroupNotifySentBy">
+ Gesendet von
+ </string>
+ <string name="GroupNotifyAttached">
+ Im Anhang:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Alte Mitteilungen anzeigen oder hier Auswahl treffen, um keine Mitteilungen mehr zu erhalten.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Anlage öffnen
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Siehe Anhang
+ </string>
+ <string name="TeleportOffer">
+ Teleport-Angebot
+ </string>
+ <string name="StartUpNotifications">
+ Sie haben neue Benachrichtigungen erhalten, während Sie abwesend waren.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Sie haben noch %d weitere Benachrichtigungen
+ </string>
+ <string name="BodyPartsRightArm">
+ Rechter Arm
+ </string>
+ <string name="BodyPartsHead">
+ Kopf
+ </string>
+ <string name="BodyPartsLeftArm">
+ Linker Arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Linkes Bein
+ </string>
+ <string name="BodyPartsTorso">
+ Oberkörper
+ </string>
+ <string name="BodyPartsRightLeg">
+ Rechtes Bein
+ </string>
+ <string name="BodyPartsEnhancedSkeleton">
+ Erweitertes Skelett
+ </string>
+ <string name="GraphicsQualityLow">
+ Niedrig
+ </string>
+ <string name="GraphicsQualityMid">
+ Mittel
+ </string>
+ <string name="GraphicsQualityHigh">
+ Hoch
+ </string>
+ <string name="LeaveMouselook">
+ ESC drücken, um zur Normalansicht zurückzukehren
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche].
+ </string>
+ <string name="InventoryNoMatchingRecentItems">
+ Sie haben nicht das Richtige gefunden? Versuchen Sie [secondlife:///app/inventory/filters Show filters].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Landmarke hier hin ziehen, um diese hinzuzufügen.
+ </string>
+ <string name="MarketplaceNoMatchingItems">
+ Keine übereinstimmenden Objekte gefunden. Überprüfen Sie die Schreibweise des Suchbegriffs und versuchen Sie es noch einmal.
+ </string>
+ <string name="InventoryNoTexture">
+ Sie haben keine Kopie dieser Textur in Ihrem Inventar.
+ </string>
+ <string name="InventoryInboxNoItems">
+ Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryPlayAnimationTooltip">
+ Fenster mit Spieloptionen öffnen.
+ </string>
+ <string name="InventoryPlayGestureTooltip">
+ Ausgewählte Geste inworld ausführen.
+ </string>
+ <string name="InventoryPlaySoundTooltip">
+ Fenster mit Spieloptionen öffnen.
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Jeder kann Artikel im Marktplatz verkaufen.
+ </string>
<string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen].</string>
- <string name="InventoryOutboxNoItemsTitle">Ihre Outbox ist leer.</string>
+ <string name="InventoryOutboxNotMerchant">
+ Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Ihre Outbox ist leer.
+ </string>
<string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.</string>
- <string name="InventoryOutboxInitializingTitle">Marktplatz wird initialisiert.</string>
- <string name="InventoryOutboxInitializing">Wir greifen auf Ihr Konto im [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] zu.</string>
- <string name="InventoryOutboxErrorTitle">Marktplatzfehler.</string>
- <string name="InventoryOutboxError">Der [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] gibt Fehler zurück.</string>
- <string name="InventoryMarketplaceError">Beim Öffnen der Marktplatz-Auflistungen ist ein Fehler aufgetreten.
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://support.secondlife.com an den Support von Second Life.</string>
- <string name="InventoryMarketplaceListingsNoItemsTitle">Ihr Ordner mit Marktplatz-Auflistungen ist leer.</string>
- <string name="InventoryMarketplaceListingsNoItems">Ziehen Sie Ordner in diesen Bereich, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.</string>
- <string name="InventoryItemsCount">( [ITEMS_COUNT] Artikel )</string>
- <string name="Marketplace Validation Warning Stock">Bestandsordner müssen in einem Versionsordner gespeichert sein</string>
- <string name="Marketplace Validation Error Mixed Stock">: Fehler: Alle Objekte in einem Bestandsordner müssen kopiergeschützt und vom gleichen Typ sein.</string>
- <string name="Marketplace Validation Error Subfolder In Stock">: Fehler: Bestandsordner kann keine Unterordner enthalten</string>
- <string name="Marketplace Validation Warning Empty">: Warnung: Ordner enthält keine Objekte</string>
- <string name="Marketplace Validation Warning Create Stock">: Warnung: Bestandsordner wird erstellt</string>
- <string name="Marketplace Validation Warning Create Version">: Warnung: Versionsordner wird erstellt</string>
- <string name="Marketplace Validation Warning Move">: Warnung: Objekte werden verschoben</string>
- <string name="Marketplace Validation Warning Delete">: Warnung: Ordnerinhalte wurden in Bestandsordner übertragen; leerer Ordner wird entfernt</string>
- <string name="Marketplace Validation Error Stock Item">: Fehler: Kopiergeschützte Objekte müssen in einem Bestandsordner gespeichert sein</string>
- <string name="Marketplace Validation Warning Unwrapped Item">: Warnung: Objekte müssen in einem Versionsordner gespeichert sein</string>
- <string name="Marketplace Validation Error">: Fehler:</string>
- <string name="Marketplace Validation Warning">: Warnung:</string>
- <string name="Marketplace Validation Error Empty Version">: Warnung: Versionsordner muss mindestens 1 Objekt enthalten</string>
- <string name="Marketplace Validation Error Empty Stock">: Warnung: Bestandsordner muss mindestens 1 Objekt enthalten</string>
- <string name="Marketplace Validation No Error">Keine Fehler oder Warnungen</string>
- <string name="Marketplace Error None">Keine Fehler</string>
- <string name="Marketplace Error Prefix">Fehler:</string>
- <string name="Marketplace Error Not Merchant">Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos).</string>
- <string name="Marketplace Error Not Accepted">Objekt kann nicht in diesen Ordner verschoben werden.</string>
- <string name="Marketplace Error Unsellable Item">Dieses Objekt kann nicht im Marktplatz verkauft werden.</string>
- <string name="MarketplaceNoID">keine Mkt-ID</string>
- <string name="MarketplaceLive">aufgelistet</string>
- <string name="MarketplaceActive">aktiv</string>
- <string name="MarketplaceMax">max.</string>
- <string name="MarketplaceStock">Bestand</string>
- <string name="MarketplaceNoStock">ausverkauft</string>
- <string name="MarketplaceUpdating">Aktualisierung läuft...</string>
- <string name="UploadFeeInfo">Die Gebühr richtet sich nach deiner Abonnementstufe. Für höhere Stufen werden niedrigere Gebühren erhoben. [https://secondlife.com/my/account/membership.php? Mehr erfahren]</string>
- <string name="Open landmarks">Wegweiser öffnen</string>
- <string name="Unconstrained">Unbegrenzt</string>
+ <string name="InventoryOutboxNoItems">
+ Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.
+ </string>
+ <string name="InventoryOutboxInitializingTitle">
+ Marktplatz wird initialisiert.
+ </string>
+ <string name="InventoryOutboxInitializing">
+ Wir greifen auf Ihr Konto im [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] zu.
+ </string>
+ <string name="InventoryOutboxErrorTitle">
+ Marktplatzfehler.
+ </string>
+ <string name="InventoryOutboxError">
+ Der [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] gibt Fehler zurück.
+ </string>
+ <string name="InventoryMarketplaceError">
+ Beim Öffnen der Marktplatz-Auflistungen ist ein Fehler aufgetreten.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://support.secondlife.com an den Support von Second Life.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Ihr Ordner mit Marktplatz-Auflistungen ist leer.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Ziehen Sie Ordner in diesen Bereich, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.
+ </string>
+ <string name="InventoryItemsCount">
+ ( [ITEMS_COUNT] Artikel )
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ Bestandsordner müssen in einem Versionsordner gespeichert sein
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Fehler: Alle Objekte in einem Bestandsordner müssen kopiergeschützt und vom gleichen Typ sein.
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Fehler: Bestandsordner kann keine Unterordner enthalten
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Warnung: Ordner enthält keine Objekte
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Warnung: Bestandsordner wird erstellt
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Warnung: Versionsordner wird erstellt
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Warnung: Objekte werden verschoben
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Warnung: Ordnerinhalte wurden in Bestandsordner übertragen; leerer Ordner wird entfernt
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Fehler: Kopiergeschützte Objekte müssen in einem Bestandsordner gespeichert sein
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Warnung: Objekte müssen in einem Versionsordner gespeichert sein
+ </string>
+ <string name="Marketplace Validation Error">
+ : Fehler:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Warnung:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Warnung: Versionsordner muss mindestens 1 Objekt enthalten
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Warnung: Bestandsordner muss mindestens 1 Objekt enthalten
+ </string>
+ <string name="Marketplace Validation No Error">
+ Keine Fehler oder Warnungen
+ </string>
+ <string name="Marketplace Error None">
+ Keine Fehler
+ </string>
+ <string name="Marketplace Error Prefix">
+ Fehler:
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos).
+ </string>
+ <string name="Marketplace Error Not Accepted">
+ Objekt kann nicht in diesen Ordner verschoben werden.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Dieses Objekt kann nicht im Marktplatz verkauft werden.
+ </string>
+ <string name="MarketplaceNoID">
+ keine Mkt-ID
+ </string>
+ <string name="MarketplaceLive">
+ aufgelistet
+ </string>
+ <string name="MarketplaceActive">
+ aktiv
+ </string>
+ <string name="MarketplaceMax">
+ max.
+ </string>
+ <string name="MarketplaceStock">
+ Bestand
+ </string>
+ <string name="MarketplaceNoStock">
+ ausverkauft
+ </string>
+ <string name="MarketplaceUpdating">
+ Aktualisierung läuft...
+ </string>
+ <string name="UploadFeeInfo">
+ Die Gebühr richtet sich nach deiner Abonnementstufe. Für höhere Stufen werden niedrigere Gebühren erhoben. [https://secondlife.com/my/account/membership.php? Mehr erfahren]
+ </string>
+ <string name="Open landmarks">
+ Wegweiser öffnen
+ </string>
+ <string name="Unconstrained">
+ Unbegrenzt
+ </string>
<string name="no_transfer" value=" (kein Transferieren)"/>
<string name="no_modify" value=" (kein Bearbeiten)"/>
<string name="no_copy" value=" (kein Kopieren)"/>
<string name="worn" value=" (getragen)"/>
<string name="link" value=" (Link)"/>
<string name="broken_link" value=" (unvollständiger_Link)"/>
- <string name="LoadingContents">Inhalte werden geladen...</string>
- <string name="NoContents">Keine Inhalte</string>
+ <string name="LoadingContents">
+ Inhalte werden geladen...
+ </string>
+ <string name="NoContents">
+ Keine Inhalte
+ </string>
<string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/>
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/>
- <string name="PermYes">Ja</string>
- <string name="PermNo">Nein</string>
+ <string name="PermYes">
+ Ja
+ </string>
+ <string name="PermNo">
+ Nein
+ </string>
<string name="Chat Message" value="Chat:"/>
<string name="Sound" value=" Sound:"/>
<string name="Wait" value=" --- Warten:"/>
@@ -636,1439 +1704,4215 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo
<string name="Snapshots" value=" Fotos,"/>
<string name="No Filters" value="Nein "/>
<string name="Since Logoff" value=" - Seit Abmeldung"/>
- <string name="InvFolder My Inventory">Mein Inventar</string>
- <string name="InvFolder Library">Bibliothek</string>
- <string name="InvFolder Textures">Texturen</string>
- <string name="InvFolder Sounds">Sounds</string>
- <string name="InvFolder Calling Cards">Visitenkarten</string>
- <string name="InvFolder Landmarks">Landmarken</string>
- <string name="InvFolder Scripts">Skripts</string>
- <string name="InvFolder Clothing">Kleidung</string>
- <string name="InvFolder Objects">Objekte</string>
- <string name="InvFolder Notecards">Notizkarten</string>
- <string name="InvFolder New Folder">Neuer Ordner</string>
- <string name="InvFolder Inventory">Inventar</string>
- <string name="InvFolder Uncompressed Images">Nicht-Komprimierte Bilder</string>
- <string name="InvFolder Body Parts">Körperteile</string>
- <string name="InvFolder Trash">Papierkorb</string>
- <string name="InvFolder Photo Album">Fotoalbum</string>
- <string name="InvFolder Lost And Found">Fundbüro</string>
- <string name="InvFolder Uncompressed Sounds">Nicht-Komprimierte Sounds</string>
- <string name="InvFolder Animations">Animationen</string>
- <string name="InvFolder Gestures">Gesten</string>
- <string name="InvFolder Favorite">Meine Favoriten</string>
- <string name="InvFolder favorite">Meine Favoriten</string>
- <string name="InvFolder Favorites">Meine Favoriten</string>
- <string name="InvFolder favorites">Meine Favoriten</string>
- <string name="InvFolder Current Outfit">Aktuelles Outfit</string>
- <string name="InvFolder Initial Outfits">Ursprüngliche Outfits</string>
- <string name="InvFolder My Outfits">Meine Outfits</string>
- <string name="InvFolder Accessories">Zubehör</string>
- <string name="InvFolder Meshes">Netze</string>
- <string name="InvFolder Received Items">Erhaltene Artikel</string>
- <string name="InvFolder Merchant Outbox">Händler-Outbox</string>
- <string name="InvFolder Friends">Freunde</string>
- <string name="InvFolder All">Alle</string>
- <string name="no_attachments">Keine Anhänge getragen</string>
- <string name="Attachments remain">Anhänge (noch [COUNT] Positionen frei)</string>
- <string name="Buy">Kaufen</string>
- <string name="BuyforL$">Kaufen für L$</string>
- <string name="Stone">Stein</string>
- <string name="Metal">Metall</string>
- <string name="Glass">Glas</string>
- <string name="Wood">Holz</string>
- <string name="Flesh">Fleisch</string>
- <string name="Plastic">Plastik</string>
- <string name="Rubber">Gummi</string>
- <string name="Light">Hell</string>
- <string name="KBShift">Umschalt-Taste</string>
- <string name="KBCtrl">Strg</string>
- <string name="Chest">Brust</string>
- <string name="Skull">Schädel</string>
- <string name="Left Shoulder">Linke Schulter</string>
- <string name="Right Shoulder">Rechte Schulter</string>
- <string name="Left Hand">Linke Hand</string>
- <string name="Right Hand">Rechte Hand</string>
- <string name="Left Foot">Linker Fuß</string>
- <string name="Right Foot">Rechter Fuß</string>
- <string name="Spine">Wirbelsäule</string>
- <string name="Pelvis">Becken</string>
- <string name="Mouth">Mund</string>
- <string name="Chin">Kinn</string>
- <string name="Left Ear">Linkes Ohr</string>
- <string name="Right Ear">Rechtes Ohr</string>
- <string name="Left Eyeball">Linker Augapfel</string>
- <string name="Right Eyeball">Rechter Augapfel</string>
- <string name="Nose">Nase</string>
- <string name="R Upper Arm">R Oberarm</string>
- <string name="R Forearm">R Unterarm</string>
- <string name="L Upper Arm">L Oberarm</string>
- <string name="L Forearm">L Unterarm</string>
- <string name="Right Hip">Rechte Hüfte</string>
- <string name="R Upper Leg">R Oberschenkel</string>
- <string name="R Lower Leg">R Unterschenkel</string>
- <string name="Left Hip">Linke Hüfte</string>
- <string name="L Upper Leg">L Oberschenkel</string>
- <string name="L Lower Leg">L Unterschenkel</string>
- <string name="Stomach">Bauch</string>
- <string name="Left Pec">Linke Brust</string>
- <string name="Right Pec">Rechts</string>
- <string name="Neck">Hals</string>
- <string name="Avatar Center">Avatar-Mitte</string>
- <string name="Left Ring Finger">Linker Ringfinger</string>
- <string name="Right Ring Finger">Rechter Ringfinger</string>
- <string name="Tail Base">Schwanzansatz</string>
- <string name="Tail Tip">Schwanzspitze</string>
- <string name="Left Wing">Linker Flügel</string>
- <string name="Right Wing">Rechter Flügel</string>
- <string name="Jaw">Kiefer</string>
- <string name="Alt Left Ear">Alt. linkes Ohr</string>
- <string name="Alt Right Ear">Alt. rechtes Ohr</string>
- <string name="Alt Left Eye">Alt. linkes Auge</string>
- <string name="Alt Right Eye">Alt. rechtes Auge</string>
- <string name="Tongue">Zunge</string>
- <string name="Groin">Leiste</string>
- <string name="Left Hind Foot">Linker hinterer Fuß</string>
- <string name="Right Hind Foot">Rechter hinterer Fuß</string>
- <string name="Invalid Attachment">Ungültige Stelle für Anhang</string>
- <string name="ATTACHMENT_MISSING_ITEM">Fehler: fehlendes Objekt</string>
- <string name="ATTACHMENT_MISSING_BASE_ITEM">Fehler: Basisobjekt fehlt</string>
- <string name="ATTACHMENT_NOT_ATTACHED">Fehler: Objekt ist im aktuellen Outfit, aber nicht angehängt</string>
- <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] alt</string>
- <string name="YearsOld">[AGEYEARS] alt</string>
- <string name="MonthsOld">[AGEMONTHS] alt</string>
- <string name="WeeksOld">[AGEWEEKS] alt</string>
- <string name="DaysOld">[AGEDAYS] alt</string>
- <string name="TodayOld">Seit heute Mitglied</string>
- <string name="av_render_everyone_now">Jetzt kann jeder Sie sehen.</string>
- <string name="av_render_not_everyone">Sie sind u. U. nicht für alle Leute in Ihrer Nähe sichtbar.</string>
- <string name="av_render_over_half">Sie sind u. U. für mehr als die Hälfte der Leute in Ihrer Nähe nicht sichtbar.</string>
- <string name="av_render_most_of">Sie sind u. U. für die meisten Leuten in Ihrer Nähe nicht sichtbar.</string>
- <string name="av_render_anyone">Sie sind u. U. für niemanden in Ihrer Nähe sichtbar.</string>
- <string name="hud_description_total">Ihr HUD</string>
- <string name="hud_name_with_joint">[OBJ_NAME] (getragen von [JNT_NAME])</string>
- <string name="hud_render_memory_warning">[HUD_DETAILS] beansprucht viel Texturspeicher</string>
- <string name="hud_render_cost_warning">[HUD_DETAILS] enthält zu viele ressourcenintensive Objekte und Texturen</string>
- <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] enthält viele große Texturen</string>
- <string name="hud_render_cramped_warning">[HUD_DETAILS] enthält zu viele Objekte</string>
- <string name="hud_render_textures_warning">[HUD_DETAILS] enthält zu viele Texturen</string>
- <string name="AgeYearsA">[COUNT] Jahr</string>
- <string name="AgeYearsB">[COUNT] Jahre</string>
- <string name="AgeYearsC">[COUNT] Jahre</string>
- <string name="AgeMonthsA">[COUNT] Monat</string>
- <string name="AgeMonthsB">[COUNT] Monate</string>
- <string name="AgeMonthsC">[COUNT] Monate</string>
- <string name="AgeWeeksA">[COUNT] Woche</string>
- <string name="AgeWeeksB">[COUNT] Wochen</string>
- <string name="AgeWeeksC">[COUNT] Wochen</string>
- <string name="AgeDaysA">[COUNT] Tag</string>
- <string name="AgeDaysB">[COUNT] Tage</string>
- <string name="AgeDaysC">[COUNT] Tage</string>
- <string name="GroupMembersA">[COUNT] Mitglied</string>
- <string name="GroupMembersB">[COUNT] Mitglieder</string>
- <string name="GroupMembersC">[COUNT] Mitglieder</string>
- <string name="AcctTypeResident">Einwohner</string>
- <string name="AcctTypeTrial">Test</string>
- <string name="AcctTypeCharterMember">Charta-Mitglied</string>
- <string name="AcctTypeEmployee">Linden Lab-Mitarbeiter</string>
- <string name="PaymentInfoUsed">Zahlungsinfo verwendet</string>
- <string name="PaymentInfoOnFile">Zahlungsinfo archiviert</string>
- <string name="NoPaymentInfoOnFile">Keine Zahlungsinfo archiviert</string>
- <string name="AgeVerified">Altersgeprüft</string>
- <string name="NotAgeVerified">Nicht altersgeprüft</string>
- <string name="Center 2">Mitte 2</string>
- <string name="Top Right">Oben rechts</string>
- <string name="Top">Oben</string>
- <string name="Top Left">Oben links</string>
- <string name="Center">Mitte</string>
- <string name="Bottom Left">Unten links</string>
- <string name="Bottom">Unten</string>
- <string name="Bottom Right">Unten rechts</string>
- <string name="CompileQueueDownloadedCompiling">Heruntergeladen, wird kompiliert</string>
- <string name="CompileQueueServiceUnavailable">Kein Skriptkompilierungsdienst verfügbar</string>
- <string name="CompileQueueScriptNotFound">Skript wurde auf Server nicht gefunden.</string>
- <string name="CompileQueueProblemDownloading">Beim Herunterladen ist ein Problem aufgetreten</string>
- <string name="CompileQueueInsufficientPermDownload">Unzureichende Rechte zum Herunterladen eines Skripts.</string>
- <string name="CompileQueueInsufficientPermFor">Unzureichende Berechtigungen für</string>
- <string name="CompileQueueUnknownFailure">Unbekannter Fehler beim Herunterladen</string>
- <string name="CompileNoExperiencePerm">Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen.</string>
- <string name="CompileQueueTitle">Rekompilierung</string>
- <string name="CompileQueueStart">rekompilieren</string>
- <string name="ResetQueueTitle">Zurücksetzen</string>
- <string name="ResetQueueStart">Zurücksetzen</string>
- <string name="RunQueueTitle">Skript ausführen</string>
- <string name="RunQueueStart">Skript ausführen</string>
- <string name="NotRunQueueTitle">Skript anhalten</string>
- <string name="NotRunQueueStart">Skript anhalten</string>
- <string name="CompileSuccessful">Kompilieren erfolgreich abgeschlossen!</string>
- <string name="CompileSuccessfulSaving">Kompilieren erfolgreich abgeschlossen, speichern...</string>
- <string name="SaveComplete">Speichervorgang abgeschlossen.</string>
- <string name="UploadFailed">Datei-Upload fehlgeschlagen:</string>
- <string name="ObjectOutOfRange">Skript (Objekt außerhalb des Bereichs)</string>
- <string name="ScriptWasDeleted">Skript (aus Inventar gelöscht)</string>
- <string name="GodToolsObjectOwnedBy">Objekt [OBJECT], Besitzer [OWNER]</string>
- <string name="GroupsNone">keine</string>
+ <string name="InvFolder My Inventory">
+ Mein Inventar
+ </string>
+ <string name="InvFolder Library">
+ Bibliothek
+ </string>
+ <string name="InvFolder Textures">
+ Texturen
+ </string>
+ <string name="InvFolder Sounds">
+ Sounds
+ </string>
+ <string name="InvFolder Calling Cards">
+ Visitenkarten
+ </string>
+ <string name="InvFolder Landmarks">
+ Landmarken
+ </string>
+ <string name="InvFolder Scripts">
+ Skripts
+ </string>
+ <string name="InvFolder Clothing">
+ Kleidung
+ </string>
+ <string name="InvFolder Objects">
+ Objekte
+ </string>
+ <string name="InvFolder Notecards">
+ Notizkarten
+ </string>
+ <string name="InvFolder New Folder">
+ Neuer Ordner
+ </string>
+ <string name="InvFolder Inventory">
+ Inventar
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Nicht-Komprimierte Bilder
+ </string>
+ <string name="InvFolder Body Parts">
+ Körperteile
+ </string>
+ <string name="InvFolder Trash">
+ Papierkorb
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoalbum
+ </string>
+ <string name="InvFolder Lost And Found">
+ Fundbüro
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Nicht-Komprimierte Sounds
+ </string>
+ <string name="InvFolder Animations">
+ Animationen
+ </string>
+ <string name="InvFolder Gestures">
+ Gesten
+ </string>
+ <string name="InvFolder Favorite">
+ Meine Favoriten
+ </string>
+ <string name="InvFolder favorite">
+ Meine Favoriten
+ </string>
+ <string name="InvFolder Favorites">
+ Meine Favoriten
+ </string>
+ <string name="InvFolder favorites">
+ Meine Favoriten
+ </string>
+ <string name="InvFolder Current Outfit">
+ Aktuelles Outfit
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Ursprüngliche Outfits
+ </string>
+ <string name="InvFolder My Outfits">
+ Meine Outfits
+ </string>
+ <string name="InvFolder Accessories">
+ Zubehör
+ </string>
+ <string name="InvFolder Meshes">
+ Netze
+ </string>
+ <string name="InvFolder Received Items">
+ Erhaltene Artikel
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Händler-Outbox
+ </string>
+ <string name="InvFolder Friends">
+ Freunde
+ </string>
+ <string name="InvFolder All">
+ Alle
+ </string>
+ <string name="no_attachments">
+ Keine Anhänge getragen
+ </string>
+ <string name="Attachments remain">
+ Anhänge (noch [COUNT] Positionen frei)
+ </string>
+ <string name="Buy">
+ Kaufen
+ </string>
+ <string name="BuyforL$">
+ Kaufen für L$
+ </string>
+ <string name="Stone">
+ Stein
+ </string>
+ <string name="Metal">
+ Metall
+ </string>
+ <string name="Glass">
+ Glas
+ </string>
+ <string name="Wood">
+ Holz
+ </string>
+ <string name="Flesh">
+ Fleisch
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Gummi
+ </string>
+ <string name="Light">
+ Hell
+ </string>
+ <string name="KBShift">
+ Umschalt-Taste
+ </string>
+ <string name="KBCtrl">
+ Strg
+ </string>
+ <string name="Chest">
+ Brust
+ </string>
+ <string name="Skull">
+ Schädel
+ </string>
+ <string name="Left Shoulder">
+ Linke Schulter
+ </string>
+ <string name="Right Shoulder">
+ Rechte Schulter
+ </string>
+ <string name="Left Hand">
+ Linke Hand
+ </string>
+ <string name="Right Hand">
+ Rechte Hand
+ </string>
+ <string name="Left Foot">
+ Linker Fuß
+ </string>
+ <string name="Right Foot">
+ Rechter Fuß
+ </string>
+ <string name="Spine">
+ Wirbelsäule
+ </string>
+ <string name="Pelvis">
+ Becken
+ </string>
+ <string name="Mouth">
+ Mund
+ </string>
+ <string name="Chin">
+ Kinn
+ </string>
+ <string name="Left Ear">
+ Linkes Ohr
+ </string>
+ <string name="Right Ear">
+ Rechtes Ohr
+ </string>
+ <string name="Left Eyeball">
+ Linker Augapfel
+ </string>
+ <string name="Right Eyeball">
+ Rechter Augapfel
+ </string>
+ <string name="Nose">
+ Nase
+ </string>
+ <string name="R Upper Arm">
+ R Oberarm
+ </string>
+ <string name="R Forearm">
+ R Unterarm
+ </string>
+ <string name="L Upper Arm">
+ L Oberarm
+ </string>
+ <string name="L Forearm">
+ L Unterarm
+ </string>
+ <string name="Right Hip">
+ Rechte Hüfte
+ </string>
+ <string name="R Upper Leg">
+ R Oberschenkel
+ </string>
+ <string name="R Lower Leg">
+ R Unterschenkel
+ </string>
+ <string name="Left Hip">
+ Linke Hüfte
+ </string>
+ <string name="L Upper Leg">
+ L Oberschenkel
+ </string>
+ <string name="L Lower Leg">
+ L Unterschenkel
+ </string>
+ <string name="Stomach">
+ Bauch
+ </string>
+ <string name="Left Pec">
+ Linke Brust
+ </string>
+ <string name="Right Pec">
+ Rechts
+ </string>
+ <string name="Neck">
+ Hals
+ </string>
+ <string name="Avatar Center">
+ Avatar-Mitte
+ </string>
+ <string name="Left Ring Finger">
+ Linker Ringfinger
+ </string>
+ <string name="Right Ring Finger">
+ Rechter Ringfinger
+ </string>
+ <string name="Tail Base">
+ Schwanzansatz
+ </string>
+ <string name="Tail Tip">
+ Schwanzspitze
+ </string>
+ <string name="Left Wing">
+ Linker Flügel
+ </string>
+ <string name="Right Wing">
+ Rechter Flügel
+ </string>
+ <string name="Jaw">
+ Kiefer
+ </string>
+ <string name="Alt Left Ear">
+ Alt. linkes Ohr
+ </string>
+ <string name="Alt Right Ear">
+ Alt. rechtes Ohr
+ </string>
+ <string name="Alt Left Eye">
+ Alt. linkes Auge
+ </string>
+ <string name="Alt Right Eye">
+ Alt. rechtes Auge
+ </string>
+ <string name="Tongue">
+ Zunge
+ </string>
+ <string name="Groin">
+ Leiste
+ </string>
+ <string name="Left Hind Foot">
+ Linker hinterer Fuß
+ </string>
+ <string name="Right Hind Foot">
+ Rechter hinterer Fuß
+ </string>
+ <string name="Invalid Attachment">
+ Ungültige Stelle für Anhang
+ </string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Fehler: fehlendes Objekt
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Fehler: Basisobjekt fehlt
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Fehler: Objekt ist im aktuellen Outfit, aber nicht angehängt
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] alt
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] alt
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] alt
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] alt
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] alt
+ </string>
+ <string name="TodayOld">
+ Seit heute Mitglied
+ </string>
+ <string name="av_render_everyone_now">
+ Jetzt kann jeder Sie sehen.
+ </string>
+ <string name="av_render_not_everyone">
+ Sie sind u. U. nicht für alle Leute in Ihrer Nähe sichtbar.
+ </string>
+ <string name="av_render_over_half">
+ Sie sind u. U. für mehr als die Hälfte der Leute in Ihrer Nähe nicht sichtbar.
+ </string>
+ <string name="av_render_most_of">
+ Sie sind u. U. für die meisten Leuten in Ihrer Nähe nicht sichtbar.
+ </string>
+ <string name="av_render_anyone">
+ Sie sind u. U. für niemanden in Ihrer Nähe sichtbar.
+ </string>
+ <string name="hud_description_total">
+ Ihr HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (getragen von [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] beansprucht viel Texturspeicher
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] enthält zu viele ressourcenintensive Objekte und Texturen
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] enthält viele große Texturen
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] enthält zu viele Objekte
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] enthält zu viele Texturen
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] Jahr
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] Jahre
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] Jahre
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] Monat
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] Monate
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] Monate
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] Woche
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] Wochen
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] Wochen
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] Tag
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] Tage
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] Tage
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] Mitglied
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] Mitglieder
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] Mitglieder
+ </string>
+ <string name="AcctTypeResident">
+ Einwohner
+ </string>
+ <string name="AcctTypeTrial">
+ Test
+ </string>
+ <string name="AcctTypeCharterMember">
+ Charta-Mitglied
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab-Mitarbeiter
+ </string>
+ <string name="PaymentInfoUsed">
+ Zahlungsinfo verwendet
+ </string>
+ <string name="PaymentInfoOnFile">
+ Zahlungsinfo archiviert
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Keine Zahlungsinfo archiviert
+ </string>
+ <string name="AgeVerified">
+ Altersgeprüft
+ </string>
+ <string name="NotAgeVerified">
+ Nicht altersgeprüft
+ </string>
+ <string name="Center 2">
+ Mitte 2
+ </string>
+ <string name="Top Right">
+ Oben rechts
+ </string>
+ <string name="Top">
+ Oben
+ </string>
+ <string name="Top Left">
+ Oben links
+ </string>
+ <string name="Center">
+ Mitte
+ </string>
+ <string name="Bottom Left">
+ Unten links
+ </string>
+ <string name="Bottom">
+ Unten
+ </string>
+ <string name="Bottom Right">
+ Unten rechts
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Heruntergeladen, wird kompiliert
+ </string>
+ <string name="CompileQueueServiceUnavailable">
+ Kein Skriptkompilierungsdienst verfügbar
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Skript wurde auf Server nicht gefunden.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Beim Herunterladen ist ein Problem aufgetreten
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Unzureichende Rechte zum Herunterladen eines Skripts.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Unzureichende Berechtigungen für
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Unbekannter Fehler beim Herunterladen
+ </string>
+ <string name="CompileNoExperiencePerm">
+ Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen.
+ </string>
+ <string name="CompileQueueTitle">
+ Rekompilierung
+ </string>
+ <string name="CompileQueueStart">
+ rekompilieren
+ </string>
+ <string name="ResetQueueTitle">
+ Zurücksetzen
+ </string>
+ <string name="ResetQueueStart">
+ Zurücksetzen
+ </string>
+ <string name="RunQueueTitle">
+ Skript ausführen
+ </string>
+ <string name="RunQueueStart">
+ Skript ausführen
+ </string>
+ <string name="NotRunQueueTitle">
+ Skript anhalten
+ </string>
+ <string name="NotRunQueueStart">
+ Skript anhalten
+ </string>
+ <string name="CompileSuccessful">
+ Kompilieren erfolgreich abgeschlossen!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Kompilieren erfolgreich abgeschlossen, speichern...
+ </string>
+ <string name="SaveComplete">
+ Speichervorgang abgeschlossen.
+ </string>
+ <string name="UploadFailed">
+ Datei-Upload fehlgeschlagen:
+ </string>
+ <string name="ObjectOutOfRange">
+ Skript (Objekt außerhalb des Bereichs)
+ </string>
+ <string name="ScriptWasDeleted">
+ Skript (aus Inventar gelöscht)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objekt [OBJECT], Besitzer [OWNER]
+ </string>
+ <string name="GroupsNone">
+ keine
+ </string>
<string name="Group" value=" (Gruppe)"/>
- <string name="Unknown">(unbekannt)</string>
+ <string name="Unknown">
+ (unbekannt)
+ </string>
<string name="SummaryForTheWeek" value="Zusammenfassung für diese Woche, beginnend am "/>
<string name="NextStipendDay" value=". Der nächste Stipendium-Tag ist "/>
- <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/>
<string name="GroupColumn" value="Gruppe"/>
- <string name="Balance">Kontostand</string>
- <string name="Credits">Danksagung</string>
- <string name="Debits">Soll</string>
- <string name="Total">Gesamtbetrag</string>
- <string name="NoGroupDataFound">Für Gruppe wurden keine Gruppendaten gefunden</string>
- <string name="IMParentEstate">parent estate</string>
- <string name="IMMainland">Mainland</string>
- <string name="IMTeen">Teen</string>
- <string name="Anyone">jeder</string>
- <string name="RegionInfoError">Fehler</string>
- <string name="RegionInfoAllEstatesOwnedBy">alle Grundbesitze gehören [OWNER]</string>
- <string name="RegionInfoAllEstatesYouOwn">alle Grundbesitze, die Sie besitzen</string>
- <string name="RegionInfoAllEstatesYouManage">alle Grundbesitze, die Sie für [OWNER] verwalten</string>
- <string name="RegionInfoAllowedResidents">Immer zulässig: ([ALLOWEDAGENTS], max. [MAXACCESS])</string>
- <string name="RegionInfoAllowedGroups">Immer zugelassene Gruppen: ([ALLOWEDGROUPS], max. [MAXACCESS])</string>
- <string name="RegionInfoBannedResidents">Immer verbannt: ([BANNEDAGENTS], max. [MAXBANNED])</string>
- <string name="RegionInfoListTypeAllowedAgents">Immer zugelassen</string>
- <string name="RegionInfoListTypeBannedAgents">Immer verbannt</string>
- <string name="RegionInfoAllEstates">alle Grundbesitze</string>
- <string name="RegionInfoManagedEstates">verwaltete Grundbesitze</string>
- <string name="RegionInfoThisEstate">dieser Grundbesitz</string>
- <string name="AndNMore">und [EXTRA_COUNT] weitere</string>
- <string name="ScriptLimitsParcelScriptMemory">Parzellenskript-Speicher</string>
- <string name="ScriptLimitsParcelsOwned">Aufgeführte Parzellen: [PARCELS]</string>
- <string name="ScriptLimitsMemoryUsed">Verwendeter Speicher: [COUNT] KB von [MAX] KB; [AVAILABLE] KB verfügbar</string>
- <string name="ScriptLimitsMemoryUsedSimple">Verwendeter Speicher: [COUNT] KB</string>
- <string name="ScriptLimitsParcelScriptURLs">Parzelleskript-URLs</string>
- <string name="ScriptLimitsURLsUsed">Verwendete URLs: [COUNT] von [MAX]; [AVAILABLE] verfügbar</string>
- <string name="ScriptLimitsURLsUsedSimple">Verwendete URLs: [COUNT]</string>
- <string name="ScriptLimitsRequestError">Fehler bei Informationsabruf</string>
- <string name="ScriptLimitsRequestNoParcelSelected">Keine Parzellen wurden ausgewählt</string>
- <string name="ScriptLimitsRequestWrongRegion">Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar</string>
- <string name="ScriptLimitsRequestWaiting">Informationen werden abgerufen...</string>
- <string name="ScriptLimitsRequestDontOwnParcel">Sie sind nicht berechtigt, diese Parzelle zu untersuchen.</string>
- <string name="SITTING_ON">sitzt auf</string>
- <string name="ATTACH_CHEST">Brust</string>
- <string name="ATTACH_HEAD">Schädel</string>
- <string name="ATTACH_LSHOULDER">Linke Schulter</string>
- <string name="ATTACH_RSHOULDER">Rechte Schulter</string>
- <string name="ATTACH_LHAND">Linke Hand</string>
- <string name="ATTACH_RHAND">Rechte Hand</string>
- <string name="ATTACH_LFOOT">Linker Fuß</string>
- <string name="ATTACH_RFOOT">Rechter Fuß</string>
- <string name="ATTACH_BACK">Wirbelsäule</string>
- <string name="ATTACH_PELVIS">Becken</string>
- <string name="ATTACH_MOUTH">Mund</string>
- <string name="ATTACH_CHIN">Kinn</string>
- <string name="ATTACH_LEAR">Linkes Ohr</string>
- <string name="ATTACH_REAR">Rechtes Ohr</string>
- <string name="ATTACH_LEYE">Linkes Auge</string>
- <string name="ATTACH_REYE">Rechtes Auge</string>
- <string name="ATTACH_NOSE">Nase</string>
- <string name="ATTACH_RUARM">Rechter Oberarm</string>
- <string name="ATTACH_RLARM">Rechter Unterarm</string>
- <string name="ATTACH_LUARM">Linker Oberarm</string>
- <string name="ATTACH_LLARM">Linker Unterarm</string>
- <string name="ATTACH_RHIP">Rechte Hüfte</string>
- <string name="ATTACH_RULEG">Rechter Oberschenkel</string>
- <string name="ATTACH_RLLEG">Rechter Unterschenkel</string>
- <string name="ATTACH_LHIP">Linke Hüfte</string>
- <string name="ATTACH_LULEG">Linker Oberschenkel</string>
- <string name="ATTACH_LLLEG">Linker Unterschenkel</string>
- <string name="ATTACH_BELLY">Bauch</string>
- <string name="ATTACH_LEFT_PEC">Linke Brust</string>
- <string name="ATTACH_RIGHT_PEC">Rechte Brust</string>
- <string name="ATTACH_HUD_CENTER_2">HUD Mitte 2</string>
- <string name="ATTACH_HUD_TOP_RIGHT">HUD oben rechts</string>
- <string name="ATTACH_HUD_TOP_CENTER">HUD oben Mitte</string>
- <string name="ATTACH_HUD_TOP_LEFT">HUD oben links</string>
- <string name="ATTACH_HUD_CENTER_1">HUD Mitte 1</string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">HUD unten links</string>
- <string name="ATTACH_HUD_BOTTOM">HUD unten</string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD unten rechts</string>
- <string name="ATTACH_NECK">Hals</string>
- <string name="ATTACH_AVATAR_CENTER">Avatar-Mitte</string>
- <string name="ATTACH_LHAND_RING1">Linker Ringfinger</string>
- <string name="ATTACH_RHAND_RING1">Rechter Ringfinger</string>
- <string name="ATTACH_TAIL_BASE">Schwanzansatz</string>
- <string name="ATTACH_TAIL_TIP">Schwanzspitze</string>
- <string name="ATTACH_LWING">Linker Flügel</string>
- <string name="ATTACH_RWING">Rechter Flügel</string>
- <string name="ATTACH_FACE_JAW">Kiefer</string>
- <string name="ATTACH_FACE_LEAR">Alt. linkes Ohr</string>
- <string name="ATTACH_FACE_REAR">Alt. rechtes Ohr</string>
- <string name="ATTACH_FACE_LEYE">Alt. linkes Auge</string>
- <string name="ATTACH_FACE_REYE">Alt. rechtes Auge</string>
- <string name="ATTACH_FACE_TONGUE">Zunge</string>
- <string name="ATTACH_GROIN">Leiste</string>
- <string name="ATTACH_HIND_LFOOT">Linker hinterer Fuß</string>
- <string name="ATTACH_HIND_RFOOT">Rechter hinterer Fuß</string>
- <string name="CursorPos">Zeile [LINE], Spalte [COLUMN]</string>
- <string name="PanelDirCountFound">[COUNT] gefunden</string>
- <string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string>
- <string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>
- <string name="PanelContentsTooltip">Objektinhalt</string>
- <string name="PanelContentsNewScript">Neues Skript</string>
- <string name="DoNotDisturbModeResponseDefault">Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen.</string>
- <string name="MuteByName">(Nach Namen)</string>
- <string name="MuteAgent">(Einwohner)</string>
- <string name="MuteObject">(Objekt)</string>
- <string name="MuteGroup">(Gruppe)</string>
- <string name="MuteExternal">(Extern)</string>
- <string name="RegionNoCovenant">Für diesen Grundbesitz liegt kein Vertrag vor.</string>
- <string name="RegionNoCovenantOtherOwner">Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung.</string>
+ <string name="Balance">
+ Kontostand
+ </string>
+ <string name="Credits">
+ Danksagung
+ </string>
+ <string name="Debits">
+ Soll
+ </string>
+ <string name="Total">
+ Gesamtbetrag
+ </string>
+ <string name="NoGroupDataFound">
+ Für Gruppe wurden keine Gruppendaten gefunden
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ Mainland
+ </string>
+ <string name="IMTeen">
+ Teen
+ </string>
+ <string name="Anyone">
+ jeder
+ </string>
+ <string name="RegionInfoError">
+ Fehler
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ alle Grundbesitze gehören [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ alle Grundbesitze, die Sie besitzen
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ alle Grundbesitze, die Sie für [OWNER] verwalten
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Immer zulässig: ([ALLOWEDAGENTS], max. [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Immer zugelassene Gruppen: ([ALLOWEDGROUPS], max. [MAXACCESS])
+ </string>
+ <string name="RegionInfoBannedResidents">
+ Immer verbannt: ([BANNEDAGENTS], max. [MAXBANNED])
+ </string>
+ <string name="RegionInfoListTypeAllowedAgents">
+ Immer zugelassen
+ </string>
+ <string name="RegionInfoListTypeBannedAgents">
+ Immer verbannt
+ </string>
+ <string name="RegionInfoAllEstates">
+ alle Grundbesitze
+ </string>
+ <string name="RegionInfoManagedEstates">
+ verwaltete Grundbesitze
+ </string>
+ <string name="RegionInfoThisEstate">
+ dieser Grundbesitz
+ </string>
+ <string name="AndNMore">
+ und [EXTRA_COUNT] weitere
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parzellenskript-Speicher
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Aufgeführte Parzellen: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Verwendeter Speicher: [COUNT] KB von [MAX] KB; [AVAILABLE] KB verfügbar
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Verwendeter Speicher: [COUNT] KB
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parzelleskript-URLs
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ Verwendete URLs: [COUNT] von [MAX]; [AVAILABLE] verfügbar
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ Verwendete URLs: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Fehler bei Informationsabruf
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Keine Parzellen wurden ausgewählt
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Informationen werden abgerufen...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Sie sind nicht berechtigt, diese Parzelle zu untersuchen.
+ </string>
+ <string name="SITTING_ON">
+ sitzt auf
+ </string>
+ <string name="ATTACH_CHEST">
+ Brust
+ </string>
+ <string name="ATTACH_HEAD">
+ Schädel
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Linke Schulter
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Rechte Schulter
+ </string>
+ <string name="ATTACH_LHAND">
+ Linke Hand
+ </string>
+ <string name="ATTACH_RHAND">
+ Rechte Hand
+ </string>
+ <string name="ATTACH_LFOOT">
+ Linker Fuß
+ </string>
+ <string name="ATTACH_RFOOT">
+ Rechter Fuß
+ </string>
+ <string name="ATTACH_BACK">
+ Wirbelsäule
+ </string>
+ <string name="ATTACH_PELVIS">
+ Becken
+ </string>
+ <string name="ATTACH_MOUTH">
+ Mund
+ </string>
+ <string name="ATTACH_CHIN">
+ Kinn
+ </string>
+ <string name="ATTACH_LEAR">
+ Linkes Ohr
+ </string>
+ <string name="ATTACH_REAR">
+ Rechtes Ohr
+ </string>
+ <string name="ATTACH_LEYE">
+ Linkes Auge
+ </string>
+ <string name="ATTACH_REYE">
+ Rechtes Auge
+ </string>
+ <string name="ATTACH_NOSE">
+ Nase
+ </string>
+ <string name="ATTACH_RUARM">
+ Rechter Oberarm
+ </string>
+ <string name="ATTACH_RLARM">
+ Rechter Unterarm
+ </string>
+ <string name="ATTACH_LUARM">
+ Linker Oberarm
+ </string>
+ <string name="ATTACH_LLARM">
+ Linker Unterarm
+ </string>
+ <string name="ATTACH_RHIP">
+ Rechte Hüfte
+ </string>
+ <string name="ATTACH_RULEG">
+ Rechter Oberschenkel
+ </string>
+ <string name="ATTACH_RLLEG">
+ Rechter Unterschenkel
+ </string>
+ <string name="ATTACH_LHIP">
+ Linke Hüfte
+ </string>
+ <string name="ATTACH_LULEG">
+ Linker Oberschenkel
+ </string>
+ <string name="ATTACH_LLLEG">
+ Linker Unterschenkel
+ </string>
+ <string name="ATTACH_BELLY">
+ Bauch
+ </string>
+ <string name="ATTACH_LEFT_PEC">
+ Linke Brust
+ </string>
+ <string name="ATTACH_RIGHT_PEC">
+ Rechte Brust
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Mitte 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD oben rechts
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD oben Mitte
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD oben links
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Mitte 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD unten links
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD unten
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD unten rechts
+ </string>
+ <string name="ATTACH_NECK">
+ Hals
+ </string>
+ <string name="ATTACH_AVATAR_CENTER">
+ Avatar-Mitte
+ </string>
+ <string name="ATTACH_LHAND_RING1">
+ Linker Ringfinger
+ </string>
+ <string name="ATTACH_RHAND_RING1">
+ Rechter Ringfinger
+ </string>
+ <string name="ATTACH_TAIL_BASE">
+ Schwanzansatz
+ </string>
+ <string name="ATTACH_TAIL_TIP">
+ Schwanzspitze
+ </string>
+ <string name="ATTACH_LWING">
+ Linker Flügel
+ </string>
+ <string name="ATTACH_RWING">
+ Rechter Flügel
+ </string>
+ <string name="ATTACH_FACE_JAW">
+ Kiefer
+ </string>
+ <string name="ATTACH_FACE_LEAR">
+ Alt. linkes Ohr
+ </string>
+ <string name="ATTACH_FACE_REAR">
+ Alt. rechtes Ohr
+ </string>
+ <string name="ATTACH_FACE_LEYE">
+ Alt. linkes Auge
+ </string>
+ <string name="ATTACH_FACE_REYE">
+ Alt. rechtes Auge
+ </string>
+ <string name="ATTACH_FACE_TONGUE">
+ Zunge
+ </string>
+ <string name="ATTACH_GROIN">
+ Leiste
+ </string>
+ <string name="ATTACH_HIND_LFOOT">
+ Linker hinterer Fuß
+ </string>
+ <string name="ATTACH_HIND_RFOOT">
+ Rechter hinterer Fuß
+ </string>
+ <string name="CursorPos">
+ Zeile [LINE], Spalte [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] gefunden
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Objektinhalt
+ </string>
+ <string name="PanelContentsNewScript">
+ Neues Skript
+ </string>
+ <string name="DoNotDisturbModeResponseDefault">
+ Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen.
+ </string>
+ <string name="MuteByName">
+ (Nach Namen)
+ </string>
+ <string name="MuteAgent">
+ (Einwohner)
+ </string>
+ <string name="MuteObject">
+ (Objekt)
+ </string>
+ <string name="MuteGroup">
+ (Gruppe)
+ </string>
+ <string name="MuteExternal">
+ (Extern)
+ </string>
+ <string name="RegionNoCovenant">
+ Für diesen Grundbesitz liegt kein Vertrag vor.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung.
+ </string>
<string name="covenant_last_modified" value="Zuletzt geändert: "/>
<string name="none_text" value=" (keiner) "/>
<string name="never_text" value=" (nie) "/>
- <string name="GroupOwned">In Gruppenbesitz</string>
- <string name="Public">Öffentlich</string>
- <string name="LocalSettings">Lokale Einstellungen</string>
- <string name="RegionSettings">Regionseinstellungen</string>
- <string name="NoEnvironmentSettings">Diese Region unterstützt keine Umgebungseinstellungen.</string>
- <string name="EnvironmentSun">Sonne</string>
- <string name="EnvironmentMoon">Mond</string>
- <string name="EnvironmentBloom">Bloom</string>
- <string name="EnvironmentCloudNoise">Wolkenrauschen</string>
- <string name="EnvironmentNormalMap">Normal-Map</string>
- <string name="EnvironmentTransparent">Transparent</string>
- <string name="ClassifiedClicksTxt">Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil</string>
- <string name="ClassifiedUpdateAfterPublish">(wird nach Veröffentlichung aktualisiert)</string>
- <string name="NoPicksClassifiedsText">Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus&quot;-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen.</string>
- <string name="NoPicksText">Sie haben keine Auswahl erstellt. Klicken Sie auf die Schaltfläche &quot;Neu&quot;, um eine Auswahl zu erstellen.</string>
- <string name="NoClassifiedsText">Sie haben keine Anzeigen erstellt. Klicken Sie auf die Schaltfläche &quot;Neu&quot;, um eine Anzeige zu erstellen.</string>
- <string name="NoAvatarPicksClassifiedsText">Der Einwohner hat keine Auswahl oder Anzeigen</string>
- <string name="NoAvatarPicksText">Der Einwohner hat keine Auswahl</string>
- <string name="NoAvatarClassifiedsText">Der Einwohner hat keine Anzeigen</string>
- <string name="PicksClassifiedsLoadingText">Wird geladen...</string>
- <string name="MultiPreviewTitle">Vorschau</string>
- <string name="MultiPropertiesTitle">Eigenschaften</string>
- <string name="InvOfferAnObjectNamed">Ein Objekt namens</string>
- <string name="InvOfferOwnedByGroup">im Besitz der Gruppe</string>
- <string name="InvOfferOwnedByUnknownGroup">im Besitz einer unbekannten Gruppe</string>
- <string name="InvOfferOwnedBy">im Besitz von</string>
- <string name="InvOfferOwnedByUnknownUser">im Besitz eines unbekannten Einwohners</string>
- <string name="InvOfferGaveYou">hat Ihnen folgendes übergeben</string>
- <string name="InvOfferDecline">Sie lehnen [DESC] von &lt;nolink&gt;[NAME]&lt;/nolink&gt; ab.</string>
- <string name="GroupMoneyTotal">Gesamtbetrag</string>
- <string name="GroupMoneyBought">gekauft</string>
- <string name="GroupMoneyPaidYou">bezahlte Ihnen</string>
- <string name="GroupMoneyPaidInto">bezahlte an</string>
- <string name="GroupMoneyBoughtPassTo">kaufte Pass für</string>
- <string name="GroupMoneyPaidFeeForEvent">bezahlte Gebühr für Event</string>
- <string name="GroupMoneyPaidPrizeForEvent">bezahlte Preis für Event</string>
- <string name="GroupMoneyBalance">Kontostand</string>
- <string name="GroupMoneyCredits">Danksagung</string>
- <string name="GroupMoneyDebits">Soll</string>
- <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>
- <string name="AcquiredItems">Erworbene Artikel</string>
- <string name="Cancel">Abbrechen</string>
- <string name="UploadingCosts">Das Hochladen von [NAME] kostet [AMOUNT] L$</string>
- <string name="BuyingCosts">Die Kosten betragen: [AMOUNT] L$</string>
- <string name="UnknownFileExtension">Unbekanntes Dateiformat .%s
-Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh</string>
- <string name="MuteObject2">Ignorieren</string>
- <string name="MuteAvatar">Ignorieren</string>
- <string name="UnmuteObject">Freischalten</string>
- <string name="UnmuteAvatar">Freischalten</string>
- <string name="AddLandmarkNavBarMenu">Zu meinen Landmarken hinzufügen...</string>
- <string name="EditLandmarkNavBarMenu">Meine Landmarken bearbeiten...</string>
- <string name="accel-mac-control">⌃</string>
- <string name="accel-mac-command">⌘</string>
- <string name="accel-mac-option">⌥</string>
- <string name="accel-mac-shift">⇧</string>
- <string name="accel-win-control">Strg+</string>
- <string name="accel-win-alt">Alt+</string>
- <string name="accel-win-shift">Umschalt+</string>
- <string name="FileSaved">Datei wurde gespeichert</string>
- <string name="Receiving">Daten werden empfangen</string>
- <string name="AM">Uhr</string>
- <string name="PM">Uhr</string>
- <string name="PST">PST</string>
- <string name="PDT">PDT</string>
- <string name="Direction_Forward">Vorwärts</string>
- <string name="Direction_Left">Links</string>
- <string name="Direction_Right">Rechts</string>
- <string name="Direction_Back">Zurück</string>
- <string name="Direction_North">Norden</string>
- <string name="Direction_South">Süden</string>
- <string name="Direction_West">Westen</string>
- <string name="Direction_East">Osten</string>
- <string name="Direction_Up">Nach oben</string>
- <string name="Direction_Down">Nach unten</string>
- <string name="Any Category">Alle Kategorien</string>
- <string name="Shopping">Shopping</string>
- <string name="Land Rental">Land mieten</string>
- <string name="Property Rental">Immobilie mieten</string>
- <string name="Special Attraction">Attraktionen</string>
- <string name="New Products">Neue Produkte</string>
- <string name="Employment">Stellenangebote</string>
- <string name="Wanted">Gesucht</string>
- <string name="Service">Dienstleistungen</string>
- <string name="Personal">Sonstiges</string>
- <string name="None">Keiner</string>
- <string name="Linden Location">Lindenort</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Kunst &amp; Kultur</string>
- <string name="Business">Firmen</string>
- <string name="Educational">Bildung</string>
- <string name="Gaming">Spielen</string>
- <string name="Hangout">Treffpunkt</string>
- <string name="Newcomer Friendly">Anfängergerecht</string>
- <string name="Parks&amp;Nature">Parks und Natur</string>
- <string name="Residential">Wohngebiet</string>
- <string name="Stage">Phase</string>
- <string name="Other">Sonstige</string>
- <string name="Rental">Vermietung</string>
- <string name="Any">Alle</string>
- <string name="You">Sie</string>
- <string name=":">:</string>
- <string name=",">,</string>
- <string name="...">...</string>
- <string name="***">***</string>
- <string name="(">(</string>
- <string name=")">)</string>
- <string name=".">.</string>
- <string name="'">'</string>
- <string name="---">---</string>
- <string name="Multiple Media">Mehrere Medien</string>
- <string name="Play Media">Medien Abspielen/Pausieren</string>
- <string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string>
- <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=de-de</string>
- <string name="AMDDriverPage">http://support.amd.com/de/Pages/AMDSupportHub.aspx</string>
- <string name="MBCmdLineError">Beim Parsen der Befehlszeile wurde ein Fehler festgestellt.
+ <string name="GroupOwned">
+ In Gruppenbesitz
+ </string>
+ <string name="Public">
+ Öffentlich
+ </string>
+ <string name="LocalSettings">
+ Lokale Einstellungen
+ </string>
+ <string name="RegionSettings">
+ Regionseinstellungen
+ </string>
+ <string name="NoEnvironmentSettings">
+ Diese Region unterstützt keine Umgebungseinstellungen.
+ </string>
+ <string name="EnvironmentSun">
+ Sonne
+ </string>
+ <string name="EnvironmentMoon">
+ Mond
+ </string>
+ <string name="EnvironmentBloom">
+ Bloom
+ </string>
+ <string name="EnvironmentCloudNoise">
+ Wolkenrauschen
+ </string>
+ <string name="EnvironmentNormalMap">
+ Normal-Map
+ </string>
+ <string name="EnvironmentTransparent">
+ Transparent
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (wird nach Veröffentlichung aktualisiert)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus"-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen.
+ </string>
+ <string name="NoPicksText">
+ Sie haben keine Auswahl erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Auswahl zu erstellen.
+ </string>
+ <string name="NoClassifiedsText">
+ Sie haben keine Anzeigen erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Anzeige zu erstellen.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Der Einwohner hat keine Auswahl oder Anzeigen
+ </string>
+ <string name="NoAvatarPicksText">
+ Der Einwohner hat keine Auswahl
+ </string>
+ <string name="NoAvatarClassifiedsText">
+ Der Einwohner hat keine Anzeigen
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Wird geladen...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vorschau
+ </string>
+ <string name="MultiPropertiesTitle">
+ Eigenschaften
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Ein Objekt namens
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ im Besitz der Gruppe
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ im Besitz einer unbekannten Gruppe
+ </string>
+ <string name="InvOfferOwnedBy">
+ im Besitz von
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ im Besitz eines unbekannten Einwohners
+ </string>
+ <string name="InvOfferGaveYou">
+ hat Ihnen folgendes übergeben
+ </string>
+ <string name="InvOfferDecline">
+ Sie lehnen [DESC] von &lt;nolink&gt;[NAME]&lt;/nolink&gt; ab.
+ </string>
+ <string name="GroupMoneyTotal">
+ Gesamtbetrag
+ </string>
+ <string name="GroupMoneyBought">
+ gekauft
+ </string>
+ <string name="GroupMoneyPaidYou">
+ bezahlte Ihnen
+ </string>
+ <string name="GroupMoneyPaidInto">
+ bezahlte an
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ kaufte Pass für
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ bezahlte Gebühr für Event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ bezahlte Preis für Event
+ </string>
+ <string name="GroupMoneyBalance">
+ Kontostand
+ </string>
+ <string name="GroupMoneyCredits">
+ Danksagung
+ </string>
+ <string name="GroupMoneyDebits">
+ Soll
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="AcquiredItems">
+ Erworbene Artikel
+ </string>
+ <string name="Cancel">
+ Abbrechen
+ </string>
+ <string name="UploadingCosts">
+ Das Hochladen von [NAME] kostet [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Die Kosten betragen: [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Unbekanntes Dateiformat .%s
+Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
+ </string>
+ <string name="MuteObject2">
+ Ignorieren
+ </string>
+ <string name="MuteAvatar">
+ Ignorieren
+ </string>
+ <string name="UnmuteObject">
+ Freischalten
+ </string>
+ <string name="UnmuteAvatar">
+ Freischalten
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Zu meinen Landmarken hinzufügen...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Meine Landmarken bearbeiten...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Strg+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Umschalt+
+ </string>
+ <string name="FileSaved">
+ Datei wurde gespeichert
+ </string>
+ <string name="Receiving">
+ Daten werden empfangen
+ </string>
+ <string name="AM">
+ Uhr
+ </string>
+ <string name="PM">
+ Uhr
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Vorwärts
+ </string>
+ <string name="Direction_Left">
+ Links
+ </string>
+ <string name="Direction_Right">
+ Rechts
+ </string>
+ <string name="Direction_Back">
+ Zurück
+ </string>
+ <string name="Direction_North">
+ Norden
+ </string>
+ <string name="Direction_South">
+ Süden
+ </string>
+ <string name="Direction_West">
+ Westen
+ </string>
+ <string name="Direction_East">
+ Osten
+ </string>
+ <string name="Direction_Up">
+ Nach oben
+ </string>
+ <string name="Direction_Down">
+ Nach unten
+ </string>
+ <string name="Any Category">
+ Alle Kategorien
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Land mieten
+ </string>
+ <string name="Property Rental">
+ Immobilie mieten
+ </string>
+ <string name="Special Attraction">
+ Attraktionen
+ </string>
+ <string name="New Products">
+ Neue Produkte
+ </string>
+ <string name="Employment">
+ Stellenangebote
+ </string>
+ <string name="Wanted">
+ Gesucht
+ </string>
+ <string name="Service">
+ Dienstleistungen
+ </string>
+ <string name="Personal">
+ Sonstiges
+ </string>
+ <string name="None">
+ Keiner
+ </string>
+ <string name="Linden Location">
+ Lindenort
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Kunst &amp; Kultur
+ </string>
+ <string name="Business">
+ Firmen
+ </string>
+ <string name="Educational">
+ Bildung
+ </string>
+ <string name="Gaming">
+ Spielen
+ </string>
+ <string name="Hangout">
+ Treffpunkt
+ </string>
+ <string name="Newcomer Friendly">
+ Anfängergerecht
+ </string>
+ <string name="Parks&amp;Nature">
+ Parks und Natur
+ </string>
+ <string name="Residential">
+ Wohngebiet
+ </string>
+ <string name="Stage">
+ Phase
+ </string>
+ <string name="Other">
+ Sonstige
+ </string>
+ <string name="Rental">
+ Vermietung
+ </string>
+ <string name="Any">
+ Alle
+ </string>
+ <string name="You">
+ Sie
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="'">
+ '
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ Mehrere Medien
+ </string>
+ <string name="Play Media">
+ Medien Abspielen/Pausieren
+ </string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=de-de
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/de/Pages/AMDSupportHub.aspx
+ </string>
+ <string name="MBCmdLineError">
+ Beim Parsen der Befehlszeile wurde ein Fehler festgestellt.
Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN)
-Fehler:</string>
- <string name="MBCmdLineUsg">[APP_NAME] Verwendung in Befehlszeile:</string>
- <string name="MBUnableToAccessFile">[APP_NAME] kann auf die erforderliche Datei nicht zugreifen.
+Fehler:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Verwendung in Befehlszeile:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] kann auf die erforderliche Datei nicht zugreifen.
Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet.
Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal.
-Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren.</string>
- <string name="MBFatalError">Unbehebbarer Fehler</string>
- <string name="MBRequiresAltiVec">[APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später).</string>
- <string name="MBAlreadyRunning">[APP_NAME] läuft bereits.
+Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren.
+ </string>
+ <string name="MBFatalError">
+ Unbehebbarer Fehler
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] läuft bereits.
Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden.
-Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu.</string>
- <string name="MBFrozenCrashed">[APP_NAME] scheint eingefroren zu sein oder ist abgestürzt.
-Möchten Sie einen Absturz-Bericht einschicken?</string>
- <string name="MBAlert">Benachrichtigung</string>
- <string name="MBNoDirectX">[APP_NAME] kann DirectX 9.0b oder höher nicht feststellen.
+Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt.
+Möchten Sie einen Absturz-Bericht einschicken?
+ </string>
+ <string name="MBAlert">
+ Benachrichtigung
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen.
[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird.
-Möchten Sie fortfahren?</string>
- <string name="MBWarning">Hinweis</string>
- <string name="MBNoAutoUpdate">Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich.
-Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.</string>
- <string name="MBRegClassFailed">RegisterClass fehlgeschlagen</string>
- <string name="MBError">Fehler</string>
- <string name="MBFullScreenErr">Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden.
-Ausführung erfolgt in Fenster.</string>
- <string name="MBDestroyWinFailed">Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen)</string>
- <string name="MBShutdownErr">Fehler beim Herunterfahren</string>
- <string name="MBDevContextErr">Kann keinen Kontext für GL-Gerät erstellen</string>
- <string name="MBPixelFmtErr">Passendes Pixelformat wurde nicht gefunden</string>
- <string name="MBPixelFmtDescErr">Beschreibung für Pixelformat nicht verfügbar</string>
- <string name="MBTrueColorWindow">Um [APP_NAME] auszuführen, ist True Color (32-bit) erforderlich.
-Klicken Sie öffnen Sie auf Ihrem Computer die Einstellungen für die Anzeige und stellen Sie den Bildschirm auf 32-bit Farbe ein.</string>
- <string name="MBAlpha">[APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte.
+Möchten Sie fortfahren?
+ </string>
+ <string name="MBWarning">
+ Hinweis
+ </string>
+ <string name="MBNoAutoUpdate">
+ Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich.
+Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass fehlgeschlagen
+ </string>
+ <string name="MBError">
+ Fehler
+ </string>
+ <string name="MBFullScreenErr">
+ Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden.
+Ausführung erfolgt in Fenster.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen)
+ </string>
+ <string name="MBShutdownErr">
+ Fehler beim Herunterfahren
+ </string>
+ <string name="MBDevContextErr">
+ Kann keinen Kontext für GL-Gerät erstellen
+ </string>
+ <string name="MBPixelFmtErr">
+ Passendes Pixelformat wurde nicht gefunden
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Beschreibung für Pixelformat nicht verfügbar
+ </string>
+ <string name="MBTrueColorWindow">
+ Um [APP_NAME] auszuführen, ist True Color (32-bit) erforderlich.
+Klicken Sie öffnen Sie auf Ihrem Computer die Einstellungen für die Anzeige und stellen Sie den Bildschirm auf 32-bit Farbe ein.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte.
Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben.
Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung &gt; Anzeige &gt; Einstellungen).
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].</string>
- <string name="MBPixelFmtSetErr">Pixel-Format kann nicht eingestellt werden.</string>
- <string name="MBGLContextErr">Kann keinen Kontext für GL-Gerät erstellen</string>
- <string name="MBGLContextActErr">Kann keinen Kontext für GL-Gerät aktivieren</string>
- <string name="MBVideoDrvErr">[APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Pixel-Format kann nicht eingestellt werden.
+ </string>
+ <string name="MBGLContextErr">
+ Kann keinen Kontext für GL-Gerät erstellen
+ </string>
+ <string name="MBGLContextActErr">
+ Kann keinen Kontext für GL-Gerät aktivieren
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut.
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].</string>
- <string name="5 O'Clock Shadow">Bartschatten</string>
- <string name="All White">Ganz weiß</string>
- <string name="Anime Eyes">Anime-Augen</string>
- <string name="Arced">Gewölbt</string>
- <string name="Arm Length">Armlänge</string>
- <string name="Attached">Angewachsen</string>
- <string name="Attached Earlobes">Angewachsene Ohrläppchen</string>
- <string name="Back Fringe">Nackenfransen</string>
- <string name="Baggy">Tränensäcke</string>
- <string name="Bangs">Pony</string>
- <string name="Beady Eyes">Knopfaugen</string>
- <string name="Belly Size">Bauchgröße</string>
- <string name="Big">Groß</string>
- <string name="Big Butt">Großer Hintern</string>
- <string name="Big Hair Back">Volumen: Hinten</string>
- <string name="Big Hair Front">Volumen: Vorne</string>
- <string name="Big Hair Top">Volumen: Oben</string>
- <string name="Big Head">Groß</string>
- <string name="Big Pectorals">Große Brustmuskeln</string>
- <string name="Big Spikes">Große Stacheln</string>
- <string name="Black">Schwarz</string>
- <string name="Blonde">Blond</string>
- <string name="Blonde Hair">Blondes Haar</string>
- <string name="Blush">Rouge</string>
- <string name="Blush Color">Rougefarbe</string>
- <string name="Blush Opacity">Rouge Deckkraft</string>
- <string name="Body Definition">Körperkonturen</string>
- <string name="Body Fat">Körperfett</string>
- <string name="Body Freckles">Sommersprossen</string>
- <string name="Body Thick">breit</string>
- <string name="Body Thickness">Körperbreite</string>
- <string name="Body Thin">schmal</string>
- <string name="Bow Legged">o-beinig</string>
- <string name="Breast Buoyancy">Brust, Straffheit</string>
- <string name="Breast Cleavage">Dekolleté</string>
- <string name="Breast Size">Brustgröße</string>
- <string name="Bridge Width">Rückenbreite</string>
- <string name="Broad">Breit</string>
- <string name="Brow Size">Brauengröße</string>
- <string name="Bug Eyes">Glubschaugen</string>
- <string name="Bugged Eyes">Hervortretend</string>
- <string name="Bulbous">Knollennase</string>
- <string name="Bulbous Nose">Knollennase</string>
- <string name="Breast Physics Mass">Brust – Masse</string>
- <string name="Breast Physics Smoothing">Brust – Glättung</string>
- <string name="Breast Physics Gravity">Brust – Schwerkraft</string>
- <string name="Breast Physics Drag">Brust – Luftwiderstand</string>
- <string name="Breast Physics InOut Max Effect">Max. Effekt</string>
- <string name="Breast Physics InOut Spring">Federn</string>
- <string name="Breast Physics InOut Gain">Verstärkung</string>
- <string name="Breast Physics InOut Damping">Dämpfung</string>
- <string name="Breast Physics UpDown Max Effect">Max. Effekt</string>
- <string name="Breast Physics UpDown Spring">Federn</string>
- <string name="Breast Physics UpDown Gain">Verstärkung</string>
- <string name="Breast Physics UpDown Damping">Dämpfung</string>
- <string name="Breast Physics LeftRight Max Effect">Max. Effekt</string>
- <string name="Breast Physics LeftRight Spring">Federn</string>
- <string name="Breast Physics LeftRight Gain">Verstärkung</string>
- <string name="Breast Physics LeftRight Damping">Dämpfung</string>
- <string name="Belly Physics Mass">Bauch – Masse</string>
- <string name="Belly Physics Smoothing">Bauch – Glättung</string>
- <string name="Belly Physics Gravity">Bauch – Schwerkraft</string>
- <string name="Belly Physics Drag">Bauch – Luftwiderstand</string>
- <string name="Belly Physics UpDown Max Effect">Max. Effekt</string>
- <string name="Belly Physics UpDown Spring">Federn</string>
- <string name="Belly Physics UpDown Gain">Verstärkung</string>
- <string name="Belly Physics UpDown Damping">Dämpfung</string>
- <string name="Butt Physics Mass">Po – Masse</string>
- <string name="Butt Physics Smoothing">Po – Glättung</string>
- <string name="Butt Physics Gravity">Po – Schwerkraft</string>
- <string name="Butt Physics Drag">Po – Luftwiderstand</string>
- <string name="Butt Physics UpDown Max Effect">Max. Effekt</string>
- <string name="Butt Physics UpDown Spring">Federn</string>
- <string name="Butt Physics UpDown Gain">Verstärkung</string>
- <string name="Butt Physics UpDown Damping">Dämpfung</string>
- <string name="Butt Physics LeftRight Max Effect">Max. Effekt</string>
- <string name="Butt Physics LeftRight Spring">Federn</string>
- <string name="Butt Physics LeftRight Gain">Verstärkung</string>
- <string name="Butt Physics LeftRight Damping">Dämpfung</string>
- <string name="Bushy Eyebrows">Buschige Augenbrauen</string>
- <string name="Bushy Hair">Buschiges Haar</string>
- <string name="Butt Size">Hintern, Größe</string>
- <string name="Butt Gravity">Po – Schwerkraft</string>
- <string name="bustle skirt">Tournürenrock</string>
- <string name="no bustle">Ohne</string>
- <string name="more bustle">Mit</string>
- <string name="Chaplin">Chaplin</string>
- <string name="Cheek Bones">Wangenknochen</string>
- <string name="Chest Size">Brustgröße</string>
- <string name="Chin Angle">Kinnwinkel</string>
- <string name="Chin Cleft">Kinnspalte</string>
- <string name="Chin Curtains">Schifferfräse</string>
- <string name="Chin Depth">Kinnlänge</string>
- <string name="Chin Heavy">Kinn ausgeprägt</string>
- <string name="Chin In">Kinn zurück</string>
- <string name="Chin Out">Kinn nach vorne</string>
- <string name="Chin-Neck">Kinn-Hals</string>
- <string name="Clear">Transparent</string>
- <string name="Cleft">Spalte</string>
- <string name="Close Set Eyes">Eng stehende Augen</string>
- <string name="Closed">Geschlossen</string>
- <string name="Closed Back">Hinten geschlossen</string>
- <string name="Closed Front">Vorne geschlossen</string>
- <string name="Closed Left">Links geschlossen</string>
- <string name="Closed Right">Rechts geschlossen</string>
- <string name="Coin Purse">Klein</string>
- <string name="Collar Back">Kragen hinten</string>
- <string name="Collar Front">Kragen vorne</string>
- <string name="Corner Down">Nach unten</string>
- <string name="Corner Up">Nach oben</string>
- <string name="Creased">Schlupflid</string>
- <string name="Crooked Nose">Krumme Nase</string>
- <string name="Cuff Flare">Hosenaufschlag</string>
- <string name="Dark">Dunkel</string>
- <string name="Dark Green">Dunkelgrün</string>
- <string name="Darker">Dunkler</string>
- <string name="Deep">Tief</string>
- <string name="Default Heels">Standardabsätze</string>
- <string name="Dense">Dicht</string>
- <string name="Double Chin">Doppelkinn</string>
- <string name="Downturned">Nach unten</string>
- <string name="Duffle Bag">Groß</string>
- <string name="Ear Angle">Ohrenwinkel</string>
- <string name="Ear Size">Ohrengröße</string>
- <string name="Ear Tips">Ohrenspitzen</string>
- <string name="Egg Head">Eierkopf</string>
- <string name="Eye Bags">Augenränder</string>
- <string name="Eye Color">Augenfarbe</string>
- <string name="Eye Depth">Augentiefe</string>
- <string name="Eye Lightness">Helligkeit</string>
- <string name="Eye Opening">Öffnung</string>
- <string name="Eye Pop">Symmetrie</string>
- <string name="Eye Size">Augengröße</string>
- <string name="Eye Spacing">Augenstand</string>
- <string name="Eyebrow Arc">Brauenbogen</string>
- <string name="Eyebrow Density">Brauendichte</string>
- <string name="Eyebrow Height">Brauenhöhe</string>
- <string name="Eyebrow Points">Brauenenden</string>
- <string name="Eyebrow Size">Brauengröße</string>
- <string name="Eyelash Length">Wimpernlänge</string>
- <string name="Eyeliner">Eyeliner</string>
- <string name="Eyeliner Color">Farbe des Eyeliners</string>
- <string name="Eyes Bugged">Glubschaugen</string>
- <string name="Face Shear">Gesichtsverzerrung</string>
- <string name="Facial Definition">Gesichtskonturen</string>
- <string name="Far Set Eyes">Weit auseinander</string>
- <string name="Fat Lips">Volle Lippen</string>
- <string name="Female">weiblich</string>
- <string name="Fingerless">Ohne Finger</string>
- <string name="Fingers">Finger</string>
- <string name="Flared Cuffs">Ausgestellt</string>
- <string name="Flat">Flach</string>
- <string name="Flat Butt">Flacher Hintern</string>
- <string name="Flat Head">Flacher Kopf</string>
- <string name="Flat Toe">Flache Spitze</string>
- <string name="Foot Size">Fußgröße</string>
- <string name="Forehead Angle">Stirnwinkel</string>
- <string name="Forehead Heavy">Stirn ausgeprägt</string>
- <string name="Freckles">Sommersprossen</string>
- <string name="Front Fringe">Fransen, vorne</string>
- <string name="Full Back">Hinten volles Haar</string>
- <string name="Full Eyeliner">Starker Eyeliner</string>
- <string name="Full Front">Vorne volles Haar</string>
- <string name="Full Hair Sides">Seitlich volles Haar</string>
- <string name="Full Sides">Volle Seiten</string>
- <string name="Glossy">Glänzend</string>
- <string name="Glove Fingers">Handschuhfinger</string>
- <string name="Glove Length">Handschuhlänge</string>
- <string name="Hair">Haare</string>
- <string name="Hair Back">Haare: Hinten</string>
- <string name="Hair Front">Haare: Vorne</string>
- <string name="Hair Sides">Haare: Seiten</string>
- <string name="Hair Sweep">Haartolle</string>
- <string name="Hair Thickess">Haardicke</string>
- <string name="Hair Thickness">Haardicke</string>
- <string name="Hair Tilt">Haarneigung</string>
- <string name="Hair Tilted Left">Nach links</string>
- <string name="Hair Tilted Right">Nach rechts</string>
- <string name="Hair Volume">Haare: Volumen</string>
- <string name="Hand Size">Handgröße</string>
- <string name="Handlebars">Zwirbelbart</string>
- <string name="Head Length">Kopflänge</string>
- <string name="Head Shape">Kopfform</string>
- <string name="Head Size">Kopfgröße</string>
- <string name="Head Stretch">Kopfstreckung</string>
- <string name="Heel Height">Absatzhöhe</string>
- <string name="Heel Shape">Absatzform</string>
- <string name="Height">Größe</string>
- <string name="High">Hoch</string>
- <string name="High Heels">Hohe Absätze</string>
- <string name="High Jaw">Hoch</string>
- <string name="High Platforms">Hohe Plattformsohlen</string>
- <string name="High and Tight">Hoch und eng</string>
- <string name="Higher">Höhere</string>
- <string name="Hip Length">Länge der Hüfte</string>
- <string name="Hip Width">Breite der Hüfte</string>
- <string name="Hover">Schweben</string>
- <string name="In">In</string>
- <string name="In Shdw Color">Farbe Innenseite</string>
- <string name="In Shdw Opacity">Deckkraft: innen</string>
- <string name="Inner Eye Corner">Ecke: Nasenseite</string>
- <string name="Inner Eye Shadow">Innenlid</string>
- <string name="Inner Shadow">Innenlid</string>
- <string name="Jacket Length">Jackenlänge</string>
- <string name="Jacket Wrinkles">Jackenfalten</string>
- <string name="Jaw Angle">Kinnansatz</string>
- <string name="Jaw Jut">Kinnposition</string>
- <string name="Jaw Shape">Kinnform</string>
- <string name="Join">Zusammen</string>
- <string name="Jowls">Hängebacken</string>
- <string name="Knee Angle">Kniewinkel</string>
- <string name="Knock Kneed">X-beinig</string>
- <string name="Large">Groß</string>
- <string name="Large Hands">Große Hände</string>
- <string name="Left Part">Linksscheitel</string>
- <string name="Leg Length">Beinlänge</string>
- <string name="Leg Muscles">Beinmuskeln</string>
- <string name="Less">Weniger</string>
- <string name="Less Body Fat">Weniger Speck</string>
- <string name="Less Curtains">Weniger</string>
- <string name="Less Freckles">Weniger</string>
- <string name="Less Full">Weniger</string>
- <string name="Less Gravity">Weniger</string>
- <string name="Less Love">Weniger</string>
- <string name="Less Muscles">Weniger</string>
- <string name="Less Muscular">Weniger</string>
- <string name="Less Rosy">Weniger</string>
- <string name="Less Round">Weniger</string>
- <string name="Less Saddle">Weniger</string>
- <string name="Less Square">Weniger</string>
- <string name="Less Volume">Weniger</string>
- <string name="Less soul">Weniger</string>
- <string name="Lighter">Heller</string>
- <string name="Lip Cleft">Amorbogen</string>
- <string name="Lip Cleft Depth">Tiefe: Amorbogen</string>
- <string name="Lip Fullness">Fülle</string>
- <string name="Lip Pinkness">Pinkton</string>
- <string name="Lip Ratio">Lippenproportionen</string>
- <string name="Lip Thickness">Lippendicke</string>
- <string name="Lip Width">Mundbreite</string>
- <string name="Lipgloss">Lipgloss</string>
- <string name="Lipstick">Lippenstift</string>
- <string name="Lipstick Color">Farbe</string>
- <string name="Long">Lang</string>
- <string name="Long Head">Langer Kopf</string>
- <string name="Long Hips">Lange Hüften</string>
- <string name="Long Legs">Lange Beine</string>
- <string name="Long Neck">Langer Hals</string>
- <string name="Long Pigtails">Lange Zöpfe</string>
- <string name="Long Ponytail">Langer Pferdeschwanz</string>
- <string name="Long Torso">Langer Oberkörper</string>
- <string name="Long arms">Lange Arme</string>
- <string name="Loose Pants">Weite Hosen</string>
- <string name="Loose Shirt">Weites Hemd</string>
- <string name="Loose Sleeves">Weite Ärmel</string>
- <string name="Love Handles">Fettpölsterchen</string>
- <string name="Low">Niedrig</string>
- <string name="Low Heels">Niedrig</string>
- <string name="Low Jaw">Niedrig</string>
- <string name="Low Platforms">Niedrig</string>
- <string name="Low and Loose">Weit</string>
- <string name="Lower">Absenken</string>
- <string name="Lower Bridge">Brücke, Unterer Teil</string>
- <string name="Lower Cheeks">Wangen, unterer Bereich</string>
- <string name="Male">Männlich</string>
- <string name="Middle Part">Mittelscheitel</string>
- <string name="More">Mehr</string>
- <string name="More Blush">Mehr</string>
- <string name="More Body Fat">Mehr Speck</string>
- <string name="More Curtains">Mehr</string>
- <string name="More Eyeshadow">Mehr</string>
- <string name="More Freckles">Mehr</string>
- <string name="More Full">Voller</string>
- <string name="More Gravity">Mehr</string>
- <string name="More Lipstick">Mehr</string>
- <string name="More Love">Mehr</string>
- <string name="More Lower Lip">Größer</string>
- <string name="More Muscles">Mehr</string>
- <string name="More Muscular">Mehr</string>
- <string name="More Rosy">Mehr</string>
- <string name="More Round">Runder</string>
- <string name="More Saddle">Mehr</string>
- <string name="More Sloped">Flach</string>
- <string name="More Square">Eckiger</string>
- <string name="More Upper Lip">Mehr</string>
- <string name="More Vertical">Steil</string>
- <string name="More Volume">Mehr</string>
- <string name="More soul">Mehr</string>
- <string name="Moustache">Schnauzer</string>
- <string name="Mouth Corner">Mundwinkel</string>
- <string name="Mouth Position">Mundposition</string>
- <string name="Mowhawk">Irokese</string>
- <string name="Muscular">Muskulös</string>
- <string name="Mutton Chops">Koteletten</string>
- <string name="Nail Polish">Nagellack</string>
- <string name="Nail Polish Color">Farbe</string>
- <string name="Narrow">Schmal</string>
- <string name="Narrow Back">Wenig</string>
- <string name="Narrow Front">Wenig</string>
- <string name="Narrow Lips">Schmale Lippen</string>
- <string name="Natural">Natürlich</string>
- <string name="Neck Length">Halslänge</string>
- <string name="Neck Thickness">Halsdicke</string>
- <string name="No Blush">Kein Rouge</string>
- <string name="No Eyeliner">Kein Eyeliner</string>
- <string name="No Eyeshadow">Kein Lidschatten</string>
- <string name="No Lipgloss">Kein Lipgloss</string>
- <string name="No Lipstick">Kein Lippenstift</string>
- <string name="No Part">Kein Scheitel</string>
- <string name="No Polish">Kein Nagellack</string>
- <string name="No Red">Nicht rot</string>
- <string name="No Spikes">Keine Stachel</string>
- <string name="No White">Kein Weiß</string>
- <string name="No Wrinkles">Keine Falten</string>
- <string name="Normal Lower">Normal unten</string>
- <string name="Normal Upper">Normal oben</string>
- <string name="Nose Left">Links</string>
- <string name="Nose Right">Rechts</string>
- <string name="Nose Size">Größe</string>
- <string name="Nose Thickness">Dicke</string>
- <string name="Nose Tip Angle">Nasenspitze</string>
- <string name="Nose Tip Shape">Nasenspitze</string>
- <string name="Nose Width">Nasenbreite</string>
- <string name="Nostril Division">Teilung</string>
- <string name="Nostril Width">Größe</string>
- <string name="Opaque">Deckend</string>
- <string name="Open">Öffnen</string>
- <string name="Open Back">Hinten offen</string>
- <string name="Open Front">Vorne offen</string>
- <string name="Open Left">Links offen</string>
- <string name="Open Right">Rechts offen</string>
- <string name="Orange">Orange</string>
- <string name="Out">Aus</string>
- <string name="Out Shdw Color">Farbe: Oben</string>
- <string name="Out Shdw Opacity">Deckkraft: Oben</string>
- <string name="Outer Eye Corner">Äußerer Augenwinkel</string>
- <string name="Outer Eye Shadow">Lidschatten: Oben</string>
- <string name="Outer Shadow">Lidschatten: Oben</string>
- <string name="Overbite">Überbiss</string>
- <string name="Package">Ausbeulung</string>
- <string name="Painted Nails">Lackierte Nägel</string>
- <string name="Pale">Blass</string>
- <string name="Pants Crotch">Schritt</string>
- <string name="Pants Fit">Passform</string>
- <string name="Pants Length">Hosenlänge</string>
- <string name="Pants Waist">Hüfte</string>
- <string name="Pants Wrinkles">Falten</string>
- <string name="Part">Scheitel</string>
- <string name="Part Bangs">Pony scheiteln</string>
- <string name="Pectorals">Brustmuskel</string>
- <string name="Pigment">Pigmentierung</string>
- <string name="Pigtails">Zöpfe</string>
- <string name="Pink">Pink</string>
- <string name="Pinker">Mehr Pink</string>
- <string name="Platform Height">Höhe</string>
- <string name="Platform Width">Breite</string>
- <string name="Pointy">Spitz</string>
- <string name="Pointy Heels">Pfennigabsätze</string>
- <string name="Ponytail">Pferdeschwanz</string>
- <string name="Poofy Skirt">Weit ausgestellt</string>
- <string name="Pop Left Eye">Linkes Auge größer</string>
- <string name="Pop Right Eye">Rechtes Auge größer</string>
- <string name="Puffy">Geschwollen</string>
- <string name="Puffy Eyelids">Geschwollene Lider</string>
- <string name="Rainbow Color">Regenbogenfarben</string>
- <string name="Red Hair">Rote Haare</string>
- <string name="Regular">Normal</string>
- <string name="Right Part">Scheitel rechts</string>
- <string name="Rosy Complexion">Rosiger Teint</string>
- <string name="Round">Rund</string>
- <string name="Ruddiness">Röte</string>
- <string name="Ruddy">Rötlich</string>
- <string name="Rumpled Hair">Zerzauste Haare</string>
- <string name="Saddle Bags">Hüftspeck</string>
- <string name="Scrawny Leg">Dürres Bein</string>
- <string name="Separate">Auseinander</string>
- <string name="Shallow">Flach</string>
- <string name="Shear Back">Hinterkopf rasiert</string>
- <string name="Shear Face">Gesicht verzerren</string>
- <string name="Shear Front">Vorne rasiert</string>
- <string name="Shear Left Up">Links</string>
- <string name="Shear Right Up">Rechts</string>
- <string name="Sheared Back">Hinterkopf rasiert</string>
- <string name="Sheared Front">Vorne rasiert</string>
- <string name="Shift Left">Nach links</string>
- <string name="Shift Mouth">Mund verschieben</string>
- <string name="Shift Right">Nach rechts</string>
- <string name="Shirt Bottom">Hemdlänge</string>
- <string name="Shirt Fit">Passform</string>
- <string name="Shirt Wrinkles">Falten</string>
- <string name="Shoe Height">Schuhart</string>
- <string name="Short">Klein</string>
- <string name="Short Arms">Kurze Arme</string>
- <string name="Short Legs">Kurze Beine</string>
- <string name="Short Neck">Kurzer Hals</string>
- <string name="Short Pigtails">Kurze Zöpfe</string>
- <string name="Short Ponytail">Kurzer Pferdeschwanz</string>
- <string name="Short Sideburns">Kurze Koteletten</string>
- <string name="Short Torso">Kurzer Oberkörper</string>
- <string name="Short hips">Kurze Hüften</string>
- <string name="Shoulders">Schultern</string>
- <string name="Side Fringe">Seitliche Fransen</string>
- <string name="Sideburns">Koteletten</string>
- <string name="Sides Hair">Seitliches Haar</string>
- <string name="Sides Hair Down">Lang</string>
- <string name="Sides Hair Up">Kurz</string>
- <string name="Skinny Neck">Dünner Hals</string>
- <string name="Skirt Fit">Passform</string>
- <string name="Skirt Length">Rocklänge</string>
- <string name="Slanted Forehead">Fliehende Stirn</string>
- <string name="Sleeve Length">Ärmellänge</string>
- <string name="Sleeve Looseness">Passform Ärmel</string>
- <string name="Slit Back">Schlitz: Hinten</string>
- <string name="Slit Front">Schlitz: Vorne</string>
- <string name="Slit Left">Schlitz: Links</string>
- <string name="Slit Right">Schlitz: Rechts</string>
- <string name="Small">Klein</string>
- <string name="Small Hands">Kleine Hände</string>
- <string name="Small Head">Klein</string>
- <string name="Smooth">Glätten</string>
- <string name="Smooth Hair">Glattes Haar</string>
- <string name="Socks Length">Strumpflänge</string>
- <string name="Soulpatch">Unterlippenbart</string>
- <string name="Sparse">Wenig</string>
- <string name="Spiked Hair">Stachelhaare</string>
- <string name="Square">Rechteck</string>
- <string name="Square Toe">Eckig</string>
- <string name="Squash Head">Gestaucht</string>
- <string name="Stretch Head">Gestreckt</string>
- <string name="Sunken">Eingefallen</string>
- <string name="Sunken Chest">Trichterbrust</string>
- <string name="Sunken Eyes">Eingesunkene Augen</string>
- <string name="Sweep Back">Nach hinten</string>
- <string name="Sweep Forward">Nach vorne</string>
- <string name="Tall">Groß</string>
- <string name="Taper Back">Ansatzbreite hinten</string>
- <string name="Taper Front">Ansatzbreite vorne</string>
- <string name="Thick Heels">Dicke Absätze</string>
- <string name="Thick Neck">Dicker Hals</string>
- <string name="Thick Toe">Dick</string>
- <string name="Thin">Dünn</string>
- <string name="Thin Eyebrows">Dünne Augenbrauen</string>
- <string name="Thin Lips">Dünne Lippen</string>
- <string name="Thin Nose">Dünne Nase</string>
- <string name="Tight Chin">Straffes Kinn</string>
- <string name="Tight Cuffs">Eng</string>
- <string name="Tight Pants">Enge Hosen</string>
- <string name="Tight Shirt">Enges Hemd</string>
- <string name="Tight Skirt">Enger Rock</string>
- <string name="Tight Sleeves">Enge Ärmel</string>
- <string name="Toe Shape">Spitze</string>
- <string name="Toe Thickness">Dicke</string>
- <string name="Torso Length">Länge des Oberkörpers</string>
- <string name="Torso Muscles">Muskeln</string>
- <string name="Torso Scrawny">Dürr</string>
- <string name="Unattached">Frei</string>
- <string name="Uncreased">Straffes Lid</string>
- <string name="Underbite">Unterbiss</string>
- <string name="Unnatural">Unnatürlich</string>
- <string name="Upper Bridge">Brücke, oberer Teil</string>
- <string name="Upper Cheeks">Obere Wangen</string>
- <string name="Upper Chin Cleft">Obere Kinnspalte</string>
- <string name="Upper Eyelid Fold">Obere Lidfalte</string>
- <string name="Upturned">Stupsnase</string>
- <string name="Very Red">Sehr rot</string>
- <string name="Waist Height">Bund</string>
- <string name="Well-Fed">Gut genährt</string>
- <string name="White Hair">Weiße Haare</string>
- <string name="Wide">Breit</string>
- <string name="Wide Back">Breit</string>
- <string name="Wide Front">Breit</string>
- <string name="Wide Lips">Breit</string>
- <string name="Wild">Wild</string>
- <string name="Wrinkles">Falten</string>
- <string name="LocationCtrlAddLandmarkTooltip">Zu meinen Landmarken hinzufügen</string>
- <string name="LocationCtrlEditLandmarkTooltip">Meine Landmarken bearbeiten</string>
- <string name="LocationCtrlInfoBtnTooltip">Weitere Informationen über die aktuelle Position</string>
- <string name="LocationCtrlComboBtnTooltip">Mein Reiseverlauf</string>
- <string name="LocationCtrlForSaleTooltip">Dieses Land kaufen</string>
- <string name="LocationCtrlVoiceTooltip">Voice hier nicht möglich</string>
- <string name="LocationCtrlFlyTooltip">Fliegen ist unzulässig</string>
- <string name="LocationCtrlPushTooltip">Kein Stoßen</string>
- <string name="LocationCtrlBuildTooltip">Bauen/Fallen lassen von Objekten ist verboten</string>
- <string name="LocationCtrlScriptsTooltip">Skripte sind unzulässig</string>
- <string name="LocationCtrlDamageTooltip">Gesundheit</string>
- <string name="LocationCtrlAdultIconTooltip">Adult-Region</string>
- <string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
- <string name="LocationCtrlGeneralIconTooltip">Generelle Region</string>
- <string name="LocationCtrlSeeAVsTooltip">Avatare in dieser Parzelle können von Avataren außerhalb dieser Parzelle weder gesehen noch gehört werden</string>
- <string name="LocationCtrlPathfindingDirtyTooltip">Bewegliche Objekte verhalten sich in dieser Region u. U. erst dann korrekt, wenn die Region neu geformt wird.</string>
- <string name="LocationCtrlPathfindingDisabledTooltip">Dynamisches Pathfinding ist in dieser Region nicht aktiviert.</string>
- <string name="UpdaterWindowTitle">[APP_NAME] Aktualisierung</string>
- <string name="UpdaterNowUpdating">[APP_NAME] wird aktualisiert...</string>
- <string name="UpdaterNowInstalling">[APP_NAME] wird installiert...</string>
- <string name="UpdaterUpdatingDescriptive">Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis.</string>
- <string name="UpdaterProgressBarTextWithEllipses">Aktualisierung wird heruntergeladen...</string>
- <string name="UpdaterProgressBarText">Aktualisierung wird heruntergeladen</string>
- <string name="UpdaterFailDownloadTitle">Herunterladen ist fehlgeschlagen</string>
- <string name="UpdaterFailUpdateDescriptive">Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.</string>
- <string name="UpdaterFailInstallTitle">Aktualisierung konnte nicht installiert werden</string>
- <string name="UpdaterFailStartTitle">Viewer konnte nicht gestartet werden</string>
- <string name="ItemsComingInTooFastFrom">[APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.</string>
- <string name="ItemsComingInTooFast">[APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.</string>
- <string name="IM_logging_string">-- Instant-Message-Protokoll aktiviert --</string>
- <string name="IM_typing_start_string">[NAME] tippt...</string>
- <string name="Unnamed">(Nicht benannt)</string>
- <string name="IM_moderated_chat_label">(Moderiert: Stimmen in der Standardeinstellung stummgeschaltet)</string>
- <string name="IM_unavailable_text_label">Für diese Verbindung ist kein Text-Chat verfügbar.</string>
- <string name="IM_muted_text_label">Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert.</string>
- <string name="IM_default_text_label">Für Instant Message hier klicken.</string>
- <string name="IM_to_label">An</string>
- <string name="IM_moderator_label">(Moderator)</string>
- <string name="Saved_message">(Gespeichert am [LONG_TIMESTAMP])</string>
- <string name="IM_unblock_only_groups_friends">Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ &gt; „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren.</string>
- <string name="OnlineStatus">Online</string>
- <string name="OfflineStatus">Offline</string>
- <string name="not_online_msg">Benutzer nicht online – Nachricht wird gespeichert und später zugestellt.</string>
- <string name="not_online_inventory">Benutzer nicht online – Inventar gespeichert.</string>
- <string name="answered_call">Ihr Anruf wurde entgegengenommen</string>
- <string name="you_started_call">Sie haben einen Voice-Anruf begonnen</string>
- <string name="you_joined_call">Sie sind dem Gespräch beigetreten</string>
- <string name="you_auto_rejected_call-im">Sie haben den Voice-Anruf automatisch abgelehnt, während der Nicht-stören-Modus aktiviert war.</string>
- <string name="name_started_call">[NAME] hat einen Voice-Anruf begonnen</string>
- <string name="ringing-im">Verbindung wird hergestellt...</string>
- <string name="connected-im">Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen</string>
- <string name="hang_up-im">Anruf wurde beendet</string>
- <string name="answering-im">Wird verbunden...</string>
- <string name="conference-title">Chat mit mehreren Personen</string>
- <string name="conference-title-incoming">Konferenz mit [AGENT_NAME]</string>
- <string name="inventory_item_offered-im">Inventarobjekt „[ITEM_NAME]“ angeboten</string>
- <string name="inventory_folder_offered-im">Inventarordner „[ITEM_NAME]“ angeboten</string>
- <string name="share_alert">Objekte aus dem Inventar hier her ziehen</string>
- <string name="facebook_post_success">Sie haben auf Facebook gepostet.</string>
- <string name="flickr_post_success">Sie haben auf Flickr gepostet.</string>
- <string name="twitter_post_success">Sie haben auf Twitter gepostet.</string>
- <string name="no_session_message">(IM-Session nicht vorhanden)</string>
- <string name="only_user_message">Sie sind der einzige Benutzer in dieser Sitzung.</string>
- <string name="offline_message">[NAME] ist offline.</string>
- <string name="invite_message">Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.</string>
- <string name="muted_message">Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet.</string>
- <string name="generic">Fehler bei Anfrage, bitte versuchen Sie es später.</string>
- <string name="generic_request_error">Fehler bei Anfrage, bitte versuchen Sie es später.</string>
- <string name="insufficient_perms_error">Sie sind dazu nicht berechtigt.</string>
- <string name="session_does_not_exist_error">Die Sitzung ist abgelaufen</string>
- <string name="no_ability_error">Sie besitzen diese Fähigkeit nicht.</string>
- <string name="no_ability">Sie besitzen diese Fähigkeit nicht.</string>
- <string name="not_a_mod_error">Sie sind kein Sitzungsmoderator.</string>
- <string name="muted">Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.</string>
- <string name="muted_error">Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.</string>
- <string name="add_session_event">Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.</string>
- <string name="message">Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.</string>
- <string name="message_session_event">Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.</string>
- <string name="mute">Fehler während Moderation.</string>
- <string name="removed">Sie wurden von der Gruppe ausgeschlossen.</string>
- <string name="removed_from_group">Sie wurden von der Gruppe ausgeschlossen.</string>
- <string name="close_on_no_ability">Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen.</string>
- <string name="unread_chat_single">[SOURCES] hat etwas Neues gesagt</string>
- <string name="unread_chat_multiple">[SOURCES] haben etwas Neues gesagt</string>
- <string name="session_initialization_timed_out_error">Die Initialisierung der Sitzung ist fehlgeschlagen</string>
- <string name="Home position set.">Position für Zuhause festgelegt.</string>
- <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string>
- <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string>
- <string name="paid_you_ldollars">[NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt.</string>
- <string name="paid_you_ldollars_gift">[NAME] hat Ihnen [AMOUNT] L$ bezahlt: [REASON]</string>
- <string name="paid_you_ldollars_no_reason">[NAME] hat Ihnen [AMOUNT] L$ bezahlt.</string>
- <string name="you_paid_ldollars">Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt.</string>
- <string name="you_paid_ldollars_gift">Sie haben [NAME] [AMOUNT] L$ bezahlt: [REASON]</string>
- <string name="you_paid_ldollars_no_info">Sie haben [AMOUNT] L$ bezahlt.</string>
- <string name="you_paid_ldollars_no_reason">Sie haben [AMOUNT] L$ an [NAME] bezahlt.</string>
- <string name="you_paid_ldollars_no_name">Sie haben [REASON] [AMOUNT] L$ bezahlt.</string>
- <string name="you_paid_failure_ldollars">Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt.</string>
- <string name="you_paid_failure_ldollars_gift">Sie haben [NAME] [AMOUNT] L$ nicht bezahlt: [REASON]</string>
- <string name="you_paid_failure_ldollars_no_info">Sie haben [AMOUNT] L$ nicht bezahlt.</string>
- <string name="you_paid_failure_ldollars_no_reason">Sie haben [NAME] [AMOUNT] L$ nicht bezahlt.</string>
- <string name="you_paid_failure_ldollars_no_name">Sie haben [AMOUNT] L$ [REASON] nicht bezahlt.</string>
- <string name="for item">für [ITEM]</string>
- <string name="for a parcel of land">für eine Landparzelle</string>
- <string name="for a land access pass">für einen Pass</string>
- <string name="for deeding land">für die Landübertragung</string>
- <string name="to create a group">für die Gründung einer Gruppe</string>
- <string name="to join a group">für den Beitritt zur Gruppe</string>
- <string name="to upload">fürs Hochladen</string>
- <string name="to publish a classified ad">um eine Anzeige aufzugeben</string>
- <string name="giving">[AMOUNT] L$ werden bezahlt</string>
- <string name="uploading_costs">Kosten für Hochladen [AMOUNT] L$</string>
- <string name="this_costs">Kosten: [AMOUNT] L$</string>
- <string name="buying_selected_land">Ausgewähltes Land wird für [AMOUNT] L$ gekauft.</string>
- <string name="this_object_costs">Dieses Objekt kostet [AMOUNT] L$</string>
- <string name="group_role_everyone">Jeder</string>
- <string name="group_role_officers">Offiziere</string>
- <string name="group_role_owners">Eigentümer</string>
- <string name="group_member_status_online">Online</string>
- <string name="uploading_abuse_report">Hochladen...
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+ </string>
+ <string name="5 O'Clock Shadow">
+ Bartschatten
+ </string>
+ <string name="All White">
+ Ganz weiß
+ </string>
+ <string name="Anime Eyes">
+ Anime-Augen
+ </string>
+ <string name="Arced">
+ Gewölbt
+ </string>
+ <string name="Arm Length">
+ Armlänge
+ </string>
+ <string name="Attached">
+ Angewachsen
+ </string>
+ <string name="Attached Earlobes">
+ Angewachsene Ohrläppchen
+ </string>
+ <string name="Back Fringe">
+ Nackenfransen
+ </string>
+ <string name="Baggy">
+ Tränensäcke
+ </string>
+ <string name="Bangs">
+ Pony
+ </string>
+ <string name="Beady Eyes">
+ Knopfaugen
+ </string>
+ <string name="Belly Size">
+ Bauchgröße
+ </string>
+ <string name="Big">
+ Groß
+ </string>
+ <string name="Big Butt">
+ Großer Hintern
+ </string>
+ <string name="Big Hair Back">
+ Volumen: Hinten
+ </string>
+ <string name="Big Hair Front">
+ Volumen: Vorne
+ </string>
+ <string name="Big Hair Top">
+ Volumen: Oben
+ </string>
+ <string name="Big Head">
+ Groß
+ </string>
+ <string name="Big Pectorals">
+ Große Brustmuskeln
+ </string>
+ <string name="Big Spikes">
+ Große Stacheln
+ </string>
+ <string name="Black">
+ Schwarz
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Blondes Haar
+ </string>
+ <string name="Blush">
+ Rouge
+ </string>
+ <string name="Blush Color">
+ Rougefarbe
+ </string>
+ <string name="Blush Opacity">
+ Rouge Deckkraft
+ </string>
+ <string name="Body Definition">
+ Körperkonturen
+ </string>
+ <string name="Body Fat">
+ Körperfett
+ </string>
+ <string name="Body Freckles">
+ Sommersprossen
+ </string>
+ <string name="Body Thick">
+ breit
+ </string>
+ <string name="Body Thickness">
+ Körperbreite
+ </string>
+ <string name="Body Thin">
+ schmal
+ </string>
+ <string name="Bow Legged">
+ o-beinig
+ </string>
+ <string name="Breast Buoyancy">
+ Brust, Straffheit
+ </string>
+ <string name="Breast Cleavage">
+ Dekolleté
+ </string>
+ <string name="Breast Size">
+ Brustgröße
+ </string>
+ <string name="Bridge Width">
+ Rückenbreite
+ </string>
+ <string name="Broad">
+ Breit
+ </string>
+ <string name="Brow Size">
+ Brauengröße
+ </string>
+ <string name="Bug Eyes">
+ Glubschaugen
+ </string>
+ <string name="Bugged Eyes">
+ Hervortretend
+ </string>
+ <string name="Bulbous">
+ Knollennase
+ </string>
+ <string name="Bulbous Nose">
+ Knollennase
+ </string>
+ <string name="Breast Physics Mass">
+ Brust – Masse
+ </string>
+ <string name="Breast Physics Smoothing">
+ Brust – Glättung
+ </string>
+ <string name="Breast Physics Gravity">
+ Brust – Schwerkraft
+ </string>
+ <string name="Breast Physics Drag">
+ Brust – Luftwiderstand
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Federn
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Dämpfung
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Federn
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Dämpfung
+ </string>
+ <string name="Belly Physics Mass">
+ Bauch – Masse
+ </string>
+ <string name="Belly Physics Smoothing">
+ Bauch – Glättung
+ </string>
+ <string name="Belly Physics Gravity">
+ Bauch – Schwerkraft
+ </string>
+ <string name="Belly Physics Drag">
+ Bauch – Luftwiderstand
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Butt Physics Mass">
+ Po – Masse
+ </string>
+ <string name="Butt Physics Smoothing">
+ Po – Glättung
+ </string>
+ <string name="Butt Physics Gravity">
+ Po – Schwerkraft
+ </string>
+ <string name="Butt Physics Drag">
+ Po – Luftwiderstand
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Federn
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Verstärkung
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Dämpfung
+ </string>
+ <string name="Bushy Eyebrows">
+ Buschige Augenbrauen
+ </string>
+ <string name="Bushy Hair">
+ Buschiges Haar
+ </string>
+ <string name="Butt Size">
+ Hintern, Größe
+ </string>
+ <string name="Butt Gravity">
+ Po – Schwerkraft
+ </string>
+ <string name="bustle skirt">
+ Tournürenrock
+ </string>
+ <string name="no bustle">
+ Ohne
+ </string>
+ <string name="more bustle">
+ Mit
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Wangenknochen
+ </string>
+ <string name="Chest Size">
+ Brustgröße
+ </string>
+ <string name="Chin Angle">
+ Kinnwinkel
+ </string>
+ <string name="Chin Cleft">
+ Kinnspalte
+ </string>
+ <string name="Chin Curtains">
+ Schifferfräse
+ </string>
+ <string name="Chin Depth">
+ Kinnlänge
+ </string>
+ <string name="Chin Heavy">
+ Kinn ausgeprägt
+ </string>
+ <string name="Chin In">
+ Kinn zurück
+ </string>
+ <string name="Chin Out">
+ Kinn nach vorne
+ </string>
+ <string name="Chin-Neck">
+ Kinn-Hals
+ </string>
+ <string name="Clear">
+ Transparent
+ </string>
+ <string name="Cleft">
+ Spalte
+ </string>
+ <string name="Close Set Eyes">
+ Eng stehende Augen
+ </string>
+ <string name="Closed">
+ Geschlossen
+ </string>
+ <string name="Closed Back">
+ Hinten geschlossen
+ </string>
+ <string name="Closed Front">
+ Vorne geschlossen
+ </string>
+ <string name="Closed Left">
+ Links geschlossen
+ </string>
+ <string name="Closed Right">
+ Rechts geschlossen
+ </string>
+ <string name="Coin Purse">
+ Klein
+ </string>
+ <string name="Collar Back">
+ Kragen hinten
+ </string>
+ <string name="Collar Front">
+ Kragen vorne
+ </string>
+ <string name="Corner Down">
+ Nach unten
+ </string>
+ <string name="Corner Up">
+ Nach oben
+ </string>
+ <string name="Creased">
+ Schlupflid
+ </string>
+ <string name="Crooked Nose">
+ Krumme Nase
+ </string>
+ <string name="Cuff Flare">
+ Hosenaufschlag
+ </string>
+ <string name="Dark">
+ Dunkel
+ </string>
+ <string name="Dark Green">
+ Dunkelgrün
+ </string>
+ <string name="Darker">
+ Dunkler
+ </string>
+ <string name="Deep">
+ Tief
+ </string>
+ <string name="Default Heels">
+ Standardabsätze
+ </string>
+ <string name="Dense">
+ Dicht
+ </string>
+ <string name="Double Chin">
+ Doppelkinn
+ </string>
+ <string name="Downturned">
+ Nach unten
+ </string>
+ <string name="Duffle Bag">
+ Groß
+ </string>
+ <string name="Ear Angle">
+ Ohrenwinkel
+ </string>
+ <string name="Ear Size">
+ Ohrengröße
+ </string>
+ <string name="Ear Tips">
+ Ohrenspitzen
+ </string>
+ <string name="Egg Head">
+ Eierkopf
+ </string>
+ <string name="Eye Bags">
+ Augenränder
+ </string>
+ <string name="Eye Color">
+ Augenfarbe
+ </string>
+ <string name="Eye Depth">
+ Augentiefe
+ </string>
+ <string name="Eye Lightness">
+ Helligkeit
+ </string>
+ <string name="Eye Opening">
+ Öffnung
+ </string>
+ <string name="Eye Pop">
+ Symmetrie
+ </string>
+ <string name="Eye Size">
+ Augengröße
+ </string>
+ <string name="Eye Spacing">
+ Augenstand
+ </string>
+ <string name="Eyebrow Arc">
+ Brauenbogen
+ </string>
+ <string name="Eyebrow Density">
+ Brauendichte
+ </string>
+ <string name="Eyebrow Height">
+ Brauenhöhe
+ </string>
+ <string name="Eyebrow Points">
+ Brauenenden
+ </string>
+ <string name="Eyebrow Size">
+ Brauengröße
+ </string>
+ <string name="Eyelash Length">
+ Wimpernlänge
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Farbe des Eyeliners
+ </string>
+ <string name="Eyes Bugged">
+ Glubschaugen
+ </string>
+ <string name="Face Shear">
+ Gesichtsverzerrung
+ </string>
+ <string name="Facial Definition">
+ Gesichtskonturen
+ </string>
+ <string name="Far Set Eyes">
+ Weit auseinander
+ </string>
+ <string name="Fat Lips">
+ Volle Lippen
+ </string>
+ <string name="Female">
+ weiblich
+ </string>
+ <string name="Fingerless">
+ Ohne Finger
+ </string>
+ <string name="Fingers">
+ Finger
+ </string>
+ <string name="Flared Cuffs">
+ Ausgestellt
+ </string>
+ <string name="Flat">
+ Flach
+ </string>
+ <string name="Flat Butt">
+ Flacher Hintern
+ </string>
+ <string name="Flat Head">
+ Flacher Kopf
+ </string>
+ <string name="Flat Toe">
+ Flache Spitze
+ </string>
+ <string name="Foot Size">
+ Fußgröße
+ </string>
+ <string name="Forehead Angle">
+ Stirnwinkel
+ </string>
+ <string name="Forehead Heavy">
+ Stirn ausgeprägt
+ </string>
+ <string name="Freckles">
+ Sommersprossen
+ </string>
+ <string name="Front Fringe">
+ Fransen, vorne
+ </string>
+ <string name="Full Back">
+ Hinten volles Haar
+ </string>
+ <string name="Full Eyeliner">
+ Starker Eyeliner
+ </string>
+ <string name="Full Front">
+ Vorne volles Haar
+ </string>
+ <string name="Full Hair Sides">
+ Seitlich volles Haar
+ </string>
+ <string name="Full Sides">
+ Volle Seiten
+ </string>
+ <string name="Glossy">
+ Glänzend
+ </string>
+ <string name="Glove Fingers">
+ Handschuhfinger
+ </string>
+ <string name="Glove Length">
+ Handschuhlänge
+ </string>
+ <string name="Hair">
+ Haare
+ </string>
+ <string name="Hair Back">
+ Haare: Hinten
+ </string>
+ <string name="Hair Front">
+ Haare: Vorne
+ </string>
+ <string name="Hair Sides">
+ Haare: Seiten
+ </string>
+ <string name="Hair Sweep">
+ Haartolle
+ </string>
+ <string name="Hair Thickess">
+ Haardicke
+ </string>
+ <string name="Hair Thickness">
+ Haardicke
+ </string>
+ <string name="Hair Tilt">
+ Haarneigung
+ </string>
+ <string name="Hair Tilted Left">
+ Nach links
+ </string>
+ <string name="Hair Tilted Right">
+ Nach rechts
+ </string>
+ <string name="Hair Volume">
+ Haare: Volumen
+ </string>
+ <string name="Hand Size">
+ Handgröße
+ </string>
+ <string name="Handlebars">
+ Zwirbelbart
+ </string>
+ <string name="Head Length">
+ Kopflänge
+ </string>
+ <string name="Head Shape">
+ Kopfform
+ </string>
+ <string name="Head Size">
+ Kopfgröße
+ </string>
+ <string name="Head Stretch">
+ Kopfstreckung
+ </string>
+ <string name="Heel Height">
+ Absatzhöhe
+ </string>
+ <string name="Heel Shape">
+ Absatzform
+ </string>
+ <string name="Height">
+ Größe
+ </string>
+ <string name="High">
+ Hoch
+ </string>
+ <string name="High Heels">
+ Hohe Absätze
+ </string>
+ <string name="High Jaw">
+ Hoch
+ </string>
+ <string name="High Platforms">
+ Hohe Plattformsohlen
+ </string>
+ <string name="High and Tight">
+ Hoch und eng
+ </string>
+ <string name="Higher">
+ Höhere
+ </string>
+ <string name="Hip Length">
+ Länge der Hüfte
+ </string>
+ <string name="Hip Width">
+ Breite der Hüfte
+ </string>
+ <string name="Hover">
+ Schweben
+ </string>
+ <string name="In">
+ In
+ </string>
+ <string name="In Shdw Color">
+ Farbe Innenseite
+ </string>
+ <string name="In Shdw Opacity">
+ Deckkraft: innen
+ </string>
+ <string name="Inner Eye Corner">
+ Ecke: Nasenseite
+ </string>
+ <string name="Inner Eye Shadow">
+ Innenlid
+ </string>
+ <string name="Inner Shadow">
+ Innenlid
+ </string>
+ <string name="Jacket Length">
+ Jackenlänge
+ </string>
+ <string name="Jacket Wrinkles">
+ Jackenfalten
+ </string>
+ <string name="Jaw Angle">
+ Kinnansatz
+ </string>
+ <string name="Jaw Jut">
+ Kinnposition
+ </string>
+ <string name="Jaw Shape">
+ Kinnform
+ </string>
+ <string name="Join">
+ Zusammen
+ </string>
+ <string name="Jowls">
+ Hängebacken
+ </string>
+ <string name="Knee Angle">
+ Kniewinkel
+ </string>
+ <string name="Knock Kneed">
+ X-beinig
+ </string>
+ <string name="Large">
+ Groß
+ </string>
+ <string name="Large Hands">
+ Große Hände
+ </string>
+ <string name="Left Part">
+ Linksscheitel
+ </string>
+ <string name="Leg Length">
+ Beinlänge
+ </string>
+ <string name="Leg Muscles">
+ Beinmuskeln
+ </string>
+ <string name="Less">
+ Weniger
+ </string>
+ <string name="Less Body Fat">
+ Weniger Speck
+ </string>
+ <string name="Less Curtains">
+ Weniger
+ </string>
+ <string name="Less Freckles">
+ Weniger
+ </string>
+ <string name="Less Full">
+ Weniger
+ </string>
+ <string name="Less Gravity">
+ Weniger
+ </string>
+ <string name="Less Love">
+ Weniger
+ </string>
+ <string name="Less Muscles">
+ Weniger
+ </string>
+ <string name="Less Muscular">
+ Weniger
+ </string>
+ <string name="Less Rosy">
+ Weniger
+ </string>
+ <string name="Less Round">
+ Weniger
+ </string>
+ <string name="Less Saddle">
+ Weniger
+ </string>
+ <string name="Less Square">
+ Weniger
+ </string>
+ <string name="Less Volume">
+ Weniger
+ </string>
+ <string name="Less soul">
+ Weniger
+ </string>
+ <string name="Lighter">
+ Heller
+ </string>
+ <string name="Lip Cleft">
+ Amorbogen
+ </string>
+ <string name="Lip Cleft Depth">
+ Tiefe: Amorbogen
+ </string>
+ <string name="Lip Fullness">
+ Fülle
+ </string>
+ <string name="Lip Pinkness">
+ Pinkton
+ </string>
+ <string name="Lip Ratio">
+ Lippenproportionen
+ </string>
+ <string name="Lip Thickness">
+ Lippendicke
+ </string>
+ <string name="Lip Width">
+ Mundbreite
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Lippenstift
+ </string>
+ <string name="Lipstick Color">
+ Farbe
+ </string>
+ <string name="Long">
+ Lang
+ </string>
+ <string name="Long Head">
+ Langer Kopf
+ </string>
+ <string name="Long Hips">
+ Lange Hüften
+ </string>
+ <string name="Long Legs">
+ Lange Beine
+ </string>
+ <string name="Long Neck">
+ Langer Hals
+ </string>
+ <string name="Long Pigtails">
+ Lange Zöpfe
+ </string>
+ <string name="Long Ponytail">
+ Langer Pferdeschwanz
+ </string>
+ <string name="Long Torso">
+ Langer Oberkörper
+ </string>
+ <string name="Long arms">
+ Lange Arme
+ </string>
+ <string name="Loose Pants">
+ Weite Hosen
+ </string>
+ <string name="Loose Shirt">
+ Weites Hemd
+ </string>
+ <string name="Loose Sleeves">
+ Weite Ärmel
+ </string>
+ <string name="Love Handles">
+ Fettpölsterchen
+ </string>
+ <string name="Low">
+ Niedrig
+ </string>
+ <string name="Low Heels">
+ Niedrig
+ </string>
+ <string name="Low Jaw">
+ Niedrig
+ </string>
+ <string name="Low Platforms">
+ Niedrig
+ </string>
+ <string name="Low and Loose">
+ Weit
+ </string>
+ <string name="Lower">
+ Absenken
+ </string>
+ <string name="Lower Bridge">
+ Brücke, Unterer Teil
+ </string>
+ <string name="Lower Cheeks">
+ Wangen, unterer Bereich
+ </string>
+ <string name="Male">
+ Männlich
+ </string>
+ <string name="Middle Part">
+ Mittelscheitel
+ </string>
+ <string name="More">
+ Mehr
+ </string>
+ <string name="More Blush">
+ Mehr
+ </string>
+ <string name="More Body Fat">
+ Mehr Speck
+ </string>
+ <string name="More Curtains">
+ Mehr
+ </string>
+ <string name="More Eyeshadow">
+ Mehr
+ </string>
+ <string name="More Freckles">
+ Mehr
+ </string>
+ <string name="More Full">
+ Voller
+ </string>
+ <string name="More Gravity">
+ Mehr
+ </string>
+ <string name="More Lipstick">
+ Mehr
+ </string>
+ <string name="More Love">
+ Mehr
+ </string>
+ <string name="More Lower Lip">
+ Größer
+ </string>
+ <string name="More Muscles">
+ Mehr
+ </string>
+ <string name="More Muscular">
+ Mehr
+ </string>
+ <string name="More Rosy">
+ Mehr
+ </string>
+ <string name="More Round">
+ Runder
+ </string>
+ <string name="More Saddle">
+ Mehr
+ </string>
+ <string name="More Sloped">
+ Flach
+ </string>
+ <string name="More Square">
+ Eckiger
+ </string>
+ <string name="More Upper Lip">
+ Mehr
+ </string>
+ <string name="More Vertical">
+ Steil
+ </string>
+ <string name="More Volume">
+ Mehr
+ </string>
+ <string name="More soul">
+ Mehr
+ </string>
+ <string name="Moustache">
+ Schnauzer
+ </string>
+ <string name="Mouth Corner">
+ Mundwinkel
+ </string>
+ <string name="Mouth Position">
+ Mundposition
+ </string>
+ <string name="Mowhawk">
+ Irokese
+ </string>
+ <string name="Muscular">
+ Muskulös
+ </string>
+ <string name="Mutton Chops">
+ Koteletten
+ </string>
+ <string name="Nail Polish">
+ Nagellack
+ </string>
+ <string name="Nail Polish Color">
+ Farbe
+ </string>
+ <string name="Narrow">
+ Schmal
+ </string>
+ <string name="Narrow Back">
+ Wenig
+ </string>
+ <string name="Narrow Front">
+ Wenig
+ </string>
+ <string name="Narrow Lips">
+ Schmale Lippen
+ </string>
+ <string name="Natural">
+ Natürlich
+ </string>
+ <string name="Neck Length">
+ Halslänge
+ </string>
+ <string name="Neck Thickness">
+ Halsdicke
+ </string>
+ <string name="No Blush">
+ Kein Rouge
+ </string>
+ <string name="No Eyeliner">
+ Kein Eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Kein Lidschatten
+ </string>
+ <string name="No Lipgloss">
+ Kein Lipgloss
+ </string>
+ <string name="No Lipstick">
+ Kein Lippenstift
+ </string>
+ <string name="No Part">
+ Kein Scheitel
+ </string>
+ <string name="No Polish">
+ Kein Nagellack
+ </string>
+ <string name="No Red">
+ Nicht rot
+ </string>
+ <string name="No Spikes">
+ Keine Stachel
+ </string>
+ <string name="No White">
+ Kein Weiß
+ </string>
+ <string name="No Wrinkles">
+ Keine Falten
+ </string>
+ <string name="Normal Lower">
+ Normal unten
+ </string>
+ <string name="Normal Upper">
+ Normal oben
+ </string>
+ <string name="Nose Left">
+ Links
+ </string>
+ <string name="Nose Right">
+ Rechts
+ </string>
+ <string name="Nose Size">
+ Größe
+ </string>
+ <string name="Nose Thickness">
+ Dicke
+ </string>
+ <string name="Nose Tip Angle">
+ Nasenspitze
+ </string>
+ <string name="Nose Tip Shape">
+ Nasenspitze
+ </string>
+ <string name="Nose Width">
+ Nasenbreite
+ </string>
+ <string name="Nostril Division">
+ Teilung
+ </string>
+ <string name="Nostril Width">
+ Größe
+ </string>
+ <string name="Opaque">
+ Deckend
+ </string>
+ <string name="Open">
+ Öffnen
+ </string>
+ <string name="Open Back">
+ Hinten offen
+ </string>
+ <string name="Open Front">
+ Vorne offen
+ </string>
+ <string name="Open Left">
+ Links offen
+ </string>
+ <string name="Open Right">
+ Rechts offen
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Aus
+ </string>
+ <string name="Out Shdw Color">
+ Farbe: Oben
+ </string>
+ <string name="Out Shdw Opacity">
+ Deckkraft: Oben
+ </string>
+ <string name="Outer Eye Corner">
+ Äußerer Augenwinkel
+ </string>
+ <string name="Outer Eye Shadow">
+ Lidschatten: Oben
+ </string>
+ <string name="Outer Shadow">
+ Lidschatten: Oben
+ </string>
+ <string name="Overbite">
+ Überbiss
+ </string>
+ <string name="Package">
+ Ausbeulung
+ </string>
+ <string name="Painted Nails">
+ Lackierte Nägel
+ </string>
+ <string name="Pale">
+ Blass
+ </string>
+ <string name="Pants Crotch">
+ Schritt
+ </string>
+ <string name="Pants Fit">
+ Passform
+ </string>
+ <string name="Pants Length">
+ Hosenlänge
+ </string>
+ <string name="Pants Waist">
+ Hüfte
+ </string>
+ <string name="Pants Wrinkles">
+ Falten
+ </string>
+ <string name="Part">
+ Scheitel
+ </string>
+ <string name="Part Bangs">
+ Pony scheiteln
+ </string>
+ <string name="Pectorals">
+ Brustmuskel
+ </string>
+ <string name="Pigment">
+ Pigmentierung
+ </string>
+ <string name="Pigtails">
+ Zöpfe
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Mehr Pink
+ </string>
+ <string name="Platform Height">
+ Höhe
+ </string>
+ <string name="Platform Width">
+ Breite
+ </string>
+ <string name="Pointy">
+ Spitz
+ </string>
+ <string name="Pointy Heels">
+ Pfennigabsätze
+ </string>
+ <string name="Ponytail">
+ Pferdeschwanz
+ </string>
+ <string name="Poofy Skirt">
+ Weit ausgestellt
+ </string>
+ <string name="Pop Left Eye">
+ Linkes Auge größer
+ </string>
+ <string name="Pop Right Eye">
+ Rechtes Auge größer
+ </string>
+ <string name="Puffy">
+ Geschwollen
+ </string>
+ <string name="Puffy Eyelids">
+ Geschwollene Lider
+ </string>
+ <string name="Rainbow Color">
+ Regenbogenfarben
+ </string>
+ <string name="Red Hair">
+ Rote Haare
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Scheitel rechts
+ </string>
+ <string name="Rosy Complexion">
+ Rosiger Teint
+ </string>
+ <string name="Round">
+ Rund
+ </string>
+ <string name="Ruddiness">
+ Röte
+ </string>
+ <string name="Ruddy">
+ Rötlich
+ </string>
+ <string name="Rumpled Hair">
+ Zerzauste Haare
+ </string>
+ <string name="Saddle Bags">
+ Hüftspeck
+ </string>
+ <string name="Scrawny Leg">
+ Dürres Bein
+ </string>
+ <string name="Separate">
+ Auseinander
+ </string>
+ <string name="Shallow">
+ Flach
+ </string>
+ <string name="Shear Back">
+ Hinterkopf rasiert
+ </string>
+ <string name="Shear Face">
+ Gesicht verzerren
+ </string>
+ <string name="Shear Front">
+ Vorne rasiert
+ </string>
+ <string name="Shear Left Up">
+ Links
+ </string>
+ <string name="Shear Right Up">
+ Rechts
+ </string>
+ <string name="Sheared Back">
+ Hinterkopf rasiert
+ </string>
+ <string name="Sheared Front">
+ Vorne rasiert
+ </string>
+ <string name="Shift Left">
+ Nach links
+ </string>
+ <string name="Shift Mouth">
+ Mund verschieben
+ </string>
+ <string name="Shift Right">
+ Nach rechts
+ </string>
+ <string name="Shirt Bottom">
+ Hemdlänge
+ </string>
+ <string name="Shirt Fit">
+ Passform
+ </string>
+ <string name="Shirt Wrinkles">
+ Falten
+ </string>
+ <string name="Shoe Height">
+ Schuhart
+ </string>
+ <string name="Short">
+ Klein
+ </string>
+ <string name="Short Arms">
+ Kurze Arme
+ </string>
+ <string name="Short Legs">
+ Kurze Beine
+ </string>
+ <string name="Short Neck">
+ Kurzer Hals
+ </string>
+ <string name="Short Pigtails">
+ Kurze Zöpfe
+ </string>
+ <string name="Short Ponytail">
+ Kurzer Pferdeschwanz
+ </string>
+ <string name="Short Sideburns">
+ Kurze Koteletten
+ </string>
+ <string name="Short Torso">
+ Kurzer Oberkörper
+ </string>
+ <string name="Short hips">
+ Kurze Hüften
+ </string>
+ <string name="Shoulders">
+ Schultern
+ </string>
+ <string name="Side Fringe">
+ Seitliche Fransen
+ </string>
+ <string name="Sideburns">
+ Koteletten
+ </string>
+ <string name="Sides Hair">
+ Seitliches Haar
+ </string>
+ <string name="Sides Hair Down">
+ Lang
+ </string>
+ <string name="Sides Hair Up">
+ Kurz
+ </string>
+ <string name="Skinny Neck">
+ Dünner Hals
+ </string>
+ <string name="Skirt Fit">
+ Passform
+ </string>
+ <string name="Skirt Length">
+ Rocklänge
+ </string>
+ <string name="Slanted Forehead">
+ Fliehende Stirn
+ </string>
+ <string name="Sleeve Length">
+ Ärmellänge
+ </string>
+ <string name="Sleeve Looseness">
+ Passform Ärmel
+ </string>
+ <string name="Slit Back">
+ Schlitz: Hinten
+ </string>
+ <string name="Slit Front">
+ Schlitz: Vorne
+ </string>
+ <string name="Slit Left">
+ Schlitz: Links
+ </string>
+ <string name="Slit Right">
+ Schlitz: Rechts
+ </string>
+ <string name="Small">
+ Klein
+ </string>
+ <string name="Small Hands">
+ Kleine Hände
+ </string>
+ <string name="Small Head">
+ Klein
+ </string>
+ <string name="Smooth">
+ Glätten
+ </string>
+ <string name="Smooth Hair">
+ Glattes Haar
+ </string>
+ <string name="Socks Length">
+ Strumpflänge
+ </string>
+ <string name="Soulpatch">
+ Unterlippenbart
+ </string>
+ <string name="Sparse">
+ Wenig
+ </string>
+ <string name="Spiked Hair">
+ Stachelhaare
+ </string>
+ <string name="Square">
+ Rechteck
+ </string>
+ <string name="Square Toe">
+ Eckig
+ </string>
+ <string name="Squash Head">
+ Gestaucht
+ </string>
+ <string name="Stretch Head">
+ Gestreckt
+ </string>
+ <string name="Sunken">
+ Eingefallen
+ </string>
+ <string name="Sunken Chest">
+ Trichterbrust
+ </string>
+ <string name="Sunken Eyes">
+ Eingesunkene Augen
+ </string>
+ <string name="Sweep Back">
+ Nach hinten
+ </string>
+ <string name="Sweep Forward">
+ Nach vorne
+ </string>
+ <string name="Tall">
+ Groß
+ </string>
+ <string name="Taper Back">
+ Ansatzbreite hinten
+ </string>
+ <string name="Taper Front">
+ Ansatzbreite vorne
+ </string>
+ <string name="Thick Heels">
+ Dicke Absätze
+ </string>
+ <string name="Thick Neck">
+ Dicker Hals
+ </string>
+ <string name="Thick Toe">
+ Dick
+ </string>
+ <string name="Thin">
+ Dünn
+ </string>
+ <string name="Thin Eyebrows">
+ Dünne Augenbrauen
+ </string>
+ <string name="Thin Lips">
+ Dünne Lippen
+ </string>
+ <string name="Thin Nose">
+ Dünne Nase
+ </string>
+ <string name="Tight Chin">
+ Straffes Kinn
+ </string>
+ <string name="Tight Cuffs">
+ Eng
+ </string>
+ <string name="Tight Pants">
+ Enge Hosen
+ </string>
+ <string name="Tight Shirt">
+ Enges Hemd
+ </string>
+ <string name="Tight Skirt">
+ Enger Rock
+ </string>
+ <string name="Tight Sleeves">
+ Enge Ärmel
+ </string>
+ <string name="Toe Shape">
+ Spitze
+ </string>
+ <string name="Toe Thickness">
+ Dicke
+ </string>
+ <string name="Torso Length">
+ Länge des Oberkörpers
+ </string>
+ <string name="Torso Muscles">
+ Muskeln
+ </string>
+ <string name="Torso Scrawny">
+ Dürr
+ </string>
+ <string name="Unattached">
+ Frei
+ </string>
+ <string name="Uncreased">
+ Straffes Lid
+ </string>
+ <string name="Underbite">
+ Unterbiss
+ </string>
+ <string name="Unnatural">
+ Unnatürlich
+ </string>
+ <string name="Upper Bridge">
+ Brücke, oberer Teil
+ </string>
+ <string name="Upper Cheeks">
+ Obere Wangen
+ </string>
+ <string name="Upper Chin Cleft">
+ Obere Kinnspalte
+ </string>
+ <string name="Upper Eyelid Fold">
+ Obere Lidfalte
+ </string>
+ <string name="Upturned">
+ Stupsnase
+ </string>
+ <string name="Very Red">
+ Sehr rot
+ </string>
+ <string name="Waist Height">
+ Bund
+ </string>
+ <string name="Well-Fed">
+ Gut genährt
+ </string>
+ <string name="White Hair">
+ Weiße Haare
+ </string>
+ <string name="Wide">
+ Breit
+ </string>
+ <string name="Wide Back">
+ Breit
+ </string>
+ <string name="Wide Front">
+ Breit
+ </string>
+ <string name="Wide Lips">
+ Breit
+ </string>
+ <string name="Wild">
+ Wild
+ </string>
+ <string name="Wrinkles">
+ Falten
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Zu meinen Landmarken hinzufügen
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Meine Landmarken bearbeiten
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Weitere Informationen über die aktuelle Position
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Mein Reiseverlauf
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Dieses Land kaufen
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Voice hier nicht möglich
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Fliegen ist unzulässig
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ Kein Stoßen
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Bauen/Fallen lassen von Objekten ist verboten
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Skripte sind unzulässig
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Gesundheit
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adult-Region
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate Region
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Generelle Region
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatare in dieser Parzelle können von Avataren außerhalb dieser Parzelle weder gesehen noch gehört werden
+ </string>
+ <string name="LocationCtrlPathfindingDirtyTooltip">
+ Bewegliche Objekte verhalten sich in dieser Region u. U. erst dann korrekt, wenn die Region neu geformt wird.
+ </string>
+ <string name="LocationCtrlPathfindingDisabledTooltip">
+ Dynamisches Pathfinding ist in dieser Region nicht aktiviert.
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Aktualisierung
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] wird aktualisiert...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] wird installiert...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Aktualisierung wird heruntergeladen...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Aktualisierung wird heruntergeladen
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Herunterladen ist fehlgeschlagen
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Aktualisierung konnte nicht installiert werden
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Viewer konnte nicht gestartet werden
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.
+ </string>
+ <string name="IM_logging_string">
+ -- Instant-Message-Protokoll aktiviert --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] tippt...
+ </string>
+ <string name="Unnamed">
+ (Nicht benannt)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderiert: Stimmen in der Standardeinstellung stummgeschaltet)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Für diese Verbindung ist kein Text-Chat verfügbar.
+ </string>
+ <string name="IM_muted_text_label">
+ Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert.
+ </string>
+ <string name="IM_default_text_label">
+ Für Instant Message hier klicken.
+ </string>
+ <string name="IM_to_label">
+ An
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
+ </string>
+ <string name="Saved_message">
+ (Gespeichert am [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ &gt; „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren.
+ </string>
+ <string name="OnlineStatus">
+ Online
+ </string>
+ <string name="OfflineStatus">
+ Offline
+ </string>
+ <string name="not_online_msg">
+ Benutzer nicht online – Nachricht wird gespeichert und später zugestellt.
+ </string>
+ <string name="not_online_inventory">
+ Benutzer nicht online – Inventar gespeichert.
+ </string>
+ <string name="answered_call">
+ Ihr Anruf wurde entgegengenommen
+ </string>
+ <string name="you_started_call">
+ Sie haben einen Voice-Anruf begonnen
+ </string>
+ <string name="you_joined_call">
+ Sie sind dem Gespräch beigetreten
+ </string>
+ <string name="you_auto_rejected_call-im">
+ Sie haben den Voice-Anruf automatisch abgelehnt, während der Nicht-stören-Modus aktiviert war.
+ </string>
+ <string name="name_started_call">
+ [NAME] hat einen Voice-Anruf begonnen
+ </string>
+ <string name="ringing-im">
+ Verbindung wird hergestellt...
+ </string>
+ <string name="connected-im">
+ Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen
+ </string>
+ <string name="hang_up-im">
+ Anruf wurde beendet
+ </string>
+ <string name="answering-im">
+ Wird verbunden...
+ </string>
+ <string name="conference-title">
+ Chat mit mehreren Personen
+ </string>
+ <string name="conference-title-incoming">
+ Konferenz mit [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Inventarobjekt „[ITEM_NAME]“ angeboten
+ </string>
+ <string name="inventory_folder_offered-im">
+ Inventarordner „[ITEM_NAME]“ angeboten
+ </string>
+ <string name="bot_warning">
+ Sie chatten mit einem Bot, [NAME]. Geben Sie keine persönlichen Informationen weiter.
+Erfahren Sie mehr unter https://second.life/scripted-agents.
+ </string>
+ <string name="share_alert">
+ Objekte aus dem Inventar hier her ziehen
+ </string>
+ <string name="facebook_post_success">
+ Sie haben auf Facebook gepostet.
+ </string>
+ <string name="flickr_post_success">
+ Sie haben auf Flickr gepostet.
+ </string>
+ <string name="twitter_post_success">
+ Sie haben auf Twitter gepostet.
+ </string>
+ <string name="no_session_message">
+ (IM-Session nicht vorhanden)
+ </string>
+ <string name="only_user_message">
+ Sie sind der einzige Benutzer in dieser Sitzung.
+ </string>
+ <string name="offline_message">
+ [NAME] ist offline.
+ </string>
+ <string name="invite_message">
+ Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.
+ </string>
+ <string name="muted_message">
+ Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet.
+ </string>
+ <string name="generic">
+ Fehler bei Anfrage, bitte versuchen Sie es später.
+ </string>
+ <string name="generic_request_error">
+ Fehler bei Anfrage, bitte versuchen Sie es später.
+ </string>
+ <string name="insufficient_perms_error">
+ Sie sind dazu nicht berechtigt.
+ </string>
+ <string name="session_does_not_exist_error">
+ Die Sitzung ist abgelaufen
+ </string>
+ <string name="no_ability_error">
+ Sie besitzen diese Fähigkeit nicht.
+ </string>
+ <string name="no_ability">
+ Sie besitzen diese Fähigkeit nicht.
+ </string>
+ <string name="not_a_mod_error">
+ Sie sind kein Sitzungsmoderator.
+ </string>
+ <string name="muted">
+ Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.
+ </string>
+ <string name="muted_error">
+ Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.
+ </string>
+ <string name="add_session_event">
+ Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.
+ </string>
+ <string name="message">
+ Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
+ </string>
+ <string name="message_session_event">
+ Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
+ </string>
+ <string name="mute">
+ Fehler während Moderation.
+ </string>
+ <string name="removed">
+ Sie wurden von der Gruppe ausgeschlossen.
+ </string>
+ <string name="removed_from_group">
+ Sie wurden von der Gruppe ausgeschlossen.
+ </string>
+ <string name="close_on_no_ability">
+ Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] hat etwas Neues gesagt
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] haben etwas Neues gesagt
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Die Initialisierung der Sitzung ist fehlgeschlagen
+ </string>
+ <string name="Home position set.">
+ Position für Zuhause festgelegt.
+ </string>
+ <string name="voice_morphing_url">
+ https://secondlife.com/destination/voice-island
+ </string>
+ <string name="premium_voice_morphing_url">
+ https://secondlife.com/destination/voice-morphing-premium
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] hat Ihnen [AMOUNT] L$ bezahlt: [REASON]
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] hat Ihnen [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="you_paid_ldollars">
+ Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt.
+ </string>
+ <string name="you_paid_ldollars_gift">
+ Sie haben [NAME] [AMOUNT] L$ bezahlt: [REASON]
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Sie haben [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Sie haben [AMOUNT] L$ an [NAME] bezahlt.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Sie haben [REASON] [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_gift">
+ Sie haben [NAME] [AMOUNT] L$ nicht bezahlt: [REASON]
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Sie haben [AMOUNT] L$ nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Sie haben [NAME] [AMOUNT] L$ nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Sie haben [AMOUNT] L$ [REASON] nicht bezahlt.
+ </string>
+ <string name="for item">
+ für [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ für eine Landparzelle
+ </string>
+ <string name="for a land access pass">
+ für einen Pass
+ </string>
+ <string name="for deeding land">
+ für die Landübertragung
+ </string>
+ <string name="to create a group">
+ für die Gründung einer Gruppe
+ </string>
+ <string name="to join a group">
+ für den Beitritt zur Gruppe
+ </string>
+ <string name="to upload">
+ fürs Hochladen
+ </string>
+ <string name="to publish a classified ad">
+ um eine Anzeige aufzugeben
+ </string>
+ <string name="giving">
+ [AMOUNT] L$ werden bezahlt
+ </string>
+ <string name="uploading_costs">
+ Kosten für Hochladen [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Kosten: [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Ausgewähltes Land wird für [AMOUNT] L$ gekauft.
+ </string>
+ <string name="this_object_costs">
+ Dieses Objekt kostet [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Jeder
+ </string>
+ <string name="group_role_officers">
+ Offiziere
+ </string>
+ <string name="group_role_owners">
+ Eigentümer
+ </string>
+ <string name="group_member_status_online">
+ Online
+ </string>
+ <string name="uploading_abuse_report">
+ Hochladen...
-Missbrauchsbericht</string>
- <string name="New Shape">Neue Form/Gestalt</string>
- <string name="New Skin">Neue Haut</string>
- <string name="New Hair">Neues Haar</string>
- <string name="New Eyes">Neue Augen</string>
- <string name="New Shirt">Neues Hemd</string>
- <string name="New Pants">Neue Hose</string>
- <string name="New Shoes">Neue Schuhe</string>
- <string name="New Socks">Neue Socken</string>
- <string name="New Jacket">Neue Jacke</string>
- <string name="New Gloves">Neue Handschuhe</string>
- <string name="New Undershirt">Neues Unterhemd</string>
- <string name="New Underpants">Neue Unterhose</string>
- <string name="New Skirt">Neuer Rock</string>
- <string name="New Alpha">Neues Alpha</string>
- <string name="New Tattoo">Neue Tätowierung</string>
- <string name="New Universal">Neues Universal</string>
- <string name="New Physics">Neue Physik</string>
- <string name="Invalid Wearable">Ungültiges Objekt</string>
- <string name="New Gesture">Neue Geste</string>
- <string name="New Script">Neues Skript</string>
- <string name="New Note">Neue Notiz</string>
- <string name="New Folder">Neuer Ordner</string>
- <string name="Contents">Inhalt</string>
- <string name="Gesture">Gesten</string>
- <string name="Male Gestures">Männliche Gesten</string>
- <string name="Female Gestures">Weibliche Gesten</string>
- <string name="Other Gestures">Andere Gesten</string>
- <string name="Speech Gestures">Sprachgesten</string>
- <string name="Common Gestures">Häufig verwendete Gesten</string>
- <string name="Male - Excuse me">Männlich - Excuse me</string>
- <string name="Male - Get lost">Männlich - Get lost</string>
- <string name="Male - Blow kiss">Männlich - Kusshand</string>
- <string name="Male - Boo">Männlich - Buh</string>
- <string name="Male - Bored">Männlich - Gelangweilt</string>
- <string name="Male - Hey">Männlich - Hey</string>
- <string name="Male - Laugh">Männlich - Lachen</string>
- <string name="Male - Repulsed">Männlich - Angewidert</string>
- <string name="Male - Shrug">Männlich - Achselzucken</string>
- <string name="Male - Stick tougue out">Männlich - Zunge herausstrecken</string>
- <string name="Male - Wow">Männlich - Wow</string>
- <string name="Female - Chuckle">Weiblich - Kichern</string>
- <string name="Female - Cry">Weiblich - Weinen</string>
- <string name="Female - Embarrassed">Weiblich - Verlegen</string>
- <string name="Female - Excuse me">Weiblich - Räuspern</string>
- <string name="Female - Get lost">Weiblich - Get lost</string>
- <string name="Female - Blow kiss">Weiblich - Kusshand</string>
- <string name="Female - Boo">Weiblich - Buh</string>
- <string name="Female - Bored">Weiblich - Gelangweilt</string>
- <string name="Female - Hey">Weiblich - Hey</string>
- <string name="Female - Hey baby">Weiblich - Hey Süße(r)</string>
- <string name="Female - Laugh">Weiblich - Lachen</string>
- <string name="Female - Looking good">Weiblich - Looking good</string>
- <string name="Female - Over here">Weiblich - Over here</string>
- <string name="Female - Please">Weiblich - Please</string>
- <string name="Female - Repulsed">Weiblich - Angewidert</string>
- <string name="Female - Shrug">Weiblich - Achselzucken</string>
- <string name="Female - Stick tougue out">Weiblich - Zunge herausstrecken</string>
- <string name="Female - Wow">Weiblich - Wow</string>
- <string name="New Daycycle">Neuer Tageszyklus</string>
- <string name="New Water">Neues Wasser</string>
- <string name="New Sky">Neuer Himmel</string>
- <string name="/bow">/verbeugen</string>
- <string name="/clap">/klatschen</string>
- <string name="/count">/zählen</string>
- <string name="/extinguish">/löschen</string>
- <string name="/kmb">/lmaa</string>
- <string name="/muscle">/Muskel</string>
- <string name="/no">/nein</string>
- <string name="/no!">/nein!</string>
- <string name="/paper">/Papier</string>
- <string name="/pointme">/auf mich zeigen</string>
- <string name="/pointyou">/auf dich zeigen</string>
- <string name="/rock">/Stein</string>
- <string name="/scissor">/Schere</string>
- <string name="/smoke">/rauchen</string>
- <string name="/stretch">/dehnen</string>
- <string name="/whistle">/pfeifen</string>
- <string name="/yes">/ja</string>
- <string name="/yes!">/ja!</string>
- <string name="afk">afk</string>
- <string name="dance1">Tanzen1</string>
- <string name="dance2">Tanzen2</string>
- <string name="dance3">Tanzen3</string>
- <string name="dance4">Tanzen4</string>
- <string name="dance5">Tanzen5</string>
- <string name="dance6">Tanzen6</string>
- <string name="dance7">Tanzen7</string>
- <string name="dance8">Tanzen8</string>
- <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
- <string name="DefaultMimeType">Keine/Keiner</string>
- <string name="texture_load_dimensions_error">Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden</string>
- <string name="outfit_photo_load_dimensions_error">Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte verkleinern Sie das Bild oder verwenden Sie ein anderes.</string>
- <string name="outfit_photo_select_dimensions_error">Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte wählen Sie eine andere Textur aus.</string>
- <string name="outfit_photo_verify_dimensions_error">Fotoabmessungen können nicht bestätigt werden. Bitte warten Sie, bis die Fotogröße im Auswahlfenster angezeigt wird.</string>
+Missbrauchsbericht
+ </string>
+ <string name="New Shape">
+ Neue Form/Gestalt
+ </string>
+ <string name="New Skin">
+ Neue Haut
+ </string>
+ <string name="New Hair">
+ Neues Haar
+ </string>
+ <string name="New Eyes">
+ Neue Augen
+ </string>
+ <string name="New Shirt">
+ Neues Hemd
+ </string>
+ <string name="New Pants">
+ Neue Hose
+ </string>
+ <string name="New Shoes">
+ Neue Schuhe
+ </string>
+ <string name="New Socks">
+ Neue Socken
+ </string>
+ <string name="New Jacket">
+ Neue Jacke
+ </string>
+ <string name="New Gloves">
+ Neue Handschuhe
+ </string>
+ <string name="New Undershirt">
+ Neues Unterhemd
+ </string>
+ <string name="New Underpants">
+ Neue Unterhose
+ </string>
+ <string name="New Skirt">
+ Neuer Rock
+ </string>
+ <string name="New Alpha">
+ Neues Alpha
+ </string>
+ <string name="New Tattoo">
+ Neue Tätowierung
+ </string>
+ <string name="New Universal">
+ Neues Universal
+ </string>
+ <string name="New Physics">
+ Neue Physik
+ </string>
+ <string name="Invalid Wearable">
+ Ungültiges Objekt
+ </string>
+ <string name="New Gesture">
+ Neue Geste
+ </string>
+ <string name="New Script">
+ Neues Skript
+ </string>
+ <string name="New Note">
+ Neue Notiz
+ </string>
+ <string name="New Folder">
+ Neuer Ordner
+ </string>
+ <string name="Contents">
+ Inhalt
+ </string>
+ <string name="Gesture">
+ Gesten
+ </string>
+ <string name="Male Gestures">
+ Männliche Gesten
+ </string>
+ <string name="Female Gestures">
+ Weibliche Gesten
+ </string>
+ <string name="Other Gestures">
+ Andere Gesten
+ </string>
+ <string name="Speech Gestures">
+ Sprachgesten
+ </string>
+ <string name="Common Gestures">
+ Häufig verwendete Gesten
+ </string>
+ <string name="Male - Excuse me">
+ Männlich - Excuse me
+ </string>
+ <string name="Male - Get lost">
+ Männlich - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ Männlich - Kusshand
+ </string>
+ <string name="Male - Boo">
+ Männlich - Buh
+ </string>
+ <string name="Male - Bored">
+ Männlich - Gelangweilt
+ </string>
+ <string name="Male - Hey">
+ Männlich - Hey
+ </string>
+ <string name="Male - Laugh">
+ Männlich - Lachen
+ </string>
+ <string name="Male - Repulsed">
+ Männlich - Angewidert
+ </string>
+ <string name="Male - Shrug">
+ Männlich - Achselzucken
+ </string>
+ <string name="Male - Stick tougue out">
+ Männlich - Zunge herausstrecken
+ </string>
+ <string name="Male - Wow">
+ Männlich - Wow
+ </string>
+ <string name="Female - Chuckle">
+ Weiblich - Kichern
+ </string>
+ <string name="Female - Cry">
+ Weiblich - Weinen
+ </string>
+ <string name="Female - Embarrassed">
+ Weiblich - Verlegen
+ </string>
+ <string name="Female - Excuse me">
+ Weiblich - Räuspern
+ </string>
+ <string name="Female - Get lost">
+ Weiblich - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Weiblich - Kusshand
+ </string>
+ <string name="Female - Boo">
+ Weiblich - Buh
+ </string>
+ <string name="Female - Bored">
+ Weiblich - Gelangweilt
+ </string>
+ <string name="Female - Hey">
+ Weiblich - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Weiblich - Hey Süße(r)
+ </string>
+ <string name="Female - Laugh">
+ Weiblich - Lachen
+ </string>
+ <string name="Female - Looking good">
+ Weiblich - Looking good
+ </string>
+ <string name="Female - Over here">
+ Weiblich - Over here
+ </string>
+ <string name="Female - Please">
+ Weiblich - Please
+ </string>
+ <string name="Female - Repulsed">
+ Weiblich - Angewidert
+ </string>
+ <string name="Female - Shrug">
+ Weiblich - Achselzucken
+ </string>
+ <string name="Female - Stick tougue out">
+ Weiblich - Zunge herausstrecken
+ </string>
+ <string name="Female - Wow">
+ Weiblich - Wow
+ </string>
+ <string name="New Daycycle">
+ Neuer Tageszyklus
+ </string>
+ <string name="New Water">
+ Neues Wasser
+ </string>
+ <string name="New Sky">
+ Neuer Himmel
+ </string>
+ <string name="/bow">
+ /verbeugen
+ </string>
+ <string name="/clap">
+ /klatschen
+ </string>
+ <string name="/count">
+ /zählen
+ </string>
+ <string name="/extinguish">
+ /löschen
+ </string>
+ <string name="/kmb">
+ /lmaa
+ </string>
+ <string name="/muscle">
+ /Muskel
+ </string>
+ <string name="/no">
+ /nein
+ </string>
+ <string name="/no!">
+ /nein!
+ </string>
+ <string name="/paper">
+ /Papier
+ </string>
+ <string name="/pointme">
+ /auf mich zeigen
+ </string>
+ <string name="/pointyou">
+ /auf dich zeigen
+ </string>
+ <string name="/rock">
+ /Stein
+ </string>
+ <string name="/scissor">
+ /Schere
+ </string>
+ <string name="/smoke">
+ /rauchen
+ </string>
+ <string name="/stretch">
+ /dehnen
+ </string>
+ <string name="/whistle">
+ /pfeifen
+ </string>
+ <string name="/yes">
+ /ja
+ </string>
+ <string name="/yes!">
+ /ja!
+ </string>
+ <string name="afk">
+ afk
+ </string>
+ <string name="dance1">
+ Tanzen1
+ </string>
+ <string name="dance2">
+ Tanzen2
+ </string>
+ <string name="dance3">
+ Tanzen3
+ </string>
+ <string name="dance4">
+ Tanzen4
+ </string>
+ <string name="dance5">
+ Tanzen5
+ </string>
+ <string name="dance6">
+ Tanzen6
+ </string>
+ <string name="dance7">
+ Tanzen7
+ </string>
+ <string name="dance8">
+ Tanzen8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ Keine/Keiner
+ </string>
+ <string name="texture_load_dimensions_error">
+ Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden
+ </string>
+ <string name="outfit_photo_load_dimensions_error">
+ Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte verkleinern Sie das Bild oder verwenden Sie ein anderes.
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte wählen Sie eine andere Textur aus.
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Fotoabmessungen können nicht bestätigt werden. Bitte warten Sie, bis die Fotogröße im Auswahlfenster angezeigt wird.
+ </string>
<string name="words_separator" value=","/>
- <string name="server_is_down">Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten.
+ <string name="server_is_down">
+ Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten.
Bitte überprüfen Sie http://status.secondlifegrid.net, um herauszufinden, ob ein Problem mit dem Service vorliegt.
- Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen.</string>
- <string name="dateTimeWeekdaysNames">Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag</string>
- <string name="dateTimeWeekdaysShortNames">So:Mo:Di:Mi:Do:Fr:Sa</string>
- <string name="dateTimeMonthNames">Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember</string>
- <string name="dateTimeMonthShortNames">Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez</string>
- <string name="dateTimeDayFormat">[MDAY]</string>
- <string name="dateTimeAM">Uhr</string>
- <string name="dateTimePM">Uhr</string>
- <string name="LocalEstimateUSD">[AMOUNT] US$</string>
- <string name="Group Ban">Gruppenverbannung</string>
- <string name="Membership">Mitgliedschaft</string>
- <string name="Roles">Rollen</string>
- <string name="Group Identity">Gruppenidentität</string>
- <string name="Parcel Management">Parzellenverwaltung</string>
- <string name="Parcel Identity">Parzellenidentität</string>
- <string name="Parcel Settings">Parzelleneinstellungen</string>
- <string name="Parcel Powers">Parzellenfähigkeiten</string>
- <string name="Parcel Access">Parzellenzugang</string>
- <string name="Parcel Content">Parzelleninhalt</string>
- <string name="Object Management">Objektmanagement</string>
- <string name="Accounting">Kontoführung</string>
- <string name="Notices">Mitteilungen</string>
- <string name="Chat" value=" Chat:">Chat</string>
- <string name="BaseMembership">Basis</string>
- <string name="PremiumMembership">Premium</string>
- <string name="Premium_PlusMembership">Premium Plus</string>
- <string name="DeleteItems">Ausgewählte Objekte löschen?</string>
- <string name="DeleteItem">Ausgewähltes Objekt löschen?</string>
- <string name="EmptyOutfitText">Keine Objekte in diesem Outfit</string>
- <string name="ExternalEditorNotSet">Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus</string>
- <string name="ExternalEditorNotFound">Angegebener externer Editor nicht gefunden.
+ Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ So:Mo:Di:Mi:Do:Fr:Sa
+ </string>
+ <string name="dateTimeMonthNames">
+ Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Group Ban">
+ Gruppenverbannung
+ </string>
+ <string name="Membership">
+ Mitgliedschaft
+ </string>
+ <string name="Roles">
+ Rollen
+ </string>
+ <string name="Group Identity">
+ Gruppenidentität
+ </string>
+ <string name="Parcel Management">
+ Parzellenverwaltung
+ </string>
+ <string name="Parcel Identity">
+ Parzellenidentität
+ </string>
+ <string name="Parcel Settings">
+ Parzelleneinstellungen
+ </string>
+ <string name="Parcel Powers">
+ Parzellenfähigkeiten
+ </string>
+ <string name="Parcel Access">
+ Parzellenzugang
+ </string>
+ <string name="Parcel Content">
+ Parzelleninhalt
+ </string>
+ <string name="Object Management">
+ Objektmanagement
+ </string>
+ <string name="Accounting">
+ Kontoführung
+ </string>
+ <string name="Notices">
+ Mitteilungen
+ </string>
+ <string name="Chat" value=" Chat:">
+ Chat
+ </string>
+ <string name="BaseMembership">
+ Basis
+ </string>
+ <string name="PremiumMembership">
+ Premium
+ </string>
+ <string name="Premium_PlusMembership">
+ Premium Plus
+ </string>
+ <string name="DeleteItems">
+ Ausgewählte Objekte löschen?
+ </string>
+ <string name="DeleteItem">
+ Ausgewähltes Objekt löschen?
+ </string>
+ <string name="EmptyOutfitText">
+ Keine Objekte in diesem Outfit
+ </string>
+ <string name="ExternalEditorNotSet">
+ Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus
+ </string>
+ <string name="ExternalEditorNotFound">
+ Angegebener externer Editor nicht gefunden.
Setzen Sie den Editorpfad in Anführungszeichen
-(z. B. &quot;/pfad/editor&quot; &quot;%s&quot;).</string>
- <string name="ExternalEditorCommandParseError">Fehler beim Parsen des externen Editorbefehls.</string>
- <string name="ExternalEditorFailedToRun">Externer Editor konnte nicht ausgeführt werden.</string>
- <string name="TranslationFailed">Übersetzung fehlgeschlagen: [REASON]</string>
- <string name="TranslationResponseParseError">Fehler beim Parsen der Übersetzungsantwort.</string>
- <string name="Esc">Esc</string>
- <string name="Space">Space</string>
- <string name="Enter">Enter</string>
- <string name="Tab">Tab</string>
- <string name="Ins">Ins</string>
- <string name="Del">Del</string>
- <string name="Backsp">Backsp</string>
- <string name="Shift">Shift</string>
- <string name="Ctrl">Ctrl</string>
- <string name="Alt">Alt</string>
- <string name="CapsLock">CapsLock</string>
- <string name="Home">Zuhause</string>
- <string name="End">End</string>
- <string name="PgUp">PgUp</string>
- <string name="PgDn">PgDn</string>
- <string name="F1">F1</string>
- <string name="F2">F2</string>
- <string name="F3">F3</string>
- <string name="F4">F4</string>
- <string name="F5">F5</string>
- <string name="F6">F6</string>
- <string name="F7">F7</string>
- <string name="F8">F8</string>
- <string name="F9">F9</string>
- <string name="F10">F10</string>
- <string name="F11">F11</string>
- <string name="F12">F12</string>
- <string name="Add">Addieren</string>
- <string name="Subtract">Subtrahieren</string>
- <string name="Multiply">Multiplizieren</string>
- <string name="Divide">Dividieren</string>
- <string name="PAD_DIVIDE">PAD_DIVIDE</string>
- <string name="PAD_LEFT">PAD_LEFT</string>
- <string name="PAD_RIGHT">PAD_RIGHT</string>
- <string name="PAD_DOWN">PAD_DOWN</string>
- <string name="PAD_UP">PAD_UP</string>
- <string name="PAD_HOME">PAD_HOME</string>
- <string name="PAD_END">PAD_END</string>
- <string name="PAD_PGUP">PAD_PGUP</string>
- <string name="PAD_PGDN">PAD_PGDN</string>
- <string name="PAD_CENTER">PAD_CENTER</string>
- <string name="PAD_INS">PAD_INS</string>
- <string name="PAD_DEL">PAD_DEL</string>
- <string name="PAD_Enter">PAD_Enter</string>
- <string name="PAD_BUTTON0">PAD_BUTTON0</string>
- <string name="PAD_BUTTON1">PAD_BUTTON1</string>
- <string name="PAD_BUTTON2">PAD_BUTTON2</string>
- <string name="PAD_BUTTON3">PAD_BUTTON3</string>
- <string name="PAD_BUTTON4">PAD_BUTTON4</string>
- <string name="PAD_BUTTON5">PAD_BUTTON5</string>
- <string name="PAD_BUTTON6">PAD_BUTTON6</string>
- <string name="PAD_BUTTON7">PAD_BUTTON7</string>
- <string name="PAD_BUTTON8">PAD_BUTTON8</string>
- <string name="PAD_BUTTON9">PAD_BUTTON9</string>
- <string name="PAD_BUTTON10">PAD_BUTTON10</string>
- <string name="PAD_BUTTON11">PAD_BUTTON11</string>
- <string name="PAD_BUTTON12">PAD_BUTTON12</string>
- <string name="PAD_BUTTON13">PAD_BUTTON13</string>
- <string name="PAD_BUTTON14">PAD_BUTTON14</string>
- <string name="PAD_BUTTON15">PAD_BUTTON15</string>
- <string name="-">-</string>
- <string name="=">=</string>
- <string name="`">`</string>
- <string name=";">;</string>
- <string name="[">[</string>
- <string name="]">]</string>
- <string name="\">\</string>
- <string name="0">0</string>
- <string name="1">1</string>
- <string name="2">2</string>
- <string name="3">3</string>
- <string name="4">4</string>
- <string name="5">5</string>
- <string name="6">6</string>
- <string name="7">7</string>
- <string name="8">8</string>
- <string name="9">9</string>
- <string name="A">A</string>
- <string name="B">B</string>
- <string name="C">C</string>
- <string name="D">D</string>
- <string name="E">E</string>
- <string name="F">F</string>
- <string name="G">G</string>
- <string name="H">H</string>
- <string name="I">I</string>
- <string name="J">J</string>
- <string name="K">K</string>
- <string name="L">L</string>
- <string name="M">M</string>
- <string name="N">N</string>
- <string name="O">O</string>
- <string name="P">P</string>
- <string name="Q">Q</string>
- <string name="R">R</string>
- <string name="S">S</string>
- <string name="T">T</string>
- <string name="U">U</string>
- <string name="V">V</string>
- <string name="W">W</string>
- <string name="X">X</string>
- <string name="Y">Y</string>
- <string name="Z">Z</string>
- <string name="BeaconParticle">Partikel-Beacons werden angezeigt (blau)</string>
- <string name="BeaconPhysical">Beacons für physische Objekte werden angezeigt (grün)</string>
- <string name="BeaconScripted">Beacons für Skriptobjekte werden angezeigt (rot)</string>
- <string name="BeaconScriptedTouch">Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot)</string>
- <string name="BeaconSound">Sound-Beacons werden angezeigt (gelb)</string>
- <string name="BeaconMedia">Medien-Beacons werden angezeigt (weiß)</string>
- <string name="BeaconSun">Sonnenrichtungs-Beacon ansehen (orange)</string>
- <string name="BeaconMoon">Mondrichtungs-Beacon ansehen (lila)</string>
- <string name="ParticleHiding">Partikel werden ausgeblendet</string>
- <string name="Command_AboutLand_Label">Landinformationen</string>
- <string name="Command_Appearance_Label">Aussehen</string>
- <string name="Command_Avatar_Label">Avatar</string>
- <string name="Command_Build_Label">Bauen</string>
- <string name="Command_Chat_Label">Chat</string>
- <string name="Command_Conversations_Label">Unterhaltungen</string>
- <string name="Command_Compass_Label">Kompass</string>
- <string name="Command_Destinations_Label">Ziele</string>
- <string name="Command_Environments_Label">Meine Umgebungen</string>
- <string name="Command_Facebook_Label">Facebook</string>
- <string name="Command_Flickr_Label">Flickr</string>
- <string name="Command_Gestures_Label">Gesten</string>
- <string name="Command_Grid_Status_Label">Grid-Status</string>
- <string name="Command_HowTo_Label">Infos</string>
- <string name="Command_Inventory_Label">Inventar</string>
- <string name="Command_Map_Label">Karte</string>
- <string name="Command_Marketplace_Label">Marktplatz</string>
- <string name="Command_MarketplaceListings_Label">Marktplatz</string>
- <string name="Command_MiniMap_Label">Minikarte</string>
- <string name="Command_Move_Label">Gehen / Rennen / Fliegen</string>
- <string name="Command_Outbox_Label">Händler-Outbox</string>
- <string name="Command_People_Label">Leute</string>
- <string name="Command_Picks_Label">Auswahlen</string>
- <string name="Command_Places_Label">Orte</string>
- <string name="Command_Preferences_Label">Einstellungen</string>
- <string name="Command_Profile_Label">Profil</string>
- <string name="Command_Report_Abuse_Label">Missbrauch melden</string>
- <string name="Command_Search_Label">Suchen</string>
- <string name="Command_Snapshot_Label">Foto</string>
- <string name="Command_Speak_Label">Sprechen</string>
- <string name="Command_Twitter_Label">Twitter</string>
- <string name="Command_View_Label">Kamerasteuerungen</string>
- <string name="Command_Voice_Label">Voice-Einstellungen</string>
- <string name="Command_AboutLand_Tooltip">Informationen zu dem von Ihnen besuchten Land</string>
- <string name="Command_Appearance_Tooltip">Avatar ändern</string>
- <string name="Command_Avatar_Tooltip">Kompletten Avatar auswählen</string>
- <string name="Command_Build_Tooltip">Objekte bauen und Terrain umformen</string>
- <string name="Command_Chat_Tooltip">Mit Leuten in der Nähe chatten</string>
- <string name="Command_Conversations_Tooltip">Mit allen unterhalten</string>
- <string name="Command_Compass_Tooltip">Kompass</string>
- <string name="Command_Destinations_Tooltip">Ziele von Interesse</string>
- <string name="Command_Environments_Tooltip">Meine Umgebungen</string>
- <string name="Command_Facebook_Tooltip">Auf Facebook posten</string>
- <string name="Command_Flickr_Tooltip">Auf Flickr hochladen</string>
- <string name="Command_Gestures_Tooltip">Gesten für Ihren Avatar</string>
- <string name="Command_Grid_Status_Tooltip">Aktuellen Grid-Status anzeigen</string>
- <string name="Command_HowTo_Tooltip">Wie führe ich gängige Aufgaben aus?</string>
- <string name="Command_Inventory_Tooltip">Ihr Eigentum anzeigen und benutzen</string>
- <string name="Command_Map_Tooltip">Weltkarte</string>
- <string name="Command_Marketplace_Tooltip">Einkaufen gehen</string>
- <string name="Command_MarketplaceListings_Tooltip">Ihre Kreation verkaufen</string>
- <string name="Command_MiniMap_Tooltip">Leute in der Nähe anzeigen</string>
- <string name="Command_Move_Tooltip">Ihren Avatar bewegen</string>
- <string name="Command_Outbox_Tooltip">Artikel zum Verkauf in den Marktplatz übertragen</string>
- <string name="Command_People_Tooltip">Freunde, Gruppen und Leute in der Nähe</string>
- <string name="Command_Picks_Tooltip">Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen</string>
- <string name="Command_Places_Tooltip">Von Ihnen gespeicherte Orte</string>
- <string name="Command_Preferences_Tooltip">Einstellungen</string>
- <string name="Command_Profile_Tooltip">Ihr Profil bearbeiten oder anzeigen</string>
- <string name="Command_Report_Abuse_Tooltip">Missbrauch melden</string>
- <string name="Command_Search_Tooltip">Orte, Veranstaltungen, Leute finden</string>
- <string name="Command_Snapshot_Tooltip">Foto aufnehmen</string>
- <string name="Command_Speak_Tooltip">Über Ihr Mikrofon mit Leuten in der Nähe sprechen</string>
- <string name="Command_Twitter_Tooltip">Twitter</string>
- <string name="Command_View_Tooltip">Kamerawinkel ändern</string>
- <string name="Command_Voice_Tooltip">Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL</string>
- <string name="Toolbar_Bottom_Tooltip">gegenwärtig in der unteren Symbolleiste</string>
- <string name="Toolbar_Left_Tooltip">gegenwärtig in der linken Symbolleiste</string>
- <string name="Toolbar_Right_Tooltip">gegenwärtig in der rechten Symbolleiste</string>
- <string name="Retain%">% zurückbehalten</string>
- <string name="Detail">Details</string>
- <string name="Better Detail">Bessere Details</string>
- <string name="Surface">Oberfläche</string>
- <string name="Solid">Fest</string>
- <string name="Wrap">Wickeln</string>
- <string name="Preview">Vorschau</string>
- <string name="Normal">Normal</string>
- <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string>
- <string name="Pathfinding_Object_Attr_None">Keine</string>
- <string name="Pathfinding_Object_Attr_Permanent">Wirkt sich auf Navmesh aus</string>
- <string name="Pathfinding_Object_Attr_Character">Figur</string>
- <string name="Pathfinding_Object_Attr_MultiSelect">(mehrere)</string>
- <string name="snapshot_quality_very_low">Sehr niedrig</string>
- <string name="snapshot_quality_low">Niedrig</string>
- <string name="snapshot_quality_medium">Mittel</string>
- <string name="snapshot_quality_high">Hoch</string>
- <string name="snapshot_quality_very_high">Sehr hoch</string>
- <string name="TeleportMaturityExceeded">Der Einwohner kann diese Region nicht besuchen.</string>
- <string name="UserDictionary">[Benutzer]</string>
- <string name="experience_tools_experience">Erlebnis</string>
- <string name="ExperienceNameNull">(kein Erlebnis)</string>
- <string name="ExperienceNameUntitled">(unbenanntes Erlebnis)</string>
- <string name="Land-Scope">Landumfang</string>
- <string name="Grid-Scope">Gridumfang</string>
- <string name="Allowed_Experiences_Tab">ZULäSSIG</string>
- <string name="Blocked_Experiences_Tab">BLOCKIERT</string>
- <string name="Contrib_Experiences_Tab">CONTRIBUTOR</string>
- <string name="Admin_Experiences_Tab">ADMIN</string>
- <string name="Recent_Experiences_Tab">AKTUELL</string>
- <string name="Owned_Experiences_Tab">EIGENE</string>
- <string name="ExperiencesCounter">([EXPERIENCES], max. [MAXEXPERIENCES])</string>
- <string name="ExperiencePermission1">Ihre Steuerungen übernehmen</string>
- <string name="ExperiencePermission3">Animationen Ihres Avatars auslösen</string>
- <string name="ExperiencePermission4">an Ihren Avatar anhängen</string>
- <string name="ExperiencePermission9">Ihre Kamera vorfolgen</string>
- <string name="ExperiencePermission10">Ihre Kamera steuern</string>
- <string name="ExperiencePermission11">Sie teleportieren</string>
- <string name="ExperiencePermission12">automatisch Erlebnisberechtigungen akzeptieren</string>
- <string name="ExperiencePermission16">ihren Avatar zwingen, sich zu setzen</string>
- <string name="ExperiencePermission17">Ändern Ihrer Umgebungseinstellungen</string>
- <string name="ExperiencePermissionShortUnknown">unbekannten Vorgang durchführen: [Permission]</string>
- <string name="ExperiencePermissionShort1">Steuerungen übernehmen</string>
- <string name="ExperiencePermissionShort3">Animationen auslösen</string>
- <string name="ExperiencePermissionShort4">Anhängen</string>
- <string name="ExperiencePermissionShort9">Kamera verfolgen</string>
- <string name="ExperiencePermissionShort10">Kamera steuern</string>
- <string name="ExperiencePermissionShort11">Teleportieren</string>
- <string name="ExperiencePermissionShort12">Berechtigung</string>
- <string name="ExperiencePermissionShort16">Sitzen</string>
- <string name="ExperiencePermissionShort17">Umgebung</string>
- <string name="logging_calls_disabled_log_empty">Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ &gt; „Chat“.</string>
- <string name="logging_calls_disabled_log_not_empty">Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ &gt; „Chat“.</string>
- <string name="logging_calls_enabled_log_empty">Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden.</string>
- <string name="loading_chat_logs">Laden...</string>
- <string name="na">Nicht zutreffend</string>
- <string name="preset_combo_label">-Leere Liste-</string>
- <string name="Default">Standard</string>
- <string name="none_paren_cap">(Keine)</string>
- <string name="no_limit">Keine Begrenzung</string>
- <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">Die Physikform enthält Dreiecke, die zu klein sind. Versuchen Sie, das Physikmodell zu vereinfachen.</string>
- <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">Die Physikform enthält ungültige Bestätigungsdaten. Versuchen Sie, das Physikmodell zu korrigieren.</string>
- <string name="Mav_Details_MAV_UNKNOWN_VERSION">Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest.</string>
- <string name="couldnt_resolve_host">Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen
+(z. B. "/pfad/editor" "%s").
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Fehler beim Parsen des externen Editorbefehls.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Externer Editor konnte nicht ausgeführt werden.
+ </string>
+ <string name="TranslationFailed">
+ Übersetzung fehlgeschlagen: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Fehler beim Parsen der Übersetzungsantwort.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Zuhause
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Addieren
+ </string>
+ <string name="Subtract">
+ Subtrahieren
+ </string>
+ <string name="Multiply">
+ Multiplizieren
+ </string>
+ <string name="Divide">
+ Dividieren
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Partikel-Beacons werden angezeigt (blau)
+ </string>
+ <string name="BeaconPhysical">
+ Beacons für physische Objekte werden angezeigt (grün)
+ </string>
+ <string name="BeaconScripted">
+ Beacons für Skriptobjekte werden angezeigt (rot)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot)
+ </string>
+ <string name="BeaconSound">
+ Sound-Beacons werden angezeigt (gelb)
+ </string>
+ <string name="BeaconMedia">
+ Medien-Beacons werden angezeigt (weiß)
+ </string>
+ <string name="BeaconSun">
+ Sonnenrichtungs-Beacon ansehen (orange)
+ </string>
+ <string name="BeaconMoon">
+ Mondrichtungs-Beacon ansehen (lila)
+ </string>
+ <string name="ParticleHiding">
+ Partikel werden ausgeblendet
+ </string>
+ <string name="Command_AboutLand_Label">
+ Landinformationen
+ </string>
+ <string name="Command_Appearance_Label">
+ Aussehen
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Bauen
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Conversations_Label">
+ Unterhaltungen
+ </string>
+ <string name="Command_Compass_Label">
+ Kompass
+ </string>
+ <string name="Command_Destinations_Label">
+ Ziele
+ </string>
+ <string name="Command_Environments_Label">
+ Meine Umgebungen
+ </string>
+ <string name="Command_Facebook_Label">
+ Facebook
+ </string>
+ <string name="Command_Flickr_Label">
+ Flickr
+ </string>
+ <string name="Command_Gestures_Label">
+ Gesten
+ </string>
+ <string name="Command_Grid_Status_Label">
+ Grid-Status
+ </string>
+ <string name="Command_HowTo_Label">
+ Infos
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventar
+ </string>
+ <string name="Command_Map_Label">
+ Karte
+ </string>
+ <string name="Command_Marketplace_Label">
+ Marktplatz
+ </string>
+ <string name="Command_MarketplaceListings_Label">
+ Marktplatz
+ </string>
+ <string name="Command_MiniMap_Label">
+ Minikarte
+ </string>
+ <string name="Command_Move_Label">
+ Gehen / Rennen / Fliegen
+ </string>
+ <string name="Command_Outbox_Label">
+ Händler-Outbox
+ </string>
+ <string name="Command_People_Label">
+ Leute
+ </string>
+ <string name="Command_Picks_Label">
+ Auswahlen
+ </string>
+ <string name="Command_Places_Label">
+ Orte
+ </string>
+ <string name="Command_Preferences_Label">
+ Einstellungen
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Report_Abuse_Label">
+ Missbrauch melden
+ </string>
+ <string name="Command_Search_Label">
+ Suchen
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Sprechen
+ </string>
+ <string name="Command_Twitter_Label">
+ Twitter
+ </string>
+ <string name="Command_View_Label">
+ Kamerasteuerungen
+ </string>
+ <string name="Command_Voice_Label">
+ Voice-Einstellungen
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informationen zu dem von Ihnen besuchten Land
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Avatar ändern
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Kompletten Avatar auswählen
+ </string>
+ <string name="Command_Build_Tooltip">
+ Objekte bauen und Terrain umformen
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Mit Leuten in der Nähe chatten
+ </string>
+ <string name="Command_Conversations_Tooltip">
+ Mit allen unterhalten
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Kompass
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Ziele von Interesse
+ </string>
+ <string name="Command_Environments_Tooltip">
+ Meine Umgebungen
+ </string>
+ <string name="Command_Facebook_Tooltip">
+ Auf Facebook posten
+ </string>
+ <string name="Command_Flickr_Tooltip">
+ Auf Flickr hochladen
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gesten für Ihren Avatar
+ </string>
+ <string name="Command_Grid_Status_Tooltip">
+ Aktuellen Grid-Status anzeigen
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Wie führe ich gängige Aufgaben aus?
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Ihr Eigentum anzeigen und benutzen
+ </string>
+ <string name="Command_Map_Tooltip">
+ Weltkarte
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Einkaufen gehen
+ </string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Ihre Kreation verkaufen
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Leute in der Nähe anzeigen
+ </string>
+ <string name="Command_Move_Tooltip">
+ Ihren Avatar bewegen
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Artikel zum Verkauf in den Marktplatz übertragen
+ </string>
+ <string name="Command_People_Tooltip">
+ Freunde, Gruppen und Leute in der Nähe
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen
+ </string>
+ <string name="Command_Places_Tooltip">
+ Von Ihnen gespeicherte Orte
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Einstellungen
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Ihr Profil bearbeiten oder anzeigen
+ </string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Missbrauch melden
+ </string>
+ <string name="Command_Search_Tooltip">
+ Orte, Veranstaltungen, Leute finden
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Foto aufnehmen
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Über Ihr Mikrofon mit Leuten in der Nähe sprechen
+ </string>
+ <string name="Command_Twitter_Tooltip">
+ Twitter
+ </string>
+ <string name="Command_View_Tooltip">
+ Kamerawinkel ändern
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ gegenwärtig in der unteren Symbolleiste
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ gegenwärtig in der linken Symbolleiste
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ gegenwärtig in der rechten Symbolleiste
+ </string>
+ <string name="Retain%">
+ % zurückbehalten
+ </string>
+ <string name="Detail">
+ Details
+ </string>
+ <string name="Better Detail">
+ Bessere Details
+ </string>
+ <string name="Surface">
+ Oberfläche
+ </string>
+ <string name="Solid">
+ Fest
+ </string>
+ <string name="Wrap">
+ Wickeln
+ </string>
+ <string name="Preview">
+ Vorschau
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="Pathfinding_Wiki_URL">
+ http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </string>
+ <string name="Pathfinding_Object_Attr_None">
+ Keine
+ </string>
+ <string name="Pathfinding_Object_Attr_Permanent">
+ Wirkt sich auf Navmesh aus
+ </string>
+ <string name="Pathfinding_Object_Attr_Character">
+ Figur
+ </string>
+ <string name="Pathfinding_Object_Attr_MultiSelect">
+ (mehrere)
+ </string>
+ <string name="snapshot_quality_very_low">
+ Sehr niedrig
+ </string>
+ <string name="snapshot_quality_low">
+ Niedrig
+ </string>
+ <string name="snapshot_quality_medium">
+ Mittel
+ </string>
+ <string name="snapshot_quality_high">
+ Hoch
+ </string>
+ <string name="snapshot_quality_very_high">
+ Sehr hoch
+ </string>
+ <string name="TeleportMaturityExceeded">
+ Der Einwohner kann diese Region nicht besuchen.
+ </string>
+ <string name="UserDictionary">
+ [Benutzer]
+ </string>
+ <string name="experience_tools_experience">
+ Erlebnis
+ </string>
+ <string name="ExperienceNameNull">
+ (kein Erlebnis)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (unbenanntes Erlebnis)
+ </string>
+ <string name="Land-Scope">
+ Landumfang
+ </string>
+ <string name="Grid-Scope">
+ Gridumfang
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ ZULäSSIG
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOCKIERT
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ CONTRIBUTOR
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ADMIN
+ </string>
+ <string name="Recent_Experiences_Tab">
+ AKTUELL
+ </string>
+ <string name="Owned_Experiences_Tab">
+ EIGENE
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], max. [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ Ihre Steuerungen übernehmen
+ </string>
+ <string name="ExperiencePermission3">
+ Animationen Ihres Avatars auslösen
+ </string>
+ <string name="ExperiencePermission4">
+ an Ihren Avatar anhängen
+ </string>
+ <string name="ExperiencePermission9">
+ Ihre Kamera vorfolgen
+ </string>
+ <string name="ExperiencePermission10">
+ Ihre Kamera steuern
+ </string>
+ <string name="ExperiencePermission11">
+ Sie teleportieren
+ </string>
+ <string name="ExperiencePermission12">
+ automatisch Erlebnisberechtigungen akzeptieren
+ </string>
+ <string name="ExperiencePermission16">
+ ihren Avatar zwingen, sich zu setzen
+ </string>
+ <string name="ExperiencePermission17">
+ Ändern Ihrer Umgebungseinstellungen
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ unbekannten Vorgang durchführen: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Steuerungen übernehmen
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Animationen auslösen
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Anhängen
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Kamera verfolgen
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Kamera steuern
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teleportieren
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Berechtigung
+ </string>
+ <string name="ExperiencePermissionShort16">
+ Sitzen
+ </string>
+ <string name="ExperiencePermissionShort17">
+ Umgebung
+ </string>
+ <string name="logging_calls_disabled_log_empty">
+ Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ &gt; „Chat“.
+ </string>
+ <string name="logging_calls_disabled_log_not_empty">
+ Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ &gt; „Chat“.
+ </string>
+ <string name="logging_calls_enabled_log_empty">
+ Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden.
+ </string>
+ <string name="loading_chat_logs">
+ Laden...
+ </string>
+ <string name="na">
+ Nicht zutreffend
+ </string>
+ <string name="preset_combo_label">
+ -Leere Liste-
+ </string>
+ <string name="Default">
+ Standard
+ </string>
+ <string name="none_paren_cap">
+ (Keine)
+ </string>
+ <string name="no_limit">
+ Keine Begrenzung
+ </string>
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ Die Physikform enthält Dreiecke, die zu klein sind. Versuchen Sie, das Physikmodell zu vereinfachen.
+ </string>
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ Die Physikform enthält ungültige Bestätigungsdaten. Versuchen Sie, das Physikmodell zu korrigieren.
+ </string>
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest.
+ </string>
+ <string name="couldnt_resolve_host">
+ Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen
Sie bitte, ob Sie die Website www.secondlife.com aufrufen können. Wenn Sie die
Website aufrufen können, jedoch weiterhin diese Fehlermeldung erhalten,
-besuchen Sie bitte den Support-Bereich und melden Sie das Problem.</string>
- <string name="ssl_peer_certificate">Der Anmeldeserver konnte sich nicht per SSL verifizieren.
+besuchen Sie bitte den Support-Bereich und melden Sie das Problem.
+ </string>
+ <string name="ssl_peer_certificate">
+ Der Anmeldeserver konnte sich nicht per SSL verifizieren.
Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen
Sie bitte den Support-Bereich der Website Secondlife.com
-und melden Sie das Problem.</string>
- <string name="ssl_connect_error">Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer.
+und melden Sie das Problem.
+ </string>
+ <string name="ssl_connect_error">
+ Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer.
Bitte vergewissern Sie sich, dass Datum und Uhrzeit in der Systemsteuerung korrekt
eingestellt sind. Überprüfen Sie außerdem, ob Ihre Netzwerk- und Firewall-Einstellungen
korrekt sind. Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen Sie bitte den
Support-Bereich der Website Secondlife.com und melden Sie das Problem.
-[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base]</string>
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml
index 9f8a7a8045..1ed09f24b5 100644
--- a/indra/newview/skins/default/xui/de/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/de/teleport_strings.xml
@@ -1,41 +1,97 @@
<?xml version="1.0" ?>
<teleport_messages>
<message_set name="errors">
- <message name="invalid_tport">Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].</message>
- <message name="invalid_region_handoff">Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können.
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].</message>
- <message name="blocked_tport">Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal.
-Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an.</message>
- <message name="nolandmark_tport">Das System konnte das Landmarken-Ziel nicht finden.</message>
- <message name="timeout_tport">Das System konnte keine Teleport-Verbindung herstellen.
-Versuchen Sie es später noch einmal.</message>
- <message name="NoHelpIslandTP">Sie können nicht zurück nach Welcome Island teleportieren.
-Gehen Sie zu „Welcome Island Public“, um das Tutorial zu wiederholen.</message>
- <message name="noaccess_tport">Sie haben leider keinen Zugang zu diesem Teleport-Ziel.</message>
- <message name="missing_attach_tport">Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen.</message>
- <message name="too_many_uploads_tport">Die Asset-Warteschlange in dieser Region ist zurzeit überlastet.
-Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region.</message>
- <message name="expired_tport">Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.</message>
- <message name="expired_region_handoff">Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.</message>
- <message name="no_host">Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut.</message>
- <message name="no_inventory_host">Das Inventarsystem ist zurzeit nicht verfügbar.</message>
- <message name="MustGetAgeRegion">Sie müssen mindestens 18 Jahre alt sein, um diese Region betreten zu können.</message>
- <message name="RegionTPSpecialUsageBlocked">Betreten der Region nicht gestattet. „[REGION_NAME]“ ist eine Region für Geschicklichkeitsspiele. Der Zutritt ist Einwohnern vorbehalten, die bestimmte Kriterien erfüllen. Weitere Details finden Sie unter [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].</message>
- <message name="preexisting_tport">Entschuldigung, aber das System konnte deinen Teleport nicht starten. Versuche es bitte in ein paar Minuten noch einmal.</message>
+ <message name="invalid_tport">
+ Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal.
+Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an.
+ </message>
+ <message name="nolandmark_tport">
+ Das System konnte das Landmarken-Ziel nicht finden.
+ </message>
+ <message name="timeout_tport">
+ Das System konnte keine Teleport-Verbindung herstellen.
+Versuchen Sie es später noch einmal.
+ </message>
+ <message name="NoHelpIslandTP">
+ Sie können nicht zurück nach Welcome Island teleportieren.
+Gehen Sie zu „Welcome Island Public“, um das Tutorial zu wiederholen.
+ </message>
+ <message name="noaccess_tport">
+ Sie haben leider keinen Zugang zu diesem Teleport-Ziel.
+ </message>
+ <message name="missing_attach_tport">
+ Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen.
+ </message>
+ <message name="too_many_uploads_tport">
+ Die Asset-Warteschlange in dieser Region ist zurzeit überlastet.
+Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region.
+ </message>
+ <message name="expired_tport">
+ Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
+ </message>
+ <message name="expired_region_handoff">
+ Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
+ </message>
+ <message name="no_host">
+ Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut.
+ </message>
+ <message name="no_inventory_host">
+ Das Inventarsystem ist zurzeit nicht verfügbar.
+ </message>
+ <message name="MustGetAgeRegion">
+ Sie müssen mindestens 18 Jahre alt sein, um diese Region betreten zu können.
+ </message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Betreten der Region nicht gestattet. „[REGION_NAME]“ ist eine Region für Geschicklichkeitsspiele. Der Zutritt ist Einwohnern vorbehalten, die bestimmte Kriterien erfüllen. Weitere Details finden Sie unter [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ </message>
+ <message name="preexisting_tport">
+ Entschuldigung, aber das System konnte deinen Teleport nicht starten. Versuche es bitte in ein paar Minuten noch einmal.
+ </message>
</message_set>
<message_set name="progress">
- <message name="sending_dest">Transport zum Ziel.</message>
- <message name="redirecting">Weiterleitung an anderes Ziel.</message>
- <message name="relaying">Weiterleitung zum Ziel.</message>
- <message name="sending_home">Zuhause-Position wird ermittelt.</message>
- <message name="sending_landmark">Landmarken-Position wird ermittelt.</message>
- <message name="completing">Teleport wird abgeschlossen.</message>
- <message name="completed_from">Teleport aus [T_SLURL] wurde erfolgreich abgeschlossen.</message>
- <message name="resolving">Ziel wird ermittelt.</message>
- <message name="contacting">Verbindung zu neuer Region.</message>
- <message name="arriving">Ziel erreicht...</message>
- <message name="requesting">Teleport wird initialisiert...</message>
- <message name="pending">Anstehender Teleport...</message>
+ <message name="sending_dest">
+ Transport zum Ziel.
+ </message>
+ <message name="redirecting">
+ Weiterleitung an anderes Ziel.
+ </message>
+ <message name="relaying">
+ Weiterleitung zum Ziel.
+ </message>
+ <message name="sending_home">
+ Zuhause-Position wird ermittelt.
+ </message>
+ <message name="sending_landmark">
+ Landmarken-Position wird ermittelt.
+ </message>
+ <message name="completing">
+ Teleport wird abgeschlossen.
+ </message>
+ <message name="completed_from">
+ Teleport aus [T_SLURL] wurde erfolgreich abgeschlossen.
+ </message>
+ <message name="resolving">
+ Ziel wird ermittelt.
+ </message>
+ <message name="contacting">
+ Verbindung zu neuer Region.
+ </message>
+ <message name="arriving">
+ Ziel erreicht...
+ </message>
+ <message name="requesting">
+ Teleport wird initialisiert...
+ </message>
+ <message name="pending">
+ Anstehender Teleport...
+ </message>
</message_set>
</teleport_messages>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 89c6e41a85..9c932ac034 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -81,36 +81,30 @@
top="0"
width="435"
wrap="true">
-Megapahit is brought to you by (in order of appearance):
+Megapahit is brought to you by:
</text>
<text_editor
enabled="false"
+ font="Monospace"
follows="top|left"
- height="245"
+ height="200"
bg_readonly_color="Transparent"
left="5"
text_color="LtGray"
max_length="65536"
top_pad="5"
- width="545"
- word_wrap="true">
-Erik Kundiman
-LinneNoir
-milo (observeur)
-Fritigern Gothly
-Kou Ayashi
-Hadet Sonnenkern
-Remmy (Secret Foxtail)
-Eris Ravenwood
-gwigz (nya)
-EmilyAmiee
-Bavid Dailey
-Aria (Tashia Redrose)
-Cate (32a)
-Hiroo Ono
-Melodey
-Keysin (scoutkeysin)
-Yikes Lopez
+ width="475"
+ word_wrap="false">
+Erik Kundiman LinneNoir
+milo (observeur) Fritigern Gothly
+Kou Ayashi Hadet Sonnenkern
+Remmy (Secret Foxtail) Eris Ravenwood
+gwigz (nya) EmilyAmiee
+Bavid Dailey Aria (Tashia Redrose)
+Cate (32a) Hiroo Ono
+Melodey Keysin (scoutkeysin)
+Padoria Teuden ~ ( ^-^ ) ~ (cutie_qu)
+Markus Teuden
</text_editor>
<text
follows="top|left"
@@ -121,7 +115,7 @@ Yikes Lopez
top_pad="5"
width="465"
wrap="true">
-with special thanks to (in order of appearance):
+with special thanks to:
</text>
<text_editor
enabled="false"
@@ -135,12 +129,13 @@ with special thanks to (in order of appearance):
top_pad="5"
width="450"
word_wrap="true">
-Chorazin Allen and Nicky Perian for involving Erik Kundiman in viewer developments;
-JenniWindrider for the pre-MP donation that was used to help build the website;
-Vir Linden for making it possible for the project to have a place (in every sense of the word) in SL;
-nutsobvious for the early testing and video proof;
-Soft Linden for the security testing; and
-Kyle Linden for selling TPV parcel 2 to Erik Kundiman at L$0 price.
+Chorazin Allen and Nicky Perian - Involving Erik Kundiman in viewer development
+JenniWindrider - Pre-MP donation used to help build the website
+Vir Linden - Making it possible for the project to have a place in SL
+nutsobvious - Early testing and video proof
+Soft Linden - Security testing
+Kyle Linden - Giving TPV parcel 2 to Erik Kundiman
+Signal Linden - Opening opportunities for Megapahit to contribute more
</text_editor>
</panel>
</accordion_tab>
@@ -196,7 +191,7 @@ Dummy Name replaced at run time
<text_editor
enabled="false"
follows="left|top"
- height="375"
+ height="450"
bg_readonly_color="Transparent"
left="5"
text_color="LtGray"
@@ -205,27 +200,51 @@ Dummy Name replaced at run time
top="5"
width="465"
word_wrap="true">
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
- APR Copyright (C) 2011 The Apache Software Foundation
- Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
- cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
- expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
- FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
- GL Copyright (C) 1999-2004 Brian Paul.
- jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
- llphysicsextensions_tpv Copyright (c) 2010, Linden Research, Inc.
- meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine
- ogg/vorbis Copyright (C) 2002, Xiphophorus
- OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
- PCRE Copyright (c) 1997-2012 University of Cambridge
- SDL Copyright (C) 1997-2024 Sam Lantinga
- SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xxHash Copyright (C) 2012-2020 Yann Collet.
- zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
-
- This software contains source code provided by NVIDIA Corporation.
-
- All rights reserved. See licenses.txt for details.
+3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+
+APR Copyright (C) 2011 The Apache Software Foundation
+
+Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
+
+cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
+
+Discord Social SDK Copyright (c) 2025, Discord, Inc.
+
+expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+
+FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
+
+GL Copyright (C) 1999-2004 Brian Paul.
+
+jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+
+llphysicsextensions_tpv Copyright (c) 2010, Linden Research, Inc.
+
+Megapahit Copyright (c) 2023-2026 Megapahit.
+
+meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine
+
+ogg/vorbis Copyright (C) 2002, Xiphophorus
+
+OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
+
+PCRE Copyright (c) 1997-2012 University of Cambridge
+
+SDL Copyright (C) 1997-2024 Sam Lantinga
+
+sse2neon Copyright (c) 2015-2026 SSE2NEON Contributors.
+
+SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+
+V-HACD Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com)
+
+xxHash Copyright (C) 2012-2020 Yann Collet.
+
+zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
+
+This software contains source code provided by NVIDIA Corporation.
+
+All rights reserved. See licenses.txt for details.
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 508aba6ae1..c5b42b6dae 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -125,6 +125,9 @@
name="no_selection_text">
No parcel selected.
</panel.string>
+ <panel.string name="time_stamp_template_ampm">
+ [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt]
+ </panel.string>
<panel.string name="time_stamp_template">
[wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
</panel.string>
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml b/indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml
new file mode 100644
index 0000000000..795d642755
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ positioning="cascading"
+ legacy_header_height="225"
+ can_minimize="true"
+ can_close="true"
+ can_resize="false"
+ min_height="438"
+ min_width="530"
+ height="438"
+ layout="topleft"
+ name="Avatar Welcome Pack"
+ single_instance="true"
+ save_rect="true"
+ save_visibility="true"
+ title="AVATAR WELCOME PACK"
+ width="530">
+ <web_browser
+ top="25"
+ height="438"
+ width="530"
+ follows="all"
+ name="avatar_picker_contents"
+ trusted_content="true"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml b/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml
new file mode 100644
index 0000000000..bbad99f932
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ name="chat_mention_picker"
+ title="CHOOSE RESIDENT"
+ single_instance="true"
+ can_minimize="false"
+ can_tear_off="false"
+ can_resize="true"
+ auto_close="true"
+ layout="topleft"
+ min_width="250"
+ chrome="true"
+ height="125"
+ width="310">
+ <avatar_list
+ allow_select="true"
+ follows="all"
+ height="120"
+ width="306"
+ ignore_online_status="true"
+ layout="topleft"
+ left="3"
+ keep_one_selected="true"
+ multi_select="false"
+ show_info_btn="false"
+ show_profile_btn="false"
+ show_speaking_indicator="false"
+ name="avatar_list"
+ right="-1"
+ top="2" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml
index 9403d58441..a083683c23 100644
--- a/indra/newview/skins/default/xui/en/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/en/floater_inspect.xml
@@ -12,6 +12,10 @@
title="INSPECT OBJECTS"
width="400">
<floater.string
+ name="timeStampAMPM">
+ [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt]
+ </floater.string>
+ <floater.string
name="timeStamp">
[wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
</floater.string>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
deleted file mode 100644
index 6c3214a76d..0000000000
--- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,421 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater
- legacy_header_height="18"
- height="340"
- layout="topleft"
- name="item properties"
- help_topic="item_properties"
- save_rect="true"
- title="INVENTORY ITEM PROPERTIES"
- width="350">
- <floater.string
- name="unknown">
- (unknown)
- </floater.string>
- <floater.string
- name="public">
- (public)
- </floater.string>
- <floater.string
- name="you_can">
- You can:
- </floater.string>
- <floater.string
- name="owner_can">
- Owner can:
- </floater.string>
- <floater.string
- name="acquiredDate">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </floater.string>
- <icon
- follows="top|right"
- height="18"
- image_name="Lock"
- layout="topleft"
- left="276"
- mouse_opaque="true"
- name="IconLocked"
- top="4"
- width="18" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="LabelItemNameTitle"
- top="25"
- width="78">
- Name:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_delta="78"
- max_length_bytes="63"
- name="LabelItemName"
- top_delta="0"
- width="252" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="LabelItemDescTitle"
- top="45"
- width="78">
- Description:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_delta="78"
- max_length_bytes="127"
- name="LabelItemDesc"
- top_delta="0"
- width="252" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="LabelCreatorTitle"
- top="65"
- width="78">
- Creator:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left_delta="78"
- name="LabelCreatorName"
- top_delta="0"
- translate="false"
- use_ellipses="true"
- width="170">
- TestString PleaseIgnore
- </text>
- <button
- follows="top|right"
- height="16"
- label="Profile..."
- layout="topleft"
- left_delta="174"
- name="BtnCreator"
- top_delta="0"
- width="78" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="LabelOwnerTitle"
- top="85"
- width="78">
- Owner:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left_delta="78"
- name="LabelOwnerName"
- top_delta="0"
- translate="false"
- use_ellipses="true"
- width="170">
- TestString PleaseIgnore
- </text>
- <button
- follows="top|right"
- height="16"
- label="Profile..."
- layout="topleft"
- left_delta="174"
- name="BtnOwner"
- top_delta="0"
- width="78" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="LabelAcquiredTitle"
- top="105"
- width="78">
- Acquired:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left_delta="78"
- name="LabelAcquiredDate"
- top_delta="0"
- width="252">
- Wed May 24 12:50:46 2006
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="OwnerLabel"
- top="125"
- width="78">
- You:
- </text>
- <check_box
- height="16"
- label="Edit"
- layout="topleft"
- left_pad="5"
- name="CheckOwnerModify"
- top_delta="0"
- width="78" />
- <check_box
- height="16"
- label="Copy"
- layout="topleft"
- left_delta="0"
- name="CheckOwnerCopy"
- top_pad="5"
- width="88" />
- <check_box
- height="16"
- label="Resell"
- layout="topleft"
- left_delta="0"
- name="CheckOwnerTransfer"
- top_pad="5"
- width="106" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="AnyoneLabel"
- top_pad="5"
- width="78">
- Anyone:
- </text>
- <check_box
- height="16"
- label="Copy"
- layout="topleft"
- left_pad="5"
- name="CheckEveryoneCopy"
- top_delta="0"
- width="130" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="GroupLabel"
- top_pad="5"
- width="78">
- Group:
- </text>
- <check_box
- height="16"
- label="Share"
- layout="topleft"
- left_pad="5"
- name="CheckShareWithGroup"
- top_delta="5"
- width="106" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left="10"
- name="NextOwnerLabel"
- top_pad="5"
- width="78"
- word_wrap="true">
- Next owner:
- </text>
- <check_box
- height="16"
- label="Edit"
- layout="topleft"
- left_pad="5"
- name="CheckNextOwnerModify"
- top_delta="0"
- width="78" />
- <check_box
- height="16"
- label="Copy"
- layout="topleft"
- left_delta="0"
- name="CheckNextOwnerCopy"
- top_pad="5"
- width="88" />
- <check_box
- height="16"
- label="Resell"
- layout="topleft"
- left_delta="0"
- name="CheckNextOwnerTransfer"
- top_pad="5"
- width="106" />
- <check_box
- height="16"
- label="For Sale"
- layout="topleft"
- left="10"
- name="CheckPurchase"
- top_pad="5"
- width="78" />
- <combo_box
- height="19"
- left_pad="5"
- layout="topleft"
- follows="left|top"
- name="ComboBoxSaleType"
- width="110">
- <combo_box.item
- name="Copy"
- label="Copy"
- value="2" />
- <combo_box.item
- name="Contents"
- label="Contents"
- value="3" />
- <combo_box.item
- name="Original"
- label="Original"
- value="1" />
- </combo_box>
- <spinner
- follows="left|top"
- decimal_digits="0"
- increment="1"
- name="Edit Cost"
- label="Price:"
- label_width="100"
- left="10"
- width="192"
- min_val="1"
- height="19"
- max_val="999999999"
- top_pad="5"/>
- <text
- type="string"
- length="1"
- height="15"
- follows="left|top"
- layout="topleft"
- left_delta="82"
- name="CurrencySymbol"
- top_delta="1"
- width="18">
- L$
- </text>
-
- <!--line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="5"
- max_length_bytes="25"
- name="EditPrice"
- top_delta="0"
- width="242" /-->
-
- <!--text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="BaseMaskDebug"
- top="155"
- width="330">
- B:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="OwnerMaskDebug"
- top_delta="0"
- width="270">
- O:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="GroupMaskDebug"
- top_delta="0"
- width="210">
- G:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="EveryoneMaskDebug"
- top_delta="0"
- width="150">
- E:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="NextMaskDebug"
- top_delta="0"
- width="90">
- N:
- </text-->
-
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml
index 156bba6c27..a51e7a844a 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml
@@ -4,8 +4,8 @@
can_minimize="true"
can_resize="false"
save_rect="true"
- height="370"
- width="370"
+ height="483"
+ width="483"
name="inventory_settings"
title="INVENTORY SETTINGS">
<icon
@@ -16,7 +16,7 @@
left="18"
mouse_opaque="true"
name="multi_folder_icon"
- top="25"
+ top="20"
width="18" />
<text
type="string"
@@ -40,10 +40,10 @@
font="SansSerifMedium"
left="60"
width="300"
- height="70"
+ height="66"
name="multi_double_click_setting">
<radio_item
- height="20"
+ height="18"
label="Expands &amp; collapses folder"
label_text.text_color="White"
follows="left|top"
@@ -51,24 +51,24 @@
name="0"
width="200"/>
<radio_item
- height="20"
+ height="18"
follows="left|top"
label="Opens a new window"
label_text.text_color="White"
layout="topleft"
left_delta="0"
name="1"
- top_pad ="5"
+ top_pad ="3"
width="200" />
<radio_item
- height="20"
+ height="18"
follows="left|top"
label="Switches view"
label_text.text_color="White"
layout="topleft"
left_delta="0"
name="2"
- top_pad ="5"
+ top_pad ="3"
width="200" />
</radio_group>
<icon
@@ -79,7 +79,7 @@
left="18"
mouse_opaque="true"
name="single_folder_icon"
- top_pad="30"
+ top_pad="19"
width="18" />
<text
type="string"
@@ -103,10 +103,10 @@
font="SansSerifMedium"
left="60"
width="300"
- height="45"
+ height="44"
name="single_double_click_setting">
<radio_item
- height="20"
+ height="18"
label="Stays in current window"
label_text.text_color="White"
follows="left|top"
@@ -114,27 +114,37 @@
name="false"
width="200"/>
<radio_item
- height="20"
+ height="18"
follows="left|top"
label="Opens a new window"
label_text.text_color="White"
layout="topleft"
left_delta="0"
name="true"
- top_pad ="5"
+ top_pad ="3"
width="200" />
</radio_group>
+ <icon
+ follows="top|left"
+ height="15"
+ image_name="Icon_Pointer"
+ layout="topleft"
+ left="20"
+ mouse_opaque="true"
+ name="single_folder_icon"
+ top_pad="20"
+ width="15" />
<text
type="string"
length="1"
follows="left|top|right"
height="13"
layout="topleft"
- left="48"
+ left_pad="13"
name="find_original_txt"
font="SansSerifMedium"
text_color="White"
- top_pad="30"
+ top_delta="1"
width="300">
Clicking on "Show in inventory" or "Find original"
</text>
@@ -146,10 +156,10 @@
font="SansSerifMedium"
left="60"
width="300"
- height="45"
+ height="44"
name="find_original_settings">
<radio_item
- height="20"
+ height="18"
label="Shows item in main inventory window"
label_text.text_color="White"
follows="left|top"
@@ -157,23 +167,136 @@
name="false"
width="200"/>
<radio_item
- height="20"
+ height="18"
follows="left|top"
label="Opens a new single-folder window"
label_text.text_color="White"
layout="topleft"
left_delta="0"
name="true"
- top_pad ="5"
+ top_pad ="3"
width="200" />
</radio_group>
- <button
- height="20"
- label="OK"
- layout="topleft"
- left="140"
- bottom="-20"
- name="ok_btn"
- label_color="White"
- width="90" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Inv_Favorite_Star_Full"
+ layout="topleft"
+ left="18"
+ mouse_opaque="true"
+ name="favorites_icon"
+ top_pad="19"
+ width="18" />
+ <text
+ type="string"
+ length="1"
+ layout="topleft"
+ follows="left|top|right"
+ height="13"
+ left_pad="12"
+ top_delta="2"
+ name="favorites_txt"
+ font="SansSerifMedium"
+ text_color="White"
+ width="300">
+ Favorites
+ </text>
+ <check_box
+ control_name="InventoryFavoritesUseStar"
+ layout="topleft"
+ follows="left|top"
+ top_pad="8"
+ font="SansSerifMedium"
+ left="60"
+ width="300"
+ height="18"
+ label="Star on favorite items"
+ name="favorite_star"
+ label_text.text_color="White"
+ initial_value="false"/>
+ <check_box
+ control_name="InventoryFavoritesUseHollowStar"
+ follows="left|top"
+ top_pad="5"
+ layout="topleft"
+ font="SansSerifMedium"
+ left="60"
+ width="150"
+ height="18"
+ label="Star on folders containing a favorite"
+ name="favorite_hollow_star"
+ label_text.text_color="White"
+ initial_value="false"/>
+ <check_box
+ control_name="InventoryFavoritesColorText"
+ follows="left|top"
+ top_pad="5"
+ layout="topleft"
+ font="SansSerifMedium"
+ left="60"
+ width="150"
+ height="18"
+ label="Colored text"
+ name="favorites_color"
+ label_text.text_color="White"
+ initial_value="false"/>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ layout="topleft"
+ height="24"
+ label_height="0"
+ left_pad="40"
+ name="favorites_swatch"
+ top_delta="-6"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="InventoryFavoriteColor" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="InventoryFavoriteColor" />
+ </color_swatch>
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Inv_Object"
+ layout="topleft"
+ left="18"
+ mouse_opaque="true"
+ name="obj_icon"
+ top_pad="19"
+ width="18" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="13"
+ layout="topleft"
+ left_pad="12"
+ top_delta="2"
+ name="single_folder_txt"
+ font="SansSerifMedium"
+ text_color="White"
+ width="300">
+ Pressing enter on an avatar attachment
+ </text>
+ <combo_box
+ control_name="InventoryAddAttachmentBehavior"
+ layout="topleft"
+ follows="left|top"
+ top_pad="8"
+ height="24"
+ left="60"
+ name="attach_combo"
+ width="300">
+ <combo_box.item
+ label="Adds attachment (recommended)"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Wear (removes attachment at that point)"
+ name="1"
+ value="1"/>
+ </combo_box>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_marketplace.xml b/indra/newview/skins/default/xui/en/floater_marketplace.xml
new file mode 100644
index 0000000000..40bf674d2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_marketplace.xml
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ legacy_header_height="18"
+ can_minimize="true"
+ can_close="true"
+ can_resize="true"
+ height="775"
+ layout="topleft"
+ min_height="500"
+ min_width="600"
+ name="Marketplace"
+ save_rect="true"
+ single_instance="true"
+ save_visibility="true"
+ title="MARKETPLACE"
+ tab_stop="true"
+ width="780">
+ <layout_stack
+ bottom="775"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="5"
+ animate="false"
+ name="stack1"
+ orientation="vertical"
+ top="20"
+ width="770">
+ <layout_panel
+ auto_resize="false"
+ default_tab_group="1"
+ height="22"
+ layout="topleft"
+ left="0"
+ min_height="20"
+ name="nav_controls"
+ top="400"
+ width="770">
+ <button
+ image_overlay="Arrow_Left_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ hover_glow_amount="0.15"
+ tool_tip="Navigate back"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="1"
+ name="back"
+ top="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Back" />
+ </button>
+ <button
+ image_overlay="Arrow_Right_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Navigate forward"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="27"
+ name="forward"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Forward" />
+ </button>
+ <button
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Stop navigation"
+ enabled="true"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="stop"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Stop" />
+ </button>
+ <button
+ image_overlay="Refresh_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Reload page"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="reload"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Reload" />
+ </button>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top|right"
+ tab_group="1"
+ height="22"
+ layout="topleft"
+ left_pad="4"
+ max_chars="1024"
+ name="address"
+ combo_editor.select_on_focus="true"
+ tool_tip="Enter URL here"
+ top_delta="0"
+ width="672">
+ <combo_box.commit_callback
+ function="WebContent.EnterAddress" />
+ </combo_box>
+ <icon
+ name="media_secure_lock_flag"
+ height="16"
+ follows="top|left"
+ image_name="Lock2"
+ layout="topleft"
+ left_delta="2"
+ top_delta="2"
+ visible="false"
+ tool_tip="Secured Browsing"
+ width="16" />
+ <button
+ image_overlay="ExternalBrowser_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Open current URL in your desktop browser"
+ follows="right|top"
+ enabled="true"
+ height="22"
+ layout="topleft"
+ name="popexternal"
+ right="770"
+ top_delta="-2"
+ width="22">
+ <button.commit_callback
+ function="WebContent.PopExternal" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ height="40"
+ layout="topleft"
+ left_delta="0"
+ name="external_controls"
+ top_delta="0"
+ auto_resize="true"
+ width="585">
+ <web_browser
+ bottom="-2"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="webbrowser"
+ top="0"/>
+ </layout_panel>
+ <layout_panel name="status_bar"
+ height="23"
+ auto_resize="false">
+ <text
+ type="string"
+ length="200"
+ follows="bottom|left"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="statusbartext"
+ parse_urls="false"
+ text_color="0.4 0.4 0.4 1"
+ top_pad="3"
+ width="495"/>
+ <progress_bar
+ color_bar="0.3 1.0 0.3 1"
+ follows="bottom|right"
+ height="16"
+ top_delta="-1"
+ left_pad="24"
+ layout="topleft"
+ name="statusbarprogress"
+ width="64"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 90223fcda8..39e9de0980 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -14,7 +14,7 @@
legacy_header_height="25">
<string name="status_idle"></string>
- <string name="status_parse_error">Error: Dae parsing issue - see log for details.</string>
+ <string name="status_parse_error">Error: Model parsing issue - see log for details.</string>
<string name="status_bind_shape_orientation">Warning: bind shape matrix is not in standard X-forward orientation.</string>
<string name="status_material_mismatch">Error: Material of model is not a subset of reference model.</string>
<string name="status_reading_file">Loading...</string>
@@ -39,12 +39,14 @@
<string name="decomposing">Analyzing...</string>
<string name="simplifying">Simplifying...</string>
<string name="tbd">TBD</string>
-
+ <string name="ModelTextureScaling">One or more textures in this model were scaled to be within the allowed limits.</string>
+
<!-- Warnings and info from model loader-->
<string name="TooManyJoint">Skinning disabled due to too many joints: [JOINTS], maximum: [MAX]</string>
<string name="UnrecognizedJoint">Rigged to unrecognized joint name [NAME]</string>
<string name="UnknownJoints">Skinning disabled due to [COUNT] unknown joints</string>
<string name="ModelLoaded">Model [MODEL_NAME] loaded</string>
+ <string name="InvBindCountMismatch">Bind matrices count mismatch joints count</string>
<string name="IncompleteTC">Texture coordinates data is not complete.</string>
<string name="PositionNaN">Found NaN while loading position data from DAE-Model, invalid model.</string>
@@ -60,6 +62,27 @@
<string name="ParsingErrorNoRoot">Document has no root</string>
<string name="ParsingErrorNoScene">Document has no visual_scene</string>
<string name="ParsingErrorPositionInvalidModel">Unable to process mesh without position data. Invalid model.</string>
+ <string name="UnknownException">Importer crashed while processing [FILENAME], if you encounter this and file is valid, please report the issue to Second Life Support. Exception: [EXCEPTION].</string>
+
+ <!-- GLTF specific messages -->
+ <string name="NoScenesFound">No scenes defined in GLTF file</string>
+ <string name="InvalidMeshReference">Node [NODE_NAME] references invalid mesh [MESH_INDEX] (total meshes: [TOTAL_MESHES])</string>
+ <string name="InvalidGeometryNonTriangulated">Mesh [MESH_NAME] primitive [PRIMITIVE_INDEX]: Invalid geometry with [INDEX_COUNT] indices (must be triangulated)</string>
+ <string name="EmptyVertexArray">Mesh [MESH_NAME] primitive [PRIMITIVE_INDEX]: Empty vertex array</string>
+ <string name="ErrorIndexLimit">Unable to process mesh [MESH_NAME] due to 65,534 vertex limit. Vertex count: [VERTEX_COUNT]</string>
+ <string name="TextureFound">Found texture: [TEXTURE_NAME] for material: [MATERIAL_NAME]</string>
+ <string name="IgnoredExtension">Model uses unsupported extension: [EXT], related material properties are ignored</string>
+ <string name="UnsupportedExtension">Unable to load model, unsupported extension: [EXT]</string>
+ <string name="FailedToCreateTempFile">Failed to create temporary file for embedded [TEXTURE_TYPE] texture [TEXTURE_INDEX]: [TEMP_FILE]</string>
+ <string name="SkinJointsOverLimit">Skin [SKIN_INDEX] defines [JOINT_COUNT] compatible joints, maximum is: [MAX]. Unused joints will be stripped on per model basis.</string>
+ <string name="SkinUsupportedJoints">Skin [SKIN_INDEX] defines [JOINT_COUNT] joints, but only [LEGAL_COUNT] were recognized and are compatible</string>
+ <string name="SkinUnusedJoints">Skin [SKIN_INDEX] defines [JOINT_COUNT] compatible joints, of them only [USED_COUNT] were used</string>
+ <string name="ModelTooManyJoints">Model [MODEL_NAME] uses [JOINT_COUNT], maximum: [MAX], upload might fail</string>
+ <string name="ModelSplitPrimitive">Too many vertices in primitive [MODEL_NAME], it was split into [FACE_COUNT] faces</string>
+ <string name="ModelTooManySubmodels">Model [MODEL_NAME] contains [SUBMODEL_COUNT] generated mesh parts, parts were trimmed to [SUBMODEL_LIMIT]</string>
+ <string name="ParsingErrorMissingBuffer">Buffer is either missing or empty [BUFFER_NAME].</string>
+ <string name="ParsingErrorMissingBufferBin">Buffer is either missing or empty. Check presence of [BUFFER_URI] file.</string>
+ <string name="ParsingErrorException">Parser failed to process [FILENAME], file might be corrupt, incomplete or protected from reading. Exception: [EXCEPTION].</string>
<panel
follows="top|left"
@@ -784,7 +807,7 @@
help_topic="upload_model_physics"
label="Physics"
name="physics_panel">
-
+
<!-- ==== STEP 1: Level of Detail ==== -->
<view_border
bevel_style="none"
@@ -850,7 +873,7 @@
<!-- <check_box name="physics_optimize" follows="left|top" width="130" left="10" top_pad="5" height="20" label="Optimize"/>
<check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/> -->
</panel>
-
+
<!-- ==== STEP 2: Analyze ==== -->
<view_border
bevel_style="none"
@@ -867,9 +890,9 @@
height="65"
follows="top|left"
left="18"
- name="physics analysis"
+ name="physics analysis havok"
top_pad="10"
- visible="true"
+ visible="false"
width="589">
<text
follows="left|top"
@@ -957,7 +980,131 @@
visible="false"
width="90"/>
</panel>
-
+ <panel
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ height="65"
+ follows="top|left"
+ left="18"
+ name="physics analysis vhacd"
+ top_delta="0"
+ visible="false"
+ width="589">
+ <text
+ follows="left|top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="0"
+ name="method_label"
+ text_color="White"
+ top_pad="0">
+ Step 2: Convert to hulls (optional)
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ name="analysis_method_label"
+ top_pad="10"
+ width="100">
+ Fill Mode:
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ name="quality_label"
+ layout="topleft"
+ left_pad="5"
+ width="85">
+ Resolution:
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ name="quality_label"
+ layout="topleft"
+ left_pad="25"
+ width="95">
+ Hulls per Mesh:
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ name="smooth_method_label"
+ layout="topleft"
+ left_pad="5"
+ width="95">
+ Vertices per hull:
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ name="tolerance_label"
+ layout="topleft"
+ left_pad="5"
+ width="100">
+ Error tolerance:
+ </text>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left="0"
+ name="Fill Mode"
+ top_pad="0"
+ height="20"
+ width="100"/>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left_pad="5"
+ name="Voxel Resolution"
+ height="20"
+ width="100"/>
+ <spinner
+ follows="top|left"
+ name="Num Hulls"
+ height="20"
+ left_pad="10"
+ width="60"
+ decimal_digits="0"
+ allow_digits_only="true"/>
+ <spinner
+ follows="top|left"
+ name="Num Vertices"
+ height="20"
+ left_pad="40"
+ width="60"
+ decimal_digits="0"
+ allow_digits_only="true"/>
+ <spinner
+ follows="top|left"
+ name="Error Tolerance"
+ height="20"
+ left_pad="40"
+ width="60"
+ decimal_digits="4"
+ allow_digits_only="true"/>
+ <button
+ bottom="1"
+ follows="top|right"
+ height="20"
+ label="Analyze"
+ layout="bottomleft"
+ name="Analyze"
+ right="-1"
+ width="90"/>
+ <button
+ follows="top|left"
+ height="20"
+ label="Cancel"
+ layout="topleft"
+ left_delta="0"
+ name="analyze_cancel"
+ visible="false"
+ width="90"/>
+ </panel>
+
<!-- ==== STEP 3: Simplify ==== -->
<view_border
bevel_style="none"
@@ -976,7 +1123,8 @@
left="18"
name="physics simplification"
top_pad="10"
- width="589">
+ width="589"
+ visible="false">
<text
text_color="White"
follows="left|top"
@@ -1065,7 +1213,7 @@
name="simplify_cancel"
width="90"/>
</panel>
-
+
<!-- ==== Results ==== -->
<view_border
bevel_style="none"
@@ -1163,7 +1311,7 @@
name="modifiers_panel"
help_topic="upload_model_modifiers">
<view_border
- bevel_style="none"
+ bevel_style="none"
follows="top|left"
height="306"
layout="topleft"
@@ -1404,7 +1552,7 @@
word_wrap="true">
</text_editor>
<check_box
- control_name="ImporterDebug"
+ control_name="ImporterDebugVerboseLogging"
follows="top|left"
top_pad="9"
left="6"
@@ -1570,7 +1718,7 @@ Model:
[MODEL]
</text>
</panel>
- <!--
+ <!--
Streaming breakdown numbers are available but not fully understood
uncommenting the following sections will display the numbers for debugging purposes
<text
@@ -1672,7 +1820,7 @@ Analysed:
width="462"
visible="true">
You don't have rights to upload mesh models. [[VURL] Find out how] to get certified.
- </text>
+ </text>
<text
text_color="Yellow"
layout="topleft"
@@ -1683,7 +1831,7 @@ Analysed:
</text>
</panel>
</panel>
-
+
<text
follows="left|top"
layout="topleft"
@@ -1706,7 +1854,6 @@ Analysed:
height="408"/>
<panel
follows="right|bottom"
- can_resize="false"
height="140"
layout="topleft"
name="right_panel"
diff --git a/indra/newview/skins/default/xui/en/floater_mp_performance.xml b/indra/newview/skins/default/xui/en/floater_mp_performance.xml
index 1b5cf82dcb..13a32479fa 100644
--- a/indra/newview/skins/default/xui/en/floater_mp_performance.xml
+++ b/indra/newview/skins/default/xui/en/floater_mp_performance.xml
@@ -1,65 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
- positioning="cascading"
- legacy_header_height="40"
- top="12"
- right="-334"
- height="80"
- min_height="120"
- width="330"
- min_width="330"
- can_minimize="true"
- can_close="true"
- can_resize="false"
- layout="topright"
- name="mpv_performance"
- single_instance="true"
- save_rect="true"
- save_visibility="true"
- title="FPS Limiter">
+positioning="cascading"
+legacy_header_height="40"
+top="12"
+right="-334"
+height="80"
+min_height="120"
+width="330"
+min_width="330"
+can_minimize="true"
+can_close="true"
+can_resize="false"
+layout="topright"
+name="mpv_performance"
+single_instance="true"
+save_rect="true"
+save_visibility="true"
+title="FPS Limiter">
- <panel
- name="panel_fps"
- border="false"
- width="320"
- height="60"
- left="10"
- top="40"
- follows="left|top|right|bottom"
- layout="topleft"
- >
+<panel
+ name="panel_fps"
+ border="false"
+ width="320"
+ height="60"
+ left="10"
+ top="40"
+ follows="left|top|right|bottom"
+ layout="topleft"
+ >
- <slider
- follows="left|top"
- width="240"
- height="15"
- left="12"
- layout="topleft"
- name="fpsSlider"
- enabled="true"
- control_name="fpsSlider"
- decimal_digits="0"
- increment="12"
- initial_value="0"
- label="Max FPS:"
- label_width="50"
- text_width="2"
- can_edit_text="false"
- show_text="false"
- >
- </slider>
+ <slider
+ follows="left|top"
+ width="240"
+ height="15"
+ left="12"
+ layout="topleft"
+ name="fpsSliderCtrl"
+ enabled="true"
+ decimal_digits="0"
+ min_val="0"
+ max_val="132"
+ increment="12"
+ initial_value="132"
+ label="Max FPS:"
+ label_width="50"
+ text_width="2"
+ can_edit_text="false"
+ show_text="false"
+ >
+ </slider>
- <text
- follows="left|top"
- width="50"
- height="15"
- left_delta="252"
- layout="topleft"
- type="string"
- name="fpsText"
- >
- no limit
- </text>
+ <text
+ follows="left|top"
+ width="50"
+ height="15"
+ left_delta="252"
+ layout="topleft"
+ type="string"
+ name="fpsTextCtrl"
+ >
+ no limit
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
index a9900f05b7..881c1f7469 100644
--- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
@@ -12,7 +12,7 @@
save_visibility="true"
reuse_instance="true"
title="INVENTORY"
- width="363" >
+ width="418" >
<panel
class="sidepanel_inventory"
name="main_panel"
diff --git a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml
index 57b74b360a..9981e5d893 100644
--- a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml
+++ b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml
@@ -17,17 +17,7 @@
New inventory features
</floater.string>
<floater.string name="description_txt_inventory">
-You can now add preview images to inventory items and view a folder in its own window.
-Learn more in this [https://community.secondlife.com/blogs/entry/13637-new-features-inventory-item-preview-and-single-folder-view/ blogpost]
- </floater.string>
- <floater.string name="title_txt_gltf">
-New GLTF PBR materials support
- </floater.string>
- <floater.string name="description_txt_gltf">
-You can now use expanded material support with the ability to import and edit GLTF Physically Based Rendering (PBR) Materials.
-In order to support the addition of the GLTF format, some areas in the viewer may appear darker than usual.
-
-Learn more about [https://wiki.secondlife.com/wiki/PBR_Materials Physically Based Rendering (PBR)]
+You can now mark items and folders as favorites. Favorited items will appear in the Favorites tab of inventory and by default will be highlighted with a star in the main inventory view.
</floater.string>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_object_weights.xml b/indra/newview/skins/default/xui/en/floater_object_weights.xml
index 5e4b017590..709fbdd27e 100644
--- a/indra/newview/skins/default/xui/en/floater_object_weights.xml
+++ b/indra/newview/skins/default/xui/en/floater_object_weights.xml
@@ -2,7 +2,7 @@
<floater
can_close="true"
can_tear_off="false"
- height="289"
+ height="372"
help_topic="object_weights"
layout="topleft"
name="object_weights"
@@ -13,6 +13,21 @@
<floater.string
name="nothing_selected"
value="--"/>
+ <floater.string
+ name="lowest_lod"
+ value="Lowest"/>
+ <floater.string
+ name="low_lod"
+ value="Low"/>
+ <floater.string
+ name="medium_lod"
+ value="Medium"/>
+ <floater.string
+ name="high_lod"
+ value="High"/>
+ <floater.string
+ name="multiple_lods"
+ value="Multiple"/>
<text
follows="left|top"
@@ -320,4 +335,97 @@
top_delta="0"
value="Total capacity"
width="130" />
+
+
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="rendering_info_text"
+ text_color="EmphasisColor"
+ top_pad="10"
+ value="RENDERING INFO"
+ width="180" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="lod_level"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="lod_level_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="lod_level_label"
+ top_delta="0"
+ value="LOD (Level of detail)"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="triangles_shown"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="triangles_shown_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="triangles_shown_label"
+ top_delta="0"
+ value="Triangles Shown"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="pixel_area"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="pixel_area_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="pixel_area_label"
+ top_delta="0"
+ value="Pixel Area"
+ width="130" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 4b0e0bb221..97ff1fd5a2 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -100,6 +100,15 @@
layout="topleft"
help_topic="preferences_display_tab"
name="display" />
+
+ <panel
+ class="panel_preference_graphics3"
+ filename="panel_preferences_graphics3.xml"
+ label="Visual Effects"
+ layout="topleft"
+ help_topic="preferences_display_tab"
+ name="display3" />
+
<panel
class="panel_preference"
filename="panel_preferences_sound.xml"
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
index 88d6ae1bc2..0e37472990 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
@@ -29,13 +29,13 @@
decimal_digits="0"
follows="left|top"
height="16"
- increment="32"
- initial_value="160"
+ increment="8"
+ initial_value="128"
label="Draw distance:"
label_width="185"
layout="topleft"
left="30"
- min_val="32"
+ min_val="8"
max_val="512"
name="DrawDistance"
top_delta="16"
@@ -52,7 +52,7 @@
left_delta="330"
width="20">
m
- </text>
+ </text>
<slider
control_name="RenderMaxPartCount"
decimal_digits="0"
@@ -141,6 +141,14 @@
tool_tip="Maximum resolution for 'level of detail' textures"
width="90">
<combo_box.item
+ label="128"
+ name="128"
+ value="128"/>
+ <combo_box.item
+ label="256"
+ name="256"
+ value="256"/>
+ <combo_box.item
label="512"
name="512"
value="512"/>
@@ -626,9 +634,9 @@
layout="topleft"
left="385"
name="vert_border"
- top="16"
+ top="16"
width="0"/>
-
+
<text
type="string"
length="1"
@@ -732,7 +740,7 @@
<check_box.commit_callback
function="Pref.RenderOptionUpdate" />
</check_box>
-
+
<text
type="string"
length="1"
@@ -751,7 +759,7 @@
height="18"
layout="topleft"
left_delta="130"
- top_delta="0"
+ top_delta="0"
name="ShadowDetail"
width="150">
<combo_box.item
@@ -766,88 +774,12 @@
label="Sun/Moon + Projectors"
name="2"
value="2"/>
- </combo_box>
-
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="420"
- name="RenderShadowQualityText"
- text_readonly_color="LabelDisabledColor"
- top_delta="22"
- width="128">
- Shadows Optimisations
- </text>
-
- <combo_box
- control_name="MPRenderShadowOpti"
- height="18"
- layout="topleft"
- left_delta="130"
- top_delta="0"
- name="MPShadowQuality"
- width="150">
- <combo_box.item
- label="No optimisation"
- name="0"
- value="0"/>
- <combo_box.item
- label="Medium"
- name="1"
- value="1"/>
- <combo_box.item
- label="Faster"
- name="2"
- value="2"/>
- <combo_box.item
- label="Fastest"
+ <combo_box.item
+ label="Projectors only"
name="3"
value="3"/>
</combo_box>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="420"
- name="RenderShadowResolutionScaleText"
- text_readonly_color="LabelDisabledColor"
- top_delta="22"
- width="128">
- Shadows Resolution
- </text>
-
- <combo_box
- control_name="RenderShadowResolutionScale"
- height="18"
- layout="topleft"
- left_delta="130"
- top_delta="0"
- name="RenderShadowResolutionScale"
- width="150">
- <combo_box.item
- label="Default"
- name="Default"
- value="1.0"/>
- <combo_box.item
- label="High"
- name="High"
- value="1.5"/>
- <combo_box.item
- label="Ultra"
- name="Ultra"
- value="2.0"/>
- <combo_box.item
- label="Crazy"
- name="Crazy"
- value="3.0"/>
- </combo_box>
-
<check_box
control_name="RenderScreenSpaceReflections"
height="16"
@@ -861,7 +793,7 @@
<check_box.commit_callback
function="Pref.RenderOptionUpdate" />
</check_box>
-
+
<text
type="string"
length="1"
@@ -1011,7 +943,7 @@
layout="topleft"
left="420"
name="Mirrors"
- top_delta="24"
+ top_delta="22"
width="240">
<check_box.commit_callback
function="Pref.RenderOptionUpdate" />
@@ -1113,7 +1045,7 @@
max_val="1.0"
name="RenderSharpness"
show_text="true"
- top_delta="24"
+ top_delta="20"
width="260">
</slider>
<!-- End of Sharpening Settings-->
@@ -1164,7 +1096,7 @@
max_val="1.0"
name="TonemapMix"
show_text="true"
- top_delta="22"
+ top_delta="20"
width="260">
</slider>
<!-- End of Tone Mapping Settings-->
diff --git a/indra/newview/skins/default/xui/en/floater_preview_trash.xml b/indra/newview/skins/default/xui/en/floater_preview_trash.xml
index f1c87c8c5a..ebb5cd9251 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_trash.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_trash.xml
@@ -29,6 +29,8 @@
bevel_style="none"
scroll.reserve_scroll_corner="false">
<folder folder_arrow_image="Folder_Arrow"
+ favorite_image="Inv_Favorite_Star_Full"
+ favorite_content_image="Inv_Favorite_Star_Content"
folder_indentation="8"
item_height="20"
item_top_pad="4"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index fc1e32915a..8891ebcd87 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -1,18 +1,202 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
- positioning="cascading"
legacy_header_height="18"
+ can_minimize="true"
+ can_close="true"
can_resize="true"
height="775"
layout="topleft"
- min_height="400"
- min_width="500"
- name="floater_search"
- help_topic="floater_search"
+ min_height="500"
+ min_width="600"
+ name="Search"
save_rect="true"
+ single_instance="true"
save_visibility="true"
- title=""
- initial_mime_type="text/html"
- width="780"
+ title="SEARCH"
tab_stop="true"
- filename="floater_web_content.xml"/>
+ width="780">
+ <layout_stack
+ bottom="775"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="5"
+ animate="false"
+ name="stack1"
+ orientation="vertical"
+ top="20"
+ width="770">
+ <layout_panel
+ auto_resize="false"
+ default_tab_group="1"
+ height="22"
+ layout="topleft"
+ left="0"
+ min_height="20"
+ name="nav_controls"
+ top="400"
+ width="770">
+ <button
+ image_overlay="Arrow_Left_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ hover_glow_amount="0.15"
+ tool_tip="Navigate back"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="1"
+ name="back"
+ top="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Back" />
+ </button>
+ <button
+ image_overlay="Arrow_Right_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Navigate forward"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="27"
+ name="forward"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Forward" />
+ </button>
+ <button
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Stop navigation"
+ enabled="true"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="stop"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Stop" />
+ </button>
+ <button
+ image_overlay="Refresh_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Reload page"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="reload"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Reload" />
+ </button>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top|right"
+ tab_group="1"
+ height="22"
+ layout="topleft"
+ left_pad="4"
+ max_chars="1024"
+ name="address"
+ combo_editor.select_on_focus="true"
+ tool_tip="Enter URL here"
+ top_delta="0"
+ width="672">
+ <combo_box.commit_callback
+ function="WebContent.EnterAddress" />
+ </combo_box>
+ <icon
+ name="media_secure_lock_flag"
+ height="16"
+ follows="top|left"
+ image_name="Lock2"
+ layout="topleft"
+ left_delta="2"
+ top_delta="2"
+ visible="false"
+ tool_tip="Secured Browsing"
+ width="16" />
+ <button
+ image_overlay="ExternalBrowser_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Open current URL in your desktop browser"
+ follows="right|top"
+ enabled="true"
+ height="22"
+ layout="topleft"
+ name="popexternal"
+ right="770"
+ top_delta="-2"
+ width="22">
+ <button.commit_callback
+ function="WebContent.PopExternal" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ height="40"
+ layout="topleft"
+ left_delta="0"
+ name="external_controls"
+ top_delta="0"
+ auto_resize="true"
+ width="585">
+ <web_browser
+ bottom="-2"
+ follows="all"
+ layout="topleft"
+ left="0"
+ trusted_content="true"
+ name="webbrowser"
+ top="0"/>
+ </layout_panel>
+ <layout_panel name="status_bar"
+ height="23"
+ auto_resize="false">
+ <text
+ type="string"
+ length="200"
+ follows="bottom|left"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="statusbartext"
+ parse_urls="false"
+ text_color="0.4 0.4 0.4 1"
+ top_pad="3"
+ width="495"/>
+ <progress_bar
+ color_bar="0.3 1.0 0.3 1"
+ follows="bottom|right"
+ height="16"
+ top_delta="-1"
+ left_pad="24"
+ layout="topleft"
+ name="statusbarprogress"
+ width="64"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_settings_debug.xml b/indra/newview/skins/default/xui/en/floater_settings_debug.xml
index a93be6a18d..c40ae3ea06 100644
--- a/indra/newview/skins/default/xui/en/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/en/floater_settings_debug.xml
@@ -66,6 +66,7 @@
visible="false"
name="comment_text"
follows="left|top"
+ max_length="1024"
width="240"
top_delta="20"
word_wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index e6b780728c..acdccdc03a 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -167,8 +167,19 @@
left="30"
height="16"
top_pad="8"
- width="180"
+ width="80"
+ control_name="RenderUIInSnapshot"
name="ui_check" />
+ <check_box
+ label="L$ Balance"
+ layout="topleft"
+ left_pad="16"
+ height="16"
+ top_delta="0"
+ width="80"
+ control_name="RenderBalanceInSnapshot"
+ enabled_control="RenderUIInSnapshot"
+ name="balance_check" />
<check_box
label="HUDs"
layout="topleft"
@@ -176,6 +187,7 @@
left="30"
top_pad="1"
width="180"
+ control_name="RenderHUDInSnapshot"
name="hud_check" />
<check_box
label="Freeze frame (fullscreen)"
diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index 6633e25099..1600c422c3 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -54,6 +54,27 @@
label="jitter"
decimal_digits="1"
stat="frametimejitter"/>
+ <stat_bar name="normalized_cumulative_frametime"
+ label="normalized sess. jitter"
+ decimal_digits="4"
+ stat="normalizedframetimejitter"/>
+ <stat_bar name="normalized_period_jitter"
+ label="normalized period jitter"
+ decimal_digits="4"
+ stat="normalizedframetimejitterperiod"/>
+ <stat_bar name="normalized_frametime_variation"
+ label="normalized frametime variation"
+ decimal_digits="4"
+ stat="nftv"/>
+ <stat_bar name="frame_events_per_minute"
+ label="frame events/minute"
+ decimal_digits="2"
+ stat="frametimeeventspm"/>
+ <stat_bar name="frame_events_last_minute"
+ label="frame events last min."
+ decimal_digits="0"
+ stat="frametimeeventslastmin"/>
+
<stat_bar name="bandwidth"
label="UDP Data Received"
stat="activemessagedatareceived"
@@ -74,6 +95,38 @@
<stat_view name="render"
label="Render"
setting="OpenDebugStatRender">
+ <stat_bar name="framet_cumulative"
+ label="jitter cumulative"
+ decimal_digits="1"
+ stat="frametimejitcumulative"/>
+ <stat_bar name="framet_jitter_99th"
+ label="jitter 99th percentile"
+ decimal_digits="1"
+ stat="frametimejitter99"/>
+ <stat_bar name="framet_jitter_95th"
+ label="jitter 95th percentile"
+ decimal_digits="1"
+ stat="frametimejitter95"/>
+ <stat_bar name="framet_jitter_stddev"
+ label="frametime jitter std dev"
+ decimal_digits="1"
+ stat="frametimejitterstddev"/>
+ <stat_bar name="framet_99th"
+ label="frametime 99th percentile"
+ decimal_digits="1"
+ stat="frametime99"/>
+ <stat_bar name="framet_95th"
+ label="frametime 95th percentile"
+ decimal_digits="1"
+ stat="frametime95"/>
+ <stat_bar name="framet_stddev"
+ label="frametime std dev"
+ decimal_digits="1"
+ stat="frametimestddev"/>
+ <stat_bar name="framet_events"
+ label="frametime events"
+ decimal_digits="0"
+ stat="frametimeevents"/>
<stat_bar name="ktrisframe"
label="KTris per Frame"
unit_label="ktris/fr"
diff --git a/indra/newview/skins/default/xui/en/floater_test_slapp.xml b/indra/newview/skins/default/xui/en/floater_test_slapp.xml
index dd2720816a..5a13a0147e 100644
--- a/indra/newview/skins/default/xui/en/floater_test_slapp.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_slapp.xml
@@ -8,7 +8,7 @@
width="500">
<floater.string
name="remove_folder_slapp">
- secondlife://app/remove_folder/?folder_id=
+ secondlife:///app/remove_folder/?folder_id=
</floater.string>
<text
type="string"
@@ -42,7 +42,7 @@
width="450"
layout="topleft"
left="16">
- secondlife://app/wear_folder/?folder_name=Daisy
+ secondlife:///app/wear_folder/?folder_name=Daisy
</text>
<text
type="string"
@@ -63,7 +63,7 @@
width="450"
layout="topleft"
left="16">
- secondlife://app/add_folder/?folder_name=Cardboard%20Boxbot
+ secondlife:///app/add_folder/?folder_name=Cardboard%20Boxbot
</text>
<text
type="string"
@@ -73,7 +73,7 @@
height="16"
width="450"
layout="topleft">
- secondlife://app/add_folder/?folder_id=59219db2-c260-87d3-213d-bb3bc298a3d8
+ secondlife:///app/add_folder/?folder_id=59219db2-c260-87d3-213d-bb3bc298a3d8
</text>
<text
type="string"
@@ -118,6 +118,6 @@
name="remove_folder_txt"
layout="topleft"
left="16">
- secondlife://app/remove_folder/?folder_id=
+ secondlife:///app/remove_folder/?folder_id=
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
index 51809793d3..c0d260ef59 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
@@ -22,7 +22,7 @@
increment="0.025"
initial_value="0.5"
label="Voice Chat"
- label_width="50"
+ label_width="60"
layout="topleft"
left="15"
top="50"
diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml
index 2e1dfa00c7..53796f0959 100644
--- a/indra/newview/skins/default/xui/en/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/en/floater_web_content.xml
@@ -178,7 +178,7 @@
width="22">
<button.commit_callback
function="WebContent.TestURL"
- parameter="https://sl-viewer-media-system.s3.amazonaws.com/index.html"/>
+ parameter="https://sl-viewer-media-system.s3.amazonaws.com/bookmarks/index.html"/>
</button>
</layout_panel>
<layout_panel
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index 08cc9ae19e..7d094ec613 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -455,7 +455,7 @@
<panel
follows="right|top|bottom"
- height="330"
+ height="235"
top_pad="0"
width="238"
name="layout_panel_4">
@@ -532,9 +532,9 @@
width="16" />
<search_editor
follows="top|right"
- search_button_visible="false"
+ search_button_visible="false"
height="22"
- text_readonly_color="DkGray"
+ text_readonly_color="DkGray"
label="Regions by Name"
layout="topleft"
top_delta="-2"
@@ -542,10 +542,7 @@
name="location"
select_on_focus="true"
tool_tip="Type the name of a region"
- width="152">
- <search_editor.commit_callback
- function="WMap.Location" />
- </search_editor>
+ width="152"/>
<button
follows="top|right"
height="23"
@@ -594,6 +591,13 @@
<scroll_list.commit_callback
function="WMap.SearchResult" />
</scroll_list>
+ </panel>
+ <panel
+ follows="right|bottom"
+ height="95"
+ top_pad="0"
+ width="238"
+ name="layout_panel_7">
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
index 99f84fe808..f01dee36ce 100644
--- a/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
@@ -670,61 +670,177 @@
function="Inventory.DoToSelected"
parameter="ungroup_folder_items" />
</menu_item_call>
+ <menu_item_call
+ label="Add to Favorites"
+ layout="topleft"
+ name="Add to Favorites">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="add_to_favorites" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove from Favorites"
+ layout="topleft"
+ name="Remove from Favorites">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="remove_from_favorites" />
+ </menu_item_call>
+ <menu
+ label="Upload to folder"
+ layout="topleft"
+ name="upload_options">
+ <menu_item_call
+ label="Image..."
+ layout="topleft"
+ name="Upload Image">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_texture" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Image,texture" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sound (L$[COST])..."
+ layout="topleft"
+ name="Upload Sound">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_sound" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Sound,sound" />
+ </menu_item_call>
+ <menu_item_call
+ label="Animation (L$[COST])..."
+ layout="topleft"
+ name="Upload Animation">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_animation" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Animation,animation" />
+ </menu_item_call>
+ <menu_item_call
+ label="Model..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_model" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadModel" />
+ <menu_item_call.on_visible
+ function="File.VisibleUploadModel"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Material..."
+ layout="topleft"
+ name="Upload Material">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_pbr_material" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadMaterial" />
+ </menu_item_call>
+ <menu_item_call
+ label="Bulk..."
+ layout="topleft"
+ name="Bulk Upload">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_bulk" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Bulk Upload,texture" />
+ </menu_item_call>
+ </menu>
<menu
label="Use as default for"
layout="topleft"
name="upload_def">
- <menu_item_call
+ <menu_item_check
label="Image uploads"
layout="topleft"
name="Image uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
- parameter="texture" />
- <menu_item_call.on_visible
+ parameter="def_texture" />
+ <on_visible
function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_texture" />
+ </menu_item_check>
+ <menu_item_check
label="Sound uploads"
layout="topleft"
name="Sound uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
- parameter="sound" />
- <menu_item_call.on_visible
+ parameter="def_sound" />
+ <on_visible
function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_sound" />
+ </menu_item_check>
+ <menu_item_check
label="Animation uploads"
layout="topleft"
name="Animation uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
- parameter="animation" />
- <menu_item_call.on_visible
+ parameter="def_animation" />
+ <on_visible
function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_animation" />
+ </menu_item_check>
+ <menu_item_check
label="Model uploads"
layout="topleft"
name="Model uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
- parameter="model" />
- <menu_item_call.on_visible
+ parameter="def_model" />
+ <on_visible
function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_model" />
+ </menu_item_check>
+ <menu_item_check
+ label="PBR material uploads"
+ layout="topleft"
+ name="PBR uploads">
+ <on_click
+ function="Inventory.FileUploadLocation"
+ parameter="def_pbr_material" />
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_pbr_material" />
+ </menu_item_check>
+ <menu_item_check
+ label="Use as favorite folder"
+ layout="topleft"
+ name="Set favorite folder">
+ <on_click
+ function="Inventory.SetFavoriteFolder"
+ parameter="favorite" />
+ <on_visible
+ function="Inventory.CanSetFavoriteFolder" />
+ </menu_item_check>
</menu>
- <menu_item_call
- label="Use as favorite folder"
- layout="topleft"
- name="Set favorite folder">
- <menu_item_call.on_click
- function="Inventory.SetFavoriteFolder"
- parameter="favorite" />
- <menu_item_call.on_visible
- function="Inventory.CanSetFavoriteFolder" />
- </menu_item_call>
<menu_item_separator
layout="topleft"
name="Marketplace Separator" />
diff --git a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
index 99cee83f4e..fb68193006 100755
--- a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
@@ -50,6 +50,26 @@
function="Outfit.Thumbnail" />
</menu_item_call>
<menu_item_call
+ label="Add to favorites"
+ layout="topleft"
+ name="favorites_add">
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="favorites_add" />
+ <on_click
+ function="Outfit.Favorite" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove from favorites"
+ layout="topleft"
+ name="favorites_remove">
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="favorites_remove" />
+ <on_click
+ function="Outfit.Favorite" />
+ </menu_item_call>
+ <menu_item_call
label="Edit outfit"
layout="topleft"
name="edit">
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index e0f380e074..087424b469 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -152,6 +152,14 @@
parameter="category" />
</menu_item_call>
<menu_item_call
+ label="New Folder"
+ layout="topleft"
+ name="New Outfit Folder">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="category" />
+ </menu_item_call>
+ <menu_item_call
label="New Outfit"
layout="topleft"
name="New Outfit">
@@ -942,7 +950,7 @@
function="Inventory.EnvironmentEnabled" />
</menu_item_call>
</menu>
- </menu>
+ </menu>
<menu_item_call
label="Create folder from selected"
layout="topleft"
@@ -959,50 +967,158 @@
function="Inventory.DoToSelected"
parameter="ungroup_folder_items" />
</menu_item_call>
+ <menu_item_call
+ label="Add to Favorites"
+ layout="topleft"
+ name="Add to Favorites">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="add_to_favorites" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove from Favorites"
+ layout="topleft"
+ name="Remove from Favorites">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="remove_from_favorites" />
+ </menu_item_call>
+ <menu
+ label="Upload to folder"
+ layout="topleft"
+ name="upload_options">
+ <menu_item_call
+ label="Image..."
+ layout="topleft"
+ name="Upload Image">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_texture" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Image,texture" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sound (L$[COST])..."
+ layout="topleft"
+ name="Upload Sound">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_sound" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Sound,sound" />
+ </menu_item_call>
+ <menu_item_call
+ label="Animation (L$[COST])..."
+ layout="topleft"
+ name="Upload Animation">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_animation" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Animation,animation" />
+ </menu_item_call>
+ <menu_item_call
+ label="Model..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_model" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadModel" />
+ <menu_item_call.on_visible
+ function="File.VisibleUploadModel"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Material..."
+ layout="topleft"
+ name="Upload Material">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_pbr_material" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadMaterial" />
+ </menu_item_call>
+ <menu_item_call
+ label="Bulk..."
+ layout="topleft"
+ name="Bulk Upload">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="upload_bulk" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Bulk Upload,texture" />
+ </menu_item_call>
+ </menu>
<menu
label="Use as default for"
layout="topleft"
name="upload_def">
- <menu_item_call
+ <menu_item_check
label="Image uploads"
layout="topleft"
name="Image uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
- parameter="texture" />
- </menu_item_call>
- <menu_item_call
+ parameter="def_texture" />
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_texture" />
+ </menu_item_check>
+ <menu_item_check
label="Sound uploads"
layout="topleft"
name="Sound uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="sound" />
- </menu_item_call>
- <menu_item_call
+ <on_click
+ function="Inventory.FileUploadLocation"
+ parameter="def_sound" />
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_sound" />
+ </menu_item_check>
+ <menu_item_check
label="Animation uploads"
layout="topleft"
name="Animation uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="animation" />
- </menu_item_call>
- <menu_item_call
+ <on_click
+ function="Inventory.FileUploadLocation"
+ parameter="def_animation" />
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_animation" />
+ </menu_item_check>
+ <menu_item_check
label="Model uploads"
layout="topleft"
name="Model uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="model" />
- </menu_item_call>
- <menu_item_call
+ <on_click
+ function="Inventory.FileUploadLocation"
+ parameter="def_model" />
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_model" />
+ </menu_item_check>
+ <menu_item_check
label="PBR material uploads"
layout="topleft"
name="PBR uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="pbr_material" />
- </menu_item_call>
+ <on_click
+ function="Inventory.FileUploadLocation"
+ parameter="def_pbr_material" />
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_pbr_material" />
+ </menu_item_check>
</menu>
<menu_item_call
label="Use as favorite folder"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
index e249acaccd..d17fbf84b3 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
@@ -138,4 +138,15 @@
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_call>
+ <menu_item_separator/>
+ <menu_item_check
+ label="Inventory settings..."
+ name="inv_settings">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="inventory_settings" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="inventory_settings" />
+ </menu_item_check>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml
index 33cf01493d..97f53d3a17 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml
@@ -100,15 +100,4 @@
function="Inventory.GearDefault.Visible"
parameter="single_folder_view" />
</menu_item_check>
- <menu_item_separator/>
- <menu_item_check
- label="Inventory settings..."
- name="inv_settings">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="inventory_settings" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="inventory_settings" />
- </menu_item_check>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml
index f9864637a0..e687ae93e8 100644
--- a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml
@@ -40,4 +40,12 @@
<menu_item_call.on_click
function="Open.WebInspector" />
</menu_item_call>
+ <menu_item_call
+ label="Show Source"
+ layout="topleft"
+ name="show_page_source"
+ visible="false">
+ <menu_item_call.on_click
+ function="Open.ShowSource" />
+ </menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_object_icon.xml b/indra/newview/skins/default/xui/en/menu_object_icon.xml
index f3e520700b..d43ce26e56 100644
--- a/indra/newview/skins/default/xui/en/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml
@@ -41,6 +41,17 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
+ label="Zoom in"
+ layout="topleft"
+ name="zoom_in">
+ <menu_item_call.on_click
+ function="ObjectIcon.Action"
+ parameter="obj_zoom_in" />
+ <menu_item_call.on_enable
+ function="ObjectIcon.Visible"
+ parameter="obj_zoom_in" />
+ </menu_item_call>
+ <menu_item_call
label="Show on Map"
layout="topleft"
name="show_on_map">
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gallery_sort.xml b/indra/newview/skins/default/xui/en/menu_outfit_gallery_sort.xml
new file mode 100644
index 0000000000..aa4cd1483d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gallery_sort.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu
+ layout="topleft"
+ visible="false"
+ name="Sort Outfit">
+ <menu_item_check
+ label="Sort favorites to top"
+ layout="topleft"
+ visible="true"
+ name="sort_favorites_to_top">
+ <on_click
+ function="Sort.OnSort"
+ parameter="favorites_to_top" />
+ <on_check
+ function="Sort.OnEnable"
+ parameter="favorites_to_top" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort images to top"
+ layout="topleft"
+ visible="true"
+ name="sort_images_to_top">
+ <on_click
+ function="Sort.OnSort"
+ parameter="images_to_top" />
+ <on_check
+ function="Sort.OnEnable"
+ parameter="images_to_top" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by name"
+ layout="topleft"
+ visible="true"
+ name="sort_by_name">
+ <on_click
+ function="Sort.OnSort"
+ parameter="by_name" />
+ <on_check
+ function="Sort.OnEnable"
+ parameter="by_name" />
+ </menu_item_check>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index 8f36c7a00a..e333b05d3e 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -50,6 +50,26 @@
function="Gear.Thumbnail" />
</menu_item_call>
<menu_item_call
+ label="Add to favorite outfits"
+ layout="topleft"
+ name="favorites_add">
+ <on_visible
+ function="Gear.OnVisible"
+ parameter="favorites_add" />
+ <on_click
+ function="Gear.Favorite" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove from favorite outfits"
+ layout="topleft"
+ name="favorites_remove">
+ <on_visible
+ function="Gear.OnVisible"
+ parameter="favorites_remove" />
+ <on_click
+ function="Gear.Favorite" />
+ </menu_item_call>
+ <menu_item_call
label="Rename outfit"
layout="topleft"
name="rename">
@@ -89,34 +109,6 @@
function="Gear.OnVisible"
parameter="delete" />
</menu_item_call>
- <menu_item_separator>
- <on_visible
- function="Gear.OnVisible"/>
- </menu_item_separator>
- <menu_item_check
- label="Sort folders always by name"
- layout="topleft"
- name="sort_folders_by_name">
- <on_click
- function="Gear.SortByName" />
- <on_check
- function="CheckControl"
- parameter="OutfitGallerySortByName" />
- </menu_item_check>
- <menu_item_call
- label="Expand all folders"
- layout="topleft"
- name="expand">
- <on_click
- function="Gear.Expand" />
- </menu_item_call>
- <menu_item_call
- label="Collapse all folders"
- layout="topleft"
- name="collapse">
- <on_click
- function="Gear.Collapse" />
- </menu_item_call>
<menu_item_separator/>
<!-- copied (with minor modifications) from menu_inventory_add.xml -->
<!-- *TODO: generate dynamically? -->
@@ -277,4 +269,19 @@
</menu_item_call>
</menu>
<!-- copied from menu_inventory_add.xml -->
+
+ <menu_item_separator/>
+
+ <menu_item_check
+ label="Inventory settings..."
+ layout="topleft"
+ visible="true"
+ name="inventory_settings">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="inventory_settings" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="inventory_settings" />
+ </menu_item_check>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_list_sort.xml b/indra/newview/skins/default/xui/en/menu_outfit_list_sort.xml
new file mode 100644
index 0000000000..0a4d1ea877
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_outfit_list_sort.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu
+ layout="topleft"
+ visible="false"
+ name="Sort Outfit">
+ <menu_item_call
+ label="Expand all folders"
+ layout="topleft"
+ name="expand">
+ <on_click
+ function="Sort.Expand" />
+ </menu_item_call>
+ <menu_item_call
+ label="Collapse all folders"
+ layout="topleft"
+ visible="true"
+ name="collapse">
+ <on_click
+ function="Sort.Collapse" />
+ </menu_item_call>
+
+ <menu_item_separator/>
+
+ <menu_item_check
+ label="Sort favorites to top"
+ layout="topleft"
+ name="sort_favorites_to_top">
+ <on_click
+ function="Sort.OnSort"
+ parameter="favorites_to_top" />
+ <on_check
+ function="Sort.OnEnable"
+ parameter="favorites_to_top" />
+ </menu_item_check>
+
+ <menu_item_separator/>
+
+ <menu_item_check
+ label="Show entire outfit in search"
+ layout="topleft"
+ name="show_entire_outfit_in_search">
+ <on_click
+ function="Sort.OnSort"
+ parameter="show_entire_outfit" />
+ <on_check
+ function="Sort.OnEnable"
+ parameter="show_entire_outfit" />
+ </menu_item_check>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml
index c6805edd63..0d45e7c95c 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml
@@ -50,6 +50,26 @@
function="Outfit.Thumbnail" />
</menu_item_call>
<menu_item_call
+ label="Add to favorites"
+ layout="topleft"
+ name="favorites_add">
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="favorites_add" />
+ <on_click
+ function="Outfit.Favorite" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove from favorites"
+ layout="topleft"
+ name="favorites_remove">
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="favorites_remove" />
+ <on_click
+ function="Outfit.Favorite" />
+ </menu_item_call>
+ <menu_item_call
label="Edit outfit"
layout="topleft"
name="edit">
diff --git a/indra/newview/skins/default/xui/en/menu_settings_gear.xml b/indra/newview/skins/default/xui/en/menu_settings_gear.xml
index 57f4aa8655..96cbac4478 100644
--- a/indra/newview/skins/default/xui/en/menu_settings_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_settings_gear.xml
@@ -24,6 +24,9 @@
<menu_item_call.on_click
function="MyEnvironments.DoApply"
parameter="local" />
+ <menu_item_call.on_enable
+ function="MyEnvironments.CanApply"
+ parameter="local"/>
</menu_item_call>
<menu_item_call
name="Settings Apply Parcel"
diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
index 1874c01f8d..fb6081e1fb 100644
--- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
@@ -26,6 +26,13 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
+ label="Zoom in"
+ layout="topleft"
+ name="zoom_in">
+ <menu_item_call.on_click
+ function="Url.ZoomInObject" />
+ </menu_item_call>
+ <menu_item_call
label="Show on Map"
layout="topleft"
name="show_on_map">
diff --git a/indra/newview/skins/default/xui/en/menu_url_parcel.xml b/indra/newview/skins/default/xui/en/menu_url_parcel.xml
index e0f1fcf9c3..95752dab66 100644
--- a/indra/newview/skins/default/xui/en/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_parcel.xml
@@ -16,7 +16,7 @@
layout="topleft"
name="show_on_map">
<menu_item_call.on_click
- function="Url.ShowOnMap" />
+ function="Url.ShowParcelOnMap" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index f52e1cc952..f3bde4c8f8 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -418,11 +418,11 @@
</menu_item_call>
<menu_item_separator/>
<menu_item_call
- label="Complete avatars..."
- name="Avatar Picker">
+ label="Avatar Welcome Pack..."
+ name="Avatar Welcome Pack">
<menu_item_call.on_click
function="Floater.ToggleOrBringToFront"
- parameter="avatar" />
+ parameter="avatar_welcome_pack" />
</menu_item_call>
<menu_item_separator/>
@@ -1586,6 +1586,64 @@ function="World.EnvPreset"
parameter="RenderDisablePostProcessing" />
</menu_item_check>
+
+ <menu
+ create_jump_keys="true"
+ label="Selection level of detail"
+ name="Selection level of detail"
+ tear_off="true">
+
+ <menu_item_check
+ label="Default"
+ name="Default lod setting">
+ <menu_item_check.on_check
+ function="Tools.ToolsCheckSelectionLODMode"
+ parameter="default" />
+ <menu_item_check.on_click
+ function="Tools.SelectionLODMode"
+ parameter="default" />
+ </menu_item_check>
+ <menu_item_check
+ label="High"
+ name="High lod setting">
+ <menu_item_check.on_check
+ function="Tools.ToolsCheckSelectionLODMode"
+ parameter="high" />
+ <menu_item_check.on_click
+ function="Tools.SelectionLODMode"
+ parameter="high" />
+ </menu_item_check>
+ <menu_item_check
+ label="Medium"
+ name="Medium lod setting">
+ <menu_item_check.on_check
+ function="Tools.ToolsCheckSelectionLODMode"
+ parameter="medium" />
+ <menu_item_check.on_click
+ function="Tools.SelectionLODMode"
+ parameter="medium" />
+ </menu_item_check>
+ <menu_item_check
+ label="Low"
+ name="Low lod setting">
+ <menu_item_check.on_check
+ function="Tools.ToolsCheckSelectionLODMode"
+ parameter="low" />
+ <menu_item_check.on_click
+ function="Tools.SelectionLODMode"
+ parameter="low" />
+ </menu_item_check>
+ <menu_item_check
+ label="Lowest"
+ name="Lowest lod setting">
+ <menu_item_check.on_check
+ function="Tools.ToolsCheckSelectionLODMode"
+ parameter="lowest" />
+ <menu_item_check.on_click
+ function="Tools.SelectionLODMode"
+ parameter="lowest" />
+ </menu_item_check>
+ </menu>
<menu_item_separator/>
<menu_item_check
@@ -2304,6 +2362,7 @@ function="World.EnvPreset"
</menu_item_check>
<menu_item_check
label="PBR"
+ shortcut="control|alt|shift|]"
name="Rendering Type PBR">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -2901,12 +2960,18 @@ function="World.EnvPreset"
function="Advanced.ForceErrorWorkQueueCrash" />
</menu_item_call>
<menu_item_call
- label="Force a Crash in a Thread"
- name="Force a Crash in a Thread">
+ label="Force an LLError Crash in a Thread"
+ name="Force an LLError Crash in a Thread">
<menu_item_call.on_click
function="Advanced.ForceErrorThreadCrash" />
</menu_item_call>
<menu_item_call
+ label="Force an Exception Crash in a Thread"
+ name="Force an Exception Crash in a Thread">
+ <menu_item_call.on_click
+ function="Advanced.ForceExceptionThreadCrash" />
+ </menu_item_call>
+ <menu_item_call
label="Force Disconnect Viewer"
name="Force Disconnect Viewer">
<menu_item_call.on_click
diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
index ee77ef23f0..63d37edf38 100644
--- a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
@@ -80,6 +80,20 @@
function="Attachment.Profile" />
</menu_item_call>
<menu_item_call
+ label="Add to favorites"
+ layout="topleft"
+ name="favorites_add">
+ <on_click
+ function="Attachment.Favorite" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove from favorites"
+ layout="topleft"
+ name="favorites_remove">
+ <on_click
+ function="Attachment.Favorite" />
+ </menu_item_call>
+ <menu_item_call
label="Show Original"
layout="topleft"
visible="false"
diff --git a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
index 321e8a0831..9a752a1643 100644
--- a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
@@ -31,6 +31,20 @@
function="Wearing.Detach"
parameter="detach"/>
</menu_item_call>
+ <menu_item_call
+ label="Add to favorites"
+ layout="topleft"
+ name="favorites_add">
+ <on_click
+ function="Wearing.Favorite" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove from favorites"
+ layout="topleft"
+ name="favorites_remove">
+ <on_click
+ function="Wearing.Favorite" />
+ </menu_item_call>
<menu_item_separator
layout="topleft"
name="edit_outfit_separator" />
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 4245b22e88..5b9144e535 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1322,6 +1322,14 @@ Error encoding snapshot.
<notification
icon="alertmodal.tga"
+ name="ErrorEncodingImage"
+ type="alertmodal">
+ Failed to encode image, reason: [REASON]
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="ErrorTextureCannotAfford"
type="alertmodal">
You need L$[COST] to save a texture to your inventory. You may either buy L$ or save the photo to your computer instead.
@@ -1662,7 +1670,7 @@ The new skin will appear after you restart [APP_NAME].
icon="alertmodal.tga"
name="ChangeLanguage"
type="alertmodal">
-Changing language will take effect after you restart [APP_NAME].
+Changing language or time format will take effect after you restart [APP_NAME].
</notification>
<notification
@@ -2231,6 +2239,25 @@ Couldn&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
+&apos;Get Info&apos;, then check &apos;Open using Rosetta&apos;
+ <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:
@@ -3139,9 +3166,13 @@ Would you be my friend?
<input name="listname" type="text"/>
<button
default="true"
- index="0"
+ index="1"
name="SetName"
text="OK"/>
+ <button
+ index="0"
+ name="Cancel"
+ text="Cancel"/>
</form>
</notification>
@@ -3170,6 +3201,29 @@ Would you be my friend?
<notification
icon="alertmodal.tga"
+ label="Rename Auto-Replace List"
+ name="RemoveAutoReplaceList"
+ type="alertmodal">
+'[LIST_NAME]' contains [MAP_SIZE] entries.
+
+Are you sure you want to delete this list?
+ <tag>confirm</tag>
+ <form name="form">
+ <button
+ default="true"
+ index="1"
+ name="DeleteList"
+ text="Delete"/>
+ <button
+ default="false"
+ index="0"
+ name="Cancel"
+ text="Cancel"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="InvalidAutoReplaceEntry"
type="alertmodal">
The keyword must be a single word, and the replacement may not be empty.
@@ -4628,13 +4682,12 @@ You already have blocked this name.
<notification
icon="alert.tga"
- name="RemoveItemWarn"
+ name="CantModifyContentInNoModTask"
type="alert">
-Though permitted, deleting contents may damage the object. Do you want to delete that item?
+You don't have permission to modify content of this object
<tag>confirm</tag>
<usetemplate
- name="okcancelbuttons"
- notext="Cancel"
+ name="okbutton"
yestext="OK"/>
</notification>
@@ -6542,6 +6595,22 @@ Do you want to replace it with the selected object?
</notification>
<notification
+ icon="alertmodal.tga"
+ name="CantLinkNotecard"
+ type="alertmodal">
+ You must save the notecard before creating a link to it.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantLinkMaterial"
+ type="alertmodal">
+ You must save the material before creating a link to it.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
icon="alert.tga"
label="Do Not Disturb Mode Warning"
name="DoNotDisturbModePay"
@@ -7136,6 +7205,20 @@ You don&apos;t have permission to view this notecard.
</notification>
<notification
+ icon="alertmodal.tga"
+ name="MaterialImagesWereScaled"
+ type="alertmodal">
+One or more textures in this material were scaled to be within the allowed limits.
+Textures must have power of two dimensions and must not exceed [MAX_SIZE]x[MAX_SIZE] pixels.
+ <unique/>
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Warn if textures will be scaled during upload."
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
icon="notifytip.tga"
name="RezItemNoPermissions"
type="notifytip">
@@ -9453,8 +9536,11 @@ Unable to upload texture: &apos;[NAME]&apos;
icon="alertmodal.tga"
name="CannotUploadMaterial"
type="alertmodal">
-There was a problem uploading the file
+Unable to upload material file. The file may be corrupted, in an unsupported format, or contain invalid data. Please check that you're using a valid GLTF/GLB file with proper material definitions.
<tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
@@ -10336,6 +10422,14 @@ You are now the owner of object [OBJECT_NAME]
<notification
icon="alertmodal.tga"
+ name="NowOwnObjectInv"
+ type="notify">
+ <tag>fail</tag>
+You are now the owner of object [OBJECT_NAME] and it has been placed in your inventory.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="CantRezOnLand"
type="notify">
<tag>fail</tag>
@@ -12088,6 +12182,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.
@@ -12614,4 +12719,24 @@ Select the "use as favorite folder" from a folder's menu to set it as the favori
notext="Cancel"
yestext="Continue"/>
</notification>
+
+ <notification
+ icon="notify.tga"
+ name="WaterExclusionNoMaterial"
+ persist="true"
+ type="notify">
+ Unable to apply material to the water exclusion surface.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="ImageUploadResized"
+ type="alertmodal">
+ The texture you are uploading has been resized from [ORIGINAL_WIDTH]x[ORIGINAL_HEIGHT] to [NEW_WIDTH]x[NEW_HEIGHT] in order to to fit the maximum size of [MAX_WIDTH]x[MAX_HEIGHT] pixels.
+ <usetemplate
+ ignoretext="Image Upload Resized"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml
index 66c35558b1..cdbfd4ac56 100644
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml
+++ b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml
@@ -36,16 +36,16 @@
left_delta="0"
name="classifieds_edit"
top="29"
- width="651" />
+ width="650" />
<combo_box
follows="right|top"
layout="topleft"
height="23"
allow_text_entry="false"
top_delta="0"
- left_pad="2"
+ left_pad="1"
name="classifieds_category"
- width="122">
+ width="120">
<combo_box.commit_callback
function="CommitSearch" />
</combo_box>
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml
index 57cb4990e4..00f5de5ed4 100644
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml
+++ b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml
@@ -74,15 +74,15 @@
left="6"
name="events_edit"
top="29"
- width="651" />
+ width="650" />
<combo_box
follows="right|top"
layout="topleft"
height="23"
top_delta="0"
- left_pad="2"
+ left_pad="1"
name="events_category"
- width="122">
+ width="120">
<combo_box.item label="Any Category" name="any" value="0" />
<combo_box.item label="" value="filter_separator" enabled="false" />
<combo_box.item label="Discussion" name="discussion" value="18" />
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml
index 09c142b8fc..c63818f8e3 100644
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml
@@ -36,16 +36,16 @@
left_delta="0"
name="places_edit"
top="29"
- width="651" />
+ width="650" />
<combo_box
follows="right|top"
layout="topleft"
height="23"
allow_text_entry="false"
top_delta="0"
- left_pad="2"
+ left_pad="1"
name="places_category"
- width="122">
+ width="120">
<combo_box.commit_callback
function="CommitSearch" />
</combo_box>
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index da900c783b..7b404ef5ca 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -203,7 +203,7 @@ background_visible="false"
name="button_row_ls"
left="6"
orientation="horizontal"
- top_pad="5"
+ top_pad="2"
width="297">
<layout_panel
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 02e135a2c7..868d54401e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel
- height="750"
+ height="770"
label="Members &amp; Roles"
layout="topleft"
left="0"
@@ -18,9 +18,9 @@
<panel.string
name="help_text" />
<tab_container
- border="false"
+ border="false"
follows="left|top|right"
- height="552"
+ height="770"
halign="center"
layout="topleft"
left="0"
@@ -29,16 +29,10 @@
tab_position="top"
tab_height="22"
tab_min_width="90"
- top="0"
- width="304">
+ top="0">
<panel
border="false"
- follows="all"
- height="303"
label="MEMBERS"
- layout="topleft"
- left="0"
- right="-1"
help_topic="roles_members_tab"
name="members_sub_tab"
tool_tip="Members"
@@ -65,16 +59,16 @@ clicking on their names.
name="power_partial_icon" translate="false">
Checkbox_Off
</panel.string>
- <filter_editor
- layout="topleft"
- top="5"
- left="5"
- right="-5"
- height="22"
- search_button_visible="false"
- follows="left|top|right"
- label="Filter Members"
- name="filter_input" />
+ <filter_editor
+ layout="topleft"
+ top="5"
+ left="5"
+ right="-5"
+ height="22"
+ search_button_visible="false"
+ follows="left|top|right"
+ label="Filter Members"
+ name="filter_input" />
<name_list
column_padding="2"
draw_heading="true"
@@ -90,11 +84,11 @@ clicking on their names.
<name_list.columns
label="Member"
name="name"
- relative_width="0.44" />
+ relative_width="0.44" />
<name_list.columns
label="Donation"
name="donated"
- relative_width="0.2" />
+ relative_width="0.2" />
<name_list.columns
label="Status"
name="online"
@@ -118,25 +112,21 @@ clicking on their names.
left_pad="10"
name="member_eject"
width="100" />
- <button
- height="23"
- label="Ban Member(s)"
- follows="top|left"
- left_pad="10"
- name="member_ban"
- width="100" />
+ <button
+ height="23"
+ label="Ban Member(s)"
+ follows="top|left"
+ left_pad="10"
+ name="member_ban"
+ width="100" />
</panel>
<panel
border="false"
- height="303"
label="ROLES"
- layout="topleft"
- left="0"
- right="-1"
help_topic="roles_roles_tab"
name="roles_sub_tab"
class="panel_group_roles_subtab">
- <!-- <button
+ <!--<button
enabled="false"
height="20"
label="Show All"
@@ -145,411 +135,393 @@ clicking on their names.
right="-5"
name="show_all_button"
width="100" />-->
- <panel.string
- name="help_text">
- Roles have a title and an allowed list of Abilities
- that Members can perform. Members can belong to
- one or more Roles. A group can have up to 10 Roles,
- including the Everyone and Owner Roles.
- </panel.string>
- <panel.string
- name="cant_delete_role">
- The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
- </panel.string>
- <panel.string
- name="power_folder_icon" translate="false">
- Inv_FolderClosed
- </panel.string>
- <panel.string
- name="power_all_have_icon" translate="false">
- Checkbox_On
- </panel.string>
- <panel.string
- name="power_partial_icon" translate="false">
- Checkbox_Off
- </panel.string>
- <filter_editor
- layout="topleft"
- top="5"
- left="5"
- right="-5"
- height="22"
- search_button_visible="false"
- follows="left|top|right"
- label="Filter Roles"
- name="filter_input" />
- <scroll_list
- column_padding="0"
- draw_heading="true"
- draw_stripes="false"
- heading_height="23"
- height="132"
- layout="topleft"
- search_column="1"
- left="0"
- follows="left|top|right"
- right="-1"
- name="role_list"
- top_pad="2"
- width="310">
- <scroll_list.columns
- label="Role"
- name="name"
- relative_width="0.45" />
- <scroll_list.columns
- label="Title"
- name="title"
- relative_width="0.45" />
- <scroll_list.columns
- label="#"
- name="members"
- relative_width="0.15" />
- </scroll_list>
- <button
- follows="top|left"
- height="23"
- label="New Role"
- layout="topleft"
- left="0"
- name="role_create"
- width="100" />
- <button
- follows="top|left"
- height="23"
- label="Copy Role"
- layout="topleft"
- left_pad="10"
- name="role_copy"
- width="100" />
- <button
- height="23"
- follows="top|left"
- label="Delete Role"
- layout="topleft"
- left_pad="10"
- name="role_delete"
- width="100" />
- </panel>
+ <panel.string
+ name="help_text">
+ Roles have a title and an allowed list of Abilities
+that Members can perform. Members can belong to
+one or more Roles. A group can have up to 10 Roles,
+including the Everyone and Owner Roles.
+ </panel.string>
+ <panel.string
+ name="cant_delete_role">
+ The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
+ </panel.string>
+ <panel.string
+ name="power_folder_icon" translate="false">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string
+ name="power_all_have_icon" translate="false">
+ Checkbox_On
+ </panel.string>
+ <panel.string
+ name="power_partial_icon" translate="false">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor
+ layout="topleft"
+ top="5"
+ left="5"
+ right="-5"
+ height="22"
+ search_button_visible="false"
+ follows="left|top|right"
+ label="Filter Roles"
+ name="filter_input" />
+ <scroll_list
+ column_padding="0"
+ draw_heading="true"
+ draw_stripes="false"
+ heading_height="23"
+ height="138"
+ layout="topleft"
+ search_column="1"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ name="role_list"
+ top_pad="2">
+ <scroll_list.columns
+ label="Role"
+ name="name"
+ relative_width="0.45" />
+ <scroll_list.columns
+ label="Title"
+ name="title"
+ relative_width="0.45" />
+ <scroll_list.columns
+ label="#"
+ name="members"
+ relative_width="0.15" />
+ </scroll_list>
+ <button
+ follows="top|left"
+ height="23"
+ label="New Role"
+ layout="topleft"
+ left="0"
+ name="role_create"
+ width="100" />
+ <button
+ follows="top|left"
+ height="23"
+ label="Copy Role"
+ layout="topleft"
+ left_pad="10"
+ name="role_copy"
+ width="100" />
+ <button
+ height="23"
+ follows="top|left"
+ label="Delete Role"
+ layout="topleft"
+ left_pad="10"
+ name="role_delete"
+ width="100" />
+ </panel>
+ <panel
+ border="false"
+ label="ABILITIES"
+ help_topic="roles_actions_tab"
+ name="actions_sub_tab"
+ class="panel_group_actions_subtab"
+ tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability.">
+ <panel.string
+ name="help_text">
+ Abilities allow Members in Roles to do specific
+things in this group. There&apos;s a broad variety of Abilities.
+ </panel.string>
+ <panel.string
+ name="power_folder_icon" translate="false">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string
+ name="power_all_have_icon" translate="false">
+ Checkbox_On
+ </panel.string>
+ <panel.string
+ name="power_partial_icon" translate="false">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor
+ layout="topleft"
+ top="5"
+ left="5"
+ right="-5"
+ height="22"
+ search_button_visible="false"
+ follows="left|top|right"
+ label="Filter Abilities"
+ name="filter_input" />
+ <scroll_list
+ column_padding="0"
+ draw_stripes="true"
+ height="200"
+ follows="left|top|right"
+ layout="topleft"
+ left="0"
+ right="-1"
+ name="action_list"
+ search_column="2"
+ tool_tip="Select an Ability to view more details"
+ top_pad="5">
+ <scroll_list.columns
+ label=""
+ name="icon"
+ width="2" />
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="action" />
+ </scroll_list>
+ </panel>
+ <panel
+ border="false"
+ label="BANNED RESIDENTS"
+ help_topic="roles_banlist_tab"
+ name="banlist_sub_tab"
+ class="panel_group_banlist_subtab"
+ tool_tip="View the banned residents from this group.">
+ <panel.string
+ name="help_text">
+ Any resident on the ban list will be unable to join the group.
+ </panel.string>
+ <panel.string
+ name="ban_count_template">
+ Ban count: [COUNT]/[LIMIT]
+ </panel.string>
+ <name_list
+ column_padding="0"
+ draw_heading="true"
+ height="714"
+ follows="left|top|right"
+ layout="topleft"
+ left="0"
+ right="-1"
+ multi_select="true"
+ name="ban_list"
+ short_names="false"
+ top_pad="5">
+ <name_list.columns
+ label="Resident"
+ name="name"
+ font.name="SANSSERIF_SMALL"
+ font.style="NORMAL"
+ relative_width="0.7" />
+ <name_list.columns
+ label="Date Banned"
+ name="ban_date"
+ relative_width="0.3" />
+ </name_list>
+ <button
+ follows="top|left"
+ height="23"
+ label="Ban Resident(s)"
+ layout="topleft"
+ left="3"
+ name="ban_create"
+ tool_tip="Ban residents from your group"
+ width="120" />
+ <button
+ follows="top|left"
+ height="23"
+ label="Remove Ban(s)"
+ layout="topleft"
+ left_pad="5"
+ name="ban_delete"
+ tool_tip="Unban selected residents from your group"
+ width="120" />
+ <button
+ follows="top|left"
+ height="23"
+ width="23"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ left_pad="5"
+ name="ban_refresh"
+ tool_tip="Refresh the ban list" />
+ <text
+ type="string"
+ height="18"
+ left_pad="5"
+ follows="top|left"
+ layout="topleft"
+ name="ban_count"
+ width="100">
+ </text>
+ </panel>
+ </tab_container>
<panel
- border="false"
- height="303"
- label="ABILITIES"
+ height="350"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
+ follows="top|left|right"
left="0"
right="-1"
- help_topic="roles_actions_tab"
- name="actions_sub_tab"
- class="panel_group_actions_subtab"
- tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
- width="310">
- <panel.string
- name="help_text">
- Abilities allow Members in Roles to do specific
- things in this group. There&apos;s a broad variety of Abilities.
- </panel.string>
- <panel.string
- name="power_folder_icon" translate="false">
- Inv_FolderClosed
- </panel.string>
- <panel.string
- name="power_all_have_icon" translate="false">
- Checkbox_On
- </panel.string>
- <panel.string
- name="power_partial_icon" translate="false">
- Checkbox_Off
- </panel.string>
- <filter_editor
- layout="topleft"
- top="5"
- left="5"
- right="-5"
- height="22"
- search_button_visible="false"
- follows="left|top|right"
- label="Filter Abilities"
- name="filter_input" />
- <scroll_list
- column_padding="0"
- draw_stripes="true"
- height="200"
- follows="left|top|right"
- layout="topleft"
- left="0"
- right="-1"
- name="action_list"
- search_column="2"
- tool_tip="Select an Ability to view more details"
- top_pad="5"
- width="300">
- <scroll_list.columns
- label=""
- name="icon"
- width="2" />
- <scroll_list.columns
- label=""
- name="checkbox"
- width="20" />
- <scroll_list.columns
- label=""
- name="action" />
- </scroll_list>
+ mouse_opaque="false"
+ name="members_footer"
+ top="325"
+ visible="false">
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ top="8"
+ text_color="EmphasisColor"
+ name="static"
+ width="300">
+ Assigned Roles
+ </text>
+ <scroll_list
+ draw_stripes="true"
+ follows="left|top|right"
+ height="150"
+ layout="topleft"
+ left="0"
+ right="-1"
+ name="member_assigned_roles"
+ top_pad="0">
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="role"
+ width="270" />
+ </scroll_list>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ top_pad="5"
+ text_color="EmphasisColor"
+ name="static2"
+ width="285">
+ Allowed Abilities
+ </text>
+ <scroll_list
+ draw_stripes="true"
+ follows="left|top|right"
+ height="150"
+ layout="topleft"
+ left="0"
+ right="-1"
+ name="member_allowed_actions"
+ search_column="2"
+ tool_tip="For details of each allowed ability see the abilities tab"
+ top_pad="0">
+ <scroll_list.columns
+ label=""
+ name="icon"
+ width="2" />
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="action"
+ width="270" />
+ </scroll_list>
</panel>
<panel
- border="false"
- height="303"
- label="BANNED RESIDENTS"
+ height="90"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
+ follows="top|left|right"
left="0"
right="-1"
- help_topic="roles_banlist_tab"
- name="banlist_sub_tab"
- class="panel_group_banlist_subtab"
- tool_tip="View the banned residents from this group."
- width="310">
- <panel.string
- name="help_text">
- Any resident on the ban list will be unable to join the group.
- </panel.string>
- <panel.string
- name="ban_count_template">
- Ban count: [COUNT]/[LIMIT]
- </panel.string>
- <name_list
- column_padding="0"
- draw_heading="true"
- height="400"
- follows="left|top|right"
- layout="topleft"
- left="0"
- right="-1"
- multi_select="true"
- name="ban_list"
- short_names="false"
- top_pad="5">
- <name_list.columns
- label="Resident"
- name="name"
- font.name="SANSSERIF_SMALL"
- font.style="NORMAL"
- relative_width="0.7" />
- <name_list.columns
- label="Date Banned"
- name="ban_date"
- relative_width="0.3" />
- </name_list>
- <button
- follows="top|left"
- height="23"
- label="Ban Resident(s)"
- layout="topleft"
- left="3"
- name="ban_create"
- tool_tip="Ban residents from your group"
- width="120" />
- <button
- follows="top|left"
- height="23"
- label="Remove Ban(s)"
- layout="topleft"
- left_pad="5"
- name="ban_delete"
- tool_tip="Unban selected residents from your group"
- width="120" />
- <button
- follows="top|left"
- height="23"
- width="23"
- image_overlay="Refresh_Off"
- layout="topleft"
- left_pad="5"
- name="ban_refresh"
- tool_tip="Refresh the ban list"
- />
- <text
- type="string"
- height="18"
- left_pad="5"
- follows="top|left"
- layout="topleft"
- name="ban_count"
- width="100">
- </text>
+ mouse_opaque="false"
+ name="members_header"
+ top_pad="3"
+ visible="false">
+ <text_editor
+ bg_readonly_color="Transparent"
+ text_readonly_color="EmphasisColor"
+ font="SansSerifSmall"
+ type="string"
+ enabled="false"
+ halign="left"
+ layout="topleft"
+ top_pad="0"
+ follows="left|top|right"
+ left="0"
+ right="-1"
+ height="90"
+ max_length="512"
+ name="member_action_description"
+ word_wrap="true">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
</panel>
- </tab_container>
- <panel
- height="350"
- background_visible="false"
- bg_alpha_color="FloaterUnfocusBorderColor"
- layout="topleft"
- follows="top|left|right"
- left="0"
- right="-1"
- width="313"
- mouse_opaque="false"
- name="members_footer"
- top="325"
- visible="false">
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- top="8"
- text_color="EmphasisColor"
- name="static"
- width="300">
- Assigned Roles
- </text>
- <scroll_list
- draw_stripes="true"
- follows="left|top|right"
- height="150"
+ <panel
+ height="460"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
+ follows="top|left|right"
left="0"
right="-1"
- name="member_assigned_roles"
- top_pad="0">
- <scroll_list.columns
- label=""
- name="checkbox"
- width="20" />
- <scroll_list.columns
- label=""
- name="role"
- width="270" />
- </scroll_list>
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- top_pad="5"
- text_color="EmphasisColor"
- name="static2"
- width="285">
- Allowed Abilities
- </text>
- <scroll_list
- draw_stripes="true"
+ mouse_opaque="false"
+ name="roles_footer"
+ top_delta="0"
+ top="215"
+ visible="false">
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ top="5"
+ name="static"
+ width="300">
+ Role Name
+ </text>
+ <line_editor
+ type="string"
+ height="20"
+ layout="topleft"
+ left="0"
follows="left|top|right"
- height="150"
- layout="topleft"
- left="0"
- right="-1"
- name="member_allowed_actions"
- search_column="2"
- tool_tip="For details of each allowed ability see the abilities tab"
- top_pad="0">
- <scroll_list.columns
- label=""
- name="icon"
- width="2" />
- <scroll_list.columns
- label=""
- name="checkbox"
- width="20" />
- <scroll_list.columns
- label=""
- name="action"
- width="270" />
- </scroll_list>
- </panel>
- <panel
- height="90"
- background_visible="false"
- bg_alpha_color="FloaterUnfocusBorderColor"
- layout="topleft"
- follows="top|left|right"
- left="0"
- right="-1"
- width="313"
- mouse_opaque="false"
- name="members_header"
- top_pad="3"
- visible="false">
- <text_editor
- bg_readonly_color="Transparent"
- text_readonly_color="EmphasisColor"
- font="SansSerifSmall"
- type="string"
- enabled="false"
- halign="left"
- layout="topleft"
- top_pad="0"
- follows="left|top|right"
- left="0"
- right="-1"
- height="90"
- max_length="512"
- name="member_action_description"
- word_wrap="true">
- This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
- </text_editor>
- </panel>
- <panel
- height="460"
- background_visible="false"
- bg_alpha_color="FloaterUnfocusBorderColor"
- layout="topleft"
- follows="top|left|right"
- left="0"
- right="-1"
- width="313"
- mouse_opaque="false"
- name="roles_footer"
- top_delta="0"
- top="209"
- visible="false">
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- top="5"
- name="static"
- width="300">
- Role Name
- </text>
- <line_editor
- type="string"
- height="20"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- max_length_bytes="20"
- name="role_name"
- top_pad="0"
- width="300">
- </line_editor>
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- name="static3"
- top_pad="5"
- width="300">
- Role Title
- </text>
- <line_editor
- type="string"
- height="20"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- max_length_bytes="20"
- name="role_title"
- top_pad="0"
- width="300">
- </line_editor>
- <text
+ right="-1"
+ max_length_bytes="20"
+ name="role_name"
+ top_pad="0">
+ </line_editor>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ name="static3"
+ top_pad="5"
+ width="300">
+ Role Title
+ </text>
+ <line_editor
+ type="string"
+ height="20"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ max_length_bytes="20"
+ name="role_title"
+ top_pad="0">
+ </line_editor>
+ <text
type="string"
height="16"
layout="topleft"
@@ -558,192 +530,185 @@ clicking on their names.
name="static2"
top_pad="5"
width="200">
- Description
- </text>
- <text_editor
- type="string"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- max_length="295"
- height="35"
- name="role_description"
- top_pad="0"
- width="300"
- word_wrap="true">
- </text_editor>
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- text_color="EmphasisColor"
- name="static4"
- top_pad="5"
- width="300">
- Assigned Members
- </text>
- <name_list
- draw_stripes="true"
- height="128"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- name="role_assigned_members"
- top_pad="0"
- width="300" />
- <check_box
- height="15"
- label="Reveal members"
- left="5"
- layout="topleft"
- name="role_visible_in_list"
- tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
- top_pad="4"
- width="300" />
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- text_color="EmphasisColor"
- name="static5"
- top_pad="2"
- width="300">
- Allowed Abilities
- </text>
- <scroll_list
- draw_stripes="true"
- height="140"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- name="role_allowed_actions"
- search_column="2"
- tool_tip="For details of each allowed ability see the abilities tab"
- top_pad="0"
- width="300">
- <scroll_list.columns
- label=""
- name="icon"
- width="2" />
- <scroll_list.columns
- label=""
- name="checkbox"
- width="20" />
- <scroll_list.columns
- label=""
- name="action" />
- </scroll_list>
- </panel>
- <panel
- height="90"
- background_visible="false"
- bg_alpha_color="FloaterUnfocusBorderColor"
- layout="topleft"
- follows="top|left|right"
- left="0"
- right="-1"
- width="313"
- mouse_opaque="false"
- name="roles_header"
- top_pad="3"
- visible="false">
- <text_editor
- bg_readonly_color="Transparent"
- text_readonly_color="EmphasisColor"
- font="SansSerifSmall"
- type="string"
- enabled="false"
- halign="left"
- layout="topleft"
- top_pad="0"
- follows="left|top|right"
- left="0"
- right="-1"
+ Description
+ </text>
+ <text_editor
+ type="string"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ max_length="295"
+ height="35"
+ name="role_description"
+ top_pad="0"
+ word_wrap="true">
+ </text_editor>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ text_color="EmphasisColor"
+ name="static4"
+ top_pad="5"
+ width="300">
+ Assigned Members
+ </text>
+ <name_list
+ draw_stripes="true"
+ height="128"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ name="role_assigned_members"
+ top_pad="0" />
+ <check_box
+ height="15"
+ label="Reveal members"
+ left="5"
+ layout="topleft"
+ name="role_visible_in_list"
+ tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
+ top_pad="4"
+ width="300" />
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ text_color="EmphasisColor"
+ name="static5"
+ top_pad="2"
+ width="300">
+ Allowed Abilities
+ </text>
+ <scroll_list
+ draw_stripes="true"
+ height="140"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ name="role_allowed_actions"
+ search_column="2"
+ tool_tip="For details of each allowed ability see the abilities tab"
+ top_pad="0">
+ <scroll_list.columns
+ label=""
+ name="icon"
+ width="2" />
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="action" />
+ </scroll_list>
+ </panel>
+ <panel
height="90"
- max_length="512"
- name="role_action_description"
- word_wrap="true">
- This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
- </text_editor>
- </panel>
- <panel
- height="424"
- background_visible="false"
- bg_alpha_color="FloaterUnfocusBorderColor"
- layout="topleft"
- follows="top|left|right"
- left="0"
- right="-1"
- width="313"
- mouse_opaque="false"
- name="actions_footer"
- top_delta="0"
- top="255"
- visible="false">
- <text_editor
- bg_readonly_color="Transparent"
- text_readonly_color="EmphasisColor"
- font="SansSerifSmall"
- type="string"
- enabled="false"
- halign="left"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
- follows="left|top|right"
+ follows="top|left|right"
left="0"
right="-1"
- height="90"
- max_length="512"
- name="action_description"
- top="0"
- word_wrap="true">
- This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
- </text_editor>
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- name="static2"
- top_pad="1"
- width="300">
- Roles with this ability
- </text>
- <scroll_list
- height="172"
- layout="topleft"
- follows="left|top|right"
- left="5"
- right="-1"
- name="action_roles"
- top_pad="0"
- width="300" />
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- name="static3"
- top_pad="5"
- width="300">
- Members with this ability
- </text>
- <name_list
- height="122"
- follows="left|top|right"
+ mouse_opaque="false"
+ name="roles_header"
+ top_pad="3"
+ visible="false">
+ <text_editor
+ bg_readonly_color="Transparent"
+ text_readonly_color="EmphasisColor"
+ font="SansSerifSmall"
+ type="string"
+ enabled="false"
+ halign="left"
+ layout="topleft"
+ top_pad="0"
+ follows="left|top|right"
+ left="0"
+ right="-1"
+ height="90"
+ max_length="512"
+ name="role_action_description"
+ word_wrap="true">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
+ </panel>
+ <panel
+ height="513"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
- left="5"
+ follows="top|left|right"
+ left="0"
right="-1"
- name="action_members"
- top_pad="0"
- width="300" />
- </panel>
+ mouse_opaque="false"
+ name="actions_footer"
+ top_delta="0"
+ top="255"
+ visible="false">
+ <text_editor
+ bg_readonly_color="Transparent"
+ text_readonly_color="EmphasisColor"
+ font="SansSerifSmall"
+ type="string"
+ enabled="false"
+ halign="left"
+ layout="topleft"
+ follows="left|top|right"
+ left="0"
+ right="-1"
+ height="90"
+ max_length="512"
+ name="action_description"
+ top="0"
+ word_wrap="true">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ name="static2"
+ top_pad="1"
+ width="300">
+ Roles with this ability
+ </text>
+ <scroll_list
+ height="216"
+ layout="topleft"
+ follows="left|top|right"
+ left="5"
+ right="-1"
+ name="action_roles"
+ top_pad="0" />
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ name="static3"
+ top_pad="5"
+ width="300">
+ Members with this ability
+ </text>
+ <name_list
+ height="167"
+ follows="left|top|right"
+ layout="topleft"
+ left="5"
+ right="-1"
+ name="action_members"
+ top_pad="0" />
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml
index 73cb9b080f..f5906c17fd 100644
--- a/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml
@@ -43,6 +43,16 @@
follows="left|top"
visible="false"
image_name="Inv_Link"/>
+ <icon
+ layout="topleft"
+ follows="left|top"
+ name="fav_icon"
+ left="110"
+ top_pad="-14"
+ height="14"
+ width="14"
+ visible="true"
+ image_name="Inv_Favorite_Star_Full"/>
<panel
background_visible="false"
background_opaque="true"
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index e25145dd2a..9cb64e7a13 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -40,6 +40,10 @@
Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
</string>
<string
+ name="acquired_date_ampm">
+ [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt]
+ </string>
+ <string
name="acquired_date">
[wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
</string>
diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml
index 0a8ae48b02..d6ac71db94 100644
--- a/indra/newview/skins/default/xui/en/panel_login_first.xml
+++ b/indra/newview/skins/default/xui/en/panel_login_first.xml
@@ -6,7 +6,7 @@
name="panel_login"
focus_root="true"
background_visible="true"
- bg_opaque_color="0.0 0.0 0.0 1"
+ bg_opaque_color="0.16 0.16 0.16 1"
background_opaque="true"
width="1024">
<panel.string
@@ -61,7 +61,7 @@
height="105">
<icon
height="94"
- image_name="login_mp_logo"
+ image_name="login_sl_logo"
left="0"
name="sl_logo"
top="0" />
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 498dab1ef3..6e1e6facbe 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -269,6 +269,22 @@
scroll.reserve_scroll_corner="false">
<folder double_click_override="true"/>
</inventory_panel>
+ <favorites_inventory_panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ follows="all"
+ label="FAVORITES"
+ help_topic="recent_inventory_tab"
+ layout="topleft"
+ name="Favorites"
+ show_item_link_overlays="true"
+ preinitialize_views="false"
+ scroll.reserve_scroll_corner="false">
+ <folder double_click_override="true"/>
+ </favorites_inventory_panel>
</tab_container>
</panel>
<panel
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml
index a8a306bea9..9586957694 100644
--- a/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml
@@ -21,5 +21,5 @@
border="false"
bevel_style="none"
show_item_link_overlays="true">
- <item allow_wear="false"/>
+ <item marketplace_item="true"/>
</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml
index 0c665fb07e..5f64a5d47a 100644
--- a/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml
@@ -20,5 +20,5 @@
border="false"
bevel_style="none"
show_item_link_overlays="true">
- <item allow_wear="false"/>
+ <item marketplace_item="true"/>
</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml
index 0be405c5b8..ab4d836ba9 100644
--- a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml
@@ -19,5 +19,5 @@
border="false"
bevel_style="none"
show_item_link_overlays="true">
- <item allow_wear="false"/>
+ <item marketplace_item="true"/>
</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml
index 58122db7f4..303601e65b 100644
--- a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml
@@ -20,5 +20,5 @@
border="false"
bevel_style="none"
show_item_link_overlays="true">
- <item allow_wear="false"/>
+ <item marketplace_item="true"/>
</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
index 6166268206..d49bf19c5d 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
@@ -35,7 +35,7 @@
</text>
<scroll_container
follows="all"
- height="400"
+ height="429"
width="312"
layout="topleft"
left="4"
@@ -44,49 +44,5 @@
name="gallery_scroll_panel"
opaque="false"
top_pad="0">
- </scroll_container>
- <panel
- background_visible="false"
- follows="bottom|left|right"
- height="28"
- layout="topleft"
- left="4"
- top_pad="0"
- visible="true"
- name="bottom_panel"
- width="312">
- <menu_button
- follows="bottom|left"
- tool_tip="Show additional options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="options_gear_btn"
- top="1"
- width="31" />
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="243"/>
- <button
- follows="bottom|right"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="trash_btn"
- tool_tip="Delete selected outfit"
- width="31"/>
- </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
index e8d8e8f3e2..cd4e5ef1f6 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -16,7 +16,7 @@
bg_opaque_color="DkGray2"
follows="all"
- height="400"
+ height="428"
layout="topleft"
left="3"
name="outfits_accordion"
@@ -30,48 +30,4 @@
name="no_outfits_msg"
value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"/>
</accordion>
- <panel
- background_visible="false"
- follows="bottom|left|right"
- height="28"
- layout="topleft"
- left="4"
- top_pad="0"
- visible="true"
- name="bottom_panel"
- width="312">
- <menu_button
- follows="bottom|left"
- tool_tip="Show additional options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="options_gear_btn"
- top="1"
- width="31" />
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="243"/>
- <button
- follows="bottom|right"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="trash_btn"
- tool_tip="Delete selected outfit"
- width="31"/>
- </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
index 559917ec0a..10073f0461 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
@@ -16,7 +16,7 @@
<accordion
fit_parent="true"
follows="all"
- height="400"
+ height="429"
layout="topleft"
left="3"
single_expansion="true"
@@ -62,35 +62,4 @@
</scroll_list>
</accordion_tab>
</accordion>
- <panel
- background_visible="false"
- follows="bottom|left|right"
- height="28"
- layout="topleft"
- left="4"
- name="bottom_panel"
- top_pad="0"
- width="312">
- <menu_button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="options_gear_btn"
- tool_tip="Show additional options"
- top="1"
- width="31" />
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="274" />
- </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index f1c03fdaa8..0766cc06ee 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -177,6 +177,25 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
function="People.DelFriend" />
</dnd_button>
</panel>
+ <slider
+ control_name="NearMeRange"
+ decimal_digits="0"
+ increment="1"
+ follows="left|top"
+ left="5"
+ min_val="0"
+ max_val="4096"
+ label="Range:"
+ name="near_me_range"
+ tool_tip="Nearby people range"
+ width="230"/>
+ <text
+ type="string"
+ follows="left|top"
+ left_delta="225"
+ name="near_me_range_text2">
+ m
+ </text>
<layout_stack
clip="false"
follows="all"
@@ -216,7 +235,7 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
<avatar_list
allow_select="true"
follows="all"
- height="211"
+ height="197"
ignore_online_status="true"
layout="topleft"
left="3"
diff --git a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
index ece9bb2552..a412543251 100644
--- a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
+++ b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
@@ -209,11 +209,11 @@
follows="left|top"
top_delta="-1"
height="16"
- increment="16"
+ increment="8"
initial_value="128"
label_width="90"
layout="topleft"
- min_val="32"
+ min_val="8"
max_val="512"
name="draw_distance"
left_pad="5"
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 9aa0907a38..66cd1cacf1 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -89,6 +89,10 @@
Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
</string>
<string
+ name="acquired_date_ampm">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local]
+ </string>
+ <string
name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 4d9a03823e..1005810145 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -19,7 +19,7 @@ background_visible="false"
value="VISITED" />
<string
name="favorites_tab_title"
- value="FAVORITES" />
+ value="FAVORITES BAR" />
<string
name="tooltip_trash_items"
value="Remove selected landmark or folder" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 8051ffa8ec..b27b6dd73a 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -32,15 +32,15 @@
height="23"
increment="64"
initial_value="1024"
- label="Cache size (256 - 9984MB)"
+ label="Cache size (896 - 32768MB)"
label_width="150"
layout="topleft"
left="80"
- max_val="9984"
- min_val="256"
+ max_val="32768"
+ min_val="896"
top_pad="10"
name="cachesizespinner"
- width="200" />
+ width="210" />
<text
type="string"
length="1"
@@ -59,7 +59,7 @@
label="Clear Cache"
label_selected="Clear Cache"
layout="topleft"
- left_pad="30"
+ left_pad="20"
name="clear_cache"
top_delta="0"
width="100">
@@ -206,6 +206,41 @@
top_delta="0"
width="315" />
</radio_group>
+ <check_box
+ control_name="StreamNotificationChannelEnabled"
+ height="16"
+ label="Custom stream notification channel"
+ layout="topleft"
+ left="30"
+ name="stream_notification_channel_enabled"
+ width="256">
+ </check_box>
+ <spinner
+ control_name="StreamNotificationChannel"
+ enabled_control="StreamNotificationChannelEnabled"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="1"
+ initial_value="751751"
+ label="Channel number:"
+ label_width="105"
+ layout="topleft"
+ left_pad="-25"
+ max_val="2147483647"
+ min_val="-2147483648"
+ name="stream_notification_channel"
+ top_pad="-15"
+ width="170" />
+ <check_box
+ control_name="SnapshotTimestamp"
+ height="16"
+ label="Add timestamp to snapshot file names"
+ layout="topleft"
+ left="30"
+ name="snapshot_timestamp"
+ width="256">
+ </check_box>
<check_box
control_name="AllowMultipleViewers"
@@ -215,7 +250,7 @@
layout="topleft"
left="30"
name="allow_multiple_viewer_check"
- top_pad="20"
+ top_pad="15"
width="237"/>
<check_box
control_name="ForceShowGrid"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 88716c7f96..0aa1af7de6 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -409,7 +409,7 @@
layout="topleft"
left="0"
name="play_sound"
- width="100"
+ width="90"
top_pad="8"
visible="true">
Play sound:
@@ -419,10 +419,10 @@
height="16"
label="New conversation"
layout="topleft"
- left_pad="15"
+ left_pad="5"
top_pad="-10"
name="new_conversation"
- width="150" />
+ width="130" />
<check_box
control_name="PlaySoundIncomingVoiceCall"
height="16"
@@ -430,16 +430,16 @@
layout="topleft"
top_pad="6"
name="incoming_voice_call"
- width="150" />
+ width="130" />
<check_box
control_name="PlaySoundTeleportOffer"
height="16"
label="Teleport offer"
layout="topleft"
- left_pad="35"
+ left_pad="18"
top_pad="-38"
name="teleport_offer"
- width="150" />
+ width="130" />
<check_box
control_name="PlaySoundInventoryOffer"
height="16"
@@ -447,14 +447,23 @@
layout="topleft"
top_pad="6"
name="inventory_offer"
- width="150" />
+ width="130" />
+ <check_box
+ control_name="PlaySoundChatMention"
+ height="16"
+ label="Chat mention"
+ layout="topleft"
+ left_pad="7"
+ top_pad="-38"
+ name="chat_mention"
+ width="130" />
<view_border
bevel_style="none"
height="0"
layout="topleft"
left="0"
name="cost_text_border"
- top_pad="7"
+ top_pad="29"
width="492"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
index b6fdef3475..df9f467fca 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -299,6 +299,107 @@
width="95">
URLs
</text>
+ <color_swatch
+ can_apply_immediately="true"
+ color="EmphasisColor"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="360"
+ name="mentions"
+ top_pad="-15"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="ChatMentionFont" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="ChatMentionFont" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_mentions"
+ top_delta="5"
+ width="95">
+ Mentions
+ </text>
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ name="mentions_colors"
+ top_pad="20"
+ width="170">
+ Chat mentions highlight colors:
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="40"
+ name="mention_self"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="ChatSelfMentionHighlight" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="ChatSelfMentionHighlight" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_mentions_self"
+ top_delta="5"
+ width="95">
+ Me
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="mention_others"
+ top_pad="-15"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="ChatMentionHighlight" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="ChatMentionHighlight" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_mentions_others"
+ top_delta="5"
+ width="95">
+ Others
+ </text>
<text
follows="left|top"
layout="topleft"
@@ -404,7 +505,6 @@
Skin
</text>
<radio_group
- control_name="skin_selection"
height="20"
layout="topleft"
left="35"
@@ -420,14 +520,32 @@
value="default"
width="75" />
<radio_item
+ label="gold"
+ left_pad="0"
+ layout="topleft"
+ top_delta="0"
+ height="16"
+ name="radio2"
+ value="gold"
+ width="75" />
+ <radio_item
label="contrast"
left_pad="0"
layout="topleft"
top_delta="0"
height="16"
- name="radio2"
+ name="radio3"
value="contrast"
width="75" />
+ <radio_item
+ label="contrast gold"
+ left_pad="0"
+ layout="topleft"
+ top_delta="0"
+ height="16"
+ name="radio2"
+ value="contrast_gold"
+ width="75" />
<radio_group.commit_callback
function="Pref.SelectSkin" />
</radio_group>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 101c506309..ddddb4855f 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -91,6 +91,37 @@
name="Traditional Chinese"
value="zh" />
</combo_box>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="255"
+ name="time_format_textbox"
+ top="10"
+ width="200">
+ Time Format:
+ </text>
+ <combo_box
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="255"
+ max_chars="135"
+ name="time_format_combobox"
+ width="70">
+ <combo_box.item
+ enabled="true"
+ label="1:00 AM"
+ name="12H"
+ value="0" />
+ <combo_box.item
+ enabled="true"
+ label="13:00"
+ name="24H"
+ value="1" />
+ </combo_box>
<text
font="SansSerifSmall"
type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index fa692d7200..c78575cf82 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -207,13 +207,13 @@
decimal_digits="0"
follows="left|top"
height="16"
- increment="32"
- initial_value="160"
+ increment="8"
+ initial_value="128"
label="Draw distance:"
label_width="187"
layout="topleft"
left="30"
- min_val="32"
+ min_val="8"
max_val="512"
name="DrawDistance"
top_delta="40"
@@ -230,40 +230,6 @@
width="128">
m
</text>
- <slider
- control_name="IndirectMaxNonImpostors"
- name="IndirectMaxNonImpostors"
- decimal_digits="0"
- increment="1"
- initial_value="12"
- show_text="false"
- min_val="1"
- max_val="66"
- label="Maximum number of animated avatars:"
- follows="left|top"
- layout="topleft"
- height="16"
- label_width="240"
- left="30"
- top_delta="40"
- width="393">
- <slider.commit_callback
- function="Pref.UpdateIndirectMaxNonImpostors"
- parameter="IndirectNonImpostorsText" />
- </slider>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- top_delta="0"
- left_delta="397"
- text_readonly_color="LabelDisabledColor"
- name="IndirectMaxNonImpostorsText"
- width="65">
- 0
- </text>
<button
height="23"
@@ -347,6 +313,41 @@
0
</text>
+ <slider
+ control_name="IndirectMaxNonImpostors"
+ name="IndirectMaxNonImpostors"
+ decimal_digits="0"
+ increment="1"
+ initial_value="12"
+ show_text="false"
+ min_val="1"
+ max_val="66"
+ label="Maximum number of animated avatars:"
+ follows="left|top"
+ layout="topleft"
+ height="16"
+ label_width="240"
+ left="30"
+ top_delta="20"
+ width="393">
+ <slider.commit_callback
+ function="Pref.UpdateIndirectMaxNonImpostors"
+ parameter="IndirectNonImpostorsText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ top_delta="0"
+ left_delta="397"
+ text_readonly_color="LabelDisabledColor"
+ name="IndirectMaxNonImpostorsText"
+ width="65">
+ 0
+ </text>
+
<button
height="23"
label="Exceptions..."
@@ -388,7 +389,7 @@
layout="topleft"
left="10"
name="PrefSaveButton"
- top="310"
+ top="332"
width="200">
<button.commit_callback
function="Pref.PrefSave"
@@ -430,7 +431,7 @@
layout="topleft"
left="10"
name="Defaults"
- top_delta="65"
+ top_delta="42"
width="210">
<button.commit_callback
function="Pref.HardwareDefaults" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml
new file mode 100644
index 0000000000..5a35d682ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml
@@ -0,0 +1,2181 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+
+<panel
+name="Visuals effects panel"
+follows="left|top|right|bottom"
+label="Visuals Effects"
+layout="topleft"
+width="517"
+height="438"
+left="102"
+top="1"
+border="true"
+>
+
+<tab_container
+name="preferences_visuals_tab_container"
+enabled="true"
+top_pad="0"
+follows="left|top"
+width="517"
+height="430"
+left_delta="0"
+tab_position="top"
+tab_stop="false">
+
+<panel
+label="Megapahit"
+name="preferences_visuals_megapahit"
+layout="topleft"
+follows="top|left">
+
+<text
+follows="left|top"
+layout="topleft"
+top_pad="20"
+width="400"
+height="18"
+left="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Megapahit recommended settings:
+</text>
+
+<text
+follows="left|top"
+layout="topleft"
+width="400"
+height="18"
+left="120"
+top_pad="55"
+font="SansSerifSmall"
+>
+Clicking the button below is a good starting point
+</text>
+
+<button
+name="MPBalancedButton"
+follows="top|left"
+layout="topleft"
+width="200"
+height="23"
+left="155"
+top_pad="40"
+label="Recommended Settings"
+>
+</button>
+
+<text
+follows="left|top"
+layout="topleft"
+width="460"
+height="18"
+left="50"
+top_pad="60"
+font="SansSerifSmall"
+>
+We recommend capping the fps (touch the fps counter on the top right corner)
+</text>
+
+</panel>
+
+<panel
+label="Antialiasing"
+name="preferences_visuals_aa"
+layout="topleft"
+follows="top|left">
+
+<text
+name="mp_aa_lbl"
+follows="left|top"
+layout="topleft"
+top_pad="20"
+width="100"
+height="18"
+left="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Antialiasing:
+</text>
+
+<text
+name="mp_aa_type_lbl"
+type="string"
+layout="topleft"
+follows="left|top"
+width="140"
+height="16"
+left="32"
+top_pad="10"
+text_readonly_color="LabelDisabledColor"
+>
+Type:
+</text>
+
+<combo_box
+name="mp_aatype_ctrl"
+control_name="RenderFSAAType"
+label="Antialiasing"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+initial_value="0"
+>
+<combo_box.item
+ label="Disabled"
+ name="FSAADisabled"
+ value="0" />
+<combo_box.item
+ label="FXAA"
+ name="FXAA"
+ value="1" />
+<combo_box.item
+ label="SMAA"
+ name="SMAA"
+ value="2" />
+</combo_box>
+
+<icon
+name="mp_aa_bullet"
+tool_tip="Low performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_aa_info_bullet"
+tool_tip="Antialiasing method (FXAA is fast but blurry, SMAA is sharper)."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_aa_quality_lbl"
+tool_tip="Antialiasing quality: We recommend High or Ultra"
+type="string"
+length="1"
+layout="topleft"
+follows="left|top"
+width="140"
+height="16"
+left="32"
+top_pad="10"
+text_readonly_color="LabelDisabledColor"
+>
+Quality:
+</text>
+
+<combo_box
+name="mp_aa_quality_ctrl"
+control_name="RenderFSAASamples"
+label="Antialiasing"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="Low"
+name="Low"
+value="0" />
+<combo_box.item
+label="Medium"
+name="Medium"
+value="1" />
+<combo_box.item
+label="High"
+name="High"
+value="2" />
+<combo_box.item
+label="Ultra"
+name="Ultra"
+value="3" />
+</combo_box>
+
+<icon
+name="mp_aaq_bullet"
+tool_tip="Low performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_aaq_info_bullet"
+tool_tip="Quality of the selected antialiasing"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_cas_lbl"
+type="string"
+length="1"
+layout="topleft"
+follows="left|top"
+width="140"
+height="16"
+left="32"
+top_pad="20"
+text_readonly_color="LabelDisabledColor"
+>
+Sharpness:
+</text>
+
+<slider
+name="mp_cas_ctrl"
+control_name="RenderCASSharpness"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="0"
+initial_value="0.0"
+min_val="0.0"
+max_val="1.0"
+decimal_digits="1"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_cas_bullet"
+tool_tip="No performance impact, except there is an issue currently with the combination of SMAA and Sharpness, where the performance is going down. We are investigating..."
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_cas_info_bullet"
+tool_tip="Add sharpness to the image."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="aniso_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="20"
+top_pad="40"
+font="SansSerifSmall"
+text_color="White"
+>
+Texture Filtering
+</text>
+
+<check_box
+name="mp_aniso_ctrl"
+control_name="RenderAnisotropic"
+label="Anisotropic Filtering"
+layout="topleft"
+width="200"
+height="16"
+left="20"
+top_delta="32"
+initial_value="true"
+>
+<check_box.commit_callback
+function="Pref.RenderOptionUpdate" />
+</check_box>
+
+<icon
+name="mp_aniso_bullet"
+tool_tip="Low performance impact on PC/Linux, Medium performance impact on Mac (We are investigating)"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_aniso_info_bullet"
+tool_tip="Improves textures clarity at certain angles (i.e. ground). This should be on, but on Mac there is an abnormal performance penalty, currently."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+</panel>
+
+<panel
+label="Shadows"
+name="preferences_visuals_shadows"
+layout="topleft"
+follows="top|left">
+
+<text
+name="mp_shadows_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="20"
+top_pad="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Shadows
+</text>
+
+<text
+name="shadow_src_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Shadows source:
+</text>
+
+<combo_box
+name="ShadowDetailCtrl"
+control_name="RenderShadowDetail"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="None"
+name="0"
+value="0"/>
+<combo_box.item
+label="Sun/Moon"
+name="1"
+value="1"/>
+<combo_box.item
+label="Sun/Moon + Projectors"
+name="2"
+value="2"/>
+<combo_box.item
+label="Projectors only"
+name="3"
+value="3"/>
+</combo_box>
+
+<icon
+name="mp_shadows_bullet"
+tool_tip="High to extreme performance impact"
+image_name="mp_red_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_shadows_info_bullet"
+tool_tip="Enables a shadow source (Projectors only is experimental)"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="shadow_dist_lbl"
+tool_tip="Maximum Shadow Draw distance (Enormous performance penalty)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall">
+Shadows Distance
+</text>
+
+<slider
+name="MPShadowDistCtrl"
+control_name="MPRenderShadowMaxDist"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="8"
+initial_value="64"
+min_val="16"
+max_val="256"
+decimal_digits="0"
+label_width="2">
+</slider>
+
+<icon
+name="mp_shadowd_bullet"
+tool_tip="Move to the left to improve performance"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_shadowd_info_bullet"
+tool_tip="Limit the maximum shadow render distance"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="shadow_res_lbl"
+tool_tip="Shadow Resolution (Important video memory impact. Lower this if you encounter performance drop, or instability.)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Shadows Resolution
+</text>
+
+<slider
+name="MPShadowResCtrl"
+control_name="RenderShadowResolutionScale"
+decimal_digits="1"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.5"
+initial_value="2.0"
+min_val="1.0"
+max_val="8.0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_shadowdd_bullet"
+tool_tip="Move to the right to improve quality: High memory usage and potentially unstable on lower end gpus"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_shadowdd_info_bullet"
+tool_tip="Improves the shadow map resolution (Use carefully)"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="shadow_res_lbl"
+tool_tip="Shadow smoothness (This will only work if you activate Ambient Occlusion)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Shadows Smoothness
+</text>
+
+<slider
+name="shadowBlurCtrl"
+control_name="RenderShadowBlurSize"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.1"
+initial_value="1.0"
+min_val="0.0"
+max_val="3.0"
+decimal_digits="1"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_shadowsblur_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_shadowsblur_info_bullet"
+tool_tip="Adjust the shadow smoothness. This only works if SSAO is turned on"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="shadow_ssao_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="20"
+top_pad="40"
+font="SansSerifSmall"
+text_color="White"
+>
+Ambient Occlusion
+</text>
+
+<check_box
+name="mp_ssao_ctrl"
+control_name="RenderDeferredSSAO"
+label="Screen Space Ambient Occlusion"
+layout="topleft"
+width="200"
+height="16"
+left="20"
+top_delta="32"
+initial_value="true"
+>
+<check_box.commit_callback
+function="Pref.RenderOptionUpdate" />
+</check_box>
+
+<icon
+name="mp_ssao_bullet"
+tool_tip="Low to Medium performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_ssao_info_bullet"
+tool_tip="Adds some shadow based on surface proximity."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+</panel>
+
+<panel
+label="Bloom"
+name="preferences_visuals_bloom"
+layout="topleft"
+follows="top|left">
+
+<text
+name="mp_bloom_lbl"
+follows="left|top"
+layout="topleft"
+width="200"
+height="18"
+left="20"
+top_pad="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Bloom (experimental)
+</text>
+
+<text
+name="mp_bloom_level_lbl"
+tool_tip="Bloom Level: The higher, the more diffuse (medium gpu cost)\n Note: This setting can fix a performance issue when antialiasing is turned on)"
+type="string"
+length="1"
+follows="left|top"
+width="140"
+height="16"
+layout="topleft"
+left="32"
+top_pad="20"
+text_readonly_color="LabelDisabledColor"
+>
+Bloom level:
+</text>
+
+<combo_box
+name="MPBloomCtrl"
+control_name="MPRenderBloom"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="None"
+name="0"
+value="0"/>
+<combo_box.item
+label="Level 1"
+name="1"
+value="1"/>
+<combo_box.item
+label="Level 2"
+name="2"
+value="2"/>
+<combo_box.item
+label="Level 3"
+name="3"
+value="3"/>
+</combo_box>
+
+<icon
+name="mp_blooml_bullet"
+tool_tip="Low to Medium performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_blooml_info_bullet"
+tool_tip="Bloom adds a glowing effect around the brightest areas. The level affects the number of iterations, and the quality."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_radius_lbl"
+tool_tip="Bloom Radius"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Bloom Radius
+</text>
+
+<slider
+name="MPBloomRadiusCtrl"
+control_name="MPBloomBlurRadius"
+decimal_digits="2"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.01"
+initial_value="1.0"
+label_width="2"
+min_val="0.0"
+max_val="3.0"
+>
+</slider>
+
+<icon
+name="mp_bloomr_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomr_info_bullet"
+tool_tip="Adjust the base radius of the effect"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_radiusadd_lbl"
+tool_tip="Bloom Radius addition"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Bloom Radius addition
+</text>
+
+<slider
+name="MPBloomRadiusAddCtrl"
+control_name="MPBloomBlurRadiusAdd"
+decimal_digits="2"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.01"
+initial_value="1.0"
+label_width="2"
+min_val="-3.0"
+max_val="3.0"
+>
+</slider>
+
+<icon
+name="mp_bloomra_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomra_info_bullet"
+tool_tip="Adjust the added radius for each iteration"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_extract_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Bloom Range
+</text>
+
+<slider
+name="MPBloomRangeCtrl"
+control_name="MPBloomExtractBrightness"
+decimal_digits="2"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.025"
+initial_value="0.1"
+label_width="2"
+min_val="0.0"
+max_val="0.5"
+>
+</slider>
+
+<icon
+name="mp_bloomrange_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomrange_info_bullet"
+tool_tip="When moved to the right, it will take more of the bright areas."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_strength_lbl"
+tool_tip="Bloom: Strength of the effect (no performance impact)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall">
+Bloom Strength
+</text>
+
+<slider
+name="MPBloomStrCtrl"
+control_name="MPBloomStrength"
+decimal_digits="1"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.1"
+initial_value="1.0"
+min_val="0.5"
+max_val="4.0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_bloomstr_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomstr_info_bullet"
+tool_tip="Controls the effect strength"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_metal_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Bloom Metal
+</text>
+
+<slider
+name="MPBloomMetalCtrl"
+control_name="MPBloomExtractMetal"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.05"
+initial_value="0.2"
+decimal_digits="2"
+min_val="0.0"
+max_val="1.0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_bloommetal_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloommetal_info_bullet"
+tool_tip="When moved to the right, the effect will apply on more metallic surfaces."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_nonmetal_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall">
+Bloom Non Metal
+</text>
+
+<slider
+name="MPBloomNonMetalCtrl"
+control_name="MPBloomExtractNonMetal"
+layout="topleft"
+follows="left|top"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.05"
+initial_value="0.2"
+label_width="2"
+decimal_digits="2"
+min_val="0.0"
+max_val="1.0"
+>
+</slider>
+
+<icon
+name="mp_bloomnonmet_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomnonmet_info_bullet"
+tool_tip="When moved to the right, the effect will apply on more non-metallic surfaces."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+</panel>
+
+<panel
+name="preferences_visuals_probes"
+label="Probes"
+layout="topleft"
+follows="top|left"
+>
+
+<text
+name="mp_probes_lbl"
+follows="left|top"
+layout="topleft"
+width="100"
+height="18"
+left="20"
+top_pad="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Reflection Probes
+</text>
+
+<icon
+name="mp_probedetail_info_bullet"
+tool_tip="Reflection probes are a fundamental part of how pbr lighting is calculated"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="probes_detail_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Reflection Detail:
+</text>
+
+<combo_box
+name="mp_probes_detail_ctrl"
+control_name="RenderReflectionProbeDetail"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="Static Only"
+name="0"
+value="0"/>
+<combo_box.item
+label="Static+Dynamic"
+name="1"
+value="1"/>
+<combo_box.item
+label="Realtime"
+name="2"
+value="2"/>
+</combo_box>
+
+<icon
+name="mp_probedetail_bullet"
+tool_tip="High to extreme performance impact"
+image_name="mp_red_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probedetail_info_bullet"
+tool_tip="Controls how often the reflection probes update with the surrounding. We recommend Static Only for daily usage (specially on Mac)"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="probes_coverage_lbl"
+tool_tip="Reflection probes level (Important memory usage and performance penalty)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Reflection Coverage:
+</text>
+
+<combo_box
+name="probes_level_ctrl"
+control_name="RenderReflectionProbeLevel"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="None"
+name="0"
+value="0"/>
+<combo_box.item
+label="Manual only"
+name="1"
+value="1"/>
+<combo_box.item
+label="Manual + terrain"
+name="2"
+value="2"/>
+<combo_box.item
+label="Full scene"
+name="3"
+value="3"/>
+</combo_box>
+
+<icon
+name="mp_probedetail_bullet"
+tool_tip="Medium to High performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probedetail_info_bullet"
+tool_tip="Controls what part of the surrounding the reflections probes are capturing. We recommend Manual only."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="probes_count_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Max Reflection Probes:
+</text>
+
+<combo_box
+name="mp_probes_count_ctrl"
+control_name="RenderReflectionProbeCount"
+label="Max. Reflection Probes:"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="None"
+name="1"
+value="1"/>
+<combo_box.item
+label="Low"
+name="32"
+value="32"/>
+<combo_box.item
+label="Medium"
+name="64"
+value="64"/>
+<combo_box.item
+label="High"
+name="128"
+value="128"/>
+<combo_box.item
+label="Ultra"
+name="256"
+value="256"/>
+</combo_box>
+
+<icon
+name="mp_probecount_bullet"
+tool_tip="Medium to High performance and memory usage impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probecount_info_bullet"
+tool_tip="Limits the maximum number of active reflections probes"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="probes_res_lbl"
+tool_tip="Sets the resolution used to calculate the probes (Important to extreme video memory impact and performance)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Reflection Resolution:
+</text>
+
+<combo_box
+name="ProbeResCtrl"
+control_name="RenderReflectionProbeResolution"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="Low"
+name="low"
+value="64"/>
+<combo_box.item
+label="Default"
+name="default"
+value="128"/>
+<combo_box.item
+label="High"
+name="high"
+value="256"/>
+<combo_box.item
+label="Maximum"
+name="maximum"
+value="512"/>
+</combo_box>
+
+<icon
+name="mp_proberes_bullet"
+tool_tip="Medium to Extreme performance and memory usage impact"
+image_name="mp_red_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_proberes_info_bullet"
+tool_tip="Improves the quality of the probes"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_probe_dd_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Draw Distance
+</text>
+
+<slider
+control_name="RenderReflectionProbeDrawDistance"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="32"
+min_val="8"
+max_val="64"
+increment="8"
+decimal_digits="0"
+label_width="2">
+</slider>
+
+<icon
+name="mp_probedd_bullet"
+tool_tip="Medium to High performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probedd_info_bullet"
+tool_tip="Controls the draw distance at which the probes are calculating the surrounding"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_probe_ud_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="32"
+font="SansSerifSmall"
+>
+Default Probe Update
+</text>
+
+<slider
+control_name="RenderDefaultProbeUpdatePeriod"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="15"
+increment="1"
+min_val="2"
+max_val="60"
+decimal_digits="0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_dprobeperiod_bullet"
+tool_tip="When moved to the right, the performance will improve."
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_dprobeperiod_info_bullet"
+tool_tip="Controls how the default probe update is delayed."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_probe_ud_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Other Probes delay
+</text>
+
+<slider
+name="MPProbeUpdCtrl"
+control_name="MPRenderProbeUpdatePeriod"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="15"
+increment="1"
+min_val="0"
+max_val="60"
+decimal_digits="0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_probeperiod_bullet"
+tool_tip="When moved to the right, the performance will improve."
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probeperiod_info_bullet"
+tool_tip="Controls how each probe update is delayed."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_probe_slow_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Refresh delay
+</text>
+
+<slider
+name="MPProbeSlowCtrl"
+control_name="MPRenderProbeSlowDown"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="0.01"
+increment="0.01"
+min_val="0"
+max_val="0.2"
+decimal_digits="2"
+label_width="2">
+</slider>
+
+<icon
+name="mp_probeslowdown_bullet"
+tool_tip="When moved to the right, the performance will improve."
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probeslowdown_info_bullet"
+tool_tip="Controls how often the probes update process is called. When moved to the right, the update be slower."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+</panel>
+
+<panel
+label="Quality"
+name="preferences_visuals_others"
+layout="topleft"
+follows="top|left">
+
+<text
+name="mp_aa_lbl"
+follows="left|top"
+layout="topleft"
+top_pad="20"
+width="400"
+height="18"
+left="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Visual Quality Settings:
+</text>
+
+<check_box
+name="VintageCtrl"
+control_name="RenderDisableVintageMode"
+label="HDR and Emissive"
+layout="topleft"
+width="360"
+height="16"
+left="20"
+top_delta="32"
+initial_value="false"
+>
+<check_box.commit_callback
+function="Pref.RenderOptionUpdate" />
+</check_box>
+
+<icon
+name="mp_hdr_bullet"
+tool_tip="Low to Medium performance impact. We recommend it ON, unless you are using a weaker/older computer."
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="8"
+top_delta="-2"
+/>
+
+<icon
+name="mp_hdr_info_bullet"
+tool_tip="Enables Higher color fidelity, and several other post-processing effects."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<check_box
+name="mp_transparent_water"
+control_name="RenderTransparentWater"
+label="Transparent Water"
+layout="topleft"
+width="360"
+height="16"
+left="20"
+top_delta="32"
+initial_value="true"
+>
+<check_box.commit_callback
+function="Pref.RenderOptionUpdate" />
+</check_box>
+
+<icon
+name="mp_twater_bullet"
+tool_tip="Low to Medium performance impact. We recommend it ON, unless you are using a weaker/older computer."
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="8"
+top_delta="-2"
+/>
+
+<icon
+name="mp_twater_info_bullet"
+tool_tip="Enables higher quality water with transparency."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_texlod_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="24"
+top_pad="20"
+font="SansSerifSmall"
+>
+Texture Max Resolution:
+</text>
+
+<combo_box
+name="MaxTextureResolutionCtrl"
+control_name="RenderMaxTextureResolution"
+height="19"
+layout="topleft"
+left_delta="150"
+top_delta="0"
+width="90">
+<combo_box.item
+label="128x128"
+name="128"
+value="128"/>
+<combo_box.item
+label="256x256"
+name="256"
+value="256"/>
+<combo_box.item
+label="512x512"
+name="512"
+value="512"/>
+<combo_box.item
+label="1024x1024"
+name="1024"
+value="1024"/>
+<combo_box.item
+label="2048x2048"
+name="2048"
+value="2048"/>
+</combo_box>
+
+<icon
+name="mp_texlod_bullet"
+tool_tip="Lowering this value will greatly help with gpus with lower vram."
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="124"
+top_delta="-2"
+/>
+
+<icon
+name="mp_texlod_info_bullet"
+tool_tip="Set this to a lower value if you have stutter in texture heavy sims."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_meshlod_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="24"
+top_pad="20"
+font="SansSerifSmall"
+>
+Object Mesh LOD:
+</text>
+
+<slider
+name="MeshLoadCtrl"
+control_name="RenderVolumeLODFactor"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="156"
+top_delta="-1"
+initial_value="160"
+increment="0.125"
+min_val="0.125"
+max_val="4"
+show_text="true"
+decimal_digits="3"
+>
+</slider>
+
+<icon
+name="mp_meshlod_bullet"
+tool_tip="Better make this value higher than making the draw distance higher"
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="8"
+top_delta="-2"
+/>
+
+<icon
+name="mp_meshlod_info_bullet"
+tool_tip="Controls the mesh complexity calculation vs the view distance"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_resdiv_lbl"
+follows="left|top"
+layout="topleft"
+width="400"
+height="18"
+left="24"
+top_pad="30"
+font="SansSerifSmall"
+>
+Resolution divisor
+</text>
+
+<slider
+control_name="RenderResolutionDivisor"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="156"
+top_delta="-1"
+initial_value="1.0"
+increment="0.05"
+min_val="0.75"
+max_val="2.0"
+decimal_digits="2"
+label_width="2">
+</slider>
+
+<icon
+name="mp_resdiv_bullet"
+tool_tip="Move to the right to improve performance. Set to 1.0 for default."
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="8"
+top_delta="-2"
+/>
+
+<icon
+name="mp_resdiv_info_bullet"
+tool_tip="Moving this to a value superior to 1.0 will lower the rendering resolution. Set to 1.0 for default."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+
+</panel>
+
+<panel
+label="For nerds"
+name="preferences_visuals_others"
+layout="topleft"
+follows="top|left">
+
+<text
+follows="left|top"
+layout="topleft"
+top_pad="20"
+width="400"
+height="18"
+left="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Advanced settings:
+</text>
+
+<check_box
+name="MultiTexCtrl"
+control_name="RenderGLMultiThreadedTextures"
+label="Multithreaded Textures (needs restart)"
+layout="topleft"
+width="400"
+height="16"
+left="20"
+top_delta="32"
+initial_value="false"
+>
+</check_box>
+
+<icon
+name="mp_multitex_bullet"
+tool_tip="Improves textures loading performance on certain hardware. But can be unstable!! Don't enable this on Linux and don't use it with Apple Multithreaded OpenGL activated."
+image_name="mp_red_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_multitex_info_bullet"
+tool_tip="Enables loading textures using multiple threads. Use with extreme caution! it's unstable."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<check_box
+name="AppleMultGLCtrl"
+control_name="RenderAppleUseMultGL"
+label="Apple Multithreaded OpenGL"
+layout="topleft"
+width="400"
+height="16"
+left="20"
+top_delta="32"
+initial_value="false"
+>
+</check_box>
+
+<icon
+name="mp_applemulti_bullet"
+tool_tip="Variable performance impact. Can be unstable!"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_applemulti_info_bullet"
+tool_tip="Enables Apple OpenGL Multithreaded optimisations. Can be unstable!!"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="color_precision_lbl"
+follows="left|top"
+layout="topleft"
+width="200"
+height="18"
+left="32"
+top_pad="20"
+font="SansSerifSmall"
+>
+Color precision (needs restart):
+</text>
+
+<combo_box
+name="colorPrecisionCtrl"
+control_name="MPColorPrecision"
+layout="topleft"
+width="80"
+height="18"
+left_pad="8"
+top_delta="0"
+>
+<combo_box.item
+label="Low"
+name="low"
+value="1"/>
+<combo_box.item
+label="Default"
+name="default"
+value="0"/>
+<combo_box.item
+label="High"
+name="high"
+value="2"/>
+</combo_box>
+
+<icon
+name="mp_lowcolor_bullet"
+tool_tip="Low setting can help performance specially in high resolution"
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="104"
+top_delta="-2"
+/>
+
+<icon
+name="mp_lowcolor_info_bullet"
+tool_tip="Sets the internal color resolution. Influences the speed or quality."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+follows="left|top"
+layout="topleft"
+top_pad="30"
+width="400"
+height="18"
+left="20"
+font="SansSerifSmall"
+text_color="White"
+>
+HDR Display (Experimental - Mac only):
+</text>
+
+<icon
+name="mp_hdrd_bullet"
+tool_tip="You need an Apple hdr/xdr display"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<text
+follows="left|top"
+layout="topleft"
+width="400"
+height="18"
+left="20"
+top_pad="12"
+font="SansSerifSmall"
+text_color="White"
+>
+Warning: HDR shows extreme luminosity contrast. Use carefully!
+</text>
+
+<check_box
+name="HDRDisplayCtrl"
+control_name="MPHDRDisplay"
+label="HDR Display (Mac) - needs restart"
+layout="topleft"
+width="400"
+height="16"
+left="20"
+top_delta="32"
+initial_value="true"
+>
+</check_box>
+
+<icon
+name="mp_hdrd2_bullet"
+tool_tip="Medium performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_hdrd2_info_bullet"
+tool_tip="Make sure your color profile is Apple XDR"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_hdrd_gamma_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="16"
+font="SansSerifSmall"
+>
+Gamma
+</text>
+
+<slider
+control_name="MPHDRGamma"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="2.2"
+increment="0.05"
+min_val="1.8"
+max_val="2.6"
+decimal_digits="2"
+label_width="2">
+</slider>
+
+<text
+follows="left|top"
+layout="topleft"
+top_pad="30"
+width="400"
+height="18"
+left="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Developer settings:
+</text>
+
+<check_box
+name="NoGLDebugCtrl"
+control_name="MPNoGLDebug"
+label="No GL Debug"
+layout="topleft"
+width="400"
+height="16"
+left="20"
+top_delta="32"
+initial_value="true"
+>
+</check_box>
+
+<icon
+name="mp_nodebug_bullet"
+tool_tip="Leave this always to ON for optimal performance"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_nodebug_info_bullet"
+tool_tip="Ensures there is no opengl debug. This should be set to ON!"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<check_box
+name="MPAppleVBModeCtrl"
+control_name="MPVertexBufferMode"
+label="Alternative Vertex Buffer Mode (Mac only / needs restart)"
+layout="topleft"
+width="400"
+height="16"
+left="20"
+top_delta="32"
+initial_value="false"
+>
+</check_box>
+
+</panel>
+
+
+</tab_container>
+
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
index 8202bb9de3..eee55bd7bc 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
@@ -113,7 +113,7 @@
control_name="ArrowKeysAlwaysMove"
follows="left|top"
height="20"
- label="Arrow keys always move me"
+ label="Arrow keys always move me while in chat"
layout="topleft"
left_delta="5"
name="arrow_keys_move_avatar_check"
@@ -202,9 +202,43 @@
height="10"
layout="topleft"
left="86"
- name="single_click_action_lbl"
+ name="mouse_warp_lbl"
width="150"
top_pad="20">
+ Mouse Warp:
+ </text>
+ <combo_box
+ control_name="MouseWarpMode"
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ top_delta="-6"
+ name="mouse_warp_combo"
+ tool_tip="Controls warping of the mouse to the center of the screen during alt-zoom and mouse look."
+ width="200">
+ <combo_box.item
+ label="Automatic"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="On"
+ name="1"
+ value="1"/>
+ <combo_box.item
+ label="Off"
+ name="2"
+ value="2"/>
+ </combo_box>
+ <text
+ follows="left|top"
+ type="string"
+ length="1"
+ height="10"
+ layout="topleft"
+ left="86"
+ name="single_click_action_lbl"
+ width="150"
+ top_pad="12">
Single click on land:
</text>
<combo_box
@@ -266,7 +300,7 @@
layout="topleft"
left="83"
name="sound_on_collisions"
- top_pad="10"
+ top_pad="0"
width="200" />
<check_box
control_name="DoubleClickZoomIn"
@@ -275,7 +309,7 @@
layout="topleft"
left="83"
name="double_click_zoom_in"
- top_pad="10"
+ top_pad="0"
width="200" />
<button
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 5041fb4878..1c00837073 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -1,15 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel
+ <panel
border="true"
follows="left|top|right|bottom"
- height="408"
- label="Communication"
+ height="438"
+ label="Privacy"
layout="topleft"
left="102"
- name="im"
+ name="Privacy panel"
top="1"
width="517">
+ <tab_container
+ top_pad="0"
+ enabled="true"
+ follows="left|top"
+ height="430"
+ width="517"
+ left_delta="0"
+ name="privacy_tab_container"
+ tab_position="top"
+ tab_stop="false">
+ <panel
+ label="General"
+ name="privacy_preferences_general"
+ layout="topleft"
+ follows="top|left">
+
<panel.string
name="log_in_to_change">
log in to change
@@ -63,7 +79,7 @@
name="online_visibility"
top_pad="30"
width="350" />
-
+
<check_box
enabled_control="EnableVoiceChat"
control_name="AutoDisengageMic"
@@ -74,6 +90,37 @@
name="auto_disengage_mic_check"
top_pad="10"
width="350" />
+ <check_box
+ control_name="EnableLookAtTarget"
+ height="16"
+ label="Enable LookAt"
+ tool_tip="Enable tracking cursor position with avatar head's rotation"
+ layout="topleft"
+ left="30"
+ name="enable_lookat_target"
+ top_pad="10"
+ width="350" />
+ <check_box
+ enabled_control="EnableLookAtTarget"
+ control_name="LimitLookAtTarget"
+ height="16"
+ label="Limit LookAt Distance"
+ tool_tip="Limit the look at target's distance by restricting it around the avatar's head"
+ layout="topleft"
+ left="50"
+ name="limit_lookat_distance"
+ top_pad="10"
+ width="350" />
+ <check_box
+ control_name="EnableSelectionHints"
+ height="16"
+ label="Enable Selection Hints"
+ tool_tip="Enable reporting and tracking current selection using 'beam' particles and character animations"
+ layout="topleft"
+ left="30"
+ name="enable_selection_hints"
+ top_pad="10"
+ width="350" />
<button
follows="left|top"
height="23"
@@ -103,3 +150,48 @@
(People and/or Objects you have blocked)
</text>
</panel>
+
+ <panel
+ label="Discord"
+ name="privacy_preferences_discord"
+ layout="topleft"
+ follows="top|left">
+
+ <check_box
+ control_name="EnableDiscord"
+ height="16"
+ enabled="true"
+ label="Enable Discord integration"
+ layout="topleft"
+ left="30"
+ name="enable_discord"
+ top_pad="20"
+ width="350" />
+
+ <check_box
+ enabled_control="EnableDiscord"
+ control_name="ShowDiscordActivityDetails"
+ height="16"
+ enabled="true"
+ label="Show avatar name"
+ layout="topleft"
+ left="30"
+ name="show_name"
+ top_pad="20"
+ width="350" />
+
+ <check_box
+ enabled_control="EnableDiscord"
+ control_name="ShowDiscordActivityState"
+ height="16"
+ enabled="false"
+ label="Show location"
+ layout="topleft"
+ left="30"
+ name="show_location"
+ top_pad="20"
+ width="350" />
+ </panel>
+ </tab_container>
+
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 53ae764ba6..52413abe74 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -62,20 +62,9 @@
name="mute_when_minimized"
top_delta="3"
left_pad="5"
- width="20" />
- <!-- *HACK
- After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "mute_when_minimized" check_box's label.-->
- <text
- follows="top|left"
- height="15"
- layout="topleft"
- left_pad="0"
- name="mute_chb_label"
- top_delta="-1"
- width="150"
- wrap="true">
- Mute when minimized
- </text>
+ width="20"
+ label="Mute when minimized"
+ word_wrap="true"/>
<slider
control_name="AudioLevelUI"
disabled_control="MuteAudio"
@@ -321,104 +310,45 @@
left_pad="5"
name="enable_voice_check"
width="110"/>
- <!-- -->
<text
type="string"
length="1"
follows="left|top"
layout="topleft"
left="23"
- top_delta="22"
+ top_delta="25"
name="Listen media from"
height="15"
- word_wrap="true"
- width="112">
- Hear media and sounds from:
+ width="165"
+ halign="right">
+ Hear media and sounds from
</text>
- <radio_group
+ <combo_box
control_name="MediaSoundsEarLocation"
follows="left|top"
- top_delta="-6"
layout="topleft"
left_pad="5"
- width="360"
- height="40"
- name="media_ear_location">
- <radio_item
- height="19"
- label="Camera position"
- follows="left|top"
- layout="topleft"
- name="0"
- width="200"/>
- <radio_item
- height="19"
- follows="left|top"
- label="Avatar position"
- layout="topleft"
- left_delta="0"
- name="1"
- top_delta ="18"
- width="200" />
- </radio_group>
- <text
- type="string"
- length="1"
- follows="left|top"
- layout="topleft"
- left="270"
- top_delta="6"
- name="Listen from"
- width="112">
- Hear voice from:
- </text>
- <radio_group
- enabled_control="EnableVoiceChat"
- control_name="VoiceEarLocation"
- follows="left|top"
- layout="topleft"
- left_pad="2"
- top_delta="-6"
- width="360"
- height="40"
- name="ear_location">
- <radio_item
- height="19"
+ width="130"
+ height="23"
+ top_delta="-4"
+ name="media_ear_location_combo">
+ <item
label="Camera position"
- follows="left|top"
- layout="topleft"
- name="0"
- width="200"/>
- <radio_item
- height="19"
- follows="left|top"
+ name="camera_position"
+ value="0" />
+ <item
label="Avatar position"
- layout="topleft"
- left_delta="0"
- name="1"
- top_delta ="18"
- width="200" />
- </radio_group>
- <check_box
- name="media_show_on_others_btn"
- control_name="MediaShowOnOthers"
- value="true"
- follows="left|top"
- layout="topleft"
- height="15"
- top_pad="8"
- tool_tip="Uncheck this to hide media attached to other avatars nearby"
- label="Play media attached to other avatars"
- left="20"
- width="230"/>
+ name="avatar_position"
+ value="1" />
+</combo_box>
<text
follows="left|top"
layout="topleft"
height="15"
left="23"
- top_pad="8"
- width="120"
- name="media_autoplay_label">
+ width="165"
+ name="media_autoplay_label"
+ halign="right">
Auto-play media
</text>
<combo_box
@@ -427,10 +357,10 @@
follows="left|top"
layout="topleft"
height="23"
- left_pad="-15"
+ left_delta="170"
top_delta="-4"
name="media_auto_play_combo"
- width="115">
+ width="130">
<item
label="Never"
name="autoplay_disabled"
@@ -444,50 +374,106 @@
name="autoplay_ask"
value="2"/>
</combo_box>
+ <text
+ follows="left|top"
+ layout="topleft"
+ height="15"
+ left="23"
+ width="165"
+ name="media_firstinteract_label"
+ halign="right">
+ Media first-interact
+ </text>
+ <combo_box
+ control_name="MediaFirstClickInteract"
+ enabled_control="AudioStreamingMedia"
+ follows="left|top"
+ layout="topleft"
+ height="23"
+ left_delta="170"
+ top_delta="-4"
+ width="130"
+ name="media_first_interact_combo"
+ tool_tip="This setting controls which media (once loaded) does not require a first click to focus before interaction can begin. This allows clicks to be passed directly to media bypassing the focus click requirement. Each option also inherits the previous ones.">
+ <item
+ label="Disabled"
+ name="media_first_click_none"
+ value="0"/>
+ <item
+ label="Worn HUDs only"
+ name="media_first_click_hud"
+ value="1"/>
+ <item
+ label="Owned objects"
+ name="media_first_click_own"
+ value="3"/>
+ <item
+ label="Friends' objects"
+ name="media_first_click_friend"
+ value="7"/>
+ <item
+ label="Group objects"
+ name="media_first_click_group"
+ value="15"/>
+ <item
+ label="Landowner objects"
+ name="media_first_click_land"
+ value="31"/>
+ <item
+ label="Anyone's objects"
+ name="media_first_interact_any"
+ value="32767"/>
+ <item
+ label="All MOAP"
+ name="media_first_click_all"
+ value="65535"/>
+ </combo_box>
+ <check_box
+ name="media_show_on_others_btn"
+ control_name="MediaShowOnOthers"
+ enabled_control="AudioStreamingMedia"
+ value="true"
+ follows="left|top"
+ tool_tip="Uncheck this to hide media attached to other avatars nearby"
+ label="Play media attached to other avatars"
+ left="23"
+ width="15"
+ top_delta="30"
+ height="15"/>
<check_box
- control_name="StreamNotificationChannelEnabled"
- height="30"
- label="Custom stream notification channel"
- layout="topleft"
- left="20"
- name="stream_notification_channel_enabled"
- top_pad="-10"
- width="256">
- </check_box>
- <spinner
- control_name="StreamNotificationChannel"
- enabled_control="StreamNotificationChannelEnabled"
- decimal_digits="0"
- follows="left|top"
- height="30"
- increment="1"
- initial_value="751751"
- label="Channel number:"
- label_width="105"
- layout="topleft"
- left_pad="0"
- max_val="2147483647"
- min_val="-2147483648"
- name="stream_notification_channel"
- top_pad="-20"
- width="170" />
+ name="media_huds_autoplay"
+ control_name="MediaAutoPlayHuds"
+ enabled_control="AudioStreamingMedia"
+ value="true"
+ follows="left|top"
+ layout="topleft"
+ tool_tip="Uncheck this to make HUDs follow the standard media auto-play setting"
+ label="Auto-play media attached to your HUD"
+ left="260"
+ top_pad="-15"
+ width="15"
+ height="15"/>
<text
layout="topleft"
+ follows="left"
height="15"
- left="260"
- top_pad="-48"
- width="100"
- name="noise_suppression_label">
- Noise suppression
+ width="165"
+ name="noise_suppression_label"
+ left="23"
+ top_delta="22"
+ halign="right">
+ Microphone Noise Suppression
</text>
<combo_box
control_name="VoiceNoiseSuppressionLevel"
+ enabled_control="EnableVoiceChat"
+ follows="left|top"
layout="topleft"
+ left_delta="170"
+ top_delta="-6"
+ width="130"
height="23"
- left_pad="10"
- top_pad="-20"
- name="noise_suppression_combo"
- width="80">
+ name="noise_suppression_combo">
<item
label="Off"
name="noise_suppression_none"
@@ -509,21 +495,52 @@
name="noise_suppression_max"
value="4"/>
</combo_box>
- <text>
-<!-- spacer -->
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left="23"
+ top_delta="30"
+ name="Listen from"
+ width="165"
+ height="15"
+ halign="right">
+ Hear voice from
</text>
+ <combo_box
+ enabled_control="EnableVoiceChat"
+ control_name="VoiceEarLocation"
+ follows="left|top"
+ layout="topleft"
+ left_delta="170"
+ top_delta="-6"
+ width="130"
+ height="23"
+ name="ear_location_combo">
+ <item
+ label="Camera position"
+ name="camera_position"
+ value="0" />
+ <item
+ label="Avatar position"
+ name="avatar_position"
+ value="1" />
+</combo_box>
<check_box
control_name="LipSyncEnabled"
- follows="top|left"
+ enabled_control="EnableVoiceChat"
+ follows="left|top"
height="15"
label="Move avatar lips when speaking"
layout="topleft"
left="20"
name="enable_lip_sync"
- top_pad="10"
+ top_pad="8"
width="237"/>
<check_box
control_name="VoiceEchoCancellation"
+ enabled_control="EnableVoiceChat"
height="15"
tool_tip="Check to enable voice echo cancellation"
label="Echo Cancellation"
@@ -546,6 +563,7 @@
top_pad="5"/>
<check_box
control_name="VoiceAutomaticGainControl"
+ enabled_control="EnableVoiceChat"
height="15"
tool_tip="Check to enable automatic gain control"
label="Automatic Gain Control"
@@ -567,6 +585,7 @@
left="20"/>
<check_box
control_name="VoiceVisualizerEnabled"
+ enabled_control="EnableVoiceChat"
height="15"
tool_tip="Check to show voice dot indicator above avatars"
label="Show voice dot above avatars"
@@ -577,6 +596,7 @@
width="200"/>
<button
control_name="ShowDeviceSettings"
+ enabled_control="EnableVoiceChat"
follows="left|top"
height="23"
is_toggle="true"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml b/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml
index 6554dd0952..831b631505 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml
@@ -22,7 +22,6 @@
<profile_image
name="real_world_pic"
image_name="Generic_Person_Large"
- show_loading="false"
follows="top|left"
layout="topleft"
top="10"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_pick.xml b/indra/newview/skins/default/xui/en/panel_profile_pick.xml
index 024120931f..4f441b9b49 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_pick.xml
@@ -200,6 +200,26 @@
<layout_panel
follows="all"
+ layout="bottomleft"
+ left_pad="2"
+ name="set_to_curr_location_btn_lp"
+ auto_resize="false"
+ width="100">
+ <button
+ name="set_to_curr_location_btn"
+ label="Set Location"
+ tool_tip="Set to Current Location"
+ left="0"
+ top="0"
+ height="23"
+ width="100"
+ follows="left|top"
+ layout="topleft"
+ />
+ </layout_panel>
+
+ <layout_panel
+ follows="all"
layout="topleft"
name="util_resizer_right"
auto_resize="true"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml
index e361a0f28c..4d4c7f2252 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml
@@ -74,7 +74,6 @@ Account: [ACCTTYPE]
<profile_image
name="2nd_life_pic"
image_name="Generic_Person_Large"
- show_loading="false"
layout="topleft"
follows="all"
interactable="true"
@@ -191,7 +190,7 @@ Account: [ACCTTYPE]
visible="false">
<icon
name="badge_icon"
- image_name="Beta_Tester"
+ image_name="Profile_Badge_Beta"
layout="topleft"
follows="left|top"
top="10"
diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml
index 6b19907372..9f1f741b52 100644
--- a/indra/newview/skins/default/xui/en/panel_progress.xml
+++ b/indra/newview/skins/default/xui/en/panel_progress.xml
@@ -44,9 +44,9 @@
width="670" />
<layout_panel
auto_resize="false"
- height="220"
+ height="255"
layout="topleft"
- min_height="220"
+ min_height="255"
name="panel4"
width="670">
<icon
@@ -56,11 +56,11 @@
layout="topleft"
left="0"
top="0"
- height="220"
+ height="255"
width="670" />
<layout_stack
follows="left|right|top|bottom"
- height="220"
+ height="255"
layout="topleft"
left="0"
orientation="vertical"
@@ -70,6 +70,14 @@
width="670">
<layout_panel
auto_resize="false"
+ height="30"
+ layout="topleft"
+ min_height="30"
+ name="panel_top_spacer"
+ width="670">
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
height="100"
layout="topleft"
min_height="100"
@@ -134,6 +142,30 @@
right="-90"
word_wrap="true"/>
</layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="40"
+ layout="topleft"
+ min_height="40"
+ name="panel_icons"
+ width="670">
+ <!--Logos are tied to following label from code-->
+ <text
+ follows="left|right|top"
+ layout="topleft"
+ font="SansSerifLarge"
+ font_shadow="none"
+ halign="left"
+ height="16"
+ width="240"
+ left="47"
+ top="6"
+ line_spacing.pixels="2"
+ name="logos_lbl"
+ text_color="LoginProgressBoxTextColor">
+ Megapahit uses
+ </text>
+ </layout_panel>
</layout_stack>
</layout_panel>
<layout_panel
diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml
index 7687f7cd96..23bbf45e88 100644
--- a/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml
+++ b/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml
@@ -139,7 +139,7 @@
max_val_x="30"
min_val_y="-30"
max_val_y="30"
- logarithmic="1"/>
+ logarithmic="true"/>
<text
name="cloud_image_label"
diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml
index bd68434aab..34b48574d5 100644
--- a/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml
+++ b/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml
@@ -248,29 +248,13 @@
</layout_panel>
<layout_panel
- name="moon_layout"
- border="false"
+ border="true"
bevel_style="in"
+ name="moon_layout"
auto_resize="true"
user_resize="false"
visible="true"
height="400">
- <layout_stack
- name="moon_stack"
- left="5"
- top="5"
- right="-5"
- bottom="-5"
- follows="left|top|right|bottom"
- orientation="vertical">
- <layout_panel
- border="true"
- bevel_style="in"
- auto_resize="true"
- user_resize="false"
- visible="true"
- name="moon_layout"
- height="220">
<text
name="moon_label"
follows="left|top"
@@ -423,9 +407,7 @@
name="moonbeacon"
top_pad="5"
left_delta="-8"/>
-
- </layout_panel>
- </layout_stack>
+
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_settings_water.xml b/indra/newview/skins/default/xui/en/panel_settings_water.xml
index 5e65b0e8a2..ffea470cfc 100644
--- a/indra/newview/skins/default/xui/en/panel_settings_water.xml
+++ b/indra/newview/skins/default/xui/en/panel_settings_water.xml
@@ -247,7 +247,7 @@
Reflection Wavelet Scale
</text>
<slider
- decimal_digits="1"
+ decimal_digits="2"
follows="left|top"
increment="0.01"
height="16"
@@ -261,7 +261,7 @@
width="150"
can_edit_text="true"/>
<slider
- decimal_digits="1"
+ decimal_digits="2"
follows="left|top"
increment="0.01"
initial_value="0.7"
@@ -274,7 +274,7 @@
width="150"
can_edit_text="true"/>
<slider
- decimal_digits="1"
+ decimal_digits="2"
follows="left|top"
increment="0.01"
initial_value="0.7"
@@ -378,7 +378,7 @@
initial_value="0"
layout="topleft"
left_delta="5"
- min_val="-0.5"
+ min_val="0"
max_val="0.5"
name="water_blur_multip"
top_pad="5"
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
index f8040b9a65..0cac1b410f 100644
--- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
@@ -60,7 +60,7 @@
name="Large(512x512)"
value="[i512,i512]" />
<combo_box.item
- label="Current Window(512x512)"
+ label="Current Window"
name="CurrentWindow"
value="[i0,i0]" />
<combo_box.item
@@ -119,6 +119,8 @@
type="string"
word_wrap="true">
To save your image as a texture select one of the square formats.
+
+Upload cost: L$[UPLOAD_COST]
</text>
<button
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
index 52f9068264..fb88b752ae 100644
--- a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
@@ -74,6 +74,10 @@
label="1600x1200"
name="1600x1200"
value="[i1600,i1200]" />
+ <combo_box.item
+ label="2048x2048"
+ name="2048x2048"
+ value="[i2048,i2048]" />
<combo_box.item
label="Custom"
name="Custom"
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
index 3a7731d235..2fb02af61c 100644
--- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
@@ -31,7 +31,7 @@
image_overlay_alignment="left"
image_top_pad="-1"
imgoverlay_label_space="10"
- label="Save to Inventory (L$[AMOUNT])"
+ label="Save to Inventory"
layout="topleft"
left_delta="0"
name="save_to_inventory_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
index 7598f7d7e5..b858d0ed02 100644
--- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml
+++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
@@ -20,6 +20,10 @@
name="name_default_system_device">
Default System Device
</string>
+ <string
+ name="device_not_loaded">
+ Device not loaded
+ </string>
<icon
follows="left|top"
height="18"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 5e05eb2837..ef77698e0d 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -86,7 +86,7 @@
height="18"
left="0"
name="balance"
- tool_tip="Click to refresh your L$ balance"
+ tool_tip="L$ [AMT]&#10;Click to refresh your L$ balance.&#10;Double-click to display or hide your L$ balance."
v_pad="4"
top="0"
wrap="false"
@@ -188,15 +188,21 @@
<button
type="string"
font="SansSerif"
+ image_unselected="mp_fpsButton"
+ image_selected="mp_fpsButton"
+ image_hover_unselected="mp_fpsButton"
+ image_pressed="mp_fpsButton"
+ image_pressed_selected="mp_fpsButton"
+ image_color="White"
label_color="FpsTextColor"
follows="right|top"
halign="center"
valign="center"
height="18"
top="1"
- left_pad="4"
+ left_pad="2"
name="FpsText"
- tool_tip="fps"
+ tool_tip="fps: Color indicates frametime fluctuations (Green is optimal)"
width="32">
60
</button>
diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
index 9a19d06432..1c70383bf9 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -729,8 +729,8 @@
label_width="205"
layout="topleft"
left="10"
- min_val="-100"
- max_val="100"
+ min_val="-10000"
+ max_val="10000"
name="TexScaleU"
top_pad="5"
width="265" />
@@ -742,8 +742,8 @@
label_width="205"
layout="topleft"
left="10"
- min_val="-100"
- max_val="100"
+ min_val="-10000"
+ max_val="10000"
name="TexScaleV"
width="265" />
<spinner
@@ -805,8 +805,8 @@
label_width="205"
layout="topleft"
left="10"
- min_val="-100"
- max_val="100"
+ min_val="-10000"
+ max_val="10000"
name="bumpyScaleU"
top_delta="-115"
width="265" />
@@ -818,8 +818,8 @@
label_width="205"
layout="topleft"
left="10"
- min_val="-100"
- max_val="100"
+ min_val="-10000"
+ max_val="10000"
name="bumpyScaleV"
width="265" />
<spinner
@@ -869,8 +869,8 @@
label_width="205"
layout="topleft"
left="10"
- min_val="-100"
- max_val="100"
+ min_val="-10000"
+ max_val="10000"
name="shinyScaleU"
top_delta="-115"
width="265" />
@@ -882,8 +882,8 @@
label_width="205"
layout="topleft"
left="10"
- min_val="-100"
- max_val="100"
+ min_val="-10000"
+ max_val="10000"
name="shinyScaleV"
width="265" />
<spinner
@@ -968,8 +968,8 @@
label_width="205"
layout="topleft"
left="10"
- min_val="-100"
- max_val="100"
+ min_val="-10000"
+ max_val="10000"
name="gltfTextureScaleU"
top_delta="34"
width="265" />
@@ -981,11 +981,24 @@
label_width="205"
layout="topleft"
left="10"
- min_val="-100"
- max_val="100"
+ min_val="-10000"
+ max_val="10000"
name="gltfTextureScaleV"
width="265" />
<spinner
+ decimal_digits="1"
+ follows="left|top"
+ height="19"
+ initial_value=""
+ label="Repeats per meter"
+ layout="topleft"
+ label_width="205"
+ left="10"
+ max_val="100"
+ min_val="-100"
+ name="gltfRptctrl"
+ width="265" />
+ <spinner
follows="left|top"
height="19"
initial_value="0"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index c03fac4aad..3e9efb6f8b 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -64,7 +64,7 @@ width="333">
font="SansSerifSmall"
text_color="EmphasisColor"
width="300"
- height="10"
+ height="13"
follows="top|left|right"
layout="topleft"
left="35"
@@ -94,7 +94,7 @@ width="333">
image_overlay="Edit_Wrench"
label=""
layout="topleft"
- left="265"
+ right="-3"
name="edit_outfit_btn"
tool_tip="Edit this outfit"
top="3"
@@ -108,17 +108,100 @@ width="333">
top="6"
width="24" />
</panel>
- <filter_editor
- height="23"
- follows="left|top|right"
- layout="topleft"
- left="10"
- label="Filter Outfits"
- max_length_chars="300"
- name="Filter"
- search_button_visible="true"
- top_pad="10"
- width="307" />
+ <layout_stack
+ animate="false"
+ border_size="0"
+ follows="left|top|right"
+ height="27"
+ layout="topleft"
+ orientation="horizontal"
+ top_pad="6"
+ left="0"
+ name="top_menu_panel"
+ width="320">
+ <layout_panel
+ auto_resize="true"
+ layout="topleft"
+ name="filter_panel"
+ width="193">
+ <filter_editor
+ text_pad_left="10"
+ follows="left|top|right"
+ font="SansSerifSmall"
+ height="23"
+ layout="topleft"
+ left="10"
+ label="Filter Outfits"
+ max_length_chars="300"
+ name="Filter"
+ search_button_visible="true"
+ tab_group="1"
+ top="3"
+ width="181" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="options_gear_btn_panel"
+ width="32">
+ <menu_button
+ follows="bottom|left"
+ tool_tip="Show additional options"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ menu_position="bottomleft"
+ layout="topleft"
+ left="0"
+ name="options_gear_btn"
+ top="0"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="options_sort_btn_panel"
+ width="32">
+ <menu_button
+ follows="bottom|left"
+ tool_tip="Show sorting options"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ menu_position="bottomleft"
+ layout="topleft"
+ left="0"
+ name="sorting_menu_btn"
+ top="0"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="trash_btn_panel"
+ width="31">
+ <dnd_button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
+ left="0"
+ layout="topleft"
+ name="trash_btn"
+ tool_tip="Delete selected outfit"
+ top="0"
+ width="31"/>
+ </layout_panel>
+ </layout_stack>
<panel
class="panel_outfits_inventory"
filename="panel_outfits_inventory.xml"
@@ -129,7 +212,7 @@ width="333">
visible="false"
left="0"
tab_group="1"
- top_pad="6"
+ top_pad="4"
follows="all" />
<panel
class="panel_outfit_edit"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 1cb3eca2eb..40a88d4121 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -32,6 +32,10 @@
Owner can:
</panel.string>
<panel.string
+ name="acquiredDateAMPM">
+ [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt]
+ </panel.string>
+ <panel.string
name="acquiredDate">
[wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
</panel.string>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 3755780d33..25827fa236 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -13,7 +13,6 @@
<string name="SUPPORT_SITE">Second Life Support Portal</string>
<!-- starting up -->
- <string name="StartupDetectingHardware">Detecting hardware...</string>
<string name="StartupLoading">Loading [APP_NAME]...</string>
<string name="StartupClearingCache">Clearing cache...</string>
<string name="StartupInitializingTextureCache">Initializing texture cache...</string>
@@ -72,7 +71,7 @@ Voice Server Version: [VOICE_VERSION]
<string name="LocalTime">[month, datetime, local] [day, datetime, local] [year, datetime, local] [hour, datetime, local]:[min, datetime, local]:[second,datetime, local]</string>
<string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string>
<string name="BuildConfiguration">Build Configuration</string>
-
+
<!-- progress -->
<string name="ProgressRestoring">Restoring...</string>
<string name="ProgressChangingResolution">Changing resolution...</string>
@@ -115,10 +114,10 @@ Voice Server Version: [VOICE_VERSION]
<string name="LoginFailedHeader">Login failed.</string>
<string name="Quit">Quit</string>
<string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
-
+
<string name="AgniGridLabel">Second Life Main Grid (Agni)</string>
<string name="AditiGridLabel">Second Life Beta Test Grid (Aditi)</string>
-
+
<string name="ViewerDownloadURL">http://secondlife.com/download</string>
<string name="LoginFailedViewerNotPermitted">
The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
@@ -210,7 +209,7 @@ If you feel this is an error, please contact support@secondlife.com</string>
<string name="YouHaveBeenDisconnected">You have been disconnected from the region you were in.</string>
<string name="SentToInvalidRegion">You were sent to an invalid region.</string>
<string name="TestingDisconnect">Testing viewer disconnect</string>
-
+
<!-- SLShare: User Friendly Filter Names Translation -->
<string name="BlackAndWhite">Black &amp; White</string>
<string name="Colors1970">1970&apos;s Colors</string>
@@ -223,7 +222,7 @@ If you feel this is an error, please contact support@secondlife.com</string>
<string name="LensFlare">Lens Flare</string>
<string name="Miniature">Miniature</string>
<string name="Toycamera">Toy Camera</string>
-
+
<!-- Tooltip -->
<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
<string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
@@ -260,10 +259,11 @@ If you feel this is an error, please contact support@secondlife.com</string>
<string name="TooltipOutboxMixedStock">All items in a stock folder must have the same type and permission</string>
<string name="TooltipOutfitNotInInventory">You can only put items or outfits from your personal inventory into "My outfits"</string>
<string name="TooltipCantCreateOutfit">One or more items can't be used inside "My outfits"</string>
-
+ <string name="TooltipCantMoveOutfitIntoOutfit">Can not move an outfit into another outfit</string>
+
<string name="TooltipDragOntoOwnChild">You can't move a folder into its child</string>
<string name="TooltipDragOntoSelf">You can't move a folder into itself</string>
-
+
<!-- tooltips for Urls -->
<string name="TooltipHttpUrl">Click to view this web page</string>
<string name="TooltipSLURL">Click to view this location's information</string>
@@ -371,7 +371,7 @@ are allowed.
<string name="AssetUploadServerDifficulties">The server is experiencing unexpected difficulties.</string>
<string name="AssetUploadServerUnavaliable">Service not available or upload timeout was reached.</string>
<string name="AssetUploadRequestInvalid">
-Error in upload request. Please visit
+Error in upload request. Please visit
http://secondlife.com/support for help fixing this problem.
</string>
@@ -535,7 +535,7 @@ http://secondlife.com/support for help fixing this problem.
<string name="ChangeYourDefaultAnimations">Change your default animations</string>
<string name="ForceSitAvatar">Force your avatar to sit</string>
<string name="ChangeEnvSettings">Change your environment settings</string>
-
+
<string name="NotConnected">Not Connected</string>
<string name="AgentNameSubst">(You)</string> <!-- Substitution for agent name -->
<string name="JoinAnExperience"/><!-- intentionally blank -->
@@ -2321,7 +2321,8 @@ For AI Character: Get the closest navigable point to the point provided.
<!-- inventory -->
<string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>
- <string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string>
+ <string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string>
+ <string name="InventoryNoMatchingFavorites">You haven't marked any items as favorites.</string>
<string name="PlacesNoMatchingItems">To add a place to your landmarks, click the star to the right of the location name.</string>
<string name="FavoritesNoMatchingItems">To add a place to your favorites, click the star to the right of the location name, then save the landmark to "Favorites bar".</string>
<string name="MarketplaceNoListing">You have no listings yet.</string>
@@ -2485,13 +2486,13 @@ If you continue to receive this message, please contact Second Life support for
<string name="InvFolder Uncompressed Sounds">Uncompressed Sounds</string>
<string name="InvFolder Animations">Animations</string>
<string name="InvFolder Gestures">Gestures</string>
- <string name="InvFolder Favorite">My Favorites</string>
+ <string name="InvFolder Favorite">Favorites Bar</string>
<!-- historically default name of the Favorites folder can start from either "f" or "F" letter.
Also, it can be written as "Favorite" or "Favorites".
We should localize all variants of them with the same value -->
- <string name="InvFolder favorite">My Favorites</string>
- <string name="InvFolder Favorites">My Favorites</string>
- <string name="InvFolder favorites">My Favorites</string>
+ <string name="InvFolder favorite">Favorites Bar</string>
+ <string name="InvFolder Favorites">Favorites Bar</string>
+ <string name="InvFolder favorites">Favorites Bar</string>
<string name="InvFolder Current Outfit">Current Outfit</string>
<string name="InvFolder Initial Outfits">Initial Outfits</string>
<string name="InvFolder My Outfits">My Outfits</string>
@@ -2504,7 +2505,7 @@ If you continue to receive this message, please contact Second Life support for
<string name="InvFolder Materials">Materials</string>
<!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
- <string name="InvFolder Friends">Friends</string>
+ <string name="InvFolder Friends">Friends</string>
<string name="InvFolder All">All</string>
<string name="no_attachments">No attachments worn</string>
@@ -2673,7 +2674,7 @@ If you continue to receive this message, please contact Second Life support for
<string name="UploadFailed">File upload failed: </string>
<string name="ObjectOutOfRange">Script (object out of range)</string>
<string name="ScriptWasDeleted">Script (deleted from inventory)</string>
-
+
<!-- god tools -->
<string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string>
@@ -2942,15 +2943,13 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .anim
<string name="None">None</string>
<string name="Linden Location">Linden Location</string>
<string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Arts &amp; Culture</string>
- <string name="Arts and Culture">Arts &amp; Culture</string>
+ <string name="Arts and Culture">Arts and Culture</string>
<string name="Business">Business</string>
<string name="Educational">Educational</string>
<string name="Gaming">Gaming</string>
<string name="Hangout">Hangout</string>
<string name="Newcomer Friendly">Newcomer Friendly</string>
- <string name="Parks&amp;Nature">Parks &amp; Nature</string>
- <string name="Parks and Nature">Parks &amp; Nature</string>
+ <string name="Parks and Nature">Parks and Nature</string>
<string name="Residential">Residential</string>
<!--<string name="Shopping">Shopping</string> -->
<string name="Stage">Stage</string>
@@ -3720,6 +3719,10 @@ Please reinstall viewer from https://secondlife.com/support/downloads/ and cont
<string name="inventory_folder_offered-im">
Inventory folder '[ITEM_NAME]' offered
</string>
+ <string name="bot_warning">
+ You are chatting with a bot, [NAME]. Do not share any personal information.
+Learn more at https://second.life/scripted-agents.
+ </string>
<string name="share_alert">
Drag items from inventory here
</string>
@@ -3852,7 +3855,7 @@ Please reinstall viewer from https://secondlife.com/support/downloads/ and cont
<string name="uploading_costs">Uploading costs L$ [AMOUNT]</string>
<string name="this_costs">This costs L$ [AMOUNT]</string>
-
+
<string name="buying_selected_land">This land costs</string>
<string name="this_object_costs">This item costs</string>
<string name="giving">You want to give</string>
@@ -3933,7 +3936,7 @@ Abuse Report</string>
<string name="New Daycycle">New Daycycle</string>
<string name="New Water">New Water</string>
<string name="New Sky">New Sky</string>
-
+
<string name="/bow">/bow</string>
<string name="/clap">/clap</string>
@@ -3968,6 +3971,7 @@ Abuse Report</string>
<string name="AvatarBirthDateFormatShort">[mthnum,datetime,slt]/[day,datetime,slt]</string>
<string name="DefaultMimeType">none/none</string>
+ <string name="texture_load_area_error">Can't load images larger than [PIXELS] pixels</string>
<string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string>
<string name="texture_load_format_error">Incorrect image format.</string>
<string name="texture_load_empty_file">File is empty.</string>
@@ -4015,7 +4019,7 @@ Please check http://status.secondlifegrid.net to see if there is a known problem
<string name="Accounting">Accounting</string>
<string name="Notices">Notices</string>
<string name="Chat">Chat</string>
-
+
<!-- SL Membership -->
<string name="BaseMembership">Base</string>
<string name="PremiumMembership">Premium</string>
@@ -4181,11 +4185,11 @@ Try enclosing path to the editor with double quotes.
<!-- commands -->
- <string
+ <string
name="Command_360_Capture_Label">360 snapshot</string>
<string name="Command_AboutLand_Label">About land</string>
<string name="Command_Appearance_Label">Outfits</string>
- <string name="Command_Avatar_Label">Complete avatars</string>
+ <string name="Command_Avatar_Label">Avatar Welcome Pack</string>
<string name="Command_Build_Label">Build</string>
<string name="Command_Chat_Label">Chat</string>
<string name="Command_Conversations_Label">Conversations</string>
@@ -4214,9 +4218,9 @@ name="Command_360_Capture_Label">360 snapshot</string>
<string name="Command_View_Label">Camera controls</string>
<string name="Command_Voice_Label">Voice settings</string>
<string name="Command_FavoriteFolder_Label">Favorite folder</string>
- <string name="Command_ResyncAnimations_Label">Resync animations</string>
+ <string name="Command_ResyncAnimations_Label">Resync animations</string>
- <string
+ <string
name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string>
<string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>
<string name="Command_Appearance_Tooltip">Change your avatar</string>
@@ -4249,7 +4253,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string>
<string name="Command_View_Tooltip">Changing camera angle</string>
<string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string>
<string name="Command_FavoriteFolder_Tooltip">Open your favorite inventory folder</string>
- <string name="Command_ResyncAnimations_Tooltip">Synchronizes avatar animations</string>
+ <string name="Command_ResyncAnimations_Tooltip">Synchronizes avatar animations</string>
<string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string>
<string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string>
@@ -4283,7 +4287,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string>
<!-- Spell check settings floater -->
<string name="UserDictionary">[User]</string>
-
+
<!-- Experience Tools strings -->
<string name="experience_tools_experience">Experience</string>
<string name="ExperienceNameNull">(no experience)</string>
@@ -4345,7 +4349,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string>
<string name="Default">Default</string>
<string name="none_paren_cap">(None)</string>
<string name="no_limit">No limit</string>
-
+
<string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
The physics shape contains triangles which are too small. Try simplifying the physics model.
</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
index b598bbccd8..50c5285e04 100644
--- a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<folder_view_item
folder_arrow_image="Folder_Arrow"
+ favorite_image="Inv_Favorite_Star_Full"
+ favorite_content_image="Inv_Favorite_Star_Content"
folder_indentation="8"
item_height="20"
item_top_pad="4"
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
index 27ec6ded81..865c145022 100644
--- a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<inbox_folder_view_folder
folder_arrow_image="Folder_Arrow"
+ favorite_image="Inv_Favorite_Star_Full"
+ favorite_content_image="Inv_Favorite_Star_Content"
folder_indentation="8"
item_height="20"
item_top_pad="4"
diff --git a/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml b/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml
index cdeff6ab05..f246ff764a 100644
--- a/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml
+++ b/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml
@@ -3,7 +3,6 @@
name="virtualtrackball"
width="150"
height="150"
- user_resize="false"
increment_angle_mouse="1.5f"
increment_angle_btn="1.0f"
image_sphere="VirtualTrackball_Sphere"
diff --git a/indra/newview/skins/default/xui/en/widgets/xy_vector.xml b/indra/newview/skins/default/xui/en/widgets/xy_vector.xml
index 23cde55f30..923895be5e 100644
--- a/indra/newview/skins/default/xui/en/widgets/xy_vector.xml
+++ b/indra/newview/skins/default/xui/en/widgets/xy_vector.xml
@@ -3,11 +3,9 @@
name="xyvector"
width="120"
height="140"
- decimal_digits="1"
label_width="16"
padding="4"
- edit_bar_height="18"
- user_resize="false">
+ edit_bar_height="18">
<xy_vector.border
visible="true"/>
diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml
deleted file mode 100644
index e24d8064a1..0000000000
--- a/indra/newview/skins/default/xui/es/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Cargando...
- </floater.string>
- <floater.string name="done_text">
- Hecho
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Redo search to reflect current God level
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/panel_progress.xml b/indra/newview/skins/default/xui/es/panel_progress.xml
index c9bed9fd9b..377badc89e 100644
--- a/indra/newview/skins/default/xui/es/panel_progress.xml
+++ b/indra/newview/skins/default/xui/es/panel_progress.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" ?>
<panel name="login_progress_panel">
+ <layout_panel name="panel_icons"/>
<layout_stack name="vertical_centering"/>
<layout_panel name="panel4"/>
<layout_panel name="center"/>
<layout_stack name="horizontal_centering">
+ <text name="logos_lbl">Usos de Megapahit</text>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
index b5cf57ade7..c9eea9a58e 100644
--- a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
@@ -7,7 +7,7 @@
Guardar una imagen en el inventario cuesta [UPLOAD_COST] L$. Para guardar una imagen como una textura, selecciona uno de los formatos cuadrados.
</text>
<combo_box label="Resolución" name="texture_size_combo">
- <combo_box.item label="Ventana actual (512 × 512)" name="CurrentWindow"/>
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
<combo_box.item label="Pequeña (128x128)" name="Small(128x128)"/>
<combo_box.item label="Mediana (256x256)" name="Medium(256x256)"/>
<combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
index 4eb9ecf28f..f3119c739e 100644
--- a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="Guardar en disco" name="save_to_computer_btn"/>
- <button label="Guardar en inventario (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Guardar en inventario" name="save_to_inventory_btn"/>
<button label="Compartir en los comentarios de Mi perfil" name="save_to_profile_btn"/>
<button label="Compartir en Facebook" name="send_to_facebook_btn"/>
<button label="Compartir en Twitter" name="send_to_twitter_btn"/>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index cf86427477..c9bb93b315 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1,608 +1,1660 @@
<?xml version="1.0" ?>
<strings>
- <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string>
- <string name="SUPPORT_SITE">Portal de Soporte de Second Life</string>
- <string name="StartupDetectingHardware">Identificando el hardware...</string>
- <string name="StartupLoading">Instalando [APP_NAME]...</string>
- <string name="StartupClearingCache">Limpiando la caché...</string>
- <string name="StartupInitializingTextureCache">Iniciando la caché de las texturas...</string>
- <string name="StartupRequireDriverUpdate">Error de inicialización de gráficos. Actualiza tu controlador de gráficos.</string>
- <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>
- <string name="BuildConfig">Configuración de constitución [BUILD_CONFIG]</string>
- <string name="AboutPosition">Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ <string name="CAPITALIZED_APP_NAME">
+ MEGAPAHIT
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal de Soporte de Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Identificando el hardware...
+ </string>
+ <string name="StartupLoading">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Limpiando la caché...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Iniciando la caché de las texturas...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Error de inicialización de gráficos. Actualiza tu controlador de gráficos.
+ </string>
+ <string name="AboutHeader">
+ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </string>
+ <string name="BuildConfig">
+ Configuración de constitución [BUILD_CONFIG]
+ </string>
+ <string name="AboutPosition">
+ Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(coordenadas globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]</string>
- <string name="AboutSystem">CPU: [CPU]
+[SERVER_RELEASE_NOTES_URL]
+ </string>
+ <string name="AboutSystem">
+ CPU: [CPU]
Memoria: [MEMORY_MB] MB
Versión del Sistema Operativo: [OS_VERSION]
Fabricante de la tarjeta gráfica: [GRAPHICS_CARD_VENDOR]
-Tarjeta gráfica: [GRAPHICS_CARD]</string>
- <string name="AboutDriver">Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION]</string>
- <string name="AboutOGL">Versión de OpenGL: [OPENGL_VERSION]</string>
- <string name="AboutSettings">Tamaño de la ventana: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Tarjeta gráfica: [GRAPHICS_CARD]
+ </string>
+ <string name="AboutDriver">
+ Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION]
+ </string>
+ <string name="AboutOGL">
+ Versión de OpenGL: [OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Tamaño de la ventana: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
Ajuste del tamaño de fuente: [FONT_SIZE_ADJUSTMENT]pt
Escala UI: [UI_SCALE]
Distancia de dibujo: [DRAW_DISTANCE]m
Ancho de banda: [NET_BANDWITH]kbit/s
Factor LOD: [LOD_FACTOR]
Calidad de renderización: [RENDER_QUALITY]
-Memoria de textura: [TEXTURE_MEMORY]MB</string>
- <string name="AboutOSXHiDPI">Modo de visualización HiDPi: [HIDPI]</string>
- <string name="AboutLibs">Versión de descodificador J2C: [J2C_VERSION]
+Memoria de textura: [TEXTURE_MEMORY]MB
+ </string>
+ <string name="AboutOSXHiDPI">
+ Modo de visualización HiDPi: [HIDPI]
+ </string>
+ <string name="AboutLibs">
+ Versión de descodificador J2C: [J2C_VERSION]
Versión del controlador audio: [AUDIO_DRIVER_VERSION]
[LIBCEF_VERSION]
Versión LibVLC: [LIBVLC_VERSION]
-Versión del servidor de voz: [VOICE_VERSION]</string>
- <string name="AboutTraffic">Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>
- <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>
- <string name="ErrorFetchingServerReleaseNotesURL">Error al obtener la URL de las notas de la versión del servidor.</string>
- <string name="BuildConfiguration">Configuración de constitución</string>
- <string name="ProgressRestoring">Restaurando...</string>
- <string name="ProgressChangingResolution">Cambiando la resolución...</string>
- <string name="Fullbright">Brillo al máximo (antiguo)</string>
- <string name="LoginInProgress">Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.</string>
- <string name="LoginInProgressNoFrozen">Iniciando la sesión...</string>
- <string name="LoginAuthenticating">Autenticando</string>
- <string name="LoginMaintenance">Realizando el mantenimiento de la cuenta...</string>
- <string name="LoginAttempt">Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]</string>
- <string name="LoginPrecaching">Cargando el mundo...</string>
- <string name="LoginInitializingBrowser">Iniciando el navegador web incorporado...</string>
- <string name="LoginInitializingMultimedia">Iniciando multimedia...</string>
- <string name="LoginInitializingFonts">Cargando las fuentes...</string>
- <string name="LoginVerifyingCache">Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...</string>
- <string name="LoginProcessingResponse">Procesando la respuesta...</string>
- <string name="LoginInitializingWorld">Iniciando el mundo...</string>
- <string name="LoginDecodingImages">Decodificando las imágenes...</string>
- <string name="LoginInitializingQuicktime">Iniciando QuickTime...</string>
- <string name="LoginQuicktimeNotFound">No se ha encontrado QuickTime. Imposible iniciarlo.</string>
- <string name="LoginQuicktimeOK">QuickTime se ha iniciado adecuadamente.</string>
- <string name="LoginRequestSeedCapGrant">Solicitando capacidades de la región...</string>
- <string name="LoginRetrySeedCapGrant">Solicitando capacidades de la región, intento [NUMBER]...</string>
- <string name="LoginWaitingForRegionHandshake">Esperando la conexión con la región...</string>
- <string name="LoginConnectingToRegion">Conectando con la región...</string>
- <string name="LoginDownloadingClothing">Descargando la ropa...</string>
- <string name="InvalidCertificate">El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.</string>
- <string name="CertInvalidHostname">El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.</string>
- <string name="CertExpired">Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.</string>
- <string name="CertKeyUsage">El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.</string>
- <string name="CertBasicConstraints">La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.</string>
- <string name="CertInvalidSignature">No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.</string>
- <string name="LoginFailedNoNetwork">Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet.</string>
- <string name="LoginFailedHeader">Error en el inicio de sesión.</string>
- <string name="Quit">Salir</string>
- <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
- <string name="AgniGridLabel">Grid principal de Second Life (Agni)</string>
- <string name="AditiGridLabel">Grid de prueba beta de Second Life (Aditi)</string>
- <string name="ViewerDownloadURL">http://secondlife.com/download.</string>
- <string name="LoginFailedViewerNotPermitted">Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor:
+Versión del servidor de voz: [VOICE_VERSION]
+ </string>
+ <string name="AboutTraffic">
+ Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
+ <string name="ErrorFetchingServerReleaseNotesURL">
+ Error al obtener la URL de las notas de la versión del servidor.
+ </string>
+ <string name="BuildConfiguration">
+ Configuración de constitución
+ </string>
+ <string name="ProgressRestoring">
+ Restaurando...
+ </string>
+ <string name="ProgressChangingResolution">
+ Cambiando la resolución...
+ </string>
+ <string name="Fullbright">
+ Brillo al máximo (antiguo)
+ </string>
+ <string name="LoginInProgress">
+ Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Iniciando la sesión...
+ </string>
+ <string name="LoginAuthenticating">
+ Autenticando
+ </string>
+ <string name="LoginMaintenance">
+ Realizando el mantenimiento de la cuenta...
+ </string>
+ <string name="LoginAttempt">
+ Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Cargando el mundo...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Iniciando el navegador web incorporado...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Iniciando multimedia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Cargando las fuentes...
+ </string>
+ <string name="LoginVerifyingCache">
+ Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Procesando la respuesta...
+ </string>
+ <string name="LoginInitializingWorld">
+ Iniciando el mundo...
+ </string>
+ <string name="LoginDecodingImages">
+ Decodificando las imágenes...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Iniciando QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ No se ha encontrado QuickTime. Imposible iniciarlo.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime se ha iniciado adecuadamente.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Solicitando capacidades de la región...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Solicitando capacidades de la región, intento [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Esperando la conexión con la región...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Conectando con la región...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Descargando la ropa...
+ </string>
+ <string name="InvalidCertificate">
+ El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertInvalidHostname">
+ El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.
+ </string>
+ <string name="CertExpired">
+ Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.
+ </string>
+ <string name="CertKeyUsage">
+ El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertBasicConstraints">
+ La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertInvalidSignature">
+ No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet.
+ </string>
+ <string name="LoginFailedHeader">
+ Error en el inicio de sesión.
+ </string>
+ <string name="Quit">
+ Salir
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/?sourceid=[sourceid]
+ </string>
+ <string name="AgniGridLabel">
+ Grid principal de Second Life (Agni)
+ </string>
+ <string name="AditiGridLabel">
+ Grid de prueba beta de Second Life (Aditi)
+ </string>
+ <string name="ViewerDownloadURL">
+ http://secondlife.com/download.
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor:
http://secondlife.com/download.
Si deseas obtener más información, consulta las preguntas frecuentes que aparecen a continuación:
-http://secondlife.com/viewer-access-faq</string>
- <string name="LoginIntermediateOptionalUpdateAvailable">Actualización opcional del visor disponible: [VERSION]</string>
- <string name="LoginFailedRequiredUpdate">Actualización necesaria del visor: [VERSION]</string>
- <string name="LoginFailedAlreadyLoggedIn">El agente ya ha iniciado sesión.</string>
- <string name="LoginFailedAuthenticationFailed">Lo sentimos. No ha sido posible iniciar sesión.
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Actualización opcional del visor disponible: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Actualización necesaria del visor: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ El agente ya ha iniciado sesión.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Lo sentimos. No ha sido posible iniciar sesión.
Comprueba si has introducido correctamente
* El nombre de usuario (como juangarcia12 o estrella.polar)
* Contraseña
-Asimismo, asegúrate de que la tecla Mayús esté desactivada.</string>
- <string name="LoginFailedPasswordChanged">Como precaución de seguridad, se ha modificado tu contraseña.
+Asimismo, asegúrate de que la tecla Mayús esté desactivada.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Como precaución de seguridad, se ha modificado tu contraseña.
Dirígete a la página de tu cuenta en http://secondlife.com/password
y responde a la pregunta de seguridad para restablecer la contraseña.
-Lamentamos las molestias.</string>
- <string name="LoginFailedPasswordReset">Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña.
+Lamentamos las molestias.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña.
Dirígete a la página de tu cuenta en http://secondlife.com/password
y responde a la pregunta de seguridad para restablecer la contraseña.
-Lamentamos las molestias.</string>
- <string name="LoginFailedEmployeesOnly">Second Life no está disponible temporalmente debido a tareas de mantenimiento.
+Lamentamos las molestias.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life no está disponible temporalmente debido a tareas de mantenimiento.
Actualmente, solo se permite iniciar sesión a los empleados.
-Consulta www.secondlife.com/status si deseas obtener actualizaciones.</string>
- <string name="LoginFailedPremiumOnly">Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible.
+Consulta www.secondlife.com/status si deseas obtener actualizaciones.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible.
-Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago.</string>
- <string name="LoginFailedComputerProhibited">No se puede acceder a Second Life desde este ordenador.
+Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ No se puede acceder a Second Life desde este ordenador.
Si crees que se trata de un error, ponte en contacto con
-support@secondlife.com.</string>
- <string name="LoginFailedAcountSuspended">No se podrá acceder a tu cuenta hasta las
-[TIME] (horario de la costa del Pacífico).</string>
- <string name="LoginFailedAccountDisabled">En este momento no podemos completar la solicitud.
-Por favor solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com.</string>
- <string name="LoginFailedTransformError">Se han detectado datos incorrectos en el inicio de sesión.
-Ponte en contacto con support@secondlife.com.</string>
- <string name="LoginFailedAccountMaintenance">Se están realizando tareas rutinarias de mantenimiento en tu cuenta.
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ No se podrá acceder a tu cuenta hasta las
+[TIME] (horario de la costa del Pacífico).
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ En este momento no podemos completar la solicitud.
+Por favor solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com.
+ </string>
+ <string name="LoginFailedTransformError">
+ Se han detectado datos incorrectos en el inicio de sesión.
+Ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Se están realizando tareas rutinarias de mantenimiento en tu cuenta.
No se podrá acceder a tu cuenta hasta las
[TIME] (horario de la costa del Pacífico).
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string>
- <string name="LoginFailedPendingLogoutFault">La solicitud de cierre de sesión ha obtenido como resultado un error del simulador.</string>
- <string name="LoginFailedPendingLogout">El sistema te desconectará.
-Por favor, aguarda un momento antes de intentar conectarte nuevamente.</string>
- <string name="LoginFailedUnableToCreateSession">No se ha podido crear una sesión válida.</string>
- <string name="LoginFailedUnableToConnectToSimulator">No se ha podido establecer la conexión con un simulador.</string>
- <string name="LoginFailedRestrictedHours">Tu cuenta solo puede acceder a Second Life
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ La solicitud de cierre de sesión ha obtenido como resultado un error del simulador.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ El sistema te desconectará.
+Por favor, aguarda un momento antes de intentar conectarte nuevamente.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ No se ha podido crear una sesión válida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ No se ha podido establecer la conexión con un simulador.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Tu cuenta solo puede acceder a Second Life
entre las [START] y las [END] (horario de la costa del Pacífico).
Inténtalo de nuevo durante ese horario.
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string>
- <string name="LoginFailedIncorrectParameters">Parámetros incorrectos.
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string>
- <string name="LoginFailedFirstNameNotAlphanumeric">El parámetro correspondiente al nombre debe contener caracteres alfanuméricos.
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string>
- <string name="LoginFailedLastNameNotAlphanumeric">El parámetro correspondiente al apellido debe contener caracteres alfanuméricos.
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string>
- <string name="LogoutFailedRegionGoingOffline">La región se está desconectando.
-Intenta iniciar sesión de nuevo en unos instantes.</string>
- <string name="LogoutFailedAgentNotInRegion">El agente no se encuentra en la región.
-Intenta iniciar sesión de nuevo en unos instantes.</string>
- <string name="LogoutFailedPendingLogin">A esta región ya se ha accedido en otra sesión.
-Intenta iniciar sesión de nuevo en unos instantes.</string>
- <string name="LogoutFailedLoggingOut">Se ha salido de la región en la sesión anterior.
-Intenta iniciar sesión de nuevo en unos instantes.</string>
- <string name="LogoutFailedStillLoggingOut">La región aún está cerrando la sesión anterior.
-Intenta iniciar sesión de nuevo en unos instantes.</string>
- <string name="LogoutSucceeded">Se ha salido de la región en la última sesión.
-Intenta iniciar sesión de nuevo en unos instantes.</string>
- <string name="LogoutFailedLogoutBegun">La región ha comenzado el proceso de cierre de sesión.
-Intenta iniciar sesión de nuevo en unos instantes.</string>
- <string name="LoginFailedLoggingOutSession">El sistema ha comenzado a cerrar la última sesión.
-Intenta iniciar sesión de nuevo en unos instantes.</string>
- <string name="AgentLostConnection">Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.</string>
- <string name="SavingSettings">Guardando tus configuraciones...</string>
- <string name="LoggingOut">Cerrando sesión...</string>
- <string name="ShuttingDown">Cerrando...</string>
- <string name="YouHaveBeenDisconnected">Has sido desconectado de la región en la que estabas.</string>
- <string name="SentToInvalidRegion">Has sido enviado a una región no válida.</string>
- <string name="TestingDisconnect">Probando la desconexión del visor</string>
- <string name="SocialFacebookConnecting">Conectando con Facebook...</string>
- <string name="SocialFacebookPosting">Publicando...</string>
- <string name="SocialFacebookDisconnecting">Desconectando de Facebook...</string>
- <string name="SocialFacebookErrorConnecting">Problema al conectar con Facebook</string>
- <string name="SocialFacebookErrorPosting">Problema al publicar en Facebook</string>
- <string name="SocialFacebookErrorDisconnecting">Problema al desconectar de Facebook</string>
- <string name="SocialFlickrConnecting">Conectándose a Flickr...</string>
- <string name="SocialFlickrPosting">Publicando...</string>
- <string name="SocialFlickrDisconnecting">Desconectándose de Flickr...</string>
- <string name="SocialFlickrErrorConnecting">Problema con la conexión a Flickr</string>
- <string name="SocialFlickrErrorPosting">Problema al publicar en Flickr</string>
- <string name="SocialFlickrErrorDisconnecting">Problema con la desconexión de Flickr</string>
- <string name="SocialTwitterConnecting">Conectándose a Twitter...</string>
- <string name="SocialTwitterPosting">Publicando...</string>
- <string name="SocialTwitterDisconnecting">Desconectándose de Twitter...</string>
- <string name="SocialTwitterErrorConnecting">Problema con la conexión a Twitter</string>
- <string name="SocialTwitterErrorPosting">Problema al publicar en Twitter</string>
- <string name="SocialTwitterErrorDisconnecting">Problema con la desconexión de Twitter</string>
- <string name="BlackAndWhite">Blanco y negro</string>
- <string name="Colors1970">Colores de los 70</string>
- <string name="Intense">Intenso</string>
- <string name="Newspaper">Periódico</string>
- <string name="Sepia">Sepia</string>
- <string name="Spotlight">Foco</string>
- <string name="Video">Vídeo</string>
- <string name="Autocontrast">Contraste automático</string>
- <string name="LensFlare">Destello de lente</string>
- <string name="Miniature">Miniatura</string>
- <string name="Toycamera">Cámara de juguete</string>
- <string name="TooltipPerson">Persona</string>
- <string name="TooltipNoName">(sin nombre)</string>
- <string name="TooltipOwner">Propietario:</string>
- <string name="TooltipPublic">Público</string>
- <string name="TooltipIsGroup">(Grupo)</string>
- <string name="TooltipForSaleL$">En venta: [AMOUNT] L$</string>
- <string name="TooltipFlagGroupBuild">Construir el grupo</string>
- <string name="TooltipFlagNoBuild">No construir</string>
- <string name="TooltipFlagNoEdit">Construir el grupo</string>
- <string name="TooltipFlagNotSafe">No seguro</string>
- <string name="TooltipFlagNoFly">No volar</string>
- <string name="TooltipFlagGroupScripts">Scripts el grupo</string>
- <string name="TooltipFlagNoScripts">No scripts</string>
- <string name="TooltipLand">Terreno:</string>
- <string name="TooltipMustSingleDrop">Aquí se puede arrastrar sólo un ítem</string>
- <string name="TooltipTooManyWearables">No puedes tener una carpeta de prendas que contenga más de [AMOUNT] elementos. Puedes cambiar este límite en Avanzado &gt; Mostrar las configuraciones del depurador &gt; WearFolderLimit.</string>
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parámetros incorrectos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ El parámetro correspondiente al nombre debe contener caracteres alfanuméricos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ El parámetro correspondiente al apellido debe contener caracteres alfanuméricos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La región se está desconectando.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ El agente no se encuentra en la región.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ A esta región ya se ha accedido en otra sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Se ha salido de la región en la sesión anterior.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ La región aún está cerrando la sesión anterior.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutSucceeded">
+ Se ha salido de la región en la última sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ La región ha comenzado el proceso de cierre de sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ El sistema ha comenzado a cerrar la última sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="AgentLostConnection">
+ Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
+ </string>
+ <string name="SavingSettings">
+ Guardando tus configuraciones...
+ </string>
+ <string name="LoggingOut">
+ Cerrando sesión...
+ </string>
+ <string name="ShuttingDown">
+ Cerrando...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Has sido desconectado de la región en la que estabas.
+ </string>
+ <string name="SentToInvalidRegion">
+ Has sido enviado a una región no válida.
+ </string>
+ <string name="TestingDisconnect">
+ Probando la desconexión del visor
+ </string>
+ <string name="SocialFacebookConnecting">
+ Conectando con Facebook...
+ </string>
+ <string name="SocialFacebookPosting">
+ Publicando...
+ </string>
+ <string name="SocialFacebookDisconnecting">
+ Desconectando de Facebook...
+ </string>
+ <string name="SocialFacebookErrorConnecting">
+ Problema al conectar con Facebook
+ </string>
+ <string name="SocialFacebookErrorPosting">
+ Problema al publicar en Facebook
+ </string>
+ <string name="SocialFacebookErrorDisconnecting">
+ Problema al desconectar de Facebook
+ </string>
+ <string name="SocialFlickrConnecting">
+ Conectándose a Flickr...
+ </string>
+ <string name="SocialFlickrPosting">
+ Publicando...
+ </string>
+ <string name="SocialFlickrDisconnecting">
+ Desconectándose de Flickr...
+ </string>
+ <string name="SocialFlickrErrorConnecting">
+ Problema con la conexión a Flickr
+ </string>
+ <string name="SocialFlickrErrorPosting">
+ Problema al publicar en Flickr
+ </string>
+ <string name="SocialFlickrErrorDisconnecting">
+ Problema con la desconexión de Flickr
+ </string>
+ <string name="SocialTwitterConnecting">
+ Conectándose a Twitter...
+ </string>
+ <string name="SocialTwitterPosting">
+ Publicando...
+ </string>
+ <string name="SocialTwitterDisconnecting">
+ Desconectándose de Twitter...
+ </string>
+ <string name="SocialTwitterErrorConnecting">
+ Problema con la conexión a Twitter
+ </string>
+ <string name="SocialTwitterErrorPosting">
+ Problema al publicar en Twitter
+ </string>
+ <string name="SocialTwitterErrorDisconnecting">
+ Problema con la desconexión de Twitter
+ </string>
+ <string name="BlackAndWhite">
+ Blanco y negro
+ </string>
+ <string name="Colors1970">
+ Colores de los 70
+ </string>
+ <string name="Intense">
+ Intenso
+ </string>
+ <string name="Newspaper">
+ Periódico
+ </string>
+ <string name="Sepia">
+ Sepia
+ </string>
+ <string name="Spotlight">
+ Foco
+ </string>
+ <string name="Video">
+ Vídeo
+ </string>
+ <string name="Autocontrast">
+ Contraste automático
+ </string>
+ <string name="LensFlare">
+ Destello de lente
+ </string>
+ <string name="Miniature">
+ Miniatura
+ </string>
+ <string name="Toycamera">
+ Cámara de juguete
+ </string>
+ <string name="TooltipPerson">
+ Persona
+ </string>
+ <string name="TooltipNoName">
+ (sin nombre)
+ </string>
+ <string name="TooltipOwner">
+ Propietario:
+ </string>
+ <string name="TooltipPublic">
+ Público
+ </string>
+ <string name="TooltipIsGroup">
+ (Grupo)
+ </string>
+ <string name="TooltipForSaleL$">
+ En venta: [AMOUNT] L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Construir el grupo
+ </string>
+ <string name="TooltipFlagNoBuild">
+ No construir
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Construir el grupo
+ </string>
+ <string name="TooltipFlagNotSafe">
+ No seguro
+ </string>
+ <string name="TooltipFlagNoFly">
+ No volar
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Scripts el grupo
+ </string>
+ <string name="TooltipFlagNoScripts">
+ No scripts
+ </string>
+ <string name="TooltipLand">
+ Terreno:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Aquí se puede arrastrar sólo un ítem
+ </string>
+ <string name="TooltipTooManyWearables">
+ No puedes tener una carpeta de prendas que contenga más de [AMOUNT] elementos. Puedes cambiar este límite en Avanzado &gt; Mostrar las configuraciones del depurador &gt; WearFolderLimit.
+ </string>
<string name="TooltipPrice" value="[AMOUNT] L$:"/>
- <string name="TooltipSLIcon">Esto crea un vínculo a una página del dominio oficial SecondLife.com o LindenLab.com.</string>
- <string name="TooltipOutboxDragToWorld">No se pueden mostrar artículos desde la carpeta Artículos del mercado</string>
- <string name="TooltipOutboxWorn">Los artículos que tienes puestos no se pueden colocar en la carpeta Artículos del mercado</string>
- <string name="TooltipOutboxFolderLevels">La profundidad de carpetas anidadas excede de [AMOUNT]. Disminuye la profundidad de las carpetas anidadas; si es necesario, agrupa los artículos.</string>
- <string name="TooltipOutboxTooManyFolders">La cantidad de subcarpetas excede de [AMOUNT]. Disminuye la cantidad de carpetas de tu lista de artículos; si es necesario, agrupa los artículos.</string>
- <string name="TooltipOutboxTooManyObjects">La cantidad de artículos excede de [AMOUNT]. Para vender más de [AMOUNT] artículos en la misma lista, debes agrupar algunos.</string>
- <string name="TooltipOutboxTooManyStockItems">La cantidad de artículos en stock excede de [AMOUNT].</string>
- <string name="TooltipOutboxCannotDropOnRoot">Solo se pueden soltar artículos o carpetas en las pestañas TODOS o SIN ASOCIAR. Selecciona una de estas pestañas y mueve otra vez los artículos o carpetas.</string>
- <string name="TooltipOutboxNoTransfer">Uno o varios de estos objetos no se pueden vender o transferir</string>
- <string name="TooltipOutboxNotInInventory">Solo puedes colocar en el mercado artículos de tu inventario</string>
- <string name="TooltipOutboxLinked">No puedes poner carpetas o artículos vinculados en el Mercado</string>
- <string name="TooltipOutboxCallingCard">No puedes colocar tarjetas de visita en el Mercado</string>
- <string name="TooltipOutboxDragActive">No se puede mover una lista de artículos publicada</string>
- <string name="TooltipOutboxCannotMoveRoot">No se puede mover la carpeta raíz de artículos del Mercado</string>
- <string name="TooltipOutboxMixedStock">Todos los artículos de una carpeta de stock deben tener el mismo tipo y permiso</string>
- <string name="TooltipDragOntoOwnChild">No puedes mover una carpeta a su carpeta secundaria</string>
- <string name="TooltipDragOntoSelf">No puedes mover una carpeta dentro de sí misma</string>
- <string name="TooltipHttpUrl">Pulsa para ver esta página web</string>
- <string name="TooltipSLURL">Pulsa para ver la información de este lugar</string>
- <string name="TooltipAgentUrl">Pulsa para ver el perfil del Residente</string>
- <string name="TooltipAgentInspect">Obtén más información acerca de este residente.</string>
- <string name="TooltipAgentMute">Pulsa para silenciar a este Residente</string>
- <string name="TooltipAgentUnmute">Pulsa para quitar el silencio a este Residente</string>
- <string name="TooltipAgentIM">Pulsa para enviar un MI a este Residente</string>
- <string name="TooltipAgentPay">Pulsa para pagar a este Residente</string>
- <string name="TooltipAgentOfferTeleport">Pulsa para enviar una petición de teleporte a este Residente</string>
- <string name="TooltipAgentRequestFriend">Pulsa para enviar una petición de amistad a este Residente</string>
- <string name="TooltipGroupUrl">Pulsa para ver la descripción de este grupo</string>
- <string name="TooltipEventUrl">Pulsa para ver la descripción de este evento</string>
- <string name="TooltipClassifiedUrl">Pulsa para ver este clasificado</string>
- <string name="TooltipParcelUrl">Pulsa para ver la descripción de esta parcela</string>
- <string name="TooltipTeleportUrl">Pulsa para teleportarte a esta posición</string>
- <string name="TooltipObjectIMUrl">Pulsa para ver la descripción de este objeto</string>
- <string name="TooltipMapUrl">Pulsa para ver en el mapa esta localización</string>
- <string name="TooltipSLAPP">Pulsa para ejecutar el comando secondlife://</string>
+ <string name="TooltipSLIcon">
+ Esto crea un vínculo a una página del dominio oficial SecondLife.com o LindenLab.com.
+ </string>
+ <string name="TooltipOutboxDragToWorld">
+ No se pueden mostrar artículos desde la carpeta Artículos del mercado
+ </string>
+ <string name="TooltipOutboxWorn">
+ Los artículos que tienes puestos no se pueden colocar en la carpeta Artículos del mercado
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ La profundidad de carpetas anidadas excede de [AMOUNT]. Disminuye la profundidad de las carpetas anidadas; si es necesario, agrupa los artículos.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ La cantidad de subcarpetas excede de [AMOUNT]. Disminuye la cantidad de carpetas de tu lista de artículos; si es necesario, agrupa los artículos.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ La cantidad de artículos excede de [AMOUNT]. Para vender más de [AMOUNT] artículos en la misma lista, debes agrupar algunos.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ La cantidad de artículos en stock excede de [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Solo se pueden soltar artículos o carpetas en las pestañas TODOS o SIN ASOCIAR. Selecciona una de estas pestañas y mueve otra vez los artículos o carpetas.
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Uno o varios de estos objetos no se pueden vender o transferir
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Solo puedes colocar en el mercado artículos de tu inventario
+ </string>
+ <string name="TooltipOutboxLinked">
+ No puedes poner carpetas o artículos vinculados en el Mercado
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ No puedes colocar tarjetas de visita en el Mercado
+ </string>
+ <string name="TooltipOutboxDragActive">
+ No se puede mover una lista de artículos publicada
+ </string>
+ <string name="TooltipOutboxCannotMoveRoot">
+ No se puede mover la carpeta raíz de artículos del Mercado
+ </string>
+ <string name="TooltipOutboxMixedStock">
+ Todos los artículos de una carpeta de stock deben tener el mismo tipo y permiso
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ No puedes mover una carpeta a su carpeta secundaria
+ </string>
+ <string name="TooltipDragOntoSelf">
+ No puedes mover una carpeta dentro de sí misma
+ </string>
+ <string name="TooltipHttpUrl">
+ Pulsa para ver esta página web
+ </string>
+ <string name="TooltipSLURL">
+ Pulsa para ver la información de este lugar
+ </string>
+ <string name="TooltipAgentUrl">
+ Pulsa para ver el perfil del Residente
+ </string>
+ <string name="TooltipAgentInspect">
+ Obtén más información acerca de este residente.
+ </string>
+ <string name="TooltipAgentMute">
+ Pulsa para silenciar a este Residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Pulsa para quitar el silencio a este Residente
+ </string>
+ <string name="TooltipAgentIM">
+ Pulsa para enviar un MI a este Residente
+ </string>
+ <string name="TooltipAgentPay">
+ Pulsa para pagar a este Residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Pulsa para enviar una petición de teleporte a este Residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Pulsa para enviar una petición de amistad a este Residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Pulsa para ver la descripción de este grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Pulsa para ver la descripción de este evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Pulsa para ver este clasificado
+ </string>
+ <string name="TooltipParcelUrl">
+ Pulsa para ver la descripción de esta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Pulsa para teleportarte a esta posición
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Pulsa para ver la descripción de este objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Pulsa para ver en el mapa esta localización
+ </string>
+ <string name="TooltipSLAPP">
+ Pulsa para ejecutar el comando secondlife://
+ </string>
<string name="CurrentURL" value="URL actual: [CurrentURL]"/>
- <string name="TooltipEmail">Haz clic para redactar un correo electrónico</string>
- <string name="SLurlLabelTeleport">Teleportarse a</string>
- <string name="SLurlLabelShowOnMap">Mostrarla en el mapa</string>
- <string name="SLappAgentMute">Silenciar</string>
- <string name="SLappAgentUnmute">Quitar el silencio</string>
- <string name="SLappAgentIM">MI</string>
- <string name="SLappAgentPay">Pagar</string>
- <string name="SLappAgentOfferTeleport">Ofrecer teleporte a</string>
- <string name="SLappAgentRequestFriend">Petición de amistad</string>
- <string name="SLappAgentRemoveFriend">Eliminación de amigos</string>
- <string name="BUTTON_CLOSE_DARWIN">Cerrar (⌘W)</string>
- <string name="BUTTON_CLOSE_WIN">Cerrar (Ctrl+W)</string>
- <string name="BUTTON_CLOSE_CHROME">Cerrar</string>
- <string name="BUTTON_RESTORE">Maximizar</string>
- <string name="BUTTON_MINIMIZE">Minimizar</string>
- <string name="BUTTON_TEAR_OFF">Separar la ventana</string>
- <string name="BUTTON_DOCK">Fijar</string>
- <string name="BUTTON_HELP">Ver la Ayuda</string>
- <string name="TooltipNotecardNotAllowedTypeDrop">Los objetos de este tipo no se pueden adjuntar
-a las notas de esta región.</string>
- <string name="TooltipNotecardOwnerRestrictedDrop">Sólo los objetos con permisos
+ <string name="TooltipEmail">
+ Haz clic para redactar un correo electrónico
+ </string>
+ <string name="SLurlLabelTeleport">
+ Teleportarse a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrarla en el mapa
+ </string>
+ <string name="SLappAgentMute">
+ Silenciar
+ </string>
+ <string name="SLappAgentUnmute">
+ Quitar el silencio
+ </string>
+ <string name="SLappAgentIM">
+ MI
+ </string>
+ <string name="SLappAgentPay">
+ Pagar
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Ofrecer teleporte a
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Petición de amistad
+ </string>
+ <string name="SLappAgentRemoveFriend">
+ Eliminación de amigos
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Cerrar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Cerrar (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Cerrar
+ </string>
+ <string name="BUTTON_RESTORE">
+ Maximizar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar la ventana
+ </string>
+ <string name="BUTTON_DOCK">
+ Fijar
+ </string>
+ <string name="BUTTON_HELP">
+ Ver la Ayuda
+ </string>
+ <string name="TooltipNotecardNotAllowedTypeDrop">
+ Los objetos de este tipo no se pueden adjuntar
+a las notas de esta región.
+ </string>
+ <string name="TooltipNotecardOwnerRestrictedDrop">
+ Sólo los objetos con permisos
«próximo propietario» sin restricciones
-pueden adjuntarse a las notas.</string>
- <string name="Searching">Buscando...</string>
- <string name="NoneFound">No se ha encontrado.</string>
- <string name="RetrievingData">Reintentando...</string>
- <string name="ReleaseNotes">Notas de la versión</string>
- <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string>
- <string name="LoadingData">Cargando...</string>
- <string name="AvatarNameNobody">(nadie)</string>
- <string name="AvatarNameWaiting">(esperando)</string>
- <string name="GroupNameNone">(ninguno)</string>
- <string name="AssetErrorNone">No hay ningún error</string>
- <string name="AssetErrorRequestFailed">Petición de asset: fallida</string>
- <string name="AssetErrorNonexistentFile">Petición de asset: el archivo no existe</string>
- <string name="AssetErrorNotInDatabase">Petición de asset: no se encontró el asset en la base de datos</string>
- <string name="AssetErrorEOF">Fin del archivo</string>
- <string name="AssetErrorCannotOpenFile">No puede abrirse el archivo</string>
- <string name="AssetErrorFileNotFound">No se ha encontrado el archivo</string>
- <string name="AssetErrorTCPTimeout">Tiempo de transferencia del archivo</string>
- <string name="AssetErrorCircuitGone">Circuito desconectado</string>
- <string name="AssetErrorPriceMismatch">No concuerda el precio en el visor y en el servidor</string>
- <string name="AssetErrorUnknownStatus">Estado desconocido</string>
- <string name="AssetUploadServerUnreacheble">El servicio no está disponible.</string>
- <string name="AssetUploadServerDifficulties">Se detectaron errores inesperados en el servidor.</string>
- <string name="AssetUploadServerUnavaliable">El servicio no está disponible o se alcanzó el tiempo de carga máxima.</string>
- <string name="AssetUploadRequestInvalid">Error en la solicitud de carga. Por favor, ingresa a
-http://secondlife.com/support para obtener ayuda sobre cómo solucionar este problema.</string>
- <string name="SettingValidationError">Error en la validación para importar los parámetros [NAME]</string>
- <string name="SettingImportFileError">No se pudo abrir el archivo [FILE]</string>
- <string name="SettingParseFileError">No se pudo abrir el archivo [FILE]</string>
- <string name="SettingTranslateError">No se pudo traducir el Viento de luz legado [NAME]</string>
- <string name="texture">la textura</string>
- <string name="sound">el sonido</string>
- <string name="calling card">la tarjeta de visita</string>
- <string name="landmark">el hito</string>
- <string name="legacy script">el script antiguo</string>
- <string name="clothing">esa ropa</string>
- <string name="object">el objeto</string>
- <string name="note card">la nota</string>
- <string name="folder">la carpeta</string>
- <string name="root">la ruta</string>
- <string name="lsl2 script">ese script de LSL2</string>
- <string name="lsl bytecode">el código intermedio de LSL</string>
- <string name="tga texture">esa textura tga</string>
- <string name="body part">esa parte del cuerpo</string>
- <string name="snapshot">la foto</string>
- <string name="lost and found">Objetos Perdidos</string>
- <string name="targa image">esa imagen targa</string>
- <string name="trash">la Papelera</string>
- <string name="jpeg image">esa imagen jpeg</string>
- <string name="animation">la animación</string>
- <string name="gesture">el gesto</string>
- <string name="simstate">simstate</string>
- <string name="favorite">ese favorito</string>
- <string name="symbolic link">el enlace</string>
- <string name="symbolic folder link">enlace de la carpeta</string>
- <string name="settings blob">opciones</string>
- <string name="mesh">red</string>
- <string name="AvatarEditingAppearance">(Edición de Apariencia)</string>
- <string name="AvatarAway">Ausente</string>
- <string name="AvatarDoNotDisturb">No molestar</string>
- <string name="AvatarMuted">Ignorado</string>
- <string name="anim_express_afraid">Susto</string>
- <string name="anim_express_anger">Enfado</string>
- <string name="anim_away">Ausente</string>
- <string name="anim_backflip">Salto mortal atrás</string>
- <string name="anim_express_laugh">Carcajada</string>
- <string name="anim_express_toothsmile">Gran sonrisa</string>
- <string name="anim_blowkiss">Mandar un beso</string>
- <string name="anim_express_bored">Aburrimiento</string>
- <string name="anim_bow">Reverencia</string>
- <string name="anim_clap">Aplauso</string>
- <string name="anim_courtbow">Reverencia floreada</string>
- <string name="anim_express_cry">Llanto</string>
- <string name="anim_dance1">Baile 1</string>
- <string name="anim_dance2">Baile 2</string>
- <string name="anim_dance3">Baile 3</string>
- <string name="anim_dance4">Baile 4</string>
- <string name="anim_dance5">Baile 5</string>
- <string name="anim_dance6">Baile 6</string>
- <string name="anim_dance7">Baile 7</string>
- <string name="anim_dance8">Baile 8</string>
- <string name="anim_express_disdain">Desdén</string>
- <string name="anim_drink">Beber</string>
- <string name="anim_express_embarrased">Azorarse</string>
- <string name="anim_angry_fingerwag">Negar con el dedo</string>
- <string name="anim_fist_pump">Éxito con el puño</string>
- <string name="anim_yoga_float">Yoga flotando</string>
- <string name="anim_express_frown">Fruncir el ceño</string>
- <string name="anim_impatient">Impaciente</string>
- <string name="anim_jumpforjoy">Salto de alegría</string>
- <string name="anim_kissmybutt">Bésame el culo</string>
- <string name="anim_express_kiss">Besar</string>
- <string name="anim_laugh_short">Reír</string>
- <string name="anim_musclebeach">Sacar músculo</string>
- <string name="anim_no_unhappy">No (con enfado)</string>
- <string name="anim_no_head">No</string>
- <string name="anim_nyanya">Ña-Ña-Ña</string>
- <string name="anim_punch_onetwo">Puñetazo uno-dos</string>
- <string name="anim_express_open_mouth">Abrir la boca</string>
- <string name="anim_peace">'V' con los dedos</string>
- <string name="anim_point_you">Señalar a otro/a</string>
- <string name="anim_point_me">Señalarse</string>
- <string name="anim_punch_l">Puñetazo izquierdo</string>
- <string name="anim_punch_r">Puñetazo derecho</string>
- <string name="anim_rps_countdown">PPT cuenta</string>
- <string name="anim_rps_paper">PPT papel</string>
- <string name="anim_rps_rock">PPT piedra</string>
- <string name="anim_rps_scissors">PPT tijera</string>
- <string name="anim_express_repulsed">Repulsa</string>
- <string name="anim_kick_roundhouse_r">Patada circular</string>
- <string name="anim_express_sad">Triste</string>
- <string name="anim_salute">Saludo militar</string>
- <string name="anim_shout">Gritar</string>
- <string name="anim_express_shrug">Encogerse de hombros</string>
- <string name="anim_express_smile">Sonreír</string>
- <string name="anim_smoke_idle">Fumar: en la mano</string>
- <string name="anim_smoke_inhale">Fumar</string>
- <string name="anim_smoke_throw_down">Fumar: tirar el cigarro</string>
- <string name="anim_express_surprise">Sorpresa</string>
- <string name="anim_sword_strike_r">Estocadas</string>
- <string name="anim_angry_tantrum">Berrinche</string>
- <string name="anim_express_tongue_out">Sacar la lengua</string>
- <string name="anim_hello">Agitar la mano</string>
- <string name="anim_whisper">Cuchichear</string>
- <string name="anim_whistle">Pitar</string>
- <string name="anim_express_wink">Guiño</string>
- <string name="anim_wink_hollywood">Guiño (Hollywood)</string>
- <string name="anim_express_worry">Preocuparse</string>
- <string name="anim_yes_happy">Sí (contento)</string>
- <string name="anim_yes_head">Sí</string>
- <string name="use_texture">Usar textura</string>
- <string name="manip_hint1">Pasa el cursor del ratón sobre la regla</string>
- <string name="manip_hint2">para ajustar a la cuadrícula</string>
- <string name="texture_loading">Cargando...</string>
- <string name="worldmap_offline">Sin conexión</string>
- <string name="worldmap_item_tooltip_format">[PRICE] L$ por [AREA] m²</string>
- <string name="worldmap_results_none_found">No se ha encontrado.</string>
- <string name="Ok">OK</string>
- <string name="Premature end of file">Fin prematuro del archivo</string>
- <string name="ST_NO_JOINT">No se puede encontrar ROOT o JOINT.</string>
- <string name="NearbyChatTitle">Chat</string>
- <string name="NearbyChatLabel">(Chat)</string>
- <string name="whisper">susurra:</string>
- <string name="shout">grita:</string>
- <string name="ringing">Conectando al chat de voz...</string>
- <string name="connected">Conectado</string>
- <string name="unavailable">La voz no está disponible en su localización actual</string>
- <string name="hang_up">Desconectado del chat de voz</string>
- <string name="reconnect_nearby">Vas a ser reconectado al chat de voz con los cercanos</string>
- <string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].</string>
- <string name="ScriptQuestionCautionChatDenied">A '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].</string>
- <string name="AdditionalPermissionsRequestHeader">Si autorizas el acceso a tu cuenta, también permitirás al objeto:</string>
- <string name="ScriptTakeMoney">Cogerle a usted dólares Linden (L$)</string>
- <string name="ActOnControlInputs">Actuar en sus controles de entrada</string>
- <string name="RemapControlInputs">Reconfigurar sus controles de entrada</string>
- <string name="AnimateYourAvatar">Ejecutar animaciones en su avatar</string>
- <string name="AttachToYourAvatar">Anexarse a su avatar</string>
- <string name="ReleaseOwnership">Anular la propiedad y que pase a ser público</string>
- <string name="LinkAndDelink">Enlazar y desenlazar de otros objetos</string>
- <string name="AddAndRemoveJoints">Añadir y quitar uniones con otros objetos</string>
- <string name="ChangePermissions">Cambiar sus permisos</string>
- <string name="TrackYourCamera">Seguir su cámara</string>
- <string name="ControlYourCamera">Controlar su cámara</string>
- <string name="TeleportYourAgent">Teleportarte</string>
- <string name="ForceSitAvatar">Forzar que el avatar se siente</string>
- <string name="ChangeEnvSettings">Cambiar tu configuración del entorno</string>
- <string name="AgentNameSubst">(Tú)</string>
+pueden adjuntarse a las notas.
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ No se ha encontrado.
+ </string>
+ <string name="RetrievingData">
+ Reintentando...
+ </string>
+ <string name="ReleaseNotes">
+ Notas de la versión
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ https://megapahit.net/
+ </string>
+ <string name="LoadingData">
+ Cargando...
+ </string>
+ <string name="AvatarNameNobody">
+ (nadie)
+ </string>
+ <string name="AvatarNameWaiting">
+ (esperando)
+ </string>
+ <string name="GroupNameNone">
+ (ninguno)
+ </string>
+ <string name="AssetErrorNone">
+ No hay ningún error
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Petición de asset: fallida
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Petición de asset: el archivo no existe
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Petición de asset: no se encontró el asset en la base de datos
+ </string>
+ <string name="AssetErrorEOF">
+ Fin del archivo
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ No puede abrirse el archivo
+ </string>
+ <string name="AssetErrorFileNotFound">
+ No se ha encontrado el archivo
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tiempo de transferencia del archivo
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuito desconectado
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ No concuerda el precio en el visor y en el servidor
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Estado desconocido
+ </string>
+ <string name="AssetUploadServerUnreacheble">
+ El servicio no está disponible.
+ </string>
+ <string name="AssetUploadServerDifficulties">
+ Se detectaron errores inesperados en el servidor.
+ </string>
+ <string name="AssetUploadServerUnavaliable">
+ El servicio no está disponible o se alcanzó el tiempo de carga máxima.
+ </string>
+ <string name="AssetUploadRequestInvalid">
+ Error en la solicitud de carga. Por favor, ingresa a
+http://secondlife.com/support para obtener ayuda sobre cómo solucionar este problema.
+ </string>
+ <string name="SettingValidationError">
+ Error en la validación para importar los parámetros [NAME]
+ </string>
+ <string name="SettingImportFileError">
+ No se pudo abrir el archivo [FILE]
+ </string>
+ <string name="SettingParseFileError">
+ No se pudo abrir el archivo [FILE]
+ </string>
+ <string name="SettingTranslateError">
+ No se pudo traducir el Viento de luz legado [NAME]
+ </string>
+ <string name="texture">
+ la textura
+ </string>
+ <string name="sound">
+ el sonido
+ </string>
+ <string name="calling card">
+ la tarjeta de visita
+ </string>
+ <string name="landmark">
+ el hito
+ </string>
+ <string name="legacy script">
+ el script antiguo
+ </string>
+ <string name="clothing">
+ esa ropa
+ </string>
+ <string name="object">
+ el objeto
+ </string>
+ <string name="note card">
+ la nota
+ </string>
+ <string name="folder">
+ la carpeta
+ </string>
+ <string name="root">
+ la ruta
+ </string>
+ <string name="lsl2 script">
+ ese script de LSL2
+ </string>
+ <string name="lsl bytecode">
+ el código intermedio de LSL
+ </string>
+ <string name="tga texture">
+ esa textura tga
+ </string>
+ <string name="body part">
+ esa parte del cuerpo
+ </string>
+ <string name="snapshot">
+ la foto
+ </string>
+ <string name="lost and found">
+ Objetos Perdidos
+ </string>
+ <string name="targa image">
+ esa imagen targa
+ </string>
+ <string name="trash">
+ la Papelera
+ </string>
+ <string name="jpeg image">
+ esa imagen jpeg
+ </string>
+ <string name="animation">
+ la animación
+ </string>
+ <string name="gesture">
+ el gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ ese favorito
+ </string>
+ <string name="symbolic link">
+ el enlace
+ </string>
+ <string name="symbolic folder link">
+ enlace de la carpeta
+ </string>
+ <string name="settings blob">
+ opciones
+ </string>
+ <string name="mesh">
+ red
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Edición de Apariencia)
+ </string>
+ <string name="AvatarAway">
+ Ausente
+ </string>
+ <string name="AvatarDoNotDisturb">
+ No molestar
+ </string>
+ <string name="AvatarMuted">
+ Ignorado
+ </string>
+ <string name="anim_express_afraid">
+ Susto
+ </string>
+ <string name="anim_express_anger">
+ Enfado
+ </string>
+ <string name="anim_away">
+ Ausente
+ </string>
+ <string name="anim_backflip">
+ Salto mortal atrás
+ </string>
+ <string name="anim_express_laugh">
+ Carcajada
+ </string>
+ <string name="anim_express_toothsmile">
+ Gran sonrisa
+ </string>
+ <string name="anim_blowkiss">
+ Mandar un beso
+ </string>
+ <string name="anim_express_bored">
+ Aburrimiento
+ </string>
+ <string name="anim_bow">
+ Reverencia
+ </string>
+ <string name="anim_clap">
+ Aplauso
+ </string>
+ <string name="anim_courtbow">
+ Reverencia floreada
+ </string>
+ <string name="anim_express_cry">
+ Llanto
+ </string>
+ <string name="anim_dance1">
+ Baile 1
+ </string>
+ <string name="anim_dance2">
+ Baile 2
+ </string>
+ <string name="anim_dance3">
+ Baile 3
+ </string>
+ <string name="anim_dance4">
+ Baile 4
+ </string>
+ <string name="anim_dance5">
+ Baile 5
+ </string>
+ <string name="anim_dance6">
+ Baile 6
+ </string>
+ <string name="anim_dance7">
+ Baile 7
+ </string>
+ <string name="anim_dance8">
+ Baile 8
+ </string>
+ <string name="anim_express_disdain">
+ Desdén
+ </string>
+ <string name="anim_drink">
+ Beber
+ </string>
+ <string name="anim_express_embarrased">
+ Azorarse
+ </string>
+ <string name="anim_angry_fingerwag">
+ Negar con el dedo
+ </string>
+ <string name="anim_fist_pump">
+ Éxito con el puño
+ </string>
+ <string name="anim_yoga_float">
+ Yoga flotando
+ </string>
+ <string name="anim_express_frown">
+ Fruncir el ceño
+ </string>
+ <string name="anim_impatient">
+ Impaciente
+ </string>
+ <string name="anim_jumpforjoy">
+ Salto de alegría
+ </string>
+ <string name="anim_kissmybutt">
+ Bésame el culo
+ </string>
+ <string name="anim_express_kiss">
+ Besar
+ </string>
+ <string name="anim_laugh_short">
+ Reír
+ </string>
+ <string name="anim_musclebeach">
+ Sacar músculo
+ </string>
+ <string name="anim_no_unhappy">
+ No (con enfado)
+ </string>
+ <string name="anim_no_head">
+ No
+ </string>
+ <string name="anim_nyanya">
+ Ña-Ña-Ña
+ </string>
+ <string name="anim_punch_onetwo">
+ Puñetazo uno-dos
+ </string>
+ <string name="anim_express_open_mouth">
+ Abrir la boca
+ </string>
+ <string name="anim_peace">
+ 'V' con los dedos
+ </string>
+ <string name="anim_point_you">
+ Señalar a otro/a
+ </string>
+ <string name="anim_point_me">
+ Señalarse
+ </string>
+ <string name="anim_punch_l">
+ Puñetazo izquierdo
+ </string>
+ <string name="anim_punch_r">
+ Puñetazo derecho
+ </string>
+ <string name="anim_rps_countdown">
+ PPT cuenta
+ </string>
+ <string name="anim_rps_paper">
+ PPT papel
+ </string>
+ <string name="anim_rps_rock">
+ PPT piedra
+ </string>
+ <string name="anim_rps_scissors">
+ PPT tijera
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsa
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Patada circular
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Saludo militar
+ </string>
+ <string name="anim_shout">
+ Gritar
+ </string>
+ <string name="anim_express_shrug">
+ Encogerse de hombros
+ </string>
+ <string name="anim_express_smile">
+ Sonreír
+ </string>
+ <string name="anim_smoke_idle">
+ Fumar: en la mano
+ </string>
+ <string name="anim_smoke_inhale">
+ Fumar
+ </string>
+ <string name="anim_smoke_throw_down">
+ Fumar: tirar el cigarro
+ </string>
+ <string name="anim_express_surprise">
+ Sorpresa
+ </string>
+ <string name="anim_sword_strike_r">
+ Estocadas
+ </string>
+ <string name="anim_angry_tantrum">
+ Berrinche
+ </string>
+ <string name="anim_express_tongue_out">
+ Sacar la lengua
+ </string>
+ <string name="anim_hello">
+ Agitar la mano
+ </string>
+ <string name="anim_whisper">
+ Cuchichear
+ </string>
+ <string name="anim_whistle">
+ Pitar
+ </string>
+ <string name="anim_express_wink">
+ Guiño
+ </string>
+ <string name="anim_wink_hollywood">
+ Guiño (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Preocuparse
+ </string>
+ <string name="anim_yes_happy">
+ Sí (contento)
+ </string>
+ <string name="anim_yes_head">
+ Sí
+ </string>
+ <string name="use_texture">
+ Usar textura
+ </string>
+ <string name="manip_hint1">
+ Pasa el cursor del ratón sobre la regla
+ </string>
+ <string name="manip_hint2">
+ para ajustar a la cuadrícula
+ </string>
+ <string name="texture_loading">
+ Cargando...
+ </string>
+ <string name="worldmap_offline">
+ Sin conexión
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [PRICE] L$ por [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ No se ha encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fin prematuro del archivo
+ </string>
+ <string name="ST_NO_JOINT">
+ No se puede encontrar ROOT o JOINT.
+ </string>
+ <string name="NearbyChatTitle">
+ Chat
+ </string>
+ <string name="NearbyChatLabel">
+ (Chat)
+ </string>
+ <string name="whisper">
+ susurra:
+ </string>
+ <string name="shout">
+ grita:
+ </string>
+ <string name="ringing">
+ Conectando al chat de voz...
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ La voz no está disponible en su localización actual
+ </string>
+ <string name="hang_up">
+ Desconectado del chat de voz
+ </string>
+ <string name="reconnect_nearby">
+ Vas a ser reconectado al chat de voz con los cercanos
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
+ </string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Si autorizas el acceso a tu cuenta, también permitirás al objeto:
+ </string>
+ <string name="ScriptTakeMoney">
+ Cogerle a usted dólares Linden (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Actuar en sus controles de entrada
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurar sus controles de entrada
+ </string>
+ <string name="AnimateYourAvatar">
+ Ejecutar animaciones en su avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexarse a su avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Anular la propiedad y que pase a ser público
+ </string>
+ <string name="LinkAndDelink">
+ Enlazar y desenlazar de otros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Añadir y quitar uniones con otros objetos
+ </string>
+ <string name="ChangePermissions">
+ Cambiar sus permisos
+ </string>
+ <string name="TrackYourCamera">
+ Seguir su cámara
+ </string>
+ <string name="ControlYourCamera">
+ Controlar su cámara
+ </string>
+ <string name="TeleportYourAgent">
+ Teleportarte
+ </string>
+ <string name="ForceSitAvatar">
+ Forzar que el avatar se siente
+ </string>
+ <string name="ChangeEnvSettings">
+ Cambiar tu configuración del entorno
+ </string>
+ <string name="AgentNameSubst">
+ (Tú)
+ </string>
<string name="JoinAnExperience"/>
- <string name="SilentlyManageEstateAccess">Suprimir alertas al gestionar las listas de acceso a un estado</string>
- <string name="OverrideYourAnimations">Reemplazar tus animaciones predeterminadas</string>
- <string name="ScriptReturnObjects">Devolver objetos en tu nombre</string>
- <string name="UnknownScriptPermission">(desconocido)</string>
- <string name="SIM_ACCESS_PG">General</string>
- <string name="SIM_ACCESS_MATURE">Moderado</string>
- <string name="SIM_ACCESS_ADULT">Adulto</string>
- <string name="SIM_ACCESS_DOWN">Desconectado</string>
- <string name="SIM_ACCESS_MIN">Desconocido</string>
- <string name="land_type_unknown">(desconocido)</string>
- <string name="Estate / Full Region">Estado /Región completa</string>
- <string name="Estate / Homestead">Estado / Homestead</string>
- <string name="Mainland / Homestead">Continente / Homestead</string>
- <string name="Mainland / Full Region">Continente / Región completa</string>
- <string name="all_files">Todos los archivos</string>
- <string name="sound_files">Sonidos</string>
- <string name="animation_files">Animaciones</string>
- <string name="image_files">Imágenes</string>
- <string name="save_file_verb">Guardar</string>
- <string name="load_file_verb">Cargar</string>
- <string name="targa_image_files">Imágenes Targa</string>
- <string name="bitmap_image_files">Imágenes de mapa de bits</string>
- <string name="png_image_files">Imágenes PNG</string>
- <string name="save_texture_image_files">Imágenes Targa o PNG</string>
- <string name="avi_movie_file">Archivo de película AVI</string>
- <string name="xaf_animation_file">Archivo de anim. XAF</string>
- <string name="xml_file">Archivo XML</string>
- <string name="raw_file">Archivo RAW</string>
- <string name="compressed_image_files">Imágenes comprimidas</string>
- <string name="load_files">Cargar archivos</string>
- <string name="choose_the_directory">Elegir directorio</string>
- <string name="script_files">Scripts</string>
- <string name="dictionary_files">Diccionarios</string>
- <string name="shape">Forma</string>
- <string name="skin">Piel</string>
- <string name="hair">Pelo</string>
- <string name="eyes">Ojos</string>
- <string name="shirt">Camisa</string>
- <string name="pants">Pantalón</string>
- <string name="shoes">Zapatos</string>
- <string name="socks">Calcetines</string>
- <string name="jacket">Chaqueta</string>
- <string name="gloves">Guantes</string>
- <string name="undershirt">Camiseta</string>
- <string name="underpants">Ropa interior</string>
- <string name="skirt">Falda</string>
- <string name="alpha">Alfa</string>
- <string name="tattoo">Tatuaje</string>
- <string name="universal">Universal</string>
- <string name="physics">Física</string>
- <string name="invalid">inválido/a</string>
- <string name="none">ninguno</string>
- <string name="shirt_not_worn">Camisa no puesta</string>
- <string name="pants_not_worn">Pantalones no puestos</string>
- <string name="shoes_not_worn">Zapatos no puestos</string>
- <string name="socks_not_worn">Calcetines no puestos</string>
- <string name="jacket_not_worn">Chaqueta no puesta</string>
- <string name="gloves_not_worn">Guantes no puestos</string>
- <string name="undershirt_not_worn">Camiseta no puesta</string>
- <string name="underpants_not_worn">Ropa interior no puesta</string>
- <string name="skirt_not_worn">Falda no puesta</string>
- <string name="alpha_not_worn">Alfa no puesta</string>
- <string name="tattoo_not_worn">Tatuaje no puesto</string>
- <string name="universal_not_worn">Universal no puesto</string>
- <string name="physics_not_worn">Física no puesta</string>
- <string name="invalid_not_worn">no válido/a</string>
- <string name="create_new_shape">Crear una anatomía nueva</string>
- <string name="create_new_skin">Crear una piel nueva</string>
- <string name="create_new_hair">Crear pelo nuevo</string>
- <string name="create_new_eyes">Crear ojos nuevos</string>
- <string name="create_new_shirt">Crear una camisa nueva</string>
- <string name="create_new_pants">Crear unos pantalones nuevos</string>
- <string name="create_new_shoes">Crear unos zapatos nuevos</string>
- <string name="create_new_socks">Crear unos calcetines nuevos</string>
- <string name="create_new_jacket">Crear una chaqueta nueva</string>
- <string name="create_new_gloves">Crear unos guantes nuevos</string>
- <string name="create_new_undershirt">Crear una camiseta nueva</string>
- <string name="create_new_underpants">Crear ropa interior nueva</string>
- <string name="create_new_skirt">Crear una falda nueva</string>
- <string name="create_new_alpha">Crear una capa alfa nueva</string>
- <string name="create_new_tattoo">Crear un tatuaje nuevo</string>
- <string name="create_new_universal">Crear unos guantes nuevos</string>
- <string name="create_new_physics">Crear nueva física</string>
- <string name="create_new_invalid">no válido/a</string>
- <string name="NewWearable">Nuevo [WEARABLE_ITEM]</string>
- <string name="next">Siguiente</string>
- <string name="ok">OK</string>
- <string name="GroupNotifyGroupNotice">Aviso de grupo</string>
- <string name="GroupNotifyGroupNotices">Avisos del grupo</string>
- <string name="GroupNotifySentBy">Enviado por</string>
- <string name="GroupNotifyAttached">Adjunto:</string>
- <string name="GroupNotifyViewPastNotices">Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.</string>
- <string name="GroupNotifyOpenAttachment">Abrir el adjunto</string>
- <string name="GroupNotifySaveAttachment">Guardar el adjunto</string>
- <string name="TeleportOffer">Ofrecimiento de teleporte</string>
- <string name="StartUpNotifications">Llegaron avisos nuevos mientras estabas ausente...</string>
- <string name="OverflowInfoChannelString">Tienes [%d] aviso/s más</string>
- <string name="BodyPartsRightArm">Brazo der.</string>
- <string name="BodyPartsHead">Cabeza</string>
- <string name="BodyPartsLeftArm">Brazo izq.</string>
- <string name="BodyPartsLeftLeg">Pierna izq.</string>
- <string name="BodyPartsTorso">Torso</string>
- <string name="BodyPartsRightLeg">Pierna der.</string>
- <string name="BodyPartsEnhancedSkeleton">Esqueleto mejorado</string>
- <string name="GraphicsQualityLow">Bajo</string>
- <string name="GraphicsQualityMid">Medio</string>
- <string name="GraphicsQualityHigh">Alto</string>
- <string name="LeaveMouselook">Pulsa ESC para salir de la vista subjetiva</string>
- <string name="InventoryNoMatchingItems">¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].</string>
- <string name="InventoryNoMatchingRecentItems">¿No encuentras lo que buscas? Intenta [secondlife:///app/inventory/filters Show filters].</string>
- <string name="PlacesNoMatchingItems">¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].</string>
- <string name="FavoritesNoMatchingItems">Arrastra aquí un hito para tenerlo en tus favoritos.</string>
- <string name="MarketplaceNoMatchingItems">No se han encontrado artículos. Comprueba si has escrito correctamente la cadena de búsqueda y vuelve a intentarlo.</string>
- <string name="InventoryNoTexture">No tienes en tu inventario una copia de esta textura</string>
- <string name="InventoryInboxNoItems">Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.</string>
- <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
- <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string>
- <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
- <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
- <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
- <string name="InventoryPlayAnimationTooltip">Abrir la ventana con las opciones del Juego</string>
- <string name="InventoryPlayGestureTooltip">Realizar gesto seleccionado en el mundo.</string>
- <string name="InventoryPlaySoundTooltip">Abrir la ventana con las opciones del Juego</string>
- <string name="InventoryOutboxNotMerchantTitle">Cualquier usuario puede vender objetos en el mercado.</string>
+ <string name="SilentlyManageEstateAccess">
+ Suprimir alertas al gestionar las listas de acceso a un estado
+ </string>
+ <string name="OverrideYourAnimations">
+ Reemplazar tus animaciones predeterminadas
+ </string>
+ <string name="ScriptReturnObjects">
+ Devolver objetos en tu nombre
+ </string>
+ <string name="UnknownScriptPermission">
+ (desconocido)
+ </string>
+ <string name="SIM_ACCESS_PG">
+ General
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderado
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulto
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Desconectado
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Desconocido
+ </string>
+ <string name="land_type_unknown">
+ (desconocido)
+ </string>
+ <string name="Estate / Full Region">
+ Estado /Región completa
+ </string>
+ <string name="Estate / Homestead">
+ Estado / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Región completa
+ </string>
+ <string name="all_files">
+ Todos los archivos
+ </string>
+ <string name="sound_files">
+ Sonidos
+ </string>
+ <string name="animation_files">
+ Animaciones
+ </string>
+ <string name="image_files">
+ Imágenes
+ </string>
+ <string name="save_file_verb">
+ Guardar
+ </string>
+ <string name="load_file_verb">
+ Cargar
+ </string>
+ <string name="targa_image_files">
+ Imágenes Targa
+ </string>
+ <string name="bitmap_image_files">
+ Imágenes de mapa de bits
+ </string>
+ <string name="png_image_files">
+ Imágenes PNG
+ </string>
+ <string name="save_texture_image_files">
+ Imágenes Targa o PNG
+ </string>
+ <string name="avi_movie_file">
+ Archivo de película AVI
+ </string>
+ <string name="xaf_animation_file">
+ Archivo de anim. XAF
+ </string>
+ <string name="xml_file">
+ Archivo XML
+ </string>
+ <string name="raw_file">
+ Archivo RAW
+ </string>
+ <string name="compressed_image_files">
+ Imágenes comprimidas
+ </string>
+ <string name="load_files">
+ Cargar archivos
+ </string>
+ <string name="choose_the_directory">
+ Elegir directorio
+ </string>
+ <string name="script_files">
+ Scripts
+ </string>
+ <string name="dictionary_files">
+ Diccionarios
+ </string>
+ <string name="shape">
+ Forma
+ </string>
+ <string name="skin">
+ Piel
+ </string>
+ <string name="hair">
+ Pelo
+ </string>
+ <string name="eyes">
+ Ojos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Pantalón
+ </string>
+ <string name="shoes">
+ Zapatos
+ </string>
+ <string name="socks">
+ Calcetines
+ </string>
+ <string name="jacket">
+ Chaqueta
+ </string>
+ <string name="gloves">
+ Guantes
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Ropa interior
+ </string>
+ <string name="skirt">
+ Falda
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Tatuaje
+ </string>
+ <string name="universal">
+ Universal
+ </string>
+ <string name="physics">
+ Física
+ </string>
+ <string name="invalid">
+ inválido/a
+ </string>
+ <string name="none">
+ ninguno
+ </string>
+ <string name="shirt_not_worn">
+ Camisa no puesta
+ </string>
+ <string name="pants_not_worn">
+ Pantalones no puestos
+ </string>
+ <string name="shoes_not_worn">
+ Zapatos no puestos
+ </string>
+ <string name="socks_not_worn">
+ Calcetines no puestos
+ </string>
+ <string name="jacket_not_worn">
+ Chaqueta no puesta
+ </string>
+ <string name="gloves_not_worn">
+ Guantes no puestos
+ </string>
+ <string name="undershirt_not_worn">
+ Camiseta no puesta
+ </string>
+ <string name="underpants_not_worn">
+ Ropa interior no puesta
+ </string>
+ <string name="skirt_not_worn">
+ Falda no puesta
+ </string>
+ <string name="alpha_not_worn">
+ Alfa no puesta
+ </string>
+ <string name="tattoo_not_worn">
+ Tatuaje no puesto
+ </string>
+ <string name="universal_not_worn">
+ Universal no puesto
+ </string>
+ <string name="physics_not_worn">
+ Física no puesta
+ </string>
+ <string name="invalid_not_worn">
+ no válido/a
+ </string>
+ <string name="create_new_shape">
+ Crear una anatomía nueva
+ </string>
+ <string name="create_new_skin">
+ Crear una piel nueva
+ </string>
+ <string name="create_new_hair">
+ Crear pelo nuevo
+ </string>
+ <string name="create_new_eyes">
+ Crear ojos nuevos
+ </string>
+ <string name="create_new_shirt">
+ Crear una camisa nueva
+ </string>
+ <string name="create_new_pants">
+ Crear unos pantalones nuevos
+ </string>
+ <string name="create_new_shoes">
+ Crear unos zapatos nuevos
+ </string>
+ <string name="create_new_socks">
+ Crear unos calcetines nuevos
+ </string>
+ <string name="create_new_jacket">
+ Crear una chaqueta nueva
+ </string>
+ <string name="create_new_gloves">
+ Crear unos guantes nuevos
+ </string>
+ <string name="create_new_undershirt">
+ Crear una camiseta nueva
+ </string>
+ <string name="create_new_underpants">
+ Crear ropa interior nueva
+ </string>
+ <string name="create_new_skirt">
+ Crear una falda nueva
+ </string>
+ <string name="create_new_alpha">
+ Crear una capa alfa nueva
+ </string>
+ <string name="create_new_tattoo">
+ Crear un tatuaje nuevo
+ </string>
+ <string name="create_new_universal">
+ Crear unos guantes nuevos
+ </string>
+ <string name="create_new_physics">
+ Crear nueva física
+ </string>
+ <string name="create_new_invalid">
+ no válido/a
+ </string>
+ <string name="NewWearable">
+ Nuevo [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Siguiente
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Aviso de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Avisos del grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Adjunto:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir el adjunto
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Guardar el adjunto
+ </string>
+ <string name="TeleportOffer">
+ Ofrecimiento de teleporte
+ </string>
+ <string name="StartUpNotifications">
+ Llegaron avisos nuevos mientras estabas ausente...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Tienes [%d] aviso/s más
+ </string>
+ <string name="BodyPartsRightArm">
+ Brazo der.
+ </string>
+ <string name="BodyPartsHead">
+ Cabeza
+ </string>
+ <string name="BodyPartsLeftArm">
+ Brazo izq.
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Pierna izq.
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </string>
+ <string name="BodyPartsRightLeg">
+ Pierna der.
+ </string>
+ <string name="BodyPartsEnhancedSkeleton">
+ Esqueleto mejorado
+ </string>
+ <string name="GraphicsQualityLow">
+ Bajo
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pulsa ESC para salir de la vista subjetiva
+ </string>
+ <string name="InventoryNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="InventoryNoMatchingRecentItems">
+ ¿No encuentras lo que buscas? Intenta [secondlife:///app/inventory/filters Show filters].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Arrastra aquí un hito para tenerlo en tus favoritos.
+ </string>
+ <string name="MarketplaceNoMatchingItems">
+ No se han encontrado artículos. Comprueba si has escrito correctamente la cadena de búsqueda y vuelve a intentarlo.
+ </string>
+ <string name="InventoryNoTexture">
+ No tienes en tu inventario una copia de esta textura
+ </string>
+ <string name="InventoryInboxNoItems">
+ Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryPlayAnimationTooltip">
+ Abrir la ventana con las opciones del Juego
+ </string>
+ <string name="InventoryPlayGestureTooltip">
+ Realizar gesto seleccionado en el mundo.
+ </string>
+ <string name="InventoryPlaySoundTooltip">
+ Abrir la ventana con las opciones del Juego
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Cualquier usuario puede vender objetos en el mercado.
+ </string>
<string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado].</string>
- <string name="InventoryOutboxNoItemsTitle">El buzón de salida está vacío.</string>
+ <string name="InventoryOutboxNotMerchant">
+ Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ El buzón de salida está vacío.
+ </string>
<string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">Arrastra carpetas a esta sección y pulsa en &quot;Enviar al Mercado&quot; para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].</string>
- <string name="InventoryOutboxInitializingTitle">Inicializando el Mercado.</string>
- <string name="InventoryOutboxInitializing">Estamos accediendo a tu cuenta de la [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado].</string>
- <string name="InventoryOutboxErrorTitle">Errores del Mercado.</string>
- <string name="InventoryOutboxError">La [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado] devuelve errores.</string>
- <string name="InventoryMarketplaceError">Se ha producido un error al abrir Artículos del Mercado.
-Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com</string>
- <string name="InventoryMarketplaceListingsNoItemsTitle">Tu carpeta Artículos del mercado está vacía.</string>
- <string name="InventoryMarketplaceListingsNoItems">Arrastra carpetas a esta sección para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].</string>
- <string name="InventoryItemsCount">( [ITEMS_COUNT] Objetos)</string>
- <string name="Marketplace Validation Warning Stock">La carpeta de stock debe estar contenida en una carpeta de versión</string>
- <string name="Marketplace Validation Error Mixed Stock">: Error: todos los artículos de una carpeta de stock deben ser del mismo tipo y que no se puedan copiar</string>
- <string name="Marketplace Validation Error Subfolder In Stock">: Error: la carpeta de stock no puede contener subcarpetas</string>
- <string name="Marketplace Validation Warning Empty">: Atención: la carpeta no contiene ningún artículo</string>
- <string name="Marketplace Validation Warning Create Stock">: Atención: creando carpeta de stock</string>
- <string name="Marketplace Validation Warning Create Version">: Atención: creando la carpeta de versión</string>
- <string name="Marketplace Validation Warning Move">: Atención: moviendo artículos</string>
- <string name="Marketplace Validation Warning Delete">: Atención: se ha transferido el contenido de la carpeta a la carpeta de stock, y se eliminará la carpeta vacía</string>
- <string name="Marketplace Validation Error Stock Item">: Error: los artículos que no se pueden copiar deben estar contenidos en una carpeta de stock</string>
- <string name="Marketplace Validation Warning Unwrapped Item">: Atención: los artículos deben estar contenidos en una carpeta de versión</string>
- <string name="Marketplace Validation Error">: Error:</string>
- <string name="Marketplace Validation Warning">: Atención:</string>
- <string name="Marketplace Validation Error Empty Version">: Atención: la carpeta de versión debe contener al menos un artículo</string>
- <string name="Marketplace Validation Error Empty Stock">: Atención: la carpeta de stock debe contener al menos un artículo</string>
- <string name="Marketplace Validation No Error">No se han producido errores ni advertencias</string>
- <string name="Marketplace Error None">Sin errores</string>
- <string name="Marketplace Error Prefix">Error:</string>
- <string name="Marketplace Error Not Merchant">Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis).</string>
- <string name="Marketplace Error Not Accepted">No se puede mover el artículo a esa carpeta.</string>
- <string name="Marketplace Error Unsellable Item">Este artículo no se puede vender en el Mercado.</string>
- <string name="MarketplaceNoID">no Mkt ID</string>
- <string name="MarketplaceLive">en la lista</string>
- <string name="MarketplaceActive">activa</string>
- <string name="MarketplaceMax">máx.</string>
- <string name="MarketplaceStock">stock</string>
- <string name="MarketplaceNoStock">existencias agotadas</string>
- <string name="MarketplaceUpdating">actualizando...</string>
- <string name="UploadFeeInfo">Las cuotas se basan en tu nivel de suscripcion. Niveles más altos tienen cuotas más bajas visita [https://secondlife.com/my/account/membership.php? para saber más]</string>
- <string name="Open landmarks">Abrir puntos destacados</string>
- <string name="Unconstrained">Sin Restricciones</string>
+ <string name="InventoryOutboxNoItems">
+ Arrastra carpetas a esta sección y pulsa en "Enviar al Mercado" para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].
+ </string>
+ <string name="InventoryOutboxInitializingTitle">
+ Inicializando el Mercado.
+ </string>
+ <string name="InventoryOutboxInitializing">
+ Estamos accediendo a tu cuenta de la [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado].
+ </string>
+ <string name="InventoryOutboxErrorTitle">
+ Errores del Mercado.
+ </string>
+ <string name="InventoryOutboxError">
+ La [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado] devuelve errores.
+ </string>
+ <string name="InventoryMarketplaceError">
+ Se ha producido un error al abrir Artículos del Mercado.
+Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Tu carpeta Artículos del mercado está vacía.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Arrastra carpetas a esta sección para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].
+ </string>
+ <string name="InventoryItemsCount">
+ ( [ITEMS_COUNT] Objetos)
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ La carpeta de stock debe estar contenida en una carpeta de versión
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Error: todos los artículos de una carpeta de stock deben ser del mismo tipo y que no se puedan copiar
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Error: la carpeta de stock no puede contener subcarpetas
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Atención: la carpeta no contiene ningún artículo
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Atención: creando carpeta de stock
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Atención: creando la carpeta de versión
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Atención: moviendo artículos
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Atención: se ha transferido el contenido de la carpeta a la carpeta de stock, y se eliminará la carpeta vacía
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Error: los artículos que no se pueden copiar deben estar contenidos en una carpeta de stock
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Atención: los artículos deben estar contenidos en una carpeta de versión
+ </string>
+ <string name="Marketplace Validation Error">
+ : Error:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Atención:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Atención: la carpeta de versión debe contener al menos un artículo
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Atención: la carpeta de stock debe contener al menos un artículo
+ </string>
+ <string name="Marketplace Validation No Error">
+ No se han producido errores ni advertencias
+ </string>
+ <string name="Marketplace Error None">
+ Sin errores
+ </string>
+ <string name="Marketplace Error Prefix">
+ Error:
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis).
+ </string>
+ <string name="Marketplace Error Not Accepted">
+ No se puede mover el artículo a esa carpeta.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Este artículo no se puede vender en el Mercado.
+ </string>
+ <string name="MarketplaceNoID">
+ no Mkt ID
+ </string>
+ <string name="MarketplaceLive">
+ en la lista
+ </string>
+ <string name="MarketplaceActive">
+ activa
+ </string>
+ <string name="MarketplaceMax">
+ máx.
+ </string>
+ <string name="MarketplaceStock">
+ stock
+ </string>
+ <string name="MarketplaceNoStock">
+ existencias agotadas
+ </string>
+ <string name="MarketplaceUpdating">
+ actualizando...
+ </string>
+ <string name="UploadFeeInfo">
+ Las cuotas se basan en tu nivel de suscripcion. Niveles más altos tienen cuotas más bajas visita [https://secondlife.com/my/account/membership.php? para saber más]
+ </string>
+ <string name="Open landmarks">
+ Abrir puntos destacados
+ </string>
+ <string name="Unconstrained">
+ Sin Restricciones
+ </string>
<string name="no_transfer" value="(no transferible)"/>
<string name="no_modify" value="(no modificable)"/>
<string name="no_copy" value="(no copiable)"/>
<string name="worn" value="(puesto)"/>
<string name="link" value="(enlace)"/>
<string name="broken_link" value="(enlace roto)&quot;"/>
- <string name="LoadingContents">Cargando el contenido...</string>
- <string name="NoContents">No hay contenido</string>
+ <string name="LoadingContents">
+ Cargando el contenido...
+ </string>
+ <string name="NoContents">
+ No hay contenido
+ </string>
<string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (activo)"/>
@@ -629,1414 +1681,4140 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia
<string name="Snapshots" value="Fotos,"/>
<string name="No Filters" value="No"/>
<string name="Since Logoff" value="- Desde la desconexión"/>
- <string name="InvFolder My Inventory">Mi Inventario</string>
- <string name="InvFolder Library">Biblioteca</string>
- <string name="InvFolder Textures">Texturas</string>
- <string name="InvFolder Sounds">Sonidos</string>
- <string name="InvFolder Calling Cards">Tarjetas de visita</string>
- <string name="InvFolder Landmarks">Hitos</string>
- <string name="InvFolder Scripts">Scripts</string>
- <string name="InvFolder Clothing">Ropa</string>
- <string name="InvFolder Objects">Objetos</string>
- <string name="InvFolder Notecards">Notas</string>
- <string name="InvFolder New Folder">Carpeta nueva</string>
- <string name="InvFolder Inventory">Inventario</string>
- <string name="InvFolder Uncompressed Images">Imágenes sin comprimir</string>
- <string name="InvFolder Body Parts">Partes del cuerpo</string>
- <string name="InvFolder Trash">Papelera</string>
- <string name="InvFolder Photo Album">Álbum de fotos</string>
- <string name="InvFolder Lost And Found">Objetos Perdidos</string>
- <string name="InvFolder Uncompressed Sounds">Sonidos sin comprimir</string>
- <string name="InvFolder Animations">Animaciones</string>
- <string name="InvFolder Gestures">Gestos</string>
- <string name="InvFolder Favorite">Mis Favoritos</string>
- <string name="InvFolder favorite">Mis Favoritos</string>
- <string name="InvFolder Favorites">Mis Favoritos</string>
- <string name="InvFolder favorites">Mis Favoritos</string>
- <string name="InvFolder Current Outfit">Vestuario actual</string>
- <string name="InvFolder Initial Outfits">Vestuario inicial</string>
- <string name="InvFolder My Outfits">Mis vestuarios</string>
- <string name="InvFolder Accessories">Accesorios</string>
- <string name="InvFolder Meshes">Redes</string>
- <string name="InvFolder Received Items">Objetos recibidos</string>
- <string name="InvFolder Merchant Outbox">Buzón de salida de comerciante</string>
- <string name="InvFolder Friends">Amigos</string>
- <string name="InvFolder All">Todas</string>
- <string name="no_attachments">No tienes puestos anexos</string>
- <string name="Attachments remain">Anexos (quedan [COUNT] ranuras)</string>
- <string name="Buy">Comprar</string>
- <string name="BuyforL$">Comprar por L$</string>
- <string name="Stone">Piedra</string>
- <string name="Metal">Metal</string>
- <string name="Glass">Cristal</string>
- <string name="Wood">Madera</string>
- <string name="Flesh">Carne</string>
- <string name="Plastic">Plástico</string>
- <string name="Rubber">Goma</string>
- <string name="Light">Claridad</string>
- <string name="KBShift">Mayúsculas</string>
- <string name="KBCtrl">Ctrl</string>
- <string name="Chest">Tórax</string>
- <string name="Skull">Cráneo</string>
- <string name="Left Shoulder">Hombro izquierdo</string>
- <string name="Right Shoulder">Hombro derecho</string>
- <string name="Left Hand">Mano izq.</string>
- <string name="Right Hand">Mano der.</string>
- <string name="Left Foot">Pie izq.</string>
- <string name="Right Foot">Pie der.</string>
- <string name="Spine">Columna</string>
- <string name="Pelvis">Pelvis</string>
- <string name="Mouth">Boca</string>
- <string name="Chin">Barbilla</string>
- <string name="Left Ear">Oreja izq.</string>
- <string name="Right Ear">Oreja der.</string>
- <string name="Left Eyeball">Ojo izq.</string>
- <string name="Right Eyeball">Ojo der.</string>
- <string name="Nose">Nariz</string>
- <string name="R Upper Arm">Brazo der.</string>
- <string name="R Forearm">Antebrazo der.</string>
- <string name="L Upper Arm">Brazo izq.</string>
- <string name="L Forearm">Antebrazo izq.</string>
- <string name="Right Hip">Cadera der.</string>
- <string name="R Upper Leg">Muslo der.</string>
- <string name="R Lower Leg">Pantorrilla der.</string>
- <string name="Left Hip">Cadera izq.</string>
- <string name="L Upper Leg">Muslo izq.</string>
- <string name="L Lower Leg">Pantorrilla izq.</string>
- <string name="Stomach">Abdomen</string>
- <string name="Left Pec">Pecho izquierdo</string>
- <string name="Right Pec">Pecho derecho</string>
- <string name="Neck">Cuello</string>
- <string name="Avatar Center">Centro del avatar</string>
- <string name="Left Ring Finger">Dedo anular izquierdo</string>
- <string name="Right Ring Finger">Dedo anular derecho</string>
- <string name="Tail Base">Base de la cola</string>
- <string name="Tail Tip">Extremo de la cola</string>
- <string name="Left Wing">Ala izquierda</string>
- <string name="Right Wing">Ala derecha</string>
- <string name="Jaw">Mandíbula</string>
- <string name="Alt Left Ear">Oreja izquierda alternativa</string>
- <string name="Alt Right Ear">Oreja derecha alternativa</string>
- <string name="Alt Left Eye">Ojo izquierdo alternativo</string>
- <string name="Alt Right Eye">Ojo derecho alternativo</string>
- <string name="Tongue">Lengua</string>
- <string name="Groin">Ingle</string>
- <string name="Left Hind Foot">Pata trasera izquierda</string>
- <string name="Right Hind Foot">Pata trasera derecha</string>
- <string name="Invalid Attachment">Punto de colocación no válido</string>
- <string name="ATTACHMENT_MISSING_ITEM">Error: falta un artículo</string>
- <string name="ATTACHMENT_MISSING_BASE_ITEM">Error: falta el artículo de base</string>
- <string name="ATTACHMENT_NOT_ATTACHED">Error: el objeto se encuentra en el vestuario actual, pero no está anexado</string>
- <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] de edad</string>
- <string name="YearsOld">[AGEYEARS] de edad</string>
- <string name="MonthsOld">[AGEMONTHS] de edad</string>
- <string name="WeeksOld">[AGEWEEKS] de edad</string>
- <string name="DaysOld">[AGEDAYS] de edad</string>
- <string name="TodayOld">Registrado hoy</string>
- <string name="av_render_everyone_now">Ahora todos pueden verte.</string>
- <string name="av_render_not_everyone">Es posible que no todos los que están próximos puedan renderizarte.</string>
- <string name="av_render_over_half">Es posible que más de la mitad de los que están próximos no puedan renderizarte.</string>
- <string name="av_render_most_of">Es posible que la mayoría de los que están próximos no puedan renderizarte.</string>
- <string name="av_render_anyone">Es posible que ninguno de los que están próximos pueda renderizarte.</string>
- <string name="hud_description_total">Tu HUD</string>
- <string name="hud_name_with_joint">[OBJ_NAME] (lo llevas en [JNT_NAME])</string>
- <string name="hud_render_memory_warning">[HUD_DETAILS] usa mucha memoria de textura</string>
- <string name="hud_render_cost_warning">[HUD_DETAILS] contiene muchas texturas y objetos complicados</string>
- <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] contiene muchas texturas grandes</string>
- <string name="hud_render_cramped_warning">[HUD_DETAILS] contiene demasiados objetos</string>
- <string name="hud_render_textures_warning">[HUD_DETAILS] contiene demasiadas texturas</string>
- <string name="AgeYearsA">[COUNT] año</string>
- <string name="AgeYearsB">[COUNT] años</string>
- <string name="AgeYearsC">[COUNT] años</string>
- <string name="AgeMonthsA">[COUNT] mes</string>
- <string name="AgeMonthsB">[COUNT] meses</string>
- <string name="AgeMonthsC">[COUNT] meses</string>
- <string name="AgeWeeksA">[COUNT] semana</string>
- <string name="AgeWeeksB">[COUNT] semanas</string>
- <string name="AgeWeeksC">[COUNT] semanas</string>
- <string name="AgeDaysA">[COUNT] día</string>
- <string name="AgeDaysB">[COUNT] días</string>
- <string name="AgeDaysC">[COUNT] días</string>
- <string name="GroupMembersA">[COUNT] miembro</string>
- <string name="GroupMembersB">[COUNT] miembros</string>
- <string name="GroupMembersC">[COUNT] miembros</string>
- <string name="AcctTypeResident">Residente</string>
- <string name="AcctTypeTrial">Prueba</string>
- <string name="AcctTypeCharterMember">Miembro fundador</string>
- <string name="AcctTypeEmployee">Empleado de Linden Lab</string>
- <string name="PaymentInfoUsed">Ha usado información sobre la forma de pago</string>
- <string name="PaymentInfoOnFile">Hay información archivada sobre la forma de pago</string>
- <string name="NoPaymentInfoOnFile">No hay información archivada sobre la forma de pago</string>
- <string name="AgeVerified">Edad verificada</string>
- <string name="NotAgeVerified">Edad no verificada</string>
- <string name="Center 2">Centro 2</string>
- <string name="Top Right">Arriba der.</string>
- <string name="Top">Arriba</string>
- <string name="Top Left">Arriba izq.</string>
- <string name="Center">Centro</string>
- <string name="Bottom Left">Abajo izq.</string>
- <string name="Bottom">Abajo</string>
- <string name="Bottom Right">Abajo der.</string>
- <string name="CompileQueueDownloadedCompiling">Descargado, compilándolo</string>
- <string name="CompileQueueServiceUnavailable">El servicio de compilación de scripts no está disponible</string>
- <string name="CompileQueueScriptNotFound">No se encuentra el script en el servidor.</string>
- <string name="CompileQueueProblemDownloading">Problema al descargar</string>
- <string name="CompileQueueInsufficientPermDownload">Permisos insuficientes para descargar un script.</string>
- <string name="CompileQueueInsufficientPermFor">Permisos insuficientes para</string>
- <string name="CompileQueueUnknownFailure">Fallo desconocido en la descarga</string>
- <string name="CompileNoExperiencePerm">Omitiendo el script [SCRIPT] con la experiencia [EXPERIENCE].</string>
- <string name="CompileQueueTitle">Recompilando</string>
- <string name="CompileQueueStart">recompilar</string>
- <string name="ResetQueueTitle">Progreso del reinicio</string>
- <string name="ResetQueueStart">restaurar</string>
- <string name="RunQueueTitle">Configurar según se ejecuta</string>
- <string name="RunQueueStart">Configurando según se ejecuta</string>
- <string name="NotRunQueueTitle">Configurar sin ejecutar</string>
- <string name="NotRunQueueStart">Configurando sin ejecutarlo</string>
- <string name="CompileSuccessful">¡Compilación correcta!</string>
- <string name="CompileSuccessfulSaving">Compilación correcta, guardando...</string>
- <string name="SaveComplete">Guardado.</string>
- <string name="UploadFailed">Error al subir el archivo:</string>
- <string name="ObjectOutOfRange">Script (objeto fuera de rango)</string>
- <string name="ScriptWasDeleted">Script (eliminado del inventario)</string>
- <string name="GodToolsObjectOwnedBy">El objeto [OBJECT] es propiedad de [OWNER]</string>
- <string name="GroupsNone">ninguno</string>
+ <string name="InvFolder My Inventory">
+ Mi Inventario
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sonidos
+ </string>
+ <string name="InvFolder Calling Cards">
+ Tarjetas de visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Hitos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Ropa
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Notas
+ </string>
+ <string name="InvFolder New Folder">
+ Carpeta nueva
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imágenes sin comprimir
+ </string>
+ <string name="InvFolder Body Parts">
+ Partes del cuerpo
+ </string>
+ <string name="InvFolder Trash">
+ Papelera
+ </string>
+ <string name="InvFolder Photo Album">
+ Álbum de fotos
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objetos Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sonidos sin comprimir
+ </string>
+ <string name="InvFolder Animations">
+ Animaciones
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder Favorite">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder favorite">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder Favorites">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder favorites">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Vestuario actual
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Vestuario inicial
+ </string>
+ <string name="InvFolder My Outfits">
+ Mis vestuarios
+ </string>
+ <string name="InvFolder Accessories">
+ Accesorios
+ </string>
+ <string name="InvFolder Meshes">
+ Redes
+ </string>
+ <string name="InvFolder Received Items">
+ Objetos recibidos
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Buzón de salida de comerciante
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Todas
+ </string>
+ <string name="no_attachments">
+ No tienes puestos anexos
+ </string>
+ <string name="Attachments remain">
+ Anexos (quedan [COUNT] ranuras)
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Piedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cristal
+ </string>
+ <string name="Wood">
+ Madera
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Goma
+ </string>
+ <string name="Light">
+ Claridad
+ </string>
+ <string name="KBShift">
+ Mayúsculas
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Tórax
+ </string>
+ <string name="Skull">
+ Cráneo
+ </string>
+ <string name="Left Shoulder">
+ Hombro izquierdo
+ </string>
+ <string name="Right Shoulder">
+ Hombro derecho
+ </string>
+ <string name="Left Hand">
+ Mano izq.
+ </string>
+ <string name="Right Hand">
+ Mano der.
+ </string>
+ <string name="Left Foot">
+ Pie izq.
+ </string>
+ <string name="Right Foot">
+ Pie der.
+ </string>
+ <string name="Spine">
+ Columna
+ </string>
+ <string name="Pelvis">
+ Pelvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Barbilla
+ </string>
+ <string name="Left Ear">
+ Oreja izq.
+ </string>
+ <string name="Right Ear">
+ Oreja der.
+ </string>
+ <string name="Left Eyeball">
+ Ojo izq.
+ </string>
+ <string name="Right Eyeball">
+ Ojo der.
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Brazo der.
+ </string>
+ <string name="R Forearm">
+ Antebrazo der.
+ </string>
+ <string name="L Upper Arm">
+ Brazo izq.
+ </string>
+ <string name="L Forearm">
+ Antebrazo izq.
+ </string>
+ <string name="Right Hip">
+ Cadera der.
+ </string>
+ <string name="R Upper Leg">
+ Muslo der.
+ </string>
+ <string name="R Lower Leg">
+ Pantorrilla der.
+ </string>
+ <string name="Left Hip">
+ Cadera izq.
+ </string>
+ <string name="L Upper Leg">
+ Muslo izq.
+ </string>
+ <string name="L Lower Leg">
+ Pantorrilla izq.
+ </string>
+ <string name="Stomach">
+ Abdomen
+ </string>
+ <string name="Left Pec">
+ Pecho izquierdo
+ </string>
+ <string name="Right Pec">
+ Pecho derecho
+ </string>
+ <string name="Neck">
+ Cuello
+ </string>
+ <string name="Avatar Center">
+ Centro del avatar
+ </string>
+ <string name="Left Ring Finger">
+ Dedo anular izquierdo
+ </string>
+ <string name="Right Ring Finger">
+ Dedo anular derecho
+ </string>
+ <string name="Tail Base">
+ Base de la cola
+ </string>
+ <string name="Tail Tip">
+ Extremo de la cola
+ </string>
+ <string name="Left Wing">
+ Ala izquierda
+ </string>
+ <string name="Right Wing">
+ Ala derecha
+ </string>
+ <string name="Jaw">
+ Mandíbula
+ </string>
+ <string name="Alt Left Ear">
+ Oreja izquierda alternativa
+ </string>
+ <string name="Alt Right Ear">
+ Oreja derecha alternativa
+ </string>
+ <string name="Alt Left Eye">
+ Ojo izquierdo alternativo
+ </string>
+ <string name="Alt Right Eye">
+ Ojo derecho alternativo
+ </string>
+ <string name="Tongue">
+ Lengua
+ </string>
+ <string name="Groin">
+ Ingle
+ </string>
+ <string name="Left Hind Foot">
+ Pata trasera izquierda
+ </string>
+ <string name="Right Hind Foot">
+ Pata trasera derecha
+ </string>
+ <string name="Invalid Attachment">
+ Punto de colocación no válido
+ </string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Error: falta un artículo
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Error: falta el artículo de base
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Error: el objeto se encuentra en el vestuario actual, pero no está anexado
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de edad
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de edad
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de edad
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de edad
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de edad
+ </string>
+ <string name="TodayOld">
+ Registrado hoy
+ </string>
+ <string name="av_render_everyone_now">
+ Ahora todos pueden verte.
+ </string>
+ <string name="av_render_not_everyone">
+ Es posible que no todos los que están próximos puedan renderizarte.
+ </string>
+ <string name="av_render_over_half">
+ Es posible que más de la mitad de los que están próximos no puedan renderizarte.
+ </string>
+ <string name="av_render_most_of">
+ Es posible que la mayoría de los que están próximos no puedan renderizarte.
+ </string>
+ <string name="av_render_anyone">
+ Es posible que ninguno de los que están próximos pueda renderizarte.
+ </string>
+ <string name="hud_description_total">
+ Tu HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (lo llevas en [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] usa mucha memoria de textura
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] contiene muchas texturas y objetos complicados
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] contiene muchas texturas grandes
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] contiene demasiados objetos
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] contiene demasiadas texturas
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] año
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] años
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] años
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mes
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] día
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] días
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] días
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] miembro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] miembros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] miembros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prueba
+ </string>
+ <string name="AcctTypeCharterMember">
+ Miembro fundador
+ </string>
+ <string name="AcctTypeEmployee">
+ Empleado de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Ha usado información sobre la forma de pago
+ </string>
+ <string name="PaymentInfoOnFile">
+ Hay información archivada sobre la forma de pago
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No hay información archivada sobre la forma de pago
+ </string>
+ <string name="AgeVerified">
+ Edad verificada
+ </string>
+ <string name="NotAgeVerified">
+ Edad no verificada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Arriba der.
+ </string>
+ <string name="Top">
+ Arriba
+ </string>
+ <string name="Top Left">
+ Arriba izq.
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Abajo izq.
+ </string>
+ <string name="Bottom">
+ Abajo
+ </string>
+ <string name="Bottom Right">
+ Abajo der.
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Descargado, compilándolo
+ </string>
+ <string name="CompileQueueServiceUnavailable">
+ El servicio de compilación de scripts no está disponible
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ No se encuentra el script en el servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema al descargar
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permisos insuficientes para descargar un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permisos insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Fallo desconocido en la descarga
+ </string>
+ <string name="CompileNoExperiencePerm">
+ Omitiendo el script [SCRIPT] con la experiencia [EXPERIENCE].
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilando
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Progreso del reinicio
+ </string>
+ <string name="ResetQueueStart">
+ restaurar
+ </string>
+ <string name="RunQueueTitle">
+ Configurar según se ejecuta
+ </string>
+ <string name="RunQueueStart">
+ Configurando según se ejecuta
+ </string>
+ <string name="NotRunQueueTitle">
+ Configurar sin ejecutar
+ </string>
+ <string name="NotRunQueueStart">
+ Configurando sin ejecutarlo
+ </string>
+ <string name="CompileSuccessful">
+ ¡Compilación correcta!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilación correcta, guardando...
+ </string>
+ <string name="SaveComplete">
+ Guardado.
+ </string>
+ <string name="UploadFailed">
+ Error al subir el archivo:
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fuera de rango)
+ </string>
+ <string name="ScriptWasDeleted">
+ Script (eliminado del inventario)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ El objeto [OBJECT] es propiedad de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ninguno
+ </string>
<string name="Group" value="(grupo)"/>
- <string name="Unknown">(Desconocido)</string>
+ <string name="Unknown">
+ (Desconocido)
+ </string>
<string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el "/>
<string name="NextStipendDay" value=". El próximo día de pago es el "/>
- <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
<string name="GroupColumn" value="Grupo"/>
- <string name="Balance">Saldo</string>
- <string name="Credits">Créditos</string>
- <string name="Debits">Débitos</string>
- <string name="Total">Total</string>
- <string name="NoGroupDataFound">No se encontraron datos del grupo</string>
- <string name="IMParentEstate">parent estate</string>
- <string name="IMMainland">continente</string>
- <string name="IMTeen">teen</string>
- <string name="Anyone">cualquiera</string>
- <string name="RegionInfoError">error</string>
- <string name="RegionInfoAllEstatesOwnedBy">todos los estados propiedad de [OWNER]</string>
- <string name="RegionInfoAllEstatesYouOwn">todos los estados que posees</string>
- <string name="RegionInfoAllEstatesYouManage">todos los estados que administras para [OWNER]</string>
- <string name="RegionInfoAllowedResidents">Siempre permitido: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])</string>
- <string name="RegionInfoAllowedGroups">Grupos siempre permitidos: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])</string>
- <string name="RegionInfoBannedResidents">Siempre prohibido: ([BANNEDAGENTS], de un máx. de [MAXBANNED])</string>
- <string name="RegionInfoListTypeAllowedAgents">Siempre permitido</string>
- <string name="RegionInfoListTypeBannedAgents">Siempre prohibido</string>
- <string name="RegionInfoAllEstates">todos los estados</string>
- <string name="RegionInfoManagedEstates">estados administrados</string>
- <string name="RegionInfoThisEstate">este estado</string>
- <string name="AndNMore">y [EXTRA_COUNT] más</string>
- <string name="ScriptLimitsParcelScriptMemory">Memoria de los scripts de la parcela</string>
- <string name="ScriptLimitsParcelsOwned">Parcelas listadas: [PARCELS]</string>
- <string name="ScriptLimitsMemoryUsed">Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles</string>
- <string name="ScriptLimitsMemoryUsedSimple">Memoria usada: [COUNT] kb</string>
- <string name="ScriptLimitsParcelScriptURLs">URLs de los scripts de la parcela</string>
- <string name="ScriptLimitsURLsUsed">URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles</string>
- <string name="ScriptLimitsURLsUsedSimple">URLs usadas: [COUNT]</string>
- <string name="ScriptLimitsRequestError">Error al obtener la información</string>
- <string name="ScriptLimitsRequestNoParcelSelected">No hay una parcela seleccionada</string>
- <string name="ScriptLimitsRequestWrongRegion">Error: la información del script sólo está disponible en tu región actual</string>
- <string name="ScriptLimitsRequestWaiting">Obteniendo la información...</string>
- <string name="ScriptLimitsRequestDontOwnParcel">No tienes permiso para examinar esta parcela</string>
- <string name="SITTING_ON">Sentado en</string>
- <string name="ATTACH_CHEST">Tórax</string>
- <string name="ATTACH_HEAD">Cráneo</string>
- <string name="ATTACH_LSHOULDER">Hombro izquierdo</string>
- <string name="ATTACH_RSHOULDER">Hombro derecho</string>
- <string name="ATTACH_LHAND">Mano izq.</string>
- <string name="ATTACH_RHAND">Mano der.</string>
- <string name="ATTACH_LFOOT">Pie izq.</string>
- <string name="ATTACH_RFOOT">Pie der.</string>
- <string name="ATTACH_BACK">Columna</string>
- <string name="ATTACH_PELVIS">Pelvis</string>
- <string name="ATTACH_MOUTH">Boca</string>
- <string name="ATTACH_CHIN">Barbilla</string>
- <string name="ATTACH_LEAR">Oreja izq.</string>
- <string name="ATTACH_REAR">Oreja der.</string>
- <string name="ATTACH_LEYE">Ojo izq.</string>
- <string name="ATTACH_REYE">Ojo der.</string>
- <string name="ATTACH_NOSE">Nariz</string>
- <string name="ATTACH_RUARM">Brazo der.</string>
- <string name="ATTACH_RLARM">Antebrazo derecho</string>
- <string name="ATTACH_LUARM">Brazo izq.</string>
- <string name="ATTACH_LLARM">Antebrazo izquierdo</string>
- <string name="ATTACH_RHIP">Cadera der.</string>
- <string name="ATTACH_RULEG">Muslo der.</string>
- <string name="ATTACH_RLLEG">Pantorrilla der.</string>
- <string name="ATTACH_LHIP">Cadera izq.</string>
- <string name="ATTACH_LULEG">Muslo izq.</string>
- <string name="ATTACH_LLLEG">Pantorrilla izq.</string>
- <string name="ATTACH_BELLY">Abdomen</string>
- <string name="ATTACH_LEFT_PEC">Pectoral izquierdo</string>
- <string name="ATTACH_RIGHT_PEC">Pectoral derecho</string>
- <string name="ATTACH_HUD_CENTER_2">HUD: Centro 2</string>
- <string name="ATTACH_HUD_TOP_RIGHT">HUD: arriba der.</string>
- <string name="ATTACH_HUD_TOP_CENTER">HUD: arriba centro</string>
- <string name="ATTACH_HUD_TOP_LEFT">HUD: arriba izq.</string>
- <string name="ATTACH_HUD_CENTER_1">HUD: Centro 1</string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">HUD: abajo izq.</string>
- <string name="ATTACH_HUD_BOTTOM">HUD: abajo</string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD: abajo der.</string>
- <string name="ATTACH_NECK">Cuello</string>
- <string name="ATTACH_AVATAR_CENTER">Centro del avatar</string>
- <string name="ATTACH_LHAND_RING1">Dedo anular izquierdo</string>
- <string name="ATTACH_RHAND_RING1">Dedo anular derecho</string>
- <string name="ATTACH_TAIL_BASE">Base de la cola</string>
- <string name="ATTACH_TAIL_TIP">Extremo de la cola</string>
- <string name="ATTACH_LWING">Ala izquierda</string>
- <string name="ATTACH_RWING">Ala derecha</string>
- <string name="ATTACH_FACE_JAW">Mandíbula</string>
- <string name="ATTACH_FACE_LEAR">Oreja izquierda alternativa</string>
- <string name="ATTACH_FACE_REAR">Oreja derecha alternativa</string>
- <string name="ATTACH_FACE_LEYE">Ojo izquierdo alternativo</string>
- <string name="ATTACH_FACE_REYE">Ojo derecho alternativo</string>
- <string name="ATTACH_FACE_TONGUE">Lengua</string>
- <string name="ATTACH_GROIN">Ingle</string>
- <string name="ATTACH_HIND_LFOOT">Pata trasera izquierda</string>
- <string name="ATTACH_HIND_RFOOT">Pata trasera derecha</string>
- <string name="CursorPos">Línea [LINE], Columna [COLUMN]</string>
- <string name="PanelDirCountFound">[COUNT] resultados</string>
- <string name="PanelContentsTooltip">Contenido del objeto</string>
- <string name="PanelContentsNewScript">Script nuevo</string>
- <string name="DoNotDisturbModeResponseDefault">Este residente tiene activado 'No molestar' y verá tu mensaje más tarde.</string>
- <string name="MuteByName">(Por el nombre)</string>
- <string name="MuteAgent">(Residente)</string>
- <string name="MuteObject">(Objeto)</string>
- <string name="MuteGroup">(Grupo)</string>
- <string name="MuteExternal">(Externo)</string>
- <string name="RegionNoCovenant">No se ha aportado un contrato para este estado.</string>
- <string name="RegionNoCovenantOtherOwner">No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.</string>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ No se encontraron datos del grupo
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="Anyone">
+ cualquiera
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todos los estados propiedad de [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todos los estados que posees
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todos los estados que administras para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Siempre permitido: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos siempre permitidos: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="RegionInfoBannedResidents">
+ Siempre prohibido: ([BANNEDAGENTS], de un máx. de [MAXBANNED])
+ </string>
+ <string name="RegionInfoListTypeAllowedAgents">
+ Siempre permitido
+ </string>
+ <string name="RegionInfoListTypeBannedAgents">
+ Siempre prohibido
+ </string>
+ <string name="RegionInfoAllEstates">
+ todos los estados
+ </string>
+ <string name="RegionInfoManagedEstates">
+ estados administrados
+ </string>
+ <string name="RegionInfoThisEstate">
+ este estado
+ </string>
+ <string name="AndNMore">
+ y [EXTRA_COUNT] más
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memoria de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcelas listadas: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memoria usada: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URLs de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs usadas: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Error al obtener la información
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ No hay una parcela seleccionada
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Error: la información del script sólo está disponible en tu región actual
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Obteniendo la información...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ No tienes permiso para examinar esta parcela
+ </string>
+ <string name="SITTING_ON">
+ Sentado en
+ </string>
+ <string name="ATTACH_CHEST">
+ Tórax
+ </string>
+ <string name="ATTACH_HEAD">
+ Cráneo
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Hombro izquierdo
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Hombro derecho
+ </string>
+ <string name="ATTACH_LHAND">
+ Mano izq.
+ </string>
+ <string name="ATTACH_RHAND">
+ Mano der.
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pie izq.
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pie der.
+ </string>
+ <string name="ATTACH_BACK">
+ Columna
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Boca
+ </string>
+ <string name="ATTACH_CHIN">
+ Barbilla
+ </string>
+ <string name="ATTACH_LEAR">
+ Oreja izq.
+ </string>
+ <string name="ATTACH_REAR">
+ Oreja der.
+ </string>
+ <string name="ATTACH_LEYE">
+ Ojo izq.
+ </string>
+ <string name="ATTACH_REYE">
+ Ojo der.
+ </string>
+ <string name="ATTACH_NOSE">
+ Nariz
+ </string>
+ <string name="ATTACH_RUARM">
+ Brazo der.
+ </string>
+ <string name="ATTACH_RLARM">
+ Antebrazo derecho
+ </string>
+ <string name="ATTACH_LUARM">
+ Brazo izq.
+ </string>
+ <string name="ATTACH_LLARM">
+ Antebrazo izquierdo
+ </string>
+ <string name="ATTACH_RHIP">
+ Cadera der.
+ </string>
+ <string name="ATTACH_RULEG">
+ Muslo der.
+ </string>
+ <string name="ATTACH_RLLEG">
+ Pantorrilla der.
+ </string>
+ <string name="ATTACH_LHIP">
+ Cadera izq.
+ </string>
+ <string name="ATTACH_LULEG">
+ Muslo izq.
+ </string>
+ <string name="ATTACH_LLLEG">
+ Pantorrilla izq.
+ </string>
+ <string name="ATTACH_BELLY">
+ Abdomen
+ </string>
+ <string name="ATTACH_LEFT_PEC">
+ Pectoral izquierdo
+ </string>
+ <string name="ATTACH_RIGHT_PEC">
+ Pectoral derecho
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD: Centro 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD: arriba der.
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD: arriba centro
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD: arriba izq.
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD: Centro 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD: abajo izq.
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD: abajo
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD: abajo der.
+ </string>
+ <string name="ATTACH_NECK">
+ Cuello
+ </string>
+ <string name="ATTACH_AVATAR_CENTER">
+ Centro del avatar
+ </string>
+ <string name="ATTACH_LHAND_RING1">
+ Dedo anular izquierdo
+ </string>
+ <string name="ATTACH_RHAND_RING1">
+ Dedo anular derecho
+ </string>
+ <string name="ATTACH_TAIL_BASE">
+ Base de la cola
+ </string>
+ <string name="ATTACH_TAIL_TIP">
+ Extremo de la cola
+ </string>
+ <string name="ATTACH_LWING">
+ Ala izquierda
+ </string>
+ <string name="ATTACH_RWING">
+ Ala derecha
+ </string>
+ <string name="ATTACH_FACE_JAW">
+ Mandíbula
+ </string>
+ <string name="ATTACH_FACE_LEAR">
+ Oreja izquierda alternativa
+ </string>
+ <string name="ATTACH_FACE_REAR">
+ Oreja derecha alternativa
+ </string>
+ <string name="ATTACH_FACE_LEYE">
+ Ojo izquierdo alternativo
+ </string>
+ <string name="ATTACH_FACE_REYE">
+ Ojo derecho alternativo
+ </string>
+ <string name="ATTACH_FACE_TONGUE">
+ Lengua
+ </string>
+ <string name="ATTACH_GROIN">
+ Ingle
+ </string>
+ <string name="ATTACH_HIND_LFOOT">
+ Pata trasera izquierda
+ </string>
+ <string name="ATTACH_HIND_RFOOT">
+ Pata trasera derecha
+ </string>
+ <string name="CursorPos">
+ Línea [LINE], Columna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] resultados
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenido del objeto
+ </string>
+ <string name="PanelContentsNewScript">
+ Script nuevo
+ </string>
+ <string name="DoNotDisturbModeResponseDefault">
+ Este residente tiene activado 'No molestar' y verá tu mensaje más tarde.
+ </string>
+ <string name="MuteByName">
+ (Por el nombre)
+ </string>
+ <string name="MuteAgent">
+ (Residente)
+ </string>
+ <string name="MuteObject">
+ (Objeto)
+ </string>
+ <string name="MuteGroup">
+ (Grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
+ </string>
+ <string name="RegionNoCovenant">
+ No se ha aportado un contrato para este estado.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
+ </string>
<string name="covenant_last_modified" value="Última modificación: "/>
<string name="none_text" value="(no hay)"/>
<string name="never_text" value=" (nunca)"/>
- <string name="GroupOwned">Propiedad del grupo</string>
- <string name="Public">Público</string>
- <string name="LocalSettings">Configuración local</string>
- <string name="RegionSettings">Configuración de la región</string>
- <string name="NoEnvironmentSettings">Esta región no es compatible con las opciones de entorno.</string>
- <string name="EnvironmentSun">Sol</string>
- <string name="EnvironmentMoon">Luna</string>
- <string name="EnvironmentBloom">Florecimiento</string>
- <string name="EnvironmentCloudNoise">Ruido de nubes</string>
- <string name="EnvironmentNormalMap">Vista Normal</string>
- <string name="EnvironmentTransparent">Transparente</string>
- <string name="ClassifiedClicksTxt">Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil</string>
- <string name="ClassifiedUpdateAfterPublish">(se actualizará tras la publicación)</string>
- <string name="NoPicksClassifiedsText">No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.</string>
- <string name="NoPicksText">No has creado destacados. Haz clic en el botón Más para crear uno.</string>
- <string name="NoClassifiedsText">No has creado clasificados. Haz clic en el botón Nuevo para crear un anuncio clasificado.</string>
- <string name="NoAvatarPicksClassifiedsText">El usuario no tiene clasificados ni destacados</string>
- <string name="NoAvatarPicksText">El usuario no tiene destacados</string>
- <string name="NoAvatarClassifiedsText">El usuario no tiene clasificados</string>
- <string name="PicksClassifiedsLoadingText">Cargando...</string>
- <string name="MultiPreviewTitle">Vista previa</string>
- <string name="MultiPropertiesTitle">Propiedades</string>
- <string name="InvOfferAnObjectNamed">Un objeto de nombre</string>
- <string name="InvOfferOwnedByGroup">propiedad del grupo</string>
- <string name="InvOfferOwnedByUnknownGroup">propiedad de un grupo desconocido</string>
- <string name="InvOfferOwnedBy">propiedad de</string>
- <string name="InvOfferOwnedByUnknownUser">propiedad de un usuario desconocido</string>
- <string name="InvOfferGaveYou">te ha dado</string>
- <string name="InvOfferDecline">Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.</string>
- <string name="GroupMoneyTotal">Total</string>
- <string name="GroupMoneyBought">comprado</string>
- <string name="GroupMoneyPaidYou">pagado a ti</string>
- <string name="GroupMoneyPaidInto">pagado en</string>
- <string name="GroupMoneyBoughtPassTo">pase comprado a</string>
- <string name="GroupMoneyPaidFeeForEvent">cuotas pagadas para el evento</string>
- <string name="GroupMoneyPaidPrizeForEvent">precio pagado por el evento</string>
- <string name="GroupMoneyBalance">Saldo</string>
- <string name="GroupMoneyCredits">Créditos</string>
- <string name="GroupMoneyDebits">Débitos</string>
- <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>
- <string name="AcquiredItems">Artículos adquiridos</string>
- <string name="Cancel">Cancelar</string>
- <string name="UploadingCosts">Subir [NAME] cuesta [AMOUNT] L$</string>
- <string name="BuyingCosts">Comprar esto cuesta [AMOUNT] L$</string>
- <string name="UnknownFileExtension">Extensión de archivo desconocida [.%s]
-Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh</string>
- <string name="MuteObject2">Ignorar</string>
- <string name="AddLandmarkNavBarMenu">Guardarme este hito...</string>
- <string name="EditLandmarkNavBarMenu">Editar este hito...</string>
- <string name="accel-mac-control">⌃</string>
- <string name="accel-mac-command">⌘</string>
- <string name="accel-mac-option">⌥</string>
- <string name="accel-mac-shift">⇧</string>
- <string name="accel-win-control">Ctrl+</string>
- <string name="accel-win-alt">Alt+</string>
- <string name="accel-win-shift">Mayús+</string>
- <string name="FileSaved">Archivo guardado</string>
- <string name="Receiving">Recibiendo</string>
- <string name="AM">AM</string>
- <string name="PM">PM</string>
- <string name="PST">PST</string>
- <string name="PDT">PDT</string>
- <string name="Direction_Forward">Adelante</string>
- <string name="Direction_Left">Izquierda</string>
- <string name="Direction_Right">Derecha</string>
- <string name="Direction_Back">Atrás</string>
- <string name="Direction_North">Norte</string>
- <string name="Direction_South">Sur</string>
- <string name="Direction_West">Oeste</string>
- <string name="Direction_East">Este</string>
- <string name="Direction_Up">Arriba</string>
- <string name="Direction_Down">Abajo</string>
- <string name="Any Category">Cualquier categoría</string>
- <string name="Shopping">Compras</string>
- <string name="Land Rental">Terreno en alquiler</string>
- <string name="Property Rental">Propiedad en alquiler</string>
- <string name="Special Attraction">Atracción especial</string>
- <string name="New Products">Nuevos productos</string>
- <string name="Employment">Empleo</string>
- <string name="Wanted">Se busca</string>
- <string name="Service">Servicios</string>
- <string name="Personal">Personal</string>
- <string name="None">Ninguno</string>
- <string name="Linden Location">Localización Linden</string>
- <string name="Adult">Adulto</string>
- <string name="Arts&amp;Culture">Arte y Cultura</string>
- <string name="Business">Negocios</string>
- <string name="Educational">Educativo</string>
- <string name="Gaming">Juegos de azar</string>
- <string name="Hangout">Entretenimiento</string>
- <string name="Newcomer Friendly">Para recién llegados</string>
- <string name="Parks&amp;Nature">Parques y Naturaleza</string>
- <string name="Residential">Residencial</string>
- <string name="Stage">Artes escénicas</string>
- <string name="Other">Otra</string>
- <string name="Rental">Terreno en alquiler</string>
- <string name="Any">Cualquiera</string>
- <string name="You">Tú</string>
- <string name="Multiple Media">Múltiples medias</string>
- <string name="Play Media">Play/Pausa los media</string>
- <string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string>
- <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=es</string>
- <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string>
- <string name="MBCmdLineError">Ha habido un error analizando la línea de comando.
+ <string name="GroupOwned">
+ Propiedad del grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="LocalSettings">
+ Configuración local
+ </string>
+ <string name="RegionSettings">
+ Configuración de la región
+ </string>
+ <string name="NoEnvironmentSettings">
+ Esta región no es compatible con las opciones de entorno.
+ </string>
+ <string name="EnvironmentSun">
+ Sol
+ </string>
+ <string name="EnvironmentMoon">
+ Luna
+ </string>
+ <string name="EnvironmentBloom">
+ Florecimiento
+ </string>
+ <string name="EnvironmentCloudNoise">
+ Ruido de nubes
+ </string>
+ <string name="EnvironmentNormalMap">
+ Vista Normal
+ </string>
+ <string name="EnvironmentTransparent">
+ Transparente
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (se actualizará tras la publicación)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
+ </string>
+ <string name="NoPicksText">
+ No has creado destacados. Haz clic en el botón Más para crear uno.
+ </string>
+ <string name="NoClassifiedsText">
+ No has creado clasificados. Haz clic en el botón Nuevo para crear un anuncio clasificado.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ El usuario no tiene clasificados ni destacados
+ </string>
+ <string name="NoAvatarPicksText">
+ El usuario no tiene destacados
+ </string>
+ <string name="NoAvatarClassifiedsText">
+ El usuario no tiene clasificados
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Cargando...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vista previa
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propiedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objeto de nombre
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ propiedad del grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ propiedad de un grupo desconocido
+ </string>
+ <string name="InvOfferOwnedBy">
+ propiedad de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ propiedad de un usuario desconocido
+ </string>
+ <string name="InvOfferGaveYou">
+ te ha dado
+ </string>
+ <string name="InvOfferDecline">
+ Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprado
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagado a ti
+ </string>
+ <string name="GroupMoneyPaidInto">
+ pagado en
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ pase comprado a
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ cuotas pagadas para el evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ precio pagado por el evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="AcquiredItems">
+ Artículos adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Subir [NAME] cuesta [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Comprar esto cuesta [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Extensión de archivo desconocida [.%s]
+Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
+ </string>
+ <string name="MuteObject2">
+ Ignorar
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Guardarme este hito...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar este hito...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Mayús+
+ </string>
+ <string name="FileSaved">
+ Archivo guardado
+ </string>
+ <string name="Receiving">
+ Recibiendo
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Adelante
+ </string>
+ <string name="Direction_Left">
+ Izquierda
+ </string>
+ <string name="Direction_Right">
+ Derecha
+ </string>
+ <string name="Direction_Back">
+ Atrás
+ </string>
+ <string name="Direction_North">
+ Norte
+ </string>
+ <string name="Direction_South">
+ Sur
+ </string>
+ <string name="Direction_West">
+ Oeste
+ </string>
+ <string name="Direction_East">
+ Este
+ </string>
+ <string name="Direction_Up">
+ Arriba
+ </string>
+ <string name="Direction_Down">
+ Abajo
+ </string>
+ <string name="Any Category">
+ Cualquier categoría
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Property Rental">
+ Propiedad en alquiler
+ </string>
+ <string name="Special Attraction">
+ Atracción especial
+ </string>
+ <string name="New Products">
+ Nuevos productos
+ </string>
+ <string name="Employment">
+ Empleo
+ </string>
+ <string name="Wanted">
+ Se busca
+ </string>
+ <string name="Service">
+ Servicios
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ Ninguno
+ </string>
+ <string name="Linden Location">
+ Localización Linden
+ </string>
+ <string name="Adult">
+ Adulto
+ </string>
+ <string name="Arts&amp;Culture">
+ Arte y Cultura
+ </string>
+ <string name="Business">
+ Negocios
+ </string>
+ <string name="Educational">
+ Educativo
+ </string>
+ <string name="Gaming">
+ Juegos de azar
+ </string>
+ <string name="Hangout">
+ Entretenimiento
+ </string>
+ <string name="Newcomer Friendly">
+ Para recién llegados
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques y Naturaleza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Artes escénicas
+ </string>
+ <string name="Other">
+ Otra
+ </string>
+ <string name="Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Any">
+ Cualquiera
+ </string>
+ <string name="You">
+ Tú
+ </string>
+ <string name="Multiple Media">
+ Múltiples medias
+ </string>
+ <string name="Play Media">
+ Play/Pausa los media
+ </string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=es
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
+ <string name="MBCmdLineError">
+ Ha habido un error analizando la línea de comando.
Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
-Error:</string>
- <string name="MBCmdLineUsg">[APP_NAME] Uso de línea de comando:</string>
- <string name="MBUnableToAccessFile">[APP_NAME] no puede acceder a un archivo que necesita.
+Error:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de línea de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] no puede acceder a un archivo que necesita.
Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
-Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.</string>
- <string name="MBFatalError">Error fatal</string>
- <string name="MBRequiresAltiVec">[APP_NAME] requiere un procesador con AltiVec (G4 o posterior).</string>
- <string name="MBAlreadyRunning">[APP_NAME] ya se está ejecutando.
+Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
+ </string>
+ <string name="MBFatalError">
+ Error fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] ya se está ejecutando.
Revisa tu barra de tareas para encontrar una copia minimizada del programa.
-Si este mensaje persiste, reinicia tu ordenador.</string>
- <string name="MBFrozenCrashed">En su anterior ejecución, [APP_NAME] se congeló o se cayó.
-¿Quieres enviar un informe de caída?</string>
- <string name="MBAlert">Alerta</string>
- <string name="MBNoDirectX">[APP_NAME] no encuentra DirectX 9.0b o superior.
+Si este mensaje persiste, reinicia tu ordenador.
+ </string>
+ <string name="MBFrozenCrashed">
+ En su anterior ejecución, [APP_NAME] se congeló o se cayó.
+¿Quieres enviar un informe de caída?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] no encuentra DirectX 9.0b o superior.
[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
-¿Quieres continuar?</string>
- <string name="MBWarning">¡Atención!</string>
- <string name="MBNoAutoUpdate">Las actualizaciones automáticas no están todavía implementadas para Linux.
-Por favor, descarga la última versión desde www.secondlife.com.</string>
- <string name="MBRegClassFailed">Fallo en RegisterClass</string>
- <string name="MBError">Error</string>
- <string name="MBFullScreenErr">No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
-Ejecutándose en una ventana.</string>
- <string name="MBDestroyWinFailed">Error Shutdown destruyendo la ventana (DestroyWindow() failed)</string>
- <string name="MBShutdownErr">Error Shutdown</string>
- <string name="MBDevContextErr">No se puede construir el 'GL device context'</string>
- <string name="MBPixelFmtErr">No se puede encontrar un formato adecuado de píxel</string>
- <string name="MBPixelFmtDescErr">No se puede conseguir la descripción del formato de píxel</string>
- <string name="MBTrueColorWindow">Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
-Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.</string>
- <string name="MBAlpha">[APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
+¿Quieres continuar?
+ </string>
+ <string name="MBWarning">
+ ¡Atención!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Las actualizaciones automáticas no están todavía implementadas para Linux.
+Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Fallo en RegisterClass
+ </string>
+ <string name="MBError">
+ Error
+ </string>
+ <string name="MBFullScreenErr">
+ No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
+Ejecutándose en una ventana.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Error Shutdown destruyendo la ventana (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Error Shutdown
+ </string>
+ <string name="MBDevContextErr">
+ No se puede construir el 'GL device context'
+ </string>
+ <string name="MBPixelFmtErr">
+ No se puede encontrar un formato adecuado de píxel
+ </string>
+ <string name="MBPixelFmtDescErr">
+ No se puede conseguir la descripción del formato de píxel
+ </string>
+ <string name="MBTrueColorWindow">
+ Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
+Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
-Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].</string>
- <string name="MBPixelFmtSetErr">No se puede configurar el formato de píxel</string>
- <string name="MBGLContextErr">No se puede crear el 'GL rendering context'</string>
- <string name="MBGLContextActErr">No se puede activar el 'GL rendering context'</string>
- <string name="MBVideoDrvErr">[APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ No se puede configurar el formato de píxel
+ </string>
+ <string name="MBGLContextErr">
+ No se puede crear el 'GL rendering context'
+ </string>
+ <string name="MBGLContextActErr">
+ No se puede activar el 'GL rendering context'
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
-Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].</string>
- <string name="5 O'Clock Shadow">Barba del día</string>
- <string name="All White">Blanco del todo</string>
- <string name="Anime Eyes">Ojos de cómic</string>
- <string name="Arced">Arqueadas</string>
- <string name="Arm Length">Brazos: longitud</string>
- <string name="Attached">Cortos</string>
- <string name="Attached Earlobes">Lóbulos</string>
- <string name="Back Fringe">Nuca: largo</string>
- <string name="Baggy">Marcadas</string>
- <string name="Bangs">Bangs</string>
- <string name="Beady Eyes">Ojos pequeños</string>
- <string name="Belly Size">Barriga: tamaño</string>
- <string name="Big">Grande</string>
- <string name="Big Butt">Culo grande</string>
- <string name="Big Hair Back">Pelo: moño</string>
- <string name="Big Hair Front">Pelo: tupé</string>
- <string name="Big Hair Top">Pelo: melena alta</string>
- <string name="Big Head">Cabeza grande</string>
- <string name="Big Pectorals">Grandes pectorales</string>
- <string name="Big Spikes">Crestas grandes</string>
- <string name="Black">Negro</string>
- <string name="Blonde">Rubio</string>
- <string name="Blonde Hair">Pelo rubio</string>
- <string name="Blush">Colorete</string>
- <string name="Blush Color">Color del colorete</string>
- <string name="Blush Opacity">Opacidad del colorete</string>
- <string name="Body Definition">Definición del cuerpo</string>
- <string name="Body Fat">Cuerpo: gordura</string>
- <string name="Body Freckles">Pecas del cuerpo</string>
- <string name="Body Thick">Cuerpo grueso</string>
- <string name="Body Thickness">Cuerpo: grosor</string>
- <string name="Body Thin">Cuerpo delgado</string>
- <string name="Bow Legged">Abiertas</string>
- <string name="Breast Buoyancy">Busto: firmeza</string>
- <string name="Breast Cleavage">Busto: canalillo</string>
- <string name="Breast Size">Busto: tamaño</string>
- <string name="Bridge Width">Puente: ancho</string>
- <string name="Broad">Aumentar</string>
- <string name="Brow Size">Arco ciliar</string>
- <string name="Bug Eyes">Bug Eyes</string>
- <string name="Bugged Eyes">Ojos saltones</string>
- <string name="Bulbous">Bulbosa</string>
- <string name="Bulbous Nose">Nariz de porra</string>
- <string name="Breast Physics Mass">Masa del busto</string>
- <string name="Breast Physics Smoothing">Suavizado del busto</string>
- <string name="Breast Physics Gravity">Gravedad del busto</string>
- <string name="Breast Physics Drag">Aerodinámica del busto</string>
- <string name="Breast Physics InOut Max Effect">Efecto máx.</string>
- <string name="Breast Physics InOut Spring">Elasticidad</string>
- <string name="Breast Physics InOut Gain">Ganancia</string>
- <string name="Breast Physics InOut Damping">Amortiguación</string>
- <string name="Breast Physics UpDown Max Effect">Efecto máx.</string>
- <string name="Breast Physics UpDown Spring">Elasticidad</string>
- <string name="Breast Physics UpDown Gain">Ganancia</string>
- <string name="Breast Physics UpDown Damping">Amortiguación</string>
- <string name="Breast Physics LeftRight Max Effect">Efecto máx.</string>
- <string name="Breast Physics LeftRight Spring">Elasticidad</string>
- <string name="Breast Physics LeftRight Gain">Ganancia</string>
- <string name="Breast Physics LeftRight Damping">Amortiguación</string>
- <string name="Belly Physics Mass">Masa de la barriga</string>
- <string name="Belly Physics Smoothing">Suavizado de la barriga</string>
- <string name="Belly Physics Gravity">Gravedad de la barriga</string>
- <string name="Belly Physics Drag">Aerodinámica de la barriga</string>
- <string name="Belly Physics UpDown Max Effect">Efecto máx.</string>
- <string name="Belly Physics UpDown Spring">Elasticidad</string>
- <string name="Belly Physics UpDown Gain">Ganancia</string>
- <string name="Belly Physics UpDown Damping">Amortiguación</string>
- <string name="Butt Physics Mass">Masa del culo</string>
- <string name="Butt Physics Smoothing">Suavizado del culo</string>
- <string name="Butt Physics Gravity">Gravedad del culo</string>
- <string name="Butt Physics Drag">Aerodinámica del culo</string>
- <string name="Butt Physics UpDown Max Effect">Efecto máx.</string>
- <string name="Butt Physics UpDown Spring">Elasticidad</string>
- <string name="Butt Physics UpDown Gain">Ganancia</string>
- <string name="Butt Physics UpDown Damping">Amortiguación</string>
- <string name="Butt Physics LeftRight Max Effect">Efecto máx.</string>
- <string name="Butt Physics LeftRight Spring">Elasticidad</string>
- <string name="Butt Physics LeftRight Gain">Ganancia</string>
- <string name="Butt Physics LeftRight Damping">Amortiguación</string>
- <string name="Bushy Eyebrows">Cejijuntas</string>
- <string name="Bushy Hair">Pelo tupido</string>
- <string name="Butt Size">Culo: tamaño</string>
- <string name="Butt Gravity">Gravedad del culo</string>
- <string name="bustle skirt">Polisón</string>
- <string name="no bustle">Sin polisón</string>
- <string name="more bustle">Con polisón</string>
- <string name="Chaplin">Cortito</string>
- <string name="Cheek Bones">Pómulos</string>
- <string name="Chest Size">Tórax: tamaño</string>
- <string name="Chin Angle">Barbilla: ángulo</string>
- <string name="Chin Cleft">Barbilla: contorno</string>
- <string name="Chin Curtains">Barba en collar</string>
- <string name="Chin Depth">Barbilla: largo</string>
- <string name="Chin Heavy">Hacia la barbilla</string>
- <string name="Chin In">Barbilla retraída</string>
- <string name="Chin Out">Barbilla prominente</string>
- <string name="Chin-Neck">Papada</string>
- <string name="Clear">Transparente</string>
- <string name="Cleft">Remarcar</string>
- <string name="Close Set Eyes">Ojos juntos</string>
- <string name="Closed">Cerrar</string>
- <string name="Closed Back">Trasera cerrada</string>
- <string name="Closed Front">Frontal cerrado</string>
- <string name="Closed Left">Cerrada</string>
- <string name="Closed Right">Cerrada</string>
- <string name="Coin Purse">Poco abultada</string>
- <string name="Collar Back">Espalda</string>
- <string name="Collar Front">Escote</string>
- <string name="Corner Down">Hacia abajo</string>
- <string name="Corner Up">Hacia arriba</string>
- <string name="Creased">Caídos</string>
- <string name="Crooked Nose">Nariz torcida</string>
- <string name="Cuff Flare">Acampanado</string>
- <string name="Dark">Oscuridad</string>
- <string name="Dark Green">Verde oscuro</string>
- <string name="Darker">Más oscuros</string>
- <string name="Deep">Remarcar</string>
- <string name="Default Heels">Tacones por defecto</string>
- <string name="Dense">Densas</string>
- <string name="Double Chin">Mucha papada</string>
- <string name="Downturned">Poco</string>
- <string name="Duffle Bag">Muy abultada</string>
- <string name="Ear Angle">Orejas: ángulo</string>
- <string name="Ear Size">Orejas: tamaño</string>
- <string name="Ear Tips">Orejas: forma</string>
- <string name="Egg Head">Cabeza: ahuevada</string>
- <string name="Eye Bags">Ojos: bolsas</string>
- <string name="Eye Color">Ojos: color</string>
- <string name="Eye Depth">Ojos: profundidad</string>
- <string name="Eye Lightness">Ojos: brillo</string>
- <string name="Eye Opening">Ojos: apertura</string>
- <string name="Eye Pop">Ojos: simetría</string>
- <string name="Eye Size">Ojos: tamaño</string>
- <string name="Eye Spacing">Ojos: separación</string>
- <string name="Eyebrow Arc">Cejas: arco</string>
- <string name="Eyebrow Density">Cejas: densidad</string>
- <string name="Eyebrow Height">Cejas: altura</string>
- <string name="Eyebrow Points">Cejas: en V</string>
- <string name="Eyebrow Size">Cejas: tamaño</string>
- <string name="Eyelash Length">Pestañas: longitud</string>
- <string name="Eyeliner">Contorno de ojos</string>
- <string name="Eyeliner Color">Contorno de ojos: color</string>
- <string name="Eyes Bugged">Eyes Bugged</string>
- <string name="Face Shear">Cara: simetría</string>
- <string name="Facial Definition">Rasgos marcados</string>
- <string name="Far Set Eyes">Ojos separados</string>
- <string name="Fat Lips">Prominentes</string>
- <string name="Female">Mujer</string>
- <string name="Fingerless">Sin dedos</string>
- <string name="Fingers">Con dedos</string>
- <string name="Flared Cuffs">Campana</string>
- <string name="Flat">Redondeadas</string>
- <string name="Flat Butt">Culo plano</string>
- <string name="Flat Head">Cabeza plana</string>
- <string name="Flat Toe">Empeine bajo</string>
- <string name="Foot Size">Pie: tamaño</string>
- <string name="Forehead Angle">Frente: ángulo</string>
- <string name="Forehead Heavy">Hacia la frente</string>
- <string name="Freckles">Pecas</string>
- <string name="Front Fringe">Flequillo</string>
- <string name="Full Back">Sin cortar</string>
- <string name="Full Eyeliner">Contorno completo</string>
- <string name="Full Front">Sin cortar</string>
- <string name="Full Hair Sides">Pelo: volumen a los lados</string>
- <string name="Full Sides">Volumen total</string>
- <string name="Glossy">Con brillo</string>
- <string name="Glove Fingers">Guantes: dedos</string>
- <string name="Glove Length">Guantes: largo</string>
- <string name="Hair">Pelo</string>
- <string name="Hair Back">Pelo: nuca</string>
- <string name="Hair Front">Pelo: delante</string>
- <string name="Hair Sides">Pelo: lados</string>
- <string name="Hair Sweep">Peinado: dirección</string>
- <string name="Hair Thickess">Pelo: espesor</string>
- <string name="Hair Thickness">Pelo: espesor</string>
- <string name="Hair Tilt">Pelo: inclinación</string>
- <string name="Hair Tilted Left">A la izq.</string>
- <string name="Hair Tilted Right">A la der.</string>
- <string name="Hair Volume">Pelo: volumen</string>
- <string name="Hand Size">Manos: tamaño</string>
- <string name="Handlebars">Muy largo</string>
- <string name="Head Length">Cabeza: longitud</string>
- <string name="Head Shape">Cabeza: forma</string>
- <string name="Head Size">Cabeza: tamaño</string>
- <string name="Head Stretch">Cabeza: estiramiento</string>
- <string name="Heel Height">Tacón: altura</string>
- <string name="Heel Shape">Tacón: forma</string>
- <string name="Height">Altura</string>
- <string name="High">Subir</string>
- <string name="High Heels">Tacones altos</string>
- <string name="High Jaw">Mandíbula alta</string>
- <string name="High Platforms">Suela gorda</string>
- <string name="High and Tight">Pegada</string>
- <string name="Higher">Arrriba</string>
- <string name="Hip Length">Cadera: altura</string>
- <string name="Hip Width">Cadera: ancho</string>
- <string name="Hover">Pasa el cursor</string>
- <string name="In">Pegadas</string>
- <string name="In Shdw Color">Línea de ojos: color</string>
- <string name="In Shdw Opacity">Línea de ojos: opacidad</string>
- <string name="Inner Eye Corner">Ojos: lagrimal</string>
- <string name="Inner Eye Shadow">Inner Eye Shadow</string>
- <string name="Inner Shadow">Línea de ojos</string>
- <string name="Jacket Length">Chaqueta: largo</string>
- <string name="Jacket Wrinkles">Chaqueta: arrugas</string>
- <string name="Jaw Angle">Mandíbula: ángulo</string>
- <string name="Jaw Jut">Maxilar inferior</string>
- <string name="Jaw Shape">Mandíbula: forma</string>
- <string name="Join">Más junto</string>
- <string name="Jowls">Mofletes</string>
- <string name="Knee Angle">Rodillas: ángulo</string>
- <string name="Knock Kneed">Zambas</string>
- <string name="Large">Aumentar</string>
- <string name="Large Hands">Manos grandes</string>
- <string name="Left Part">Raya: izq.</string>
- <string name="Leg Length">Piernas: longitud</string>
- <string name="Leg Muscles">Piernas: musculatura</string>
- <string name="Less">Menos</string>
- <string name="Less Body Fat">Menos gordura</string>
- <string name="Less Curtains">Menos tupida</string>
- <string name="Less Freckles">Menos pecas</string>
- <string name="Less Full">Menos grosor</string>
- <string name="Less Gravity">Más levantado</string>
- <string name="Less Love">Menos michelines</string>
- <string name="Less Muscles">Pocos músculos</string>
- <string name="Less Muscular">Poca musculatura</string>
- <string name="Less Rosy">Menos sonrosada</string>
- <string name="Less Round">Menos redondeada</string>
- <string name="Less Saddle">Menos cartucheras</string>
- <string name="Less Square">Menos cuadrada</string>
- <string name="Less Volume">Menos volumen</string>
- <string name="Less soul">Pequeña</string>
- <string name="Lighter">Más luminosos</string>
- <string name="Lip Cleft">Labio: hoyuelo</string>
- <string name="Lip Cleft Depth">Hoyuelo marcado</string>
- <string name="Lip Fullness">Labios: grosor</string>
- <string name="Lip Pinkness">Labios sonrosados</string>
- <string name="Lip Ratio">Labios: ratio</string>
- <string name="Lip Thickness">Labios: prominencia</string>
- <string name="Lip Width">Labios: ancho</string>
- <string name="Lipgloss">Brillo de labios</string>
- <string name="Lipstick">Barra de labios</string>
- <string name="Lipstick Color">Barra de labios: color</string>
- <string name="Long">Más</string>
- <string name="Long Head">Cabeza alargada</string>
- <string name="Long Hips">Cadera larga</string>
- <string name="Long Legs">Piernas largas</string>
- <string name="Long Neck">Cuello largo</string>
- <string name="Long Pigtails">Coletas largas</string>
- <string name="Long Ponytail">Cola de caballo larga</string>
- <string name="Long Torso">Torso largo</string>
- <string name="Long arms">Brazos largos</string>
- <string name="Loose Pants">Pantalón suelto</string>
- <string name="Loose Shirt">Camiseta suelta</string>
- <string name="Loose Sleeves">Puños anchos</string>
- <string name="Love Handles">Michelines</string>
- <string name="Low">Bajar</string>
- <string name="Low Heels">Tacones bajos</string>
- <string name="Low Jaw">Mandíbula baja</string>
- <string name="Low Platforms">Suela fina</string>
- <string name="Low and Loose">Suelta</string>
- <string name="Lower">Abajo</string>
- <string name="Lower Bridge">Puente: abajo</string>
- <string name="Lower Cheeks">Mejillas: abajo</string>
- <string name="Male">Varón</string>
- <string name="Middle Part">Raya: en medio</string>
- <string name="More">Más</string>
- <string name="More Blush">Más colorete</string>
- <string name="More Body Fat">Más gordura</string>
- <string name="More Curtains">Más tupida</string>
- <string name="More Eyeshadow">Más</string>
- <string name="More Freckles">Más pecas</string>
- <string name="More Full">Más grosor</string>
- <string name="More Gravity">Menos levantado</string>
- <string name="More Lipstick">Más barra de labios</string>
- <string name="More Love">Más michelines</string>
- <string name="More Lower Lip">Más el inferior</string>
- <string name="More Muscles">Más músculos</string>
- <string name="More Muscular">Más musculatura</string>
- <string name="More Rosy">Más sonrosada</string>
- <string name="More Round">Más redondeada</string>
- <string name="More Saddle">Más cartucheras</string>
- <string name="More Sloped">Más inclinada</string>
- <string name="More Square">Más cuadrada</string>
- <string name="More Upper Lip">Más el superior</string>
- <string name="More Vertical">Más recta</string>
- <string name="More Volume">Más volumen</string>
- <string name="More soul">Grande</string>
- <string name="Moustache">Bigote</string>
- <string name="Mouth Corner">Comisuras</string>
- <string name="Mouth Position">Boca: posición</string>
- <string name="Mowhawk">Rapado</string>
- <string name="Muscular">Muscular</string>
- <string name="Mutton Chops">Patillas largas</string>
- <string name="Nail Polish">Uñas pintadas</string>
- <string name="Nail Polish Color">Uñas pintadas: color</string>
- <string name="Narrow">Disminuir</string>
- <string name="Narrow Back">Rapada</string>
- <string name="Narrow Front">Entradas</string>
- <string name="Narrow Lips">Labios estrechos</string>
- <string name="Natural">Natural</string>
- <string name="Neck Length">Cuello: longitud</string>
- <string name="Neck Thickness">Cuello: grosor</string>
- <string name="No Blush">Sin colorete</string>
- <string name="No Eyeliner">Sin contorno</string>
- <string name="No Eyeshadow">Menos</string>
- <string name="No Lipgloss">Sin brillo</string>
- <string name="No Lipstick">Sin barra de labios</string>
- <string name="No Part">Sin raya</string>
- <string name="No Polish">Sin pintar</string>
- <string name="No Red">Nada</string>
- <string name="No Spikes">Sin crestas</string>
- <string name="No White">Sin blanco</string>
- <string name="No Wrinkles">Sin arrugas</string>
- <string name="Normal Lower">Normal Lower</string>
- <string name="Normal Upper">Normal Upper</string>
- <string name="Nose Left">Nariz a la izq.</string>
- <string name="Nose Right">Nariz a la der.</string>
- <string name="Nose Size">Nariz: tamaño</string>
- <string name="Nose Thickness">Nariz: grosor</string>
- <string name="Nose Tip Angle">Nariz: respingona</string>
- <string name="Nose Tip Shape">Nariz: punta</string>
- <string name="Nose Width">Nariz: ancho</string>
- <string name="Nostril Division">Ventana: altura</string>
- <string name="Nostril Width">Ventana: ancho</string>
- <string name="Opaque">Opaco</string>
- <string name="Open">Abrir</string>
- <string name="Open Back">Apertura trasera</string>
- <string name="Open Front">Apertura frontal</string>
- <string name="Open Left">Abierta</string>
- <string name="Open Right">Abierta</string>
- <string name="Orange">Anaranjado</string>
- <string name="Out">De soplillo</string>
- <string name="Out Shdw Color">Sombra de ojos: color</string>
- <string name="Out Shdw Opacity">Sombra de ojos: opacidad</string>
- <string name="Outer Eye Corner">Ojos: comisura</string>
- <string name="Outer Eye Shadow">Outer Eye Shadow</string>
- <string name="Outer Shadow">Sombra de ojos</string>
- <string name="Overbite">Retraído</string>
- <string name="Package">Pubis</string>
- <string name="Painted Nails">Pintadas</string>
- <string name="Pale">Pálida</string>
- <string name="Pants Crotch">Pantalón: cruz</string>
- <string name="Pants Fit">Ceñido</string>
- <string name="Pants Length">Pernera: largo</string>
- <string name="Pants Waist">Caja</string>
- <string name="Pants Wrinkles">Pantalón: arrugas</string>
- <string name="Part">Raya</string>
- <string name="Part Bangs">Flequillo partido</string>
- <string name="Pectorals">Pectorales</string>
- <string name="Pigment">Tono</string>
- <string name="Pigtails">Coletas</string>
- <string name="Pink">Rosa</string>
- <string name="Pinker">Más sonrosados</string>
- <string name="Platform Height">Suela: altura</string>
- <string name="Platform Width">Suela: ancho</string>
- <string name="Pointy">En punta</string>
- <string name="Pointy Heels">De aguja</string>
- <string name="Ponytail">Cola de caballo</string>
- <string name="Poofy Skirt">Con vuelo</string>
- <string name="Pop Left Eye">Izquierdo más grande</string>
- <string name="Pop Right Eye">Derecho más grande</string>
- <string name="Puffy">Hinchadas</string>
- <string name="Puffy Eyelids">Ojeras</string>
- <string name="Rainbow Color">Irisación</string>
- <string name="Red Hair">Pelirrojo</string>
- <string name="Regular">Regular</string>
- <string name="Right Part">Raya: der.</string>
- <string name="Rosy Complexion">Tez sonrosada</string>
- <string name="Round">Redondear</string>
- <string name="Ruddiness">Rubicundez</string>
- <string name="Ruddy">Rojiza</string>
- <string name="Rumpled Hair">Pelo encrespado</string>
- <string name="Saddle Bags">Cartucheras</string>
- <string name="Scrawny Leg">Piernas flacas</string>
- <string name="Separate">Más ancho</string>
- <string name="Shallow">Sin marcar</string>
- <string name="Shear Back">Nuca: corte</string>
- <string name="Shear Face">Shear Face</string>
- <string name="Shear Front">Shear Front</string>
- <string name="Shear Left Up">Arriba - izq.</string>
- <string name="Shear Right Up">Arriba - der.</string>
- <string name="Sheared Back">Rapada</string>
- <string name="Sheared Front">Rapada</string>
- <string name="Shift Left">A la izq.</string>
- <string name="Shift Mouth">Boca: ladeada</string>
- <string name="Shift Right">A la der.</string>
- <string name="Shirt Bottom">Alto de cintura</string>
- <string name="Shirt Fit">Ceñido</string>
- <string name="Shirt Wrinkles">Camisa: arrugas</string>
- <string name="Shoe Height">Caña: altura</string>
- <string name="Short">Menos</string>
- <string name="Short Arms">Brazos cortos</string>
- <string name="Short Legs">Piernas cortas</string>
- <string name="Short Neck">Cuello corto</string>
- <string name="Short Pigtails">Coletas cortas</string>
- <string name="Short Ponytail">Cola de caballo corta</string>
- <string name="Short Sideburns">Patillas cortas</string>
- <string name="Short Torso">Torso corto</string>
- <string name="Short hips">Cadera corta</string>
- <string name="Shoulders">Hombros</string>
- <string name="Side Fringe">Lados: franja</string>
- <string name="Sideburns">Patillas</string>
- <string name="Sides Hair">Pelo: lados</string>
- <string name="Sides Hair Down">Bajar lados del pelo</string>
- <string name="Sides Hair Up">Subir lados del pelo</string>
- <string name="Skinny Neck">Cuello estrecho</string>
- <string name="Skirt Fit">Falda: vuelo</string>
- <string name="Skirt Length">Falda: largo</string>
- <string name="Slanted Forehead">Slanted Forehead</string>
- <string name="Sleeve Length">Largo de manga</string>
- <string name="Sleeve Looseness">Ancho de puños</string>
- <string name="Slit Back">Raja trasera</string>
- <string name="Slit Front">Raja frontal</string>
- <string name="Slit Left">Raja a la izq.</string>
- <string name="Slit Right">Raja a la der.</string>
- <string name="Small">Disminuir</string>
- <string name="Small Hands">Manos pequeñas</string>
- <string name="Small Head">Cabeza pequeña</string>
- <string name="Smooth">Leves</string>
- <string name="Smooth Hair">Pelo liso</string>
- <string name="Socks Length">Calcetines: largo</string>
- <string name="Soulpatch">Perilla</string>
- <string name="Sparse">Depiladas</string>
- <string name="Spiked Hair">Crestas</string>
- <string name="Square">Cuadrada</string>
- <string name="Square Toe">Punta cuadrada</string>
- <string name="Squash Head">Cabeza aplastada</string>
- <string name="Stretch Head">Cabeza estirada</string>
- <string name="Sunken">Chupadas</string>
- <string name="Sunken Chest">Estrecho de pecho</string>
- <string name="Sunken Eyes">Ojos hundidos</string>
- <string name="Sweep Back">Sweep Back</string>
- <string name="Sweep Forward">Sweep Forward</string>
- <string name="Tall">Más</string>
- <string name="Taper Back">Cubierta trasera</string>
- <string name="Taper Front">Cubierta frontal</string>
- <string name="Thick Heels">Tacones grandes</string>
- <string name="Thick Neck">Cuello ancho</string>
- <string name="Thick Toe">Empeine alto</string>
- <string name="Thin">Delgadas</string>
- <string name="Thin Eyebrows">Cejas finas</string>
- <string name="Thin Lips">Hacia dentro</string>
- <string name="Thin Nose">Nariz fina</string>
- <string name="Tight Chin">Poca papada</string>
- <string name="Tight Cuffs">Sin campana</string>
- <string name="Tight Pants">Pantalón ceñido</string>
- <string name="Tight Shirt">Camisa ceñida</string>
- <string name="Tight Skirt">Falda ceñida</string>
- <string name="Tight Sleeves">Puños ceñidos</string>
- <string name="Toe Shape">Punta: forma</string>
- <string name="Toe Thickness">Empeine</string>
- <string name="Torso Length">Torso: longitud</string>
- <string name="Torso Muscles">Torso: musculatura</string>
- <string name="Torso Scrawny">Torso flacucho</string>
- <string name="Unattached">Largos</string>
- <string name="Uncreased">Abiertos</string>
- <string name="Underbite">Prognatismo</string>
- <string name="Unnatural">No natural</string>
- <string name="Upper Bridge">Puente: arriba</string>
- <string name="Upper Cheeks">Mejillas: arriba</string>
- <string name="Upper Chin Cleft">Barbilla: prominencia</string>
- <string name="Upper Eyelid Fold">Párpados</string>
- <string name="Upturned">Mucho</string>
- <string name="Very Red">Del todo</string>
- <string name="Waist Height">Cintura</string>
- <string name="Well-Fed">Mofletes</string>
- <string name="White Hair">Pelo blanco</string>
- <string name="Wide">Aumentar</string>
- <string name="Wide Back">Completa</string>
- <string name="Wide Front">Completa</string>
- <string name="Wide Lips">Labios anchos</string>
- <string name="Wild">Total</string>
- <string name="Wrinkles">Arrugas</string>
- <string name="LocationCtrlAddLandmarkTooltip">Añadir a mis hitos</string>
- <string name="LocationCtrlEditLandmarkTooltip">Editar mis hitos</string>
- <string name="LocationCtrlInfoBtnTooltip">Ver más información de esta localización</string>
- <string name="LocationCtrlComboBtnTooltip">Historial de mis localizaciones</string>
- <string name="LocationCtrlForSaleTooltip">Comprar este terreno</string>
- <string name="LocationCtrlAdultIconTooltip">Región Adulta</string>
- <string name="LocationCtrlModerateIconTooltip">Región Moderada</string>
- <string name="LocationCtrlGeneralIconTooltip">Región General</string>
- <string name="LocationCtrlSeeAVsTooltip">Los avatares que están en esta parcela no pueden ser vistos ni escuchados por los que están fuera de ella</string>
- <string name="LocationCtrlPathfindingDirtyTooltip">Los objetos que se mueven pueden presentar un comportamiento incorrecto en la región hasta que ésta se recargue.</string>
- <string name="LocationCtrlPathfindingDisabledTooltip">Esta región no tiene activado el pathfinding dinámico.</string>
- <string name="UpdaterWindowTitle">Actualizar [APP_NAME]</string>
- <string name="UpdaterNowUpdating">Actualizando [APP_NAME]...</string>
- <string name="UpdaterNowInstalling">Instalando [APP_NAME]...</string>
- <string name="UpdaterUpdatingDescriptive">Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.</string>
- <string name="UpdaterProgressBarTextWithEllipses">Descargando la actualización...</string>
- <string name="UpdaterProgressBarText">Descargando la actualización</string>
- <string name="UpdaterFailDownloadTitle">Fallo en la descarga de la actualización</string>
- <string name="UpdaterFailUpdateDescriptive">Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.</string>
- <string name="UpdaterFailInstallTitle">Fallo al instalar la actualización</string>
- <string name="UpdaterFailStartTitle">Fallo al iniciar el visor</string>
- <string name="ItemsComingInTooFastFrom">[APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.</string>
- <string name="ItemsComingInTooFast">[APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.</string>
- <string name="IM_logging_string">-- Activado el registro de los mensajes instantáneos --</string>
- <string name="IM_typing_start_string">[NAME] está escribiendo...</string>
- <string name="Unnamed">(sin nombre)</string>
- <string name="IM_moderated_chat_label">(Moderado: por defecto, desactivada la voz)</string>
- <string name="IM_unavailable_text_label">Para esta llamada no está disponible el chat de texto.</string>
- <string name="IM_muted_text_label">Un moderador del grupo ha desactivado tu chat de texto.</string>
- <string name="IM_default_text_label">Pulsa aquí para enviar un mensaje instantáneo.</string>
- <string name="IM_to_label">A</string>
- <string name="IM_moderator_label">(Moderador)</string>
- <string name="Saved_message">(Guardado [LONG_TIMESTAMP])</string>
- <string name="OnlineStatus">Conectado/a</string>
- <string name="OfflineStatus">Desconectado/a</string>
- <string name="not_online_msg">El usuario no está conectado: el mensaje se almacenará para entregárselo más tarde.</string>
- <string name="not_online_inventory">El usuario no está conectado: el inventario se ha guardado.</string>
- <string name="answered_call">Han respondido a tu llamada</string>
- <string name="you_started_call">Has iniciado una llamada de voz</string>
- <string name="you_joined_call">Has entrado en la llamada de voz</string>
- <string name="you_auto_rejected_call-im">Rechazaste la llamada de voz automáticamente porque estaba activado 'No molestar'.</string>
- <string name="name_started_call">[NAME] inició una llamada de voz</string>
- <string name="ringing-im">Haciendo la llamada de voz...</string>
- <string name="connected-im">Conectado, pulsa Colgar para salir</string>
- <string name="hang_up-im">Se colgó la llamada de voz</string>
- <string name="conference-title">Chat multi-persona</string>
- <string name="conference-title-incoming">Conferencia con [AGENT_NAME]</string>
- <string name="inventory_item_offered-im">Ítem del inventario '[ITEM_NAME]' ofrecido</string>
- <string name="inventory_folder_offered-im">Carpeta del inventario '[ITEM_NAME]' ofrecida</string>
- <string name="share_alert">Arrastra los ítems desde el invenbtario hasta aquí</string>
- <string name="facebook_post_success">Has publicado en Facebook.</string>
- <string name="flickr_post_success">Has publicado en Flickr.</string>
- <string name="twitter_post_success">Has publicado en Twitter.</string>
- <string name="no_session_message">(La sesión de MI no existe)</string>
- <string name="only_user_message">Usted es el único usuario en esta sesión.</string>
- <string name="offline_message">[NAME] está desconectado.</string>
- <string name="invite_message">Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.</string>
- <string name="muted_message">Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.</string>
- <string name="generic">Error en lo solicitado, por favor, inténtalo más tarde.</string>
- <string name="generic_request_error">Error al hacer lo solicitado; por favor, inténtelo más tarde.</string>
- <string name="insufficient_perms_error">Usted no tiene permisos suficientes.</string>
- <string name="session_does_not_exist_error">La sesión ya acabó</string>
- <string name="no_ability_error">Usted no tiene esa capacidad.</string>
- <string name="no_ability">Usted no tiene esa capacidad.</string>
- <string name="not_a_mod_error">Usted no es un moderador de la sesión.</string>
- <string name="muted">Un moderador del grupo ha desactivado tu chat de texto.</string>
- <string name="muted_error">Un moderador del grupo le ha desactivado el chat de texto.</string>
- <string name="add_session_event">No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].</string>
- <string name="message">No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].</string>
- <string name="message_session_event">No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].</string>
- <string name="mute">Error moderando.</string>
- <string name="removed">Se te ha sacado del grupo.</string>
- <string name="removed_from_group">Ha sido eliminado del grupo.</string>
- <string name="close_on_no_ability">Usted ya no tendrá más la capacidad de estar en la sesión de chat.</string>
- <string name="unread_chat_single">[SOURCES] ha dicho algo nuevo</string>
- <string name="unread_chat_multiple">[SOURCES] ha dicho algo nuevo</string>
- <string name="session_initialization_timed_out_error">Se ha agotado el tiempo del inicio de sesión</string>
- <string name="Home position set.">Posición inicial establecida.</string>
- <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string>
- <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string>
- <string name="paid_you_ldollars">[NAME] te ha pagado [AMOUNT] L$ [REASON].</string>
- <string name="paid_you_ldollars_gift">[NAME] te ha pagado [AMOUNT] L$: [REASON]</string>
- <string name="paid_you_ldollars_no_reason">[NAME] te ha pagado [AMOUNT] L$.</string>
- <string name="you_paid_ldollars">Has pagado [AMOUNT] L$ a [NAME] por [REASON].</string>
- <string name="you_paid_ldollars_gift">Has pagado [AMOUNT] L$ a [NAME]: [REASON]</string>
- <string name="you_paid_ldollars_no_info">Has pagado[AMOUNT] L$</string>
- <string name="you_paid_ldollars_no_reason">Has pagado [AMOUNT] L$ a [NAME].</string>
- <string name="you_paid_ldollars_no_name">Has pagado [AMOUNT] L$ por [REASON].</string>
- <string name="you_paid_failure_ldollars">No has pagado a [NAME] [AMOUNT] L$ [REASON].</string>
- <string name="you_paid_failure_ldollars_gift">No has pagado a [NAME] [AMOUNT] L$: [REASON]</string>
- <string name="you_paid_failure_ldollars_no_info">No has pagado [AMOUNT] L$.</string>
- <string name="you_paid_failure_ldollars_no_reason">No has pagado a [NAME] [AMOUNT] L$.</string>
- <string name="you_paid_failure_ldollars_no_name">No has pagado [AMOUNT] L$ [REASON].</string>
- <string name="for item">para [ITEM]</string>
- <string name="for a parcel of land">para una parcela de terreno</string>
- <string name="for a land access pass">para un pase de acceso a terrenos</string>
- <string name="for deeding land">for deeding land</string>
- <string name="to create a group">para crear un grupo</string>
- <string name="to join a group">para entrar a un grupo</string>
- <string name="to upload">to upload</string>
- <string name="to publish a classified ad">para publicar un anuncio clasificado</string>
- <string name="giving">Dando [AMOUNT] L$</string>
- <string name="uploading_costs">Subir esto cuesta [AMOUNT] L$</string>
- <string name="this_costs">Esto cuesta [AMOUNT] L$</string>
- <string name="buying_selected_land">Compra del terreno seleccionado por [AMOUNT] L$</string>
- <string name="this_object_costs">Este objeto cuesta [AMOUNT] L$</string>
- <string name="group_role_everyone">Todos</string>
- <string name="group_role_officers">Oficiales</string>
- <string name="group_role_owners">Propietarios</string>
- <string name="group_member_status_online">Conectado/a</string>
- <string name="uploading_abuse_report">Subiendo...
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="5 O'Clock Shadow">
+ Barba del día
+ </string>
+ <string name="All White">
+ Blanco del todo
+ </string>
+ <string name="Anime Eyes">
+ Ojos de cómic
+ </string>
+ <string name="Arced">
+ Arqueadas
+ </string>
+ <string name="Arm Length">
+ Brazos: longitud
+ </string>
+ <string name="Attached">
+ Cortos
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos
+ </string>
+ <string name="Back Fringe">
+ Nuca: largo
+ </string>
+ <string name="Baggy">
+ Marcadas
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Ojos pequeños
+ </string>
+ <string name="Belly Size">
+ Barriga: tamaño
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Culo grande
+ </string>
+ <string name="Big Hair Back">
+ Pelo: moño
+ </string>
+ <string name="Big Hair Front">
+ Pelo: tupé
+ </string>
+ <string name="Big Hair Top">
+ Pelo: melena alta
+ </string>
+ <string name="Big Head">
+ Cabeza grande
+ </string>
+ <string name="Big Pectorals">
+ Grandes pectorales
+ </string>
+ <string name="Big Spikes">
+ Crestas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Rubio
+ </string>
+ <string name="Blonde Hair">
+ Pelo rubio
+ </string>
+ <string name="Blush">
+ Colorete
+ </string>
+ <string name="Blush Color">
+ Color del colorete
+ </string>
+ <string name="Blush Opacity">
+ Opacidad del colorete
+ </string>
+ <string name="Body Definition">
+ Definición del cuerpo
+ </string>
+ <string name="Body Fat">
+ Cuerpo: gordura
+ </string>
+ <string name="Body Freckles">
+ Pecas del cuerpo
+ </string>
+ <string name="Body Thick">
+ Cuerpo grueso
+ </string>
+ <string name="Body Thickness">
+ Cuerpo: grosor
+ </string>
+ <string name="Body Thin">
+ Cuerpo delgado
+ </string>
+ <string name="Bow Legged">
+ Abiertas
+ </string>
+ <string name="Breast Buoyancy">
+ Busto: firmeza
+ </string>
+ <string name="Breast Cleavage">
+ Busto: canalillo
+ </string>
+ <string name="Breast Size">
+ Busto: tamaño
+ </string>
+ <string name="Bridge Width">
+ Puente: ancho
+ </string>
+ <string name="Broad">
+ Aumentar
+ </string>
+ <string name="Brow Size">
+ Arco ciliar
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Ojos saltones
+ </string>
+ <string name="Bulbous">
+ Bulbosa
+ </string>
+ <string name="Bulbous Nose">
+ Nariz de porra
+ </string>
+ <string name="Breast Physics Mass">
+ Masa del busto
+ </string>
+ <string name="Breast Physics Smoothing">
+ Suavizado del busto
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravedad del busto
+ </string>
+ <string name="Breast Physics Drag">
+ Aerodinámica del busto
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Amortiguación
+ </string>
+ <string name="Belly Physics Mass">
+ Masa de la barriga
+ </string>
+ <string name="Belly Physics Smoothing">
+ Suavizado de la barriga
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravedad de la barriga
+ </string>
+ <string name="Belly Physics Drag">
+ Aerodinámica de la barriga
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics Mass">
+ Masa del culo
+ </string>
+ <string name="Butt Physics Smoothing">
+ Suavizado del culo
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravedad del culo
+ </string>
+ <string name="Butt Physics Drag">
+ Aerodinámica del culo
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortiguación
+ </string>
+ <string name="Bushy Eyebrows">
+ Cejijuntas
+ </string>
+ <string name="Bushy Hair">
+ Pelo tupido
+ </string>
+ <string name="Butt Size">
+ Culo: tamaño
+ </string>
+ <string name="Butt Gravity">
+ Gravedad del culo
+ </string>
+ <string name="bustle skirt">
+ Polisón
+ </string>
+ <string name="no bustle">
+ Sin polisón
+ </string>
+ <string name="more bustle">
+ Con polisón
+ </string>
+ <string name="Chaplin">
+ Cortito
+ </string>
+ <string name="Cheek Bones">
+ Pómulos
+ </string>
+ <string name="Chest Size">
+ Tórax: tamaño
+ </string>
+ <string name="Chin Angle">
+ Barbilla: ángulo
+ </string>
+ <string name="Chin Cleft">
+ Barbilla: contorno
+ </string>
+ <string name="Chin Curtains">
+ Barba en collar
+ </string>
+ <string name="Chin Depth">
+ Barbilla: largo
+ </string>
+ <string name="Chin Heavy">
+ Hacia la barbilla
+ </string>
+ <string name="Chin In">
+ Barbilla retraída
+ </string>
+ <string name="Chin Out">
+ Barbilla prominente
+ </string>
+ <string name="Chin-Neck">
+ Papada
+ </string>
+ <string name="Clear">
+ Transparente
+ </string>
+ <string name="Cleft">
+ Remarcar
+ </string>
+ <string name="Close Set Eyes">
+ Ojos juntos
+ </string>
+ <string name="Closed">
+ Cerrar
+ </string>
+ <string name="Closed Back">
+ Trasera cerrada
+ </string>
+ <string name="Closed Front">
+ Frontal cerrado
+ </string>
+ <string name="Closed Left">
+ Cerrada
+ </string>
+ <string name="Closed Right">
+ Cerrada
+ </string>
+ <string name="Coin Purse">
+ Poco abultada
+ </string>
+ <string name="Collar Back">
+ Espalda
+ </string>
+ <string name="Collar Front">
+ Escote
+ </string>
+ <string name="Corner Down">
+ Hacia abajo
+ </string>
+ <string name="Corner Up">
+ Hacia arriba
+ </string>
+ <string name="Creased">
+ Caídos
+ </string>
+ <string name="Crooked Nose">
+ Nariz torcida
+ </string>
+ <string name="Cuff Flare">
+ Acampanado
+ </string>
+ <string name="Dark">
+ Oscuridad
+ </string>
+ <string name="Dark Green">
+ Verde oscuro
+ </string>
+ <string name="Darker">
+ Más oscuros
+ </string>
+ <string name="Deep">
+ Remarcar
+ </string>
+ <string name="Default Heels">
+ Tacones por defecto
+ </string>
+ <string name="Dense">
+ Densas
+ </string>
+ <string name="Double Chin">
+ Mucha papada
+ </string>
+ <string name="Downturned">
+ Poco
+ </string>
+ <string name="Duffle Bag">
+ Muy abultada
+ </string>
+ <string name="Ear Angle">
+ Orejas: ángulo
+ </string>
+ <string name="Ear Size">
+ Orejas: tamaño
+ </string>
+ <string name="Ear Tips">
+ Orejas: forma
+ </string>
+ <string name="Egg Head">
+ Cabeza: ahuevada
+ </string>
+ <string name="Eye Bags">
+ Ojos: bolsas
+ </string>
+ <string name="Eye Color">
+ Ojos: color
+ </string>
+ <string name="Eye Depth">
+ Ojos: profundidad
+ </string>
+ <string name="Eye Lightness">
+ Ojos: brillo
+ </string>
+ <string name="Eye Opening">
+ Ojos: apertura
+ </string>
+ <string name="Eye Pop">
+ Ojos: simetría
+ </string>
+ <string name="Eye Size">
+ Ojos: tamaño
+ </string>
+ <string name="Eye Spacing">
+ Ojos: separación
+ </string>
+ <string name="Eyebrow Arc">
+ Cejas: arco
+ </string>
+ <string name="Eyebrow Density">
+ Cejas: densidad
+ </string>
+ <string name="Eyebrow Height">
+ Cejas: altura
+ </string>
+ <string name="Eyebrow Points">
+ Cejas: en V
+ </string>
+ <string name="Eyebrow Size">
+ Cejas: tamaño
+ </string>
+ <string name="Eyelash Length">
+ Pestañas: longitud
+ </string>
+ <string name="Eyeliner">
+ Contorno de ojos
+ </string>
+ <string name="Eyeliner Color">
+ Contorno de ojos: color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Cara: simetría
+ </string>
+ <string name="Facial Definition">
+ Rasgos marcados
+ </string>
+ <string name="Far Set Eyes">
+ Ojos separados
+ </string>
+ <string name="Fat Lips">
+ Prominentes
+ </string>
+ <string name="Female">
+ Mujer
+ </string>
+ <string name="Fingerless">
+ Sin dedos
+ </string>
+ <string name="Fingers">
+ Con dedos
+ </string>
+ <string name="Flared Cuffs">
+ Campana
+ </string>
+ <string name="Flat">
+ Redondeadas
+ </string>
+ <string name="Flat Butt">
+ Culo plano
+ </string>
+ <string name="Flat Head">
+ Cabeza plana
+ </string>
+ <string name="Flat Toe">
+ Empeine bajo
+ </string>
+ <string name="Foot Size">
+ Pie: tamaño
+ </string>
+ <string name="Forehead Angle">
+ Frente: ángulo
+ </string>
+ <string name="Forehead Heavy">
+ Hacia la frente
+ </string>
+ <string name="Freckles">
+ Pecas
+ </string>
+ <string name="Front Fringe">
+ Flequillo
+ </string>
+ <string name="Full Back">
+ Sin cortar
+ </string>
+ <string name="Full Eyeliner">
+ Contorno completo
+ </string>
+ <string name="Full Front">
+ Sin cortar
+ </string>
+ <string name="Full Hair Sides">
+ Pelo: volumen a los lados
+ </string>
+ <string name="Full Sides">
+ Volumen total
+ </string>
+ <string name="Glossy">
+ Con brillo
+ </string>
+ <string name="Glove Fingers">
+ Guantes: dedos
+ </string>
+ <string name="Glove Length">
+ Guantes: largo
+ </string>
+ <string name="Hair">
+ Pelo
+ </string>
+ <string name="Hair Back">
+ Pelo: nuca
+ </string>
+ <string name="Hair Front">
+ Pelo: delante
+ </string>
+ <string name="Hair Sides">
+ Pelo: lados
+ </string>
+ <string name="Hair Sweep">
+ Peinado: dirección
+ </string>
+ <string name="Hair Thickess">
+ Pelo: espesor
+ </string>
+ <string name="Hair Thickness">
+ Pelo: espesor
+ </string>
+ <string name="Hair Tilt">
+ Pelo: inclinación
+ </string>
+ <string name="Hair Tilted Left">
+ A la izq.
+ </string>
+ <string name="Hair Tilted Right">
+ A la der.
+ </string>
+ <string name="Hair Volume">
+ Pelo: volumen
+ </string>
+ <string name="Hand Size">
+ Manos: tamaño
+ </string>
+ <string name="Handlebars">
+ Muy largo
+ </string>
+ <string name="Head Length">
+ Cabeza: longitud
+ </string>
+ <string name="Head Shape">
+ Cabeza: forma
+ </string>
+ <string name="Head Size">
+ Cabeza: tamaño
+ </string>
+ <string name="Head Stretch">
+ Cabeza: estiramiento
+ </string>
+ <string name="Heel Height">
+ Tacón: altura
+ </string>
+ <string name="Heel Shape">
+ Tacón: forma
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Subir
+ </string>
+ <string name="High Heels">
+ Tacones altos
+ </string>
+ <string name="High Jaw">
+ Mandíbula alta
+ </string>
+ <string name="High Platforms">
+ Suela gorda
+ </string>
+ <string name="High and Tight">
+ Pegada
+ </string>
+ <string name="Higher">
+ Arrriba
+ </string>
+ <string name="Hip Length">
+ Cadera: altura
+ </string>
+ <string name="Hip Width">
+ Cadera: ancho
+ </string>
+ <string name="Hover">
+ Pasa el cursor
+ </string>
+ <string name="In">
+ Pegadas
+ </string>
+ <string name="In Shdw Color">
+ Línea de ojos: color
+ </string>
+ <string name="In Shdw Opacity">
+ Línea de ojos: opacidad
+ </string>
+ <string name="Inner Eye Corner">
+ Ojos: lagrimal
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Línea de ojos
+ </string>
+ <string name="Jacket Length">
+ Chaqueta: largo
+ </string>
+ <string name="Jacket Wrinkles">
+ Chaqueta: arrugas
+ </string>
+ <string name="Jaw Angle">
+ Mandíbula: ángulo
+ </string>
+ <string name="Jaw Jut">
+ Maxilar inferior
+ </string>
+ <string name="Jaw Shape">
+ Mandíbula: forma
+ </string>
+ <string name="Join">
+ Más junto
+ </string>
+ <string name="Jowls">
+ Mofletes
+ </string>
+ <string name="Knee Angle">
+ Rodillas: ángulo
+ </string>
+ <string name="Knock Kneed">
+ Zambas
+ </string>
+ <string name="Large">
+ Aumentar
+ </string>
+ <string name="Large Hands">
+ Manos grandes
+ </string>
+ <string name="Left Part">
+ Raya: izq.
+ </string>
+ <string name="Leg Length">
+ Piernas: longitud
+ </string>
+ <string name="Leg Muscles">
+ Piernas: musculatura
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos tupida
+ </string>
+ <string name="Less Freckles">
+ Menos pecas
+ </string>
+ <string name="Less Full">
+ Menos grosor
+ </string>
+ <string name="Less Gravity">
+ Más levantado
+ </string>
+ <string name="Less Love">
+ Menos michelines
+ </string>
+ <string name="Less Muscles">
+ Pocos músculos
+ </string>
+ <string name="Less Muscular">
+ Poca musculatura
+ </string>
+ <string name="Less Rosy">
+ Menos sonrosada
+ </string>
+ <string name="Less Round">
+ Menos redondeada
+ </string>
+ <string name="Less Saddle">
+ Menos cartucheras
+ </string>
+ <string name="Less Square">
+ Menos cuadrada
+ </string>
+ <string name="Less Volume">
+ Menos volumen
+ </string>
+ <string name="Less soul">
+ Pequeña
+ </string>
+ <string name="Lighter">
+ Más luminosos
+ </string>
+ <string name="Lip Cleft">
+ Labio: hoyuelo
+ </string>
+ <string name="Lip Cleft Depth">
+ Hoyuelo marcado
+ </string>
+ <string name="Lip Fullness">
+ Labios: grosor
+ </string>
+ <string name="Lip Pinkness">
+ Labios sonrosados
+ </string>
+ <string name="Lip Ratio">
+ Labios: ratio
+ </string>
+ <string name="Lip Thickness">
+ Labios: prominencia
+ </string>
+ <string name="Lip Width">
+ Labios: ancho
+ </string>
+ <string name="Lipgloss">
+ Brillo de labios
+ </string>
+ <string name="Lipstick">
+ Barra de labios
+ </string>
+ <string name="Lipstick Color">
+ Barra de labios: color
+ </string>
+ <string name="Long">
+ Más
+ </string>
+ <string name="Long Head">
+ Cabeza alargada
+ </string>
+ <string name="Long Hips">
+ Cadera larga
+ </string>
+ <string name="Long Legs">
+ Piernas largas
+ </string>
+ <string name="Long Neck">
+ Cuello largo
+ </string>
+ <string name="Long Pigtails">
+ Coletas largas
+ </string>
+ <string name="Long Ponytail">
+ Cola de caballo larga
+ </string>
+ <string name="Long Torso">
+ Torso largo
+ </string>
+ <string name="Long arms">
+ Brazos largos
+ </string>
+ <string name="Loose Pants">
+ Pantalón suelto
+ </string>
+ <string name="Loose Shirt">
+ Camiseta suelta
+ </string>
+ <string name="Loose Sleeves">
+ Puños anchos
+ </string>
+ <string name="Love Handles">
+ Michelines
+ </string>
+ <string name="Low">
+ Bajar
+ </string>
+ <string name="Low Heels">
+ Tacones bajos
+ </string>
+ <string name="Low Jaw">
+ Mandíbula baja
+ </string>
+ <string name="Low Platforms">
+ Suela fina
+ </string>
+ <string name="Low and Loose">
+ Suelta
+ </string>
+ <string name="Lower">
+ Abajo
+ </string>
+ <string name="Lower Bridge">
+ Puente: abajo
+ </string>
+ <string name="Lower Cheeks">
+ Mejillas: abajo
+ </string>
+ <string name="Male">
+ Varón
+ </string>
+ <string name="Middle Part">
+ Raya: en medio
+ </string>
+ <string name="More">
+ Más
+ </string>
+ <string name="More Blush">
+ Más colorete
+ </string>
+ <string name="More Body Fat">
+ Más gordura
+ </string>
+ <string name="More Curtains">
+ Más tupida
+ </string>
+ <string name="More Eyeshadow">
+ Más
+ </string>
+ <string name="More Freckles">
+ Más pecas
+ </string>
+ <string name="More Full">
+ Más grosor
+ </string>
+ <string name="More Gravity">
+ Menos levantado
+ </string>
+ <string name="More Lipstick">
+ Más barra de labios
+ </string>
+ <string name="More Love">
+ Más michelines
+ </string>
+ <string name="More Lower Lip">
+ Más el inferior
+ </string>
+ <string name="More Muscles">
+ Más músculos
+ </string>
+ <string name="More Muscular">
+ Más musculatura
+ </string>
+ <string name="More Rosy">
+ Más sonrosada
+ </string>
+ <string name="More Round">
+ Más redondeada
+ </string>
+ <string name="More Saddle">
+ Más cartucheras
+ </string>
+ <string name="More Sloped">
+ Más inclinada
+ </string>
+ <string name="More Square">
+ Más cuadrada
+ </string>
+ <string name="More Upper Lip">
+ Más el superior
+ </string>
+ <string name="More Vertical">
+ Más recta
+ </string>
+ <string name="More Volume">
+ Más volumen
+ </string>
+ <string name="More soul">
+ Grande
+ </string>
+ <string name="Moustache">
+ Bigote
+ </string>
+ <string name="Mouth Corner">
+ Comisuras
+ </string>
+ <string name="Mouth Position">
+ Boca: posición
+ </string>
+ <string name="Mowhawk">
+ Rapado
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Patillas largas
+ </string>
+ <string name="Nail Polish">
+ Uñas pintadas
+ </string>
+ <string name="Nail Polish Color">
+ Uñas pintadas: color
+ </string>
+ <string name="Narrow">
+ Disminuir
+ </string>
+ <string name="Narrow Back">
+ Rapada
+ </string>
+ <string name="Narrow Front">
+ Entradas
+ </string>
+ <string name="Narrow Lips">
+ Labios estrechos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Cuello: longitud
+ </string>
+ <string name="Neck Thickness">
+ Cuello: grosor
+ </string>
+ <string name="No Blush">
+ Sin colorete
+ </string>
+ <string name="No Eyeliner">
+ Sin contorno
+ </string>
+ <string name="No Eyeshadow">
+ Menos
+ </string>
+ <string name="No Lipgloss">
+ Sin brillo
+ </string>
+ <string name="No Lipstick">
+ Sin barra de labios
+ </string>
+ <string name="No Part">
+ Sin raya
+ </string>
+ <string name="No Polish">
+ Sin pintar
+ </string>
+ <string name="No Red">
+ Nada
+ </string>
+ <string name="No Spikes">
+ Sin crestas
+ </string>
+ <string name="No White">
+ Sin blanco
+ </string>
+ <string name="No Wrinkles">
+ Sin arrugas
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nariz a la izq.
+ </string>
+ <string name="Nose Right">
+ Nariz a la der.
+ </string>
+ <string name="Nose Size">
+ Nariz: tamaño
+ </string>
+ <string name="Nose Thickness">
+ Nariz: grosor
+ </string>
+ <string name="Nose Tip Angle">
+ Nariz: respingona
+ </string>
+ <string name="Nose Tip Shape">
+ Nariz: punta
+ </string>
+ <string name="Nose Width">
+ Nariz: ancho
+ </string>
+ <string name="Nostril Division">
+ Ventana: altura
+ </string>
+ <string name="Nostril Width">
+ Ventana: ancho
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Apertura trasera
+ </string>
+ <string name="Open Front">
+ Apertura frontal
+ </string>
+ <string name="Open Left">
+ Abierta
+ </string>
+ <string name="Open Right">
+ Abierta
+ </string>
+ <string name="Orange">
+ Anaranjado
+ </string>
+ <string name="Out">
+ De soplillo
+ </string>
+ <string name="Out Shdw Color">
+ Sombra de ojos: color
+ </string>
+ <string name="Out Shdw Opacity">
+ Sombra de ojos: opacidad
+ </string>
+ <string name="Outer Eye Corner">
+ Ojos: comisura
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Sombra de ojos
+ </string>
+ <string name="Overbite">
+ Retraído
+ </string>
+ <string name="Package">
+ Pubis
+ </string>
+ <string name="Painted Nails">
+ Pintadas
+ </string>
+ <string name="Pale">
+ Pálida
+ </string>
+ <string name="Pants Crotch">
+ Pantalón: cruz
+ </string>
+ <string name="Pants Fit">
+ Ceñido
+ </string>
+ <string name="Pants Length">
+ Pernera: largo
+ </string>
+ <string name="Pants Waist">
+ Caja
+ </string>
+ <string name="Pants Wrinkles">
+ Pantalón: arrugas
+ </string>
+ <string name="Part">
+ Raya
+ </string>
+ <string name="Part Bangs">
+ Flequillo partido
+ </string>
+ <string name="Pectorals">
+ Pectorales
+ </string>
+ <string name="Pigment">
+ Tono
+ </string>
+ <string name="Pigtails">
+ Coletas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Más sonrosados
+ </string>
+ <string name="Platform Height">
+ Suela: altura
+ </string>
+ <string name="Platform Width">
+ Suela: ancho
+ </string>
+ <string name="Pointy">
+ En punta
+ </string>
+ <string name="Pointy Heels">
+ De aguja
+ </string>
+ <string name="Ponytail">
+ Cola de caballo
+ </string>
+ <string name="Poofy Skirt">
+ Con vuelo
+ </string>
+ <string name="Pop Left Eye">
+ Izquierdo más grande
+ </string>
+ <string name="Pop Right Eye">
+ Derecho más grande
+ </string>
+ <string name="Puffy">
+ Hinchadas
+ </string>
+ <string name="Puffy Eyelids">
+ Ojeras
+ </string>
+ <string name="Rainbow Color">
+ Irisación
+ </string>
+ <string name="Red Hair">
+ Pelirrojo
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Right Part">
+ Raya: der.
+ </string>
+ <string name="Rosy Complexion">
+ Tez sonrosada
+ </string>
+ <string name="Round">
+ Redondear
+ </string>
+ <string name="Ruddiness">
+ Rubicundez
+ </string>
+ <string name="Ruddy">
+ Rojiza
+ </string>
+ <string name="Rumpled Hair">
+ Pelo encrespado
+ </string>
+ <string name="Saddle Bags">
+ Cartucheras
+ </string>
+ <string name="Scrawny Leg">
+ Piernas flacas
+ </string>
+ <string name="Separate">
+ Más ancho
+ </string>
+ <string name="Shallow">
+ Sin marcar
+ </string>
+ <string name="Shear Back">
+ Nuca: corte
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left Up">
+ Arriba - izq.
+ </string>
+ <string name="Shear Right Up">
+ Arriba - der.
+ </string>
+ <string name="Sheared Back">
+ Rapada
+ </string>
+ <string name="Sheared Front">
+ Rapada
+ </string>
+ <string name="Shift Left">
+ A la izq.
+ </string>
+ <string name="Shift Mouth">
+ Boca: ladeada
+ </string>
+ <string name="Shift Right">
+ A la der.
+ </string>
+ <string name="Shirt Bottom">
+ Alto de cintura
+ </string>
+ <string name="Shirt Fit">
+ Ceñido
+ </string>
+ <string name="Shirt Wrinkles">
+ Camisa: arrugas
+ </string>
+ <string name="Shoe Height">
+ Caña: altura
+ </string>
+ <string name="Short">
+ Menos
+ </string>
+ <string name="Short Arms">
+ Brazos cortos
+ </string>
+ <string name="Short Legs">
+ Piernas cortas
+ </string>
+ <string name="Short Neck">
+ Cuello corto
+ </string>
+ <string name="Short Pigtails">
+ Coletas cortas
+ </string>
+ <string name="Short Ponytail">
+ Cola de caballo corta
+ </string>
+ <string name="Short Sideburns">
+ Patillas cortas
+ </string>
+ <string name="Short Torso">
+ Torso corto
+ </string>
+ <string name="Short hips">
+ Cadera corta
+ </string>
+ <string name="Shoulders">
+ Hombros
+ </string>
+ <string name="Side Fringe">
+ Lados: franja
+ </string>
+ <string name="Sideburns">
+ Patillas
+ </string>
+ <string name="Sides Hair">
+ Pelo: lados
+ </string>
+ <string name="Sides Hair Down">
+ Bajar lados del pelo
+ </string>
+ <string name="Sides Hair Up">
+ Subir lados del pelo
+ </string>
+ <string name="Skinny Neck">
+ Cuello estrecho
+ </string>
+ <string name="Skirt Fit">
+ Falda: vuelo
+ </string>
+ <string name="Skirt Length">
+ Falda: largo
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Largo de manga
+ </string>
+ <string name="Sleeve Looseness">
+ Ancho de puños
+ </string>
+ <string name="Slit Back">
+ Raja trasera
+ </string>
+ <string name="Slit Front">
+ Raja frontal
+ </string>
+ <string name="Slit Left">
+ Raja a la izq.
+ </string>
+ <string name="Slit Right">
+ Raja a la der.
+ </string>
+ <string name="Small">
+ Disminuir
+ </string>
+ <string name="Small Hands">
+ Manos pequeñas
+ </string>
+ <string name="Small Head">
+ Cabeza pequeña
+ </string>
+ <string name="Smooth">
+ Leves
+ </string>
+ <string name="Smooth Hair">
+ Pelo liso
+ </string>
+ <string name="Socks Length">
+ Calcetines: largo
+ </string>
+ <string name="Soulpatch">
+ Perilla
+ </string>
+ <string name="Sparse">
+ Depiladas
+ </string>
+ <string name="Spiked Hair">
+ Crestas
+ </string>
+ <string name="Square">
+ Cuadrada
+ </string>
+ <string name="Square Toe">
+ Punta cuadrada
+ </string>
+ <string name="Squash Head">
+ Cabeza aplastada
+ </string>
+ <string name="Stretch Head">
+ Cabeza estirada
+ </string>
+ <string name="Sunken">
+ Chupadas
+ </string>
+ <string name="Sunken Chest">
+ Estrecho de pecho
+ </string>
+ <string name="Sunken Eyes">
+ Ojos hundidos
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Más
+ </string>
+ <string name="Taper Back">
+ Cubierta trasera
+ </string>
+ <string name="Taper Front">
+ Cubierta frontal
+ </string>
+ <string name="Thick Heels">
+ Tacones grandes
+ </string>
+ <string name="Thick Neck">
+ Cuello ancho
+ </string>
+ <string name="Thick Toe">
+ Empeine alto
+ </string>
+ <string name="Thin">
+ Delgadas
+ </string>
+ <string name="Thin Eyebrows">
+ Cejas finas
+ </string>
+ <string name="Thin Lips">
+ Hacia dentro
+ </string>
+ <string name="Thin Nose">
+ Nariz fina
+ </string>
+ <string name="Tight Chin">
+ Poca papada
+ </string>
+ <string name="Tight Cuffs">
+ Sin campana
+ </string>
+ <string name="Tight Pants">
+ Pantalón ceñido
+ </string>
+ <string name="Tight Shirt">
+ Camisa ceñida
+ </string>
+ <string name="Tight Skirt">
+ Falda ceñida
+ </string>
+ <string name="Tight Sleeves">
+ Puños ceñidos
+ </string>
+ <string name="Toe Shape">
+ Punta: forma
+ </string>
+ <string name="Toe Thickness">
+ Empeine
+ </string>
+ <string name="Torso Length">
+ Torso: longitud
+ </string>
+ <string name="Torso Muscles">
+ Torso: musculatura
+ </string>
+ <string name="Torso Scrawny">
+ Torso flacucho
+ </string>
+ <string name="Unattached">
+ Largos
+ </string>
+ <string name="Uncreased">
+ Abiertos
+ </string>
+ <string name="Underbite">
+ Prognatismo
+ </string>
+ <string name="Unnatural">
+ No natural
+ </string>
+ <string name="Upper Bridge">
+ Puente: arriba
+ </string>
+ <string name="Upper Cheeks">
+ Mejillas: arriba
+ </string>
+ <string name="Upper Chin Cleft">
+ Barbilla: prominencia
+ </string>
+ <string name="Upper Eyelid Fold">
+ Párpados
+ </string>
+ <string name="Upturned">
+ Mucho
+ </string>
+ <string name="Very Red">
+ Del todo
+ </string>
+ <string name="Waist Height">
+ Cintura
+ </string>
+ <string name="Well-Fed">
+ Mofletes
+ </string>
+ <string name="White Hair">
+ Pelo blanco
+ </string>
+ <string name="Wide">
+ Aumentar
+ </string>
+ <string name="Wide Back">
+ Completa
+ </string>
+ <string name="Wide Front">
+ Completa
+ </string>
+ <string name="Wide Lips">
+ Labios anchos
+ </string>
+ <string name="Wild">
+ Total
+ </string>
+ <string name="Wrinkles">
+ Arrugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Añadir a mis hitos
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar mis hitos
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver más información de esta localización
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historial de mis localizaciones
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Comprar este terreno
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Región Adulta
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Región Moderada
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Región General
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Los avatares que están en esta parcela no pueden ser vistos ni escuchados por los que están fuera de ella
+ </string>
+ <string name="LocationCtrlPathfindingDirtyTooltip">
+ Los objetos que se mueven pueden presentar un comportamiento incorrecto en la región hasta que ésta se recargue.
+ </string>
+ <string name="LocationCtrlPathfindingDisabledTooltip">
+ Esta región no tiene activado el pathfinding dinámico.
+ </string>
+ <string name="UpdaterWindowTitle">
+ Actualizar [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ Actualizando [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Descargando la actualización...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Descargando la actualización
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Fallo en la descarga de la actualización
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Fallo al instalar la actualización
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Fallo al iniciar el visor
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="IM_logging_string">
+ -- Activado el registro de los mensajes instantáneos --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está escribiendo...
+ </string>
+ <string name="Unnamed">
+ (sin nombre)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: por defecto, desactivada la voz)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Para esta llamada no está disponible el chat de texto.
+ </string>
+ <string name="IM_muted_text_label">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="IM_default_text_label">
+ Pulsa aquí para enviar un mensaje instantáneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
+ </string>
+ <string name="Saved_message">
+ (Guardado [LONG_TIMESTAMP])
+ </string>
+ <string name="OnlineStatus">
+ Conectado/a
+ </string>
+ <string name="OfflineStatus">
+ Desconectado/a
+ </string>
+ <string name="not_online_msg">
+ El usuario no está conectado: el mensaje se almacenará para entregárselo más tarde.
+ </string>
+ <string name="not_online_inventory">
+ El usuario no está conectado: el inventario se ha guardado.
+ </string>
+ <string name="answered_call">
+ Han respondido a tu llamada
+ </string>
+ <string name="you_started_call">
+ Has iniciado una llamada de voz
+ </string>
+ <string name="you_joined_call">
+ Has entrado en la llamada de voz
+ </string>
+ <string name="you_auto_rejected_call-im">
+ Rechazaste la llamada de voz automáticamente porque estaba activado 'No molestar'.
+ </string>
+ <string name="name_started_call">
+ [NAME] inició una llamada de voz
+ </string>
+ <string name="ringing-im">
+ Haciendo la llamada de voz...
+ </string>
+ <string name="connected-im">
+ Conectado, pulsa Colgar para salir
+ </string>
+ <string name="hang_up-im">
+ Se colgó la llamada de voz
+ </string>
+ <string name="conference-title">
+ Chat multi-persona
+ </string>
+ <string name="conference-title-incoming">
+ Conferencia con [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Ítem del inventario '[ITEM_NAME]' ofrecido
+ </string>
+ <string name="inventory_folder_offered-im">
+ Carpeta del inventario '[ITEM_NAME]' ofrecida
+ </string>
+ <string name="bot_warning">
+ Estás conversando con un bot, [NAME]. No compartas información personal.
+Más información en https://second.life/scripted-agents.
+ </string>
+ <string name="share_alert">
+ Arrastra los ítems desde el invenbtario hasta aquí
+ </string>
+ <string name="facebook_post_success">
+ Has publicado en Facebook.
+ </string>
+ <string name="flickr_post_success">
+ Has publicado en Flickr.
+ </string>
+ <string name="twitter_post_success">
+ Has publicado en Twitter.
+ </string>
+ <string name="no_session_message">
+ (La sesión de MI no existe)
+ </string>
+ <string name="only_user_message">
+ Usted es el único usuario en esta sesión.
+ </string>
+ <string name="offline_message">
+ [NAME] está desconectado.
+ </string>
+ <string name="invite_message">
+ Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
+ </string>
+ <string name="muted_message">
+ Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
+ </string>
+ <string name="generic">
+ Error en lo solicitado, por favor, inténtalo más tarde.
+ </string>
+ <string name="generic_request_error">
+ Error al hacer lo solicitado; por favor, inténtelo más tarde.
+ </string>
+ <string name="insufficient_perms_error">
+ Usted no tiene permisos suficientes.
+ </string>
+ <string name="session_does_not_exist_error">
+ La sesión ya acabó
+ </string>
+ <string name="no_ability_error">
+ Usted no tiene esa capacidad.
+ </string>
+ <string name="no_ability">
+ Usted no tiene esa capacidad.
+ </string>
+ <string name="not_a_mod_error">
+ Usted no es un moderador de la sesión.
+ </string>
+ <string name="muted">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="muted_error">
+ Un moderador del grupo le ha desactivado el chat de texto.
+ </string>
+ <string name="add_session_event">
+ No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="message">
+ No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="mute">
+ Error moderando.
+ </string>
+ <string name="removed">
+ Se te ha sacado del grupo.
+ </string>
+ <string name="removed_from_group">
+ Ha sido eliminado del grupo.
+ </string>
+ <string name="close_on_no_ability">
+ Usted ya no tendrá más la capacidad de estar en la sesión de chat.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Se ha agotado el tiempo del inicio de sesión
+ </string>
+ <string name="Home position set.">
+ Posición inicial establecida.
+ </string>
+ <string name="voice_morphing_url">
+ https://secondlife.com/destination/voice-island
+ </string>
+ <string name="premium_voice_morphing_url">
+ https://secondlife.com/destination/voice-morphing-premium
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] te ha pagado [AMOUNT] L$ [REASON].
+ </string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] te ha pagado [AMOUNT] L$: [REASON]
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] te ha pagado [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars">
+ Has pagado [AMOUNT] L$ a [NAME] por [REASON].
+ </string>
+ <string name="you_paid_ldollars_gift">
+ Has pagado [AMOUNT] L$ a [NAME]: [REASON]
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Has pagado[AMOUNT] L$
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Has pagado [AMOUNT] L$ a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Has pagado [AMOUNT] L$ por [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ No has pagado a [NAME] [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_gift">
+ No has pagado a [NAME] [AMOUNT] L$: [REASON]
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ No has pagado [AMOUNT] L$.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ No has pagado a [NAME] [AMOUNT] L$.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ No has pagado [AMOUNT] L$ [REASON].
+ </string>
+ <string name="for item">
+ para [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ para una parcela de terreno
+ </string>
+ <string name="for a land access pass">
+ para un pase de acceso a terrenos
+ </string>
+ <string name="for deeding land">
+ for deeding land
+ </string>
+ <string name="to create a group">
+ para crear un grupo
+ </string>
+ <string name="to join a group">
+ para entrar a un grupo
+ </string>
+ <string name="to upload">
+ to upload
+ </string>
+ <string name="to publish a classified ad">
+ para publicar un anuncio clasificado
+ </string>
+ <string name="giving">
+ Dando [AMOUNT] L$
+ </string>
+ <string name="uploading_costs">
+ Subir esto cuesta [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Esto cuesta [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Compra del terreno seleccionado por [AMOUNT] L$
+ </string>
+ <string name="this_object_costs">
+ Este objeto cuesta [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Todos
+ </string>
+ <string name="group_role_officers">
+ Oficiales
+ </string>
+ <string name="group_role_owners">
+ Propietarios
+ </string>
+ <string name="group_member_status_online">
+ Conectado/a
+ </string>
+ <string name="uploading_abuse_report">
+ Subiendo...
-Denuncia de infracción</string>
- <string name="New Shape">Anatomía nueva</string>
- <string name="New Skin">Piel nueva</string>
- <string name="New Hair">Pelo nuevo</string>
- <string name="New Eyes">Ojos nuevos</string>
- <string name="New Shirt">Camisa nueva</string>
- <string name="New Pants">Pantalón nuevo</string>
- <string name="New Shoes">Zapatos nuevos</string>
- <string name="New Socks">Calcetines nuevos</string>
- <string name="New Jacket">Chaqueta nueva</string>
- <string name="New Gloves">Guantes nuevos</string>
- <string name="New Undershirt">Camiseta nueva</string>
- <string name="New Underpants">Ropa interior nueva</string>
- <string name="New Skirt">Falda nueva</string>
- <string name="New Alpha">Nueva Alfa</string>
- <string name="New Tattoo">Tatuaje nuevo</string>
- <string name="New Universal">Nuevo Universal</string>
- <string name="New Physics">Nueva física</string>
- <string name="Invalid Wearable">No se puede poner</string>
- <string name="New Gesture">Gesto nuevo</string>
- <string name="New Script">Script nuevo</string>
- <string name="New Note">Nota nueva</string>
- <string name="New Folder">Carpeta nueva</string>
- <string name="Contents">Contenidos</string>
- <string name="Gesture">Gestos</string>
- <string name="Male Gestures">Gestos de hombre</string>
- <string name="Female Gestures">Gestos de mujer</string>
- <string name="Other Gestures">Otros gestos</string>
- <string name="Speech Gestures">Gestos al hablar</string>
- <string name="Common Gestures">Gestos corrientes</string>
- <string name="Male - Excuse me">Varón - Disculpa</string>
- <string name="Male - Get lost">Varón – Déjame en paz</string>
- <string name="Male - Blow kiss">Varón - Lanzar un beso</string>
- <string name="Male - Boo">Varón - Abucheo</string>
- <string name="Male - Bored">Varón - Aburrido</string>
- <string name="Male - Hey">Varón – ¡Eh!</string>
- <string name="Male - Laugh">Varón - Risa</string>
- <string name="Male - Repulsed">Varón - Rechazo</string>
- <string name="Male - Shrug">Varón - Encogimiento de hombros</string>
- <string name="Male - Stick tougue out">Hombre - Sacando la lengua</string>
- <string name="Male - Wow">Varón - Admiración</string>
- <string name="Female - Chuckle">Mujer - Risa suave</string>
- <string name="Female - Cry">Mujer - Llorar</string>
- <string name="Female - Embarrassed">Mujer - Ruborizada</string>
- <string name="Female - Excuse me">Mujer - Disculpa</string>
- <string name="Female - Get lost">Mujer – Déjame en paz</string>
- <string name="Female - Blow kiss">Mujer - Lanzar un beso</string>
- <string name="Female - Boo">Mujer - Abucheo</string>
- <string name="Female - Bored">Mujer - Aburrida</string>
- <string name="Female - Hey">Mujer - ¡Eh!</string>
- <string name="Female - Hey baby">Mujer - ¡Eh, encanto!</string>
- <string name="Female - Laugh">Mujer - Risa</string>
- <string name="Female - Looking good">Mujer - Buen aspecto</string>
- <string name="Female - Over here">Mujer - Por aquí</string>
- <string name="Female - Please">Mujer - Por favor</string>
- <string name="Female - Repulsed">Mujer - Rechazo</string>
- <string name="Female - Shrug">Mujer - Encogimiento de hombros</string>
- <string name="Female - Stick tougue out">Mujer - Sacando la lengua</string>
- <string name="Female - Wow">Mujer - Admiración</string>
- <string name="New Daycycle">Nuevo Ciclo del día</string>
- <string name="New Water">Nueva Agua</string>
- <string name="New Sky">Nuevo Cielo</string>
- <string name="/bow">/reverencia</string>
- <string name="/clap">/aplaudir</string>
- <string name="/count">/contar</string>
- <string name="/extinguish">/apagar</string>
- <string name="/kmb">/bmc</string>
- <string name="/muscle">/músculo</string>
- <string name="/no">/no</string>
- <string name="/no!">/¡no!</string>
- <string name="/paper">/papel</string>
- <string name="/pointme">/señalarme</string>
- <string name="/pointyou">/señalarte</string>
- <string name="/rock">/piedra</string>
- <string name="/scissor">/tijera</string>
- <string name="/smoke">/fumar</string>
- <string name="/stretch">/estirar</string>
- <string name="/whistle">/silbar</string>
- <string name="/yes">/sí</string>
- <string name="/yes!">/¡sí!</string>
- <string name="afk">ausente</string>
- <string name="dance1">baile1</string>
- <string name="dance2">baile2</string>
- <string name="dance3">baile3</string>
- <string name="dance4">baile4</string>
- <string name="dance5">baile5</string>
- <string name="dance6">baile6</string>
- <string name="dance7">baile7</string>
- <string name="dance8">baile8</string>
- <string name="AvatarBirthDateFormat">[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]</string>
- <string name="DefaultMimeType">ninguno/ninguno</string>
- <string name="texture_load_dimensions_error">No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]</string>
- <string name="outfit_photo_load_dimensions_error">La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Cambia el tamaño o utiliza otra imagen</string>
- <string name="outfit_photo_select_dimensions_error">La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Selecciona otra textura</string>
- <string name="outfit_photo_verify_dimensions_error">No se pueden verificar las dimensiones de la foto. Espera hasta que aparezca el tamaño de la foto en el selector</string>
+Denuncia de infracción
+ </string>
+ <string name="New Shape">
+ Anatomía nueva
+ </string>
+ <string name="New Skin">
+ Piel nueva
+ </string>
+ <string name="New Hair">
+ Pelo nuevo
+ </string>
+ <string name="New Eyes">
+ Ojos nuevos
+ </string>
+ <string name="New Shirt">
+ Camisa nueva
+ </string>
+ <string name="New Pants">
+ Pantalón nuevo
+ </string>
+ <string name="New Shoes">
+ Zapatos nuevos
+ </string>
+ <string name="New Socks">
+ Calcetines nuevos
+ </string>
+ <string name="New Jacket">
+ Chaqueta nueva
+ </string>
+ <string name="New Gloves">
+ Guantes nuevos
+ </string>
+ <string name="New Undershirt">
+ Camiseta nueva
+ </string>
+ <string name="New Underpants">
+ Ropa interior nueva
+ </string>
+ <string name="New Skirt">
+ Falda nueva
+ </string>
+ <string name="New Alpha">
+ Nueva Alfa
+ </string>
+ <string name="New Tattoo">
+ Tatuaje nuevo
+ </string>
+ <string name="New Universal">
+ Nuevo Universal
+ </string>
+ <string name="New Physics">
+ Nueva física
+ </string>
+ <string name="Invalid Wearable">
+ No se puede poner
+ </string>
+ <string name="New Gesture">
+ Gesto nuevo
+ </string>
+ <string name="New Script">
+ Script nuevo
+ </string>
+ <string name="New Note">
+ Nota nueva
+ </string>
+ <string name="New Folder">
+ Carpeta nueva
+ </string>
+ <string name="Contents">
+ Contenidos
+ </string>
+ <string name="Gesture">
+ Gestos
+ </string>
+ <string name="Male Gestures">
+ Gestos de hombre
+ </string>
+ <string name="Female Gestures">
+ Gestos de mujer
+ </string>
+ <string name="Other Gestures">
+ Otros gestos
+ </string>
+ <string name="Speech Gestures">
+ Gestos al hablar
+ </string>
+ <string name="Common Gestures">
+ Gestos corrientes
+ </string>
+ <string name="Male - Excuse me">
+ Varón - Disculpa
+ </string>
+ <string name="Male - Get lost">
+ Varón – Déjame en paz
+ </string>
+ <string name="Male - Blow kiss">
+ Varón - Lanzar un beso
+ </string>
+ <string name="Male - Boo">
+ Varón - Abucheo
+ </string>
+ <string name="Male - Bored">
+ Varón - Aburrido
+ </string>
+ <string name="Male - Hey">
+ Varón – ¡Eh!
+ </string>
+ <string name="Male - Laugh">
+ Varón - Risa
+ </string>
+ <string name="Male - Repulsed">
+ Varón - Rechazo
+ </string>
+ <string name="Male - Shrug">
+ Varón - Encogimiento de hombros
+ </string>
+ <string name="Male - Stick tougue out">
+ Hombre - Sacando la lengua
+ </string>
+ <string name="Male - Wow">
+ Varón - Admiración
+ </string>
+ <string name="Female - Chuckle">
+ Mujer - Risa suave
+ </string>
+ <string name="Female - Cry">
+ Mujer - Llorar
+ </string>
+ <string name="Female - Embarrassed">
+ Mujer - Ruborizada
+ </string>
+ <string name="Female - Excuse me">
+ Mujer - Disculpa
+ </string>
+ <string name="Female - Get lost">
+ Mujer – Déjame en paz
+ </string>
+ <string name="Female - Blow kiss">
+ Mujer - Lanzar un beso
+ </string>
+ <string name="Female - Boo">
+ Mujer - Abucheo
+ </string>
+ <string name="Female - Bored">
+ Mujer - Aburrida
+ </string>
+ <string name="Female - Hey">
+ Mujer - ¡Eh!
+ </string>
+ <string name="Female - Hey baby">
+ Mujer - ¡Eh, encanto!
+ </string>
+ <string name="Female - Laugh">
+ Mujer - Risa
+ </string>
+ <string name="Female - Looking good">
+ Mujer - Buen aspecto
+ </string>
+ <string name="Female - Over here">
+ Mujer - Por aquí
+ </string>
+ <string name="Female - Please">
+ Mujer - Por favor
+ </string>
+ <string name="Female - Repulsed">
+ Mujer - Rechazo
+ </string>
+ <string name="Female - Shrug">
+ Mujer - Encogimiento de hombros
+ </string>
+ <string name="Female - Stick tougue out">
+ Mujer - Sacando la lengua
+ </string>
+ <string name="Female - Wow">
+ Mujer - Admiración
+ </string>
+ <string name="New Daycycle">
+ Nuevo Ciclo del día
+ </string>
+ <string name="New Water">
+ Nueva Agua
+ </string>
+ <string name="New Sky">
+ Nuevo Cielo
+ </string>
+ <string name="/bow">
+ /reverencia
+ </string>
+ <string name="/clap">
+ /aplaudir
+ </string>
+ <string name="/count">
+ /contar
+ </string>
+ <string name="/extinguish">
+ /apagar
+ </string>
+ <string name="/kmb">
+ /bmc
+ </string>
+ <string name="/muscle">
+ /músculo
+ </string>
+ <string name="/no">
+ /no
+ </string>
+ <string name="/no!">
+ /¡no!
+ </string>
+ <string name="/paper">
+ /papel
+ </string>
+ <string name="/pointme">
+ /señalarme
+ </string>
+ <string name="/pointyou">
+ /señalarte
+ </string>
+ <string name="/rock">
+ /piedra
+ </string>
+ <string name="/scissor">
+ /tijera
+ </string>
+ <string name="/smoke">
+ /fumar
+ </string>
+ <string name="/stretch">
+ /estirar
+ </string>
+ <string name="/whistle">
+ /silbar
+ </string>
+ <string name="/yes">
+ /sí
+ </string>
+ <string name="/yes!">
+ /¡sí!
+ </string>
+ <string name="afk">
+ ausente
+ </string>
+ <string name="dance1">
+ baile1
+ </string>
+ <string name="dance2">
+ baile2
+ </string>
+ <string name="dance3">
+ baile3
+ </string>
+ <string name="dance4">
+ baile4
+ </string>
+ <string name="dance5">
+ baile5
+ </string>
+ <string name="dance6">
+ baile6
+ </string>
+ <string name="dance7">
+ baile7
+ </string>
+ <string name="dance8">
+ baile8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ninguno/ninguno
+ </string>
+ <string name="texture_load_dimensions_error">
+ No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
+ </string>
+ <string name="outfit_photo_load_dimensions_error">
+ La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Cambia el tamaño o utiliza otra imagen
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Selecciona otra textura
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ No se pueden verificar las dimensiones de la foto. Espera hasta que aparezca el tamaño de la foto en el selector
+ </string>
<string name="words_separator" value=","/>
- <string name="server_is_down">Parece que hay algún problema que ha escapado a nuestros controles.
+ <string name="server_is_down">
+ Parece que hay algún problema que ha escapado a nuestros controles.
Visita http://status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
- Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.</string>
- <string name="dateTimeWeekdaysNames">Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado</string>
- <string name="dateTimeWeekdaysShortNames">Dom:Lun:Mar:Mié:Jue:Vie:Sáb</string>
- <string name="dateTimeMonthNames">Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre</string>
- <string name="dateTimeMonthShortNames">Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic</string>
- <string name="dateTimeDayFormat">[MDAY]</string>
- <string name="dateTimeAM">AM</string>
- <string name="dateTimePM">PM</string>
- <string name="LocalEstimateUSD">[AMOUNT] US$</string>
- <string name="Group Ban">Expulsión de grupo</string>
- <string name="Membership">Membresía</string>
- <string name="Roles">Roles</string>
- <string name="Group Identity">Indentidad de grupo</string>
- <string name="Parcel Management">Gestión de la parcela</string>
- <string name="Parcel Identity">Identidad de la parcela</string>
- <string name="Parcel Settings">Configuración de la parcela</string>
- <string name="Parcel Powers">Poder de la parcela</string>
- <string name="Parcel Access">Acceso a la parcela</string>
- <string name="Parcel Content">Contenido de la parcela</string>
- <string name="Object Management">Manejo de objetos</string>
- <string name="Accounting">Contabilidad</string>
- <string name="Notices">Avisos</string>
- <string name="Chat" value="Chat :">Chat</string>
- <string name="DeleteItems">¿Deseas eliminar los elementos seleccionados?</string>
- <string name="DeleteItem">¿Deseas eliminar el elemento seleccionado?</string>
- <string name="EmptyOutfitText">No hay elementos en este vestuario</string>
- <string name="ExternalEditorNotSet">Selecciona un editor mediante la configuración de ExternalEditor.</string>
- <string name="ExternalEditorNotFound">No se encuentra el editor externo especificado.
+ Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Dom:Lun:Mar:Mié:Jue:Vie:Sáb
+ </string>
+ <string name="dateTimeMonthNames">
+ Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Group Ban">
+ Expulsión de grupo
+ </string>
+ <string name="Membership">
+ Membresía
+ </string>
+ <string name="Roles">
+ Roles
+ </string>
+ <string name="Group Identity">
+ Indentidad de grupo
+ </string>
+ <string name="Parcel Management">
+ Gestión de la parcela
+ </string>
+ <string name="Parcel Identity">
+ Identidad de la parcela
+ </string>
+ <string name="Parcel Settings">
+ Configuración de la parcela
+ </string>
+ <string name="Parcel Powers">
+ Poder de la parcela
+ </string>
+ <string name="Parcel Access">
+ Acceso a la parcela
+ </string>
+ <string name="Parcel Content">
+ Contenido de la parcela
+ </string>
+ <string name="Object Management">
+ Manejo de objetos
+ </string>
+ <string name="Accounting">
+ Contabilidad
+ </string>
+ <string name="Notices">
+ Avisos
+ </string>
+ <string name="Chat" value="Chat :">
+ Chat
+ </string>
+ <string name="DeleteItems">
+ ¿Deseas eliminar los elementos seleccionados?
+ </string>
+ <string name="DeleteItem">
+ ¿Deseas eliminar el elemento seleccionado?
+ </string>
+ <string name="EmptyOutfitText">
+ No hay elementos en este vestuario
+ </string>
+ <string name="ExternalEditorNotSet">
+ Selecciona un editor mediante la configuración de ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ No se encuentra el editor externo especificado.
Inténtalo incluyendo la ruta de acceso al editor entre comillas
-(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).</string>
- <string name="ExternalEditorCommandParseError">Error al analizar el comando de editor externo.</string>
- <string name="ExternalEditorFailedToRun">Error al ejecutar el editor externo.</string>
- <string name="TranslationFailed">Error al traducir: [REASON]</string>
- <string name="TranslationResponseParseError">Error al analizar la respuesta de la traducción.</string>
- <string name="Esc">Esc</string>
- <string name="Space">Space</string>
- <string name="Enter">Enter</string>
- <string name="Tab">Tab</string>
- <string name="Ins">Ins</string>
- <string name="Del">Del</string>
- <string name="Backsp">Backsp</string>
- <string name="Shift">Shift</string>
- <string name="Ctrl">Ctrl</string>
- <string name="Alt">Alt</string>
- <string name="CapsLock">CapsLock</string>
- <string name="Home">Base</string>
- <string name="End">End</string>
- <string name="PgUp">PgUp</string>
- <string name="PgDn">PgDn</string>
- <string name="F1">F1</string>
- <string name="F2">F2</string>
- <string name="F3">F3</string>
- <string name="F4">F4</string>
- <string name="F5">F5</string>
- <string name="F6">F6</string>
- <string name="F7">F7</string>
- <string name="F8">F8</string>
- <string name="F9">F9</string>
- <string name="F10">F10</string>
- <string name="F11">F11</string>
- <string name="F12">F12</string>
- <string name="Add">Añadir</string>
- <string name="Subtract">Restar</string>
- <string name="Multiply">Multiplicar</string>
- <string name="Divide">Dividir</string>
- <string name="PAD_DIVIDE">PAD_DIVIDE</string>
- <string name="PAD_LEFT">PAD_LEFT</string>
- <string name="PAD_RIGHT">PAD_RIGHT</string>
- <string name="PAD_DOWN">PAD_DOWN</string>
- <string name="PAD_UP">PAD_UP</string>
- <string name="PAD_HOME">PAD_HOME</string>
- <string name="PAD_END">PAD_END</string>
- <string name="PAD_PGUP">PAD_PGUP</string>
- <string name="PAD_PGDN">PAD_PGDN</string>
- <string name="PAD_CENTER">PAD_CENTER</string>
- <string name="PAD_INS">PAD_INS</string>
- <string name="PAD_DEL">PAD_DEL</string>
- <string name="PAD_Enter">PAD_Enter</string>
- <string name="PAD_BUTTON0">PAD_BUTTON0</string>
- <string name="PAD_BUTTON1">PAD_BUTTON1</string>
- <string name="PAD_BUTTON2">PAD_BUTTON2</string>
- <string name="PAD_BUTTON3">PAD_BUTTON3</string>
- <string name="PAD_BUTTON4">PAD_BUTTON4</string>
- <string name="PAD_BUTTON5">PAD_BUTTON5</string>
- <string name="PAD_BUTTON6">PAD_BUTTON6</string>
- <string name="PAD_BUTTON7">PAD_BUTTON7</string>
- <string name="PAD_BUTTON8">PAD_BUTTON8</string>
- <string name="PAD_BUTTON9">PAD_BUTTON9</string>
- <string name="PAD_BUTTON10">PAD_BUTTON10</string>
- <string name="PAD_BUTTON11">PAD_BUTTON11</string>
- <string name="PAD_BUTTON12">PAD_BUTTON12</string>
- <string name="PAD_BUTTON13">PAD_BUTTON13</string>
- <string name="PAD_BUTTON14">PAD_BUTTON14</string>
- <string name="PAD_BUTTON15">PAD_BUTTON15</string>
- <string name="-">-</string>
- <string name="=">=</string>
- <string name="`">`</string>
- <string name=";">;</string>
- <string name="[">[</string>
- <string name="]">]</string>
- <string name="\">\</string>
- <string name="0">0</string>
- <string name="1">1</string>
- <string name="2">2</string>
- <string name="3">3</string>
- <string name="4">4</string>
- <string name="5">5</string>
- <string name="6">6</string>
- <string name="7">7</string>
- <string name="8">8</string>
- <string name="9">9</string>
- <string name="A">A</string>
- <string name="B">B</string>
- <string name="C">C</string>
- <string name="D">D</string>
- <string name="E">E</string>
- <string name="F">F</string>
- <string name="G">G</string>
- <string name="H">H</string>
- <string name="I">I</string>
- <string name="J">J</string>
- <string name="K">K</string>
- <string name="L">L</string>
- <string name="M">M</string>
- <string name="N">N</string>
- <string name="O">O</string>
- <string name="P">P</string>
- <string name="Q">Q</string>
- <string name="R">R</string>
- <string name="S">S</string>
- <string name="T">T</string>
- <string name="U">U</string>
- <string name="V">V</string>
- <string name="W">W</string>
- <string name="X">X</string>
- <string name="Y">Y</string>
- <string name="Z">Z</string>
- <string name="BeaconParticle">Viendo balizas de partículas (azules)</string>
- <string name="BeaconPhysical">Viendo balizas de objetos materiales (verdes)</string>
- <string name="BeaconScripted">Viendo balizas de objetos con script (rojas)</string>
- <string name="BeaconScriptedTouch">Viendo el objeto con script con balizas de función táctil (rojas)</string>
- <string name="BeaconSound">Viendo balizas de sonido (amarillas)</string>
- <string name="BeaconMedia">Viendo balizas de medios (blancas)</string>
- <string name="BeaconSun">Visualización de la baliza de dirección del sol (naranja)</string>
- <string name="BeaconMoon">Visualización de la baliza de dirección de la luna (violeta)</string>
- <string name="ParticleHiding">Ocultando las partículas</string>
- <string name="Command_AboutLand_Label">Acerca del terreno</string>
- <string name="Command_Appearance_Label">Apariencia</string>
- <string name="Command_Avatar_Label">Avatar</string>
- <string name="Command_Build_Label">Construir</string>
- <string name="Command_Chat_Label">Chat</string>
- <string name="Command_Conversations_Label">Conversaciones</string>
- <string name="Command_Compass_Label">Brújula</string>
- <string name="Command_Destinations_Label">Destinos</string>
- <string name="Command_Environments_Label">Mis entornos</string>
- <string name="Command_Facebook_Label">Facebook</string>
- <string name="Command_Flickr_Label">Flickr</string>
- <string name="Command_Gestures_Label">Gestos</string>
- <string name="Command_Grid_Status_Label">Estado del Grid</string>
- <string name="Command_HowTo_Label">Cómo</string>
- <string name="Command_Inventory_Label">Inventario</string>
- <string name="Command_Map_Label">Mapa</string>
- <string name="Command_Marketplace_Label">Mercado</string>
- <string name="Command_MarketplaceListings_Label">Mercado</string>
- <string name="Command_MiniMap_Label">Minimapa</string>
- <string name="Command_Move_Label">Caminar / Correr / Volar</string>
- <string name="Command_Outbox_Label">Buzón de salida de comerciante</string>
- <string name="Command_People_Label">Gente</string>
- <string name="Command_Picks_Label">Destacados</string>
- <string name="Command_Places_Label">Lugares</string>
- <string name="Command_Preferences_Label">Preferencias</string>
- <string name="Command_Profile_Label">Perfil</string>
- <string name="Command_Report_Abuse_Label">Denunciar una infracción</string>
- <string name="Command_Search_Label">Buscar</string>
- <string name="Command_Snapshot_Label">Foto</string>
- <string name="Command_Speak_Label">Hablar</string>
- <string name="Command_Twitter_Label">Twitter</string>
- <string name="Command_View_Label">Controles de la cámara</string>
- <string name="Command_Voice_Label">Configuración de voz</string>
- <string name="Command_AboutLand_Tooltip">Información sobre el terreno que vas a visitar</string>
- <string name="Command_Appearance_Tooltip">Cambiar tu avatar</string>
- <string name="Command_Avatar_Tooltip">Elegir un avatar completo</string>
- <string name="Command_Build_Tooltip">Construir objetos y modificar la forma del terreno</string>
- <string name="Command_Chat_Tooltip">Habla por chat de texto con las personas próximas</string>
- <string name="Command_Conversations_Tooltip">Conversar con todos</string>
- <string name="Command_Compass_Tooltip">Brújula</string>
- <string name="Command_Destinations_Tooltip">Destinos de interés</string>
- <string name="Command_Environments_Tooltip">Mis entornos</string>
- <string name="Command_Facebook_Tooltip">Publicar en Facebook</string>
- <string name="Command_Flickr_Tooltip">Subir a Flickr</string>
- <string name="Command_Gestures_Tooltip">Gestos para tu avatar</string>
- <string name="Command_Grid_Status_Tooltip">Mostrar el estado actual del Grid</string>
- <string name="Command_HowTo_Tooltip">Cómo hacer las tareas habituales</string>
- <string name="Command_Inventory_Tooltip">Ver y usar tus pertenencias</string>
- <string name="Command_Map_Tooltip">Mapa del mundo</string>
- <string name="Command_Marketplace_Tooltip">Ir de compras</string>
- <string name="Command_MarketplaceListings_Tooltip">Vende tu creación</string>
- <string name="Command_MiniMap_Tooltip">Mostrar la gente que está cerca</string>
- <string name="Command_Move_Tooltip">Desplazando el avatar</string>
- <string name="Command_Outbox_Tooltip">Transfiere objetos a tu mercado para venderlos</string>
- <string name="Command_People_Tooltip">Amigos, grupos y personas próximas</string>
- <string name="Command_Picks_Tooltip">Lugares que se mostrarán como favoritos en tu perfil</string>
- <string name="Command_Places_Tooltip">Lugares que has guardado</string>
- <string name="Command_Preferences_Tooltip">Preferencias</string>
- <string name="Command_Profile_Tooltip">Consulta o edita tu perfil</string>
- <string name="Command_Report_Abuse_Tooltip">Denunciar una infracción</string>
- <string name="Command_Search_Tooltip">Buscar lugares, eventos y personas</string>
- <string name="Command_Snapshot_Tooltip">Tomar una fotografía</string>
- <string name="Command_Speak_Tooltip">Utiliza el micrófono para hablar con las personas próximas</string>
- <string name="Command_Twitter_Tooltip">Twitter</string>
- <string name="Command_View_Tooltip">Cambiando el ángulo de la cámara</string>
- <string name="Command_Voice_Tooltip">Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual</string>
- <string name="Toolbar_Bottom_Tooltip">actualmente en tu barra de herramientas inferior</string>
- <string name="Toolbar_Left_Tooltip">actualmente en tu barra de herramientas izquierda</string>
- <string name="Toolbar_Right_Tooltip">actualmente en tu barra de herramientas derecha</string>
- <string name="Retain%">% retención</string>
- <string name="Detail">Detalle</string>
- <string name="Better Detail">Mejor detalle</string>
- <string name="Surface">Superficie</string>
- <string name="Solid">Sólido</string>
- <string name="Wrap">Envoltura</string>
- <string name="Preview">Vista previa</string>
- <string name="Normal">Normal</string>
- <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string>
- <string name="Pathfinding_Object_Attr_None">Ninguno</string>
- <string name="Pathfinding_Object_Attr_Permanent">Afecta al navmesh</string>
- <string name="Pathfinding_Object_Attr_Character">Personaje</string>
- <string name="Pathfinding_Object_Attr_MultiSelect">(Múltiple)</string>
- <string name="snapshot_quality_very_low">Muy bajo</string>
- <string name="snapshot_quality_low">Bajo</string>
- <string name="snapshot_quality_medium">Medio</string>
- <string name="snapshot_quality_high">Alto</string>
- <string name="snapshot_quality_very_high">Muy alto</string>
- <string name="TeleportMaturityExceeded">El Residente no puede visitar esta región.</string>
- <string name="UserDictionary">[Usuario]</string>
- <string name="experience_tools_experience">Experiencia</string>
- <string name="ExperienceNameNull">(sin experiencia)</string>
- <string name="ExperienceNameUntitled">(experiencia sin título)</string>
- <string name="Land-Scope">Activa en el terreno</string>
- <string name="Grid-Scope">Activa en el Grid</string>
- <string name="Allowed_Experiences_Tab">PERMITIDO</string>
- <string name="Blocked_Experiences_Tab">BLOQUEADO</string>
- <string name="Contrib_Experiences_Tab">COLABORADOR</string>
- <string name="Admin_Experiences_Tab">ADMIN.</string>
- <string name="Recent_Experiences_Tab">RECIENTE</string>
- <string name="Owned_Experiences_Tab">PROPIEDAD</string>
- <string name="ExperiencesCounter">([EXPERIENCES], máx. [MAXEXPERIENCES])</string>
- <string name="ExperiencePermission1">hacerte con tus controles</string>
- <string name="ExperiencePermission3">activar animaciones en tu avatar</string>
- <string name="ExperiencePermission4">anexar a tu avatar</string>
- <string name="ExperiencePermission9">seguimiento de la cámara</string>
- <string name="ExperiencePermission10">controlar tu cámara</string>
- <string name="ExperiencePermission11">teleportarte</string>
- <string name="ExperiencePermission12">aceptar automáticamente permisos de experiencias</string>
- <string name="ExperiencePermission16">forzar que el avatar se siente</string>
- <string name="ExperiencePermission17">cambiar tu configuración del entorno</string>
- <string name="ExperiencePermissionShortUnknown">realizar una operación desconocida: [Permission]</string>
- <string name="ExperiencePermissionShort1">Ponerte al mando</string>
- <string name="ExperiencePermissionShort3">Activar animaciones</string>
- <string name="ExperiencePermissionShort4">Anexar</string>
- <string name="ExperiencePermissionShort9">Seguir la cámara</string>
- <string name="ExperiencePermissionShort10">Controlar la cámara</string>
- <string name="ExperiencePermissionShort11">Teleporte</string>
- <string name="ExperiencePermissionShort12">Otorgar permisos</string>
- <string name="ExperiencePermissionShort16">Sentarte</string>
- <string name="ExperiencePermissionShort17">Entorno</string>
- <string name="logging_calls_disabled_log_empty">No se están registrando las conversaciones. Para empezar a grabar un registro, elige &quot;Guardar: Solo registro&quot; o &quot;Guardar: Registro y transcripciones&quot; en Preferencias &gt; Chat.</string>
- <string name="logging_calls_disabled_log_not_empty">No se registrarán más conversaciones. Para reanudar la grabación de un registro, elige &quot;Guardar: Solo registro&quot; o &quot;Guardar: Registro y transcripciones&quot; en Preferencias &gt; Chat.</string>
- <string name="logging_calls_enabled_log_empty">No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquí se mostrará una entrada de registro.</string>
- <string name="loading_chat_logs">Cargando...</string>
- <string name="na">n/c</string>
- <string name="preset_combo_label">-Lista vacía-</string>
- <string name="Default">Predeterminado</string>
- <string name="none_paren_cap">(ninguno)</string>
- <string name="no_limit">Sin límite</string>
- <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">La forma física contiene triángulos demasiado pequeños. Intenta simplificar el modelo físico.</string>
- <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">La forma física contiene datos de confirmación erróneos. Intenta corregir el modelo físico.</string>
- <string name="Mav_Details_MAV_UNKNOWN_VERSION">La versión de la forma física no es correcta. Configura la versión correcta del modelo físico.</string>
- <string name="couldnt_resolve_host">Error de DNS al resolver el nombre del host([HOSTNAME]).
+(por ejemplo, "/ruta a mi/editor" "%s").
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error al analizar el comando de editor externo.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Error al ejecutar el editor externo.
+ </string>
+ <string name="TranslationFailed">
+ Error al traducir: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Error al analizar la respuesta de la traducción.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Base
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Añadir
+ </string>
+ <string name="Subtract">
+ Restar
+ </string>
+ <string name="Multiply">
+ Multiplicar
+ </string>
+ <string name="Divide">
+ Dividir
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Viendo balizas de partículas (azules)
+ </string>
+ <string name="BeaconPhysical">
+ Viendo balizas de objetos materiales (verdes)
+ </string>
+ <string name="BeaconScripted">
+ Viendo balizas de objetos con script (rojas)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viendo el objeto con script con balizas de función táctil (rojas)
+ </string>
+ <string name="BeaconSound">
+ Viendo balizas de sonido (amarillas)
+ </string>
+ <string name="BeaconMedia">
+ Viendo balizas de medios (blancas)
+ </string>
+ <string name="BeaconSun">
+ Visualización de la baliza de dirección del sol (naranja)
+ </string>
+ <string name="BeaconMoon">
+ Visualización de la baliza de dirección de la luna (violeta)
+ </string>
+ <string name="ParticleHiding">
+ Ocultando las partículas
+ </string>
+ <string name="Command_AboutLand_Label">
+ Acerca del terreno
+ </string>
+ <string name="Command_Appearance_Label">
+ Apariencia
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construir
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Conversations_Label">
+ Conversaciones
+ </string>
+ <string name="Command_Compass_Label">
+ Brújula
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinos
+ </string>
+ <string name="Command_Environments_Label">
+ Mis entornos
+ </string>
+ <string name="Command_Facebook_Label">
+ Facebook
+ </string>
+ <string name="Command_Flickr_Label">
+ Flickr
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestos
+ </string>
+ <string name="Command_Grid_Status_Label">
+ Estado del Grid
+ </string>
+ <string name="Command_HowTo_Label">
+ Cómo
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventario
+ </string>
+ <string name="Command_Map_Label">
+ Mapa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercado
+ </string>
+ <string name="Command_MarketplaceListings_Label">
+ Mercado
+ </string>
+ <string name="Command_MiniMap_Label">
+ Minimapa
+ </string>
+ <string name="Command_Move_Label">
+ Caminar / Correr / Volar
+ </string>
+ <string name="Command_Outbox_Label">
+ Buzón de salida de comerciante
+ </string>
+ <string name="Command_People_Label">
+ Gente
+ </string>
+ <string name="Command_Picks_Label">
+ Destacados
+ </string>
+ <string name="Command_Places_Label">
+ Lugares
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferencias
+ </string>
+ <string name="Command_Profile_Label">
+ Perfil
+ </string>
+ <string name="Command_Report_Abuse_Label">
+ Denunciar una infracción
+ </string>
+ <string name="Command_Search_Label">
+ Buscar
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Hablar
+ </string>
+ <string name="Command_Twitter_Label">
+ Twitter
+ </string>
+ <string name="Command_View_Label">
+ Controles de la cámara
+ </string>
+ <string name="Command_Voice_Label">
+ Configuración de voz
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Información sobre el terreno que vas a visitar
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Cambiar tu avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Elegir un avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construir objetos y modificar la forma del terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Habla por chat de texto con las personas próximas
+ </string>
+ <string name="Command_Conversations_Tooltip">
+ Conversar con todos
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Brújula
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinos de interés
+ </string>
+ <string name="Command_Environments_Tooltip">
+ Mis entornos
+ </string>
+ <string name="Command_Facebook_Tooltip">
+ Publicar en Facebook
+ </string>
+ <string name="Command_Flickr_Tooltip">
+ Subir a Flickr
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestos para tu avatar
+ </string>
+ <string name="Command_Grid_Status_Tooltip">
+ Mostrar el estado actual del Grid
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Cómo hacer las tareas habituales
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Ver y usar tus pertenencias
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mapa del mundo
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Ir de compras
+ </string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Vende tu creación
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostrar la gente que está cerca
+ </string>
+ <string name="Command_Move_Tooltip">
+ Desplazando el avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transfiere objetos a tu mercado para venderlos
+ </string>
+ <string name="Command_People_Tooltip">
+ Amigos, grupos y personas próximas
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lugares que se mostrarán como favoritos en tu perfil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lugares que has guardado
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferencias
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Consulta o edita tu perfil
+ </string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Denunciar una infracción
+ </string>
+ <string name="Command_Search_Tooltip">
+ Buscar lugares, eventos y personas
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Tomar una fotografía
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Utiliza el micrófono para hablar con las personas próximas
+ </string>
+ <string name="Command_Twitter_Tooltip">
+ Twitter
+ </string>
+ <string name="Command_View_Tooltip">
+ Cambiando el ángulo de la cámara
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ actualmente en tu barra de herramientas inferior
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ actualmente en tu barra de herramientas izquierda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ actualmente en tu barra de herramientas derecha
+ </string>
+ <string name="Retain%">
+ % retención
+ </string>
+ <string name="Detail">
+ Detalle
+ </string>
+ <string name="Better Detail">
+ Mejor detalle
+ </string>
+ <string name="Surface">
+ Superficie
+ </string>
+ <string name="Solid">
+ Sólido
+ </string>
+ <string name="Wrap">
+ Envoltura
+ </string>
+ <string name="Preview">
+ Vista previa
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="Pathfinding_Wiki_URL">
+ http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </string>
+ <string name="Pathfinding_Object_Attr_None">
+ Ninguno
+ </string>
+ <string name="Pathfinding_Object_Attr_Permanent">
+ Afecta al navmesh
+ </string>
+ <string name="Pathfinding_Object_Attr_Character">
+ Personaje
+ </string>
+ <string name="Pathfinding_Object_Attr_MultiSelect">
+ (Múltiple)
+ </string>
+ <string name="snapshot_quality_very_low">
+ Muy bajo
+ </string>
+ <string name="snapshot_quality_low">
+ Bajo
+ </string>
+ <string name="snapshot_quality_medium">
+ Medio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Muy alto
+ </string>
+ <string name="TeleportMaturityExceeded">
+ El Residente no puede visitar esta región.
+ </string>
+ <string name="UserDictionary">
+ [Usuario]
+ </string>
+ <string name="experience_tools_experience">
+ Experiencia
+ </string>
+ <string name="ExperienceNameNull">
+ (sin experiencia)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (experiencia sin título)
+ </string>
+ <string name="Land-Scope">
+ Activa en el terreno
+ </string>
+ <string name="Grid-Scope">
+ Activa en el Grid
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ PERMITIDO
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOQUEADO
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ COLABORADOR
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ADMIN.
+ </string>
+ <string name="Recent_Experiences_Tab">
+ RECIENTE
+ </string>
+ <string name="Owned_Experiences_Tab">
+ PROPIEDAD
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], máx. [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ hacerte con tus controles
+ </string>
+ <string name="ExperiencePermission3">
+ activar animaciones en tu avatar
+ </string>
+ <string name="ExperiencePermission4">
+ anexar a tu avatar
+ </string>
+ <string name="ExperiencePermission9">
+ seguimiento de la cámara
+ </string>
+ <string name="ExperiencePermission10">
+ controlar tu cámara
+ </string>
+ <string name="ExperiencePermission11">
+ teleportarte
+ </string>
+ <string name="ExperiencePermission12">
+ aceptar automáticamente permisos de experiencias
+ </string>
+ <string name="ExperiencePermission16">
+ forzar que el avatar se siente
+ </string>
+ <string name="ExperiencePermission17">
+ cambiar tu configuración del entorno
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ realizar una operación desconocida: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Ponerte al mando
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Activar animaciones
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Anexar
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Seguir la cámara
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Controlar la cámara
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teleporte
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Otorgar permisos
+ </string>
+ <string name="ExperiencePermissionShort16">
+ Sentarte
+ </string>
+ <string name="ExperiencePermissionShort17">
+ Entorno
+ </string>
+ <string name="logging_calls_disabled_log_empty">
+ No se están registrando las conversaciones. Para empezar a grabar un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias &gt; Chat.
+ </string>
+ <string name="logging_calls_disabled_log_not_empty">
+ No se registrarán más conversaciones. Para reanudar la grabación de un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias &gt; Chat.
+ </string>
+ <string name="logging_calls_enabled_log_empty">
+ No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquí se mostrará una entrada de registro.
+ </string>
+ <string name="loading_chat_logs">
+ Cargando...
+ </string>
+ <string name="na">
+ n/c
+ </string>
+ <string name="preset_combo_label">
+ -Lista vacía-
+ </string>
+ <string name="Default">
+ Predeterminado
+ </string>
+ <string name="none_paren_cap">
+ (ninguno)
+ </string>
+ <string name="no_limit">
+ Sin límite
+ </string>
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ La forma física contiene triángulos demasiado pequeños. Intenta simplificar el modelo físico.
+ </string>
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ La forma física contiene datos de confirmación erróneos. Intenta corregir el modelo físico.
+ </string>
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ La versión de la forma física no es correcta. Configura la versión correcta del modelo físico.
+ </string>
+ <string name="couldnt_resolve_host">
+ Error de DNS al resolver el nombre del host([HOSTNAME]).
Por favor verifica si puedes conectarte al sitio web www.secondlife.com.
Si puedes conectarte, pero aún recibes este error, por favor accede a
-la sección Soporte y genera un informe del problema.</string>
- <string name="ssl_peer_certificate">El servidor de inicio de sesión no pudo verificarse vía SSL.
+la sección Soporte y genera un informe del problema.
+ </string>
+ <string name="ssl_peer_certificate">
+ El servidor de inicio de sesión no pudo verificarse vía SSL.
Si aún recibes este error, por favor accede a
la sección Soporte del sitio web Secondlife.com
-y genera un informe del problema.</string>
- <string name="ssl_connect_error">En general esto significa que el horario de tu computadora no está bien configurado.
+y genera un informe del problema.
+ </string>
+ <string name="ssl_connect_error">
+ En general esto significa que el horario de tu computadora no está bien configurado.
Por favor accede al Panel de control y asegúrate de que la hora y la fecha estén
bien configurados. Verifica también que tu red y tu cortafuegos estén bien
configurados. Si aún recibes este error, por favor accede a la sección Soporte
del sitio web Secondlife.com y genera un informe del problema.
-[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos]</string>
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml
index 44be93cd80..cc6089584a 100644
--- a/indra/newview/skins/default/xui/es/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/es/teleport_strings.xml
@@ -1,39 +1,95 @@
<?xml version="1.0" ?>
<teleport_messages>
<message_set name="errors">
- <message name="invalid_tport">Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
-Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].</message>
- <message name="invalid_region_handoff">Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
-Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].</message>
- <message name="blocked_tport">Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.</message>
- <message name="nolandmark_tport">Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.</message>
- <message name="timeout_tport">Lo sentimos, pero el sistema no ha podido completar el teleporte.
-Vuelva a intentarlo en un momento.</message>
- <message name="NoHelpIslandTP">No te puedes volver a teleportar a la isla de bienvenida.
-Para repetir el tutorial, visita la isla de bienvenida pública.</message>
- <message name="noaccess_tport">Lo sentimos, pero no tienes acceso al destino de este teleporte.</message>
- <message name="missing_attach_tport">Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.</message>
- <message name="too_many_uploads_tport">La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.</message>
- <message name="expired_tport">Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos.</message>
- <message name="expired_region_handoff">Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos.</message>
- <message name="no_host">Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos minutos.</message>
- <message name="no_inventory_host">En estos momentos no está disponible el sistema del inventario.</message>
- <message name="MustGetAgeRegion">Solo pueden acceder a esta región los mayores de 18 años.</message>
- <message name="RegionTPSpecialUsageBlocked">No puedes entrar en la región. '[REGION_NAME]' es una región de juegos de habilidad, y debes cumplir determinados criterios para poder entrar en ella. Consulta los detalles en las [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life P+F de juegos de habilidad].</message>
- <message name="preexisting_tport">Lo sentimos, pero el sistema no pudo comenzar tu teleportacion. Por favor inténtalo de nuevo en unos minutos</message>
+ <message name="invalid_tport">
+ Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.
+ </message>
+ <message name="nolandmark_tport">
+ Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
+ </message>
+ <message name="timeout_tport">
+ Lo sentimos, pero el sistema no ha podido completar el teleporte.
+Vuelva a intentarlo en un momento.
+ </message>
+ <message name="NoHelpIslandTP">
+ No te puedes volver a teleportar a la isla de bienvenida.
+Para repetir el tutorial, visita la isla de bienvenida pública.
+ </message>
+ <message name="noaccess_tport">
+ Lo sentimos, pero no tienes acceso al destino de este teleporte.
+ </message>
+ <message name="missing_attach_tport">
+ Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.
+ </message>
+ <message name="too_many_uploads_tport">
+ La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.
+ </message>
+ <message name="expired_tport">
+ Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos.
+ </message>
+ <message name="expired_region_handoff">
+ Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos.
+ </message>
+ <message name="no_host">
+ Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos minutos.
+ </message>
+ <message name="no_inventory_host">
+ En estos momentos no está disponible el sistema del inventario.
+ </message>
+ <message name="MustGetAgeRegion">
+ Solo pueden acceder a esta región los mayores de 18 años.
+ </message>
+ <message name="RegionTPSpecialUsageBlocked">
+ No puedes entrar en la región. '[REGION_NAME]' es una región de juegos de habilidad, y debes cumplir determinados criterios para poder entrar en ella. Consulta los detalles en las [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life P+F de juegos de habilidad].
+ </message>
+ <message name="preexisting_tport">
+ Lo sentimos, pero el sistema no pudo comenzar tu teleportacion. Por favor inténtalo de nuevo en unos minutos
+ </message>
</message_set>
<message_set name="progress">
- <message name="sending_dest">Llevando al destino.</message>
- <message name="redirecting">Redireccionando a una posición diferente.</message>
- <message name="relaying">Reorientando el destino.</message>
- <message name="sending_home">Enviando la petición de posición de la Base.</message>
- <message name="sending_landmark">Enviando la petición de posición del hito.</message>
- <message name="completing">Completando el teleporte.</message>
- <message name="completed_from">Teleporte realizado desde [T_SLURL]</message>
- <message name="resolving">Especificando el destino.</message>
- <message name="contacting">Contactando con la nueva región.</message>
- <message name="arriving">Llegando...</message>
- <message name="requesting">Solicitando teleporte...</message>
- <message name="pending">Teleporte pendiente...</message>
+ <message name="sending_dest">
+ Llevando al destino.
+ </message>
+ <message name="redirecting">
+ Redireccionando a una posición diferente.
+ </message>
+ <message name="relaying">
+ Reorientando el destino.
+ </message>
+ <message name="sending_home">
+ Enviando la petición de posición de la Base.
+ </message>
+ <message name="sending_landmark">
+ Enviando la petición de posición del hito.
+ </message>
+ <message name="completing">
+ Completando el teleporte.
+ </message>
+ <message name="completed_from">
+ Teleporte realizado desde [T_SLURL]
+ </message>
+ <message name="resolving">
+ Especificando el destino.
+ </message>
+ <message name="contacting">
+ Contactando con la nueva región.
+ </message>
+ <message name="arriving">
+ Llegando...
+ </message>
+ <message name="requesting">
+ Solicitando teleporte...
+ </message>
+ <message name="pending">
+ Teleporte pendiente...
+ </message>
</message_set>
</teleport_messages>
diff --git a/indra/newview/skins/default/xui/fr/floater_search.xml b/indra/newview/skins/default/xui/fr/floater_search.xml
deleted file mode 100644
index 32800182ea..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Chargement...
- </floater.string>
- <floater.string name="done_text">
- Terminé
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Relancer la recherche pour refléter le niveau divin actuel
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/panel_progress.xml b/indra/newview/skins/default/xui/fr/panel_progress.xml
index c9bed9fd9b..7d31bb7138 100644
--- a/indra/newview/skins/default/xui/fr/panel_progress.xml
+++ b/indra/newview/skins/default/xui/fr/panel_progress.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" ?>
<panel name="login_progress_panel">
+ <layout_panel name="panel_icons"/>
<layout_stack name="vertical_centering"/>
<layout_panel name="panel4"/>
<layout_panel name="center"/>
<layout_stack name="horizontal_centering">
+ <text name="logos_lbl">Megapahit utilise</text>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
index 3cf64583d2..a560ff8d5e 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
@@ -7,7 +7,7 @@
L&apos;enregistrement d&apos;une image dans l&apos;inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez un format carré.
</text>
<combo_box label="Résolution" name="texture_size_combo">
- <combo_box.item label="Fenêtre actuelle (512x512)" name="CurrentWindow"/>
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
<combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/>
<combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/>
<combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
index bdedb9162f..52fa318f8e 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="Enreg. sur le disque" name="save_to_computer_btn"/>
- <button label="Enreg. dans l&apos;inventaire ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="Enreg. dans l&apos;inventaire" name="save_to_inventory_btn"/>
<button label="Partager sur le flux de profil" name="save_to_profile_btn"/>
<button label="Partager sur Facebook" name="send_to_facebook_btn"/>
<button label="Partager sur Twitter" name="send_to_twitter_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 3889e26aee..770b52242a 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1,619 +1,1687 @@
<?xml version="1.0" ?>
<strings>
- <string name="SECOND_LIFE">Second Life</string>
- <string name="APP_NAME">Megapahit</string>
- <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string>
- <string name="SECOND_LIFE_GRID">Grille de Second Life</string>
- <string name="SUPPORT_SITE">Portail Assistance Second Life</string>
- <string name="StartupDetectingHardware">Détection du matériel...</string>
- <string name="StartupLoading">Chargement de [APP_NAME]...</string>
- <string name="StartupClearingCache">Vidage du cache...</string>
- <string name="StartupInitializingTextureCache">Initialisation du cache des textures...</string>
- <string name="StartupRequireDriverUpdate">Échec d'initialisation des graphiques. Veuillez mettre votre pilote graphique à jour.</string>
- <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>
- <string name="BuildConfig">Configuration de la construction [BUILD_CONFIG]</string>
- <string name="AboutPosition">Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Megapahit
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ MEGAPAHIT
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Grille de Second Life
+ </string>
+ <string name="SUPPORT_SITE">
+ Portail Assistance Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Détection du matériel...
+ </string>
+ <string name="StartupLoading">
+ Chargement de [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Vidage du cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Initialisation du cache des textures...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Échec d'initialisation des graphiques. Veuillez mettre votre pilote graphique à jour.
+ </string>
+ <string name="AboutHeader">
+ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </string>
+ <string name="BuildConfig">
+ Configuration de la construction [BUILD_CONFIG]
+ </string>
+ <string name="AboutPosition">
+ Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
SLURL : &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]</string>
- <string name="AboutSystem">CPU : [CPU]
+[SERVER_RELEASE_NOTES_URL]
+ </string>
+ <string name="AboutSystem">
+ CPU : [CPU]
Mémoire : [MEMORY_MB] Mo
Version OS : [OS_VERSION]
Distributeur de cartes graphiques : [GRAPHICS_CARD_VENDOR]
-Carte graphique : [GRAPHICS_CARD]</string>
- <string name="AboutDriver">Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION]</string>
- <string name="AboutOGL">Version OpenGL : [OPENGL_VERSION]</string>
- <string name="AboutSettings">Taille de la fenêtre: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Carte graphique : [GRAPHICS_CARD]
+ </string>
+ <string name="AboutDriver">
+ Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION]
+ </string>
+ <string name="AboutOGL">
+ Version OpenGL : [OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Taille de la fenêtre: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
Ajustement de la taille de la police : [FONT_SIZE_ADJUSTMENT]pt
Échelle de l’interface : [UI_SCALE]
Distance de dessin : [DRAW_DISTANCE]m
Bande passante : [NET_BANDWITH] kbit/s
Facteur LOD (niveau de détail) : [LOD_FACTOR]
Qualité de rendu : [RENDER_QUALITY]
-Mémoire textures : [TEXTURE_MEMORY] Mo</string>
- <string name="AboutOSXHiDPI">Mode d'affichage HiDPI : [HIDPI]</string>
- <string name="AboutLibs">J2C Decoder Version: [J2C_VERSION]
+Mémoire textures : [TEXTURE_MEMORY] Mo
+ </string>
+ <string name="AboutOSXHiDPI">
+ Mode d'affichage HiDPI : [HIDPI]
+ </string>
+ <string name="AboutLibs">
+ J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
[LIBCEF_VERSION]
LibVLC Version: [LIBVLC_VERSION]
-Voice Server Version: [VOICE_VERSION]</string>
- <string name="AboutTraffic">Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>
- <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>
- <string name="ErrorFetchingServerReleaseNotesURL">Erreur lors de la récupération de l'URL des notes de version du serveur.</string>
- <string name="BuildConfiguration">Configuration de la construction</string>
- <string name="ProgressRestoring">Restauration...</string>
- <string name="ProgressChangingResolution">Changement de la résolution...</string>
- <string name="Fullbright">Fullbright (Legacy)</string>
- <string name="LoginInProgress">La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.</string>
- <string name="LoginInProgressNoFrozen">Connexion...</string>
- <string name="LoginAuthenticating">Authentification en cours</string>
- <string name="LoginMaintenance">Maintenance du compte en cours…</string>
- <string name="LoginAttempt">La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER]</string>
- <string name="LoginPrecaching">Monde en cours de chargement…</string>
- <string name="LoginInitializingBrowser">Navigateur Web incorporé en cours d'initialisation…</string>
- <string name="LoginInitializingMultimedia">Multimédia en cours d'initialisation…</string>
- <string name="LoginInitializingFonts">Chargement des polices en cours...</string>
- <string name="LoginVerifyingCache">Fichiers du cache en cours de vérification (peut prendre 60-90 s)...</string>
- <string name="LoginProcessingResponse">Réponse en cours de traitement…</string>
- <string name="LoginInitializingWorld">Monde en cours d'initialisation…</string>
- <string name="LoginDecodingImages">Décodage des images en cours...</string>
- <string name="LoginInitializingQuicktime">Quicktime en cours d'initialisation</string>
- <string name="LoginQuicktimeNotFound">Quicktime introuvable, impossible de procéder à l'initialisation.</string>
- <string name="LoginQuicktimeOK">Initialisation de Quicktime réussie.</string>
- <string name="LoginRequestSeedCapGrant">Capacités de la région demandées...</string>
- <string name="LoginRetrySeedCapGrant">Capacités de la région demandées... Tentative n° [NUMBER].</string>
- <string name="LoginWaitingForRegionHandshake">Liaison avec la région en cours de création...</string>
- <string name="LoginConnectingToRegion">Connexion avec la région en cours...</string>
- <string name="LoginDownloadingClothing">Habits en cours de téléchargement...</string>
- <string name="InvalidCertificate">Certificat non valide ou corrompu renvoyé par le serveur. Contactez l'administrateur de la grille.</string>
- <string name="CertInvalidHostname">Nom d'hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d'hôte de grille ou SLURL.</string>
- <string name="CertExpired">Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille.</string>
- <string name="CertKeyUsage">Impossible d'utiliser le certificat renvoyé par le serveur pour SSL. Contactez l'administrateur de la grille.</string>
- <string name="CertBasicConstraints">Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille.</string>
- <string name="CertInvalidSignature">Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille.</string>
- <string name="LoginFailedNoNetwork">Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau.</string>
- <string name="LoginFailedHeader">Échec de la connexion.</string>
- <string name="Quit">Quitter</string>
- <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
- <string name="AgniGridLabel">Grille principale de Second Life (Agni)</string>
- <string name="AditiGridLabel">Grille de test bêta Second Life (Aditi)</string>
- <string name="ViewerDownloadURL">http://secondlife.com/download</string>
- <string name="LoginFailedViewerNotPermitted">Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante :
+Voice Server Version: [VOICE_VERSION]
+ </string>
+ <string name="AboutTraffic">
+ Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
+ <string name="ErrorFetchingServerReleaseNotesURL">
+ Erreur lors de la récupération de l'URL des notes de version du serveur.
+ </string>
+ <string name="BuildConfiguration">
+ Configuration de la construction
+ </string>
+ <string name="ProgressRestoring">
+ Restauration...
+ </string>
+ <string name="ProgressChangingResolution">
+ Changement de la résolution...
+ </string>
+ <string name="Fullbright">
+ Fullbright (Legacy)
+ </string>
+ <string name="LoginInProgress">
+ La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Connexion...
+ </string>
+ <string name="LoginAuthenticating">
+ Authentification en cours
+ </string>
+ <string name="LoginMaintenance">
+ Maintenance du compte en cours…
+ </string>
+ <string name="LoginAttempt">
+ La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Monde en cours de chargement…
+ </string>
+ <string name="LoginInitializingBrowser">
+ Navigateur Web incorporé en cours d'initialisation…
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Multimédia en cours d'initialisation…
+ </string>
+ <string name="LoginInitializingFonts">
+ Chargement des polices en cours...
+ </string>
+ <string name="LoginVerifyingCache">
+ Fichiers du cache en cours de vérification (peut prendre 60-90 s)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Réponse en cours de traitement…
+ </string>
+ <string name="LoginInitializingWorld">
+ Monde en cours d'initialisation…
+ </string>
+ <string name="LoginDecodingImages">
+ Décodage des images en cours...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Quicktime en cours d'initialisation
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ Quicktime introuvable, impossible de procéder à l'initialisation.
+ </string>
+ <string name="LoginQuicktimeOK">
+ Initialisation de Quicktime réussie.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Capacités de la région demandées...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Capacités de la région demandées... Tentative n° [NUMBER].
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Liaison avec la région en cours de création...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Connexion avec la région en cours...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Habits en cours de téléchargement...
+ </string>
+ <string name="InvalidCertificate">
+ Certificat non valide ou corrompu renvoyé par le serveur. Contactez l'administrateur de la grille.
+ </string>
+ <string name="CertInvalidHostname">
+ Nom d'hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d'hôte de grille ou SLURL.
+ </string>
+ <string name="CertExpired">
+ Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille.
+ </string>
+ <string name="CertKeyUsage">
+ Impossible d'utiliser le certificat renvoyé par le serveur pour SSL. Contactez l'administrateur de la grille.
+ </string>
+ <string name="CertBasicConstraints">
+ Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille.
+ </string>
+ <string name="CertInvalidSignature">
+ Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau.
+ </string>
+ <string name="LoginFailedHeader">
+ Échec de la connexion.
+ </string>
+ <string name="Quit">
+ Quitter
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/?sourceid=[sourceid]
+ </string>
+ <string name="AgniGridLabel">
+ Grille principale de Second Life (Agni)
+ </string>
+ <string name="AditiGridLabel">
+ Grille de test bêta Second Life (Aditi)
+ </string>
+ <string name="ViewerDownloadURL">
+ http://secondlife.com/download
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante :
http://secondlife.com/download
Pour plus d'informations, consultez la page FAQ ci-dessous :
-http://secondlife.com/viewer-access-faq</string>
- <string name="LoginIntermediateOptionalUpdateAvailable">Mise à jour facultative du client disponible : [VERSION]</string>
- <string name="LoginFailedRequiredUpdate">Mise à jour du client requise : [VERSION]</string>
- <string name="LoginFailedAlreadyLoggedIn">L'agent est déjà connecté.</string>
- <string name="LoginFailedAuthenticationFailed">Désolé ! La connexion a échoué.
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Mise à jour facultative du client disponible : [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Mise à jour du client requise : [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ L'agent est déjà connecté.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Désolé ! La connexion a échoué.
Veuillez vérifier que les éléments ci-dessous ont été correctement saisis :
* Nom d'utilisateur (par exemple, bobsmith12 ou steller.sunshine)
* Mot de passe
-Assurez-vous également que la touche Verr. maj n'est pas activée.</string>
- <string name="LoginFailedPasswordChanged">Votre mot de passe a été modifié pour des raisons de sécurité.
+Assurez-vous également que la touche Verr. maj n'est pas activée.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Votre mot de passe a été modifié pour des raisons de sécurité.
Veuillez accéder à votre compte à la page http://secondlife.com/password
et répondre à la question de sécurité afin de réinitialiser votre mot de passe.
-Nous vous prions de nous excuser pour la gêne occasionnée.</string>
- <string name="LoginFailedPasswordReset">Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système.
+Nous vous prions de nous excuser pour la gêne occasionnée.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système.
Pour cela, accédez à votre compte à la page http://secondlife.com/password
et répondez à la question de sécurité. Votre mot de passe sera réinitialisé.
-Nous vous prions de nous excuser pour la gêne occasionnée.</string>
- <string name="LoginFailedEmployeesOnly">Second Life est temporairement fermé pour des raisons de maintenance.
+Nous vous prions de nous excuser pour la gêne occasionnée.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life est temporairement fermé pour des raisons de maintenance.
Seuls les employés peuvent actuellement y accéder.
-Consultez la page www.secondlife.com/status pour plus d'informations.</string>
- <string name="LoginFailedPremiumOnly">Les connexions à Second Life sont temporairement limitées afin de s'assurer que l'expérience des utilisateurs présents dans le monde virtuel soit optimale.
+Consultez la page www.secondlife.com/status pour plus d'informations.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Les connexions à Second Life sont temporairement limitées afin de s'assurer que l'expérience des utilisateurs présents dans le monde virtuel soit optimale.
-Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life de le faire.</string>
- <string name="LoginFailedComputerProhibited">Impossible d'accéder à Second Life depuis cet ordinateur.
+Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life de le faire.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Impossible d'accéder à Second Life depuis cet ordinateur.
Si vous pensez qu'il s'agit d'une erreur, contactez
-l'Assistance à l'adresse suivante : support@secondlife.com.</string>
- <string name="LoginFailedAcountSuspended">Votre compte est inaccessible jusqu'à
-[TIME], heure du Pacifique.</string>
- <string name="LoginFailedAccountDisabled">Impossible de traiter votre demande à l'heure actuelle.
-Pour obtenir de l'aide, veuillez contacter l'Assistance Second Life à la page suivante : http://support.secondlife.com.</string>
- <string name="LoginFailedTransformError">Incohérence des données lors de la connexion.
-Veuillez contacter support@secondlife.com.</string>
- <string name="LoginFailedAccountMaintenance">Des opérations de maintenance mineures sont actuellement effectuées sur votre compte.
+l'Assistance à l'adresse suivante : support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Votre compte est inaccessible jusqu'à
+[TIME], heure du Pacifique.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Impossible de traiter votre demande à l'heure actuelle.
+Pour obtenir de l'aide, veuillez contacter l'Assistance Second Life à la page suivante : http://support.secondlife.com.
+ </string>
+ <string name="LoginFailedTransformError">
+ Incohérence des données lors de la connexion.
+Veuillez contacter support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Des opérations de maintenance mineures sont actuellement effectuées sur votre compte.
Votre compte est inaccessible jusqu'à
[TIME], heure du Pacifique.
-Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string>
- <string name="LoginFailedPendingLogoutFault">Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion.</string>
- <string name="LoginFailedPendingLogout">Le système est en train de vous déconnecter.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="LoginFailedUnableToCreateSession">Impossible de créer de session valide.</string>
- <string name="LoginFailedUnableToConnectToSimulator">Impossible de se connecter à un simulateur.</string>
- <string name="LoginFailedRestrictedHours">Votre compte permet uniquement d'accéder à Second Life
+Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Le système est en train de vous déconnecter.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Impossible de créer de session valide.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Impossible de se connecter à un simulateur.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Votre compte permet uniquement d'accéder à Second Life
entre [START] et [END], heure du Pacifique.
Veuillez réessayer au cours de la période indiquée.
-Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string>
- <string name="LoginFailedIncorrectParameters">Paramètres incorrects.
-Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string>
- <string name="LoginFailedFirstNameNotAlphanumeric">Le paramètre Prénom doit être alphanumérique.
-Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string>
- <string name="LoginFailedLastNameNotAlphanumeric">Le paramètre Nom doit être alphanumérique.
-Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string>
- <string name="LogoutFailedRegionGoingOffline">La région est en train d'être mise hors ligne.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="LogoutFailedAgentNotInRegion">Agent absent de la région.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="LogoutFailedPendingLogin">Une autre session était en cours d'ouverture au sein de la région.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="LogoutFailedLoggingOut">La session précédente était en cours de fermeture au sein de la région.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="LogoutFailedStillLoggingOut">Fermeture de la session précédente toujours en cours pour la région.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="LogoutSucceeded">Dernière session fermée au sein de la région.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="LogoutFailedLogoutBegun">Processus de déconnexion commencé pour la région.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="LoginFailedLoggingOutSession">Le système a commencé à fermer votre dernière session.
-Veuillez réessayer de vous connecter dans une minute.</string>
- <string name="AgentLostConnection">Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet.</string>
- <string name="SavingSettings">Enregistrement des paramètres...</string>
- <string name="LoggingOut">Déconnexion...</string>
- <string name="ShuttingDown">Arrêt en cours...</string>
- <string name="YouHaveBeenDisconnected">Vous avez été déconnecté de la région où vous étiez.</string>
- <string name="SentToInvalidRegion">Vous avez été transféré vers une région non valide.</string>
- <string name="TestingDisconnect">Test de déconnexion du client</string>
- <string name="SocialFacebookConnecting">Connexion à Facebook…</string>
- <string name="SocialFacebookPosting">Publication…</string>
- <string name="SocialFacebookDisconnecting">Déconnexion de Facebook…</string>
- <string name="SocialFacebookErrorConnecting">Un problème est survenu lors de la connexion à Facebook.</string>
- <string name="SocialFacebookErrorPosting">Un problème est survenu lors de la publication sur Facebook.</string>
- <string name="SocialFacebookErrorDisconnecting">Un problème est survenu lors de la déconnexion à Facebook.</string>
- <string name="SocialFlickrConnecting">Connexion à Flickr...</string>
- <string name="SocialFlickrPosting">Publication…</string>
- <string name="SocialFlickrDisconnecting">Déconnexion de Flickr...</string>
- <string name="SocialFlickrErrorConnecting">Un problème est survenu lors de la connexion à Flickr.</string>
- <string name="SocialFlickrErrorPosting">Un problème est survenu lors de la publication sur Flickr.</string>
- <string name="SocialFlickrErrorDisconnecting">Un problème est survenu lors de la déconnexion de Flickr.</string>
- <string name="SocialTwitterConnecting">Connexion à Twitter...</string>
- <string name="SocialTwitterPosting">Publication…</string>
- <string name="SocialTwitterDisconnecting">Déconnexion de Twitter...</string>
- <string name="SocialTwitterErrorConnecting">Un problème est survenu lors de la connexion à Twitter.</string>
- <string name="SocialTwitterErrorPosting">Un problème est survenu lors de la publication sur Twitter.</string>
- <string name="SocialTwitterErrorDisconnecting">Un problème est survenu lors de la déconnexion de Twitter.</string>
- <string name="BlackAndWhite">Noir et blanc</string>
- <string name="Colors1970">Couleurs des années 1970</string>
- <string name="Intense">Intense</string>
- <string name="Newspaper">Presse</string>
- <string name="Sepia">Sépia</string>
- <string name="Spotlight">Projecteur</string>
- <string name="Video">Vidéo</string>
- <string name="Autocontrast">Contraste automatique</string>
- <string name="LensFlare">Halo</string>
- <string name="Miniature">Miniature</string>
- <string name="Toycamera">Toy Camera</string>
- <string name="TooltipPerson">Personne</string>
- <string name="TooltipNoName">(pas de nom)</string>
- <string name="TooltipOwner">Propriétaire :</string>
- <string name="TooltipPublic">Public</string>
- <string name="TooltipIsGroup">(Groupe)</string>
- <string name="TooltipForSaleL$">À vendre : [AMOUNT] L$</string>
- <string name="TooltipFlagGroupBuild">Contruction de groupe</string>
- <string name="TooltipFlagNoBuild">Pas de construction</string>
- <string name="TooltipFlagNoEdit">Contruction de groupe</string>
- <string name="TooltipFlagNotSafe">Non sécurisé</string>
- <string name="TooltipFlagNoFly">Interdiction de voler</string>
- <string name="TooltipFlagGroupScripts">Scripts de groupe</string>
- <string name="TooltipFlagNoScripts">Pas de scripts</string>
- <string name="TooltipLand">Terrain :</string>
- <string name="TooltipMustSingleDrop">Impossible de faire glisser plus d'un objet ici</string>
- <string name="TooltipTooManyWearables">Vous ne pouvez pas porter un dossier contenant plus de [AMOUNT] articles. Vous pouvez modifier cette limite dans Avancé &gt; Afficher les paramètres de débogage &gt; WearFolderLimit.</string>
+Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Paramètres incorrects.
+Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Le paramètre Prénom doit être alphanumérique.
+Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Le paramètre Nom doit être alphanumérique.
+Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La région est en train d'être mise hors ligne.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Agent absent de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Une autre session était en cours d'ouverture au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ La session précédente était en cours de fermeture au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Fermeture de la session précédente toujours en cours pour la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutSucceeded">
+ Dernière session fermée au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Processus de déconnexion commencé pour la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Le système a commencé à fermer votre dernière session.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="AgentLostConnection">
+ Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet.
+ </string>
+ <string name="SavingSettings">
+ Enregistrement des paramètres...
+ </string>
+ <string name="LoggingOut">
+ Déconnexion...
+ </string>
+ <string name="ShuttingDown">
+ Arrêt en cours...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Vous avez été déconnecté de la région où vous étiez.
+ </string>
+ <string name="SentToInvalidRegion">
+ Vous avez été transféré vers une région non valide.
+ </string>
+ <string name="TestingDisconnect">
+ Test de déconnexion du client
+ </string>
+ <string name="SocialFacebookConnecting">
+ Connexion à Facebook…
+ </string>
+ <string name="SocialFacebookPosting">
+ Publication…
+ </string>
+ <string name="SocialFacebookDisconnecting">
+ Déconnexion de Facebook…
+ </string>
+ <string name="SocialFacebookErrorConnecting">
+ Un problème est survenu lors de la connexion à Facebook.
+ </string>
+ <string name="SocialFacebookErrorPosting">
+ Un problème est survenu lors de la publication sur Facebook.
+ </string>
+ <string name="SocialFacebookErrorDisconnecting">
+ Un problème est survenu lors de la déconnexion à Facebook.
+ </string>
+ <string name="SocialFlickrConnecting">
+ Connexion à Flickr...
+ </string>
+ <string name="SocialFlickrPosting">
+ Publication…
+ </string>
+ <string name="SocialFlickrDisconnecting">
+ Déconnexion de Flickr...
+ </string>
+ <string name="SocialFlickrErrorConnecting">
+ Un problème est survenu lors de la connexion à Flickr.
+ </string>
+ <string name="SocialFlickrErrorPosting">
+ Un problème est survenu lors de la publication sur Flickr.
+ </string>
+ <string name="SocialFlickrErrorDisconnecting">
+ Un problème est survenu lors de la déconnexion de Flickr.
+ </string>
+ <string name="SocialTwitterConnecting">
+ Connexion à Twitter...
+ </string>
+ <string name="SocialTwitterPosting">
+ Publication…
+ </string>
+ <string name="SocialTwitterDisconnecting">
+ Déconnexion de Twitter...
+ </string>
+ <string name="SocialTwitterErrorConnecting">
+ Un problème est survenu lors de la connexion à Twitter.
+ </string>
+ <string name="SocialTwitterErrorPosting">
+ Un problème est survenu lors de la publication sur Twitter.
+ </string>
+ <string name="SocialTwitterErrorDisconnecting">
+ Un problème est survenu lors de la déconnexion de Twitter.
+ </string>
+ <string name="BlackAndWhite">
+ Noir et blanc
+ </string>
+ <string name="Colors1970">
+ Couleurs des années 1970
+ </string>
+ <string name="Intense">
+ Intense
+ </string>
+ <string name="Newspaper">
+ Presse
+ </string>
+ <string name="Sepia">
+ Sépia
+ </string>
+ <string name="Spotlight">
+ Projecteur
+ </string>
+ <string name="Video">
+ Vidéo
+ </string>
+ <string name="Autocontrast">
+ Contraste automatique
+ </string>
+ <string name="LensFlare">
+ Halo
+ </string>
+ <string name="Miniature">
+ Miniature
+ </string>
+ <string name="Toycamera">
+ Toy Camera
+ </string>
+ <string name="TooltipPerson">
+ Personne
+ </string>
+ <string name="TooltipNoName">
+ (pas de nom)
+ </string>
+ <string name="TooltipOwner">
+ Propriétaire :
+ </string>
+ <string name="TooltipPublic">
+ Public
+ </string>
+ <string name="TooltipIsGroup">
+ (Groupe)
+ </string>
+ <string name="TooltipForSaleL$">
+ À vendre : [AMOUNT] L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Contruction de groupe
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Pas de construction
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Contruction de groupe
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Non sécurisé
+ </string>
+ <string name="TooltipFlagNoFly">
+ Interdiction de voler
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Scripts de groupe
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Pas de scripts
+ </string>
+ <string name="TooltipLand">
+ Terrain :
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Impossible de faire glisser plus d'un objet ici
+ </string>
+ <string name="TooltipTooManyWearables">
+ Vous ne pouvez pas porter un dossier contenant plus de [AMOUNT] articles. Vous pouvez modifier cette limite dans Avancé &gt; Afficher les paramètres de débogage &gt; WearFolderLimit.
+ </string>
<string name="TooltipPrice" value="[AMOUNT] L$ :"/>
- <string name="TooltipSLIcon">Il s’agit d’un lien vers une page dans le domaine officiel SecondLife.com ou LindenLab.com.</string>
- <string name="TooltipOutboxDragToWorld">Vous ne pouvez pas rezzer (charger) des articles du dossier Annonces de la Place de marché</string>
- <string name="TooltipOutboxWorn">Vous ne pouvez pas mettre d'articles que vous portez dans le dossier Annonces de la Place du marché</string>
- <string name="TooltipOutboxFolderLevels">Le niveau de dossiers imbriqués dépasse [AMOUNT]. Diminuez le nombre de niveaux de dossiers imbriqués dans d'autres dossiers. Si nécessaire, placez certains articles dans une boîte.</string>
- <string name="TooltipOutboxTooManyFolders">Le nombre de sous-dossiers dépasse [AMOUNT]. Diminuez le nombre de sous-dossiers dans votre annonce. Si nécessaire, placez certains articles dans une boîte.</string>
- <string name="TooltipOutboxTooManyObjects">Le nombre d'articles dépasse [AMOUNT]. Pour pouvoir vendre plus de [AMOUNT] articles au sein d'une même annonce, vous devez placer certains de ces articles dans une boîte.</string>
- <string name="TooltipOutboxTooManyStockItems">Le nombre d'articles de stock dépasse [AMOUNT].</string>
- <string name="TooltipOutboxCannotDropOnRoot">Vous pouvez uniquement déposer des articles ou des dossiers dans les onglets TOUS ou NON ASSOCIÉS. Sélectionnez l’un de ces onglets et déplacez à nouveau votre ou vos article ou dossiers.</string>
- <string name="TooltipOutboxNoTransfer">Impossible de vendre ou de transférer un ou plusieurs de ces objets</string>
- <string name="TooltipOutboxNotInInventory">Vous ne pouvez mettre sur la Place du marché que des articles de votre inventaire</string>
- <string name="TooltipOutboxLinked">Vous ne pouvez pas mettre des articles ou dossiers liés sur la Place du marché</string>
- <string name="TooltipOutboxCallingCard">Vous ne pouvez pas mettre des cartes de visite sur la Place du marché</string>
- <string name="TooltipOutboxDragActive">vous ne pouvez pas déplacer une annonce publiée</string>
- <string name="TooltipOutboxCannotMoveRoot">Vous ne pouvez pas déplacer le dossier racine des annonces de la Place du marché</string>
- <string name="TooltipOutboxMixedStock">tous les articles d'un dossier de stock doivent avoir le même type et droit</string>
- <string name="TooltipDragOntoOwnChild">Impossible de déplacer un dossier vers son enfant</string>
- <string name="TooltipDragOntoSelf">Impossible de déplacer un dossier vers lui-même</string>
- <string name="TooltipHttpUrl">Cliquez pour afficher cette page web</string>
- <string name="TooltipSLURL">Cliquez pour en savoir plus sur cet endroit</string>
- <string name="TooltipAgentUrl">Cliquez pour afficher le profil de ce résident</string>
- <string name="TooltipAgentInspect">En savoir plus sur ce résident</string>
- <string name="TooltipAgentMute">Cliquer pour ignorer ce résident</string>
- <string name="TooltipAgentUnmute">Cliquer pour ne plus ignorer ce résident</string>
- <string name="TooltipAgentIM">Cliquer pour envoyer un IM à ce résident</string>
- <string name="TooltipAgentPay">Cliquer pour payer ce résident</string>
- <string name="TooltipAgentOfferTeleport">Cliquer pour proposer une téléportation à ce résident</string>
- <string name="TooltipAgentRequestFriend">Cliquer pour demander à ce résident d'être votre ami</string>
- <string name="TooltipGroupUrl">Cliquez pour afficher la description de ce groupe</string>
- <string name="TooltipEventUrl">Cliquez pour afficher la description de cet événement</string>
- <string name="TooltipClassifiedUrl">Cliquez pour afficher cette petite annonce</string>
- <string name="TooltipParcelUrl">Cliquez pour afficher la description de cette parcelle</string>
- <string name="TooltipTeleportUrl">Cliquez pour vous téléporter à cet endroit</string>
- <string name="TooltipObjectIMUrl">Cliquez pour afficher la description de cet objet</string>
- <string name="TooltipMapUrl">Cliquez pour voir cet emplacement sur la carte</string>
- <string name="TooltipSLAPP">Cliquez pour exécuter la commande secondlife://</string>
+ <string name="TooltipSLIcon">
+ Il s’agit d’un lien vers une page dans le domaine officiel SecondLife.com ou LindenLab.com.
+ </string>
+ <string name="TooltipOutboxDragToWorld">
+ Vous ne pouvez pas rezzer (charger) des articles du dossier Annonces de la Place de marché
+ </string>
+ <string name="TooltipOutboxWorn">
+ Vous ne pouvez pas mettre d'articles que vous portez dans le dossier Annonces de la Place du marché
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Le niveau de dossiers imbriqués dépasse [AMOUNT]. Diminuez le nombre de niveaux de dossiers imbriqués dans d'autres dossiers. Si nécessaire, placez certains articles dans une boîte.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Le nombre de sous-dossiers dépasse [AMOUNT]. Diminuez le nombre de sous-dossiers dans votre annonce. Si nécessaire, placez certains articles dans une boîte.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Le nombre d'articles dépasse [AMOUNT]. Pour pouvoir vendre plus de [AMOUNT] articles au sein d'une même annonce, vous devez placer certains de ces articles dans une boîte.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Le nombre d'articles de stock dépasse [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Vous pouvez uniquement déposer des articles ou des dossiers dans les onglets TOUS ou NON ASSOCIÉS. Sélectionnez l’un de ces onglets et déplacez à nouveau votre ou vos article ou dossiers.
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Impossible de vendre ou de transférer un ou plusieurs de ces objets
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Vous ne pouvez mettre sur la Place du marché que des articles de votre inventaire
+ </string>
+ <string name="TooltipOutboxLinked">
+ Vous ne pouvez pas mettre des articles ou dossiers liés sur la Place du marché
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Vous ne pouvez pas mettre des cartes de visite sur la Place du marché
+ </string>
+ <string name="TooltipOutboxDragActive">
+ vous ne pouvez pas déplacer une annonce publiée
+ </string>
+ <string name="TooltipOutboxCannotMoveRoot">
+ Vous ne pouvez pas déplacer le dossier racine des annonces de la Place du marché
+ </string>
+ <string name="TooltipOutboxMixedStock">
+ tous les articles d'un dossier de stock doivent avoir le même type et droit
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Impossible de déplacer un dossier vers son enfant
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Impossible de déplacer un dossier vers lui-même
+ </string>
+ <string name="TooltipHttpUrl">
+ Cliquez pour afficher cette page web
+ </string>
+ <string name="TooltipSLURL">
+ Cliquez pour en savoir plus sur cet endroit
+ </string>
+ <string name="TooltipAgentUrl">
+ Cliquez pour afficher le profil de ce résident
+ </string>
+ <string name="TooltipAgentInspect">
+ En savoir plus sur ce résident
+ </string>
+ <string name="TooltipAgentMute">
+ Cliquer pour ignorer ce résident
+ </string>
+ <string name="TooltipAgentUnmute">
+ Cliquer pour ne plus ignorer ce résident
+ </string>
+ <string name="TooltipAgentIM">
+ Cliquer pour envoyer un IM à ce résident
+ </string>
+ <string name="TooltipAgentPay">
+ Cliquer pour payer ce résident
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Cliquer pour proposer une téléportation à ce résident
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Cliquer pour demander à ce résident d'être votre ami
+ </string>
+ <string name="TooltipGroupUrl">
+ Cliquez pour afficher la description de ce groupe
+ </string>
+ <string name="TooltipEventUrl">
+ Cliquez pour afficher la description de cet événement
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Cliquez pour afficher cette petite annonce
+ </string>
+ <string name="TooltipParcelUrl">
+ Cliquez pour afficher la description de cette parcelle
+ </string>
+ <string name="TooltipTeleportUrl">
+ Cliquez pour vous téléporter à cet endroit
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Cliquez pour afficher la description de cet objet
+ </string>
+ <string name="TooltipMapUrl">
+ Cliquez pour voir cet emplacement sur la carte
+ </string>
+ <string name="TooltipSLAPP">
+ Cliquez pour exécuter la commande secondlife://
+ </string>
<string name="CurrentURL" value=" URL actuelle : [CurrentURL]"/>
- <string name="TooltipEmail">Cliquez pour composer un message</string>
- <string name="SLurlLabelTeleport">Me téléporter vers</string>
- <string name="SLurlLabelShowOnMap">Afficher la carte pour</string>
- <string name="SLappAgentMute">Ignorer</string>
- <string name="SLappAgentUnmute">Ne plus ignorer</string>
- <string name="SLappAgentIM">IM</string>
- <string name="SLappAgentPay">Payer</string>
- <string name="SLappAgentOfferTeleport">Proposer une téléportation à</string>
- <string name="SLappAgentRequestFriend">Demande d'amitié</string>
- <string name="SLappAgentRemoveFriend">Suppression d'un ami</string>
- <string name="BUTTON_CLOSE_DARWIN">Fermer (⌘W)</string>
- <string name="BUTTON_CLOSE_WIN">Fermer (Ctrl+W)</string>
- <string name="BUTTON_CLOSE_CHROME">Fermer</string>
- <string name="BUTTON_RESTORE">Restaurer</string>
- <string name="BUTTON_MINIMIZE">Minimiser</string>
- <string name="BUTTON_TEAR_OFF">Réduire</string>
- <string name="BUTTON_DOCK">Attacher</string>
- <string name="BUTTON_HELP">Afficher l'aide</string>
- <string name="TooltipNotecardNotAllowedTypeDrop">Les éléments de ce type ne peuvent pas être attachés
-aux notes de cette région.</string>
- <string name="TooltipNotecardOwnerRestrictedDrop">Seuls des éléments avec des autorisation
+ <string name="TooltipEmail">
+ Cliquez pour composer un message
+ </string>
+ <string name="SLurlLabelTeleport">
+ Me téléporter vers
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Afficher la carte pour
+ </string>
+ <string name="SLappAgentMute">
+ Ignorer
+ </string>
+ <string name="SLappAgentUnmute">
+ Ne plus ignorer
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Payer
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Proposer une téléportation à
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Demande d'amitié
+ </string>
+ <string name="SLappAgentRemoveFriend">
+ Suppression d'un ami
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Fermer (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Fermer (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Fermer
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restaurer
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimiser
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Réduire
+ </string>
+ <string name="BUTTON_DOCK">
+ Attacher
+ </string>
+ <string name="BUTTON_HELP">
+ Afficher l'aide
+ </string>
+ <string name="TooltipNotecardNotAllowedTypeDrop">
+ Les éléments de ce type ne peuvent pas être attachés
+aux notes de cette région.
+ </string>
+ <string name="TooltipNotecardOwnerRestrictedDrop">
+ Seuls des éléments avec des autorisation
illimitées pour le 'prochain propriétaire'
-peuvent être joints aux notes.</string>
- <string name="Searching">Recherche...</string>
- <string name="NoneFound">Aucun résultat.</string>
- <string name="RetrievingData">En cours d'extraction...</string>
- <string name="ReleaseNotes">Notes de version</string>
- <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string>
- <string name="LoadingData">Chargement...</string>
- <string name="AvatarNameNobody">(personne)</string>
- <string name="AvatarNameWaiting">(en attente)</string>
- <string name="AvatarNameMultiple">(multiple)</string>
- <string name="GroupNameNone">(aucun)</string>
- <string name="AssetErrorNone">Aucune erreur</string>
- <string name="AssetErrorRequestFailed">Requête de l'actif : échec</string>
- <string name="AssetErrorNonexistentFile">Requête de l'actif : fichier inexistant</string>
- <string name="AssetErrorNotInDatabase">Requête de l'actif : actif introuvable dans la base de données</string>
- <string name="AssetErrorEOF">Fin du ficher</string>
- <string name="AssetErrorCannotOpenFile">Impossible d'ouvrir le fichier</string>
- <string name="AssetErrorFileNotFound">Fichier introuvable</string>
- <string name="AssetErrorTCPTimeout">Délai d'attente du transfert du fichier dépassé</string>
- <string name="AssetErrorCircuitGone">Disparition du circuit</string>
- <string name="AssetErrorPriceMismatch">Il y a une différence de prix entre le client et le serveur</string>
- <string name="AssetErrorUnknownStatus">Statut inconnu</string>
- <string name="AssetUploadServerUnreacheble">Service inaccessible.</string>
- <string name="AssetUploadServerDifficulties">Le serveur rencontres des difficultés imprévues.</string>
- <string name="AssetUploadServerUnavaliable">Services non disponible ou la durée du chargement est dépassée.</string>
- <string name="AssetUploadRequestInvalid">Erreur dans la demande de chargement. Veuillez consulter le site :
-http://secondlife.com/support pour vous aider à résoudre ce problème.</string>
- <string name="SettingValidationError">Échec de la validation pour l'importation des paramètres [NAME]</string>
- <string name="SettingImportFileError">Impossible d'ouvre le fichier [FILE]</string>
- <string name="SettingParseFileError">Impossible d'ouvre le fichier [FILE]</string>
- <string name="SettingTranslateError">Impossible de traduit les paramètres windlight hérités [NAME]</string>
- <string name="texture">texture</string>
- <string name="sound">son</string>
- <string name="calling card">carte de visite</string>
- <string name="landmark">repère</string>
- <string name="legacy script">script (ancienne version)</string>
- <string name="clothing">habits</string>
- <string name="object">objet</string>
- <string name="note card">note</string>
- <string name="folder">dossier</string>
- <string name="root">racine</string>
- <string name="lsl2 script">script LSL2</string>
- <string name="lsl bytecode">bytecode LSL</string>
- <string name="tga texture">texture tga</string>
- <string name="body part">partie du corps</string>
- <string name="snapshot">photo</string>
- <string name="lost and found">Objets trouvés</string>
- <string name="targa image">image targa</string>
- <string name="trash">Corbeille</string>
- <string name="jpeg image">image jpeg</string>
- <string name="animation">animation</string>
- <string name="gesture">geste</string>
- <string name="simstate">simstate</string>
- <string name="favorite">favori</string>
- <string name="symbolic link">lien</string>
- <string name="symbolic folder link">lien du dossier</string>
- <string name="settings blob">paramètres</string>
- <string name="mesh">maillage</string>
- <string name="AvatarEditingAppearance">(Apparence en cours de modification)</string>
- <string name="AvatarAway">Absent</string>
- <string name="AvatarDoNotDisturb">Ne pas déranger</string>
- <string name="AvatarMuted">Bloqué(e)</string>
- <string name="anim_express_afraid">Effrayé</string>
- <string name="anim_express_anger">En colère</string>
- <string name="anim_away">Absent</string>
- <string name="anim_backflip">Salto arrière</string>
- <string name="anim_express_laugh">Rire en se tenant le ventre</string>
- <string name="anim_express_toothsmile">Grand sourire</string>
- <string name="anim_blowkiss">Envoyer un baiser</string>
- <string name="anim_express_bored">Bailler d'ennui</string>
- <string name="anim_bow">S'incliner</string>
- <string name="anim_clap">Applaudir</string>
- <string name="anim_courtbow">Révérence de cour</string>
- <string name="anim_express_cry">Pleurer</string>
- <string name="anim_dance1">Danse 1</string>
- <string name="anim_dance2">Danse 2</string>
- <string name="anim_dance3">Danse 3</string>
- <string name="anim_dance4">Danse 4</string>
- <string name="anim_dance5">Danse 5</string>
- <string name="anim_dance6">Danse 6</string>
- <string name="anim_dance7">Danse 7</string>
- <string name="anim_dance8">Danse 8</string>
- <string name="anim_express_disdain">Mépris</string>
- <string name="anim_drink">Boire</string>
- <string name="anim_express_embarrased">Gêne</string>
- <string name="anim_angry_fingerwag">Désapprobation</string>
- <string name="anim_fist_pump">Victoire</string>
- <string name="anim_yoga_float">Yoga</string>
- <string name="anim_express_frown">Froncer les sourcils</string>
- <string name="anim_impatient">Impatient</string>
- <string name="anim_jumpforjoy">Sauter de joie</string>
- <string name="anim_kissmybutt">Va te faire voir !</string>
- <string name="anim_express_kiss">Envoyer un baiser</string>
- <string name="anim_laugh_short">Rire</string>
- <string name="anim_musclebeach">Montrer ses muscles</string>
- <string name="anim_no_unhappy">Non (mécontent)</string>
- <string name="anim_no_head">Non</string>
- <string name="anim_nyanya">Na na na na nère</string>
- <string name="anim_punch_onetwo">Gauche-droite</string>
- <string name="anim_express_open_mouth">Bouche ouverte</string>
- <string name="anim_peace">Paix</string>
- <string name="anim_point_you">Montrer quelqu'un du doigt</string>
- <string name="anim_point_me">Se montrer du doigt</string>
- <string name="anim_punch_l">Gauche</string>
- <string name="anim_punch_r">Droite</string>
- <string name="anim_rps_countdown">Compter (pierre-papier-ciseaux)</string>
- <string name="anim_rps_paper">Papier (pierre-papier-ciseaux)</string>
- <string name="anim_rps_rock">Pierre (pierre-papier-ciseaux)</string>
- <string name="anim_rps_scissors">Ciseaux (pierre-papier-ciseaux)</string>
- <string name="anim_express_repulsed">Dégoût</string>
- <string name="anim_kick_roundhouse_r">Coup de pied circulaire</string>
- <string name="anim_express_sad">Triste</string>
- <string name="anim_salute">Salut</string>
- <string name="anim_shout">Crier</string>
- <string name="anim_express_shrug">Hausser les épaules</string>
- <string name="anim_express_smile">Sourire</string>
- <string name="anim_smoke_idle">Fumer, immobile</string>
- <string name="anim_smoke_inhale">Fumer, prendre une bouffée</string>
- <string name="anim_smoke_throw_down">Fumer, jeter son mégot</string>
- <string name="anim_express_surprise">Surprise</string>
- <string name="anim_sword_strike_r">Coup d'épée</string>
- <string name="anim_angry_tantrum">Caprice</string>
- <string name="anim_express_tongue_out">Tirer la langue</string>
- <string name="anim_hello">Faire signe</string>
- <string name="anim_whisper">Chuchoter</string>
- <string name="anim_whistle">Siffler</string>
- <string name="anim_express_wink">Clin d'œil</string>
- <string name="anim_wink_hollywood">Clin d'œil (Hollywood)</string>
- <string name="anim_express_worry">Soucis</string>
- <string name="anim_yes_happy">Oui (Joie)</string>
- <string name="anim_yes_head">Oui</string>
- <string name="multiple_textures">Multiples</string>
- <string name="use_texture">Utiliser la texture</string>
- <string name="manip_hint1">Faites glisser le curseur sur l'axe</string>
- <string name="manip_hint2">pour le fixer sur la grille</string>
- <string name="texture_loading">Chargement...</string>
- <string name="worldmap_offline">Hors ligne</string>
- <string name="worldmap_item_tooltip_format">[AREA] m² [PRICE] L$</string>
- <string name="worldmap_results_none_found">Aucun résultat.</string>
- <string name="Ok">OK</string>
- <string name="Premature end of file">Fichier incomplet</string>
- <string name="ST_NO_JOINT">Impossible de trouver ROOT ou JOINT.</string>
- <string name="NearbyChatTitle">Chat près de moi</string>
- <string name="NearbyChatLabel">(Chat près de moi)</string>
- <string name="whisper">chuchote :</string>
- <string name="shout">crie :</string>
- <string name="ringing">Connexion au chat vocal du Monde en cours…</string>
- <string name="connected">Connecté(e)</string>
- <string name="unavailable">Voix non disponible à l'endroit où vous êtes</string>
- <string name="hang_up">Déconnecté du chat vocal</string>
- <string name="reconnect_nearby">Vous allez maintenant être reconnecté(e) au chat vocal près de vous.</string>
- <string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].</string>
- <string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS].</string>
- <string name="AdditionalPermissionsRequestHeader">Si vous autorisez un accès à votre compte, vous autorisez également l'objet à :</string>
- <string name="ScriptTakeMoney">Débiter vos Linden dollars (L$)</string>
- <string name="ActOnControlInputs">Utiliser vos touches de commandes</string>
- <string name="RemapControlInputs">Reconfigurer vos touches de commandes</string>
- <string name="AnimateYourAvatar">Animer votre avatar</string>
- <string name="AttachToYourAvatar">Attacher à votre avatar</string>
- <string name="ReleaseOwnership">Passer l'objet dans le domaine public (sans propriétaire)</string>
- <string name="LinkAndDelink">Lier et délier d'autres objets</string>
- <string name="AddAndRemoveJoints">Créer et supprimer des liens avec d'autres objets</string>
- <string name="ChangePermissions">Modifier ses droits</string>
- <string name="TrackYourCamera">Suivre votre caméra</string>
- <string name="ControlYourCamera">Contrôler votre caméra</string>
- <string name="TeleportYourAgent">Vous téléporter</string>
- <string name="ForceSitAvatar">Forcez votre avatar à s’asseoir</string>
- <string name="ChangeEnvSettings">Changer vos paramètres d'environnement</string>
- <string name="NotConnected">Pas connecté(e)</string>
- <string name="AgentNameSubst">(Vous)</string>
+peuvent être joints aux notes.
+ </string>
+ <string name="Searching">
+ Recherche...
+ </string>
+ <string name="NoneFound">
+ Aucun résultat.
+ </string>
+ <string name="RetrievingData">
+ En cours d'extraction...
+ </string>
+ <string name="ReleaseNotes">
+ Notes de version
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ https://megapahit.net/
+ </string>
+ <string name="LoadingData">
+ Chargement...
+ </string>
+ <string name="AvatarNameNobody">
+ (personne)
+ </string>
+ <string name="AvatarNameWaiting">
+ (en attente)
+ </string>
+ <string name="AvatarNameMultiple">
+ (multiple)
+ </string>
+ <string name="GroupNameNone">
+ (aucun)
+ </string>
+ <string name="AssetErrorNone">
+ Aucune erreur
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Requête de l'actif : échec
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Requête de l'actif : fichier inexistant
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Requête de l'actif : actif introuvable dans la base de données
+ </string>
+ <string name="AssetErrorEOF">
+ Fin du ficher
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Impossible d'ouvrir le fichier
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Fichier introuvable
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Délai d'attente du transfert du fichier dépassé
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Disparition du circuit
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Il y a une différence de prix entre le client et le serveur
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Statut inconnu
+ </string>
+ <string name="AssetUploadServerUnreacheble">
+ Service inaccessible.
+ </string>
+ <string name="AssetUploadServerDifficulties">
+ Le serveur rencontres des difficultés imprévues.
+ </string>
+ <string name="AssetUploadServerUnavaliable">
+ Services non disponible ou la durée du chargement est dépassée.
+ </string>
+ <string name="AssetUploadRequestInvalid">
+ Erreur dans la demande de chargement. Veuillez consulter le site :
+http://secondlife.com/support pour vous aider à résoudre ce problème.
+ </string>
+ <string name="SettingValidationError">
+ Échec de la validation pour l'importation des paramètres [NAME]
+ </string>
+ <string name="SettingImportFileError">
+ Impossible d'ouvre le fichier [FILE]
+ </string>
+ <string name="SettingParseFileError">
+ Impossible d'ouvre le fichier [FILE]
+ </string>
+ <string name="SettingTranslateError">
+ Impossible de traduit les paramètres windlight hérités [NAME]
+ </string>
+ <string name="texture">
+ texture
+ </string>
+ <string name="sound">
+ son
+ </string>
+ <string name="calling card">
+ carte de visite
+ </string>
+ <string name="landmark">
+ repère
+ </string>
+ <string name="legacy script">
+ script (ancienne version)
+ </string>
+ <string name="clothing">
+ habits
+ </string>
+ <string name="object">
+ objet
+ </string>
+ <string name="note card">
+ note
+ </string>
+ <string name="folder">
+ dossier
+ </string>
+ <string name="root">
+ racine
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ texture tga
+ </string>
+ <string name="body part">
+ partie du corps
+ </string>
+ <string name="snapshot">
+ photo
+ </string>
+ <string name="lost and found">
+ Objets trouvés
+ </string>
+ <string name="targa image">
+ image targa
+ </string>
+ <string name="trash">
+ Corbeille
+ </string>
+ <string name="jpeg image">
+ image jpeg
+ </string>
+ <string name="animation">
+ animation
+ </string>
+ <string name="gesture">
+ geste
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favori
+ </string>
+ <string name="symbolic link">
+ lien
+ </string>
+ <string name="symbolic folder link">
+ lien du dossier
+ </string>
+ <string name="settings blob">
+ paramètres
+ </string>
+ <string name="mesh">
+ maillage
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Apparence en cours de modification)
+ </string>
+ <string name="AvatarAway">
+ Absent
+ </string>
+ <string name="AvatarDoNotDisturb">
+ Ne pas déranger
+ </string>
+ <string name="AvatarMuted">
+ Bloqué(e)
+ </string>
+ <string name="anim_express_afraid">
+ Effrayé
+ </string>
+ <string name="anim_express_anger">
+ En colère
+ </string>
+ <string name="anim_away">
+ Absent
+ </string>
+ <string name="anim_backflip">
+ Salto arrière
+ </string>
+ <string name="anim_express_laugh">
+ Rire en se tenant le ventre
+ </string>
+ <string name="anim_express_toothsmile">
+ Grand sourire
+ </string>
+ <string name="anim_blowkiss">
+ Envoyer un baiser
+ </string>
+ <string name="anim_express_bored">
+ Bailler d'ennui
+ </string>
+ <string name="anim_bow">
+ S'incliner
+ </string>
+ <string name="anim_clap">
+ Applaudir
+ </string>
+ <string name="anim_courtbow">
+ Révérence de cour
+ </string>
+ <string name="anim_express_cry">
+ Pleurer
+ </string>
+ <string name="anim_dance1">
+ Danse 1
+ </string>
+ <string name="anim_dance2">
+ Danse 2
+ </string>
+ <string name="anim_dance3">
+ Danse 3
+ </string>
+ <string name="anim_dance4">
+ Danse 4
+ </string>
+ <string name="anim_dance5">
+ Danse 5
+ </string>
+ <string name="anim_dance6">
+ Danse 6
+ </string>
+ <string name="anim_dance7">
+ Danse 7
+ </string>
+ <string name="anim_dance8">
+ Danse 8
+ </string>
+ <string name="anim_express_disdain">
+ Mépris
+ </string>
+ <string name="anim_drink">
+ Boire
+ </string>
+ <string name="anim_express_embarrased">
+ Gêne
+ </string>
+ <string name="anim_angry_fingerwag">
+ Désapprobation
+ </string>
+ <string name="anim_fist_pump">
+ Victoire
+ </string>
+ <string name="anim_yoga_float">
+ Yoga
+ </string>
+ <string name="anim_express_frown">
+ Froncer les sourcils
+ </string>
+ <string name="anim_impatient">
+ Impatient
+ </string>
+ <string name="anim_jumpforjoy">
+ Sauter de joie
+ </string>
+ <string name="anim_kissmybutt">
+ Va te faire voir !
+ </string>
+ <string name="anim_express_kiss">
+ Envoyer un baiser
+ </string>
+ <string name="anim_laugh_short">
+ Rire
+ </string>
+ <string name="anim_musclebeach">
+ Montrer ses muscles
+ </string>
+ <string name="anim_no_unhappy">
+ Non (mécontent)
+ </string>
+ <string name="anim_no_head">
+ Non
+ </string>
+ <string name="anim_nyanya">
+ Na na na na nère
+ </string>
+ <string name="anim_punch_onetwo">
+ Gauche-droite
+ </string>
+ <string name="anim_express_open_mouth">
+ Bouche ouverte
+ </string>
+ <string name="anim_peace">
+ Paix
+ </string>
+ <string name="anim_point_you">
+ Montrer quelqu'un du doigt
+ </string>
+ <string name="anim_point_me">
+ Se montrer du doigt
+ </string>
+ <string name="anim_punch_l">
+ Gauche
+ </string>
+ <string name="anim_punch_r">
+ Droite
+ </string>
+ <string name="anim_rps_countdown">
+ Compter (pierre-papier-ciseaux)
+ </string>
+ <string name="anim_rps_paper">
+ Papier (pierre-papier-ciseaux)
+ </string>
+ <string name="anim_rps_rock">
+ Pierre (pierre-papier-ciseaux)
+ </string>
+ <string name="anim_rps_scissors">
+ Ciseaux (pierre-papier-ciseaux)
+ </string>
+ <string name="anim_express_repulsed">
+ Dégoût
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Coup de pied circulaire
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Salut
+ </string>
+ <string name="anim_shout">
+ Crier
+ </string>
+ <string name="anim_express_shrug">
+ Hausser les épaules
+ </string>
+ <string name="anim_express_smile">
+ Sourire
+ </string>
+ <string name="anim_smoke_idle">
+ Fumer, immobile
+ </string>
+ <string name="anim_smoke_inhale">
+ Fumer, prendre une bouffée
+ </string>
+ <string name="anim_smoke_throw_down">
+ Fumer, jeter son mégot
+ </string>
+ <string name="anim_express_surprise">
+ Surprise
+ </string>
+ <string name="anim_sword_strike_r">
+ Coup d'épée
+ </string>
+ <string name="anim_angry_tantrum">
+ Caprice
+ </string>
+ <string name="anim_express_tongue_out">
+ Tirer la langue
+ </string>
+ <string name="anim_hello">
+ Faire signe
+ </string>
+ <string name="anim_whisper">
+ Chuchoter
+ </string>
+ <string name="anim_whistle">
+ Siffler
+ </string>
+ <string name="anim_express_wink">
+ Clin d'œil
+ </string>
+ <string name="anim_wink_hollywood">
+ Clin d'œil (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Soucis
+ </string>
+ <string name="anim_yes_happy">
+ Oui (Joie)
+ </string>
+ <string name="anim_yes_head">
+ Oui
+ </string>
+ <string name="multiple_textures">
+ Multiples
+ </string>
+ <string name="use_texture">
+ Utiliser la texture
+ </string>
+ <string name="manip_hint1">
+ Faites glisser le curseur sur l'axe
+ </string>
+ <string name="manip_hint2">
+ pour le fixer sur la grille
+ </string>
+ <string name="texture_loading">
+ Chargement...
+ </string>
+ <string name="worldmap_offline">
+ Hors ligne
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² [PRICE] L$
+ </string>
+ <string name="worldmap_results_none_found">
+ Aucun résultat.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fichier incomplet
+ </string>
+ <string name="ST_NO_JOINT">
+ Impossible de trouver ROOT ou JOINT.
+ </string>
+ <string name="NearbyChatTitle">
+ Chat près de moi
+ </string>
+ <string name="NearbyChatLabel">
+ (Chat près de moi)
+ </string>
+ <string name="whisper">
+ chuchote :
+ </string>
+ <string name="shout">
+ crie :
+ </string>
+ <string name="ringing">
+ Connexion au chat vocal du Monde en cours…
+ </string>
+ <string name="connected">
+ Connecté(e)
+ </string>
+ <string name="unavailable">
+ Voix non disponible à l'endroit où vous êtes
+ </string>
+ <string name="hang_up">
+ Déconnecté du chat vocal
+ </string>
+ <string name="reconnect_nearby">
+ Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS].
+ </string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Si vous autorisez un accès à votre compte, vous autorisez également l'objet à :
+ </string>
+ <string name="ScriptTakeMoney">
+ Débiter vos Linden dollars (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Utiliser vos touches de commandes
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurer vos touches de commandes
+ </string>
+ <string name="AnimateYourAvatar">
+ Animer votre avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Attacher à votre avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Passer l'objet dans le domaine public (sans propriétaire)
+ </string>
+ <string name="LinkAndDelink">
+ Lier et délier d'autres objets
+ </string>
+ <string name="AddAndRemoveJoints">
+ Créer et supprimer des liens avec d'autres objets
+ </string>
+ <string name="ChangePermissions">
+ Modifier ses droits
+ </string>
+ <string name="TrackYourCamera">
+ Suivre votre caméra
+ </string>
+ <string name="ControlYourCamera">
+ Contrôler votre caméra
+ </string>
+ <string name="TeleportYourAgent">
+ Vous téléporter
+ </string>
+ <string name="ForceSitAvatar">
+ Forcez votre avatar à s’asseoir
+ </string>
+ <string name="ChangeEnvSettings">
+ Changer vos paramètres d'environnement
+ </string>
+ <string name="NotConnected">
+ Pas connecté(e)
+ </string>
+ <string name="AgentNameSubst">
+ (Vous)
+ </string>
<string name="JoinAnExperience"/>
- <string name="SilentlyManageEstateAccess">Supprimer les alertes lors de la gestion des listes d'accès aux domaines</string>
- <string name="OverrideYourAnimations">Remplacer vos animations par défaut</string>
- <string name="ScriptReturnObjects">Renvoyer les objets de votre part</string>
- <string name="UnknownScriptPermission">(inconnu)</string>
- <string name="SIM_ACCESS_PG">Général</string>
- <string name="SIM_ACCESS_MATURE">Modéré</string>
- <string name="SIM_ACCESS_ADULT">Adulte</string>
- <string name="SIM_ACCESS_DOWN">Hors ligne</string>
- <string name="SIM_ACCESS_MIN">Inconnu</string>
- <string name="land_type_unknown">(inconnu)</string>
- <string name="Estate / Full Region">Domaine / Région entière</string>
- <string name="Estate / Homestead">Domaine / Homestead</string>
- <string name="Mainland / Homestead">Continent / Homestead</string>
- <string name="Mainland / Full Region">Continent / Région entière</string>
- <string name="all_files">Tous fichiers</string>
- <string name="sound_files">Sons</string>
- <string name="animation_files">Animations</string>
- <string name="image_files">Images</string>
- <string name="save_file_verb">Enregistrer</string>
- <string name="load_file_verb">Charger</string>
- <string name="targa_image_files">Images Targa</string>
- <string name="bitmap_image_files">Images Bitmap</string>
- <string name="png_image_files">Images PNG</string>
- <string name="save_texture_image_files">Images Targa ou PNG</string>
- <string name="avi_movie_file">Fichier de film AVI</string>
- <string name="xaf_animation_file">Fichier d'animation XAF</string>
- <string name="xml_file">Fichier XML</string>
- <string name="raw_file">Fichier RAW</string>
- <string name="compressed_image_files">Images compressées</string>
- <string name="load_files">Charger des fichiers</string>
- <string name="choose_the_directory">Choisir le répertoire</string>
- <string name="script_files">Scripts</string>
- <string name="dictionary_files">Dictionnaires</string>
- <string name="shape">Silhouette</string>
- <string name="skin">Peau</string>
- <string name="hair">Cheveux</string>
- <string name="eyes">Yeux</string>
- <string name="shirt">Chemise</string>
- <string name="pants">Pantalon</string>
- <string name="shoes">Chaussures</string>
- <string name="socks">Chaussettes</string>
- <string name="jacket">Veste</string>
- <string name="gloves">Gants</string>
- <string name="undershirt">Débardeur</string>
- <string name="underpants">Caleçon</string>
- <string name="skirt">Jupe</string>
- <string name="alpha">Alpha</string>
- <string name="tattoo">Tatouage</string>
- <string name="universal">Universel</string>
- <string name="physics">Propriétés physiques</string>
- <string name="invalid">non valide</string>
- <string name="none">aucun</string>
- <string name="shirt_not_worn">Chemise non portée</string>
- <string name="pants_not_worn">Pantalon non porté</string>
- <string name="shoes_not_worn">Chaussures non portées</string>
- <string name="socks_not_worn">Chaussettes non portées</string>
- <string name="jacket_not_worn">Veste non portée</string>
- <string name="gloves_not_worn">Gants non portés</string>
- <string name="undershirt_not_worn">Débardeur non porté</string>
- <string name="underpants_not_worn">Caleçon non porté</string>
- <string name="skirt_not_worn">Jupe non portée</string>
- <string name="alpha_not_worn">Alpha non porté</string>
- <string name="tattoo_not_worn">Tatouage non porté</string>
- <string name="universal_not_worn">Universel non porté</string>
- <string name="physics_not_worn">Propriétés physiques non portées</string>
- <string name="invalid_not_worn">non valide</string>
- <string name="create_new_shape">Créer une nouvelle silhouette</string>
- <string name="create_new_skin">Créer une nouvelle peau</string>
- <string name="create_new_hair">Créer de nouveaux cheveux</string>
- <string name="create_new_eyes">Créer de nouveaux yeux</string>
- <string name="create_new_shirt">Créer une nouvelle chemise</string>
- <string name="create_new_pants">Créer un nouveau pantalon</string>
- <string name="create_new_shoes">Créer de nouvelles chaussures</string>
- <string name="create_new_socks">Créer de nouvelles chaussettes</string>
- <string name="create_new_jacket">Créer une nouvelle veste</string>
- <string name="create_new_gloves">Créer de nouveaux gants</string>
- <string name="create_new_undershirt">Créer un nouveau débardeur</string>
- <string name="create_new_underpants">Créer un nouveau caleçon</string>
- <string name="create_new_skirt">Créer une nouvelle jupe</string>
- <string name="create_new_alpha">Créer un nouvel alpha</string>
- <string name="create_new_tattoo">Créer un nouveau tatouage</string>
- <string name="create_new_universal">Créer un nouvel environnement universel</string>
- <string name="create_new_physics">Créer de nouvelles propriétés physiques</string>
- <string name="create_new_invalid">non valide</string>
- <string name="NewWearable">Nouv. [WEARABLE_ITEM]</string>
- <string name="next">Suivant</string>
- <string name="ok">OK</string>
- <string name="GroupNotifyGroupNotice">Note au groupe</string>
- <string name="GroupNotifyGroupNotices">Notices au groupe</string>
- <string name="GroupNotifySentBy">Envoyée par</string>
- <string name="GroupNotifyAttached">Pièce(s) jointe(s) :</string>
- <string name="GroupNotifyViewPastNotices">Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici.</string>
- <string name="GroupNotifyOpenAttachment">Ouvrir pièce jointe</string>
- <string name="GroupNotifySaveAttachment">Enregistrer la pièce jointe</string>
- <string name="TeleportOffer">Offre de téléportation</string>
- <string name="StartUpNotifications">De nouvelles notifications sont arrivées en votre absence.</string>
- <string name="OverflowInfoChannelString">Vous avez %d notification(s) supplémentaire(s)</string>
- <string name="BodyPartsRightArm">Bras droit</string>
- <string name="BodyPartsHead">Tête</string>
- <string name="BodyPartsLeftArm">Bras gauche</string>
- <string name="BodyPartsLeftLeg">Jambe gauche</string>
- <string name="BodyPartsTorso">Torse</string>
- <string name="BodyPartsRightLeg">Jambe droite</string>
- <string name="BodyPartsEnhancedSkeleton">Squelette amélioré</string>
- <string name="GraphicsQualityLow">Faible</string>
- <string name="GraphicsQualityMid">Moyen</string>
- <string name="GraphicsQualityHigh">Élevé</string>
- <string name="LeaveMouselook">Appuyez sur ESC pour quitter la vue subjective</string>
- <string name="InventoryNoMatchingItems">Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher].</string>
- <string name="InventoryNoMatchingRecentItems">Avez-vous trouvé ce que vous cherchiez ? Essayez [secondlife:///app/inventory/filters Show filters].</string>
- <string name="PlacesNoMatchingItems">Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher].</string>
- <string name="FavoritesNoMatchingItems">Faites glisser un repère ici pour l'ajouter à vos Favoris.</string>
- <string name="MarketplaceNoMatchingItems">Aucun article trouvé. Vérifiez l'orthographe de votre chaîne de recherche et réessayez.</string>
- <string name="InventoryNoTexture">Vous n'avez pas de copie de cette texture dans votre inventaire</string>
- <string name="InventoryInboxNoItems">Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.</string>
- <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
- <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string>
- <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
- <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
- <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
- <string name="InventoryPlayAnimationTooltip">Ouvrir la fenêtre avec les options Jeu</string>
- <string name="InventoryPlayGestureTooltip">Exécuter le geste sélectionné dans le monde virtuel.</string>
- <string name="InventoryPlaySoundTooltip">Ouvrir la fenêtre avec les options Jeu</string>
- <string name="InventoryOutboxNotMerchantTitle">Tout le monde peut vendre des articles sur la Place du marché.</string>
+ <string name="SilentlyManageEstateAccess">
+ Supprimer les alertes lors de la gestion des listes d'accès aux domaines
+ </string>
+ <string name="OverrideYourAnimations">
+ Remplacer vos animations par défaut
+ </string>
+ <string name="ScriptReturnObjects">
+ Renvoyer les objets de votre part
+ </string>
+ <string name="UnknownScriptPermission">
+ (inconnu)
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Général
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Modéré
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulte
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Hors ligne
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Inconnu
+ </string>
+ <string name="land_type_unknown">
+ (inconnu)
+ </string>
+ <string name="Estate / Full Region">
+ Domaine / Région entière
+ </string>
+ <string name="Estate / Homestead">
+ Domaine / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continent / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continent / Région entière
+ </string>
+ <string name="all_files">
+ Tous fichiers
+ </string>
+ <string name="sound_files">
+ Sons
+ </string>
+ <string name="animation_files">
+ Animations
+ </string>
+ <string name="image_files">
+ Images
+ </string>
+ <string name="save_file_verb">
+ Enregistrer
+ </string>
+ <string name="load_file_verb">
+ Charger
+ </string>
+ <string name="targa_image_files">
+ Images Targa
+ </string>
+ <string name="bitmap_image_files">
+ Images Bitmap
+ </string>
+ <string name="png_image_files">
+ Images PNG
+ </string>
+ <string name="save_texture_image_files">
+ Images Targa ou PNG
+ </string>
+ <string name="avi_movie_file">
+ Fichier de film AVI
+ </string>
+ <string name="xaf_animation_file">
+ Fichier d'animation XAF
+ </string>
+ <string name="xml_file">
+ Fichier XML
+ </string>
+ <string name="raw_file">
+ Fichier RAW
+ </string>
+ <string name="compressed_image_files">
+ Images compressées
+ </string>
+ <string name="load_files">
+ Charger des fichiers
+ </string>
+ <string name="choose_the_directory">
+ Choisir le répertoire
+ </string>
+ <string name="script_files">
+ Scripts
+ </string>
+ <string name="dictionary_files">
+ Dictionnaires
+ </string>
+ <string name="shape">
+ Silhouette
+ </string>
+ <string name="skin">
+ Peau
+ </string>
+ <string name="hair">
+ Cheveux
+ </string>
+ <string name="eyes">
+ Yeux
+ </string>
+ <string name="shirt">
+ Chemise
+ </string>
+ <string name="pants">
+ Pantalon
+ </string>
+ <string name="shoes">
+ Chaussures
+ </string>
+ <string name="socks">
+ Chaussettes
+ </string>
+ <string name="jacket">
+ Veste
+ </string>
+ <string name="gloves">
+ Gants
+ </string>
+ <string name="undershirt">
+ Débardeur
+ </string>
+ <string name="underpants">
+ Caleçon
+ </string>
+ <string name="skirt">
+ Jupe
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatouage
+ </string>
+ <string name="universal">
+ Universel
+ </string>
+ <string name="physics">
+ Propriétés physiques
+ </string>
+ <string name="invalid">
+ non valide
+ </string>
+ <string name="none">
+ aucun
+ </string>
+ <string name="shirt_not_worn">
+ Chemise non portée
+ </string>
+ <string name="pants_not_worn">
+ Pantalon non porté
+ </string>
+ <string name="shoes_not_worn">
+ Chaussures non portées
+ </string>
+ <string name="socks_not_worn">
+ Chaussettes non portées
+ </string>
+ <string name="jacket_not_worn">
+ Veste non portée
+ </string>
+ <string name="gloves_not_worn">
+ Gants non portés
+ </string>
+ <string name="undershirt_not_worn">
+ Débardeur non porté
+ </string>
+ <string name="underpants_not_worn">
+ Caleçon non porté
+ </string>
+ <string name="skirt_not_worn">
+ Jupe non portée
+ </string>
+ <string name="alpha_not_worn">
+ Alpha non porté
+ </string>
+ <string name="tattoo_not_worn">
+ Tatouage non porté
+ </string>
+ <string name="universal_not_worn">
+ Universel non porté
+ </string>
+ <string name="physics_not_worn">
+ Propriétés physiques non portées
+ </string>
+ <string name="invalid_not_worn">
+ non valide
+ </string>
+ <string name="create_new_shape">
+ Créer une nouvelle silhouette
+ </string>
+ <string name="create_new_skin">
+ Créer une nouvelle peau
+ </string>
+ <string name="create_new_hair">
+ Créer de nouveaux cheveux
+ </string>
+ <string name="create_new_eyes">
+ Créer de nouveaux yeux
+ </string>
+ <string name="create_new_shirt">
+ Créer une nouvelle chemise
+ </string>
+ <string name="create_new_pants">
+ Créer un nouveau pantalon
+ </string>
+ <string name="create_new_shoes">
+ Créer de nouvelles chaussures
+ </string>
+ <string name="create_new_socks">
+ Créer de nouvelles chaussettes
+ </string>
+ <string name="create_new_jacket">
+ Créer une nouvelle veste
+ </string>
+ <string name="create_new_gloves">
+ Créer de nouveaux gants
+ </string>
+ <string name="create_new_undershirt">
+ Créer un nouveau débardeur
+ </string>
+ <string name="create_new_underpants">
+ Créer un nouveau caleçon
+ </string>
+ <string name="create_new_skirt">
+ Créer une nouvelle jupe
+ </string>
+ <string name="create_new_alpha">
+ Créer un nouvel alpha
+ </string>
+ <string name="create_new_tattoo">
+ Créer un nouveau tatouage
+ </string>
+ <string name="create_new_universal">
+ Créer un nouvel environnement universel
+ </string>
+ <string name="create_new_physics">
+ Créer de nouvelles propriétés physiques
+ </string>
+ <string name="create_new_invalid">
+ non valide
+ </string>
+ <string name="NewWearable">
+ Nouv. [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Suivant
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Note au groupe
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Notices au groupe
+ </string>
+ <string name="GroupNotifySentBy">
+ Envoyée par
+ </string>
+ <string name="GroupNotifyAttached">
+ Pièce(s) jointe(s) :
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Ouvrir pièce jointe
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Enregistrer la pièce jointe
+ </string>
+ <string name="TeleportOffer">
+ Offre de téléportation
+ </string>
+ <string name="StartUpNotifications">
+ De nouvelles notifications sont arrivées en votre absence.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Vous avez %d notification(s) supplémentaire(s)
+ </string>
+ <string name="BodyPartsRightArm">
+ Bras droit
+ </string>
+ <string name="BodyPartsHead">
+ Tête
+ </string>
+ <string name="BodyPartsLeftArm">
+ Bras gauche
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Jambe gauche
+ </string>
+ <string name="BodyPartsTorso">
+ Torse
+ </string>
+ <string name="BodyPartsRightLeg">
+ Jambe droite
+ </string>
+ <string name="BodyPartsEnhancedSkeleton">
+ Squelette amélioré
+ </string>
+ <string name="GraphicsQualityLow">
+ Faible
+ </string>
+ <string name="GraphicsQualityMid">
+ Moyen
+ </string>
+ <string name="GraphicsQualityHigh">
+ Élevé
+ </string>
+ <string name="LeaveMouselook">
+ Appuyez sur ESC pour quitter la vue subjective
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher].
+ </string>
+ <string name="InventoryNoMatchingRecentItems">
+ Avez-vous trouvé ce que vous cherchiez ? Essayez [secondlife:///app/inventory/filters Show filters].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Faites glisser un repère ici pour l'ajouter à vos Favoris.
+ </string>
+ <string name="MarketplaceNoMatchingItems">
+ Aucun article trouvé. Vérifiez l'orthographe de votre chaîne de recherche et réessayez.
+ </string>
+ <string name="InventoryNoTexture">
+ Vous n'avez pas de copie de cette texture dans votre inventaire
+ </string>
+ <string name="InventoryInboxNoItems">
+ Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryPlayAnimationTooltip">
+ Ouvrir la fenêtre avec les options Jeu
+ </string>
+ <string name="InventoryPlayGestureTooltip">
+ Exécuter le geste sélectionné dans le monde virtuel.
+ </string>
+ <string name="InventoryPlaySoundTooltip">
+ Ouvrir la fenêtre avec les options Jeu
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Tout le monde peut vendre des articles sur la Place du marché.
+ </string>
<string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché].</string>
- <string name="InventoryOutboxNoItemsTitle">Votre boîte d'envoi est vide.</string>
+ <string name="InventoryOutboxNotMerchant">
+ Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Votre boîte d'envoi est vide.
+ </string>
<string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur &quot;Envoyer vers la Place du marché&quot;.</string>
- <string name="InventoryOutboxInitializingTitle">Initialisation de la Place du marché...</string>
- <string name="InventoryOutboxInitializing">Nous sommes en train d'accéder à votre compte dans la [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché].</string>
- <string name="InventoryOutboxErrorTitle">Erreurs de la Place du marché.</string>
- <string name="InventoryOutboxError">La [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché] renvoie des erreurs.</string>
- <string name="InventoryMarketplaceError">Une erreur est survenue lors de l’ouverture des annonces de la Place du marché.
-Si vous continuez de recevoir ce message, contactez l’assistance Second Life à http://support.secondlife.com pour obtenir de l’aide.</string>
- <string name="InventoryMarketplaceListingsNoItemsTitle">Votre dossier Annonces de la Place du marché est vide.</string>
- <string name="InventoryMarketplaceListingsNoItems">Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone.</string>
- <string name="InventoryItemsCount">( [ITEMS_COUNT] Articles )</string>
- <string name="Marketplace Validation Warning Stock">le dossier de stock doit être contenu dans un dossier de version</string>
- <string name="Marketplace Validation Error Mixed Stock">: Erreur : tous les articles d'un dossier de stock doivent être non reproductibles et de même type</string>
- <string name="Marketplace Validation Error Subfolder In Stock">: Erreur : un dossier de stock ne peut pas contenir de sous-dossiers</string>
- <string name="Marketplace Validation Warning Empty">: Avertissement : le dossier ne contient aucun article</string>
- <string name="Marketplace Validation Warning Create Stock">: Avertissement : création du dossier de stock</string>
- <string name="Marketplace Validation Warning Create Version">: Avertissement : création du dossier de version</string>
- <string name="Marketplace Validation Warning Move">: Avertissement : déplacement d'articles</string>
- <string name="Marketplace Validation Warning Delete">: Avertissement : contenu du dossier transféré vers le dossier de stock, suppression du dossier vide</string>
- <string name="Marketplace Validation Error Stock Item">: Erreur : les articles non reproductibles doivent être contenus dans un dossier de stock</string>
- <string name="Marketplace Validation Warning Unwrapped Item">: Avertissement : les articles doivent être contenus dans un dossier de version</string>
- <string name="Marketplace Validation Error">: Erreur :</string>
- <string name="Marketplace Validation Warning">: Avertissement :</string>
- <string name="Marketplace Validation Error Empty Version">: Avertissement : le dossier de version doit contenir au moins 1 article</string>
- <string name="Marketplace Validation Error Empty Stock">: Avertissement : le dossier de stock doit contenir au moins 1 article</string>
- <string name="Marketplace Validation No Error">Pas d'erreur ni d'avertissement à signaler</string>
- <string name="Marketplace Error None">Aucune erreur</string>
- <string name="Marketplace Error Prefix">Erreur :</string>
- <string name="Marketplace Error Not Merchant">Avant d'envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit).</string>
- <string name="Marketplace Error Not Accepted">Impossible de déplacer l'article dans ce dossier.</string>
- <string name="Marketplace Error Unsellable Item">Cet article ne peut pas être vendu sur la Place du marché.</string>
- <string name="MarketplaceNoID">no Mkt ID</string>
- <string name="MarketplaceLive">publié</string>
- <string name="MarketplaceActive">actif</string>
- <string name="MarketplaceMax">max.</string>
- <string name="MarketplaceStock">stock</string>
- <string name="MarketplaceNoStock">rupture de stock</string>
- <string name="MarketplaceUpdating">mise à jour...</string>
- <string name="UploadFeeInfo">Les frais dépendent de votre niveau d'abonnement. Les niveaux supérieurs sont soumis à des frais moins élevés. [https://secondlife.com/my/account/membership.php? En savoir plus]</string>
- <string name="Open landmarks">Points de repère ouverts</string>
- <string name="Unconstrained">Sans contrainte</string>
+ <string name="InventoryOutboxNoItems">
+ Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur "Envoyer vers la Place du marché".
+ </string>
+ <string name="InventoryOutboxInitializingTitle">
+ Initialisation de la Place du marché...
+ </string>
+ <string name="InventoryOutboxInitializing">
+ Nous sommes en train d'accéder à votre compte dans la [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché].
+ </string>
+ <string name="InventoryOutboxErrorTitle">
+ Erreurs de la Place du marché.
+ </string>
+ <string name="InventoryOutboxError">
+ La [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché] renvoie des erreurs.
+ </string>
+ <string name="InventoryMarketplaceError">
+ Une erreur est survenue lors de l’ouverture des annonces de la Place du marché.
+Si vous continuez de recevoir ce message, contactez l’assistance Second Life à http://support.secondlife.com pour obtenir de l’aide.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Votre dossier Annonces de la Place du marché est vide.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone.
+ </string>
+ <string name="InventoryItemsCount">
+ ( [ITEMS_COUNT] Articles )
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ le dossier de stock doit être contenu dans un dossier de version
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Erreur : tous les articles d'un dossier de stock doivent être non reproductibles et de même type
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Erreur : un dossier de stock ne peut pas contenir de sous-dossiers
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Avertissement : le dossier ne contient aucun article
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Avertissement : création du dossier de stock
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Avertissement : création du dossier de version
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Avertissement : déplacement d'articles
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Avertissement : contenu du dossier transféré vers le dossier de stock, suppression du dossier vide
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Erreur : les articles non reproductibles doivent être contenus dans un dossier de stock
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Avertissement : les articles doivent être contenus dans un dossier de version
+ </string>
+ <string name="Marketplace Validation Error">
+ : Erreur :
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Avertissement :
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Avertissement : le dossier de version doit contenir au moins 1 article
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Avertissement : le dossier de stock doit contenir au moins 1 article
+ </string>
+ <string name="Marketplace Validation No Error">
+ Pas d'erreur ni d'avertissement à signaler
+ </string>
+ <string name="Marketplace Error None">
+ Aucune erreur
+ </string>
+ <string name="Marketplace Error Prefix">
+ Erreur :
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Avant d'envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit).
+ </string>
+ <string name="Marketplace Error Not Accepted">
+ Impossible de déplacer l'article dans ce dossier.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Cet article ne peut pas être vendu sur la Place du marché.
+ </string>
+ <string name="MarketplaceNoID">
+ no Mkt ID
+ </string>
+ <string name="MarketplaceLive">
+ publié
+ </string>
+ <string name="MarketplaceActive">
+ actif
+ </string>
+ <string name="MarketplaceMax">
+ max.
+ </string>
+ <string name="MarketplaceStock">
+ stock
+ </string>
+ <string name="MarketplaceNoStock">
+ rupture de stock
+ </string>
+ <string name="MarketplaceUpdating">
+ mise à jour...
+ </string>
+ <string name="UploadFeeInfo">
+ Les frais dépendent de votre niveau d'abonnement. Les niveaux supérieurs sont soumis à des frais moins élevés. [https://secondlife.com/my/account/membership.php? En savoir plus]
+ </string>
+ <string name="Open landmarks">
+ Points de repère ouverts
+ </string>
+ <string name="Unconstrained">
+ Sans contrainte
+ </string>
<string name="no_transfer" value=" (pas de transfert)"/>
<string name="no_modify" value=" (pas de modification)"/>
<string name="no_copy" value=" (pas de copie)"/>
<string name="worn" value=" (porté)"/>
<string name="link" value=" (lien)"/>
<string name="broken_link" value=" (broken_link)"/>
- <string name="LoadingContents">chargement des contenus en cours...</string>
- <string name="NoContents">Aucun contenu</string>
+ <string name="LoadingContents">
+ chargement des contenus en cours...
+ </string>
+ <string name="NoContents">
+ Aucun contenu
+ </string>
<string name="WornOnAttachmentPoint" value=" (porté sur [ATTACHMENT_POINT])"/>
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (actif)"/>
- <string name="PermYes">Oui</string>
- <string name="PermNo">Non</string>
+ <string name="PermYes">
+ Oui
+ </string>
+ <string name="PermNo">
+ Non
+ </string>
<string name="Chat Message" value="Chat :"/>
<string name="Sound" value=" Son :"/>
<string name="Wait" value=" --- Attendre :"/>
@@ -637,1439 +1705,4215 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
<string name="Snapshots" value=" Photos,"/>
<string name="No Filters" value="Non "/>
<string name="Since Logoff" value="depuis la déconnexion"/>
- <string name="InvFolder My Inventory">Mon inventaire</string>
- <string name="InvFolder Library">Bibliothèque</string>
- <string name="InvFolder Textures">Textures</string>
- <string name="InvFolder Sounds">Sons</string>
- <string name="InvFolder Calling Cards">Cartes de visite</string>
- <string name="InvFolder Landmarks">Repères</string>
- <string name="InvFolder Scripts">Scripts</string>
- <string name="InvFolder Clothing">Habits</string>
- <string name="InvFolder Objects">Objets</string>
- <string name="InvFolder Notecards">Notes</string>
- <string name="InvFolder New Folder">Nouveau dossier</string>
- <string name="InvFolder Inventory">Inventaire</string>
- <string name="InvFolder Uncompressed Images">Images non compressées</string>
- <string name="InvFolder Body Parts">Parties du corps</string>
- <string name="InvFolder Trash">Corbeille</string>
- <string name="InvFolder Photo Album">Albums photo</string>
- <string name="InvFolder Lost And Found">Objets trouvés</string>
- <string name="InvFolder Uncompressed Sounds">Sons non compressés</string>
- <string name="InvFolder Animations">Animations</string>
- <string name="InvFolder Gestures">Gestes</string>
- <string name="InvFolder Favorite">Mes Favoris</string>
- <string name="InvFolder favorite">Mes Favoris</string>
- <string name="InvFolder Favorites">Mes favoris</string>
- <string name="InvFolder favorites">Mes favoris</string>
- <string name="InvFolder Current Outfit">Tenue actuelle</string>
- <string name="InvFolder Initial Outfits">Tenues initiales</string>
- <string name="InvFolder My Outfits">Mes tenues</string>
- <string name="InvFolder Accessories">Accessoires</string>
- <string name="InvFolder Meshes">Maillages</string>
- <string name="InvFolder Received Items">Articles reçus</string>
- <string name="InvFolder Merchant Outbox">Boîte d'envoi vendeur</string>
- <string name="InvFolder Friends">Amis</string>
- <string name="InvFolder All">Tout</string>
- <string name="no_attachments">Aucun élément attaché porté</string>
- <string name="Attachments remain">Éléments attachés ([COUNT] emplacements restants)</string>
- <string name="Buy">Acheter</string>
- <string name="BuyforL$">Acheter des L$</string>
- <string name="Stone">Pierre</string>
- <string name="Metal">Métal</string>
- <string name="Glass">Verre</string>
- <string name="Wood">Bois</string>
- <string name="Flesh">Chair</string>
- <string name="Plastic">Plastique</string>
- <string name="Rubber">Caoutchouc</string>
- <string name="Light">Léger</string>
- <string name="KBShift">Maj-</string>
- <string name="KBCtrl">Ctrl</string>
- <string name="Chest">Poitrine</string>
- <string name="Skull">Crâne</string>
- <string name="Left Shoulder">Épaule gauche</string>
- <string name="Right Shoulder">Épaule droite</string>
- <string name="Left Hand">Main gauche</string>
- <string name="Right Hand">Main droite</string>
- <string name="Left Foot">Pied gauche</string>
- <string name="Right Foot">Pied droit</string>
- <string name="Spine">Colonne</string>
- <string name="Pelvis">Bassin</string>
- <string name="Mouth">Bouche</string>
- <string name="Chin">Menton</string>
- <string name="Left Ear">Oreille gauche</string>
- <string name="Right Ear">Oreille droite</string>
- <string name="Left Eyeball">Globe oculaire gauche</string>
- <string name="Right Eyeball">Globe oculaire droit</string>
- <string name="Nose">Nez</string>
- <string name="R Upper Arm">Bras D</string>
- <string name="R Forearm">Avant-bras D</string>
- <string name="L Upper Arm">Bras G</string>
- <string name="L Forearm">Avant-bras G</string>
- <string name="Right Hip">Hanche droite</string>
- <string name="R Upper Leg">Cuisse D</string>
- <string name="R Lower Leg">Jambe D</string>
- <string name="Left Hip">Hanche gauche</string>
- <string name="L Upper Leg">Cuisse G</string>
- <string name="L Lower Leg">Jambe G</string>
- <string name="Stomach">Estomac</string>
- <string name="Left Pec">Pectoral gauche</string>
- <string name="Right Pec">Pectoral droit</string>
- <string name="Neck">Cou</string>
- <string name="Avatar Center">Centre de l'avatar</string>
- <string name="Left Ring Finger">Annulaire gauche</string>
- <string name="Right Ring Finger">Annulaire droit</string>
- <string name="Tail Base">Base de la queue</string>
- <string name="Tail Tip">Bout de la queue</string>
- <string name="Left Wing">Aile gauche</string>
- <string name="Right Wing">Aile droite</string>
- <string name="Jaw">Mâchoire</string>
- <string name="Alt Left Ear">Oreille gauche différente</string>
- <string name="Alt Right Ear">Oreille droite différente</string>
- <string name="Alt Left Eye">Œil gauche différent</string>
- <string name="Alt Right Eye">Œil droit différent</string>
- <string name="Tongue">Langue</string>
- <string name="Groin">Aine</string>
- <string name="Left Hind Foot">Pied arrière gauche</string>
- <string name="Right Hind Foot">Pied arrière droit</string>
- <string name="Invalid Attachment">Point d'attache non valide</string>
- <string name="ATTACHMENT_MISSING_ITEM">Erreur : article manquant</string>
- <string name="ATTACHMENT_MISSING_BASE_ITEM">Erreur : article de base manquant</string>
- <string name="ATTACHMENT_NOT_ATTACHED">Erreur : l'objet est dans une tenue actuelle, mais il n'est pas attaché</string>
- <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS]</string>
- <string name="YearsOld">[AGEYEARS]</string>
- <string name="MonthsOld">[AGEMONTHS]</string>
- <string name="WeeksOld">[AGEWEEKS]</string>
- <string name="DaysOld">[AGEDAYS]</string>
- <string name="TodayOld">Inscrit aujourd'hui</string>
- <string name="av_render_everyone_now">Désormais, tout le monde peut vous voir.</string>
- <string name="av_render_not_everyone">Vous risquez de ne pas être rendu par tous les gens qui vous entourent.</string>
- <string name="av_render_over_half">Vous risquez de ne pas être rendu par plus de la moitié des gens qui vous entourent.</string>
- <string name="av_render_most_of">Vous risquez de ne pas être rendu par la plupart des gens qui vous entourent.</string>
- <string name="av_render_anyone">Vous risquez de n’être rendu par aucune des personnes qui vous entourent.</string>
- <string name="hud_description_total">Votre HUD</string>
- <string name="hud_name_with_joint">[OBJ_NAME] (porté sur [JNT_NAME])</string>
- <string name="hud_render_memory_warning">[HUD_DETAILS] utilise beaucoup de mémoire textures</string>
- <string name="hud_render_cost_warning">[HUD_DETAILS] contient beaucoup de textures et d’objets volumineux</string>
- <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] contient beaucoup de textures volumineuses</string>
- <string name="hud_render_cramped_warning">[HUD_DETAILS] contient trop d’objets</string>
- <string name="hud_render_textures_warning">[HUD_DETAILS] contient trop de textures</string>
- <string name="AgeYearsA">[COUNT] an</string>
- <string name="AgeYearsB">[COUNT] ans</string>
- <string name="AgeYearsC">[COUNT] ans</string>
- <string name="AgeMonthsA">[COUNT] mois</string>
- <string name="AgeMonthsB">[COUNT] mois</string>
- <string name="AgeMonthsC">[COUNT] mois</string>
- <string name="AgeWeeksA">[COUNT] semaine</string>
- <string name="AgeWeeksB">[COUNT] semaines</string>
- <string name="AgeWeeksC">[COUNT] semaines</string>
- <string name="AgeDaysA">[COUNT] jour</string>
- <string name="AgeDaysB">[COUNT] jours</string>
- <string name="AgeDaysC">[COUNT] jours</string>
- <string name="GroupMembersA">[COUNT] membre</string>
- <string name="GroupMembersB">[COUNT] membres</string>
- <string name="GroupMembersC">[COUNT] membres</string>
- <string name="AcctTypeResident">Résident</string>
- <string name="AcctTypeTrial">Essai</string>
- <string name="AcctTypeCharterMember">Membre originaire</string>
- <string name="AcctTypeEmployee">Employé(e) de Linden Lab</string>
- <string name="PaymentInfoUsed">Infos de paiement utilisées</string>
- <string name="PaymentInfoOnFile">Infos de paiement enregistrées</string>
- <string name="NoPaymentInfoOnFile">Aucune info de paiement enregistrée</string>
- <string name="AgeVerified">Personne dont l'âge a été vérifié</string>
- <string name="NotAgeVerified">Personne dont l'âge n'a pas été vérifié</string>
- <string name="Center 2">Centre 2</string>
- <string name="Top Right">En haut à droite</string>
- <string name="Top">En haut</string>
- <string name="Top Left">En haut à gauche</string>
- <string name="Center">Centre</string>
- <string name="Bottom Left">En bas à gauche</string>
- <string name="Bottom">Bas</string>
- <string name="Bottom Right">En bas à droite</string>
- <string name="CompileQueueDownloadedCompiling">Téléchargé, compilation en cours</string>
- <string name="CompileQueueServiceUnavailable">Service de compilation de script indisponible.</string>
- <string name="CompileQueueScriptNotFound">Script introuvable sur le serveur.</string>
- <string name="CompileQueueProblemDownloading">Problème lors du téléchargement</string>
- <string name="CompileQueueInsufficientPermDownload">Droits insuffisants pour télécharger un script.</string>
- <string name="CompileQueueInsufficientPermFor">Droits insuffisants pour</string>
- <string name="CompileQueueUnknownFailure">Échec du téléchargement, erreur inconnue</string>
- <string name="CompileNoExperiencePerm">En train d’ignorer le script [SCRIPT] avec l’expérience [EXPERIENCE].</string>
- <string name="CompileQueueTitle">Recompilation - progrès</string>
- <string name="CompileQueueStart">recompiler</string>
- <string name="ResetQueueTitle">Réinitialiser les progrès</string>
- <string name="ResetQueueStart">réinitialiser</string>
- <string name="RunQueueTitle">Lancer</string>
- <string name="RunQueueStart">lancer</string>
- <string name="NotRunQueueTitle">Arrêter</string>
- <string name="NotRunQueueStart">arrêter</string>
- <string name="CompileSuccessful">Compilation réussie !</string>
- <string name="CompileSuccessfulSaving">Compilation réussie, enregistrement en cours...</string>
- <string name="SaveComplete">Enregistrement terminé.</string>
- <string name="UploadFailed">Échec du chargement de fichier :</string>
- <string name="ObjectOutOfRange">Script (objet hors de portée)</string>
- <string name="ScriptWasDeleted">Script (supprimé de l’inventaire)</string>
- <string name="GodToolsObjectOwnedBy">Objet [OBJECT] appartenant à [OWNER]</string>
- <string name="GroupsNone">aucun</string>
+ <string name="InvFolder My Inventory">
+ Mon inventaire
+ </string>
+ <string name="InvFolder Library">
+ Bibliothèque
+ </string>
+ <string name="InvFolder Textures">
+ Textures
+ </string>
+ <string name="InvFolder Sounds">
+ Sons
+ </string>
+ <string name="InvFolder Calling Cards">
+ Cartes de visite
+ </string>
+ <string name="InvFolder Landmarks">
+ Repères
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Habits
+ </string>
+ <string name="InvFolder Objects">
+ Objets
+ </string>
+ <string name="InvFolder Notecards">
+ Notes
+ </string>
+ <string name="InvFolder New Folder">
+ Nouveau dossier
+ </string>
+ <string name="InvFolder Inventory">
+ Inventaire
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Images non compressées
+ </string>
+ <string name="InvFolder Body Parts">
+ Parties du corps
+ </string>
+ <string name="InvFolder Trash">
+ Corbeille
+ </string>
+ <string name="InvFolder Photo Album">
+ Albums photo
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objets trouvés
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sons non compressés
+ </string>
+ <string name="InvFolder Animations">
+ Animations
+ </string>
+ <string name="InvFolder Gestures">
+ Gestes
+ </string>
+ <string name="InvFolder Favorite">
+ Mes Favoris
+ </string>
+ <string name="InvFolder favorite">
+ Mes Favoris
+ </string>
+ <string name="InvFolder Favorites">
+ Mes favoris
+ </string>
+ <string name="InvFolder favorites">
+ Mes favoris
+ </string>
+ <string name="InvFolder Current Outfit">
+ Tenue actuelle
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Tenues initiales
+ </string>
+ <string name="InvFolder My Outfits">
+ Mes tenues
+ </string>
+ <string name="InvFolder Accessories">
+ Accessoires
+ </string>
+ <string name="InvFolder Meshes">
+ Maillages
+ </string>
+ <string name="InvFolder Received Items">
+ Articles reçus
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Boîte d'envoi vendeur
+ </string>
+ <string name="InvFolder Friends">
+ Amis
+ </string>
+ <string name="InvFolder All">
+ Tout
+ </string>
+ <string name="no_attachments">
+ Aucun élément attaché porté
+ </string>
+ <string name="Attachments remain">
+ Éléments attachés ([COUNT] emplacements restants)
+ </string>
+ <string name="Buy">
+ Acheter
+ </string>
+ <string name="BuyforL$">
+ Acheter des L$
+ </string>
+ <string name="Stone">
+ Pierre
+ </string>
+ <string name="Metal">
+ Métal
+ </string>
+ <string name="Glass">
+ Verre
+ </string>
+ <string name="Wood">
+ Bois
+ </string>
+ <string name="Flesh">
+ Chair
+ </string>
+ <string name="Plastic">
+ Plastique
+ </string>
+ <string name="Rubber">
+ Caoutchouc
+ </string>
+ <string name="Light">
+ Léger
+ </string>
+ <string name="KBShift">
+ Maj-
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Poitrine
+ </string>
+ <string name="Skull">
+ Crâne
+ </string>
+ <string name="Left Shoulder">
+ Épaule gauche
+ </string>
+ <string name="Right Shoulder">
+ Épaule droite
+ </string>
+ <string name="Left Hand">
+ Main gauche
+ </string>
+ <string name="Right Hand">
+ Main droite
+ </string>
+ <string name="Left Foot">
+ Pied gauche
+ </string>
+ <string name="Right Foot">
+ Pied droit
+ </string>
+ <string name="Spine">
+ Colonne
+ </string>
+ <string name="Pelvis">
+ Bassin
+ </string>
+ <string name="Mouth">
+ Bouche
+ </string>
+ <string name="Chin">
+ Menton
+ </string>
+ <string name="Left Ear">
+ Oreille gauche
+ </string>
+ <string name="Right Ear">
+ Oreille droite
+ </string>
+ <string name="Left Eyeball">
+ Globe oculaire gauche
+ </string>
+ <string name="Right Eyeball">
+ Globe oculaire droit
+ </string>
+ <string name="Nose">
+ Nez
+ </string>
+ <string name="R Upper Arm">
+ Bras D
+ </string>
+ <string name="R Forearm">
+ Avant-bras D
+ </string>
+ <string name="L Upper Arm">
+ Bras G
+ </string>
+ <string name="L Forearm">
+ Avant-bras G
+ </string>
+ <string name="Right Hip">
+ Hanche droite
+ </string>
+ <string name="R Upper Leg">
+ Cuisse D
+ </string>
+ <string name="R Lower Leg">
+ Jambe D
+ </string>
+ <string name="Left Hip">
+ Hanche gauche
+ </string>
+ <string name="L Upper Leg">
+ Cuisse G
+ </string>
+ <string name="L Lower Leg">
+ Jambe G
+ </string>
+ <string name="Stomach">
+ Estomac
+ </string>
+ <string name="Left Pec">
+ Pectoral gauche
+ </string>
+ <string name="Right Pec">
+ Pectoral droit
+ </string>
+ <string name="Neck">
+ Cou
+ </string>
+ <string name="Avatar Center">
+ Centre de l'avatar
+ </string>
+ <string name="Left Ring Finger">
+ Annulaire gauche
+ </string>
+ <string name="Right Ring Finger">
+ Annulaire droit
+ </string>
+ <string name="Tail Base">
+ Base de la queue
+ </string>
+ <string name="Tail Tip">
+ Bout de la queue
+ </string>
+ <string name="Left Wing">
+ Aile gauche
+ </string>
+ <string name="Right Wing">
+ Aile droite
+ </string>
+ <string name="Jaw">
+ Mâchoire
+ </string>
+ <string name="Alt Left Ear">
+ Oreille gauche différente
+ </string>
+ <string name="Alt Right Ear">
+ Oreille droite différente
+ </string>
+ <string name="Alt Left Eye">
+ Œil gauche différent
+ </string>
+ <string name="Alt Right Eye">
+ Œil droit différent
+ </string>
+ <string name="Tongue">
+ Langue
+ </string>
+ <string name="Groin">
+ Aine
+ </string>
+ <string name="Left Hind Foot">
+ Pied arrière gauche
+ </string>
+ <string name="Right Hind Foot">
+ Pied arrière droit
+ </string>
+ <string name="Invalid Attachment">
+ Point d'attache non valide
+ </string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Erreur : article manquant
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Erreur : article de base manquant
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Erreur : l'objet est dans une tenue actuelle, mais il n'est pas attaché
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ Inscrit aujourd'hui
+ </string>
+ <string name="av_render_everyone_now">
+ Désormais, tout le monde peut vous voir.
+ </string>
+ <string name="av_render_not_everyone">
+ Vous risquez de ne pas être rendu par tous les gens qui vous entourent.
+ </string>
+ <string name="av_render_over_half">
+ Vous risquez de ne pas être rendu par plus de la moitié des gens qui vous entourent.
+ </string>
+ <string name="av_render_most_of">
+ Vous risquez de ne pas être rendu par la plupart des gens qui vous entourent.
+ </string>
+ <string name="av_render_anyone">
+ Vous risquez de n’être rendu par aucune des personnes qui vous entourent.
+ </string>
+ <string name="hud_description_total">
+ Votre HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (porté sur [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] utilise beaucoup de mémoire textures
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] contient beaucoup de textures et d’objets volumineux
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] contient beaucoup de textures volumineuses
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] contient trop d’objets
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] contient trop de textures
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] an
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] ans
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] ans
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mois
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] mois
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] mois
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semaine
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semaines
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semaines
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] jour
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] jours
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] jours
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] membre
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] membres
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] membres
+ </string>
+ <string name="AcctTypeResident">
+ Résident
+ </string>
+ <string name="AcctTypeTrial">
+ Essai
+ </string>
+ <string name="AcctTypeCharterMember">
+ Membre originaire
+ </string>
+ <string name="AcctTypeEmployee">
+ Employé(e) de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Infos de paiement utilisées
+ </string>
+ <string name="PaymentInfoOnFile">
+ Infos de paiement enregistrées
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Aucune info de paiement enregistrée
+ </string>
+ <string name="AgeVerified">
+ Personne dont l'âge a été vérifié
+ </string>
+ <string name="NotAgeVerified">
+ Personne dont l'âge n'a pas été vérifié
+ </string>
+ <string name="Center 2">
+ Centre 2
+ </string>
+ <string name="Top Right">
+ En haut à droite
+ </string>
+ <string name="Top">
+ En haut
+ </string>
+ <string name="Top Left">
+ En haut à gauche
+ </string>
+ <string name="Center">
+ Centre
+ </string>
+ <string name="Bottom Left">
+ En bas à gauche
+ </string>
+ <string name="Bottom">
+ Bas
+ </string>
+ <string name="Bottom Right">
+ En bas à droite
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Téléchargé, compilation en cours
+ </string>
+ <string name="CompileQueueServiceUnavailable">
+ Service de compilation de script indisponible.
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script introuvable sur le serveur.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problème lors du téléchargement
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Droits insuffisants pour télécharger un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Droits insuffisants pour
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Échec du téléchargement, erreur inconnue
+ </string>
+ <string name="CompileNoExperiencePerm">
+ En train d’ignorer le script [SCRIPT] avec l’expérience [EXPERIENCE].
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilation - progrès
+ </string>
+ <string name="CompileQueueStart">
+ recompiler
+ </string>
+ <string name="ResetQueueTitle">
+ Réinitialiser les progrès
+ </string>
+ <string name="ResetQueueStart">
+ réinitialiser
+ </string>
+ <string name="RunQueueTitle">
+ Lancer
+ </string>
+ <string name="RunQueueStart">
+ lancer
+ </string>
+ <string name="NotRunQueueTitle">
+ Arrêter
+ </string>
+ <string name="NotRunQueueStart">
+ arrêter
+ </string>
+ <string name="CompileSuccessful">
+ Compilation réussie !
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilation réussie, enregistrement en cours...
+ </string>
+ <string name="SaveComplete">
+ Enregistrement terminé.
+ </string>
+ <string name="UploadFailed">
+ Échec du chargement de fichier :
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objet hors de portée)
+ </string>
+ <string name="ScriptWasDeleted">
+ Script (supprimé de l’inventaire)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objet [OBJECT] appartenant à [OWNER]
+ </string>
+ <string name="GroupsNone">
+ aucun
+ </string>
<string name="Group" value=" (groupe)"/>
- <string name="Unknown">(Inconnu)</string>
+ <string name="Unknown">
+ (Inconnu)
+ </string>
<string name="SummaryForTheWeek" value="Récapitulatif de la semaine, début le "/>
<string name="NextStipendDay" value=". Prochaine prime le "/>
- <string name="GroupPlanningDate">[day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc]</string>
+ <string name="GroupPlanningDate">
+ [day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value=" Groupe Part individuelle"/>
<string name="GroupColumn" value="Groupe"/>
- <string name="Balance">Solde</string>
- <string name="Credits">Crédits</string>
- <string name="Debits">Débits</string>
- <string name="Total">Total</string>
- <string name="NoGroupDataFound">Aucune donnée trouvée pour le groupe</string>
- <string name="IMParentEstate">domaine parent</string>
- <string name="IMMainland">continent</string>
- <string name="IMTeen">teen</string>
- <string name="Anyone">n'importe qui</string>
- <string name="RegionInfoError">erreur</string>
- <string name="RegionInfoAllEstatesOwnedBy">tous les domaines appartenant à [OWNER]</string>
- <string name="RegionInfoAllEstatesYouOwn">tous les domaines vous appartenant</string>
- <string name="RegionInfoAllEstatesYouManage">tous les domaines que vous gérez pour [OWNER]</string>
- <string name="RegionInfoAllowedResidents">Toujours autorisé : ([ALLOWEDAGENTS], max [MAXACCESS])</string>
- <string name="RegionInfoAllowedGroups">Groupes toujours autorisés : [ALLOWEDGROUPS], max [MAXACCESS])</string>
- <string name="RegionInfoBannedResidents">Toujours interdits : ([BANNEDAGENTS], max. [MAXBANNED])</string>
- <string name="RegionInfoListTypeAllowedAgents">Toujours autorisé</string>
- <string name="RegionInfoListTypeBannedAgents">Toujours interdit</string>
- <string name="RegionInfoAllEstates">tous les domaines</string>
- <string name="RegionInfoManagedEstates">domaines gérés</string>
- <string name="RegionInfoThisEstate">ce domaine</string>
- <string name="AndNMore">et [EXTRA_COUNT] plus</string>
- <string name="ScriptLimitsParcelScriptMemory">Mémoire des scripts de parcelles</string>
- <string name="ScriptLimitsParcelsOwned">Parcelles répertoriées : [PARCELS]</string>
- <string name="ScriptLimitsMemoryUsed">Mémoire utilisée : [COUNT] Ko sur [MAX] ; [AVAILABLE] Ko disponibles</string>
- <string name="ScriptLimitsMemoryUsedSimple">Mémoire utilisée : [COUNT] Ko</string>
- <string name="ScriptLimitsParcelScriptURLs">URL des scripts de parcelles</string>
- <string name="ScriptLimitsURLsUsed">URL utilisées : [COUNT] sur [MAX] ; [AVAILABLE] disponible(s)</string>
- <string name="ScriptLimitsURLsUsedSimple">URL utilisées : [COUNT]</string>
- <string name="ScriptLimitsRequestError">Une erreur est survenue pendant la requête d'informations.</string>
- <string name="ScriptLimitsRequestNoParcelSelected">Aucune parcelle sélectionnée</string>
- <string name="ScriptLimitsRequestWrongRegion">Erreur : les informations de script ne sont disponibles que dans votre région actuelle.</string>
- <string name="ScriptLimitsRequestWaiting">Extraction des informations en cours...</string>
- <string name="ScriptLimitsRequestDontOwnParcel">Vous n'avez pas le droit d'examiner cette parcelle.</string>
- <string name="SITTING_ON">Assis(e) dessus</string>
- <string name="ATTACH_CHEST">Poitrine</string>
- <string name="ATTACH_HEAD">Crâne</string>
- <string name="ATTACH_LSHOULDER">Épaule gauche</string>
- <string name="ATTACH_RSHOULDER">Épaule droite</string>
- <string name="ATTACH_LHAND">Main gauche</string>
- <string name="ATTACH_RHAND">Main droite</string>
- <string name="ATTACH_LFOOT">Pied gauche</string>
- <string name="ATTACH_RFOOT">Pied droit</string>
- <string name="ATTACH_BACK">Colonne vertébrale</string>
- <string name="ATTACH_PELVIS">Bassin</string>
- <string name="ATTACH_MOUTH">Bouche</string>
- <string name="ATTACH_CHIN">Menton</string>
- <string name="ATTACH_LEAR">Oreille gauche</string>
- <string name="ATTACH_REAR">Oreille droite</string>
- <string name="ATTACH_LEYE">Œil gauche</string>
- <string name="ATTACH_REYE">Œil droit</string>
- <string name="ATTACH_NOSE">Nez</string>
- <string name="ATTACH_RUARM">Bras droit</string>
- <string name="ATTACH_RLARM">Avant-bras droit</string>
- <string name="ATTACH_LUARM">Bras gauche</string>
- <string name="ATTACH_LLARM">Avant-bras gauche</string>
- <string name="ATTACH_RHIP">Hanche droite</string>
- <string name="ATTACH_RULEG">Cuisse droite</string>
- <string name="ATTACH_RLLEG">Jambe droite</string>
- <string name="ATTACH_LHIP">Hanche gauche</string>
- <string name="ATTACH_LULEG">Cuisse gauche</string>
- <string name="ATTACH_LLLEG">Jambe gauche</string>
- <string name="ATTACH_BELLY">Estomac</string>
- <string name="ATTACH_LEFT_PEC">Pectoral gauche</string>
- <string name="ATTACH_RIGHT_PEC">Pectoral droit</string>
- <string name="ATTACH_HUD_CENTER_2">HUD centre 2</string>
- <string name="ATTACH_HUD_TOP_RIGHT">HUD en haut à droite</string>
- <string name="ATTACH_HUD_TOP_CENTER">HUD en haut au centre</string>
- <string name="ATTACH_HUD_TOP_LEFT">HUD en haut à gauche</string>
- <string name="ATTACH_HUD_CENTER_1">HUD centre 1</string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">HUD en bas à gauche</string>
- <string name="ATTACH_HUD_BOTTOM">HUD en bas</string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD en bas à droite</string>
- <string name="ATTACH_NECK">Cou</string>
- <string name="ATTACH_AVATAR_CENTER">Centre de l'avatar</string>
- <string name="ATTACH_LHAND_RING1">Annulaire gauche</string>
- <string name="ATTACH_RHAND_RING1">Annulaire droit</string>
- <string name="ATTACH_TAIL_BASE">Base de la queue</string>
- <string name="ATTACH_TAIL_TIP">Bout de la queue</string>
- <string name="ATTACH_LWING">Aile gauche</string>
- <string name="ATTACH_RWING">Aile droite</string>
- <string name="ATTACH_FACE_JAW">Mâchoire</string>
- <string name="ATTACH_FACE_LEAR">Oreille gauche différente</string>
- <string name="ATTACH_FACE_REAR">Oreille droite différente</string>
- <string name="ATTACH_FACE_LEYE">Œil gauche différent</string>
- <string name="ATTACH_FACE_REYE">Œil droit différent</string>
- <string name="ATTACH_FACE_TONGUE">Langue</string>
- <string name="ATTACH_GROIN">Aine</string>
- <string name="ATTACH_HIND_LFOOT">Pied arrière gauche</string>
- <string name="ATTACH_HIND_RFOOT">Pied arrière droit</string>
- <string name="CursorPos">Ligne [LINE], colonne [COLUMN]</string>
- <string name="PanelDirCountFound">[COUNT] trouvé(s)</string>
- <string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string>
- <string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>
- <string name="PanelContentsTooltip">Contenu de l'objet</string>
- <string name="PanelContentsNewScript">Nouveau script</string>
- <string name="DoNotDisturbModeResponseDefault">Ce résident a activé Ne pas déranger et verra votre message plus tard.</string>
- <string name="MuteByName">(par nom)</string>
- <string name="MuteAgent">(résident)</string>
- <string name="MuteObject">(objet)</string>
- <string name="MuteGroup">(groupe)</string>
- <string name="MuteExternal">(externe)</string>
- <string name="RegionNoCovenant">Il n'y a aucun règlement pour ce domaine.</string>
- <string name="RegionNoCovenantOtherOwner">Il n'y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire.</string>
+ <string name="Balance">
+ Solde
+ </string>
+ <string name="Credits">
+ Crédits
+ </string>
+ <string name="Debits">
+ Débits
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Aucune donnée trouvée pour le groupe
+ </string>
+ <string name="IMParentEstate">
+ domaine parent
+ </string>
+ <string name="IMMainland">
+ continent
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="Anyone">
+ n'importe qui
+ </string>
+ <string name="RegionInfoError">
+ erreur
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ tous les domaines appartenant à [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ tous les domaines vous appartenant
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ tous les domaines que vous gérez pour [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Toujours autorisé : ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Groupes toujours autorisés : [ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoBannedResidents">
+ Toujours interdits : ([BANNEDAGENTS], max. [MAXBANNED])
+ </string>
+ <string name="RegionInfoListTypeAllowedAgents">
+ Toujours autorisé
+ </string>
+ <string name="RegionInfoListTypeBannedAgents">
+ Toujours interdit
+ </string>
+ <string name="RegionInfoAllEstates">
+ tous les domaines
+ </string>
+ <string name="RegionInfoManagedEstates">
+ domaines gérés
+ </string>
+ <string name="RegionInfoThisEstate">
+ ce domaine
+ </string>
+ <string name="AndNMore">
+ et [EXTRA_COUNT] plus
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Mémoire des scripts de parcelles
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcelles répertoriées : [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Mémoire utilisée : [COUNT] Ko sur [MAX] ; [AVAILABLE] Ko disponibles
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Mémoire utilisée : [COUNT] Ko
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL des scripts de parcelles
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL utilisées : [COUNT] sur [MAX] ; [AVAILABLE] disponible(s)
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL utilisées : [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Une erreur est survenue pendant la requête d'informations.
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Aucune parcelle sélectionnée
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Erreur : les informations de script ne sont disponibles que dans votre région actuelle.
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Extraction des informations en cours...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Vous n'avez pas le droit d'examiner cette parcelle.
+ </string>
+ <string name="SITTING_ON">
+ Assis(e) dessus
+ </string>
+ <string name="ATTACH_CHEST">
+ Poitrine
+ </string>
+ <string name="ATTACH_HEAD">
+ Crâne
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Épaule gauche
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Épaule droite
+ </string>
+ <string name="ATTACH_LHAND">
+ Main gauche
+ </string>
+ <string name="ATTACH_RHAND">
+ Main droite
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pied gauche
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pied droit
+ </string>
+ <string name="ATTACH_BACK">
+ Colonne vertébrale
+ </string>
+ <string name="ATTACH_PELVIS">
+ Bassin
+ </string>
+ <string name="ATTACH_MOUTH">
+ Bouche
+ </string>
+ <string name="ATTACH_CHIN">
+ Menton
+ </string>
+ <string name="ATTACH_LEAR">
+ Oreille gauche
+ </string>
+ <string name="ATTACH_REAR">
+ Oreille droite
+ </string>
+ <string name="ATTACH_LEYE">
+ Œil gauche
+ </string>
+ <string name="ATTACH_REYE">
+ Œil droit
+ </string>
+ <string name="ATTACH_NOSE">
+ Nez
+ </string>
+ <string name="ATTACH_RUARM">
+ Bras droit
+ </string>
+ <string name="ATTACH_RLARM">
+ Avant-bras droit
+ </string>
+ <string name="ATTACH_LUARM">
+ Bras gauche
+ </string>
+ <string name="ATTACH_LLARM">
+ Avant-bras gauche
+ </string>
+ <string name="ATTACH_RHIP">
+ Hanche droite
+ </string>
+ <string name="ATTACH_RULEG">
+ Cuisse droite
+ </string>
+ <string name="ATTACH_RLLEG">
+ Jambe droite
+ </string>
+ <string name="ATTACH_LHIP">
+ Hanche gauche
+ </string>
+ <string name="ATTACH_LULEG">
+ Cuisse gauche
+ </string>
+ <string name="ATTACH_LLLEG">
+ Jambe gauche
+ </string>
+ <string name="ATTACH_BELLY">
+ Estomac
+ </string>
+ <string name="ATTACH_LEFT_PEC">
+ Pectoral gauche
+ </string>
+ <string name="ATTACH_RIGHT_PEC">
+ Pectoral droit
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD centre 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD en haut à droite
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD en haut au centre
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD en haut à gauche
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD centre 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD en bas à gauche
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD en bas
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD en bas à droite
+ </string>
+ <string name="ATTACH_NECK">
+ Cou
+ </string>
+ <string name="ATTACH_AVATAR_CENTER">
+ Centre de l'avatar
+ </string>
+ <string name="ATTACH_LHAND_RING1">
+ Annulaire gauche
+ </string>
+ <string name="ATTACH_RHAND_RING1">
+ Annulaire droit
+ </string>
+ <string name="ATTACH_TAIL_BASE">
+ Base de la queue
+ </string>
+ <string name="ATTACH_TAIL_TIP">
+ Bout de la queue
+ </string>
+ <string name="ATTACH_LWING">
+ Aile gauche
+ </string>
+ <string name="ATTACH_RWING">
+ Aile droite
+ </string>
+ <string name="ATTACH_FACE_JAW">
+ Mâchoire
+ </string>
+ <string name="ATTACH_FACE_LEAR">
+ Oreille gauche différente
+ </string>
+ <string name="ATTACH_FACE_REAR">
+ Oreille droite différente
+ </string>
+ <string name="ATTACH_FACE_LEYE">
+ Œil gauche différent
+ </string>
+ <string name="ATTACH_FACE_REYE">
+ Œil droit différent
+ </string>
+ <string name="ATTACH_FACE_TONGUE">
+ Langue
+ </string>
+ <string name="ATTACH_GROIN">
+ Aine
+ </string>
+ <string name="ATTACH_HIND_LFOOT">
+ Pied arrière gauche
+ </string>
+ <string name="ATTACH_HIND_RFOOT">
+ Pied arrière droit
+ </string>
+ <string name="CursorPos">
+ Ligne [LINE], colonne [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] trouvé(s)
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenu de l'objet
+ </string>
+ <string name="PanelContentsNewScript">
+ Nouveau script
+ </string>
+ <string name="DoNotDisturbModeResponseDefault">
+ Ce résident a activé Ne pas déranger et verra votre message plus tard.
+ </string>
+ <string name="MuteByName">
+ (par nom)
+ </string>
+ <string name="MuteAgent">
+ (résident)
+ </string>
+ <string name="MuteObject">
+ (objet)
+ </string>
+ <string name="MuteGroup">
+ (groupe)
+ </string>
+ <string name="MuteExternal">
+ (externe)
+ </string>
+ <string name="RegionNoCovenant">
+ Il n'y a aucun règlement pour ce domaine.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Il n'y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire.
+ </string>
<string name="covenant_last_modified" value="Dernière modification :"/>
<string name="none_text" value=" (aucun)"/>
<string name="never_text" value=" (jamais)"/>
- <string name="GroupOwned">Propriété du groupe</string>
- <string name="Public">Public</string>
- <string name="LocalSettings">Réglages locaux</string>
- <string name="RegionSettings">Réglages de la région</string>
- <string name="NoEnvironmentSettings">Cette région ne prend pas en charge les paramètres environnementaux.</string>
- <string name="EnvironmentSun">Soleil</string>
- <string name="EnvironmentMoon">Lune</string>
- <string name="EnvironmentBloom">Éclat</string>
- <string name="EnvironmentCloudNoise">Bruit du nuage</string>
- <string name="EnvironmentNormalMap">Carte normale</string>
- <string name="EnvironmentTransparent">Transparent</string>
- <string name="ClassifiedClicksTxt">Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil</string>
- <string name="ClassifiedUpdateAfterPublish">(mise à jour après la publication)</string>
- <string name="NoPicksClassifiedsText">Vous n'avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce.</string>
- <string name="NoPicksText">Vous n'avez pas créé de favoris Cliquer sur le bouton Nouveau pour créer un favori</string>
- <string name="NoClassifiedsText">Vous n'avez pas créé de petites annonces Cliquer sur le bouton Nouveau pour créer une petite annonce.</string>
- <string name="NoAvatarPicksClassifiedsText">L'utilisateur n'a ni favoris ni petites annonces.</string>
- <string name="NoAvatarPicksText">L'utilisateur n'a pas de favoris</string>
- <string name="NoAvatarClassifiedsText">L'utilisateur n'a pas de petites annonces</string>
- <string name="PicksClassifiedsLoadingText">Chargement...</string>
- <string name="MultiPreviewTitle">Prévisualiser</string>
- <string name="MultiPropertiesTitle">Propriétés</string>
- <string name="InvOfferAnObjectNamed">Un objet appelé</string>
- <string name="InvOfferOwnedByGroup">possédé par le groupe</string>
- <string name="InvOfferOwnedByUnknownGroup">possédé par un groupe inconnu</string>
- <string name="InvOfferOwnedBy">possédé par</string>
- <string name="InvOfferOwnedByUnknownUser">possédé par un résident inconnu</string>
- <string name="InvOfferGaveYou">vous a donné</string>
- <string name="InvOfferDecline">Vous refusez l'offre [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.</string>
- <string name="GroupMoneyTotal">Total</string>
- <string name="GroupMoneyBought">acheté</string>
- <string name="GroupMoneyPaidYou">vous a payé</string>
- <string name="GroupMoneyPaidInto">payé</string>
- <string name="GroupMoneyBoughtPassTo">a acheté un pass à</string>
- <string name="GroupMoneyPaidFeeForEvent">a payé des frais pour un événement</string>
- <string name="GroupMoneyPaidPrizeForEvent">a payé un prix pour un événement</string>
- <string name="GroupMoneyBalance">Solde</string>
- <string name="GroupMoneyCredits">Crédits</string>
- <string name="GroupMoneyDebits">Débits</string>
- <string name="GroupMoneyDate">[weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]</string>
- <string name="AcquiredItems">Objets acquis</string>
- <string name="Cancel">Annuler</string>
- <string name="UploadingCosts">Le chargement de [NAME] coûte [AMOUNT] L$</string>
- <string name="BuyingCosts">Cet achat coûte [AMOUNT] L$</string>
- <string name="UnknownFileExtension">Extension de fichier inconnue .%s
-.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés</string>
- <string name="MuteObject2">Ignorer</string>
- <string name="MuteAvatar">Ignorer</string>
- <string name="UnmuteObject">Ne plus ignorer</string>
- <string name="UnmuteAvatar">Ne plus ignorer</string>
- <string name="AddLandmarkNavBarMenu">Ajouter à mes repères...</string>
- <string name="EditLandmarkNavBarMenu">Modifier mon repère...</string>
- <string name="accel-mac-control">⌃</string>
- <string name="accel-mac-command">⌘</string>
- <string name="accel-mac-option">⌥</string>
- <string name="accel-mac-shift">⇧</string>
- <string name="accel-win-control">Ctrl+</string>
- <string name="accel-win-alt">Alt+</string>
- <string name="accel-win-shift">Maj+</string>
- <string name="FileSaved">Fichier enregistré</string>
- <string name="Receiving">Réception</string>
- <string name="AM">Matin</string>
- <string name="PM">Après-midi</string>
- <string name="PST">PST</string>
- <string name="PDT">PDT</string>
- <string name="Direction_Forward">Avant</string>
- <string name="Direction_Left">Gauche</string>
- <string name="Direction_Right">Droite</string>
- <string name="Direction_Back">Arrière</string>
- <string name="Direction_North">Nord</string>
- <string name="Direction_South">Sud</string>
- <string name="Direction_West">Ouest</string>
- <string name="Direction_East">Est</string>
- <string name="Direction_Up">Haut</string>
- <string name="Direction_Down">Bas</string>
- <string name="Any Category">Toutes catégories</string>
- <string name="Shopping">Shopping</string>
- <string name="Land Rental">Terrains à louer</string>
- <string name="Property Rental">Propriétés à louer</string>
- <string name="Special Attraction">Divertissements</string>
- <string name="New Products">Nouveaux produits</string>
- <string name="Employment">Emplois</string>
- <string name="Wanted">Offres</string>
- <string name="Service">Services</string>
- <string name="Personal">Divers</string>
- <string name="None">Aucun</string>
- <string name="Linden Location">Appartenant aux Lindens</string>
- <string name="Adult">Adulte</string>
- <string name="Arts&amp;Culture">Arts et culture</string>
- <string name="Business">Business</string>
- <string name="Educational">Éducation</string>
- <string name="Gaming">Jeux</string>
- <string name="Hangout">Favoris</string>
- <string name="Newcomer Friendly">Accueil pour les nouveaux</string>
- <string name="Parks&amp;Nature">Parcs et nature</string>
- <string name="Residential">Résidentiel</string>
- <string name="Stage">Phase</string>
- <string name="Other">Autre</string>
- <string name="Rental">Location</string>
- <string name="Any">Aucun</string>
- <string name="You">Vous</string>
- <string name=":">:</string>
- <string name=",">,</string>
- <string name="...">...</string>
- <string name="***">***</string>
- <string name="(">(</string>
- <string name=")">)</string>
- <string name=".">.</string>
- <string name="'">'</string>
- <string name="---">---</string>
- <string name="Multiple Media">Médias multiples</string>
- <string name="Play Media">Lire/pauser le média</string>
- <string name="IntelDriverPage">http://www.intel.com/p/fr_FR/support/detect/graphics</string>
- <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=fr</string>
- <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string>
- <string name="MBCmdLineError">Une erreur est survenue lors de la lecture de la ligne de commande.
+ <string name="GroupOwned">
+ Propriété du groupe
+ </string>
+ <string name="Public">
+ Public
+ </string>
+ <string name="LocalSettings">
+ Réglages locaux
+ </string>
+ <string name="RegionSettings">
+ Réglages de la région
+ </string>
+ <string name="NoEnvironmentSettings">
+ Cette région ne prend pas en charge les paramètres environnementaux.
+ </string>
+ <string name="EnvironmentSun">
+ Soleil
+ </string>
+ <string name="EnvironmentMoon">
+ Lune
+ </string>
+ <string name="EnvironmentBloom">
+ Éclat
+ </string>
+ <string name="EnvironmentCloudNoise">
+ Bruit du nuage
+ </string>
+ <string name="EnvironmentNormalMap">
+ Carte normale
+ </string>
+ <string name="EnvironmentTransparent">
+ Transparent
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (mise à jour après la publication)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Vous n'avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce.
+ </string>
+ <string name="NoPicksText">
+ Vous n'avez pas créé de favoris Cliquer sur le bouton Nouveau pour créer un favori
+ </string>
+ <string name="NoClassifiedsText">
+ Vous n'avez pas créé de petites annonces Cliquer sur le bouton Nouveau pour créer une petite annonce.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ L'utilisateur n'a ni favoris ni petites annonces.
+ </string>
+ <string name="NoAvatarPicksText">
+ L'utilisateur n'a pas de favoris
+ </string>
+ <string name="NoAvatarClassifiedsText">
+ L'utilisateur n'a pas de petites annonces
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Chargement...
+ </string>
+ <string name="MultiPreviewTitle">
+ Prévisualiser
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propriétés
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objet appelé
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ possédé par le groupe
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ possédé par un groupe inconnu
+ </string>
+ <string name="InvOfferOwnedBy">
+ possédé par
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ possédé par un résident inconnu
+ </string>
+ <string name="InvOfferGaveYou">
+ vous a donné
+ </string>
+ <string name="InvOfferDecline">
+ Vous refusez l'offre [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ acheté
+ </string>
+ <string name="GroupMoneyPaidYou">
+ vous a payé
+ </string>
+ <string name="GroupMoneyPaidInto">
+ payé
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ a acheté un pass à
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ a payé des frais pour un événement
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ a payé un prix pour un événement
+ </string>
+ <string name="GroupMoneyBalance">
+ Solde
+ </string>
+ <string name="GroupMoneyCredits">
+ Crédits
+ </string>
+ <string name="GroupMoneyDebits">
+ Débits
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]
+ </string>
+ <string name="AcquiredItems">
+ Objets acquis
+ </string>
+ <string name="Cancel">
+ Annuler
+ </string>
+ <string name="UploadingCosts">
+ Le chargement de [NAME] coûte [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Cet achat coûte [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Extension de fichier inconnue .%s
+.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés
+ </string>
+ <string name="MuteObject2">
+ Ignorer
+ </string>
+ <string name="MuteAvatar">
+ Ignorer
+ </string>
+ <string name="UnmuteObject">
+ Ne plus ignorer
+ </string>
+ <string name="UnmuteAvatar">
+ Ne plus ignorer
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Ajouter à mes repères...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Modifier mon repère...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Maj+
+ </string>
+ <string name="FileSaved">
+ Fichier enregistré
+ </string>
+ <string name="Receiving">
+ Réception
+ </string>
+ <string name="AM">
+ Matin
+ </string>
+ <string name="PM">
+ Après-midi
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Avant
+ </string>
+ <string name="Direction_Left">
+ Gauche
+ </string>
+ <string name="Direction_Right">
+ Droite
+ </string>
+ <string name="Direction_Back">
+ Arrière
+ </string>
+ <string name="Direction_North">
+ Nord
+ </string>
+ <string name="Direction_South">
+ Sud
+ </string>
+ <string name="Direction_West">
+ Ouest
+ </string>
+ <string name="Direction_East">
+ Est
+ </string>
+ <string name="Direction_Up">
+ Haut
+ </string>
+ <string name="Direction_Down">
+ Bas
+ </string>
+ <string name="Any Category">
+ Toutes catégories
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Terrains à louer
+ </string>
+ <string name="Property Rental">
+ Propriétés à louer
+ </string>
+ <string name="Special Attraction">
+ Divertissements
+ </string>
+ <string name="New Products">
+ Nouveaux produits
+ </string>
+ <string name="Employment">
+ Emplois
+ </string>
+ <string name="Wanted">
+ Offres
+ </string>
+ <string name="Service">
+ Services
+ </string>
+ <string name="Personal">
+ Divers
+ </string>
+ <string name="None">
+ Aucun
+ </string>
+ <string name="Linden Location">
+ Appartenant aux Lindens
+ </string>
+ <string name="Adult">
+ Adulte
+ </string>
+ <string name="Arts&amp;Culture">
+ Arts et culture
+ </string>
+ <string name="Business">
+ Business
+ </string>
+ <string name="Educational">
+ Éducation
+ </string>
+ <string name="Gaming">
+ Jeux
+ </string>
+ <string name="Hangout">
+ Favoris
+ </string>
+ <string name="Newcomer Friendly">
+ Accueil pour les nouveaux
+ </string>
+ <string name="Parks&amp;Nature">
+ Parcs et nature
+ </string>
+ <string name="Residential">
+ Résidentiel
+ </string>
+ <string name="Stage">
+ Phase
+ </string>
+ <string name="Other">
+ Autre
+ </string>
+ <string name="Rental">
+ Location
+ </string>
+ <string name="Any">
+ Aucun
+ </string>
+ <string name="You">
+ Vous
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="'">
+ '
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ Médias multiples
+ </string>
+ <string name="Play Media">
+ Lire/pauser le média
+ </string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/fr_FR/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=fr
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
+ <string name="MBCmdLineError">
+ Une erreur est survenue lors de la lecture de la ligne de commande.
Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters
-Erreur :</string>
- <string name="MBCmdLineUsg">[APP_NAME] - Utilisation de la ligne de commande :</string>
- <string name="MBUnableToAccessFile">[APP_NAME] ne peut accéder à un fichier requis.
+Erreur :
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] - Utilisation de la ligne de commande :
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] ne peut accéder à un fichier requis.
Cela vient du fait que quelqu'un a ouvert plusieurs copies ou que votre système pense qu'un fichier est ouvert.
Si ce message persiste, veuillez redémarrer votre ordinateur.
-Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME].</string>
- <string name="MBFatalError">Erreur fatale</string>
- <string name="MBRequiresAltiVec">[APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure).</string>
- <string name="MBAlreadyRunning">[APP_NAME] est déjà en cours d'exécution.
+Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME].
+ </string>
+ <string name="MBFatalError">
+ Erreur fatale
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] est déjà en cours d'exécution.
Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches.
-Si ce message persiste, redémarrez votre ordinateur.</string>
- <string name="MBFrozenCrashed">[APP_NAME] semble avoir crashé lors de l'utilisation précédente.
-Voulez-vous envoyer un rapport de crash ?</string>
- <string name="MBAlert">Notification</string>
- <string name="MBNoDirectX">[APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure.
+Si ce message persiste, redémarrez votre ordinateur.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] semble avoir crashé lors de l'utilisation précédente.
+Voulez-vous envoyer un rapport de crash ?
+ </string>
+ <string name="MBAlert">
+ Notification
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure.
[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l'utiliser avec DirectX 9.0b.
-Voulez-vous continuer ?</string>
- <string name="MBWarning">Avertissement</string>
- <string name="MBNoAutoUpdate">Les mises à jour automatiques n'existent pas encore pour Linux.
-Veuillez télécharger la dernière version sur www.secondlife.com.</string>
- <string name="MBRegClassFailed">RegisterClass a échoué</string>
- <string name="MBError">Erreur</string>
- <string name="MBFullScreenErr">Impossible d'ouvrir le mode plein écran à [WIDTH] x [HEIGHT].
-Utilisation du mode fenêtré.</string>
- <string name="MBDestroyWinFailed">Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué)</string>
- <string name="MBShutdownErr">Erreur de fermeture</string>
- <string name="MBDevContextErr">Impossible de créer le contexte GL</string>
- <string name="MBPixelFmtErr">Impossible de trouver le format pixel approprié</string>
- <string name="MBPixelFmtDescErr">Impossible de trouver la description du format pixel</string>
- <string name="MBTrueColorWindow">[APP_NAME] nécessite True Color (32 bits) pour s'exécuter.
-Accédez aux paramètres d'affichage de votre ordinateur et réglez le mode couleur sur 32 bits.</string>
- <string name="MBAlpha">[APP_NAME] ne peut pas s'exécuter, car il n'y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo.
+Voulez-vous continuer ?
+ </string>
+ <string name="MBWarning">
+ Avertissement
+ </string>
+ <string name="MBNoAutoUpdate">
+ Les mises à jour automatiques n'existent pas encore pour Linux.
+Veuillez télécharger la dernière version sur www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass a échoué
+ </string>
+ <string name="MBError">
+ Erreur
+ </string>
+ <string name="MBFullScreenErr">
+ Impossible d'ouvrir le mode plein écran à [WIDTH] x [HEIGHT].
+Utilisation du mode fenêtré.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué)
+ </string>
+ <string name="MBShutdownErr">
+ Erreur de fermeture
+ </string>
+ <string name="MBDevContextErr">
+ Impossible de créer le contexte GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Impossible de trouver le format pixel approprié
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Impossible de trouver la description du format pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] nécessite True Color (32 bits) pour s'exécuter.
+Accédez aux paramètres d'affichage de votre ordinateur et réglez le mode couleur sur 32 bits.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] ne peut pas s'exécuter, car il n'y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo.
Assurez-vous d'avoir installé le pilote de carte vidéo le plus récent possible.
Assurez-vous aussi que votre écran est réglé sur True Color (32 bits) sous Panneau de configuration &gt; Affichage &gt; Paramètres.
-Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].</string>
- <string name="MBPixelFmtSetErr">Impossible de trouver le format pixel approprié</string>
- <string name="MBGLContextErr">Impossible de créer le contexte de rendu GL</string>
- <string name="MBGLContextActErr">Impossible d'activer le contexte de rendu GL</string>
- <string name="MBVideoDrvErr">[APP_NAME] ne peut pas s'exécuter car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les.
+Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Impossible de trouver le format pixel approprié
+ </string>
+ <string name="MBGLContextErr">
+ Impossible de créer le contexte de rendu GL
+ </string>
+ <string name="MBGLContextActErr">
+ Impossible d'activer le contexte de rendu GL
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] ne peut pas s'exécuter car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les.
-Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].</string>
- <string name="5 O'Clock Shadow">Peu</string>
- <string name="All White">Tout blancs</string>
- <string name="Anime Eyes">Grand yeux</string>
- <string name="Arced">Arqués</string>
- <string name="Arm Length">Longueur des bras</string>
- <string name="Attached">Attachés</string>
- <string name="Attached Earlobes">Lobes</string>
- <string name="Back Fringe">Mèches de derrière</string>
- <string name="Baggy">Plus</string>
- <string name="Bangs">Frange</string>
- <string name="Beady Eyes">Yeux perçants</string>
- <string name="Belly Size">Taille du ventre</string>
- <string name="Big">Plus</string>
- <string name="Big Butt">Grosses fesses</string>
- <string name="Big Hair Back">Volume : Derrière</string>
- <string name="Big Hair Front">Volume : Devant</string>
- <string name="Big Hair Top">Volume : Haut</string>
- <string name="Big Head">Plus</string>
- <string name="Big Pectorals">Gros pectoraux</string>
- <string name="Big Spikes">Spikes</string>
- <string name="Black">Noir</string>
- <string name="Blonde">Blond</string>
- <string name="Blonde Hair">Cheveux blonds</string>
- <string name="Blush">Blush</string>
- <string name="Blush Color">Couleur du blush</string>
- <string name="Blush Opacity">Opacité du blush</string>
- <string name="Body Definition">Contour du corps</string>
- <string name="Body Fat">Graisse</string>
- <string name="Body Freckles">Grains de beauté</string>
- <string name="Body Thick">Plus</string>
- <string name="Body Thickness">Épaisseur du corps</string>
- <string name="Body Thin">Moins</string>
- <string name="Bow Legged">Jambes arquées</string>
- <string name="Breast Buoyancy">Hauteur des seins</string>
- <string name="Breast Cleavage">Clivage</string>
- <string name="Breast Size">Taille des seins</string>
- <string name="Bridge Width">Arête du nez</string>
- <string name="Broad">Large</string>
- <string name="Brow Size">Taille du front</string>
- <string name="Bug Eyes">Yeux globuleux</string>
- <string name="Bugged Eyes">Yeux globuleux</string>
- <string name="Bulbous">En bulbe</string>
- <string name="Bulbous Nose">Nez en bulbe</string>
- <string name="Breast Physics Mass">Masse des seins</string>
- <string name="Breast Physics Smoothing">Lissage des seins</string>
- <string name="Breast Physics Gravity">Gravité des seins</string>
- <string name="Breast Physics Drag">Résistance de l'air sur les seins</string>
- <string name="Breast Physics InOut Max Effect">Effet max.</string>
- <string name="Breast Physics InOut Spring">Élasticité</string>
- <string name="Breast Physics InOut Gain">Amplification</string>
- <string name="Breast Physics InOut Damping">Amortissement</string>
- <string name="Breast Physics UpDown Max Effect">Effet max.</string>
- <string name="Breast Physics UpDown Spring">Élasticité</string>
- <string name="Breast Physics UpDown Gain">Amplification</string>
- <string name="Breast Physics UpDown Damping">Amortissement</string>
- <string name="Breast Physics LeftRight Max Effect">Effet max.</string>
- <string name="Breast Physics LeftRight Spring">Élasticité</string>
- <string name="Breast Physics LeftRight Gain">Amplification</string>
- <string name="Breast Physics LeftRight Damping">Amortissement</string>
- <string name="Belly Physics Mass">Masse du ventre</string>
- <string name="Belly Physics Smoothing">Lissage du ventre</string>
- <string name="Belly Physics Gravity">Gravité du ventre</string>
- <string name="Belly Physics Drag">Résistance de l'air sur le ventre</string>
- <string name="Belly Physics UpDown Max Effect">Effet max.</string>
- <string name="Belly Physics UpDown Spring">Élasticité</string>
- <string name="Belly Physics UpDown Gain">Amplification</string>
- <string name="Belly Physics UpDown Damping">Amortissement</string>
- <string name="Butt Physics Mass">Masse des fesses</string>
- <string name="Butt Physics Smoothing">Lissage des fesses</string>
- <string name="Butt Physics Gravity">Gravité des fesses</string>
- <string name="Butt Physics Drag">Résistance de l'air sur les fesses</string>
- <string name="Butt Physics UpDown Max Effect">Effet max.</string>
- <string name="Butt Physics UpDown Spring">Élasticité</string>
- <string name="Butt Physics UpDown Gain">Amplification</string>
- <string name="Butt Physics UpDown Damping">Amortissement</string>
- <string name="Butt Physics LeftRight Max Effect">Effet max.</string>
- <string name="Butt Physics LeftRight Spring">Élasticité</string>
- <string name="Butt Physics LeftRight Gain">Amplification</string>
- <string name="Butt Physics LeftRight Damping">Amortissement</string>
- <string name="Bushy Eyebrows">Sourcils touffus</string>
- <string name="Bushy Hair">Beaucoup</string>
- <string name="Butt Size">Taille des fesses</string>
- <string name="Butt Gravity">Gravité des fesses</string>
- <string name="bustle skirt">Jupe gonflante</string>
- <string name="no bustle">Pas gonflante</string>
- <string name="more bustle">Plus gonflante</string>
- <string name="Chaplin">Moins</string>
- <string name="Cheek Bones">Pommettes</string>
- <string name="Chest Size">Taille de la poitrine</string>
- <string name="Chin Angle">Angle du menton</string>
- <string name="Chin Cleft">Fente du menton</string>
- <string name="Chin Curtains">Favoris</string>
- <string name="Chin Depth">Profondeur</string>
- <string name="Chin Heavy">Menton lourd</string>
- <string name="Chin In">Menton rentré</string>
- <string name="Chin Out">Menton sorti</string>
- <string name="Chin-Neck">Menton-cou</string>
- <string name="Clear">Clair</string>
- <string name="Cleft">Fendu</string>
- <string name="Close Set Eyes">Yeux rapprochés</string>
- <string name="Closed">Fermé(s)</string>
- <string name="Closed Back">Fermé à l'arrière</string>
- <string name="Closed Front">Fermé devant</string>
- <string name="Closed Left">Fermé à gauche</string>
- <string name="Closed Right">Fermé à droite</string>
- <string name="Coin Purse">Mini</string>
- <string name="Collar Back">Col arrière</string>
- <string name="Collar Front">Col devant</string>
- <string name="Corner Down">Coin vers le bas</string>
- <string name="Corner Up">Coin vers le haut</string>
- <string name="Creased">Fripée</string>
- <string name="Crooked Nose">Déviation du nez</string>
- <string name="Cuff Flare">Jambes</string>
- <string name="Dark">Sombre</string>
- <string name="Dark Green">Vert foncé</string>
- <string name="Darker">Plus foncé</string>
- <string name="Deep">Profonde</string>
- <string name="Default Heels">Talons par défaut</string>
- <string name="Dense">Dense</string>
- <string name="Double Chin">Double menton</string>
- <string name="Downturned">Pointant vers le bas</string>
- <string name="Duffle Bag">Maxi</string>
- <string name="Ear Angle">Angle de l'oreille</string>
- <string name="Ear Size">Taille</string>
- <string name="Ear Tips">Extrémités</string>
- <string name="Egg Head">Proéminence</string>
- <string name="Eye Bags">Cernes</string>
- <string name="Eye Color">Couleur des yeux</string>
- <string name="Eye Depth">Profondeur</string>
- <string name="Eye Lightness">Clarté</string>
- <string name="Eye Opening">Ouverture</string>
- <string name="Eye Pop">Œil proéminent</string>
- <string name="Eye Size">Taille de l'œil</string>
- <string name="Eye Spacing">Espacement</string>
- <string name="Eyebrow Arc">Arc</string>
- <string name="Eyebrow Density">Épaisseur sourcils</string>
- <string name="Eyebrow Height">Hauteur</string>
- <string name="Eyebrow Points">Direction</string>
- <string name="Eyebrow Size">Taille</string>
- <string name="Eyelash Length">Longueur des cils</string>
- <string name="Eyeliner">Eyeliner</string>
- <string name="Eyeliner Color">Couleur de l'eyeliner</string>
- <string name="Eyes Bugged">Yeux globuleux</string>
- <string name="Face Shear">Visage</string>
- <string name="Facial Definition">Définition</string>
- <string name="Far Set Eyes">Yeux écartés</string>
- <string name="Fat Lips">Lèvres épaisses</string>
- <string name="Female">Femme</string>
- <string name="Fingerless">Sans doigts</string>
- <string name="Fingers">Doigts</string>
- <string name="Flared Cuffs">Jambes larges</string>
- <string name="Flat">Moins</string>
- <string name="Flat Butt">Fesses plates</string>
- <string name="Flat Head">Tête plate</string>
- <string name="Flat Toe">Orteil plat</string>
- <string name="Foot Size">Pointure</string>
- <string name="Forehead Angle">Angle du front</string>
- <string name="Forehead Heavy">Front lourd</string>
- <string name="Freckles">Tâches de rousseur</string>
- <string name="Front Fringe">Mèches de devant</string>
- <string name="Full Back">Arrière touffu</string>
- <string name="Full Eyeliner">Eyeliner marqué</string>
- <string name="Full Front">Devant touffu</string>
- <string name="Full Hair Sides">Côtés touffus</string>
- <string name="Full Sides">Côtés touffus</string>
- <string name="Glossy">Brillant</string>
- <string name="Glove Fingers">Gants avec doigts</string>
- <string name="Glove Length">Longueur</string>
- <string name="Hair">Cheveux</string>
- <string name="Hair Back">Cheveux : Derrière</string>
- <string name="Hair Front">Cheveux : Devant</string>
- <string name="Hair Sides">Cheveux : Côtés</string>
- <string name="Hair Sweep">Sens de la coiffure</string>
- <string name="Hair Thickess">Épaisseur cheveux</string>
- <string name="Hair Thickness">Épaisseur cheveux</string>
- <string name="Hair Tilt">Inclinaison</string>
- <string name="Hair Tilted Left">Vers la gauche</string>
- <string name="Hair Tilted Right">Vers la droite</string>
- <string name="Hair Volume">Cheveux : Volume</string>
- <string name="Hand Size">Taille de la main</string>
- <string name="Handlebars">Plus</string>
- <string name="Head Length">Longueur</string>
- <string name="Head Shape">Forme</string>
- <string name="Head Size">Taille</string>
- <string name="Head Stretch">Allongement</string>
- <string name="Heel Height">Talons</string>
- <string name="Heel Shape">Forme des talons</string>
- <string name="Height">Taille</string>
- <string name="High">Haut</string>
- <string name="High Heels">Talons hauts</string>
- <string name="High Jaw">Haut</string>
- <string name="High Platforms">Haute</string>
- <string name="High and Tight">Haut et serré</string>
- <string name="Higher">Plus élevé</string>
- <string name="Hip Length">Longueur hanche</string>
- <string name="Hip Width">Largeur hanche</string>
- <string name="Hover">Survol</string>
- <string name="In">Rentré</string>
- <string name="In Shdw Color">Couleur ombre interne</string>
- <string name="In Shdw Opacity">Opacité ombre interne</string>
- <string name="Inner Eye Corner">Coin interne</string>
- <string name="Inner Eye Shadow">Ombre de l'œil interne</string>
- <string name="Inner Shadow">Ombre interne</string>
- <string name="Jacket Length">Longueur de la veste</string>
- <string name="Jacket Wrinkles">Plis de la veste</string>
- <string name="Jaw Angle">Angle mâchoire</string>
- <string name="Jaw Jut">Saillie mâchoire</string>
- <string name="Jaw Shape">Mâchoire</string>
- <string name="Join">Rapprochés</string>
- <string name="Jowls">Bajoues</string>
- <string name="Knee Angle">Angle du genou</string>
- <string name="Knock Kneed">Genoux rapprochés</string>
- <string name="Large">Plus</string>
- <string name="Large Hands">Grandes mains</string>
- <string name="Left Part">Raie à gauche</string>
- <string name="Leg Length">Longueur</string>
- <string name="Leg Muscles">Muscles</string>
- <string name="Less">Moins</string>
- <string name="Less Body Fat">Moins</string>
- <string name="Less Curtains">Moins</string>
- <string name="Less Freckles">Moins</string>
- <string name="Less Full">Moins</string>
- <string name="Less Gravity">Moins</string>
- <string name="Less Love">Moins</string>
- <string name="Less Muscles">Moins</string>
- <string name="Less Muscular">Moins</string>
- <string name="Less Rosy">Moins</string>
- <string name="Less Round">Moins ronde</string>
- <string name="Less Saddle">Moins</string>
- <string name="Less Square">Moins carrée</string>
- <string name="Less Volume">Moins</string>
- <string name="Less soul">Moins</string>
- <string name="Lighter">Plus léger</string>
- <string name="Lip Cleft">Fente labiale</string>
- <string name="Lip Cleft Depth">Prof. fente labiale</string>
- <string name="Lip Fullness">Volume des lèvres</string>
- <string name="Lip Pinkness">Rougeur des lèvres</string>
- <string name="Lip Ratio">Proportion des lèvres</string>
- <string name="Lip Thickness">Épaisseur</string>
- <string name="Lip Width">Largeur</string>
- <string name="Lipgloss">Brillant à lèvres</string>
- <string name="Lipstick">Rouge à lèvres</string>
- <string name="Lipstick Color">Couleur du rouge à lèvres</string>
- <string name="Long">Plus</string>
- <string name="Long Head">Tête longue</string>
- <string name="Long Hips">Hanches longues</string>
- <string name="Long Legs">Jambes longues</string>
- <string name="Long Neck">Long cou</string>
- <string name="Long Pigtails">Longues couettes</string>
- <string name="Long Ponytail">Longue queue de cheval</string>
- <string name="Long Torso">Torse long</string>
- <string name="Long arms">Bras longs</string>
- <string name="Loose Pants">Pantalons amples</string>
- <string name="Loose Shirt">Chemise ample</string>
- <string name="Loose Sleeves">Manches amples</string>
- <string name="Love Handles">Poignées d'amour</string>
- <string name="Low">Bas</string>
- <string name="Low Heels">Talons bas</string>
- <string name="Low Jaw">Bas</string>
- <string name="Low Platforms">Basse</string>
- <string name="Low and Loose">Bas et ample</string>
- <string name="Lower">Abaisser</string>
- <string name="Lower Bridge">Arête inférieure</string>
- <string name="Lower Cheeks">Joue inférieure</string>
- <string name="Male">Homme</string>
- <string name="Middle Part">Raie au milieu</string>
- <string name="More">Plus</string>
- <string name="More Blush">Plus</string>
- <string name="More Body Fat">Plus</string>
- <string name="More Curtains">Plus</string>
- <string name="More Eyeshadow">Plus</string>
- <string name="More Freckles">Plus</string>
- <string name="More Full">Plus</string>
- <string name="More Gravity">Plus</string>
- <string name="More Lipstick">Plus</string>
- <string name="More Love">Plus</string>
- <string name="More Lower Lip">Inférieure plus grosse</string>
- <string name="More Muscles">Plus</string>
- <string name="More Muscular">Plus</string>
- <string name="More Rosy">Plus</string>
- <string name="More Round">Plus</string>
- <string name="More Saddle">Plus</string>
- <string name="More Sloped">Plus</string>
- <string name="More Square">Plus</string>
- <string name="More Upper Lip">Supérieure plus grosse</string>
- <string name="More Vertical">Plus</string>
- <string name="More Volume">Plus</string>
- <string name="More soul">Plus</string>
- <string name="Moustache">Moustache</string>
- <string name="Mouth Corner">Coin de la bouche</string>
- <string name="Mouth Position">Position</string>
- <string name="Mowhawk">Mowhawk</string>
- <string name="Muscular">Musclé</string>
- <string name="Mutton Chops">Longs</string>
- <string name="Nail Polish">Vernis à ongles</string>
- <string name="Nail Polish Color">Couleur du vernis</string>
- <string name="Narrow">Moins</string>
- <string name="Narrow Back">Arrière étroit</string>
- <string name="Narrow Front">Devant étroit</string>
- <string name="Narrow Lips">Lèvres étroites</string>
- <string name="Natural">Naturel</string>
- <string name="Neck Length">Longueur du cou</string>
- <string name="Neck Thickness">Épaisseur du cou</string>
- <string name="No Blush">Pas de blush</string>
- <string name="No Eyeliner">Pas d'eyeliner</string>
- <string name="No Eyeshadow">Pas d'ombre à paupières</string>
- <string name="No Lipgloss">Pas de brillant à lèvres</string>
- <string name="No Lipstick">Pas de rouge à lèvres</string>
- <string name="No Part">Pas de raie</string>
- <string name="No Polish">Pas de vernis</string>
- <string name="No Red">Pas de rouge</string>
- <string name="No Spikes">Pas de spikes</string>
- <string name="No White">Pas de blanc</string>
- <string name="No Wrinkles">Pas de rides</string>
- <string name="Normal Lower">Normal plus bas</string>
- <string name="Normal Upper">Normal plus haut</string>
- <string name="Nose Left">Nez à gauche</string>
- <string name="Nose Right">Nez à droite</string>
- <string name="Nose Size">Taille du nez</string>
- <string name="Nose Thickness">Épaisseur du nez</string>
- <string name="Nose Tip Angle">Angle bout du nez</string>
- <string name="Nose Tip Shape">Forme bout du nez</string>
- <string name="Nose Width">Largeur du nez</string>
- <string name="Nostril Division">Division narines</string>
- <string name="Nostril Width">Largeur narines</string>
- <string name="Opaque">Opaque</string>
- <string name="Open">Ouvert</string>
- <string name="Open Back">Derrière ouvert</string>
- <string name="Open Front">Devant ouvert</string>
- <string name="Open Left">Ouvert à gauche</string>
- <string name="Open Right">Ouvert à droite</string>
- <string name="Orange">Orange</string>
- <string name="Out">Sorti</string>
- <string name="Out Shdw Color">Couleur de l'ombre externe</string>
- <string name="Out Shdw Opacity">Opacité de l'ombre externe</string>
- <string name="Outer Eye Corner">Coin externe</string>
- <string name="Outer Eye Shadow">Ombre de l'œil externe</string>
- <string name="Outer Shadow">Ombre externe</string>
- <string name="Overbite">Rentrée</string>
- <string name="Package">Parties</string>
- <string name="Painted Nails">Ongles vernis</string>
- <string name="Pale">Pâle</string>
- <string name="Pants Crotch">Entrejambe</string>
- <string name="Pants Fit">Taille</string>
- <string name="Pants Length">Longueur</string>
- <string name="Pants Waist">Taille</string>
- <string name="Pants Wrinkles">Plis</string>
- <string name="Part">Raie</string>
- <string name="Part Bangs">Séparation frange</string>
- <string name="Pectorals">Pectoraux</string>
- <string name="Pigment">Pigmentation</string>
- <string name="Pigtails">Couettes</string>
- <string name="Pink">Rose</string>
- <string name="Pinker">Plus rose</string>
- <string name="Platform Height">Platef. (hauteur)</string>
- <string name="Platform Width">Platef. (largeur)</string>
- <string name="Pointy">Pointue</string>
- <string name="Pointy Heels">Talons pointus</string>
- <string name="Ponytail">Queue de cheval</string>
- <string name="Poofy Skirt">Jupe bouffante</string>
- <string name="Pop Left Eye">Œil gauche saillant</string>
- <string name="Pop Right Eye">Œil droit saillant</string>
- <string name="Puffy">Plus</string>
- <string name="Puffy Eyelids">Paup. gonflées</string>
- <string name="Rainbow Color">Couleur arc en ciel</string>
- <string name="Red Hair">Cheveux roux</string>
- <string name="Regular">Standard</string>
- <string name="Right Part">Raie à droite</string>
- <string name="Rosy Complexion">Teint rosé</string>
- <string name="Round">Rond</string>
- <string name="Ruddiness">Rougeur</string>
- <string name="Ruddy">Rouge</string>
- <string name="Rumpled Hair">Texture</string>
- <string name="Saddle Bags">Culotte de cheval</string>
- <string name="Scrawny Leg">Jambes maigres</string>
- <string name="Separate">Séparés</string>
- <string name="Shallow">Creux</string>
- <string name="Shear Back">Coupe derrière</string>
- <string name="Shear Face">Visage</string>
- <string name="Shear Front">Front</string>
- <string name="Shear Left Up">Haut gauche décalé</string>
- <string name="Shear Right Up">Haut droit décalé</string>
- <string name="Sheared Back">Dégagé derrière</string>
- <string name="Sheared Front">Dégagé devant</string>
- <string name="Shift Left">Vers la gauche</string>
- <string name="Shift Mouth">Déplacement</string>
- <string name="Shift Right">Vers la droite</string>
- <string name="Shirt Bottom">Chemise</string>
- <string name="Shirt Fit">Taille</string>
- <string name="Shirt Wrinkles">Plis</string>
- <string name="Shoe Height">Hauteur</string>
- <string name="Short">Moins</string>
- <string name="Short Arms">Bras courts</string>
- <string name="Short Legs">Jambes courtes</string>
- <string name="Short Neck">Petit cou</string>
- <string name="Short Pigtails">Couettes courtes</string>
- <string name="Short Ponytail">Queue de cheval courte</string>
- <string name="Short Sideburns">Court</string>
- <string name="Short Torso">Torse court</string>
- <string name="Short hips">Hanches courtes</string>
- <string name="Shoulders">Épaules</string>
- <string name="Side Fringe">Mèches sur le côté</string>
- <string name="Sideburns">Favoris</string>
- <string name="Sides Hair">Cheveux sur le côté</string>
- <string name="Sides Hair Down">Cheveux sur le côté en bas</string>
- <string name="Sides Hair Up">Cheveux sur le côté en haut</string>
- <string name="Skinny Neck">Cou maigre</string>
- <string name="Skirt Fit">Taille jupe</string>
- <string name="Skirt Length">Longueur jupe</string>
- <string name="Slanted Forehead">Front incliné</string>
- <string name="Sleeve Length">Longueur manche</string>
- <string name="Sleeve Looseness">Ampleur manche</string>
- <string name="Slit Back">Fente : Derrière</string>
- <string name="Slit Front">Fente : Devant</string>
- <string name="Slit Left">Fente : Gauche</string>
- <string name="Slit Right">Fente : Droite</string>
- <string name="Small">Moins</string>
- <string name="Small Hands">Petites mains</string>
- <string name="Small Head">Moins</string>
- <string name="Smooth">Moins</string>
- <string name="Smooth Hair">Cheveux lisses</string>
- <string name="Socks Length">Longueur</string>
- <string name="Soulpatch">Barbichette</string>
- <string name="Sparse">Rares</string>
- <string name="Spiked Hair">Mèches en pointe</string>
- <string name="Square">Carrée</string>
- <string name="Square Toe">Orteil carré</string>
- <string name="Squash Head">Écraser la tête</string>
- <string name="Stretch Head">Allonger la tête</string>
- <string name="Sunken">Saillante</string>
- <string name="Sunken Chest">Poitrine enfoncée</string>
- <string name="Sunken Eyes">Yeux enfoncés</string>
- <string name="Sweep Back">En arrière</string>
- <string name="Sweep Forward">Vers l'avant</string>
- <string name="Tall">Plus</string>
- <string name="Taper Back">Arrière</string>
- <string name="Taper Front">Avant</string>
- <string name="Thick Heels">Talons épais</string>
- <string name="Thick Neck">Cou épais</string>
- <string name="Thick Toe">Orteil épais</string>
- <string name="Thin">Mince</string>
- <string name="Thin Eyebrows">Sourcils fins</string>
- <string name="Thin Lips">Lèvres fines</string>
- <string name="Thin Nose">Nez fin</string>
- <string name="Tight Chin">Menton fin</string>
- <string name="Tight Cuffs">Jambes serrées</string>
- <string name="Tight Pants">Pantalons serrés</string>
- <string name="Tight Shirt">Chemise serrée</string>
- <string name="Tight Skirt">Jupe serrée</string>
- <string name="Tight Sleeves">Manches serrées</string>
- <string name="Toe Shape">Forme de l'orteil</string>
- <string name="Toe Thickness">Épaisseur orteil</string>
- <string name="Torso Length">Longueur du torse</string>
- <string name="Torso Muscles">Muscles du torse</string>
- <string name="Torso Scrawny">Torse maigre</string>
- <string name="Unattached">Séparés</string>
- <string name="Uncreased">Lisse</string>
- <string name="Underbite">Sortie</string>
- <string name="Unnatural">Artificiel</string>
- <string name="Upper Bridge">Arête supérieure</string>
- <string name="Upper Cheeks">Joue supérieure</string>
- <string name="Upper Chin Cleft">Menton supérieur</string>
- <string name="Upper Eyelid Fold">Paupière sup.</string>
- <string name="Upturned">En trompette</string>
- <string name="Very Red">Très rouge</string>
- <string name="Waist Height">Hauteur taille</string>
- <string name="Well-Fed">Ronde</string>
- <string name="White Hair">Cheveux blancs</string>
- <string name="Wide">Plus</string>
- <string name="Wide Back">Derrière large</string>
- <string name="Wide Front">Devant large</string>
- <string name="Wide Lips">Lèvres larges</string>
- <string name="Wild">Artificiel</string>
- <string name="Wrinkles">Rides</string>
- <string name="LocationCtrlAddLandmarkTooltip">Ajouter à mes repères</string>
- <string name="LocationCtrlEditLandmarkTooltip">Modifier mon repère</string>
- <string name="LocationCtrlInfoBtnTooltip">En savoir plus sur l'emplacement actuel</string>
- <string name="LocationCtrlComboBtnTooltip">Historique de mes emplacements</string>
- <string name="LocationCtrlForSaleTooltip">Acheter ce terrain</string>
- <string name="LocationCtrlVoiceTooltip">Chat vocal indisponible ici</string>
- <string name="LocationCtrlFlyTooltip">Vol interdit</string>
- <string name="LocationCtrlPushTooltip">Pas de bousculades</string>
- <string name="LocationCtrlBuildTooltip">Construction/placement d'objets interdit</string>
- <string name="LocationCtrlScriptsTooltip">Scripts interdits</string>
- <string name="LocationCtrlDamageTooltip">Santé</string>
- <string name="LocationCtrlAdultIconTooltip">Région de type Adulte</string>
- <string name="LocationCtrlModerateIconTooltip">Région de type Modéré</string>
- <string name="LocationCtrlGeneralIconTooltip">Région de type Général</string>
- <string name="LocationCtrlSeeAVsTooltip">Les avatars à l'extérieur de cette parcelle ne peuvent pas voir ni entendre les avatars qui se trouvent à l'intérieur.</string>
- <string name="LocationCtrlPathfindingDirtyTooltip">Les objets mobiles risquent de ne pas se comporter correctement dans cette région tant qu'elle n'est pas refigée.</string>
- <string name="LocationCtrlPathfindingDisabledTooltip">La recherche de chemin dynamique n'est pas activée dans cette région.</string>
- <string name="UpdaterWindowTitle">[APP_NAME] - Mise à jour</string>
- <string name="UpdaterNowUpdating">Mise à jour de [APP_NAME]...</string>
- <string name="UpdaterNowInstalling">Installation de [APP_NAME]...</string>
- <string name="UpdaterUpdatingDescriptive">Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience.</string>
- <string name="UpdaterProgressBarTextWithEllipses">Mise à jour en cours...</string>
- <string name="UpdaterProgressBarText">Mise à jour en cours</string>
- <string name="UpdaterFailDownloadTitle">Le téléchargement de la mise à jour a échoué</string>
- <string name="UpdaterFailUpdateDescriptive">Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com.</string>
- <string name="UpdaterFailInstallTitle">L'installation de la mise à jour a échoué</string>
- <string name="UpdaterFailStartTitle">Impossible de lancer le client</string>
- <string name="ItemsComingInTooFastFrom">[APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes</string>
- <string name="ItemsComingInTooFast">[APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes</string>
- <string name="IM_logging_string">-- Archivage des IM activé --</string>
- <string name="IM_typing_start_string">[NAME] est en train d'écrire...</string>
- <string name="Unnamed">(sans nom)</string>
- <string name="IM_moderated_chat_label">(Modéré : Voix désactivées par défaut)</string>
- <string name="IM_unavailable_text_label">Le chat écrit n'est pas disponible pour cet appel.</string>
- <string name="IM_muted_text_label">Votre chat écrit a été désactivé par un modérateur de groupe.</string>
- <string name="IM_default_text_label">Cliquez ici pour envoyer un message instantané.</string>
- <string name="IM_to_label">À</string>
- <string name="IM_moderator_label">(Modérateur)</string>
- <string name="Saved_message">(Enregistrement : [LONG_TIMESTAMP])</string>
- <string name="IM_unblock_only_groups_friends">Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM, sous Préférences/Confidentialité.</string>
- <string name="OnlineStatus">En ligne</string>
- <string name="OfflineStatus">Hors ligne</string>
- <string name="not_online_msg">Utilisateur non connecté - le message sera enregistré et livré plus tard.</string>
- <string name="not_online_inventory">Utilisateur non connecté - l'inventaire a été enregistré</string>
- <string name="answered_call">Votre appel a fait l'objet d'une réponse</string>
- <string name="you_started_call">Vous appelez.</string>
- <string name="you_joined_call">Vous avez rejoint l'appel</string>
- <string name="you_auto_rejected_call-im">Vous avez automatiquement refusé l'appel vocal quand le mode Ne pas déranger était activé.</string>
- <string name="name_started_call">[NAME] appelle.</string>
- <string name="ringing-im">En train de rejoindre l'appel...</string>
- <string name="connected-im">Connecté(e), cliquez sur Quitter l'appel pour raccrocher</string>
- <string name="hang_up-im">A quitté l'appel</string>
- <string name="answering-im">Connexion en cours...</string>
- <string name="conference-title">Chat à plusieurs</string>
- <string name="conference-title-incoming">Conférence avec [AGENT_NAME]</string>
- <string name="inventory_item_offered-im">Objet de l’inventaire [ITEM_NAME] offert</string>
- <string name="inventory_folder_offered-im">Dossier de l’inventaire [ITEM_NAME] offert</string>
- <string name="share_alert">Faire glisser les objets de l'inventaire ici</string>
- <string name="facebook_post_success">Vous avez publié sur Facebook.</string>
- <string name="flickr_post_success">Vous avez publié sur Flickr.</string>
- <string name="twitter_post_success">Vous avez publié sur Twitter.</string>
- <string name="no_session_message">(Session IM inexistante)</string>
- <string name="only_user_message">Vous êtes le seul participant à cette session.</string>
- <string name="offline_message">[NAME] est hors ligne.</string>
- <string name="invite_message">Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME].</string>
- <string name="muted_message">Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré.</string>
- <string name="generic">Erreur lors de la requête, veuillez réessayer ultérieurement.</string>
- <string name="generic_request_error">Erreur lors de la requête, veuillez réessayer ultérieurement.</string>
- <string name="insufficient_perms_error">Vous n'avez pas les droits requis.</string>
- <string name="session_does_not_exist_error">La session a expiré</string>
- <string name="no_ability_error">Vous n'avez pas ce pouvoir.</string>
- <string name="no_ability">Vous n'avez pas ce pouvoir.</string>
- <string name="not_a_mod_error">Vous n'êtes pas modérateur de session.</string>
- <string name="muted">Un modérateur de groupe a désactivé votre chat écrit.</string>
- <string name="muted_error">Un modérateur de groupe a désactivé votre chat écrit.</string>
- <string name="add_session_event">Impossible d'ajouter des participants à la session de chat avec [RECIPIENT].</string>
- <string name="message">Impossible d'envoyer votre message à la session de chat avec [RECIPIENT].</string>
- <string name="message_session_event">Impossible d'envoyer votre message à la session de chat avec [RECIPIENT].</string>
- <string name="mute">Erreur lors de la modération.</string>
- <string name="removed">Vous avez été supprimé du groupe.</string>
- <string name="removed_from_group">Vous avez été supprimé du groupe.</string>
- <string name="close_on_no_ability">Vous ne pouvez plus participer à la session de chat.</string>
- <string name="unread_chat_single">[SOURCES] a dit quelque chose de nouveau</string>
- <string name="unread_chat_multiple">[SOURCES] ont dit quelque chose de nouveau</string>
- <string name="session_initialization_timed_out_error">Expiration du délai d'initialisation de la session</string>
- <string name="Home position set.">Emplacement du domicile défini.</string>
- <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string>
- <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string>
- <string name="paid_you_ldollars">[NAME] vous a payé [AMOUNT] L$ [REASON].</string>
- <string name="paid_you_ldollars_gift">[NAME] vous a payé [AMOUNT] L$ : [REASON]</string>
- <string name="paid_you_ldollars_no_reason">[NAME] vous a payé [AMOUNT] L$.</string>
- <string name="you_paid_ldollars">Vous avez payé à [AMOUNT] L$ [REASON].</string>
- <string name="you_paid_ldollars_gift">Vous avez payé à [NAME] [AMOUNT] L$ : [REASON]</string>
- <string name="you_paid_ldollars_no_info">Vous avez payé [AMOUNT] L$.</string>
- <string name="you_paid_ldollars_no_reason">Vous avez payé à [NAME] [AMOUNT] L$.</string>
- <string name="you_paid_ldollars_no_name">Vous avez payé à [AMOUNT] L$ [REASON].</string>
- <string name="you_paid_failure_ldollars">Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué.</string>
- <string name="you_paid_failure_ldollars_gift">Votre paiement de [AMOUNT] L$ à [NAME] a échoué : [REASON]</string>
- <string name="you_paid_failure_ldollars_no_info">Votre paiement de [AMOUNT] L$ a échoué.</string>
- <string name="you_paid_failure_ldollars_no_reason">Votre paiement de [AMOUNT] L$ à [NAME] a échoué.</string>
- <string name="you_paid_failure_ldollars_no_name">Votre paiement de [AMOUNT] L$ [REASON] a échoué.</string>
- <string name="for item">pour l'article suivant : [ITEM]</string>
- <string name="for a parcel of land">pour une parcelle de terrain</string>
- <string name="for a land access pass">pour un pass d'accès au terrain</string>
- <string name="for deeding land">pour une cession de terrain</string>
- <string name="to create a group">pour créer un groupe</string>
- <string name="to join a group">pour rejoindre un groupe</string>
- <string name="to upload">pour charger</string>
- <string name="to publish a classified ad">pour publier une petite annonce</string>
- <string name="giving">Donner [AMOUNT] L$</string>
- <string name="uploading_costs">Le chargement coûte [AMOUNT] L$</string>
- <string name="this_costs">Cela coûte [AMOUNT] L$</string>
- <string name="buying_selected_land">Achat du terrain sélectionné pour [AMOUNT] L$</string>
- <string name="this_object_costs">Cet objet coûte [AMOUNT] L$</string>
- <string name="group_role_everyone">Tous</string>
- <string name="group_role_officers">Officiers</string>
- <string name="group_role_owners">Propriétaires</string>
- <string name="group_member_status_online">En ligne</string>
- <string name="uploading_abuse_report">Chargement...
+Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
+ </string>
+ <string name="5 O'Clock Shadow">
+ Peu
+ </string>
+ <string name="All White">
+ Tout blancs
+ </string>
+ <string name="Anime Eyes">
+ Grand yeux
+ </string>
+ <string name="Arced">
+ Arqués
+ </string>
+ <string name="Arm Length">
+ Longueur des bras
+ </string>
+ <string name="Attached">
+ Attachés
+ </string>
+ <string name="Attached Earlobes">
+ Lobes
+ </string>
+ <string name="Back Fringe">
+ Mèches de derrière
+ </string>
+ <string name="Baggy">
+ Plus
+ </string>
+ <string name="Bangs">
+ Frange
+ </string>
+ <string name="Beady Eyes">
+ Yeux perçants
+ </string>
+ <string name="Belly Size">
+ Taille du ventre
+ </string>
+ <string name="Big">
+ Plus
+ </string>
+ <string name="Big Butt">
+ Grosses fesses
+ </string>
+ <string name="Big Hair Back">
+ Volume : Derrière
+ </string>
+ <string name="Big Hair Front">
+ Volume : Devant
+ </string>
+ <string name="Big Hair Top">
+ Volume : Haut
+ </string>
+ <string name="Big Head">
+ Plus
+ </string>
+ <string name="Big Pectorals">
+ Gros pectoraux
+ </string>
+ <string name="Big Spikes">
+ Spikes
+ </string>
+ <string name="Black">
+ Noir
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Cheveux blonds
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Couleur du blush
+ </string>
+ <string name="Blush Opacity">
+ Opacité du blush
+ </string>
+ <string name="Body Definition">
+ Contour du corps
+ </string>
+ <string name="Body Fat">
+ Graisse
+ </string>
+ <string name="Body Freckles">
+ Grains de beauté
+ </string>
+ <string name="Body Thick">
+ Plus
+ </string>
+ <string name="Body Thickness">
+ Épaisseur du corps
+ </string>
+ <string name="Body Thin">
+ Moins
+ </string>
+ <string name="Bow Legged">
+ Jambes arquées
+ </string>
+ <string name="Breast Buoyancy">
+ Hauteur des seins
+ </string>
+ <string name="Breast Cleavage">
+ Clivage
+ </string>
+ <string name="Breast Size">
+ Taille des seins
+ </string>
+ <string name="Bridge Width">
+ Arête du nez
+ </string>
+ <string name="Broad">
+ Large
+ </string>
+ <string name="Brow Size">
+ Taille du front
+ </string>
+ <string name="Bug Eyes">
+ Yeux globuleux
+ </string>
+ <string name="Bugged Eyes">
+ Yeux globuleux
+ </string>
+ <string name="Bulbous">
+ En bulbe
+ </string>
+ <string name="Bulbous Nose">
+ Nez en bulbe
+ </string>
+ <string name="Breast Physics Mass">
+ Masse des seins
+ </string>
+ <string name="Breast Physics Smoothing">
+ Lissage des seins
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravité des seins
+ </string>
+ <string name="Breast Physics Drag">
+ Résistance de l'air sur les seins
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Élasticité
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Amortissement
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Élasticité
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Élasticité
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Amortissement
+ </string>
+ <string name="Belly Physics Mass">
+ Masse du ventre
+ </string>
+ <string name="Belly Physics Smoothing">
+ Lissage du ventre
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravité du ventre
+ </string>
+ <string name="Belly Physics Drag">
+ Résistance de l'air sur le ventre
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Élasticité
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Butt Physics Mass">
+ Masse des fesses
+ </string>
+ <string name="Butt Physics Smoothing">
+ Lissage des fesses
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravité des fesses
+ </string>
+ <string name="Butt Physics Drag">
+ Résistance de l'air sur les fesses
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Élasticité
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Effet max.
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Élasticité
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Amplification
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortissement
+ </string>
+ <string name="Bushy Eyebrows">
+ Sourcils touffus
+ </string>
+ <string name="Bushy Hair">
+ Beaucoup
+ </string>
+ <string name="Butt Size">
+ Taille des fesses
+ </string>
+ <string name="Butt Gravity">
+ Gravité des fesses
+ </string>
+ <string name="bustle skirt">
+ Jupe gonflante
+ </string>
+ <string name="no bustle">
+ Pas gonflante
+ </string>
+ <string name="more bustle">
+ Plus gonflante
+ </string>
+ <string name="Chaplin">
+ Moins
+ </string>
+ <string name="Cheek Bones">
+ Pommettes
+ </string>
+ <string name="Chest Size">
+ Taille de la poitrine
+ </string>
+ <string name="Chin Angle">
+ Angle du menton
+ </string>
+ <string name="Chin Cleft">
+ Fente du menton
+ </string>
+ <string name="Chin Curtains">
+ Favoris
+ </string>
+ <string name="Chin Depth">
+ Profondeur
+ </string>
+ <string name="Chin Heavy">
+ Menton lourd
+ </string>
+ <string name="Chin In">
+ Menton rentré
+ </string>
+ <string name="Chin Out">
+ Menton sorti
+ </string>
+ <string name="Chin-Neck">
+ Menton-cou
+ </string>
+ <string name="Clear">
+ Clair
+ </string>
+ <string name="Cleft">
+ Fendu
+ </string>
+ <string name="Close Set Eyes">
+ Yeux rapprochés
+ </string>
+ <string name="Closed">
+ Fermé(s)
+ </string>
+ <string name="Closed Back">
+ Fermé à l'arrière
+ </string>
+ <string name="Closed Front">
+ Fermé devant
+ </string>
+ <string name="Closed Left">
+ Fermé à gauche
+ </string>
+ <string name="Closed Right">
+ Fermé à droite
+ </string>
+ <string name="Coin Purse">
+ Mini
+ </string>
+ <string name="Collar Back">
+ Col arrière
+ </string>
+ <string name="Collar Front">
+ Col devant
+ </string>
+ <string name="Corner Down">
+ Coin vers le bas
+ </string>
+ <string name="Corner Up">
+ Coin vers le haut
+ </string>
+ <string name="Creased">
+ Fripée
+ </string>
+ <string name="Crooked Nose">
+ Déviation du nez
+ </string>
+ <string name="Cuff Flare">
+ Jambes
+ </string>
+ <string name="Dark">
+ Sombre
+ </string>
+ <string name="Dark Green">
+ Vert foncé
+ </string>
+ <string name="Darker">
+ Plus foncé
+ </string>
+ <string name="Deep">
+ Profonde
+ </string>
+ <string name="Default Heels">
+ Talons par défaut
+ </string>
+ <string name="Dense">
+ Dense
+ </string>
+ <string name="Double Chin">
+ Double menton
+ </string>
+ <string name="Downturned">
+ Pointant vers le bas
+ </string>
+ <string name="Duffle Bag">
+ Maxi
+ </string>
+ <string name="Ear Angle">
+ Angle de l'oreille
+ </string>
+ <string name="Ear Size">
+ Taille
+ </string>
+ <string name="Ear Tips">
+ Extrémités
+ </string>
+ <string name="Egg Head">
+ Proéminence
+ </string>
+ <string name="Eye Bags">
+ Cernes
+ </string>
+ <string name="Eye Color">
+ Couleur des yeux
+ </string>
+ <string name="Eye Depth">
+ Profondeur
+ </string>
+ <string name="Eye Lightness">
+ Clarté
+ </string>
+ <string name="Eye Opening">
+ Ouverture
+ </string>
+ <string name="Eye Pop">
+ Œil proéminent
+ </string>
+ <string name="Eye Size">
+ Taille de l'œil
+ </string>
+ <string name="Eye Spacing">
+ Espacement
+ </string>
+ <string name="Eyebrow Arc">
+ Arc
+ </string>
+ <string name="Eyebrow Density">
+ Épaisseur sourcils
+ </string>
+ <string name="Eyebrow Height">
+ Hauteur
+ </string>
+ <string name="Eyebrow Points">
+ Direction
+ </string>
+ <string name="Eyebrow Size">
+ Taille
+ </string>
+ <string name="Eyelash Length">
+ Longueur des cils
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Couleur de l'eyeliner
+ </string>
+ <string name="Eyes Bugged">
+ Yeux globuleux
+ </string>
+ <string name="Face Shear">
+ Visage
+ </string>
+ <string name="Facial Definition">
+ Définition
+ </string>
+ <string name="Far Set Eyes">
+ Yeux écartés
+ </string>
+ <string name="Fat Lips">
+ Lèvres épaisses
+ </string>
+ <string name="Female">
+ Femme
+ </string>
+ <string name="Fingerless">
+ Sans doigts
+ </string>
+ <string name="Fingers">
+ Doigts
+ </string>
+ <string name="Flared Cuffs">
+ Jambes larges
+ </string>
+ <string name="Flat">
+ Moins
+ </string>
+ <string name="Flat Butt">
+ Fesses plates
+ </string>
+ <string name="Flat Head">
+ Tête plate
+ </string>
+ <string name="Flat Toe">
+ Orteil plat
+ </string>
+ <string name="Foot Size">
+ Pointure
+ </string>
+ <string name="Forehead Angle">
+ Angle du front
+ </string>
+ <string name="Forehead Heavy">
+ Front lourd
+ </string>
+ <string name="Freckles">
+ Tâches de rousseur
+ </string>
+ <string name="Front Fringe">
+ Mèches de devant
+ </string>
+ <string name="Full Back">
+ Arrière touffu
+ </string>
+ <string name="Full Eyeliner">
+ Eyeliner marqué
+ </string>
+ <string name="Full Front">
+ Devant touffu
+ </string>
+ <string name="Full Hair Sides">
+ Côtés touffus
+ </string>
+ <string name="Full Sides">
+ Côtés touffus
+ </string>
+ <string name="Glossy">
+ Brillant
+ </string>
+ <string name="Glove Fingers">
+ Gants avec doigts
+ </string>
+ <string name="Glove Length">
+ Longueur
+ </string>
+ <string name="Hair">
+ Cheveux
+ </string>
+ <string name="Hair Back">
+ Cheveux : Derrière
+ </string>
+ <string name="Hair Front">
+ Cheveux : Devant
+ </string>
+ <string name="Hair Sides">
+ Cheveux : Côtés
+ </string>
+ <string name="Hair Sweep">
+ Sens de la coiffure
+ </string>
+ <string name="Hair Thickess">
+ Épaisseur cheveux
+ </string>
+ <string name="Hair Thickness">
+ Épaisseur cheveux
+ </string>
+ <string name="Hair Tilt">
+ Inclinaison
+ </string>
+ <string name="Hair Tilted Left">
+ Vers la gauche
+ </string>
+ <string name="Hair Tilted Right">
+ Vers la droite
+ </string>
+ <string name="Hair Volume">
+ Cheveux : Volume
+ </string>
+ <string name="Hand Size">
+ Taille de la main
+ </string>
+ <string name="Handlebars">
+ Plus
+ </string>
+ <string name="Head Length">
+ Longueur
+ </string>
+ <string name="Head Shape">
+ Forme
+ </string>
+ <string name="Head Size">
+ Taille
+ </string>
+ <string name="Head Stretch">
+ Allongement
+ </string>
+ <string name="Heel Height">
+ Talons
+ </string>
+ <string name="Heel Shape">
+ Forme des talons
+ </string>
+ <string name="Height">
+ Taille
+ </string>
+ <string name="High">
+ Haut
+ </string>
+ <string name="High Heels">
+ Talons hauts
+ </string>
+ <string name="High Jaw">
+ Haut
+ </string>
+ <string name="High Platforms">
+ Haute
+ </string>
+ <string name="High and Tight">
+ Haut et serré
+ </string>
+ <string name="Higher">
+ Plus élevé
+ </string>
+ <string name="Hip Length">
+ Longueur hanche
+ </string>
+ <string name="Hip Width">
+ Largeur hanche
+ </string>
+ <string name="Hover">
+ Survol
+ </string>
+ <string name="In">
+ Rentré
+ </string>
+ <string name="In Shdw Color">
+ Couleur ombre interne
+ </string>
+ <string name="In Shdw Opacity">
+ Opacité ombre interne
+ </string>
+ <string name="Inner Eye Corner">
+ Coin interne
+ </string>
+ <string name="Inner Eye Shadow">
+ Ombre de l'œil interne
+ </string>
+ <string name="Inner Shadow">
+ Ombre interne
+ </string>
+ <string name="Jacket Length">
+ Longueur de la veste
+ </string>
+ <string name="Jacket Wrinkles">
+ Plis de la veste
+ </string>
+ <string name="Jaw Angle">
+ Angle mâchoire
+ </string>
+ <string name="Jaw Jut">
+ Saillie mâchoire
+ </string>
+ <string name="Jaw Shape">
+ Mâchoire
+ </string>
+ <string name="Join">
+ Rapprochés
+ </string>
+ <string name="Jowls">
+ Bajoues
+ </string>
+ <string name="Knee Angle">
+ Angle du genou
+ </string>
+ <string name="Knock Kneed">
+ Genoux rapprochés
+ </string>
+ <string name="Large">
+ Plus
+ </string>
+ <string name="Large Hands">
+ Grandes mains
+ </string>
+ <string name="Left Part">
+ Raie à gauche
+ </string>
+ <string name="Leg Length">
+ Longueur
+ </string>
+ <string name="Leg Muscles">
+ Muscles
+ </string>
+ <string name="Less">
+ Moins
+ </string>
+ <string name="Less Body Fat">
+ Moins
+ </string>
+ <string name="Less Curtains">
+ Moins
+ </string>
+ <string name="Less Freckles">
+ Moins
+ </string>
+ <string name="Less Full">
+ Moins
+ </string>
+ <string name="Less Gravity">
+ Moins
+ </string>
+ <string name="Less Love">
+ Moins
+ </string>
+ <string name="Less Muscles">
+ Moins
+ </string>
+ <string name="Less Muscular">
+ Moins
+ </string>
+ <string name="Less Rosy">
+ Moins
+ </string>
+ <string name="Less Round">
+ Moins ronde
+ </string>
+ <string name="Less Saddle">
+ Moins
+ </string>
+ <string name="Less Square">
+ Moins carrée
+ </string>
+ <string name="Less Volume">
+ Moins
+ </string>
+ <string name="Less soul">
+ Moins
+ </string>
+ <string name="Lighter">
+ Plus léger
+ </string>
+ <string name="Lip Cleft">
+ Fente labiale
+ </string>
+ <string name="Lip Cleft Depth">
+ Prof. fente labiale
+ </string>
+ <string name="Lip Fullness">
+ Volume des lèvres
+ </string>
+ <string name="Lip Pinkness">
+ Rougeur des lèvres
+ </string>
+ <string name="Lip Ratio">
+ Proportion des lèvres
+ </string>
+ <string name="Lip Thickness">
+ Épaisseur
+ </string>
+ <string name="Lip Width">
+ Largeur
+ </string>
+ <string name="Lipgloss">
+ Brillant à lèvres
+ </string>
+ <string name="Lipstick">
+ Rouge à lèvres
+ </string>
+ <string name="Lipstick Color">
+ Couleur du rouge à lèvres
+ </string>
+ <string name="Long">
+ Plus
+ </string>
+ <string name="Long Head">
+ Tête longue
+ </string>
+ <string name="Long Hips">
+ Hanches longues
+ </string>
+ <string name="Long Legs">
+ Jambes longues
+ </string>
+ <string name="Long Neck">
+ Long cou
+ </string>
+ <string name="Long Pigtails">
+ Longues couettes
+ </string>
+ <string name="Long Ponytail">
+ Longue queue de cheval
+ </string>
+ <string name="Long Torso">
+ Torse long
+ </string>
+ <string name="Long arms">
+ Bras longs
+ </string>
+ <string name="Loose Pants">
+ Pantalons amples
+ </string>
+ <string name="Loose Shirt">
+ Chemise ample
+ </string>
+ <string name="Loose Sleeves">
+ Manches amples
+ </string>
+ <string name="Love Handles">
+ Poignées d'amour
+ </string>
+ <string name="Low">
+ Bas
+ </string>
+ <string name="Low Heels">
+ Talons bas
+ </string>
+ <string name="Low Jaw">
+ Bas
+ </string>
+ <string name="Low Platforms">
+ Basse
+ </string>
+ <string name="Low and Loose">
+ Bas et ample
+ </string>
+ <string name="Lower">
+ Abaisser
+ </string>
+ <string name="Lower Bridge">
+ Arête inférieure
+ </string>
+ <string name="Lower Cheeks">
+ Joue inférieure
+ </string>
+ <string name="Male">
+ Homme
+ </string>
+ <string name="Middle Part">
+ Raie au milieu
+ </string>
+ <string name="More">
+ Plus
+ </string>
+ <string name="More Blush">
+ Plus
+ </string>
+ <string name="More Body Fat">
+ Plus
+ </string>
+ <string name="More Curtains">
+ Plus
+ </string>
+ <string name="More Eyeshadow">
+ Plus
+ </string>
+ <string name="More Freckles">
+ Plus
+ </string>
+ <string name="More Full">
+ Plus
+ </string>
+ <string name="More Gravity">
+ Plus
+ </string>
+ <string name="More Lipstick">
+ Plus
+ </string>
+ <string name="More Love">
+ Plus
+ </string>
+ <string name="More Lower Lip">
+ Inférieure plus grosse
+ </string>
+ <string name="More Muscles">
+ Plus
+ </string>
+ <string name="More Muscular">
+ Plus
+ </string>
+ <string name="More Rosy">
+ Plus
+ </string>
+ <string name="More Round">
+ Plus
+ </string>
+ <string name="More Saddle">
+ Plus
+ </string>
+ <string name="More Sloped">
+ Plus
+ </string>
+ <string name="More Square">
+ Plus
+ </string>
+ <string name="More Upper Lip">
+ Supérieure plus grosse
+ </string>
+ <string name="More Vertical">
+ Plus
+ </string>
+ <string name="More Volume">
+ Plus
+ </string>
+ <string name="More soul">
+ Plus
+ </string>
+ <string name="Moustache">
+ Moustache
+ </string>
+ <string name="Mouth Corner">
+ Coin de la bouche
+ </string>
+ <string name="Mouth Position">
+ Position
+ </string>
+ <string name="Mowhawk">
+ Mowhawk
+ </string>
+ <string name="Muscular">
+ Musclé
+ </string>
+ <string name="Mutton Chops">
+ Longs
+ </string>
+ <string name="Nail Polish">
+ Vernis à ongles
+ </string>
+ <string name="Nail Polish Color">
+ Couleur du vernis
+ </string>
+ <string name="Narrow">
+ Moins
+ </string>
+ <string name="Narrow Back">
+ Arrière étroit
+ </string>
+ <string name="Narrow Front">
+ Devant étroit
+ </string>
+ <string name="Narrow Lips">
+ Lèvres étroites
+ </string>
+ <string name="Natural">
+ Naturel
+ </string>
+ <string name="Neck Length">
+ Longueur du cou
+ </string>
+ <string name="Neck Thickness">
+ Épaisseur du cou
+ </string>
+ <string name="No Blush">
+ Pas de blush
+ </string>
+ <string name="No Eyeliner">
+ Pas d'eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Pas d'ombre à paupières
+ </string>
+ <string name="No Lipgloss">
+ Pas de brillant à lèvres
+ </string>
+ <string name="No Lipstick">
+ Pas de rouge à lèvres
+ </string>
+ <string name="No Part">
+ Pas de raie
+ </string>
+ <string name="No Polish">
+ Pas de vernis
+ </string>
+ <string name="No Red">
+ Pas de rouge
+ </string>
+ <string name="No Spikes">
+ Pas de spikes
+ </string>
+ <string name="No White">
+ Pas de blanc
+ </string>
+ <string name="No Wrinkles">
+ Pas de rides
+ </string>
+ <string name="Normal Lower">
+ Normal plus bas
+ </string>
+ <string name="Normal Upper">
+ Normal plus haut
+ </string>
+ <string name="Nose Left">
+ Nez à gauche
+ </string>
+ <string name="Nose Right">
+ Nez à droite
+ </string>
+ <string name="Nose Size">
+ Taille du nez
+ </string>
+ <string name="Nose Thickness">
+ Épaisseur du nez
+ </string>
+ <string name="Nose Tip Angle">
+ Angle bout du nez
+ </string>
+ <string name="Nose Tip Shape">
+ Forme bout du nez
+ </string>
+ <string name="Nose Width">
+ Largeur du nez
+ </string>
+ <string name="Nostril Division">
+ Division narines
+ </string>
+ <string name="Nostril Width">
+ Largeur narines
+ </string>
+ <string name="Opaque">
+ Opaque
+ </string>
+ <string name="Open">
+ Ouvert
+ </string>
+ <string name="Open Back">
+ Derrière ouvert
+ </string>
+ <string name="Open Front">
+ Devant ouvert
+ </string>
+ <string name="Open Left">
+ Ouvert à gauche
+ </string>
+ <string name="Open Right">
+ Ouvert à droite
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Sorti
+ </string>
+ <string name="Out Shdw Color">
+ Couleur de l'ombre externe
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacité de l'ombre externe
+ </string>
+ <string name="Outer Eye Corner">
+ Coin externe
+ </string>
+ <string name="Outer Eye Shadow">
+ Ombre de l'œil externe
+ </string>
+ <string name="Outer Shadow">
+ Ombre externe
+ </string>
+ <string name="Overbite">
+ Rentrée
+ </string>
+ <string name="Package">
+ Parties
+ </string>
+ <string name="Painted Nails">
+ Ongles vernis
+ </string>
+ <string name="Pale">
+ Pâle
+ </string>
+ <string name="Pants Crotch">
+ Entrejambe
+ </string>
+ <string name="Pants Fit">
+ Taille
+ </string>
+ <string name="Pants Length">
+ Longueur
+ </string>
+ <string name="Pants Waist">
+ Taille
+ </string>
+ <string name="Pants Wrinkles">
+ Plis
+ </string>
+ <string name="Part">
+ Raie
+ </string>
+ <string name="Part Bangs">
+ Séparation frange
+ </string>
+ <string name="Pectorals">
+ Pectoraux
+ </string>
+ <string name="Pigment">
+ Pigmentation
+ </string>
+ <string name="Pigtails">
+ Couettes
+ </string>
+ <string name="Pink">
+ Rose
+ </string>
+ <string name="Pinker">
+ Plus rose
+ </string>
+ <string name="Platform Height">
+ Platef. (hauteur)
+ </string>
+ <string name="Platform Width">
+ Platef. (largeur)
+ </string>
+ <string name="Pointy">
+ Pointue
+ </string>
+ <string name="Pointy Heels">
+ Talons pointus
+ </string>
+ <string name="Ponytail">
+ Queue de cheval
+ </string>
+ <string name="Poofy Skirt">
+ Jupe bouffante
+ </string>
+ <string name="Pop Left Eye">
+ Œil gauche saillant
+ </string>
+ <string name="Pop Right Eye">
+ Œil droit saillant
+ </string>
+ <string name="Puffy">
+ Plus
+ </string>
+ <string name="Puffy Eyelids">
+ Paup. gonflées
+ </string>
+ <string name="Rainbow Color">
+ Couleur arc en ciel
+ </string>
+ <string name="Red Hair">
+ Cheveux roux
+ </string>
+ <string name="Regular">
+ Standard
+ </string>
+ <string name="Right Part">
+ Raie à droite
+ </string>
+ <string name="Rosy Complexion">
+ Teint rosé
+ </string>
+ <string name="Round">
+ Rond
+ </string>
+ <string name="Ruddiness">
+ Rougeur
+ </string>
+ <string name="Ruddy">
+ Rouge
+ </string>
+ <string name="Rumpled Hair">
+ Texture
+ </string>
+ <string name="Saddle Bags">
+ Culotte de cheval
+ </string>
+ <string name="Scrawny Leg">
+ Jambes maigres
+ </string>
+ <string name="Separate">
+ Séparés
+ </string>
+ <string name="Shallow">
+ Creux
+ </string>
+ <string name="Shear Back">
+ Coupe derrière
+ </string>
+ <string name="Shear Face">
+ Visage
+ </string>
+ <string name="Shear Front">
+ Front
+ </string>
+ <string name="Shear Left Up">
+ Haut gauche décalé
+ </string>
+ <string name="Shear Right Up">
+ Haut droit décalé
+ </string>
+ <string name="Sheared Back">
+ Dégagé derrière
+ </string>
+ <string name="Sheared Front">
+ Dégagé devant
+ </string>
+ <string name="Shift Left">
+ Vers la gauche
+ </string>
+ <string name="Shift Mouth">
+ Déplacement
+ </string>
+ <string name="Shift Right">
+ Vers la droite
+ </string>
+ <string name="Shirt Bottom">
+ Chemise
+ </string>
+ <string name="Shirt Fit">
+ Taille
+ </string>
+ <string name="Shirt Wrinkles">
+ Plis
+ </string>
+ <string name="Shoe Height">
+ Hauteur
+ </string>
+ <string name="Short">
+ Moins
+ </string>
+ <string name="Short Arms">
+ Bras courts
+ </string>
+ <string name="Short Legs">
+ Jambes courtes
+ </string>
+ <string name="Short Neck">
+ Petit cou
+ </string>
+ <string name="Short Pigtails">
+ Couettes courtes
+ </string>
+ <string name="Short Ponytail">
+ Queue de cheval courte
+ </string>
+ <string name="Short Sideburns">
+ Court
+ </string>
+ <string name="Short Torso">
+ Torse court
+ </string>
+ <string name="Short hips">
+ Hanches courtes
+ </string>
+ <string name="Shoulders">
+ Épaules
+ </string>
+ <string name="Side Fringe">
+ Mèches sur le côté
+ </string>
+ <string name="Sideburns">
+ Favoris
+ </string>
+ <string name="Sides Hair">
+ Cheveux sur le côté
+ </string>
+ <string name="Sides Hair Down">
+ Cheveux sur le côté en bas
+ </string>
+ <string name="Sides Hair Up">
+ Cheveux sur le côté en haut
+ </string>
+ <string name="Skinny Neck">
+ Cou maigre
+ </string>
+ <string name="Skirt Fit">
+ Taille jupe
+ </string>
+ <string name="Skirt Length">
+ Longueur jupe
+ </string>
+ <string name="Slanted Forehead">
+ Front incliné
+ </string>
+ <string name="Sleeve Length">
+ Longueur manche
+ </string>
+ <string name="Sleeve Looseness">
+ Ampleur manche
+ </string>
+ <string name="Slit Back">
+ Fente : Derrière
+ </string>
+ <string name="Slit Front">
+ Fente : Devant
+ </string>
+ <string name="Slit Left">
+ Fente : Gauche
+ </string>
+ <string name="Slit Right">
+ Fente : Droite
+ </string>
+ <string name="Small">
+ Moins
+ </string>
+ <string name="Small Hands">
+ Petites mains
+ </string>
+ <string name="Small Head">
+ Moins
+ </string>
+ <string name="Smooth">
+ Moins
+ </string>
+ <string name="Smooth Hair">
+ Cheveux lisses
+ </string>
+ <string name="Socks Length">
+ Longueur
+ </string>
+ <string name="Soulpatch">
+ Barbichette
+ </string>
+ <string name="Sparse">
+ Rares
+ </string>
+ <string name="Spiked Hair">
+ Mèches en pointe
+ </string>
+ <string name="Square">
+ Carrée
+ </string>
+ <string name="Square Toe">
+ Orteil carré
+ </string>
+ <string name="Squash Head">
+ Écraser la tête
+ </string>
+ <string name="Stretch Head">
+ Allonger la tête
+ </string>
+ <string name="Sunken">
+ Saillante
+ </string>
+ <string name="Sunken Chest">
+ Poitrine enfoncée
+ </string>
+ <string name="Sunken Eyes">
+ Yeux enfoncés
+ </string>
+ <string name="Sweep Back">
+ En arrière
+ </string>
+ <string name="Sweep Forward">
+ Vers l'avant
+ </string>
+ <string name="Tall">
+ Plus
+ </string>
+ <string name="Taper Back">
+ Arrière
+ </string>
+ <string name="Taper Front">
+ Avant
+ </string>
+ <string name="Thick Heels">
+ Talons épais
+ </string>
+ <string name="Thick Neck">
+ Cou épais
+ </string>
+ <string name="Thick Toe">
+ Orteil épais
+ </string>
+ <string name="Thin">
+ Mince
+ </string>
+ <string name="Thin Eyebrows">
+ Sourcils fins
+ </string>
+ <string name="Thin Lips">
+ Lèvres fines
+ </string>
+ <string name="Thin Nose">
+ Nez fin
+ </string>
+ <string name="Tight Chin">
+ Menton fin
+ </string>
+ <string name="Tight Cuffs">
+ Jambes serrées
+ </string>
+ <string name="Tight Pants">
+ Pantalons serrés
+ </string>
+ <string name="Tight Shirt">
+ Chemise serrée
+ </string>
+ <string name="Tight Skirt">
+ Jupe serrée
+ </string>
+ <string name="Tight Sleeves">
+ Manches serrées
+ </string>
+ <string name="Toe Shape">
+ Forme de l'orteil
+ </string>
+ <string name="Toe Thickness">
+ Épaisseur orteil
+ </string>
+ <string name="Torso Length">
+ Longueur du torse
+ </string>
+ <string name="Torso Muscles">
+ Muscles du torse
+ </string>
+ <string name="Torso Scrawny">
+ Torse maigre
+ </string>
+ <string name="Unattached">
+ Séparés
+ </string>
+ <string name="Uncreased">
+ Lisse
+ </string>
+ <string name="Underbite">
+ Sortie
+ </string>
+ <string name="Unnatural">
+ Artificiel
+ </string>
+ <string name="Upper Bridge">
+ Arête supérieure
+ </string>
+ <string name="Upper Cheeks">
+ Joue supérieure
+ </string>
+ <string name="Upper Chin Cleft">
+ Menton supérieur
+ </string>
+ <string name="Upper Eyelid Fold">
+ Paupière sup.
+ </string>
+ <string name="Upturned">
+ En trompette
+ </string>
+ <string name="Very Red">
+ Très rouge
+ </string>
+ <string name="Waist Height">
+ Hauteur taille
+ </string>
+ <string name="Well-Fed">
+ Ronde
+ </string>
+ <string name="White Hair">
+ Cheveux blancs
+ </string>
+ <string name="Wide">
+ Plus
+ </string>
+ <string name="Wide Back">
+ Derrière large
+ </string>
+ <string name="Wide Front">
+ Devant large
+ </string>
+ <string name="Wide Lips">
+ Lèvres larges
+ </string>
+ <string name="Wild">
+ Artificiel
+ </string>
+ <string name="Wrinkles">
+ Rides
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Ajouter à mes repères
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Modifier mon repère
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ En savoir plus sur l'emplacement actuel
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historique de mes emplacements
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Acheter ce terrain
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Chat vocal indisponible ici
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Vol interdit
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ Pas de bousculades
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Construction/placement d'objets interdit
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Scripts interdits
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Santé
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Région de type Adulte
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Région de type Modéré
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Région de type Général
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Les avatars à l'extérieur de cette parcelle ne peuvent pas voir ni entendre les avatars qui se trouvent à l'intérieur.
+ </string>
+ <string name="LocationCtrlPathfindingDirtyTooltip">
+ Les objets mobiles risquent de ne pas se comporter correctement dans cette région tant qu'elle n'est pas refigée.
+ </string>
+ <string name="LocationCtrlPathfindingDisabledTooltip">
+ La recherche de chemin dynamique n'est pas activée dans cette région.
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] - Mise à jour
+ </string>
+ <string name="UpdaterNowUpdating">
+ Mise à jour de [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installation de [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Mise à jour en cours...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Mise à jour en cours
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Le téléchargement de la mise à jour a échoué
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ L'installation de la mise à jour a échoué
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Impossible de lancer le client
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes
+ </string>
+ <string name="IM_logging_string">
+ -- Archivage des IM activé --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] est en train d'écrire...
+ </string>
+ <string name="Unnamed">
+ (sans nom)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Modéré : Voix désactivées par défaut)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Le chat écrit n'est pas disponible pour cet appel.
+ </string>
+ <string name="IM_muted_text_label">
+ Votre chat écrit a été désactivé par un modérateur de groupe.
+ </string>
+ <string name="IM_default_text_label">
+ Cliquez ici pour envoyer un message instantané.
+ </string>
+ <string name="IM_to_label">
+ À
+ </string>
+ <string name="IM_moderator_label">
+ (Modérateur)
+ </string>
+ <string name="Saved_message">
+ (Enregistrement : [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM, sous Préférences/Confidentialité.
+ </string>
+ <string name="OnlineStatus">
+ En ligne
+ </string>
+ <string name="OfflineStatus">
+ Hors ligne
+ </string>
+ <string name="not_online_msg">
+ Utilisateur non connecté - le message sera enregistré et livré plus tard.
+ </string>
+ <string name="not_online_inventory">
+ Utilisateur non connecté - l'inventaire a été enregistré
+ </string>
+ <string name="answered_call">
+ Votre appel a fait l'objet d'une réponse
+ </string>
+ <string name="you_started_call">
+ Vous appelez.
+ </string>
+ <string name="you_joined_call">
+ Vous avez rejoint l'appel
+ </string>
+ <string name="you_auto_rejected_call-im">
+ Vous avez automatiquement refusé l'appel vocal quand le mode Ne pas déranger était activé.
+ </string>
+ <string name="name_started_call">
+ [NAME] appelle.
+ </string>
+ <string name="ringing-im">
+ En train de rejoindre l'appel...
+ </string>
+ <string name="connected-im">
+ Connecté(e), cliquez sur Quitter l'appel pour raccrocher
+ </string>
+ <string name="hang_up-im">
+ A quitté l'appel
+ </string>
+ <string name="answering-im">
+ Connexion en cours...
+ </string>
+ <string name="conference-title">
+ Chat à plusieurs
+ </string>
+ <string name="conference-title-incoming">
+ Conférence avec [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Objet de l’inventaire [ITEM_NAME] offert
+ </string>
+ <string name="inventory_folder_offered-im">
+ Dossier de l’inventaire [ITEM_NAME] offert
+ </string>
+ <string name="bot_warning">
+ Vous discutez avec un bot, [NAME]. Ne partagez pas d’informations personnelles.
+En savoir plus sur https://second.life/scripted-agents.
+ </string>
+ <string name="share_alert">
+ Faire glisser les objets de l'inventaire ici
+ </string>
+ <string name="facebook_post_success">
+ Vous avez publié sur Facebook.
+ </string>
+ <string name="flickr_post_success">
+ Vous avez publié sur Flickr.
+ </string>
+ <string name="twitter_post_success">
+ Vous avez publié sur Twitter.
+ </string>
+ <string name="no_session_message">
+ (Session IM inexistante)
+ </string>
+ <string name="only_user_message">
+ Vous êtes le seul participant à cette session.
+ </string>
+ <string name="offline_message">
+ [NAME] est hors ligne.
+ </string>
+ <string name="invite_message">
+ Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME].
+ </string>
+ <string name="muted_message">
+ Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré.
+ </string>
+ <string name="generic">
+ Erreur lors de la requête, veuillez réessayer ultérieurement.
+ </string>
+ <string name="generic_request_error">
+ Erreur lors de la requête, veuillez réessayer ultérieurement.
+ </string>
+ <string name="insufficient_perms_error">
+ Vous n'avez pas les droits requis.
+ </string>
+ <string name="session_does_not_exist_error">
+ La session a expiré
+ </string>
+ <string name="no_ability_error">
+ Vous n'avez pas ce pouvoir.
+ </string>
+ <string name="no_ability">
+ Vous n'avez pas ce pouvoir.
+ </string>
+ <string name="not_a_mod_error">
+ Vous n'êtes pas modérateur de session.
+ </string>
+ <string name="muted">
+ Un modérateur de groupe a désactivé votre chat écrit.
+ </string>
+ <string name="muted_error">
+ Un modérateur de groupe a désactivé votre chat écrit.
+ </string>
+ <string name="add_session_event">
+ Impossible d'ajouter des participants à la session de chat avec [RECIPIENT].
+ </string>
+ <string name="message">
+ Impossible d'envoyer votre message à la session de chat avec [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Impossible d'envoyer votre message à la session de chat avec [RECIPIENT].
+ </string>
+ <string name="mute">
+ Erreur lors de la modération.
+ </string>
+ <string name="removed">
+ Vous avez été supprimé du groupe.
+ </string>
+ <string name="removed_from_group">
+ Vous avez été supprimé du groupe.
+ </string>
+ <string name="close_on_no_ability">
+ Vous ne pouvez plus participer à la session de chat.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] a dit quelque chose de nouveau
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ont dit quelque chose de nouveau
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Expiration du délai d'initialisation de la session
+ </string>
+ <string name="Home position set.">
+ Emplacement du domicile défini.
+ </string>
+ <string name="voice_morphing_url">
+ https://secondlife.com/destination/voice-island
+ </string>
+ <string name="premium_voice_morphing_url">
+ https://secondlife.com/destination/voice-morphing-premium
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] vous a payé [AMOUNT] L$ [REASON].
+ </string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] vous a payé [AMOUNT] L$ : [REASON]
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] vous a payé [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars">
+ Vous avez payé à [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_ldollars_gift">
+ Vous avez payé à [NAME] [AMOUNT] L$ : [REASON]
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Vous avez payé [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Vous avez payé à [NAME] [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Vous avez payé à [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_gift">
+ Votre paiement de [AMOUNT] L$ à [NAME] a échoué : [REASON]
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Votre paiement de [AMOUNT] L$ a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Votre paiement de [AMOUNT] L$ à [NAME] a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Votre paiement de [AMOUNT] L$ [REASON] a échoué.
+ </string>
+ <string name="for item">
+ pour l'article suivant : [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ pour une parcelle de terrain
+ </string>
+ <string name="for a land access pass">
+ pour un pass d'accès au terrain
+ </string>
+ <string name="for deeding land">
+ pour une cession de terrain
+ </string>
+ <string name="to create a group">
+ pour créer un groupe
+ </string>
+ <string name="to join a group">
+ pour rejoindre un groupe
+ </string>
+ <string name="to upload">
+ pour charger
+ </string>
+ <string name="to publish a classified ad">
+ pour publier une petite annonce
+ </string>
+ <string name="giving">
+ Donner [AMOUNT] L$
+ </string>
+ <string name="uploading_costs">
+ Le chargement coûte [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Cela coûte [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Achat du terrain sélectionné pour [AMOUNT] L$
+ </string>
+ <string name="this_object_costs">
+ Cet objet coûte [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Tous
+ </string>
+ <string name="group_role_officers">
+ Officiers
+ </string>
+ <string name="group_role_owners">
+ Propriétaires
+ </string>
+ <string name="group_member_status_online">
+ En ligne
+ </string>
+ <string name="uploading_abuse_report">
+ Chargement...
-du rapport d'infraction</string>
- <string name="New Shape">Nouvelle silhouette</string>
- <string name="New Skin">Nouvelle peau</string>
- <string name="New Hair">Nouveaux cheveux</string>
- <string name="New Eyes">Nouveaux yeux</string>
- <string name="New Shirt">Nouvelle chemise</string>
- <string name="New Pants">Nouveau pantalon</string>
- <string name="New Shoes">Nouvelles chaussures</string>
- <string name="New Socks">Nouvelles chaussettes</string>
- <string name="New Jacket">Nouvelle veste</string>
- <string name="New Gloves">Nouveaux gants</string>
- <string name="New Undershirt">Nouveau débardeur</string>
- <string name="New Underpants">Nouveau caleçon</string>
- <string name="New Skirt">Nouvelle jupe</string>
- <string name="New Alpha">Nouvel alpha</string>
- <string name="New Tattoo">Nouveau tatouage</string>
- <string name="New Universal">Nouvel environnement universel</string>
- <string name="New Physics">Nouvelles propriétés physiques</string>
- <string name="Invalid Wearable">Objet à porter non valide</string>
- <string name="New Gesture">Nouveau geste</string>
- <string name="New Script">Nouveau script</string>
- <string name="New Note">Nouvelle note</string>
- <string name="New Folder">Nouveau dossier</string>
- <string name="Contents">Contenus</string>
- <string name="Gesture">Geste</string>
- <string name="Male Gestures">Gestes masculins</string>
- <string name="Female Gestures">Gestes féminins</string>
- <string name="Other Gestures">Autres gestes</string>
- <string name="Speech Gestures">Gestes liés à la parole</string>
- <string name="Common Gestures">Gestes communs</string>
- <string name="Male - Excuse me">Homme - Demander pardon</string>
- <string name="Male - Get lost">Homme - Get lost</string>
- <string name="Male - Blow kiss">Homme - Envoyer un baiser</string>
- <string name="Male - Boo">Homme - Hou !</string>
- <string name="Male - Bored">Homme - Ennui</string>
- <string name="Male - Hey">Homme - Hé !</string>
- <string name="Male - Laugh">Homme - Rire</string>
- <string name="Male - Repulsed">Homme - Dégoût</string>
- <string name="Male - Shrug">Homme - Hausser les épaules</string>
- <string name="Male - Stick tougue out">Homme - Tirer la langue</string>
- <string name="Male - Wow">Homme - Ouah !</string>
- <string name="Female - Chuckle">Femme - Glousser</string>
- <string name="Female - Cry">Femme - Pleurer</string>
- <string name="Female - Embarrassed">Femme - Gêne</string>
- <string name="Female - Excuse me">Femme - Demander pardon</string>
- <string name="Female - Get lost">Femme - Get lost</string>
- <string name="Female - Blow kiss">Femme - Envoyer un baiser</string>
- <string name="Female - Boo">Femme - Hou !</string>
- <string name="Female - Bored">Femme - Ennui</string>
- <string name="Female - Hey">Femme - Hé !</string>
- <string name="Female - Hey baby">Femme - Hey baby</string>
- <string name="Female - Laugh">Femme - Rire</string>
- <string name="Female - Looking good">Femme - Looking good</string>
- <string name="Female - Over here">Femme - Over here</string>
- <string name="Female - Please">Femme - Please</string>
- <string name="Female - Repulsed">Femme - Dégoût</string>
- <string name="Female - Shrug">Femme - Hausser les épaules</string>
- <string name="Female - Stick tougue out">Femme - Tirer la langue</string>
- <string name="Female - Wow">Femme - Ouah !</string>
- <string name="New Daycycle">Nouveau cycle du jour</string>
- <string name="New Water">Nouvelle eau</string>
- <string name="New Sky">Nouveau ciel</string>
- <string name="/bow">/s'incliner</string>
- <string name="/clap">/applaudir</string>
- <string name="/count">/compter</string>
- <string name="/extinguish">/éteindre</string>
- <string name="/kmb">/vatefairevoir</string>
- <string name="/muscle">/montrersesmuscles</string>
- <string name="/no">/non</string>
- <string name="/no!">/non !</string>
- <string name="/paper">/papier</string>
- <string name="/pointme">/memontrerdudoigt</string>
- <string name="/pointyou">/montrerl'autredudoigt</string>
- <string name="/rock">/pierre</string>
- <string name="/scissor">/ciseaux</string>
- <string name="/smoke">/fumer</string>
- <string name="/stretch">/bailler</string>
- <string name="/whistle">/siffler</string>
- <string name="/yes">/oui</string>
- <string name="/yes!">/oui !</string>
- <string name="afk">absent</string>
- <string name="dance1">danse1</string>
- <string name="dance2">danse2</string>
- <string name="dance3">danse3</string>
- <string name="dance4">danse4</string>
- <string name="dance5">danse5</string>
- <string name="dance6">danse6</string>
- <string name="dance7">danse7</string>
- <string name="dance8">danse8</string>
- <string name="AvatarBirthDateFormat">[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]</string>
- <string name="DefaultMimeType">aucun/aucun</string>
- <string name="texture_load_dimensions_error">Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT]</string>
- <string name="outfit_photo_load_dimensions_error">Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Redimensionnez l’image ou utilisez-en une autre.</string>
- <string name="outfit_photo_select_dimensions_error">Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Sélectionnez une autre texture.</string>
- <string name="outfit_photo_verify_dimensions_error">Impossible de vérifier les dimensions de la photo. Attendez que la taille de la photo s’affiche dans le sélecteur.</string>
+du rapport d'infraction
+ </string>
+ <string name="New Shape">
+ Nouvelle silhouette
+ </string>
+ <string name="New Skin">
+ Nouvelle peau
+ </string>
+ <string name="New Hair">
+ Nouveaux cheveux
+ </string>
+ <string name="New Eyes">
+ Nouveaux yeux
+ </string>
+ <string name="New Shirt">
+ Nouvelle chemise
+ </string>
+ <string name="New Pants">
+ Nouveau pantalon
+ </string>
+ <string name="New Shoes">
+ Nouvelles chaussures
+ </string>
+ <string name="New Socks">
+ Nouvelles chaussettes
+ </string>
+ <string name="New Jacket">
+ Nouvelle veste
+ </string>
+ <string name="New Gloves">
+ Nouveaux gants
+ </string>
+ <string name="New Undershirt">
+ Nouveau débardeur
+ </string>
+ <string name="New Underpants">
+ Nouveau caleçon
+ </string>
+ <string name="New Skirt">
+ Nouvelle jupe
+ </string>
+ <string name="New Alpha">
+ Nouvel alpha
+ </string>
+ <string name="New Tattoo">
+ Nouveau tatouage
+ </string>
+ <string name="New Universal">
+ Nouvel environnement universel
+ </string>
+ <string name="New Physics">
+ Nouvelles propriétés physiques
+ </string>
+ <string name="Invalid Wearable">
+ Objet à porter non valide
+ </string>
+ <string name="New Gesture">
+ Nouveau geste
+ </string>
+ <string name="New Script">
+ Nouveau script
+ </string>
+ <string name="New Note">
+ Nouvelle note
+ </string>
+ <string name="New Folder">
+ Nouveau dossier
+ </string>
+ <string name="Contents">
+ Contenus
+ </string>
+ <string name="Gesture">
+ Geste
+ </string>
+ <string name="Male Gestures">
+ Gestes masculins
+ </string>
+ <string name="Female Gestures">
+ Gestes féminins
+ </string>
+ <string name="Other Gestures">
+ Autres gestes
+ </string>
+ <string name="Speech Gestures">
+ Gestes liés à la parole
+ </string>
+ <string name="Common Gestures">
+ Gestes communs
+ </string>
+ <string name="Male - Excuse me">
+ Homme - Demander pardon
+ </string>
+ <string name="Male - Get lost">
+ Homme - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ Homme - Envoyer un baiser
+ </string>
+ <string name="Male - Boo">
+ Homme - Hou !
+ </string>
+ <string name="Male - Bored">
+ Homme - Ennui
+ </string>
+ <string name="Male - Hey">
+ Homme - Hé !
+ </string>
+ <string name="Male - Laugh">
+ Homme - Rire
+ </string>
+ <string name="Male - Repulsed">
+ Homme - Dégoût
+ </string>
+ <string name="Male - Shrug">
+ Homme - Hausser les épaules
+ </string>
+ <string name="Male - Stick tougue out">
+ Homme - Tirer la langue
+ </string>
+ <string name="Male - Wow">
+ Homme - Ouah !
+ </string>
+ <string name="Female - Chuckle">
+ Femme - Glousser
+ </string>
+ <string name="Female - Cry">
+ Femme - Pleurer
+ </string>
+ <string name="Female - Embarrassed">
+ Femme - Gêne
+ </string>
+ <string name="Female - Excuse me">
+ Femme - Demander pardon
+ </string>
+ <string name="Female - Get lost">
+ Femme - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Femme - Envoyer un baiser
+ </string>
+ <string name="Female - Boo">
+ Femme - Hou !
+ </string>
+ <string name="Female - Bored">
+ Femme - Ennui
+ </string>
+ <string name="Female - Hey">
+ Femme - Hé !
+ </string>
+ <string name="Female - Hey baby">
+ Femme - Hey baby
+ </string>
+ <string name="Female - Laugh">
+ Femme - Rire
+ </string>
+ <string name="Female - Looking good">
+ Femme - Looking good
+ </string>
+ <string name="Female - Over here">
+ Femme - Over here
+ </string>
+ <string name="Female - Please">
+ Femme - Please
+ </string>
+ <string name="Female - Repulsed">
+ Femme - Dégoût
+ </string>
+ <string name="Female - Shrug">
+ Femme - Hausser les épaules
+ </string>
+ <string name="Female - Stick tougue out">
+ Femme - Tirer la langue
+ </string>
+ <string name="Female - Wow">
+ Femme - Ouah !
+ </string>
+ <string name="New Daycycle">
+ Nouveau cycle du jour
+ </string>
+ <string name="New Water">
+ Nouvelle eau
+ </string>
+ <string name="New Sky">
+ Nouveau ciel
+ </string>
+ <string name="/bow">
+ /s'incliner
+ </string>
+ <string name="/clap">
+ /applaudir
+ </string>
+ <string name="/count">
+ /compter
+ </string>
+ <string name="/extinguish">
+ /éteindre
+ </string>
+ <string name="/kmb">
+ /vatefairevoir
+ </string>
+ <string name="/muscle">
+ /montrersesmuscles
+ </string>
+ <string name="/no">
+ /non
+ </string>
+ <string name="/no!">
+ /non !
+ </string>
+ <string name="/paper">
+ /papier
+ </string>
+ <string name="/pointme">
+ /memontrerdudoigt
+ </string>
+ <string name="/pointyou">
+ /montrerl'autredudoigt
+ </string>
+ <string name="/rock">
+ /pierre
+ </string>
+ <string name="/scissor">
+ /ciseaux
+ </string>
+ <string name="/smoke">
+ /fumer
+ </string>
+ <string name="/stretch">
+ /bailler
+ </string>
+ <string name="/whistle">
+ /siffler
+ </string>
+ <string name="/yes">
+ /oui
+ </string>
+ <string name="/yes!">
+ /oui !
+ </string>
+ <string name="afk">
+ absent
+ </string>
+ <string name="dance1">
+ danse1
+ </string>
+ <string name="dance2">
+ danse2
+ </string>
+ <string name="dance3">
+ danse3
+ </string>
+ <string name="dance4">
+ danse4
+ </string>
+ <string name="dance5">
+ danse5
+ </string>
+ <string name="dance6">
+ danse6
+ </string>
+ <string name="dance7">
+ danse7
+ </string>
+ <string name="dance8">
+ danse8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ aucun/aucun
+ </string>
+ <string name="texture_load_dimensions_error">
+ Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT]
+ </string>
+ <string name="outfit_photo_load_dimensions_error">
+ Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Redimensionnez l’image ou utilisez-en une autre.
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Sélectionnez une autre texture.
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Impossible de vérifier les dimensions de la photo. Attendez que la taille de la photo s’affiche dans le sélecteur.
+ </string>
<string name="words_separator" value=","/>
- <string name="server_is_down">Malgré nos efforts, une erreur inattendue s’est produite.
+ <string name="server_is_down">
+ Malgré nos efforts, une erreur inattendue s’est produite.
Veuillez vous reporter à http://status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service.
- Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu.</string>
- <string name="dateTimeWeekdaysNames">Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday</string>
- <string name="dateTimeWeekdaysShortNames">Sun:Mon:Tue:Wed:Thu:Fri:Sat</string>
- <string name="dateTimeMonthNames">January:February:March:April:May:June:July:August:September:October:November:December</string>
- <string name="dateTimeMonthShortNames">Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec</string>
- <string name="dateTimeDayFormat">[MDAY]</string>
- <string name="dateTimeAM">AM</string>
- <string name="dateTimePM">PM</string>
- <string name="LocalEstimateUSD">[AMOUNT] US$</string>
- <string name="Group Ban">Bannissement de groupe</string>
- <string name="Membership">Inscription</string>
- <string name="Roles">Rôles</string>
- <string name="Group Identity">Identité du groupe</string>
- <string name="Parcel Management">Gestion des parcelles</string>
- <string name="Parcel Identity">Identité des parcelles</string>
- <string name="Parcel Settings">Paramètres des parcelles</string>
- <string name="Parcel Powers">Pouvoirs sur les parcelles</string>
- <string name="Parcel Access">Accès aux parcelles</string>
- <string name="Parcel Content">Contenu des parcelles</string>
- <string name="Object Management">Gestion des objets</string>
- <string name="Accounting">Comptabilité</string>
- <string name="Notices">Notices</string>
- <string name="Chat" value=" Chat :">Chat</string>
- <string name="BaseMembership">Base</string>
- <string name="PremiumMembership">Premium</string>
- <string name="Premium_PlusMembership">Premium Plus</string>
- <string name="DeleteItems">Supprimer les articles sélectionnés ?</string>
- <string name="DeleteItem">Supprimer l'article sélectionné ?</string>
- <string name="EmptyOutfitText">Cette tenue ne contient aucun article.</string>
- <string name="ExternalEditorNotSet">Sélectionnez un éditeur à l'aide du paramètre ExternalEditor.</string>
- <string name="ExternalEditorNotFound">Éditeur externe spécifié introuvable.
+ Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Sun:Mon:Tue:Wed:Thu:Fri:Sat
+ </string>
+ <string name="dateTimeMonthNames">
+ January:February:March:April:May:June:July:August:September:October:November:December
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Group Ban">
+ Bannissement de groupe
+ </string>
+ <string name="Membership">
+ Inscription
+ </string>
+ <string name="Roles">
+ Rôles
+ </string>
+ <string name="Group Identity">
+ Identité du groupe
+ </string>
+ <string name="Parcel Management">
+ Gestion des parcelles
+ </string>
+ <string name="Parcel Identity">
+ Identité des parcelles
+ </string>
+ <string name="Parcel Settings">
+ Paramètres des parcelles
+ </string>
+ <string name="Parcel Powers">
+ Pouvoirs sur les parcelles
+ </string>
+ <string name="Parcel Access">
+ Accès aux parcelles
+ </string>
+ <string name="Parcel Content">
+ Contenu des parcelles
+ </string>
+ <string name="Object Management">
+ Gestion des objets
+ </string>
+ <string name="Accounting">
+ Comptabilité
+ </string>
+ <string name="Notices">
+ Notices
+ </string>
+ <string name="Chat" value=" Chat :">
+ Chat
+ </string>
+ <string name="BaseMembership">
+ Base
+ </string>
+ <string name="PremiumMembership">
+ Premium
+ </string>
+ <string name="Premium_PlusMembership">
+ Premium Plus
+ </string>
+ <string name="DeleteItems">
+ Supprimer les articles sélectionnés ?
+ </string>
+ <string name="DeleteItem">
+ Supprimer l'article sélectionné ?
+ </string>
+ <string name="EmptyOutfitText">
+ Cette tenue ne contient aucun article.
+ </string>
+ <string name="ExternalEditorNotSet">
+ Sélectionnez un éditeur à l'aide du paramètre ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Éditeur externe spécifié introuvable.
Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
-(par ex. : &quot;/chemin_accès/editor&quot; &quot;%s&quot;).</string>
- <string name="ExternalEditorCommandParseError">Erreur lors de l'analyse de la commande d'éditeur externe.</string>
- <string name="ExternalEditorFailedToRun">Échec d'exécution de l'éditeur externe.</string>
- <string name="TranslationFailed">Échec de traduction : [REASON]</string>
- <string name="TranslationResponseParseError">Erreur lors de l'analyse de la réponse relative à la traduction.</string>
- <string name="Esc">Échap</string>
- <string name="Space">Space</string>
- <string name="Enter">Enter</string>
- <string name="Tab">Tab</string>
- <string name="Ins">Ins</string>
- <string name="Del">Del</string>
- <string name="Backsp">Backsp</string>
- <string name="Shift">Maj</string>
- <string name="Ctrl">Ctrl</string>
- <string name="Alt">Alt</string>
- <string name="CapsLock">CapsLock</string>
- <string name="Home">Début</string>
- <string name="End">End</string>
- <string name="PgUp">PgUp</string>
- <string name="PgDn">PgDn</string>
- <string name="F1">F1</string>
- <string name="F2">F2</string>
- <string name="F3">F3</string>
- <string name="F4">F4</string>
- <string name="F5">F5</string>
- <string name="F6">F6</string>
- <string name="F7">F7</string>
- <string name="F8">F8</string>
- <string name="F9">F9</string>
- <string name="F10">F10</string>
- <string name="F11">F11</string>
- <string name="F12">F12</string>
- <string name="Add">Ajouter</string>
- <string name="Subtract">Soustraire</string>
- <string name="Multiply">Multiplier</string>
- <string name="Divide">Diviser</string>
- <string name="PAD_DIVIDE">PAD_DIVIDE</string>
- <string name="PAD_LEFT">PAD_LEFT</string>
- <string name="PAD_RIGHT">PAD_RIGHT</string>
- <string name="PAD_DOWN">PAD_DOWN</string>
- <string name="PAD_UP">PAD_UP</string>
- <string name="PAD_HOME">PAD_HOME</string>
- <string name="PAD_END">PAD_END</string>
- <string name="PAD_PGUP">PAD_PGUP</string>
- <string name="PAD_PGDN">PAD_PGDN</string>
- <string name="PAD_CENTER">PAD_CENTER</string>
- <string name="PAD_INS">PAD_INS</string>
- <string name="PAD_DEL">PAD_DEL</string>
- <string name="PAD_Enter">PAD_Enter</string>
- <string name="PAD_BUTTON0">PAD_BUTTON0</string>
- <string name="PAD_BUTTON1">PAD_BUTTON1</string>
- <string name="PAD_BUTTON2">PAD_BUTTON2</string>
- <string name="PAD_BUTTON3">PAD_BUTTON3</string>
- <string name="PAD_BUTTON4">PAD_BUTTON4</string>
- <string name="PAD_BUTTON5">PAD_BUTTON5</string>
- <string name="PAD_BUTTON6">PAD_BUTTON6</string>
- <string name="PAD_BUTTON7">PAD_BUTTON7</string>
- <string name="PAD_BUTTON8">PAD_BUTTON8</string>
- <string name="PAD_BUTTON9">PAD_BUTTON9</string>
- <string name="PAD_BUTTON10">PAD_BUTTON10</string>
- <string name="PAD_BUTTON11">PAD_BUTTON11</string>
- <string name="PAD_BUTTON12">PAD_BUTTON12</string>
- <string name="PAD_BUTTON13">PAD_BUTTON13</string>
- <string name="PAD_BUTTON14">PAD_BUTTON14</string>
- <string name="PAD_BUTTON15">PAD_BUTTON15</string>
- <string name="-">-</string>
- <string name="=">=</string>
- <string name="`">`</string>
- <string name=";">;</string>
- <string name="[">[</string>
- <string name="]">]</string>
- <string name="\">\</string>
- <string name="0">0</string>
- <string name="1">1</string>
- <string name="2">2</string>
- <string name="3">3</string>
- <string name="4">4</string>
- <string name="5">5</string>
- <string name="6">6</string>
- <string name="7">7</string>
- <string name="8">8</string>
- <string name="9">9</string>
- <string name="A">A</string>
- <string name="B">B</string>
- <string name="C">C</string>
- <string name="D">D</string>
- <string name="E">E</string>
- <string name="F">F</string>
- <string name="G">G</string>
- <string name="H">H</string>
- <string name="I">I</string>
- <string name="J">J</string>
- <string name="K">K</string>
- <string name="L">L</string>
- <string name="M">M</string>
- <string name="N">N</string>
- <string name="O">O</string>
- <string name="P">P</string>
- <string name="Q">Q</string>
- <string name="R">R</string>
- <string name="S">S</string>
- <string name="T">T</string>
- <string name="U">U</string>
- <string name="V">V</string>
- <string name="W">W</string>
- <string name="X">X</string>
- <string name="Y">Y</string>
- <string name="Z">Z</string>
- <string name="BeaconParticle">Affichage des balises de particule (bleu)</string>
- <string name="BeaconPhysical">Affichage des balises d'objet physique (vert)</string>
- <string name="BeaconScripted">Affichage des balises d'objet scripté (rouge)</string>
- <string name="BeaconScriptedTouch">Affichage des balises d'objet scripté avec fonction de toucher (rouge)</string>
- <string name="BeaconSound">Affichage des balises de son (jaune)</string>
- <string name="BeaconMedia">Affichage des balises de média (blanc)</string>
- <string name="BeaconSun">Balise de visibilité du soleil (orange)</string>
- <string name="BeaconMoon">Observation de la balise de direction de la lune (violet)</string>
- <string name="ParticleHiding">Masquage des particules</string>
- <string name="Command_AboutLand_Label">À propos du terrain</string>
- <string name="Command_Appearance_Label">Apparence</string>
- <string name="Command_Avatar_Label">Avatar</string>
- <string name="Command_Build_Label">Construire</string>
- <string name="Command_Chat_Label">Chat</string>
- <string name="Command_Conversations_Label">Conversations</string>
- <string name="Command_Compass_Label">Boussole</string>
- <string name="Command_Destinations_Label">Destinations</string>
- <string name="Command_Environments_Label">Mes environnements</string>
- <string name="Command_Facebook_Label">Facebook</string>
- <string name="Command_Flickr_Label">Flickr</string>
- <string name="Command_Gestures_Label">Gestes</string>
- <string name="Command_Grid_Status_Label">État de la grille</string>
- <string name="Command_HowTo_Label">Aide rapide</string>
- <string name="Command_Inventory_Label">Inventaire</string>
- <string name="Command_Map_Label">Carte</string>
- <string name="Command_Marketplace_Label">Place du marché</string>
- <string name="Command_MarketplaceListings_Label">Place du marché</string>
- <string name="Command_MiniMap_Label">Mini-carte</string>
- <string name="Command_Move_Label">Marcher / Courir / Voler</string>
- <string name="Command_Outbox_Label">Boîte d'envoi vendeur</string>
- <string name="Command_People_Label">Personnes</string>
- <string name="Command_Picks_Label">Favoris</string>
- <string name="Command_Places_Label">Lieux</string>
- <string name="Command_Preferences_Label">Préférences</string>
- <string name="Command_Profile_Label">Profil</string>
- <string name="Command_Report_Abuse_Label">Signaler une infraction</string>
- <string name="Command_Search_Label">Recherche</string>
- <string name="Command_Snapshot_Label">Photo</string>
- <string name="Command_Speak_Label">Parler</string>
- <string name="Command_Twitter_Label">Twitter</string>
- <string name="Command_View_Label">Caméra</string>
- <string name="Command_Voice_Label">Paramètres vocaux</string>
- <string name="Command_AboutLand_Tooltip">Information sur le terrain que vous visitez</string>
- <string name="Command_Appearance_Tooltip">Modifier votre avatar</string>
- <string name="Command_Avatar_Tooltip">Choisir un avatar complet</string>
- <string name="Command_Build_Tooltip">Construction d'objets et remodelage du terrain</string>
- <string name="Command_Chat_Tooltip">Parler aux personnes près de vous par chat écrit</string>
- <string name="Command_Conversations_Tooltip">Parler à quelqu'un</string>
- <string name="Command_Compass_Tooltip">Boussole</string>
- <string name="Command_Destinations_Tooltip">Destinations intéressantes</string>
- <string name="Command_Environments_Tooltip">Mes environnements</string>
- <string name="Command_Facebook_Tooltip">Publier sur Facebook</string>
- <string name="Command_Flickr_Tooltip">Charger sur Flickr</string>
- <string name="Command_Gestures_Tooltip">Gestes de votre avatar</string>
- <string name="Command_Grid_Status_Tooltip">Afficher l’état actuel de la grille</string>
- <string name="Command_HowTo_Tooltip">Comment effectuer les opérations courantes</string>
- <string name="Command_Inventory_Tooltip">Afficher et utiliser vos possessions</string>
- <string name="Command_Map_Tooltip">Carte du monde</string>
- <string name="Command_Marketplace_Tooltip">Faire du shopping</string>
- <string name="Command_MarketplaceListings_Tooltip">Vendez votre création</string>
- <string name="Command_MiniMap_Tooltip">Afficher les personnes près de vous</string>
- <string name="Command_Move_Tooltip">Faire bouger votre avatar</string>
- <string name="Command_Outbox_Tooltip">Transférer des articles vers votre place de marché afin de les vendre.</string>
- <string name="Command_People_Tooltip">Amis, groupes et personnes près de vous</string>
- <string name="Command_Picks_Tooltip">Lieux à afficher comme favoris dans votre profil</string>
- <string name="Command_Places_Tooltip">Lieux enregistrés</string>
- <string name="Command_Preferences_Tooltip">Préférences</string>
- <string name="Command_Profile_Tooltip">Modifier ou afficher votre profil</string>
- <string name="Command_Report_Abuse_Tooltip">Signaler une infraction</string>
- <string name="Command_Search_Tooltip">Trouver des lieux, personnes, événements</string>
- <string name="Command_Snapshot_Tooltip">Prendre une photo</string>
- <string name="Command_Speak_Tooltip">Parler aux personnes près de vous en utilisant votre micro</string>
- <string name="Command_Twitter_Tooltip">Twitter</string>
- <string name="Command_View_Tooltip">Changer l'angle de la caméra</string>
- <string name="Command_Voice_Tooltip">Commandes de réglage du volume des appels et des personnes près de vous dans Second Life.</string>
- <string name="Toolbar_Bottom_Tooltip">actuellement dans la barre d'outils du bas</string>
- <string name="Toolbar_Left_Tooltip">actuellement dans la barre d'outils de gauche</string>
- <string name="Toolbar_Right_Tooltip">actuellement dans la barre d'outils de droite</string>
- <string name="Retain%">Garder%</string>
- <string name="Detail">Détail</string>
- <string name="Better Detail">Meilleur détail</string>
- <string name="Surface">Surface</string>
- <string name="Solid">Solide</string>
- <string name="Wrap">Wrap</string>
- <string name="Preview">Aperçu</string>
- <string name="Normal">Normal</string>
- <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string>
- <string name="Pathfinding_Object_Attr_None">Aucun</string>
- <string name="Pathfinding_Object_Attr_Permanent">Maillage de navigation affecté</string>
- <string name="Pathfinding_Object_Attr_Character">Personnage</string>
- <string name="Pathfinding_Object_Attr_MultiSelect">(Multiple)</string>
- <string name="snapshot_quality_very_low">Très faible</string>
- <string name="snapshot_quality_low">Faible</string>
- <string name="snapshot_quality_medium">Moyenne</string>
- <string name="snapshot_quality_high">Élevée</string>
- <string name="snapshot_quality_very_high">Très élevée</string>
- <string name="TeleportMaturityExceeded">Le résident ne peut pas visiter cette région.</string>
- <string name="UserDictionary">[User]</string>
- <string name="experience_tools_experience">Expérience</string>
- <string name="ExperienceNameNull">(aucune expérience)</string>
- <string name="ExperienceNameUntitled">(expérience sans titre)</string>
- <string name="Land-Scope">À l’échelle des terrains</string>
- <string name="Grid-Scope">À l’échelle de la grille</string>
- <string name="Allowed_Experiences_Tab">AUTORISÉE</string>
- <string name="Blocked_Experiences_Tab">BLOQUÉE</string>
- <string name="Contrib_Experiences_Tab">CONTRIBUTEUR</string>
- <string name="Admin_Experiences_Tab">ADMIN</string>
- <string name="Recent_Experiences_Tab">RÉCENTE</string>
- <string name="Owned_Experiences_Tab">AVEC PROPRIÉTAIRE</string>
- <string name="ExperiencesCounter">([EXPERIENCES], [MAXEXPERIENCES] max.)</string>
- <string name="ExperiencePermission1">assumer vos contrôles</string>
- <string name="ExperiencePermission3">déclencher des animations pour votre avatar</string>
- <string name="ExperiencePermission4">attacher à votre avatar</string>
- <string name="ExperiencePermission9">suivre votre caméra</string>
- <string name="ExperiencePermission10">contrôler votre caméra</string>
- <string name="ExperiencePermission11">vous téléporter</string>
- <string name="ExperiencePermission12">accepter automatiquement les permissions d’expérience</string>
- <string name="ExperiencePermission16">forcez votre avatar à s’asseoir</string>
- <string name="ExperiencePermission17">changer vos paramètres d'environnement</string>
- <string name="ExperiencePermissionShortUnknown">a effectué une opération inconnue : [Permission]</string>
- <string name="ExperiencePermissionShort1">Prendre le contrôle</string>
- <string name="ExperiencePermissionShort3">Déclencher des animations</string>
- <string name="ExperiencePermissionShort4">Attacher</string>
- <string name="ExperiencePermissionShort9">Suivre la caméra</string>
- <string name="ExperiencePermissionShort10">Contrôler la caméra</string>
- <string name="ExperiencePermissionShort11">Téléportation</string>
- <string name="ExperiencePermissionShort12">Permission</string>
- <string name="ExperiencePermissionShort16">M'asseoir</string>
- <string name="ExperiencePermissionShort17">Environnement</string>
- <string name="logging_calls_disabled_log_empty">Les conversations ne sont pas archivées. Pour commencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences &gt; Chat.</string>
- <string name="logging_calls_disabled_log_not_empty">Aucune conversation ne sera plus enregistrée. Pour recommencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences &gt; Chat.</string>
- <string name="logging_calls_enabled_log_empty">Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici.</string>
- <string name="loading_chat_logs">Chargement...</string>
- <string name="na">s.o.</string>
- <string name="preset_combo_label">-Liste vide-</string>
- <string name="Default">Valeur par défaut</string>
- <string name="none_paren_cap">(Aucun/Aucune)</string>
- <string name="no_limit">Aucune limite</string>
- <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">La forme physique contient des triangles trop petits. Essayez de simplifier le modèle physique.</string>
- <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">La forme physique contient de mauvaises données de confirmation. Essayez de corriger le modèle physique.</string>
- <string name="Mav_Details_MAV_UNKNOWN_VERSION">La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique.</string>
- <string name="couldnt_resolve_host">DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]).
+(par ex. : "/chemin_accès/editor" "%s").
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Erreur lors de l'analyse de la commande d'éditeur externe.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Échec d'exécution de l'éditeur externe.
+ </string>
+ <string name="TranslationFailed">
+ Échec de traduction : [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Erreur lors de l'analyse de la réponse relative à la traduction.
+ </string>
+ <string name="Esc">
+ Échap
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Maj
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Début
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Ajouter
+ </string>
+ <string name="Subtract">
+ Soustraire
+ </string>
+ <string name="Multiply">
+ Multiplier
+ </string>
+ <string name="Divide">
+ Diviser
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Affichage des balises de particule (bleu)
+ </string>
+ <string name="BeaconPhysical">
+ Affichage des balises d'objet physique (vert)
+ </string>
+ <string name="BeaconScripted">
+ Affichage des balises d'objet scripté (rouge)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Affichage des balises d'objet scripté avec fonction de toucher (rouge)
+ </string>
+ <string name="BeaconSound">
+ Affichage des balises de son (jaune)
+ </string>
+ <string name="BeaconMedia">
+ Affichage des balises de média (blanc)
+ </string>
+ <string name="BeaconSun">
+ Balise de visibilité du soleil (orange)
+ </string>
+ <string name="BeaconMoon">
+ Observation de la balise de direction de la lune (violet)
+ </string>
+ <string name="ParticleHiding">
+ Masquage des particules
+ </string>
+ <string name="Command_AboutLand_Label">
+ À propos du terrain
+ </string>
+ <string name="Command_Appearance_Label">
+ Apparence
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construire
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Conversations_Label">
+ Conversations
+ </string>
+ <string name="Command_Compass_Label">
+ Boussole
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinations
+ </string>
+ <string name="Command_Environments_Label">
+ Mes environnements
+ </string>
+ <string name="Command_Facebook_Label">
+ Facebook
+ </string>
+ <string name="Command_Flickr_Label">
+ Flickr
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestes
+ </string>
+ <string name="Command_Grid_Status_Label">
+ État de la grille
+ </string>
+ <string name="Command_HowTo_Label">
+ Aide rapide
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventaire
+ </string>
+ <string name="Command_Map_Label">
+ Carte
+ </string>
+ <string name="Command_Marketplace_Label">
+ Place du marché
+ </string>
+ <string name="Command_MarketplaceListings_Label">
+ Place du marché
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini-carte
+ </string>
+ <string name="Command_Move_Label">
+ Marcher / Courir / Voler
+ </string>
+ <string name="Command_Outbox_Label">
+ Boîte d'envoi vendeur
+ </string>
+ <string name="Command_People_Label">
+ Personnes
+ </string>
+ <string name="Command_Picks_Label">
+ Favoris
+ </string>
+ <string name="Command_Places_Label">
+ Lieux
+ </string>
+ <string name="Command_Preferences_Label">
+ Préférences
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Report_Abuse_Label">
+ Signaler une infraction
+ </string>
+ <string name="Command_Search_Label">
+ Recherche
+ </string>
+ <string name="Command_Snapshot_Label">
+ Photo
+ </string>
+ <string name="Command_Speak_Label">
+ Parler
+ </string>
+ <string name="Command_Twitter_Label">
+ Twitter
+ </string>
+ <string name="Command_View_Label">
+ Caméra
+ </string>
+ <string name="Command_Voice_Label">
+ Paramètres vocaux
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Information sur le terrain que vous visitez
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Modifier votre avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Choisir un avatar complet
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construction d'objets et remodelage du terrain
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Parler aux personnes près de vous par chat écrit
+ </string>
+ <string name="Command_Conversations_Tooltip">
+ Parler à quelqu'un
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Boussole
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinations intéressantes
+ </string>
+ <string name="Command_Environments_Tooltip">
+ Mes environnements
+ </string>
+ <string name="Command_Facebook_Tooltip">
+ Publier sur Facebook
+ </string>
+ <string name="Command_Flickr_Tooltip">
+ Charger sur Flickr
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestes de votre avatar
+ </string>
+ <string name="Command_Grid_Status_Tooltip">
+ Afficher l’état actuel de la grille
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Comment effectuer les opérations courantes
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Afficher et utiliser vos possessions
+ </string>
+ <string name="Command_Map_Tooltip">
+ Carte du monde
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Faire du shopping
+ </string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Vendez votre création
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Afficher les personnes près de vous
+ </string>
+ <string name="Command_Move_Tooltip">
+ Faire bouger votre avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transférer des articles vers votre place de marché afin de les vendre.
+ </string>
+ <string name="Command_People_Tooltip">
+ Amis, groupes et personnes près de vous
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lieux à afficher comme favoris dans votre profil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lieux enregistrés
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Préférences
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Modifier ou afficher votre profil
+ </string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Signaler une infraction
+ </string>
+ <string name="Command_Search_Tooltip">
+ Trouver des lieux, personnes, événements
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Prendre une photo
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Parler aux personnes près de vous en utilisant votre micro
+ </string>
+ <string name="Command_Twitter_Tooltip">
+ Twitter
+ </string>
+ <string name="Command_View_Tooltip">
+ Changer l'angle de la caméra
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Commandes de réglage du volume des appels et des personnes près de vous dans Second Life.
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ actuellement dans la barre d'outils du bas
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ actuellement dans la barre d'outils de gauche
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ actuellement dans la barre d'outils de droite
+ </string>
+ <string name="Retain%">
+ Garder%
+ </string>
+ <string name="Detail">
+ Détail
+ </string>
+ <string name="Better Detail">
+ Meilleur détail
+ </string>
+ <string name="Surface">
+ Surface
+ </string>
+ <string name="Solid">
+ Solide
+ </string>
+ <string name="Wrap">
+ Wrap
+ </string>
+ <string name="Preview">
+ Aperçu
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="Pathfinding_Wiki_URL">
+ http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </string>
+ <string name="Pathfinding_Object_Attr_None">
+ Aucun
+ </string>
+ <string name="Pathfinding_Object_Attr_Permanent">
+ Maillage de navigation affecté
+ </string>
+ <string name="Pathfinding_Object_Attr_Character">
+ Personnage
+ </string>
+ <string name="Pathfinding_Object_Attr_MultiSelect">
+ (Multiple)
+ </string>
+ <string name="snapshot_quality_very_low">
+ Très faible
+ </string>
+ <string name="snapshot_quality_low">
+ Faible
+ </string>
+ <string name="snapshot_quality_medium">
+ Moyenne
+ </string>
+ <string name="snapshot_quality_high">
+ Élevée
+ </string>
+ <string name="snapshot_quality_very_high">
+ Très élevée
+ </string>
+ <string name="TeleportMaturityExceeded">
+ Le résident ne peut pas visiter cette région.
+ </string>
+ <string name="UserDictionary">
+ [User]
+ </string>
+ <string name="experience_tools_experience">
+ Expérience
+ </string>
+ <string name="ExperienceNameNull">
+ (aucune expérience)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (expérience sans titre)
+ </string>
+ <string name="Land-Scope">
+ À l’échelle des terrains
+ </string>
+ <string name="Grid-Scope">
+ À l’échelle de la grille
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ AUTORISÉE
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOQUÉE
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ CONTRIBUTEUR
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ADMIN
+ </string>
+ <string name="Recent_Experiences_Tab">
+ RÉCENTE
+ </string>
+ <string name="Owned_Experiences_Tab">
+ AVEC PROPRIÉTAIRE
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], [MAXEXPERIENCES] max.)
+ </string>
+ <string name="ExperiencePermission1">
+ assumer vos contrôles
+ </string>
+ <string name="ExperiencePermission3">
+ déclencher des animations pour votre avatar
+ </string>
+ <string name="ExperiencePermission4">
+ attacher à votre avatar
+ </string>
+ <string name="ExperiencePermission9">
+ suivre votre caméra
+ </string>
+ <string name="ExperiencePermission10">
+ contrôler votre caméra
+ </string>
+ <string name="ExperiencePermission11">
+ vous téléporter
+ </string>
+ <string name="ExperiencePermission12">
+ accepter automatiquement les permissions d’expérience
+ </string>
+ <string name="ExperiencePermission16">
+ forcez votre avatar à s’asseoir
+ </string>
+ <string name="ExperiencePermission17">
+ changer vos paramètres d'environnement
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ a effectué une opération inconnue : [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Prendre le contrôle
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Déclencher des animations
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Attacher
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Suivre la caméra
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Contrôler la caméra
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Téléportation
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Permission
+ </string>
+ <string name="ExperiencePermissionShort16">
+ M'asseoir
+ </string>
+ <string name="ExperiencePermissionShort17">
+ Environnement
+ </string>
+ <string name="logging_calls_disabled_log_empty">
+ Les conversations ne sont pas archivées. Pour commencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences &gt; Chat.
+ </string>
+ <string name="logging_calls_disabled_log_not_empty">
+ Aucune conversation ne sera plus enregistrée. Pour recommencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences &gt; Chat.
+ </string>
+ <string name="logging_calls_enabled_log_empty">
+ Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici.
+ </string>
+ <string name="loading_chat_logs">
+ Chargement...
+ </string>
+ <string name="na">
+ s.o.
+ </string>
+ <string name="preset_combo_label">
+ -Liste vide-
+ </string>
+ <string name="Default">
+ Valeur par défaut
+ </string>
+ <string name="none_paren_cap">
+ (Aucun/Aucune)
+ </string>
+ <string name="no_limit">
+ Aucune limite
+ </string>
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ La forme physique contient des triangles trop petits. Essayez de simplifier le modèle physique.
+ </string>
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ La forme physique contient de mauvaises données de confirmation. Essayez de corriger le modèle physique.
+ </string>
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique.
+ </string>
+ <string name="couldnt_resolve_host">
+ DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]).
Veuillez vérifier que vous parvenez à vous connecter au site www.secondlife.com.
Si c'est le cas, et que vous continuez à recevoir ce message d'erreur, veuillez vous
-rendre à la section Support et signaler ce problème</string>
- <string name="ssl_peer_certificate">Le serveur d'identification a rencontré une erreur de connexion SSL.
+rendre à la section Support et signaler ce problème
+ </string>
+ <string name="ssl_peer_certificate">
+ Le serveur d'identification a rencontré une erreur de connexion SSL.
Si vous continuez à recevoir ce message d'erreur,
veuillez vous rendre à la section Support du site web
-SecondLife.com et signaler ce problème</string>
- <string name="ssl_connect_error">Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur.
+SecondLife.com et signaler ce problème
+ </string>
+ <string name="ssl_connect_error">
+ Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur.
Veuillez aller à Tableaux de bord et assurez-vous que l'heure et la date sont réglés
correctement. Vérifiez également que votre réseau et votre pare-feu sont configurés
correctement. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre
à la section Support du site web SecondLife.com et signaler ce problème.
-[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances]</string>
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml
index 1272723c6b..cad8911fde 100644
--- a/indra/newview/skins/default/xui/fr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml
@@ -1,40 +1,96 @@
<?xml version="1.0" ?>
<teleport_messages>
<message_set name="errors">
- <message name="invalid_tport">Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
-Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].</message>
- <message name="invalid_region_handoff">Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions.
-Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].</message>
- <message name="blocked_tport">Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment.
-Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème.</message>
- <message name="nolandmark_tport">Désolé, le système n'a pas réussi à localiser la destination de votre repère.</message>
- <message name="timeout_tport">Désolé, la connexion vers votre lieu de téléportation n'a pas abouti.
-Veuillez réessayer dans un moment.</message>
- <message name="NoHelpIslandTP">Vous ne pouvez pas vous téléporter à nouveau vers Welcome Island.
-Pour recommencer le didacticiel, accédez à Welcome Island Public.</message>
- <message name="noaccess_tport">Désolé, vous n'avez pas accès à cette destination.</message>
- <message name="missing_attach_tport">Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter.</message>
- <message name="too_many_uploads_tport">Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée.</message>
- <message name="expired_tport">Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.</message>
- <message name="expired_region_handoff">Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.</message>
- <message name="no_host">Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes.</message>
- <message name="no_inventory_host">L'inventaire est temporairement indisponible.</message>
- <message name="MustGetAgeRegion">Pour accéder à cette région, vous devez avoir au moins 18 ans.</message>
- <message name="RegionTPSpecialUsageBlocked">Impossible de pénétrer dans la région. « [REGION_NAME] » est une région de jeux d'adresse et vous devez satisfaire à certains critères pour y pénétrer. Pour en savoir plus, consultez la page [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life FAQ sur les jeux d'adresse].</message>
- <message name="preexisting_tport">Désolé, mais le système n'a pas pu démarrer votre téléport. Veuillez réessayer dans quelques minutes.</message>
+ <message name="invalid_tport">
+ Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment.
+Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème.
+ </message>
+ <message name="nolandmark_tport">
+ Désolé, le système n'a pas réussi à localiser la destination de votre repère.
+ </message>
+ <message name="timeout_tport">
+ Désolé, la connexion vers votre lieu de téléportation n'a pas abouti.
+Veuillez réessayer dans un moment.
+ </message>
+ <message name="NoHelpIslandTP">
+ Vous ne pouvez pas vous téléporter à nouveau vers Welcome Island.
+Pour recommencer le didacticiel, accédez à Welcome Island Public.
+ </message>
+ <message name="noaccess_tport">
+ Désolé, vous n'avez pas accès à cette destination.
+ </message>
+ <message name="missing_attach_tport">
+ Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter.
+ </message>
+ <message name="too_many_uploads_tport">
+ Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée.
+ </message>
+ <message name="expired_tport">
+ Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
+ </message>
+ <message name="expired_region_handoff">
+ Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
+ </message>
+ <message name="no_host">
+ Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes.
+ </message>
+ <message name="no_inventory_host">
+ L'inventaire est temporairement indisponible.
+ </message>
+ <message name="MustGetAgeRegion">
+ Pour accéder à cette région, vous devez avoir au moins 18 ans.
+ </message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Impossible de pénétrer dans la région. « [REGION_NAME] » est une région de jeux d'adresse et vous devez satisfaire à certains critères pour y pénétrer. Pour en savoir plus, consultez la page [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life FAQ sur les jeux d'adresse].
+ </message>
+ <message name="preexisting_tport">
+ Désolé, mais le système n'a pas pu démarrer votre téléport. Veuillez réessayer dans quelques minutes.
+ </message>
</message_set>
<message_set name="progress">
- <message name="sending_dest">Envoi vers la destination en cours.</message>
- <message name="redirecting">Redirection vers un emplacement différent en cours.</message>
- <message name="relaying">Relai vers la destination en cours.</message>
- <message name="sending_home">Requête de la demande d'envoi vers votre domicile en cours.</message>
- <message name="sending_landmark">Requête de la demande d'envoi vers le repère en cours.</message>
- <message name="completing">Téléportation sur le point d'aboutir.</message>
- <message name="completed_from">Téléportation depuis [T_SLURL] terminée</message>
- <message name="resolving">Destination en cours de résolution.</message>
- <message name="contacting">Contact avec la nouvelle région en cours.</message>
- <message name="arriving">Vous arrivez...</message>
- <message name="requesting">Demande de téléportation en cours...</message>
- <message name="pending">En attente de téléportation...</message>
+ <message name="sending_dest">
+ Envoi vers la destination en cours.
+ </message>
+ <message name="redirecting">
+ Redirection vers un emplacement différent en cours.
+ </message>
+ <message name="relaying">
+ Relai vers la destination en cours.
+ </message>
+ <message name="sending_home">
+ Requête de la demande d'envoi vers votre domicile en cours.
+ </message>
+ <message name="sending_landmark">
+ Requête de la demande d'envoi vers le repère en cours.
+ </message>
+ <message name="completing">
+ Téléportation sur le point d'aboutir.
+ </message>
+ <message name="completed_from">
+ Téléportation depuis [T_SLURL] terminée
+ </message>
+ <message name="resolving">
+ Destination en cours de résolution.
+ </message>
+ <message name="contacting">
+ Contact avec la nouvelle région en cours.
+ </message>
+ <message name="arriving">
+ Vous arrivez...
+ </message>
+ <message name="requesting">
+ Demande de téléportation en cours...
+ </message>
+ <message name="pending">
+ En attente de téléportation...
+ </message>
</message_set>
</teleport_messages>
diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml
deleted file mode 100644
index ac3dc17aa3..0000000000
--- a/indra/newview/skins/default/xui/it/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Caricamento in corso...
- </floater.string>
- <floater.string name="done_text">
- Fine
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Ripeti ricerca in modo che rifletta il livello di diritti Admin attuale
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/panel_progress.xml b/indra/newview/skins/default/xui/it/panel_progress.xml
index c9bed9fd9b..ab906cbedb 100644
--- a/indra/newview/skins/default/xui/it/panel_progress.xml
+++ b/indra/newview/skins/default/xui/it/panel_progress.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" ?>
<panel name="login_progress_panel">
+ <layout_panel name="panel_icons"/>
<layout_stack name="vertical_centering"/>
<layout_panel name="panel4"/>
<layout_panel name="center"/>
<layout_stack name="horizontal_centering">
+ <text name="logos_lbl">Utilizzi di Megapahit</text>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
index 75b5d64660..21b65e8e69 100644
--- a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
@@ -7,7 +7,7 @@
Salvare un&apos;immagine nell&apos;inventario costa L$[UPLOAD_COST]. Per salvare l&apos;immagine come texture, selezionare uno dei formati quadrati.
</text>
<combo_box label="Risoluzione" name="texture_size_combo">
- <combo_box.item label="Finestra corrente (512x512)" name="CurrentWindow"/>
+ <combo_box.item label="Finestra corrente" name="CurrentWindow"/>
<combo_box.item label="Piccola (128x128)" name="Small(128x128)"/>
<combo_box.item label="Media (256x256)" name="Medium(256x256)"/>
<combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
index 50fb3d39fa..7fce171326 100644
--- a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="Salva sul disco" name="save_to_computer_btn"/>
- <button label="Salva nell&apos;inventario (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Salva nell&apos;inventario" name="save_to_inventory_btn"/>
<button label="Condividi sul feed del profilo" name="save_to_profile_btn"/>
<button label="Condividi su Facebook" name="send_to_facebook_btn"/>
<button label="Condividi su Twitter" name="send_to_twitter_btn"/>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 270e7ac3a1..d80da3c0c8 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -1,610 +1,1668 @@
<?xml version="1.0" ?>
<strings>
- <string name="SECOND_LIFE">Second Life</string>
- <string name="APP_NAME">Megapahit</string>
- <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string>
- <string name="SUPPORT_SITE">Portale di supporto di Second Life</string>
- <string name="StartupDetectingHardware">Ricerca hardware...</string>
- <string name="StartupLoading">Caricamento di [APP_NAME]...</string>
- <string name="StartupClearingCache">Pulizia della cache...</string>
- <string name="StartupInitializingTextureCache">Inizializzazione della cache texture...</string>
- <string name="StartupRequireDriverUpdate">Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica!</string>
- <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>
- <string name="BuildConfig">Configurazione struttura [BUILD_CONFIG]</string>
- <string name="AboutPosition">Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Megapahit
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ MEGAPAHIT
+ </string>
+ <string name="SUPPORT_SITE">
+ Portale di supporto di Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Ricerca hardware...
+ </string>
+ <string name="StartupLoading">
+ Caricamento di [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Pulizia della cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Inizializzazione della cache texture...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica!
+ </string>
+ <string name="AboutHeader">
+ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </string>
+ <string name="BuildConfig">
+ Configurazione struttura [BUILD_CONFIG]
+ </string>
+ <string name="AboutPosition">
+ Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(coordinate globali [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]</string>
- <string name="AboutSystem">CPU: [CPU]
+[SERVER_RELEASE_NOTES_URL]
+ </string>
+ <string name="AboutSystem">
+ CPU: [CPU]
Memoria: [MEMORY_MB] MB
Versione sistema operativo: [OS_VERSION]
Venditore scheda grafica: [GRAPHICS_CARD_VENDOR]
-Scheda grafica: [GRAPHICS_CARD]</string>
- <string name="AboutDriver">Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION]</string>
- <string name="AboutOGL">Versione OpenGL: [OPENGL_VERSION]</string>
- <string name="AboutSettings">Dimensione finestra: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Scheda grafica: [GRAPHICS_CARD]
+ </string>
+ <string name="AboutDriver">
+ Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION]
+ </string>
+ <string name="AboutOGL">
+ Versione OpenGL: [OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Dimensione finestra: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
Regolazione dimensioni carattere: [FONT_SIZE_ADJUSTMENT]pt
Scala UI: [UI_SCALE]
Distanza visualizzazione: [DRAW_DISTANCE]m
Larghezza banda: [NET_BANDWITH]kbit/s
Fattore livello di dettaglio: [LOD_FACTOR]
Qualità di rendering: [RENDER_QUALITY]
-Memoria texture: [TEXTURE_MEMORY]MB</string>
- <string name="AboutOSXHiDPI">Modalità display HiDPI: [HIDPI]</string>
- <string name="AboutLibs">J2C Versione decoder: [J2C_VERSION]
+Memoria texture: [TEXTURE_MEMORY]MB
+ </string>
+ <string name="AboutOSXHiDPI">
+ Modalità display HiDPI: [HIDPI]
+ </string>
+ <string name="AboutLibs">
+ J2C Versione decoder: [J2C_VERSION]
Versione del driver audio: [AUDIO_DRIVER_VERSION][LIBCEF_VERSION]
Versione LibVLC: [LIBVLC_VERSION]
-Versione server voce: [VOICE_VERSION]</string>
- <string name="AboutTraffic">Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>
- <string name="AboutTime">[day, datetime, slt] [month, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>
- <string name="ErrorFetchingServerReleaseNotesURL">Errore nel recupero URL note rilascio versione</string>
- <string name="BuildConfiguration">Costruisci configurazione</string>
- <string name="ProgressRestoring">Ripristino in corso...</string>
- <string name="ProgressChangingResolution">Modifica della risoluzione...</string>
- <string name="Fullbright">Luminosità massima (vers. precedente)</string>
- <string name="LoginInProgress">In connessione. [APP_NAME] può sembrare rallentata. Attendi.</string>
- <string name="LoginInProgressNoFrozen">Accesso in corso...</string>
- <string name="LoginAuthenticating">In autenticazione</string>
- <string name="LoginMaintenance">Aggiornamento account in corso...</string>
- <string name="LoginAttempt">Un precedente tentativo di login è fallito. Tentativo di connessione [NUMBER]</string>
- <string name="LoginPrecaching">Sto caricando [SECOND_LIFE]...</string>
- <string name="LoginInitializingBrowser">Inizializzazione del browser web incorporato...</string>
- <string name="LoginInitializingMultimedia">Inizializzazione dati multimediali...</string>
- <string name="LoginInitializingFonts">Caricamento caratteri...</string>
- <string name="LoginVerifyingCache">Verifica file della cache (tempo previsto 60-90 secondi)...</string>
- <string name="LoginProcessingResponse">Elaborazione risposta...</string>
- <string name="LoginInitializingWorld">Inizializzazione mondo...</string>
- <string name="LoginDecodingImages">Decodifica immagini...</string>
- <string name="LoginInitializingQuicktime">Inizializzazione QuickTime...</string>
- <string name="LoginQuicktimeNotFound">QuickTime non trovato - impossibile inizializzare.</string>
- <string name="LoginQuicktimeOK">QuickTime configurato con successo.</string>
- <string name="LoginRequestSeedCapGrant">Richiesta capacità regione...</string>
- <string name="LoginRetrySeedCapGrant">Richiesta capacità regione, tentativo [NUMBER]...</string>
- <string name="LoginWaitingForRegionHandshake">In attesa della risposta della regione...</string>
- <string name="LoginConnectingToRegion">Connessione alla regione...</string>
- <string name="LoginDownloadingClothing">Sto caricando i vestiti...</string>
- <string name="InvalidCertificate">Il server ha inviato un certificato non valido o errato. Rivolgiti all'amministratore della griglia.</string>
- <string name="CertInvalidHostname">Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia.</string>
- <string name="CertExpired">Il certificato inviato dalla griglia sembra essere scaduto. Controlla l'orologio del sistema o rivolgiti all'amministratore della griglia.</string>
- <string name="CertKeyUsage">Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all'amministratore della griglia.</string>
- <string name="CertBasicConstraints">Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all'amministratore della griglia.</string>
- <string name="CertInvalidSignature">Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all'amministratore della griglia.</string>
- <string name="LoginFailedNoNetwork">Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione.</string>
- <string name="LoginFailedHeader">Accesso non riuscito.</string>
- <string name="Quit">Esci</string>
- <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
- <string name="AgniGridLabel">Griglia principale di Second Life (Agni)</string>
- <string name="AditiGridLabel">Griglia per beta test di Second Life (Aditi)</string>
- <string name="ViewerDownloadURL">http://secondlife.com/download.</string>
- <string name="LoginFailedViewerNotPermitted">Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer:
+Versione server voce: [VOICE_VERSION]
+ </string>
+ <string name="AboutTraffic">
+ Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </string>
+ <string name="AboutTime">
+ [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
+ <string name="ErrorFetchingServerReleaseNotesURL">
+ Errore nel recupero URL note rilascio versione
+ </string>
+ <string name="BuildConfiguration">
+ Costruisci configurazione
+ </string>
+ <string name="ProgressRestoring">
+ Ripristino in corso...
+ </string>
+ <string name="ProgressChangingResolution">
+ Modifica della risoluzione...
+ </string>
+ <string name="Fullbright">
+ Luminosità massima (vers. precedente)
+ </string>
+ <string name="LoginInProgress">
+ In connessione. [APP_NAME] può sembrare rallentata. Attendi.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Accesso in corso...
+ </string>
+ <string name="LoginAuthenticating">
+ In autenticazione
+ </string>
+ <string name="LoginMaintenance">
+ Aggiornamento account in corso...
+ </string>
+ <string name="LoginAttempt">
+ Un precedente tentativo di login è fallito. Tentativo di connessione [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Sto caricando [SECOND_LIFE]...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Inizializzazione del browser web incorporato...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Inizializzazione dati multimediali...
+ </string>
+ <string name="LoginInitializingFonts">
+ Caricamento caratteri...
+ </string>
+ <string name="LoginVerifyingCache">
+ Verifica file della cache (tempo previsto 60-90 secondi)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Elaborazione risposta...
+ </string>
+ <string name="LoginInitializingWorld">
+ Inizializzazione mondo...
+ </string>
+ <string name="LoginDecodingImages">
+ Decodifica immagini...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Inizializzazione QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime non trovato - impossibile inizializzare.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime configurato con successo.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Richiesta capacità regione...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Richiesta capacità regione, tentativo [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ In attesa della risposta della regione...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Connessione alla regione...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Sto caricando i vestiti...
+ </string>
+ <string name="InvalidCertificate">
+ Il server ha inviato un certificato non valido o errato. Rivolgiti all'amministratore della griglia.
+ </string>
+ <string name="CertInvalidHostname">
+ Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia.
+ </string>
+ <string name="CertExpired">
+ Il certificato inviato dalla griglia sembra essere scaduto. Controlla l'orologio del sistema o rivolgiti all'amministratore della griglia.
+ </string>
+ <string name="CertKeyUsage">
+ Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all'amministratore della griglia.
+ </string>
+ <string name="CertBasicConstraints">
+ Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all'amministratore della griglia.
+ </string>
+ <string name="CertInvalidSignature">
+ Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all'amministratore della griglia.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione.
+ </string>
+ <string name="LoginFailedHeader">
+ Accesso non riuscito.
+ </string>
+ <string name="Quit">
+ Esci
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/?sourceid=[sourceid]
+ </string>
+ <string name="AgniGridLabel">
+ Griglia principale di Second Life (Agni)
+ </string>
+ <string name="AditiGridLabel">
+ Griglia per beta test di Second Life (Aditi)
+ </string>
+ <string name="ViewerDownloadURL">
+ http://secondlife.com/download.
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer:
http://secondlife.com/download.
Per maggiori informazioni, consulta le domande frequenti alla pagina seguente:
-http://secondlife.com/viewer-access-faq</string>
- <string name="LoginIntermediateOptionalUpdateAvailable">Disponibile aggiornamento facoltativo viewer: [VERSION]</string>
- <string name="LoginFailedRequiredUpdate">Aggernamento viewer richiesto: [VERSION]</string>
- <string name="LoginFailedAlreadyLoggedIn">Questo agente ha già eseguito il login.</string>
- <string name="LoginFailedAuthenticationFailed">Siamo spiacenti. Il tentativo di accesso non è riuscito.
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Disponibile aggiornamento facoltativo viewer: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Aggernamento viewer richiesto: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Questo agente ha già eseguito il login.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Siamo spiacenti. Il tentativo di accesso non è riuscito.
Verifica di avere inserito correttamente
* Nome utente (come robby12 o Stella Soleggiato)
* Password
-Verifica anche che il blocco delle maiuscole non sia attivato.</string>
- <string name="LoginFailedPasswordChanged">Come misura precauzionale, la tua password è stata cambiata.
+Verifica anche che il blocco delle maiuscole non sia attivato.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Come misura precauzionale, la tua password è stata cambiata.
Visita la pagina del tuo account a http://secondlife.com/password
e rispondi alla domanda di sicurezza per reimpostare la password.
-Ci scusiamo per l'inconveniente.</string>
- <string name="LoginFailedPasswordReset">Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password.
+Ci scusiamo per l'inconveniente.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password.
Visita la pagina del tuo account a http://secondlife.com/password
e rispondi alla domanda di sicurezza per reimpostare la password.
-Ci scusiamo per l'inconveniente.</string>
- <string name="LoginFailedEmployeesOnly">Second Life è chiuso temporaneamente per manutenzione.
+Ci scusiamo per l'inconveniente.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life è chiuso temporaneamente per manutenzione.
Al momento, solo i dipendenti possono eseguire l'accesso.
-Visita www.secondlife.com/status per aggiornamenti.</string>
- <string name="LoginFailedPremiumOnly">L'accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile.
+Visita www.secondlife.com/status per aggiornamenti.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ L'accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile.
-Le persone con account gratuiti non potranno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life.</string>
- <string name="LoginFailedComputerProhibited">Non si può accedere a Second Life da questo computer.
+Le persone con account gratuiti non potranno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Non si può accedere a Second Life da questo computer.
Se ritieni che si tratta di un errore, contatta
-support@secondlife.com.</string>
- <string name="LoginFailedAcountSuspended">Il tuo account non è accessibile fino alle
-[TIME] fuso orario del Pacifico.</string>
- <string name="LoginFailedAccountDisabled">Non siamo attualmente in grado di completare la tua richiesta.
-Contatta l'assistenza Second Life alla pagina http://support.secondlife.com.</string>
- <string name="LoginFailedTransformError">Dati incompatibili rilevati durante l'accesso.
-Contattare support@secondlife.com.</string>
- <string name="LoginFailedAccountMaintenance">Il tuo account è in fase di leggera manutenzione.
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Il tuo account non è accessibile fino alle
+[TIME] fuso orario del Pacifico.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Non siamo attualmente in grado di completare la tua richiesta.
+Contatta l'assistenza Second Life alla pagina http://support.secondlife.com.
+ </string>
+ <string name="LoginFailedTransformError">
+ Dati incompatibili rilevati durante l'accesso.
+Contattare support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Il tuo account è in fase di leggera manutenzione.
Il tuo account non è accessibile fino alle
[TIME] fuso orario del Pacifico.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string>
- <string name="LoginFailedPendingLogoutFault">Errore del simulatore in seguito alla richiesta di logout.</string>
- <string name="LoginFailedPendingLogout">Il sistema sta eseguendo il logout in questo momento.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="LoginFailedUnableToCreateSession">Non è possibile creare una sessione valida.</string>
- <string name="LoginFailedUnableToConnectToSimulator">Non è possibile collegarsi a un simulatore.</string>
- <string name="LoginFailedRestrictedHours">Il tuo account può accedere a Second Life solo
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Errore del simulatore in seguito alla richiesta di logout.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Il sistema sta eseguendo il logout in questo momento.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Non è possibile creare una sessione valida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Non è possibile collegarsi a un simulatore.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Il tuo account può accedere a Second Life solo
tra le [START] e le [END] fuso orario del Pacifico.
Torna durante quell'orario.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string>
- <string name="LoginFailedIncorrectParameters">Parametri errati.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string>
- <string name="LoginFailedFirstNameNotAlphanumeric">Il parametro Nome deve includere solo caratteri alfanumerici.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string>
- <string name="LoginFailedLastNameNotAlphanumeric">Il parametro Cognome deve includere solo caratteri alfanumerici.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string>
- <string name="LogoutFailedRegionGoingOffline">La regione sta passando allo stato non in linea.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="LogoutFailedAgentNotInRegion">L'agente non è nella regione.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="LogoutFailedPendingLogin">La regione ha eseguito l'accesso in un'altre sessione.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="LogoutFailedLoggingOut">La regione stava eseguendo il logout della sessione precedente.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="LogoutFailedStillLoggingOut">La regione sta ancora eseguendo il logout della sessione precedente.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="LogoutSucceeded">La regione ha eseguito il logout dell'ultima sessione.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="LogoutFailedLogoutBegun">La regione ha iniziato la procedura di logout.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="LoginFailedLoggingOutSession">Il sistema ha iniziato il logout dell'ultima sessione.
-Prova ad accedere nuovamente tra un minuto.</string>
- <string name="AgentLostConnection">Questa regione sta avendo problemi. Verifica la tua connessione a Internet.</string>
- <string name="SavingSettings">Salvataggio delle impostazioni...</string>
- <string name="LoggingOut">Uscita...</string>
- <string name="ShuttingDown">Chiusura...</string>
- <string name="YouHaveBeenDisconnected">Sei scollegato dalla regione in cui ti trovavi.</string>
- <string name="SentToInvalidRegion">Sei stato indirizzato in una regione non valida.</string>
- <string name="TestingDisconnect">Verifica scollegamento viewer</string>
- <string name="SocialFacebookConnecting">Connessione a Facebook in corso...</string>
- <string name="SocialFacebookPosting">Caricamento post...</string>
- <string name="SocialFacebookDisconnecting">Disconnessione da Facebook in corso...</string>
- <string name="SocialFacebookErrorConnecting">Problemi con la connessione a Facebook</string>
- <string name="SocialFacebookErrorPosting">Problemi con la connessione a Facebook</string>
- <string name="SocialFacebookErrorDisconnecting">Problemi con la disconnessione da Facebook</string>
- <string name="SocialFlickrConnecting">Collegamento a Flickr...</string>
- <string name="SocialFlickrPosting">Caricamento post...</string>
- <string name="SocialFlickrDisconnecting">Interruzione del collegamento con Flickr...</string>
- <string name="SocialFlickrErrorConnecting">Problema nel collegamento a Flickr</string>
- <string name="SocialFlickrErrorPosting">Problema nel caricamento post su Flickr</string>
- <string name="SocialFlickrErrorDisconnecting">Problema nell'interruzione del collegamento da Flickr</string>
- <string name="SocialTwitterConnecting">Collegamento a Twitter...</string>
- <string name="SocialTwitterPosting">Caricamento post...</string>
- <string name="SocialTwitterDisconnecting">Interruzione del collegamento con Twitter...</string>
- <string name="SocialTwitterErrorConnecting">Problema nel collegamento a Twitter</string>
- <string name="SocialTwitterErrorPosting">Problema nel caricamento post su Twitter</string>
- <string name="SocialTwitterErrorDisconnecting">Problema nell'interruzione del collegamento da Twitter</string>
- <string name="BlackAndWhite">Bianco e nero</string>
- <string name="Colors1970">Colori anni '70</string>
- <string name="Intense">Intenso</string>
- <string name="Newspaper">Giornale</string>
- <string name="Sepia">Seppia</string>
- <string name="Spotlight">Faretto</string>
- <string name="Video">Video</string>
- <string name="Autocontrast">Auto contrasto</string>
- <string name="LensFlare">Bagliore</string>
- <string name="Miniature">Miniatura</string>
- <string name="Toycamera">Toy camera</string>
- <string name="TooltipPerson">Persona</string>
- <string name="TooltipNoName">(nessun nome)</string>
- <string name="TooltipOwner">Proprietario:</string>
- <string name="TooltipPublic">Pubblico</string>
- <string name="TooltipIsGroup">(Gruppo)</string>
- <string name="TooltipForSaleL$">In Vendita: [AMOUNT]L$</string>
- <string name="TooltipFlagGroupBuild">Costruzione solo con gruppo</string>
- <string name="TooltipFlagNoBuild">Divieto di Costruire</string>
- <string name="TooltipFlagNoEdit">Costruzione solo con gruppo</string>
- <string name="TooltipFlagNotSafe">Non Sicuro</string>
- <string name="TooltipFlagNoFly">Divieto di Volare</string>
- <string name="TooltipFlagGroupScripts">Script solo con gruppo</string>
- <string name="TooltipFlagNoScripts">Script vietati</string>
- <string name="TooltipLand">Terreno:</string>
- <string name="TooltipMustSingleDrop">Solo un singolo oggetto può essere creato qui</string>
- <string name="TooltipTooManyWearables">Non puoi indossare una cartella che contiene più di [AMOUNT] elementi. Per modificare questo limite, accedi ad Avanzate &gt; Mostra impostazioni di debug &gt; WearFolderLimit.</string>
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parametri errati.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Il parametro Nome deve includere solo caratteri alfanumerici.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Il parametro Cognome deve includere solo caratteri alfanumerici.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La regione sta passando allo stato non in linea.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ L'agente non è nella regione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ La regione ha eseguito l'accesso in un'altre sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ La regione stava eseguendo il logout della sessione precedente.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ La regione sta ancora eseguendo il logout della sessione precedente.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutSucceeded">
+ La regione ha eseguito il logout dell'ultima sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ La regione ha iniziato la procedura di logout.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Il sistema ha iniziato il logout dell'ultima sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="AgentLostConnection">
+ Questa regione sta avendo problemi. Verifica la tua connessione a Internet.
+ </string>
+ <string name="SavingSettings">
+ Salvataggio delle impostazioni...
+ </string>
+ <string name="LoggingOut">
+ Uscita...
+ </string>
+ <string name="ShuttingDown">
+ Chiusura...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Sei scollegato dalla regione in cui ti trovavi.
+ </string>
+ <string name="SentToInvalidRegion">
+ Sei stato indirizzato in una regione non valida.
+ </string>
+ <string name="TestingDisconnect">
+ Verifica scollegamento viewer
+ </string>
+ <string name="SocialFacebookConnecting">
+ Connessione a Facebook in corso...
+ </string>
+ <string name="SocialFacebookPosting">
+ Caricamento post...
+ </string>
+ <string name="SocialFacebookDisconnecting">
+ Disconnessione da Facebook in corso...
+ </string>
+ <string name="SocialFacebookErrorConnecting">
+ Problemi con la connessione a Facebook
+ </string>
+ <string name="SocialFacebookErrorPosting">
+ Problemi con la connessione a Facebook
+ </string>
+ <string name="SocialFacebookErrorDisconnecting">
+ Problemi con la disconnessione da Facebook
+ </string>
+ <string name="SocialFlickrConnecting">
+ Collegamento a Flickr...
+ </string>
+ <string name="SocialFlickrPosting">
+ Caricamento post...
+ </string>
+ <string name="SocialFlickrDisconnecting">
+ Interruzione del collegamento con Flickr...
+ </string>
+ <string name="SocialFlickrErrorConnecting">
+ Problema nel collegamento a Flickr
+ </string>
+ <string name="SocialFlickrErrorPosting">
+ Problema nel caricamento post su Flickr
+ </string>
+ <string name="SocialFlickrErrorDisconnecting">
+ Problema nell'interruzione del collegamento da Flickr
+ </string>
+ <string name="SocialTwitterConnecting">
+ Collegamento a Twitter...
+ </string>
+ <string name="SocialTwitterPosting">
+ Caricamento post...
+ </string>
+ <string name="SocialTwitterDisconnecting">
+ Interruzione del collegamento con Twitter...
+ </string>
+ <string name="SocialTwitterErrorConnecting">
+ Problema nel collegamento a Twitter
+ </string>
+ <string name="SocialTwitterErrorPosting">
+ Problema nel caricamento post su Twitter
+ </string>
+ <string name="SocialTwitterErrorDisconnecting">
+ Problema nell'interruzione del collegamento da Twitter
+ </string>
+ <string name="BlackAndWhite">
+ Bianco e nero
+ </string>
+ <string name="Colors1970">
+ Colori anni '70
+ </string>
+ <string name="Intense">
+ Intenso
+ </string>
+ <string name="Newspaper">
+ Giornale
+ </string>
+ <string name="Sepia">
+ Seppia
+ </string>
+ <string name="Spotlight">
+ Faretto
+ </string>
+ <string name="Video">
+ Video
+ </string>
+ <string name="Autocontrast">
+ Auto contrasto
+ </string>
+ <string name="LensFlare">
+ Bagliore
+ </string>
+ <string name="Miniature">
+ Miniatura
+ </string>
+ <string name="Toycamera">
+ Toy camera
+ </string>
+ <string name="TooltipPerson">
+ Persona
+ </string>
+ <string name="TooltipNoName">
+ (nessun nome)
+ </string>
+ <string name="TooltipOwner">
+ Proprietario:
+ </string>
+ <string name="TooltipPublic">
+ Pubblico
+ </string>
+ <string name="TooltipIsGroup">
+ (Gruppo)
+ </string>
+ <string name="TooltipForSaleL$">
+ In Vendita: [AMOUNT]L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Costruzione solo con gruppo
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Divieto di Costruire
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Costruzione solo con gruppo
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Non Sicuro
+ </string>
+ <string name="TooltipFlagNoFly">
+ Divieto di Volare
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Script solo con gruppo
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Script vietati
+ </string>
+ <string name="TooltipLand">
+ Terreno:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Solo un singolo oggetto può essere creato qui
+ </string>
+ <string name="TooltipTooManyWearables">
+ Non puoi indossare una cartella che contiene più di [AMOUNT] elementi. Per modificare questo limite, accedi ad Avanzate &gt; Mostra impostazioni di debug &gt; WearFolderLimit.
+ </string>
<string name="TooltipPrice" value="L$ [AMOUNT]:"/>
- <string name="TooltipSLIcon">Questo link porta a una pagina nel dominio ufficiale SecondLife.com o LindenLab.com.</string>
- <string name="TooltipOutboxDragToWorld">Non puoi rezzare articoli dalla cartella degli annunci di Marketplace</string>
- <string name="TooltipOutboxWorn">Non puoi inserire nella cartella degli annunci in Marketplace gli articoli che indossi</string>
- <string name="TooltipOutboxFolderLevels">La profondità delle caselle nidificate è maggiore di [AMOUNT]. Diminuisci la profondità delle cartelle nidificate; se necessario, raggruppa gli articoli.</string>
- <string name="TooltipOutboxTooManyFolders">Il numero di sottocartelle è maggiore di [AMOUNT]. Diminuisci il numero delle cartelle nel tuo annuncio; se necessario, raggruppa gli articoli.</string>
- <string name="TooltipOutboxTooManyObjects">Il numero di articoli è maggiore di [AMOUNT]. Per vendere più di [AMOUNT] articoli in un annuncio, devi raggruppare alcuni di essi.</string>
- <string name="TooltipOutboxTooManyStockItems">Il numero di articoli in magazzino è maggiore di [AMOUNT].</string>
- <string name="TooltipOutboxCannotDropOnRoot">Puoi trascinare elementi o cartelle solo nelle schede TUTTI o NON ASSOCIATO. Seleziona una di quelle schede e sposta nuovamente gli elementi o le cartelle.</string>
- <string name="TooltipOutboxNoTransfer">Almeno uno di questi oggetti non può essere venduto o trasferito</string>
- <string name="TooltipOutboxNotInInventory">Puoi aggiungere a Marketplace solo gli articoli nel tuo inventario</string>
- <string name="TooltipOutboxLinked">Non puoi inserire cartelle o articoli collegati tramite link nel Marketplace</string>
- <string name="TooltipOutboxCallingCard">Non puoi inserire biglietti da visita in Marketplace</string>
- <string name="TooltipOutboxDragActive">non puoi muovere un annuncio attivo</string>
- <string name="TooltipOutboxCannotMoveRoot">Non puoi spostare la cartella principale degli annunci di Marketplace</string>
- <string name="TooltipOutboxMixedStock">Tutti gli articoli in una cartella di magazzino devono essere dello stesso tipo e con le stesse autorizzazioni</string>
- <string name="TooltipDragOntoOwnChild">Non puoi spostare una cartella nella relativa cartella secondaria</string>
- <string name="TooltipDragOntoSelf">Non puoi spostare una cartella in se stessa</string>
- <string name="TooltipHttpUrl">Clicca per visitare questa pagina web</string>
- <string name="TooltipSLURL">Clicca per avere maggiori informazioni sul luogo</string>
- <string name="TooltipAgentUrl">Clicca per vedere il profilo di questo residente</string>
- <string name="TooltipAgentInspect">Ulteriori informazioni su questo Residente</string>
- <string name="TooltipAgentMute">Clicca per disattivare l'audio di questo residente</string>
- <string name="TooltipAgentUnmute">Clicca per attivare l'audio del residente</string>
- <string name="TooltipAgentIM">Clicca per inviare un IM a questo residente</string>
- <string name="TooltipAgentPay">Clicca per pagare il residente</string>
- <string name="TooltipAgentOfferTeleport">Fai clic per inviare un'offerta di teleport al residente</string>
- <string name="TooltipAgentRequestFriend">Fai clic per inviare una richiesta di amicizia al residente</string>
- <string name="TooltipGroupUrl">Clicca per vedere la descrizione del gruppo</string>
- <string name="TooltipEventUrl">Clicca per vedere la descrizione dell'evento</string>
- <string name="TooltipClassifiedUrl">Clicca per vedere questa inserzione</string>
- <string name="TooltipParcelUrl">Clicca per vedere la descrizione del lotto</string>
- <string name="TooltipTeleportUrl">Clicca per effettuare il teleport a questa destinazione</string>
- <string name="TooltipObjectIMUrl">Clicca per vedere la descrizione dell'oggetto</string>
- <string name="TooltipMapUrl">Clicca per vedere questo posto sulla mappa</string>
- <string name="TooltipSLAPP">Clicca per avviare il comando secondlife://</string>
+ <string name="TooltipSLIcon">
+ Questo link porta a una pagina nel dominio ufficiale SecondLife.com o LindenLab.com.
+ </string>
+ <string name="TooltipOutboxDragToWorld">
+ Non puoi rezzare articoli dalla cartella degli annunci di Marketplace
+ </string>
+ <string name="TooltipOutboxWorn">
+ Non puoi inserire nella cartella degli annunci in Marketplace gli articoli che indossi
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ La profondità delle caselle nidificate è maggiore di [AMOUNT]. Diminuisci la profondità delle cartelle nidificate; se necessario, raggruppa gli articoli.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Il numero di sottocartelle è maggiore di [AMOUNT]. Diminuisci il numero delle cartelle nel tuo annuncio; se necessario, raggruppa gli articoli.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Il numero di articoli è maggiore di [AMOUNT]. Per vendere più di [AMOUNT] articoli in un annuncio, devi raggruppare alcuni di essi.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Il numero di articoli in magazzino è maggiore di [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Puoi trascinare elementi o cartelle solo nelle schede TUTTI o NON ASSOCIATO. Seleziona una di quelle schede e sposta nuovamente gli elementi o le cartelle.
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Almeno uno di questi oggetti non può essere venduto o trasferito
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Puoi aggiungere a Marketplace solo gli articoli nel tuo inventario
+ </string>
+ <string name="TooltipOutboxLinked">
+ Non puoi inserire cartelle o articoli collegati tramite link nel Marketplace
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Non puoi inserire biglietti da visita in Marketplace
+ </string>
+ <string name="TooltipOutboxDragActive">
+ non puoi muovere un annuncio attivo
+ </string>
+ <string name="TooltipOutboxCannotMoveRoot">
+ Non puoi spostare la cartella principale degli annunci di Marketplace
+ </string>
+ <string name="TooltipOutboxMixedStock">
+ Tutti gli articoli in una cartella di magazzino devono essere dello stesso tipo e con le stesse autorizzazioni
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Non puoi spostare una cartella nella relativa cartella secondaria
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Non puoi spostare una cartella in se stessa
+ </string>
+ <string name="TooltipHttpUrl">
+ Clicca per visitare questa pagina web
+ </string>
+ <string name="TooltipSLURL">
+ Clicca per avere maggiori informazioni sul luogo
+ </string>
+ <string name="TooltipAgentUrl">
+ Clicca per vedere il profilo di questo residente
+ </string>
+ <string name="TooltipAgentInspect">
+ Ulteriori informazioni su questo Residente
+ </string>
+ <string name="TooltipAgentMute">
+ Clicca per disattivare l'audio di questo residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Clicca per attivare l'audio del residente
+ </string>
+ <string name="TooltipAgentIM">
+ Clicca per inviare un IM a questo residente
+ </string>
+ <string name="TooltipAgentPay">
+ Clicca per pagare il residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Fai clic per inviare un'offerta di teleport al residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Fai clic per inviare una richiesta di amicizia al residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Clicca per vedere la descrizione del gruppo
+ </string>
+ <string name="TooltipEventUrl">
+ Clicca per vedere la descrizione dell'evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Clicca per vedere questa inserzione
+ </string>
+ <string name="TooltipParcelUrl">
+ Clicca per vedere la descrizione del lotto
+ </string>
+ <string name="TooltipTeleportUrl">
+ Clicca per effettuare il teleport a questa destinazione
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Clicca per vedere la descrizione dell'oggetto
+ </string>
+ <string name="TooltipMapUrl">
+ Clicca per vedere questo posto sulla mappa
+ </string>
+ <string name="TooltipSLAPP">
+ Clicca per avviare il comando secondlife://
+ </string>
<string name="CurrentURL" value="URL attuale: [CurrentURL]"/>
- <string name="TooltipEmail">Fai clic per comporre un'email</string>
- <string name="SLurlLabelTeleport">Teleportati a</string>
- <string name="SLurlLabelShowOnMap">Mostra la mappa per</string>
- <string name="SLappAgentMute">Disattiva audio</string>
- <string name="SLappAgentUnmute">Riattiva audio</string>
- <string name="SLappAgentIM">IM</string>
- <string name="SLappAgentPay">Paga</string>
- <string name="SLappAgentOfferTeleport">Offri teleport a</string>
- <string name="SLappAgentRequestFriend">Richiesta di amicizia</string>
- <string name="SLappAgentRemoveFriend">Rimozione amico</string>
- <string name="BUTTON_CLOSE_DARWIN">Chiudi (⌘W)</string>
- <string name="BUTTON_CLOSE_WIN">Chiudi (Ctrl+W)</string>
- <string name="BUTTON_CLOSE_CHROME">Chiudi</string>
- <string name="BUTTON_RESTORE">Ripristina</string>
- <string name="BUTTON_MINIMIZE">Minimizza</string>
- <string name="BUTTON_TEAR_OFF">Distacca</string>
- <string name="BUTTON_DOCK">Àncora</string>
- <string name="BUTTON_HELP">Mostra Aiuto</string>
- <string name="TooltipNotecardNotAllowedTypeDrop">Oggetti di questo tipo non possono essere allegati ai
-biglietti in questa regione.</string>
- <string name="TooltipNotecardOwnerRestrictedDrop">Solamente gli oggetti con autorizzazioni
+ <string name="TooltipEmail">
+ Fai clic per comporre un'email
+ </string>
+ <string name="SLurlLabelTeleport">
+ Teleportati a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostra la mappa per
+ </string>
+ <string name="SLappAgentMute">
+ Disattiva audio
+ </string>
+ <string name="SLappAgentUnmute">
+ Riattiva audio
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Paga
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Offri teleport a
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Richiesta di amicizia
+ </string>
+ <string name="SLappAgentRemoveFriend">
+ Rimozione amico
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Chiudi (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Chiudi (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Chiudi
+ </string>
+ <string name="BUTTON_RESTORE">
+ Ripristina
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizza
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Distacca
+ </string>
+ <string name="BUTTON_DOCK">
+ Àncora
+ </string>
+ <string name="BUTTON_HELP">
+ Mostra Aiuto
+ </string>
+ <string name="TooltipNotecardNotAllowedTypeDrop">
+ Oggetti di questo tipo non possono essere allegati ai
+biglietti in questa regione.
+ </string>
+ <string name="TooltipNotecardOwnerRestrictedDrop">
+ Solamente gli oggetti con autorizzazioni
illimitate al “proprietario successivo”
-possono essere allegati ai biglietti.</string>
- <string name="Searching">Ricerca in corso...</string>
- <string name="NoneFound">Nessun risultato.</string>
- <string name="RetrievingData">Recupero dati in corso...</string>
- <string name="ReleaseNotes">Note sulla versione</string>
- <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string>
- <string name="LoadingData">In caricamento...</string>
- <string name="AvatarNameNobody">(nessuno)</string>
- <string name="AvatarNameWaiting">(in attesa)</string>
- <string name="GroupNameNone">(nessuno)</string>
- <string name="AssetErrorNone">Nessun errore</string>
- <string name="AssetErrorRequestFailed">Richiesta risorsa: fallita</string>
- <string name="AssetErrorNonexistentFile">Richiesta risorsa: file non esistente</string>
- <string name="AssetErrorNotInDatabase">Richiesta risorsa: risorsa non trovata nel database</string>
- <string name="AssetErrorEOF">Fine del file</string>
- <string name="AssetErrorCannotOpenFile">Apertura del file non possibile</string>
- <string name="AssetErrorFileNotFound">File non trovato</string>
- <string name="AssetErrorTCPTimeout">Tempo esaurito per il trasferimento file</string>
- <string name="AssetErrorCircuitGone">Circuito perso</string>
- <string name="AssetErrorPriceMismatch">Il programma e il server non combaciano nel prezzo</string>
- <string name="AssetErrorUnknownStatus">Stato sconosciuto</string>
- <string name="AssetUploadServerUnreacheble">Servizio non raggiungibile.</string>
- <string name="AssetUploadServerDifficulties">Il servizio sta riscontrando difficoltà inaspettate.</string>
- <string name="AssetUploadServerUnavaliable">Servizio non disponibile o limite di tempo per il caricamento raggiunto.</string>
- <string name="AssetUploadRequestInvalid">Errore nella richiesta di caricamento. Vai alla pagina
-http://secondlife.com/support per risolvere il problema.</string>
- <string name="SettingValidationError">Impossibile convalidare le impostazioni importate [NAME]</string>
- <string name="SettingImportFileError">Impossibile aprire il file [FILE]</string>
- <string name="SettingParseFileError">Impossibile aprire il file [FILE]</string>
- <string name="SettingTranslateError">Impossibile tradurre la legacy vento e luce [NAME]</string>
- <string name="texture">texture</string>
- <string name="sound">suono</string>
- <string name="calling card">biglietto da visita</string>
- <string name="landmark">punto di riferimento</string>
- <string name="legacy script">script (vecchia versione)</string>
- <string name="clothing">vestiario</string>
- <string name="object">oggetto</string>
- <string name="note card">biglietto</string>
- <string name="folder">cartella</string>
- <string name="root">cartella principale</string>
- <string name="lsl2 script">script LSL2</string>
- <string name="lsl bytecode">bytecode LSL</string>
- <string name="tga texture">tga texture</string>
- <string name="body part">parte del corpo</string>
- <string name="snapshot">fotografia</string>
- <string name="lost and found">oggetti smarriti</string>
- <string name="targa image">immagine targa</string>
- <string name="trash">Cestino</string>
- <string name="jpeg image">immagine jpeg</string>
- <string name="animation">animazione</string>
- <string name="gesture">gesture</string>
- <string name="simstate">simstate</string>
- <string name="favorite">preferiti</string>
- <string name="symbolic link">link</string>
- <string name="symbolic folder link">link alla cartella</string>
- <string name="settings blob">impostazioni</string>
- <string name="mesh">reticolo</string>
- <string name="AvatarEditingAppearance">(Modifica Aspetto)</string>
- <string name="AvatarAway">Assente</string>
- <string name="AvatarDoNotDisturb">Non disturbare</string>
- <string name="AvatarMuted">Mutato</string>
- <string name="anim_express_afraid">Dispiaciuto</string>
- <string name="anim_express_anger">Arrabbiato</string>
- <string name="anim_away">Assente</string>
- <string name="anim_backflip">Salto all'indietro</string>
- <string name="anim_express_laugh">Ridere a crepapelle</string>
- <string name="anim_express_toothsmile">Gran sorriso</string>
- <string name="anim_blowkiss">Lancia un bacio</string>
- <string name="anim_express_bored">Noia</string>
- <string name="anim_bow">Inchino</string>
- <string name="anim_clap">Applauso</string>
- <string name="anim_courtbow">Inchino a corte</string>
- <string name="anim_express_cry">Pianto</string>
- <string name="anim_dance1">Ballo 1</string>
- <string name="anim_dance2">Ballo 2</string>
- <string name="anim_dance3">Ballo 3</string>
- <string name="anim_dance4">Ballo 4</string>
- <string name="anim_dance5">Ballo 5</string>
- <string name="anim_dance6">Ballo 6</string>
- <string name="anim_dance7">Ballo 7</string>
- <string name="anim_dance8">Dance 8</string>
- <string name="anim_express_disdain">Sdegno</string>
- <string name="anim_drink">Bere</string>
- <string name="anim_express_embarrased">Imbarazzo</string>
- <string name="anim_angry_fingerwag">Negare col dito</string>
- <string name="anim_fist_pump">Esultare con pugno</string>
- <string name="anim_yoga_float">Yoga fluttuante</string>
- <string name="anim_express_frown">Acciglio</string>
- <string name="anim_impatient">Impazienza</string>
- <string name="anim_jumpforjoy">Salto di gioia</string>
- <string name="anim_kissmybutt">Baciami il sedere</string>
- <string name="anim_express_kiss">Bacio</string>
- <string name="anim_laugh_short">Risata</string>
- <string name="anim_musclebeach">Muscoli da spiaggia</string>
- <string name="anim_no_unhappy">No (Scontento)</string>
- <string name="anim_no_head">No</string>
- <string name="anim_nyanya">Na-na-na</string>
- <string name="anim_punch_onetwo">Uno-due pugno</string>
- <string name="anim_express_open_mouth">Bocca aperta</string>
- <string name="anim_peace">Pace</string>
- <string name="anim_point_you">Indicare altri</string>
- <string name="anim_point_me">Indicare te stesso</string>
- <string name="anim_punch_l">Pugno a sinistra</string>
- <string name="anim_punch_r">Pugno a destra</string>
- <string name="anim_rps_countdown">Contare nella morra cinese</string>
- <string name="anim_rps_paper">Carta nella morra cinese</string>
- <string name="anim_rps_rock">Sasso nella morra cinese</string>
- <string name="anim_rps_scissors">Forbici nella morra cinese</string>
- <string name="anim_express_repulsed">Repulsione</string>
- <string name="anim_kick_roundhouse_r">Calcio con rotazione</string>
- <string name="anim_express_sad">Triste</string>
- <string name="anim_salute">Saluto</string>
- <string name="anim_shout">Urlo</string>
- <string name="anim_express_shrug">Spallucce</string>
- <string name="anim_express_smile">Sorriso</string>
- <string name="anim_smoke_idle">Fumare</string>
- <string name="anim_smoke_inhale">Fumare inspirazione</string>
- <string name="anim_smoke_throw_down">Fumare mandando giù</string>
- <string name="anim_express_surprise">Sorpresa</string>
- <string name="anim_sword_strike_r">Colpo di spada</string>
- <string name="anim_angry_tantrum">Collera</string>
- <string name="anim_express_tongue_out">Linguaccia</string>
- <string name="anim_hello">Saluto con mano</string>
- <string name="anim_whisper">Sussurro</string>
- <string name="anim_whistle">Fischio</string>
- <string name="anim_express_wink">Ammicca</string>
- <string name="anim_wink_hollywood">Ammicca (Hollywood)</string>
- <string name="anim_express_worry">Preoccupato</string>
- <string name="anim_yes_happy">Si (Felice)</string>
- <string name="anim_yes_head">Si</string>
- <string name="multiple_textures">Multiple</string>
- <string name="use_texture">Usa texture</string>
- <string name="manip_hint1">Sposta il cursore sul righello</string>
- <string name="manip_hint2">per bloccare sulla griglia</string>
- <string name="texture_loading">Caricamento in corso...</string>
- <string name="worldmap_offline">Offline</string>
- <string name="worldmap_item_tooltip_format">L$ [PRICE] - [AREA] m²</string>
- <string name="worldmap_results_none_found">Nessun risultato.</string>
- <string name="Ok">OK</string>
- <string name="Premature end of file">Fine prematura del file</string>
- <string name="ST_NO_JOINT">Impossibile trovare ROOT o JOINT.</string>
- <string name="NearbyChatTitle">Chat nei dintorni</string>
- <string name="NearbyChatLabel">(Chat nei dintorni)</string>
- <string name="whisper">sussurra:</string>
- <string name="shout">grida:</string>
- <string name="ringing">In connessione alla Voice Chat in-world...</string>
- <string name="connected">Connesso</string>
- <string name="unavailable">Il voice non è disponibile nel posto dove ti trovi ora</string>
- <string name="hang_up">Disconnesso dalla Voice Chat in-world</string>
- <string name="reconnect_nearby">Sarai riconnesso alla chat vocale nei dintorni</string>
- <string name="ScriptQuestionCautionChatGranted">A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS].</string>
- <string name="ScriptQuestionCautionChatDenied">A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS].</string>
- <string name="AdditionalPermissionsRequestHeader">Se consenti l'accesso al tuo account, consentirai anche all'oggetto di:</string>
- <string name="ScriptTakeMoney">Prendere dollari Linden (L$) da te</string>
- <string name="ActOnControlInputs">Agire sul tuo controllo degli input</string>
- <string name="RemapControlInputs">Rimappare il tuo controllo degli input</string>
- <string name="AnimateYourAvatar">Animare il tuo avatar</string>
- <string name="AttachToYourAvatar">Far indossare al tuo avatar</string>
- <string name="ReleaseOwnership">Rilasciare la propietà è far diventare pubblico.</string>
- <string name="LinkAndDelink">Collegare e scollegare dagli altri oggetti</string>
- <string name="AddAndRemoveJoints">Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti</string>
- <string name="ChangePermissions">Cambiare i permessi</string>
- <string name="TrackYourCamera">Tracciare la fotocamera</string>
- <string name="ControlYourCamera">Controllare la tua fotocamera</string>
- <string name="TeleportYourAgent">Teleportarti</string>
- <string name="ForceSitAvatar">Forza l'avatar a sedersi</string>
- <string name="ChangeEnvSettings">Cambia le impostazioni dell’ambiente</string>
- <string name="AgentNameSubst">(Tu)</string>
+possono essere allegati ai biglietti.
+ </string>
+ <string name="Searching">
+ Ricerca in corso...
+ </string>
+ <string name="NoneFound">
+ Nessun risultato.
+ </string>
+ <string name="RetrievingData">
+ Recupero dati in corso...
+ </string>
+ <string name="ReleaseNotes">
+ Note sulla versione
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ https://megapahit.net/
+ </string>
+ <string name="LoadingData">
+ In caricamento...
+ </string>
+ <string name="AvatarNameNobody">
+ (nessuno)
+ </string>
+ <string name="AvatarNameWaiting">
+ (in attesa)
+ </string>
+ <string name="GroupNameNone">
+ (nessuno)
+ </string>
+ <string name="AssetErrorNone">
+ Nessun errore
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Richiesta risorsa: fallita
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Richiesta risorsa: file non esistente
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Richiesta risorsa: risorsa non trovata nel database
+ </string>
+ <string name="AssetErrorEOF">
+ Fine del file
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Apertura del file non possibile
+ </string>
+ <string name="AssetErrorFileNotFound">
+ File non trovato
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tempo esaurito per il trasferimento file
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuito perso
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Il programma e il server non combaciano nel prezzo
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Stato sconosciuto
+ </string>
+ <string name="AssetUploadServerUnreacheble">
+ Servizio non raggiungibile.
+ </string>
+ <string name="AssetUploadServerDifficulties">
+ Il servizio sta riscontrando difficoltà inaspettate.
+ </string>
+ <string name="AssetUploadServerUnavaliable">
+ Servizio non disponibile o limite di tempo per il caricamento raggiunto.
+ </string>
+ <string name="AssetUploadRequestInvalid">
+ Errore nella richiesta di caricamento. Vai alla pagina
+http://secondlife.com/support per risolvere il problema.
+ </string>
+ <string name="SettingValidationError">
+ Impossibile convalidare le impostazioni importate [NAME]
+ </string>
+ <string name="SettingImportFileError">
+ Impossibile aprire il file [FILE]
+ </string>
+ <string name="SettingParseFileError">
+ Impossibile aprire il file [FILE]
+ </string>
+ <string name="SettingTranslateError">
+ Impossibile tradurre la legacy vento e luce [NAME]
+ </string>
+ <string name="texture">
+ texture
+ </string>
+ <string name="sound">
+ suono
+ </string>
+ <string name="calling card">
+ biglietto da visita
+ </string>
+ <string name="landmark">
+ punto di riferimento
+ </string>
+ <string name="legacy script">
+ script (vecchia versione)
+ </string>
+ <string name="clothing">
+ vestiario
+ </string>
+ <string name="object">
+ oggetto
+ </string>
+ <string name="note card">
+ biglietto
+ </string>
+ <string name="folder">
+ cartella
+ </string>
+ <string name="root">
+ cartella principale
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ tga texture
+ </string>
+ <string name="body part">
+ parte del corpo
+ </string>
+ <string name="snapshot">
+ fotografia
+ </string>
+ <string name="lost and found">
+ oggetti smarriti
+ </string>
+ <string name="targa image">
+ immagine targa
+ </string>
+ <string name="trash">
+ Cestino
+ </string>
+ <string name="jpeg image">
+ immagine jpeg
+ </string>
+ <string name="animation">
+ animazione
+ </string>
+ <string name="gesture">
+ gesture
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ preferiti
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ link alla cartella
+ </string>
+ <string name="settings blob">
+ impostazioni
+ </string>
+ <string name="mesh">
+ reticolo
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Modifica Aspetto)
+ </string>
+ <string name="AvatarAway">
+ Assente
+ </string>
+ <string name="AvatarDoNotDisturb">
+ Non disturbare
+ </string>
+ <string name="AvatarMuted">
+ Mutato
+ </string>
+ <string name="anim_express_afraid">
+ Dispiaciuto
+ </string>
+ <string name="anim_express_anger">
+ Arrabbiato
+ </string>
+ <string name="anim_away">
+ Assente
+ </string>
+ <string name="anim_backflip">
+ Salto all'indietro
+ </string>
+ <string name="anim_express_laugh">
+ Ridere a crepapelle
+ </string>
+ <string name="anim_express_toothsmile">
+ Gran sorriso
+ </string>
+ <string name="anim_blowkiss">
+ Lancia un bacio
+ </string>
+ <string name="anim_express_bored">
+ Noia
+ </string>
+ <string name="anim_bow">
+ Inchino
+ </string>
+ <string name="anim_clap">
+ Applauso
+ </string>
+ <string name="anim_courtbow">
+ Inchino a corte
+ </string>
+ <string name="anim_express_cry">
+ Pianto
+ </string>
+ <string name="anim_dance1">
+ Ballo 1
+ </string>
+ <string name="anim_dance2">
+ Ballo 2
+ </string>
+ <string name="anim_dance3">
+ Ballo 3
+ </string>
+ <string name="anim_dance4">
+ Ballo 4
+ </string>
+ <string name="anim_dance5">
+ Ballo 5
+ </string>
+ <string name="anim_dance6">
+ Ballo 6
+ </string>
+ <string name="anim_dance7">
+ Ballo 7
+ </string>
+ <string name="anim_dance8">
+ Dance 8
+ </string>
+ <string name="anim_express_disdain">
+ Sdegno
+ </string>
+ <string name="anim_drink">
+ Bere
+ </string>
+ <string name="anim_express_embarrased">
+ Imbarazzo
+ </string>
+ <string name="anim_angry_fingerwag">
+ Negare col dito
+ </string>
+ <string name="anim_fist_pump">
+ Esultare con pugno
+ </string>
+ <string name="anim_yoga_float">
+ Yoga fluttuante
+ </string>
+ <string name="anim_express_frown">
+ Acciglio
+ </string>
+ <string name="anim_impatient">
+ Impazienza
+ </string>
+ <string name="anim_jumpforjoy">
+ Salto di gioia
+ </string>
+ <string name="anim_kissmybutt">
+ Baciami il sedere
+ </string>
+ <string name="anim_express_kiss">
+ Bacio
+ </string>
+ <string name="anim_laugh_short">
+ Risata
+ </string>
+ <string name="anim_musclebeach">
+ Muscoli da spiaggia
+ </string>
+ <string name="anim_no_unhappy">
+ No (Scontento)
+ </string>
+ <string name="anim_no_head">
+ No
+ </string>
+ <string name="anim_nyanya">
+ Na-na-na
+ </string>
+ <string name="anim_punch_onetwo">
+ Uno-due pugno
+ </string>
+ <string name="anim_express_open_mouth">
+ Bocca aperta
+ </string>
+ <string name="anim_peace">
+ Pace
+ </string>
+ <string name="anim_point_you">
+ Indicare altri
+ </string>
+ <string name="anim_point_me">
+ Indicare te stesso
+ </string>
+ <string name="anim_punch_l">
+ Pugno a sinistra
+ </string>
+ <string name="anim_punch_r">
+ Pugno a destra
+ </string>
+ <string name="anim_rps_countdown">
+ Contare nella morra cinese
+ </string>
+ <string name="anim_rps_paper">
+ Carta nella morra cinese
+ </string>
+ <string name="anim_rps_rock">
+ Sasso nella morra cinese
+ </string>
+ <string name="anim_rps_scissors">
+ Forbici nella morra cinese
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsione
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Calcio con rotazione
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Saluto
+ </string>
+ <string name="anim_shout">
+ Urlo
+ </string>
+ <string name="anim_express_shrug">
+ Spallucce
+ </string>
+ <string name="anim_express_smile">
+ Sorriso
+ </string>
+ <string name="anim_smoke_idle">
+ Fumare
+ </string>
+ <string name="anim_smoke_inhale">
+ Fumare inspirazione
+ </string>
+ <string name="anim_smoke_throw_down">
+ Fumare mandando giù
+ </string>
+ <string name="anim_express_surprise">
+ Sorpresa
+ </string>
+ <string name="anim_sword_strike_r">
+ Colpo di spada
+ </string>
+ <string name="anim_angry_tantrum">
+ Collera
+ </string>
+ <string name="anim_express_tongue_out">
+ Linguaccia
+ </string>
+ <string name="anim_hello">
+ Saluto con mano
+ </string>
+ <string name="anim_whisper">
+ Sussurro
+ </string>
+ <string name="anim_whistle">
+ Fischio
+ </string>
+ <string name="anim_express_wink">
+ Ammicca
+ </string>
+ <string name="anim_wink_hollywood">
+ Ammicca (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Preoccupato
+ </string>
+ <string name="anim_yes_happy">
+ Si (Felice)
+ </string>
+ <string name="anim_yes_head">
+ Si
+ </string>
+ <string name="multiple_textures">
+ Multiple
+ </string>
+ <string name="use_texture">
+ Usa texture
+ </string>
+ <string name="manip_hint1">
+ Sposta il cursore sul righello
+ </string>
+ <string name="manip_hint2">
+ per bloccare sulla griglia
+ </string>
+ <string name="texture_loading">
+ Caricamento in corso...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ L$ [PRICE] - [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ Nessun risultato.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fine prematura del file
+ </string>
+ <string name="ST_NO_JOINT">
+ Impossibile trovare ROOT o JOINT.
+ </string>
+ <string name="NearbyChatTitle">
+ Chat nei dintorni
+ </string>
+ <string name="NearbyChatLabel">
+ (Chat nei dintorni)
+ </string>
+ <string name="whisper">
+ sussurra:
+ </string>
+ <string name="shout">
+ grida:
+ </string>
+ <string name="ringing">
+ In connessione alla Voice Chat in-world...
+ </string>
+ <string name="connected">
+ Connesso
+ </string>
+ <string name="unavailable">
+ Il voice non è disponibile nel posto dove ti trovi ora
+ </string>
+ <string name="hang_up">
+ Disconnesso dalla Voice Chat in-world
+ </string>
+ <string name="reconnect_nearby">
+ Sarai riconnesso alla chat vocale nei dintorni
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS].
+ </string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Se consenti l'accesso al tuo account, consentirai anche all'oggetto di:
+ </string>
+ <string name="ScriptTakeMoney">
+ Prendere dollari Linden (L$) da te
+ </string>
+ <string name="ActOnControlInputs">
+ Agire sul tuo controllo degli input
+ </string>
+ <string name="RemapControlInputs">
+ Rimappare il tuo controllo degli input
+ </string>
+ <string name="AnimateYourAvatar">
+ Animare il tuo avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Far indossare al tuo avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Rilasciare la propietà è far diventare pubblico.
+ </string>
+ <string name="LinkAndDelink">
+ Collegare e scollegare dagli altri oggetti
+ </string>
+ <string name="AddAndRemoveJoints">
+ Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti
+ </string>
+ <string name="ChangePermissions">
+ Cambiare i permessi
+ </string>
+ <string name="TrackYourCamera">
+ Tracciare la fotocamera
+ </string>
+ <string name="ControlYourCamera">
+ Controllare la tua fotocamera
+ </string>
+ <string name="TeleportYourAgent">
+ Teleportarti
+ </string>
+ <string name="ForceSitAvatar">
+ Forza l'avatar a sedersi
+ </string>
+ <string name="ChangeEnvSettings">
+ Cambia le impostazioni dell’ambiente
+ </string>
+ <string name="AgentNameSubst">
+ (Tu)
+ </string>
<string name="JoinAnExperience"/>
- <string name="SilentlyManageEstateAccess">Omette gli avvisi durante la gestione degli elenchi di accesso alle proprietà immobiliari</string>
- <string name="OverrideYourAnimations">Sostituisce le animazioni predefinite</string>
- <string name="ScriptReturnObjects">Restituisce oggetti per conto tuo</string>
- <string name="UnknownScriptPermission">(sconosciuto)!</string>
- <string name="SIM_ACCESS_PG">Generale</string>
- <string name="SIM_ACCESS_MATURE">Moderato</string>
- <string name="SIM_ACCESS_ADULT">Adulti</string>
- <string name="SIM_ACCESS_DOWN">Offline</string>
- <string name="SIM_ACCESS_MIN">Sconosciuto</string>
- <string name="land_type_unknown">(sconosciuto)</string>
- <string name="Estate / Full Region">Proprietà immobiliare / Regione completa</string>
- <string name="Estate / Homestead">Proprietà immobiliare / Homestead</string>
- <string name="Mainland / Homestead">Continente / Homestead</string>
- <string name="Mainland / Full Region">Continente / Regione completa</string>
- <string name="all_files">Tutti i file</string>
- <string name="sound_files">Suoni</string>
- <string name="animation_files">Animazioni</string>
- <string name="image_files">Immagini</string>
- <string name="save_file_verb">Salva</string>
- <string name="load_file_verb">Carica</string>
- <string name="targa_image_files">Immagini Targa</string>
- <string name="bitmap_image_files">Immagini Bitmap</string>
- <string name="png_image_files">Immagini PNG</string>
- <string name="save_texture_image_files">Immagini Targa o PNG</string>
- <string name="avi_movie_file">File video AVI</string>
- <string name="xaf_animation_file">File animazione XAF</string>
- <string name="xml_file">File XML</string>
- <string name="raw_file">File RAW</string>
- <string name="compressed_image_files">Immagini compresse</string>
- <string name="load_files">Carica i file</string>
- <string name="choose_the_directory">Scegli la cartella</string>
- <string name="script_files">Script</string>
- <string name="dictionary_files">Dizionari</string>
- <string name="shape">Figura corporea</string>
- <string name="skin">Pelle</string>
- <string name="hair">Capigliature</string>
- <string name="eyes">Occhi</string>
- <string name="shirt">Camicia</string>
- <string name="pants">Pantaloni</string>
- <string name="shoes">Scarpe</string>
- <string name="socks">Calzini</string>
- <string name="jacket">Giacca</string>
- <string name="gloves">Guanti</string>
- <string name="undershirt">Maglietta intima</string>
- <string name="underpants">Slip</string>
- <string name="skirt">Gonna</string>
- <string name="alpha">Alfa (Trasparenza)</string>
- <string name="tattoo">Tatuaggio</string>
- <string name="universal">Universale</string>
- <string name="physics">Fisica</string>
- <string name="invalid">non valido</string>
- <string name="none">nessuno</string>
- <string name="shirt_not_worn">Camicia non indossata</string>
- <string name="pants_not_worn">Pantaloni non indossati</string>
- <string name="shoes_not_worn">Scarpe non indossate</string>
- <string name="socks_not_worn">Calzini non indossati</string>
- <string name="jacket_not_worn">Giacca non indossata</string>
- <string name="gloves_not_worn">Guanti non indossati</string>
- <string name="undershirt_not_worn">Maglietta intima non indossata</string>
- <string name="underpants_not_worn">Slip non indossati</string>
- <string name="skirt_not_worn">Gonna non indossata</string>
- <string name="alpha_not_worn">Alpha non portato</string>
- <string name="tattoo_not_worn">Tatuaggio non portato</string>
- <string name="universal_not_worn">Universale non indossato</string>
- <string name="physics_not_worn">Fisica non indossata</string>
- <string name="invalid_not_worn">non valido</string>
- <string name="create_new_shape">Crea nuova figura corporea</string>
- <string name="create_new_skin">Crea nuova pelle</string>
- <string name="create_new_hair">Crea nuovi capelli</string>
- <string name="create_new_eyes">Crea nuovi occhi</string>
- <string name="create_new_shirt">Crea nuova camicia</string>
- <string name="create_new_pants">Crea nuovi pantaloni</string>
- <string name="create_new_shoes">Crea nuove scarpe</string>
- <string name="create_new_socks">Crea nuove calze</string>
- <string name="create_new_jacket">Crea nuova giacca</string>
- <string name="create_new_gloves">Crea nuovi guanti</string>
- <string name="create_new_undershirt">Crea nuova maglietta intima</string>
- <string name="create_new_underpants">Crea nuovi slip</string>
- <string name="create_new_skirt">Crea nuova gonna</string>
- <string name="create_new_alpha">Crea nuovo Alpha</string>
- <string name="create_new_tattoo">Crea un nuovo tatuaggio</string>
- <string name="create_new_universal">Crea nuovo universale</string>
- <string name="create_new_physics">Crea nuova fisica</string>
- <string name="create_new_invalid">non valido</string>
- <string name="NewWearable">Nuovo [WEARABLE_ITEM]</string>
- <string name="next">Avanti</string>
- <string name="ok">OK</string>
- <string name="GroupNotifyGroupNotice">Avviso di gruppo</string>
- <string name="GroupNotifyGroupNotices">Avvisi di gruppo</string>
- <string name="GroupNotifySentBy">Inviato da</string>
- <string name="GroupNotifyAttached">Allegato:</string>
- <string name="GroupNotifyViewPastNotices">Visualizza gli avvisi precedenti o scegli qui di non riceverne.</string>
- <string name="GroupNotifyOpenAttachment">Apri l'allegato</string>
- <string name="GroupNotifySaveAttachment">Salva l'allegato</string>
- <string name="TeleportOffer">Offerta di Teleport</string>
- <string name="StartUpNotifications">Mentre eri assente sono arrivate nuove notifiche...</string>
- <string name="OverflowInfoChannelString">Hai ancora [%d] notifiche</string>
- <string name="BodyPartsRightArm">Braccio destro</string>
- <string name="BodyPartsHead">Testa</string>
- <string name="BodyPartsLeftArm">Braccio sinistro</string>
- <string name="BodyPartsLeftLeg">Gamba sinistra</string>
- <string name="BodyPartsTorso">Torace</string>
- <string name="BodyPartsRightLeg">Gamba destra</string>
- <string name="BodyPartsEnhancedSkeleton">Scheletro avanzato</string>
- <string name="GraphicsQualityLow">Basso</string>
- <string name="GraphicsQualityMid">Medio</string>
- <string name="GraphicsQualityHigh">Alto</string>
- <string name="LeaveMouselook">Premi ESC per tornare in visualizzazione normale</string>
- <string name="InventoryNoMatchingItems">Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca].</string>
- <string name="InventoryNoMatchingRecentItems">Non hai trovato ció che cercavi? Prova [secondlife:///app/inventory/filters Show filters].</string>
- <string name="PlacesNoMatchingItems">Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca].</string>
- <string name="FavoritesNoMatchingItems">Trascina qui un punto di riferimento per aggiungerlo ai Preferiti.</string>
- <string name="MarketplaceNoMatchingItems">Nessun articolo trovato. Controlla di aver digitato la stringa di ricerca correttamente e riprova.</string>
- <string name="InventoryNoTexture">Non hai una copia di questa texture nel tuo inventario</string>
- <string name="InventoryInboxNoItems">Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.</string>
- <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
- <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string>
- <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
- <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
- <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
- <string name="InventoryPlayAnimationTooltip">Apri finestra con opzioni di Gioco.</string>
- <string name="InventoryPlayGestureTooltip">Esegui il movimento selezionato nel mondo virtuale.</string>
- <string name="InventoryPlaySoundTooltip">Apri finestra con opzioni di Gioco.</string>
- <string name="InventoryOutboxNotMerchantTitle">Chiunque può vendere oggetti nel Marketplace.</string>
+ <string name="SilentlyManageEstateAccess">
+ Omette gli avvisi durante la gestione degli elenchi di accesso alle proprietà immobiliari
+ </string>
+ <string name="OverrideYourAnimations">
+ Sostituisce le animazioni predefinite
+ </string>
+ <string name="ScriptReturnObjects">
+ Restituisce oggetti per conto tuo
+ </string>
+ <string name="UnknownScriptPermission">
+ (sconosciuto)!
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Generale
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderato
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulti
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Offline
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Sconosciuto
+ </string>
+ <string name="land_type_unknown">
+ (sconosciuto)
+ </string>
+ <string name="Estate / Full Region">
+ Proprietà immobiliare / Regione completa
+ </string>
+ <string name="Estate / Homestead">
+ Proprietà immobiliare / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Regione completa
+ </string>
+ <string name="all_files">
+ Tutti i file
+ </string>
+ <string name="sound_files">
+ Suoni
+ </string>
+ <string name="animation_files">
+ Animazioni
+ </string>
+ <string name="image_files">
+ Immagini
+ </string>
+ <string name="save_file_verb">
+ Salva
+ </string>
+ <string name="load_file_verb">
+ Carica
+ </string>
+ <string name="targa_image_files">
+ Immagini Targa
+ </string>
+ <string name="bitmap_image_files">
+ Immagini Bitmap
+ </string>
+ <string name="png_image_files">
+ Immagini PNG
+ </string>
+ <string name="save_texture_image_files">
+ Immagini Targa o PNG
+ </string>
+ <string name="avi_movie_file">
+ File video AVI
+ </string>
+ <string name="xaf_animation_file">
+ File animazione XAF
+ </string>
+ <string name="xml_file">
+ File XML
+ </string>
+ <string name="raw_file">
+ File RAW
+ </string>
+ <string name="compressed_image_files">
+ Immagini compresse
+ </string>
+ <string name="load_files">
+ Carica i file
+ </string>
+ <string name="choose_the_directory">
+ Scegli la cartella
+ </string>
+ <string name="script_files">
+ Script
+ </string>
+ <string name="dictionary_files">
+ Dizionari
+ </string>
+ <string name="shape">
+ Figura corporea
+ </string>
+ <string name="skin">
+ Pelle
+ </string>
+ <string name="hair">
+ Capigliature
+ </string>
+ <string name="eyes">
+ Occhi
+ </string>
+ <string name="shirt">
+ Camicia
+ </string>
+ <string name="pants">
+ Pantaloni
+ </string>
+ <string name="shoes">
+ Scarpe
+ </string>
+ <string name="socks">
+ Calzini
+ </string>
+ <string name="jacket">
+ Giacca
+ </string>
+ <string name="gloves">
+ Guanti
+ </string>
+ <string name="undershirt">
+ Maglietta intima
+ </string>
+ <string name="underpants">
+ Slip
+ </string>
+ <string name="skirt">
+ Gonna
+ </string>
+ <string name="alpha">
+ Alfa (Trasparenza)
+ </string>
+ <string name="tattoo">
+ Tatuaggio
+ </string>
+ <string name="universal">
+ Universale
+ </string>
+ <string name="physics">
+ Fisica
+ </string>
+ <string name="invalid">
+ non valido
+ </string>
+ <string name="none">
+ nessuno
+ </string>
+ <string name="shirt_not_worn">
+ Camicia non indossata
+ </string>
+ <string name="pants_not_worn">
+ Pantaloni non indossati
+ </string>
+ <string name="shoes_not_worn">
+ Scarpe non indossate
+ </string>
+ <string name="socks_not_worn">
+ Calzini non indossati
+ </string>
+ <string name="jacket_not_worn">
+ Giacca non indossata
+ </string>
+ <string name="gloves_not_worn">
+ Guanti non indossati
+ </string>
+ <string name="undershirt_not_worn">
+ Maglietta intima non indossata
+ </string>
+ <string name="underpants_not_worn">
+ Slip non indossati
+ </string>
+ <string name="skirt_not_worn">
+ Gonna non indossata
+ </string>
+ <string name="alpha_not_worn">
+ Alpha non portato
+ </string>
+ <string name="tattoo_not_worn">
+ Tatuaggio non portato
+ </string>
+ <string name="universal_not_worn">
+ Universale non indossato
+ </string>
+ <string name="physics_not_worn">
+ Fisica non indossata
+ </string>
+ <string name="invalid_not_worn">
+ non valido
+ </string>
+ <string name="create_new_shape">
+ Crea nuova figura corporea
+ </string>
+ <string name="create_new_skin">
+ Crea nuova pelle
+ </string>
+ <string name="create_new_hair">
+ Crea nuovi capelli
+ </string>
+ <string name="create_new_eyes">
+ Crea nuovi occhi
+ </string>
+ <string name="create_new_shirt">
+ Crea nuova camicia
+ </string>
+ <string name="create_new_pants">
+ Crea nuovi pantaloni
+ </string>
+ <string name="create_new_shoes">
+ Crea nuove scarpe
+ </string>
+ <string name="create_new_socks">
+ Crea nuove calze
+ </string>
+ <string name="create_new_jacket">
+ Crea nuova giacca
+ </string>
+ <string name="create_new_gloves">
+ Crea nuovi guanti
+ </string>
+ <string name="create_new_undershirt">
+ Crea nuova maglietta intima
+ </string>
+ <string name="create_new_underpants">
+ Crea nuovi slip
+ </string>
+ <string name="create_new_skirt">
+ Crea nuova gonna
+ </string>
+ <string name="create_new_alpha">
+ Crea nuovo Alpha
+ </string>
+ <string name="create_new_tattoo">
+ Crea un nuovo tatuaggio
+ </string>
+ <string name="create_new_universal">
+ Crea nuovo universale
+ </string>
+ <string name="create_new_physics">
+ Crea nuova fisica
+ </string>
+ <string name="create_new_invalid">
+ non valido
+ </string>
+ <string name="NewWearable">
+ Nuovo [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Avanti
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Avviso di gruppo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Avvisi di gruppo
+ </string>
+ <string name="GroupNotifySentBy">
+ Inviato da
+ </string>
+ <string name="GroupNotifyAttached">
+ Allegato:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Visualizza gli avvisi precedenti o scegli qui di non riceverne.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Apri l'allegato
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Salva l'allegato
+ </string>
+ <string name="TeleportOffer">
+ Offerta di Teleport
+ </string>
+ <string name="StartUpNotifications">
+ Mentre eri assente sono arrivate nuove notifiche...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Hai ancora [%d] notifiche
+ </string>
+ <string name="BodyPartsRightArm">
+ Braccio destro
+ </string>
+ <string name="BodyPartsHead">
+ Testa
+ </string>
+ <string name="BodyPartsLeftArm">
+ Braccio sinistro
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Gamba sinistra
+ </string>
+ <string name="BodyPartsTorso">
+ Torace
+ </string>
+ <string name="BodyPartsRightLeg">
+ Gamba destra
+ </string>
+ <string name="BodyPartsEnhancedSkeleton">
+ Scheletro avanzato
+ </string>
+ <string name="GraphicsQualityLow">
+ Basso
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Premi ESC per tornare in visualizzazione normale
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca].
+ </string>
+ <string name="InventoryNoMatchingRecentItems">
+ Non hai trovato ció che cercavi? Prova [secondlife:///app/inventory/filters Show filters].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Trascina qui un punto di riferimento per aggiungerlo ai Preferiti.
+ </string>
+ <string name="MarketplaceNoMatchingItems">
+ Nessun articolo trovato. Controlla di aver digitato la stringa di ricerca correttamente e riprova.
+ </string>
+ <string name="InventoryNoTexture">
+ Non hai una copia di questa texture nel tuo inventario
+ </string>
+ <string name="InventoryInboxNoItems">
+ Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryPlayAnimationTooltip">
+ Apri finestra con opzioni di Gioco.
+ </string>
+ <string name="InventoryPlayGestureTooltip">
+ Esegui il movimento selezionato nel mondo virtuale.
+ </string>
+ <string name="InventoryPlaySoundTooltip">
+ Apri finestra con opzioni di Gioco.
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Chiunque può vendere oggetti nel Marketplace.
+ </string>
<string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace].</string>
- <string name="InventoryOutboxNoItemsTitle">La tua casella in uscita è vuota.</string>
+ <string name="InventoryOutboxNotMerchant">
+ Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ La tua casella in uscita è vuota.
+ </string>
<string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">Trascina le cartelle in questa area e clicca su &quot;Invia a Marketplace&quot; per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].</string>
- <string name="InventoryOutboxInitializingTitle">Inizializzazione Marketplace.in corso</string>
- <string name="InventoryOutboxInitializing">Stiamo eseguendo l'accesso al tuo account sul [[MARKETPLACE_CREATE_STORE_URL] negozio Marketplace].</string>
- <string name="InventoryOutboxErrorTitle">Errori in Marketplace.</string>
- <string name="InventoryOutboxError">Il [[MARKETPLACE_CREATE_STORE_URL] negozio nel Marketplace] ha riportato errori.</string>
- <string name="InventoryMarketplaceError">Errore nell'apertura degli annunci di Marketplace.
-Se continui a ricevere questo messaggio, contatta l'assistenza Second Life su http://support.secondlife.com.</string>
- <string name="InventoryMarketplaceListingsNoItemsTitle">La cartella degli annunci di Marketplace è vuota.</string>
- <string name="InventoryMarketplaceListingsNoItems">Trascina le cartelle in questa area per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].</string>
- <string name="InventoryItemsCount">( [ITEMS_COUNT] oggetti )</string>
- <string name="Marketplace Validation Warning Stock">la cartella di magazzino deve essere inclusa in una cartella di versione</string>
- <string name="Marketplace Validation Error Mixed Stock">: Errore: tutti gli articoli un una cartella di magazzino devono essere non copiabili e dello stesso tipo</string>
- <string name="Marketplace Validation Error Subfolder In Stock">: Errore: la cartella di magazzino non può contenere sottocartelle</string>
- <string name="Marketplace Validation Warning Empty">: Avviso: la cartella non contiene alcun articolo</string>
- <string name="Marketplace Validation Warning Create Stock">: Avviso: creazione cartella di magazzino in corso</string>
- <string name="Marketplace Validation Warning Create Version">: Avviso: creazione cartella di versione in corso</string>
- <string name="Marketplace Validation Warning Move">: Avviso: spostamento articoli in corso</string>
- <string name="Marketplace Validation Warning Delete">: Avviso: il contenuto della cartella è stato trasferito alla cartella di magazzino e la cartella vuota sta per essere rimossa</string>
- <string name="Marketplace Validation Error Stock Item">: Errore: gli articoli di cui non è permessa la copia devono essere all'interno di una cartella di magazzino</string>
- <string name="Marketplace Validation Warning Unwrapped Item">: Avviso: gli articoli devono essere inclusi in una cartella di versione</string>
- <string name="Marketplace Validation Error">: Errore:</string>
- <string name="Marketplace Validation Warning">: Avviso:</string>
- <string name="Marketplace Validation Error Empty Version">: Avviso: la cartella di versione deve contenere almeno 1 articolo</string>
- <string name="Marketplace Validation Error Empty Stock">: Avviso: la cartella di magazzino deve contenere almeno 1 articolo</string>
- <string name="Marketplace Validation No Error">Nessun errore o avviso da segnalare</string>
- <string name="Marketplace Error None">Nessun errore</string>
- <string name="Marketplace Error Prefix">Errore:</string>
- <string name="Marketplace Error Not Merchant">Prima di inviare gli articoli al Marketplace devi essere impostato come rivenditore (gratis).</string>
- <string name="Marketplace Error Not Accepted">L'articolo non può essere spostato in quella cartella.</string>
- <string name="Marketplace Error Unsellable Item">Questo articolo non può essere venduto nel Marketplace.</string>
- <string name="MarketplaceNoID">no Mkt ID</string>
- <string name="MarketplaceLive">in elenco</string>
- <string name="MarketplaceActive">attivi</string>
- <string name="MarketplaceMax">massimo</string>
- <string name="MarketplaceStock">magazzino</string>
- <string name="MarketplaceNoStock">non in magazzino</string>
- <string name="MarketplaceUpdating">in aggiornamento...</string>
- <string name="UploadFeeInfo">La tariffa è basata sul tuo livello di membership. Più alto è il livello più bassa sarà la tariffa. [https://secondlife.com/my/account/membership.php? Per saperne di più]</string>
- <string name="Open landmarks">Luoghi aperti</string>
- <string name="Unconstrained">Senza limitazioni</string>
+ <string name="InventoryOutboxNoItems">
+ Trascina le cartelle in questa area e clicca su "Invia a Marketplace" per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+ <string name="InventoryOutboxInitializingTitle">
+ Inizializzazione Marketplace.in corso
+ </string>
+ <string name="InventoryOutboxInitializing">
+ Stiamo eseguendo l'accesso al tuo account sul [[MARKETPLACE_CREATE_STORE_URL] negozio Marketplace].
+ </string>
+ <string name="InventoryOutboxErrorTitle">
+ Errori in Marketplace.
+ </string>
+ <string name="InventoryOutboxError">
+ Il [[MARKETPLACE_CREATE_STORE_URL] negozio nel Marketplace] ha riportato errori.
+ </string>
+ <string name="InventoryMarketplaceError">
+ Errore nell'apertura degli annunci di Marketplace.
+Se continui a ricevere questo messaggio, contatta l'assistenza Second Life su http://support.secondlife.com.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ La cartella degli annunci di Marketplace è vuota.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Trascina le cartelle in questa area per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+ <string name="InventoryItemsCount">
+ ( [ITEMS_COUNT] oggetti )
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ la cartella di magazzino deve essere inclusa in una cartella di versione
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Errore: tutti gli articoli un una cartella di magazzino devono essere non copiabili e dello stesso tipo
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Errore: la cartella di magazzino non può contenere sottocartelle
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Avviso: la cartella non contiene alcun articolo
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Avviso: creazione cartella di magazzino in corso
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Avviso: creazione cartella di versione in corso
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Avviso: spostamento articoli in corso
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Avviso: il contenuto della cartella è stato trasferito alla cartella di magazzino e la cartella vuota sta per essere rimossa
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Errore: gli articoli di cui non è permessa la copia devono essere all'interno di una cartella di magazzino
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Avviso: gli articoli devono essere inclusi in una cartella di versione
+ </string>
+ <string name="Marketplace Validation Error">
+ : Errore:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Avviso:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Avviso: la cartella di versione deve contenere almeno 1 articolo
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Avviso: la cartella di magazzino deve contenere almeno 1 articolo
+ </string>
+ <string name="Marketplace Validation No Error">
+ Nessun errore o avviso da segnalare
+ </string>
+ <string name="Marketplace Error None">
+ Nessun errore
+ </string>
+ <string name="Marketplace Error Prefix">
+ Errore:
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Prima di inviare gli articoli al Marketplace devi essere impostato come rivenditore (gratis).
+ </string>
+ <string name="Marketplace Error Not Accepted">
+ L'articolo non può essere spostato in quella cartella.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Questo articolo non può essere venduto nel Marketplace.
+ </string>
+ <string name="MarketplaceNoID">
+ no Mkt ID
+ </string>
+ <string name="MarketplaceLive">
+ in elenco
+ </string>
+ <string name="MarketplaceActive">
+ attivi
+ </string>
+ <string name="MarketplaceMax">
+ massimo
+ </string>
+ <string name="MarketplaceStock">
+ magazzino
+ </string>
+ <string name="MarketplaceNoStock">
+ non in magazzino
+ </string>
+ <string name="MarketplaceUpdating">
+ in aggiornamento...
+ </string>
+ <string name="UploadFeeInfo">
+ La tariffa è basata sul tuo livello di membership. Più alto è il livello più bassa sarà la tariffa. [https://secondlife.com/my/account/membership.php? Per saperne di più]
+ </string>
+ <string name="Open landmarks">
+ Luoghi aperti
+ </string>
+ <string name="Unconstrained">
+ Senza limitazioni
+ </string>
<string name="no_transfer" value="(nessun trasferimento)"/>
<string name="no_modify" value="(nessuna modifica)"/>
<string name="no_copy" value="(nessuna copia)"/>
<string name="worn" value="(indossato)"/>
<string name="link" value="(link)"/>
<string name="broken_link" value="(broken_link)&quot;"/>
- <string name="LoadingContents">Caricamento del contenuto...</string>
- <string name="NoContents">Nessun contenuto</string>
+ <string name="LoadingContents">
+ Caricamento del contenuto...
+ </string>
+ <string name="NoContents">
+ Nessun contenuto
+ </string>
<string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/>
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (attivo)"/>
@@ -631,1416 +1689,4146 @@ Se continui a ricevere questo messaggio, contatta l'assistenza Second Life su ht
<string name="Snapshots" value="Fotografie,"/>
<string name="No Filters" value="No"/>
<string name="Since Logoff" value="- Dall'uscita"/>
- <string name="InvFolder My Inventory">Il mio inventario</string>
- <string name="InvFolder Library">Libreria</string>
- <string name="InvFolder Textures">Texture</string>
- <string name="InvFolder Sounds">Suoni</string>
- <string name="InvFolder Calling Cards">Biglietti da visita</string>
- <string name="InvFolder Landmarks">Punti di riferimento</string>
- <string name="InvFolder Scripts">Script</string>
- <string name="InvFolder Clothing">Vestiario</string>
- <string name="InvFolder Objects">Oggetti</string>
- <string name="InvFolder Notecards">Biglietti</string>
- <string name="InvFolder New Folder">Nuova cartella</string>
- <string name="InvFolder Inventory">Inventario</string>
- <string name="InvFolder Uncompressed Images">Immagini non compresse</string>
- <string name="InvFolder Body Parts">Parti del corpo</string>
- <string name="InvFolder Trash">Cestino</string>
- <string name="InvFolder Photo Album">Album fotografico</string>
- <string name="InvFolder Lost And Found">Oggetti smarriti</string>
- <string name="InvFolder Uncompressed Sounds">Suoni non compressi</string>
- <string name="InvFolder Animations">Animazioni</string>
- <string name="InvFolder Gestures">Gesture</string>
- <string name="InvFolder Favorite">I miei preferiti</string>
- <string name="InvFolder favorite">I miei preferiti</string>
- <string name="InvFolder Favorites">I miei preferiti</string>
- <string name="InvFolder favorites">I miei preferiti</string>
- <string name="InvFolder Current Outfit">Abbigliamento attuale</string>
- <string name="InvFolder Initial Outfits">Vestiario iniziale</string>
- <string name="InvFolder My Outfits">Il mio vestiario</string>
- <string name="InvFolder Accessories">Accessori</string>
- <string name="InvFolder Meshes">Reticoli</string>
- <string name="InvFolder Received Items">Oggetti ricevuti</string>
- <string name="InvFolder Merchant Outbox">Casella venditore in uscita</string>
- <string name="InvFolder Friends">Amici</string>
- <string name="InvFolder All">Tutto</string>
- <string name="no_attachments">Nessun allegato indossato</string>
- <string name="Attachments remain">Allegati ([COUNT] spazi restanti)</string>
- <string name="Buy">Acquista</string>
- <string name="BuyforL$">Acquista per L$</string>
- <string name="Stone">Pietra</string>
- <string name="Metal">Metallo</string>
- <string name="Glass">Vetro</string>
- <string name="Wood">Legno</string>
- <string name="Flesh">Carne</string>
- <string name="Plastic">Plastica</string>
- <string name="Rubber">Gomma</string>
- <string name="Light">Luce</string>
- <string name="KBShift">Maiusc</string>
- <string name="KBCtrl">Ctrl</string>
- <string name="Chest">Petto</string>
- <string name="Skull">Cranio</string>
- <string name="Left Shoulder">Spalla sinistra</string>
- <string name="Right Shoulder">Spalla destra</string>
- <string name="Left Hand">Mano sinistra</string>
- <string name="Right Hand">Mano destra</string>
- <string name="Left Foot">Piede sinisto</string>
- <string name="Right Foot">Piede destro</string>
- <string name="Spine">Spina dorsale</string>
- <string name="Pelvis">Pelvi</string>
- <string name="Mouth">Bocca</string>
- <string name="Chin">Mento</string>
- <string name="Left Ear">Orecchio sinistro</string>
- <string name="Right Ear">Orecchio destro</string>
- <string name="Left Eyeball">Bulbo sinistro</string>
- <string name="Right Eyeball">Bulbo destro</string>
- <string name="Nose">Naso</string>
- <string name="R Upper Arm">Avambraccio destro</string>
- <string name="R Forearm">Braccio destro</string>
- <string name="L Upper Arm">Avambraccio sinistro</string>
- <string name="L Forearm">Braccio sinistro</string>
- <string name="Right Hip">Anca destra</string>
- <string name="R Upper Leg">Coscia destra</string>
- <string name="R Lower Leg">Gamba destra</string>
- <string name="Left Hip">Anca sinista</string>
- <string name="L Upper Leg">Coscia sinistra</string>
- <string name="L Lower Leg">Gamba sinistra</string>
- <string name="Stomach">Stomaco</string>
- <string name="Left Pec">Petto sinistro</string>
- <string name="Right Pec">Petto destro</string>
- <string name="Neck">Collo</string>
- <string name="Avatar Center">Centro avatar</string>
- <string name="Left Ring Finger">Anulare sinistro</string>
- <string name="Right Ring Finger">Anulare destro</string>
- <string name="Tail Base">Base della coda</string>
- <string name="Tail Tip">Punta della coda</string>
- <string name="Left Wing">Ala sinistra</string>
- <string name="Right Wing">Ala destra</string>
- <string name="Jaw">Mandibola</string>
- <string name="Alt Left Ear">Altro orecchio sinistro</string>
- <string name="Alt Right Ear">Altro orecchio destro</string>
- <string name="Alt Left Eye">Altro occhio sinistro</string>
- <string name="Alt Right Eye">Altro occhio destro</string>
- <string name="Tongue">Lingua</string>
- <string name="Groin">Inguine</string>
- <string name="Left Hind Foot">Piede posteriore sinistro</string>
- <string name="Right Hind Foot">Piede posteriore destro</string>
- <string name="Invalid Attachment">Punto di collegamento non valido</string>
- <string name="ATTACHMENT_MISSING_ITEM">Errore: articolo mancante</string>
- <string name="ATTACHMENT_MISSING_BASE_ITEM">Errore: articolo di base mancante</string>
- <string name="ATTACHMENT_NOT_ATTACHED">Errore: l'oggetto è nel vestiario corrente ma non è collegato</string>
- <string name="YearsMonthsOld">Nato da [AGEYEARS] [AGEMONTHS]</string>
- <string name="YearsOld">Nato da [AGEYEARS]</string>
- <string name="MonthsOld">Nato da [AGEMONTHS]</string>
- <string name="WeeksOld">Nato da [AGEWEEKS]</string>
- <string name="DaysOld">Nato da [AGEDAYS]</string>
- <string name="TodayOld">Iscritto oggi</string>
- <string name="av_render_everyone_now">Ora ti possono vedere tutti.</string>
- <string name="av_render_not_everyone">Alcune persone vicine a te potrebbero non eseguire il tuo rendering.</string>
- <string name="av_render_over_half">La maggioranza delle persone vicine a te potrebbe non eseguire il tuo rendering.</string>
- <string name="av_render_most_of">La gran parte delle persone vicine a te potrebbe non eseguire il tuo rendering.</string>
- <string name="av_render_anyone">Tutte le persone vicine a te potrebbero non eseguire il tuo rendering.</string>
- <string name="hud_description_total">Il tuo HUD</string>
- <string name="hud_name_with_joint">[OBJ_NAME] (indossato su [JNT_NAME])</string>
- <string name="hud_render_memory_warning">[HUD_DETAILS] fa uso di molta memoria texture</string>
- <string name="hud_render_cost_warning">[HUD_DETAILS] contiene molti oggetti e texture che occupano una grande quantità di risorse</string>
- <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] contiene molte texture di grandi dimensioni</string>
- <string name="hud_render_cramped_warning">[HUD_DETAILS] contiene troppi oggetti</string>
- <string name="hud_render_textures_warning">[HUD_DETAILS] contiene troppe texture</string>
- <string name="AgeYearsA">[COUNT] anno</string>
- <string name="AgeYearsB">[COUNT] anni</string>
- <string name="AgeYearsC">[COUNT] anni</string>
- <string name="AgeMonthsA">[COUNT] mese</string>
- <string name="AgeMonthsB">[COUNT] mesi</string>
- <string name="AgeMonthsC">[COUNT] mesi</string>
- <string name="AgeWeeksA">[COUNT] settimana</string>
- <string name="AgeWeeksB">[COUNT] settimane</string>
- <string name="AgeWeeksC">[COUNT] settimane</string>
- <string name="AgeDaysA">[COUNT] giorno</string>
- <string name="AgeDaysB">[COUNT] giorni</string>
- <string name="AgeDaysC">[COUNT] giorni</string>
- <string name="GroupMembersA">[COUNT] iscritto</string>
- <string name="GroupMembersB">[COUNT] iscritti</string>
- <string name="GroupMembersC">[COUNT] iscritti</string>
- <string name="AcctTypeResident">Residente</string>
- <string name="AcctTypeTrial">In prova</string>
- <string name="AcctTypeCharterMember">Socio onorario</string>
- <string name="AcctTypeEmployee">Dipendente Linden Lab</string>
- <string name="PaymentInfoUsed">Informazioni di pagamento usate</string>
- <string name="PaymentInfoOnFile">Informazioni di pagamento registrate</string>
- <string name="NoPaymentInfoOnFile">Nessuna informazione di pagamento disponibile</string>
- <string name="AgeVerified">Età verificata</string>
- <string name="NotAgeVerified">Età non verificata</string>
- <string name="Center 2">Centro 2</string>
- <string name="Top Right">In alto a destra</string>
- <string name="Top">in alto</string>
- <string name="Top Left">In alto a sinistra</string>
- <string name="Center">Al centro</string>
- <string name="Bottom Left">In basso a sinistra</string>
- <string name="Bottom">In basso</string>
- <string name="Bottom Right">In basso a destra</string>
- <string name="CompileQueueDownloadedCompiling">Scaricato, in compilazione</string>
- <string name="CompileQueueServiceUnavailable">Il servizio di compilazione degli script non è disponibile</string>
- <string name="CompileQueueScriptNotFound">Script non trovato sul server.</string>
- <string name="CompileQueueProblemDownloading">Problema nel download</string>
- <string name="CompileQueueInsufficientPermDownload">Permessi insufficenti per scaricare lo script.</string>
- <string name="CompileQueueInsufficientPermFor">Permessi insufficenti per</string>
- <string name="CompileQueueUnknownFailure">Errore di dowload sconosciuto</string>
- <string name="CompileNoExperiencePerm">Saltato lo script [SCRIPT] con l'esperienza [EXPERIENCE].</string>
- <string name="CompileQueueTitle">Avanzamento ricompilazione</string>
- <string name="CompileQueueStart">ricompila</string>
- <string name="ResetQueueTitle">Azzera avanzamento</string>
- <string name="ResetQueueStart">azzera</string>
- <string name="RunQueueTitle">Attiva avanzamento</string>
- <string name="RunQueueStart">attiva</string>
- <string name="NotRunQueueTitle">Disattiva avanzamento</string>
- <string name="NotRunQueueStart">disattiva</string>
- <string name="CompileSuccessful">Compilazione riuscita!</string>
- <string name="CompileSuccessfulSaving">Compilazione riuscita, in salvataggio...</string>
- <string name="SaveComplete">Salvataggio completato.</string>
- <string name="UploadFailed">Caricamento file non riuscito:</string>
- <string name="ObjectOutOfRange">Script (oggetto fuori portata)</string>
- <string name="ScriptWasDeleted">Script (eliminato da inventario)</string>
- <string name="GodToolsObjectOwnedBy">Oggetto [OBJECT] di proprietà di [OWNER]</string>
- <string name="GroupsNone">nessuno</string>
+ <string name="InvFolder My Inventory">
+ Il mio inventario
+ </string>
+ <string name="InvFolder Library">
+ Libreria
+ </string>
+ <string name="InvFolder Textures">
+ Texture
+ </string>
+ <string name="InvFolder Sounds">
+ Suoni
+ </string>
+ <string name="InvFolder Calling Cards">
+ Biglietti da visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Punti di riferimento
+ </string>
+ <string name="InvFolder Scripts">
+ Script
+ </string>
+ <string name="InvFolder Clothing">
+ Vestiario
+ </string>
+ <string name="InvFolder Objects">
+ Oggetti
+ </string>
+ <string name="InvFolder Notecards">
+ Biglietti
+ </string>
+ <string name="InvFolder New Folder">
+ Nuova cartella
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Immagini non compresse
+ </string>
+ <string name="InvFolder Body Parts">
+ Parti del corpo
+ </string>
+ <string name="InvFolder Trash">
+ Cestino
+ </string>
+ <string name="InvFolder Photo Album">
+ Album fotografico
+ </string>
+ <string name="InvFolder Lost And Found">
+ Oggetti smarriti
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Suoni non compressi
+ </string>
+ <string name="InvFolder Animations">
+ Animazioni
+ </string>
+ <string name="InvFolder Gestures">
+ Gesture
+ </string>
+ <string name="InvFolder Favorite">
+ I miei preferiti
+ </string>
+ <string name="InvFolder favorite">
+ I miei preferiti
+ </string>
+ <string name="InvFolder Favorites">
+ I miei preferiti
+ </string>
+ <string name="InvFolder favorites">
+ I miei preferiti
+ </string>
+ <string name="InvFolder Current Outfit">
+ Abbigliamento attuale
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Vestiario iniziale
+ </string>
+ <string name="InvFolder My Outfits">
+ Il mio vestiario
+ </string>
+ <string name="InvFolder Accessories">
+ Accessori
+ </string>
+ <string name="InvFolder Meshes">
+ Reticoli
+ </string>
+ <string name="InvFolder Received Items">
+ Oggetti ricevuti
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Casella venditore in uscita
+ </string>
+ <string name="InvFolder Friends">
+ Amici
+ </string>
+ <string name="InvFolder All">
+ Tutto
+ </string>
+ <string name="no_attachments">
+ Nessun allegato indossato
+ </string>
+ <string name="Attachments remain">
+ Allegati ([COUNT] spazi restanti)
+ </string>
+ <string name="Buy">
+ Acquista
+ </string>
+ <string name="BuyforL$">
+ Acquista per L$
+ </string>
+ <string name="Stone">
+ Pietra
+ </string>
+ <string name="Metal">
+ Metallo
+ </string>
+ <string name="Glass">
+ Vetro
+ </string>
+ <string name="Wood">
+ Legno
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plastica
+ </string>
+ <string name="Rubber">
+ Gomma
+ </string>
+ <string name="Light">
+ Luce
+ </string>
+ <string name="KBShift">
+ Maiusc
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Petto
+ </string>
+ <string name="Skull">
+ Cranio
+ </string>
+ <string name="Left Shoulder">
+ Spalla sinistra
+ </string>
+ <string name="Right Shoulder">
+ Spalla destra
+ </string>
+ <string name="Left Hand">
+ Mano sinistra
+ </string>
+ <string name="Right Hand">
+ Mano destra
+ </string>
+ <string name="Left Foot">
+ Piede sinisto
+ </string>
+ <string name="Right Foot">
+ Piede destro
+ </string>
+ <string name="Spine">
+ Spina dorsale
+ </string>
+ <string name="Pelvis">
+ Pelvi
+ </string>
+ <string name="Mouth">
+ Bocca
+ </string>
+ <string name="Chin">
+ Mento
+ </string>
+ <string name="Left Ear">
+ Orecchio sinistro
+ </string>
+ <string name="Right Ear">
+ Orecchio destro
+ </string>
+ <string name="Left Eyeball">
+ Bulbo sinistro
+ </string>
+ <string name="Right Eyeball">
+ Bulbo destro
+ </string>
+ <string name="Nose">
+ Naso
+ </string>
+ <string name="R Upper Arm">
+ Avambraccio destro
+ </string>
+ <string name="R Forearm">
+ Braccio destro
+ </string>
+ <string name="L Upper Arm">
+ Avambraccio sinistro
+ </string>
+ <string name="L Forearm">
+ Braccio sinistro
+ </string>
+ <string name="Right Hip">
+ Anca destra
+ </string>
+ <string name="R Upper Leg">
+ Coscia destra
+ </string>
+ <string name="R Lower Leg">
+ Gamba destra
+ </string>
+ <string name="Left Hip">
+ Anca sinista
+ </string>
+ <string name="L Upper Leg">
+ Coscia sinistra
+ </string>
+ <string name="L Lower Leg">
+ Gamba sinistra
+ </string>
+ <string name="Stomach">
+ Stomaco
+ </string>
+ <string name="Left Pec">
+ Petto sinistro
+ </string>
+ <string name="Right Pec">
+ Petto destro
+ </string>
+ <string name="Neck">
+ Collo
+ </string>
+ <string name="Avatar Center">
+ Centro avatar
+ </string>
+ <string name="Left Ring Finger">
+ Anulare sinistro
+ </string>
+ <string name="Right Ring Finger">
+ Anulare destro
+ </string>
+ <string name="Tail Base">
+ Base della coda
+ </string>
+ <string name="Tail Tip">
+ Punta della coda
+ </string>
+ <string name="Left Wing">
+ Ala sinistra
+ </string>
+ <string name="Right Wing">
+ Ala destra
+ </string>
+ <string name="Jaw">
+ Mandibola
+ </string>
+ <string name="Alt Left Ear">
+ Altro orecchio sinistro
+ </string>
+ <string name="Alt Right Ear">
+ Altro orecchio destro
+ </string>
+ <string name="Alt Left Eye">
+ Altro occhio sinistro
+ </string>
+ <string name="Alt Right Eye">
+ Altro occhio destro
+ </string>
+ <string name="Tongue">
+ Lingua
+ </string>
+ <string name="Groin">
+ Inguine
+ </string>
+ <string name="Left Hind Foot">
+ Piede posteriore sinistro
+ </string>
+ <string name="Right Hind Foot">
+ Piede posteriore destro
+ </string>
+ <string name="Invalid Attachment">
+ Punto di collegamento non valido
+ </string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Errore: articolo mancante
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Errore: articolo di base mancante
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Errore: l'oggetto è nel vestiario corrente ma non è collegato
+ </string>
+ <string name="YearsMonthsOld">
+ Nato da [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ Nato da [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ Nato da [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ Nato da [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ Nato da [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ Iscritto oggi
+ </string>
+ <string name="av_render_everyone_now">
+ Ora ti possono vedere tutti.
+ </string>
+ <string name="av_render_not_everyone">
+ Alcune persone vicine a te potrebbero non eseguire il tuo rendering.
+ </string>
+ <string name="av_render_over_half">
+ La maggioranza delle persone vicine a te potrebbe non eseguire il tuo rendering.
+ </string>
+ <string name="av_render_most_of">
+ La gran parte delle persone vicine a te potrebbe non eseguire il tuo rendering.
+ </string>
+ <string name="av_render_anyone">
+ Tutte le persone vicine a te potrebbero non eseguire il tuo rendering.
+ </string>
+ <string name="hud_description_total">
+ Il tuo HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (indossato su [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] fa uso di molta memoria texture
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] contiene molti oggetti e texture che occupano una grande quantità di risorse
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] contiene molte texture di grandi dimensioni
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] contiene troppi oggetti
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] contiene troppe texture
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] anno
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] anni
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] anni
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mese
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] mesi
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] mesi
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] settimana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] settimane
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] settimane
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] giorno
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] giorni
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] giorni
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] iscritto
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] iscritti
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] iscritti
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ In prova
+ </string>
+ <string name="AcctTypeCharterMember">
+ Socio onorario
+ </string>
+ <string name="AcctTypeEmployee">
+ Dipendente Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Informazioni di pagamento usate
+ </string>
+ <string name="PaymentInfoOnFile">
+ Informazioni di pagamento registrate
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Nessuna informazione di pagamento disponibile
+ </string>
+ <string name="AgeVerified">
+ Età verificata
+ </string>
+ <string name="NotAgeVerified">
+ Età non verificata
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ In alto a destra
+ </string>
+ <string name="Top">
+ in alto
+ </string>
+ <string name="Top Left">
+ In alto a sinistra
+ </string>
+ <string name="Center">
+ Al centro
+ </string>
+ <string name="Bottom Left">
+ In basso a sinistra
+ </string>
+ <string name="Bottom">
+ In basso
+ </string>
+ <string name="Bottom Right">
+ In basso a destra
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Scaricato, in compilazione
+ </string>
+ <string name="CompileQueueServiceUnavailable">
+ Il servizio di compilazione degli script non è disponibile
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script non trovato sul server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema nel download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permessi insufficenti per scaricare lo script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permessi insufficenti per
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Errore di dowload sconosciuto
+ </string>
+ <string name="CompileNoExperiencePerm">
+ Saltato lo script [SCRIPT] con l'esperienza [EXPERIENCE].
+ </string>
+ <string name="CompileQueueTitle">
+ Avanzamento ricompilazione
+ </string>
+ <string name="CompileQueueStart">
+ ricompila
+ </string>
+ <string name="ResetQueueTitle">
+ Azzera avanzamento
+ </string>
+ <string name="ResetQueueStart">
+ azzera
+ </string>
+ <string name="RunQueueTitle">
+ Attiva avanzamento
+ </string>
+ <string name="RunQueueStart">
+ attiva
+ </string>
+ <string name="NotRunQueueTitle">
+ Disattiva avanzamento
+ </string>
+ <string name="NotRunQueueStart">
+ disattiva
+ </string>
+ <string name="CompileSuccessful">
+ Compilazione riuscita!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilazione riuscita, in salvataggio...
+ </string>
+ <string name="SaveComplete">
+ Salvataggio completato.
+ </string>
+ <string name="UploadFailed">
+ Caricamento file non riuscito:
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (oggetto fuori portata)
+ </string>
+ <string name="ScriptWasDeleted">
+ Script (eliminato da inventario)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Oggetto [OBJECT] di proprietà di [OWNER]
+ </string>
+ <string name="GroupsNone">
+ nessuno
+ </string>
<string name="Group" value="(gruppo)"/>
- <string name="Unknown">(Sconosciuto)</string>
+ <string name="Unknown">
+ (Sconosciuto)
+ </string>
<string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal "/>
<string name="NextStipendDay" value=". Il prossimo giorno di stipendio è "/>
- <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/>
<string name="GroupColumn" value="Gruppo"/>
- <string name="Balance">Saldo</string>
- <string name="Credits">Ringraziamenti</string>
- <string name="Debits">Debiti</string>
- <string name="Total">Totale</string>
- <string name="NoGroupDataFound">Nessun dato trovato per questo gruppo</string>
- <string name="IMParentEstate">Proprietà principale</string>
- <string name="IMMainland">continente</string>
- <string name="IMTeen">teen</string>
- <string name="Anyone">chiunque</string>
- <string name="RegionInfoError">errore</string>
- <string name="RegionInfoAllEstatesOwnedBy">tutte le proprietà immobiliari di [OWNER]</string>
- <string name="RegionInfoAllEstatesYouOwn">tutte le tue proprietà immobiliari</string>
- <string name="RegionInfoAllEstatesYouManage">tutte le proprietà immobiliari che gestisci per conto di [OWNER]</string>
- <string name="RegionInfoAllowedResidents">Sempre consentiti: ([ALLOWEDAGENTS], max [MAXACCESS])</string>
- <string name="RegionInfoAllowedGroups">Gruppi sempre consentiti: ([ALLOWEDGROUPS], max [MAXACCESS])</string>
- <string name="RegionInfoBannedResidents">Sempre esclusi: ([BANNEDAGENTS], max [MAXBANNED])</string>
- <string name="RegionInfoListTypeAllowedAgents">Sempre consentiti:</string>
- <string name="RegionInfoListTypeBannedAgents">Sempre esclusi:</string>
- <string name="RegionInfoAllEstates">tutte le proprietà immobiliari</string>
- <string name="RegionInfoManagedEstates">proprietà immobiliari che gestisci</string>
- <string name="RegionInfoThisEstate">questa proprietà immobiliare</string>
- <string name="AndNMore">e [EXTRA_COUNT] ancora</string>
- <string name="ScriptLimitsParcelScriptMemory">Memoria dello script del lotto</string>
- <string name="ScriptLimitsParcelsOwned">Lotti in elenco: [PARCELS]</string>
- <string name="ScriptLimitsMemoryUsed">Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili</string>
- <string name="ScriptLimitsMemoryUsedSimple">Memoria utilizzata: [COUNT] kb</string>
- <string name="ScriptLimitsParcelScriptURLs">URL degli script lotti</string>
- <string name="ScriptLimitsURLsUsed">URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili</string>
- <string name="ScriptLimitsURLsUsedSimple">URL utilizzati: [COUNT]</string>
- <string name="ScriptLimitsRequestError">Errore nella richiesta di informazioni</string>
- <string name="ScriptLimitsRequestNoParcelSelected">Nessun lotto selezionato</string>
- <string name="ScriptLimitsRequestWrongRegion">Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale</string>
- <string name="ScriptLimitsRequestWaiting">Recupero informazioni in corso...</string>
- <string name="ScriptLimitsRequestDontOwnParcel">Non hai il permesso di visionare questo lotto</string>
- <string name="SITTING_ON">Seduto su</string>
- <string name="ATTACH_CHEST">Petto</string>
- <string name="ATTACH_HEAD">Cranio</string>
- <string name="ATTACH_LSHOULDER">Spalla sinistra</string>
- <string name="ATTACH_RSHOULDER">Spalla destra</string>
- <string name="ATTACH_LHAND">Mano sinistra</string>
- <string name="ATTACH_RHAND">Mano destra</string>
- <string name="ATTACH_LFOOT">Piede sinisto</string>
- <string name="ATTACH_RFOOT">Piede destro</string>
- <string name="ATTACH_BACK">Spina dorsale</string>
- <string name="ATTACH_PELVIS">Pelvi</string>
- <string name="ATTACH_MOUTH">Bocca</string>
- <string name="ATTACH_CHIN">Mento</string>
- <string name="ATTACH_LEAR">Orecchio sinistro</string>
- <string name="ATTACH_REAR">Orecchio destro</string>
- <string name="ATTACH_LEYE">Occhio sinistro</string>
- <string name="ATTACH_REYE">Occhio destro</string>
- <string name="ATTACH_NOSE">Naso</string>
- <string name="ATTACH_RUARM">Braccio destro</string>
- <string name="ATTACH_RLARM">Avambraccio destro</string>
- <string name="ATTACH_LUARM">Braccio sinistro</string>
- <string name="ATTACH_LLARM">Avambraccio sinistro</string>
- <string name="ATTACH_RHIP">Anca destra</string>
- <string name="ATTACH_RULEG">Coscia destra</string>
- <string name="ATTACH_RLLEG">Coscia destra</string>
- <string name="ATTACH_LHIP">Anca sinista</string>
- <string name="ATTACH_LULEG">Coscia sinistra</string>
- <string name="ATTACH_LLLEG">Polpaccio sinistro</string>
- <string name="ATTACH_BELLY">Stomaco</string>
- <string name="ATTACH_LEFT_PEC">Petto sinistro</string>
- <string name="ATTACH_RIGHT_PEC">Petto destro</string>
- <string name="ATTACH_HUD_CENTER_2">HUD in centro 2</string>
- <string name="ATTACH_HUD_TOP_RIGHT">HUD alto a destra</string>
- <string name="ATTACH_HUD_TOP_CENTER">HUD alto in centro</string>
- <string name="ATTACH_HUD_TOP_LEFT">HUD alto a sinistra</string>
- <string name="ATTACH_HUD_CENTER_1">HUD in centro 1</string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">HUD basso a sinistra</string>
- <string name="ATTACH_HUD_BOTTOM">HUD basso</string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD basso a destra</string>
- <string name="ATTACH_NECK">Collo</string>
- <string name="ATTACH_AVATAR_CENTER">Centro avatar</string>
- <string name="ATTACH_LHAND_RING1">Anulare sinistro</string>
- <string name="ATTACH_RHAND_RING1">Anulare destro</string>
- <string name="ATTACH_TAIL_BASE">Base della coda</string>
- <string name="ATTACH_TAIL_TIP">Punta della coda</string>
- <string name="ATTACH_LWING">Ala sinistra</string>
- <string name="ATTACH_RWING">Ala destra</string>
- <string name="ATTACH_FACE_JAW">Mandibola</string>
- <string name="ATTACH_FACE_LEAR">Altro orecchio sinistro</string>
- <string name="ATTACH_FACE_REAR">Altro orecchio destro</string>
- <string name="ATTACH_FACE_LEYE">Altro occhio sinistro</string>
- <string name="ATTACH_FACE_REYE">Altro occhio destro</string>
- <string name="ATTACH_FACE_TONGUE">Lingua</string>
- <string name="ATTACH_GROIN">Inguine</string>
- <string name="ATTACH_HIND_LFOOT">Piede posteriore sinistro</string>
- <string name="ATTACH_HIND_RFOOT">Piede posteriore destro</string>
- <string name="CursorPos">Riga [LINE], Colonna [COLUMN]</string>
- <string name="PanelDirCountFound">[COUNT] trovato/i</string>
- <string name="PanelContentsTooltip">Contenuto dell'oggetto</string>
- <string name="PanelContentsNewScript">Nuovo script</string>
- <string name="DoNotDisturbModeResponseDefault">Questo residente ha attivato la modalità 'Non disturbare' e vedrà il tuo messaggio più tardi.</string>
- <string name="MuteByName">(In base al nome)</string>
- <string name="MuteAgent">(Residente)</string>
- <string name="MuteObject">(Oggetto)</string>
- <string name="MuteGroup">(Gruppo)</string>
- <string name="MuteExternal">(esterno)</string>
- <string name="RegionNoCovenant">Non esiste alcun regolamento per questa proprietà.</string>
- <string name="RegionNoCovenantOtherOwner">Non esiste alcun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.</string>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Ringraziamenti
+ </string>
+ <string name="Debits">
+ Debiti
+ </string>
+ <string name="Total">
+ Totale
+ </string>
+ <string name="NoGroupDataFound">
+ Nessun dato trovato per questo gruppo
+ </string>
+ <string name="IMParentEstate">
+ Proprietà principale
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="Anyone">
+ chiunque
+ </string>
+ <string name="RegionInfoError">
+ errore
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ tutte le proprietà immobiliari di [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ tutte le tue proprietà immobiliari
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ tutte le proprietà immobiliari che gestisci per conto di [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Sempre consentiti: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Gruppi sempre consentiti: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoBannedResidents">
+ Sempre esclusi: ([BANNEDAGENTS], max [MAXBANNED])
+ </string>
+ <string name="RegionInfoListTypeAllowedAgents">
+ Sempre consentiti:
+ </string>
+ <string name="RegionInfoListTypeBannedAgents">
+ Sempre esclusi:
+ </string>
+ <string name="RegionInfoAllEstates">
+ tutte le proprietà immobiliari
+ </string>
+ <string name="RegionInfoManagedEstates">
+ proprietà immobiliari che gestisci
+ </string>
+ <string name="RegionInfoThisEstate">
+ questa proprietà immobiliare
+ </string>
+ <string name="AndNMore">
+ e [EXTRA_COUNT] ancora
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memoria dello script del lotto
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Lotti in elenco: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memoria utilizzata: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL degli script lotti
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL utilizzati: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Errore nella richiesta di informazioni
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Nessun lotto selezionato
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Recupero informazioni in corso...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Non hai il permesso di visionare questo lotto
+ </string>
+ <string name="SITTING_ON">
+ Seduto su
+ </string>
+ <string name="ATTACH_CHEST">
+ Petto
+ </string>
+ <string name="ATTACH_HEAD">
+ Cranio
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Spalla sinistra
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Spalla destra
+ </string>
+ <string name="ATTACH_LHAND">
+ Mano sinistra
+ </string>
+ <string name="ATTACH_RHAND">
+ Mano destra
+ </string>
+ <string name="ATTACH_LFOOT">
+ Piede sinisto
+ </string>
+ <string name="ATTACH_RFOOT">
+ Piede destro
+ </string>
+ <string name="ATTACH_BACK">
+ Spina dorsale
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvi
+ </string>
+ <string name="ATTACH_MOUTH">
+ Bocca
+ </string>
+ <string name="ATTACH_CHIN">
+ Mento
+ </string>
+ <string name="ATTACH_LEAR">
+ Orecchio sinistro
+ </string>
+ <string name="ATTACH_REAR">
+ Orecchio destro
+ </string>
+ <string name="ATTACH_LEYE">
+ Occhio sinistro
+ </string>
+ <string name="ATTACH_REYE">
+ Occhio destro
+ </string>
+ <string name="ATTACH_NOSE">
+ Naso
+ </string>
+ <string name="ATTACH_RUARM">
+ Braccio destro
+ </string>
+ <string name="ATTACH_RLARM">
+ Avambraccio destro
+ </string>
+ <string name="ATTACH_LUARM">
+ Braccio sinistro
+ </string>
+ <string name="ATTACH_LLARM">
+ Avambraccio sinistro
+ </string>
+ <string name="ATTACH_RHIP">
+ Anca destra
+ </string>
+ <string name="ATTACH_RULEG">
+ Coscia destra
+ </string>
+ <string name="ATTACH_RLLEG">
+ Coscia destra
+ </string>
+ <string name="ATTACH_LHIP">
+ Anca sinista
+ </string>
+ <string name="ATTACH_LULEG">
+ Coscia sinistra
+ </string>
+ <string name="ATTACH_LLLEG">
+ Polpaccio sinistro
+ </string>
+ <string name="ATTACH_BELLY">
+ Stomaco
+ </string>
+ <string name="ATTACH_LEFT_PEC">
+ Petto sinistro
+ </string>
+ <string name="ATTACH_RIGHT_PEC">
+ Petto destro
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD in centro 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD alto a destra
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD alto in centro
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD alto a sinistra
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD in centro 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD basso a sinistra
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD basso
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD basso a destra
+ </string>
+ <string name="ATTACH_NECK">
+ Collo
+ </string>
+ <string name="ATTACH_AVATAR_CENTER">
+ Centro avatar
+ </string>
+ <string name="ATTACH_LHAND_RING1">
+ Anulare sinistro
+ </string>
+ <string name="ATTACH_RHAND_RING1">
+ Anulare destro
+ </string>
+ <string name="ATTACH_TAIL_BASE">
+ Base della coda
+ </string>
+ <string name="ATTACH_TAIL_TIP">
+ Punta della coda
+ </string>
+ <string name="ATTACH_LWING">
+ Ala sinistra
+ </string>
+ <string name="ATTACH_RWING">
+ Ala destra
+ </string>
+ <string name="ATTACH_FACE_JAW">
+ Mandibola
+ </string>
+ <string name="ATTACH_FACE_LEAR">
+ Altro orecchio sinistro
+ </string>
+ <string name="ATTACH_FACE_REAR">
+ Altro orecchio destro
+ </string>
+ <string name="ATTACH_FACE_LEYE">
+ Altro occhio sinistro
+ </string>
+ <string name="ATTACH_FACE_REYE">
+ Altro occhio destro
+ </string>
+ <string name="ATTACH_FACE_TONGUE">
+ Lingua
+ </string>
+ <string name="ATTACH_GROIN">
+ Inguine
+ </string>
+ <string name="ATTACH_HIND_LFOOT">
+ Piede posteriore sinistro
+ </string>
+ <string name="ATTACH_HIND_RFOOT">
+ Piede posteriore destro
+ </string>
+ <string name="CursorPos">
+ Riga [LINE], Colonna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] trovato/i
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenuto dell'oggetto
+ </string>
+ <string name="PanelContentsNewScript">
+ Nuovo script
+ </string>
+ <string name="DoNotDisturbModeResponseDefault">
+ Questo residente ha attivato la modalità 'Non disturbare' e vedrà il tuo messaggio più tardi.
+ </string>
+ <string name="MuteByName">
+ (In base al nome)
+ </string>
+ <string name="MuteAgent">
+ (Residente)
+ </string>
+ <string name="MuteObject">
+ (Oggetto)
+ </string>
+ <string name="MuteGroup">
+ (Gruppo)
+ </string>
+ <string name="MuteExternal">
+ (esterno)
+ </string>
+ <string name="RegionNoCovenant">
+ Non esiste alcun regolamento per questa proprietà.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Non esiste alcun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.
+ </string>
<string name="covenant_last_modified" value="Ultima modifica: "/>
<string name="none_text" value="(nessuno)"/>
<string name="never_text" value="(mai)"/>
- <string name="GroupOwned">Di proprietà di un gruppo</string>
- <string name="Public">Pubblica</string>
- <string name="LocalSettings">Impostazioni locali</string>
- <string name="RegionSettings">Impostazioni regione</string>
- <string name="NoEnvironmentSettings">Questa regione non supporta le impostazioni per l’ambiente.</string>
- <string name="EnvironmentSun">Sole</string>
- <string name="EnvironmentMoon">Luna</string>
- <string name="EnvironmentBloom">Fioritura</string>
- <string name="EnvironmentCloudNoise">Rumore nuvole</string>
- <string name="EnvironmentNormalMap">Mappa normale</string>
- <string name="EnvironmentTransparent">Transparent</string>
- <string name="ClassifiedClicksTxt">Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo</string>
- <string name="ClassifiedUpdateAfterPublish">(si aggiornerà dopo la pubblicazione)</string>
- <string name="NoPicksClassifiedsText">Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un'inserzione.</string>
- <string name="NoPicksText">Non hai creato Luoghi preferiti. Fai clic sul pulsante Nuovo per creare un Luogo preferito.</string>
- <string name="NoClassifiedsText">Non hai creato Annunci. Fai clic sul pulsante Nuovo per creare un Annuncio.</string>
- <string name="NoAvatarPicksClassifiedsText">L'utente non ha luoghi preferiti né inserzioni</string>
- <string name="NoAvatarPicksText">L'utente non ha luoghi preferiti</string>
- <string name="NoAvatarClassifiedsText">L'utente non ha annunci</string>
- <string name="PicksClassifiedsLoadingText">Caricamento in corso...</string>
- <string name="MultiPreviewTitle">Anteprima</string>
- <string name="MultiPropertiesTitle">Beni immobiliari</string>
- <string name="InvOfferAnObjectNamed">Un oggetto denominato</string>
- <string name="InvOfferOwnedByGroup">di proprietà del gruppo</string>
- <string name="InvOfferOwnedByUnknownGroup">di proprietà di un gruppo sconosciuto</string>
- <string name="InvOfferOwnedBy">di proprietà di</string>
- <string name="InvOfferOwnedByUnknownUser">di proprietà di un utente sconosciuto</string>
- <string name="InvOfferGaveYou">Ti ha offerto</string>
- <string name="InvOfferDecline">Non hai accettato [DESC] da &lt;nolink&gt;[NAME]&lt;/nolink&gt;.</string>
- <string name="GroupMoneyTotal">Totale</string>
- <string name="GroupMoneyBought">comprato</string>
- <string name="GroupMoneyPaidYou">ti ha pagato</string>
- <string name="GroupMoneyPaidInto">ha pagato</string>
- <string name="GroupMoneyBoughtPassTo">ha comprato il pass</string>
- <string name="GroupMoneyPaidFeeForEvent">pagato la tassa per l'evento</string>
- <string name="GroupMoneyPaidPrizeForEvent">pagato il premio per l'evento</string>
- <string name="GroupMoneyBalance">Saldo</string>
- <string name="GroupMoneyCredits">Ringraziamenti</string>
- <string name="GroupMoneyDebits">Debiti</string>
- <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>
- <string name="AcquiredItems">Oggetti acquisiti</string>
- <string name="Cancel">Annulla</string>
- <string name="UploadingCosts">Il caricamento di [NAME] costa L$ [AMOUNT]</string>
- <string name="BuyingCosts">L'acquisto di [NAME] costa L$ [AMOUNT]</string>
- <string name="UnknownFileExtension">Estensione del file sconosciuta [.%s]
-Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh</string>
- <string name="MuteObject2">Blocca</string>
- <string name="AddLandmarkNavBarMenu">Aggiungi punto di riferimento...</string>
- <string name="EditLandmarkNavBarMenu">Modifica punto di riferimento...</string>
- <string name="accel-mac-control">⌃</string>
- <string name="accel-mac-command">⌘</string>
- <string name="accel-mac-option">⌥</string>
- <string name="accel-mac-shift">⇧</string>
- <string name="accel-win-control">Ctrl+</string>
- <string name="accel-win-alt">Alt+</string>
- <string name="accel-win-shift">Shift+</string>
- <string name="FileSaved">File salvato</string>
- <string name="Receiving">In ricezione</string>
- <string name="AM">antemeridiane</string>
- <string name="PM">pomeridiane</string>
- <string name="PST">Ora Pacifico</string>
- <string name="PDT">Ora legale Pacifico</string>
- <string name="Direction_Forward">Avanti</string>
- <string name="Direction_Left">Sinistra</string>
- <string name="Direction_Right">Destra</string>
- <string name="Direction_Back">Indietro</string>
- <string name="Direction_North">Nord</string>
- <string name="Direction_South">Sud</string>
- <string name="Direction_West">Ovest</string>
- <string name="Direction_East">Est</string>
- <string name="Direction_Up">Su</string>
- <string name="Direction_Down">Giù</string>
- <string name="Any Category">Qualsiasi categoria</string>
- <string name="Shopping">Acquisti</string>
- <string name="Land Rental">Affitto terreno</string>
- <string name="Property Rental">Affitto proprietà</string>
- <string name="Special Attraction">Attrazioni speciali</string>
- <string name="New Products">Nuovi prodotti</string>
- <string name="Employment">Lavoro</string>
- <string name="Wanted">Cercasi</string>
- <string name="Service">Servizio</string>
- <string name="Personal">Personale</string>
- <string name="None">Nessuno</string>
- <string name="Linden Location">Luogo dei Linden</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Arte &amp; Cultura</string>
- <string name="Business">Affari</string>
- <string name="Educational">Educazione</string>
- <string name="Gaming">Gioco</string>
- <string name="Hangout">Divertimento</string>
- <string name="Newcomer Friendly">Accoglienza nuovi residenti</string>
- <string name="Parks&amp;Nature">Parchi &amp; Natura</string>
- <string name="Residential">Residenziale</string>
- <string name="Stage">Fase</string>
- <string name="Other">Altro</string>
- <string name="Rental">Affitto</string>
- <string name="Any">Tutti</string>
- <string name="You">Tu</string>
- <string name="Multiple Media">Più supporti</string>
- <string name="Play Media">Riproduci/Pausa supporto</string>
- <string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string>
- <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=en-us</string>
- <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string>
- <string name="MBCmdLineError">Un errore è stato riscontrato analizzando la linea di comando.
+ <string name="GroupOwned">
+ Di proprietà di un gruppo
+ </string>
+ <string name="Public">
+ Pubblica
+ </string>
+ <string name="LocalSettings">
+ Impostazioni locali
+ </string>
+ <string name="RegionSettings">
+ Impostazioni regione
+ </string>
+ <string name="NoEnvironmentSettings">
+ Questa regione non supporta le impostazioni per l’ambiente.
+ </string>
+ <string name="EnvironmentSun">
+ Sole
+ </string>
+ <string name="EnvironmentMoon">
+ Luna
+ </string>
+ <string name="EnvironmentBloom">
+ Fioritura
+ </string>
+ <string name="EnvironmentCloudNoise">
+ Rumore nuvole
+ </string>
+ <string name="EnvironmentNormalMap">
+ Mappa normale
+ </string>
+ <string name="EnvironmentTransparent">
+ Transparent
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (si aggiornerà dopo la pubblicazione)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un'inserzione.
+ </string>
+ <string name="NoPicksText">
+ Non hai creato Luoghi preferiti. Fai clic sul pulsante Nuovo per creare un Luogo preferito.
+ </string>
+ <string name="NoClassifiedsText">
+ Non hai creato Annunci. Fai clic sul pulsante Nuovo per creare un Annuncio.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ L'utente non ha luoghi preferiti né inserzioni
+ </string>
+ <string name="NoAvatarPicksText">
+ L'utente non ha luoghi preferiti
+ </string>
+ <string name="NoAvatarClassifiedsText">
+ L'utente non ha annunci
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Caricamento in corso...
+ </string>
+ <string name="MultiPreviewTitle">
+ Anteprima
+ </string>
+ <string name="MultiPropertiesTitle">
+ Beni immobiliari
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un oggetto denominato
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ di proprietà del gruppo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ di proprietà di un gruppo sconosciuto
+ </string>
+ <string name="InvOfferOwnedBy">
+ di proprietà di
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ di proprietà di un utente sconosciuto
+ </string>
+ <string name="InvOfferGaveYou">
+ Ti ha offerto
+ </string>
+ <string name="InvOfferDecline">
+ Non hai accettato [DESC] da &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Totale
+ </string>
+ <string name="GroupMoneyBought">
+ comprato
+ </string>
+ <string name="GroupMoneyPaidYou">
+ ti ha pagato
+ </string>
+ <string name="GroupMoneyPaidInto">
+ ha pagato
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ ha comprato il pass
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ pagato la tassa per l'evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ pagato il premio per l'evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Ringraziamenti
+ </string>
+ <string name="GroupMoneyDebits">
+ Debiti
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="AcquiredItems">
+ Oggetti acquisiti
+ </string>
+ <string name="Cancel">
+ Annulla
+ </string>
+ <string name="UploadingCosts">
+ Il caricamento di [NAME] costa L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ L'acquisto di [NAME] costa L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Estensione del file sconosciuta [.%s]
+Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ Blocca
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Aggiungi punto di riferimento...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Modifica punto di riferimento...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ File salvato
+ </string>
+ <string name="Receiving">
+ In ricezione
+ </string>
+ <string name="AM">
+ antemeridiane
+ </string>
+ <string name="PM">
+ pomeridiane
+ </string>
+ <string name="PST">
+ Ora Pacifico
+ </string>
+ <string name="PDT">
+ Ora legale Pacifico
+ </string>
+ <string name="Direction_Forward">
+ Avanti
+ </string>
+ <string name="Direction_Left">
+ Sinistra
+ </string>
+ <string name="Direction_Right">
+ Destra
+ </string>
+ <string name="Direction_Back">
+ Indietro
+ </string>
+ <string name="Direction_North">
+ Nord
+ </string>
+ <string name="Direction_South">
+ Sud
+ </string>
+ <string name="Direction_West">
+ Ovest
+ </string>
+ <string name="Direction_East">
+ Est
+ </string>
+ <string name="Direction_Up">
+ Su
+ </string>
+ <string name="Direction_Down">
+ Giù
+ </string>
+ <string name="Any Category">
+ Qualsiasi categoria
+ </string>
+ <string name="Shopping">
+ Acquisti
+ </string>
+ <string name="Land Rental">
+ Affitto terreno
+ </string>
+ <string name="Property Rental">
+ Affitto proprietà
+ </string>
+ <string name="Special Attraction">
+ Attrazioni speciali
+ </string>
+ <string name="New Products">
+ Nuovi prodotti
+ </string>
+ <string name="Employment">
+ Lavoro
+ </string>
+ <string name="Wanted">
+ Cercasi
+ </string>
+ <string name="Service">
+ Servizio
+ </string>
+ <string name="Personal">
+ Personale
+ </string>
+ <string name="None">
+ Nessuno
+ </string>
+ <string name="Linden Location">
+ Luogo dei Linden
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Arte &amp; Cultura
+ </string>
+ <string name="Business">
+ Affari
+ </string>
+ <string name="Educational">
+ Educazione
+ </string>
+ <string name="Gaming">
+ Gioco
+ </string>
+ <string name="Hangout">
+ Divertimento
+ </string>
+ <string name="Newcomer Friendly">
+ Accoglienza nuovi residenti
+ </string>
+ <string name="Parks&amp;Nature">
+ Parchi &amp; Natura
+ </string>
+ <string name="Residential">
+ Residenziale
+ </string>
+ <string name="Stage">
+ Fase
+ </string>
+ <string name="Other">
+ Altro
+ </string>
+ <string name="Rental">
+ Affitto
+ </string>
+ <string name="Any">
+ Tutti
+ </string>
+ <string name="You">
+ Tu
+ </string>
+ <string name="Multiple Media">
+ Più supporti
+ </string>
+ <string name="Play Media">
+ Riproduci/Pausa supporto
+ </string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=en-us
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
+ <string name="MBCmdLineError">
+ Un errore è stato riscontrato analizzando la linea di comando.
Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters
-Errore:</string>
- <string name="MBCmdLineUsg">Uso linea di comando del programma [APP_NAME] :</string>
- <string name="MBUnableToAccessFile">Il programma [APP_NAME] non è in grado di accedere ad un file necessario.
+Errore:
+ </string>
+ <string name="MBCmdLineUsg">
+ Uso linea di comando del programma [APP_NAME] :
+ </string>
+ <string name="MBUnableToAccessFile">
+ Il programma [APP_NAME] non è in grado di accedere ad un file necessario.
Potrebbe darsi che tu abbia copie multiple attivate o che il tuo sistema reputi erroneamente che il file sia già aperto.
Se il problema persiste, riavvia il computer e riprova.
-Se il problema continua ancora, dovresti completamente disinstallare l'applicazione [APP_NAME] e reinstallarla.</string>
- <string name="MBFatalError">Errore critico</string>
- <string name="MBRequiresAltiVec">Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore).</string>
- <string name="MBAlreadyRunning">Il programma [APP_NAME] è già attivo.
+Se il problema continua ancora, dovresti completamente disinstallare l'applicazione [APP_NAME] e reinstallarla.
+ </string>
+ <string name="MBFatalError">
+ Errore critico
+ </string>
+ <string name="MBRequiresAltiVec">
+ Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore).
+ </string>
+ <string name="MBAlreadyRunning">
+ Il programma [APP_NAME] è già attivo.
Controlla che il programma non sia minimizzato nella tua barra degli strumenti.
-Se il messaggio persiste, riavvia il computer.</string>
- <string name="MBFrozenCrashed">Sembra che [APP_NAME] si sia bloccata o interrotta nella sessione precedente.
-Vuoi mandare un crash report?</string>
- <string name="MBAlert">Avviso</string>
- <string name="MBNoDirectX">Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore.
+Se il messaggio persiste, riavvia il computer.
+ </string>
+ <string name="MBFrozenCrashed">
+ Sembra che [APP_NAME] si sia bloccata o interrotta nella sessione precedente.
+Vuoi mandare un crash report?
+ </string>
+ <string name="MBAlert">
+ Avviso
+ </string>
+ <string name="MBNoDirectX">
+ Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore.
[APP_NAME] usa DirectX per rilevare hardware e/o i driver non aggiornati che possono causare problemi di stabilità, scarsa performance e interruzioni. Benché tu possa avviare il programma [APP_NAME] senza di esse, consigliamo caldamente l'esecuzione con DirectX 9.0b.
-Vuoi continuare?</string>
- <string name="MBWarning">Attenzione</string>
- <string name="MBNoAutoUpdate">L'aggiornamento automatico non è stato ancora realizzato per Linux.
-Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com.</string>
- <string name="MBRegClassFailed">RegisterClass non riuscito</string>
- <string name="MBError">Errore</string>
- <string name="MBFullScreenErr">Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT].
-Visualizzazione corrente in modalità finestra.</string>
- <string name="MBDestroyWinFailed">Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito)</string>
- <string name="MBShutdownErr">Errore di arresto</string>
- <string name="MBDevContextErr">Impossibile caricare i driver GL</string>
- <string name="MBPixelFmtErr">Impossibile trovare un formato pixel adatto</string>
- <string name="MBPixelFmtDescErr">Impossibile ottenere una descrizione del formato pixel</string>
- <string name="MBTrueColorWindow">[APP_NAME] richiede True Color (32 bit) per funzionare.
-Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit.</string>
- <string name="MBAlpha">[APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video.
+Vuoi continuare?
+ </string>
+ <string name="MBWarning">
+ Attenzione
+ </string>
+ <string name="MBNoAutoUpdate">
+ L'aggiornamento automatico non è stato ancora realizzato per Linux.
+Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass non riuscito
+ </string>
+ <string name="MBError">
+ Errore
+ </string>
+ <string name="MBFullScreenErr">
+ Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT].
+Visualizzazione corrente in modalità finestra.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito)
+ </string>
+ <string name="MBShutdownErr">
+ Errore di arresto
+ </string>
+ <string name="MBDevContextErr">
+ Impossibile caricare i driver GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Impossibile trovare un formato pixel adatto
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Impossibile ottenere una descrizione del formato pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] richiede True Color (32 bit) per funzionare.
+Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video.
Assicurati di avere installato i driver della scheda video più recenti.
Assicurati anche che il monitor sia impostato a True Color (32 bit) nel Pannello di controllo &gt; Schermo &gt; Impostazioni.
-Se il messaggio persiste, contatta [SUPPORT_SITE].</string>
- <string name="MBPixelFmtSetErr">Impossibile impostare il formato pixel</string>
- <string name="MBGLContextErr">Impossibile creare il GL rendering</string>
- <string name="MBGLContextActErr">Impossibile attivare il GL rendering</string>
- <string name="MBVideoDrvErr">[APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo.
+Se il messaggio persiste, contatta [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Impossibile impostare il formato pixel
+ </string>
+ <string name="MBGLContextErr">
+ Impossibile creare il GL rendering
+ </string>
+ <string name="MBGLContextActErr">
+ Impossibile attivare il GL rendering
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo.
-Se il messaggio persiste, contatta [SUPPORT_SITE].</string>
- <string name="5 O'Clock Shadow">Barba leggera</string>
- <string name="All White">Tutti bianchi</string>
- <string name="Anime Eyes">Occhi grandi</string>
- <string name="Arced">Arcuato</string>
- <string name="Arm Length">Lunghezza braccia</string>
- <string name="Attached">Attaccato</string>
- <string name="Attached Earlobes">Lobi attaccati</string>
- <string name="Back Fringe">Frangetta all'indietro</string>
- <string name="Baggy">Larghi</string>
- <string name="Bangs">Frange</string>
- <string name="Beady Eyes">Occhi piccoli</string>
- <string name="Belly Size">Punto vita</string>
- <string name="Big">Grande</string>
- <string name="Big Butt">Sedere grande</string>
- <string name="Big Hair Back">Capigliatura grande: Indietro</string>
- <string name="Big Hair Front">Capigliatura grande: anteriore</string>
- <string name="Big Hair Top">Capigliatura grande: in alto</string>
- <string name="Big Head">Grande testa</string>
- <string name="Big Pectorals">Grandi pettorali</string>
- <string name="Big Spikes">Capelli con punte</string>
- <string name="Black">Nero</string>
- <string name="Blonde">Biondo</string>
- <string name="Blonde Hair">Capelli biondi</string>
- <string name="Blush">Fard</string>
- <string name="Blush Color">Colore fard</string>
- <string name="Blush Opacity">Opacità fard</string>
- <string name="Body Definition">Definizione muscolare</string>
- <string name="Body Fat">Grasso corporeo</string>
- <string name="Body Freckles">Lentiggini e nei</string>
- <string name="Body Thick">Corpo più robusto</string>
- <string name="Body Thickness">Robustezza del corpo</string>
- <string name="Body Thin">Corpo più magro</string>
- <string name="Bow Legged">Gambe arcuate</string>
- <string name="Breast Buoyancy">Altezza del seno</string>
- <string name="Breast Cleavage">Décolleté</string>
- <string name="Breast Size">Grandezza del seno</string>
- <string name="Bridge Width">Larghezza setto</string>
- <string name="Broad">Largo</string>
- <string name="Brow Size">Grandezza delle sopracciglia</string>
- <string name="Bug Eyes">Occhi sporgenti</string>
- <string name="Bugged Eyes">Occhi sporgenti</string>
- <string name="Bulbous">Bulboso</string>
- <string name="Bulbous Nose">Naso bulboso</string>
- <string name="Breast Physics Mass">Massa seno</string>
- <string name="Breast Physics Smoothing">Lisciatura seno</string>
- <string name="Breast Physics Gravity">Gravità seno</string>
- <string name="Breast Physics Drag">Resistenza seno</string>
- <string name="Breast Physics InOut Max Effect">Massimo effetto</string>
- <string name="Breast Physics InOut Spring">Elasticità</string>
- <string name="Breast Physics InOut Gain">Guadagno</string>
- <string name="Breast Physics InOut Damping">Attenuazione</string>
- <string name="Breast Physics UpDown Max Effect">Massimo effetto</string>
- <string name="Breast Physics UpDown Spring">Elasticità</string>
- <string name="Breast Physics UpDown Gain">Guadagno</string>
- <string name="Breast Physics UpDown Damping">Attenuazione</string>
- <string name="Breast Physics LeftRight Max Effect">Massimo effetto</string>
- <string name="Breast Physics LeftRight Spring">Elasticità</string>
- <string name="Breast Physics LeftRight Gain">Guadagno</string>
- <string name="Breast Physics LeftRight Damping">Attenuazione</string>
- <string name="Belly Physics Mass">Massa pancia</string>
- <string name="Belly Physics Smoothing">Lisciatura pancia</string>
- <string name="Belly Physics Gravity">Gravità pancia</string>
- <string name="Belly Physics Drag">Resistenza pancia</string>
- <string name="Belly Physics UpDown Max Effect">Massimo effetto</string>
- <string name="Belly Physics UpDown Spring">Elasticità</string>
- <string name="Belly Physics UpDown Gain">Guadagno</string>
- <string name="Belly Physics UpDown Damping">Attenuazione</string>
- <string name="Butt Physics Mass">Massa natiche</string>
- <string name="Butt Physics Smoothing">Lisciatura natiche</string>
- <string name="Butt Physics Gravity">Gravità natiche</string>
- <string name="Butt Physics Drag">Resistenza natiche</string>
- <string name="Butt Physics UpDown Max Effect">Massimo effetto</string>
- <string name="Butt Physics UpDown Spring">Elasticità</string>
- <string name="Butt Physics UpDown Gain">Guadagno</string>
- <string name="Butt Physics UpDown Damping">Attenuazione</string>
- <string name="Butt Physics LeftRight Max Effect">Massimo effetto</string>
- <string name="Butt Physics LeftRight Spring">Elasticità</string>
- <string name="Butt Physics LeftRight Gain">Guadagno</string>
- <string name="Butt Physics LeftRight Damping">Attenuazione</string>
- <string name="Bushy Eyebrows">Sopracciglia cespugliose</string>
- <string name="Bushy Hair">Capelli a cespuglio</string>
- <string name="Butt Size">Grandezza del sedere</string>
- <string name="Butt Gravity">Gravità natiche</string>
- <string name="bustle skirt">Crinolina</string>
- <string name="no bustle">Nessuna crinolina</string>
- <string name="more bustle">Più crinolina</string>
- <string name="Chaplin">Baffetti</string>
- <string name="Cheek Bones">Zigomi</string>
- <string name="Chest Size">Ampiezza del torace</string>
- <string name="Chin Angle">Angolo del mento</string>
- <string name="Chin Cleft">Fossetta sul mento</string>
- <string name="Chin Curtains">Barba sottomento</string>
- <string name="Chin Depth">Profondità mento</string>
- <string name="Chin Heavy">Mento forte</string>
- <string name="Chin In">Mento in dentro</string>
- <string name="Chin Out">Mento sporgente</string>
- <string name="Chin-Neck">Mento-collo</string>
- <string name="Clear">Trasparente</string>
- <string name="Cleft">Fossetta</string>
- <string name="Close Set Eyes">Occhi ravvicinati</string>
- <string name="Closed">Chiusa</string>
- <string name="Closed Back">Chiuso dietro</string>
- <string name="Closed Front">Chiuso davanti</string>
- <string name="Closed Left">Chiuso sinistra</string>
- <string name="Closed Right">Chiuso destra</string>
- <string name="Coin Purse">Meno pronunciati</string>
- <string name="Collar Back">Colletto posteriore</string>
- <string name="Collar Front">Colletto anteriore</string>
- <string name="Corner Down">Angolo all'ingiù</string>
- <string name="Corner Up">Angolo all'insù</string>
- <string name="Creased">Piega</string>
- <string name="Crooked Nose">Naso storto</string>
- <string name="Cuff Flare">Svasato con risvolto</string>
- <string name="Dark">Scuro</string>
- <string name="Dark Green">Verde scuro</string>
- <string name="Darker">Più scuro</string>
- <string name="Deep">Profondo</string>
- <string name="Default Heels">Tacchi standard</string>
- <string name="Dense">Folti</string>
- <string name="Double Chin">Doppio mento</string>
- <string name="Downturned">All'ingiù</string>
- <string name="Duffle Bag">Più pronunciati</string>
- <string name="Ear Angle">Angolo orecchie</string>
- <string name="Ear Size">Grandezza orecchie</string>
- <string name="Ear Tips">Estremità orecchie</string>
- <string name="Egg Head">Ovalizzazione testa</string>
- <string name="Eye Bags">Occhiaie</string>
- <string name="Eye Color">Colore degli occhi</string>
- <string name="Eye Depth">Profondità degli occhi</string>
- <string name="Eye Lightness">Luminosità degli occhi</string>
- <string name="Eye Opening">Apertura degli occhi</string>
- <string name="Eye Pop">Prominenza degli occhi</string>
- <string name="Eye Size">Grandezza occhi</string>
- <string name="Eye Spacing">Distanza occhi</string>
- <string name="Eyebrow Arc">Arco delle sopracciglia</string>
- <string name="Eyebrow Density">Densità delle sopracciglia</string>
- <string name="Eyebrow Height">Altezza delle sopracciglia</string>
- <string name="Eyebrow Points">Sopracciglia appuntite</string>
- <string name="Eyebrow Size">Grandezza sopracciglia</string>
- <string name="Eyelash Length">Lunghezza delle ciglia</string>
- <string name="Eyeliner">Eyeliner</string>
- <string name="Eyeliner Color">Colore dell'eyeliner</string>
- <string name="Eyes Bugged">Occhi sporgenti</string>
- <string name="Face Shear">Taglio del viso</string>
- <string name="Facial Definition">Definizione del viso</string>
- <string name="Far Set Eyes">Occhi distanti</string>
- <string name="Fat Lips">Labbra carnose</string>
- <string name="Female">Femmina</string>
- <string name="Fingerless">Senza dita</string>
- <string name="Fingers">Dita</string>
- <string name="Flared Cuffs">Risvolti svasati</string>
- <string name="Flat">Piatto</string>
- <string name="Flat Butt">Sedere piatto</string>
- <string name="Flat Head">Testa piatta</string>
- <string name="Flat Toe">Punta piatta</string>
- <string name="Foot Size">Misura piede</string>
- <string name="Forehead Angle">Angolo della fronte</string>
- <string name="Forehead Heavy">Fronte sporgente</string>
- <string name="Freckles">Lentiggini</string>
- <string name="Front Fringe">Frangetta</string>
- <string name="Full Back">Dietro gonfi</string>
- <string name="Full Eyeliner">Eyeliner marcato</string>
- <string name="Full Front">Anteriore gonfio</string>
- <string name="Full Hair Sides">Lati capelli gonfi</string>
- <string name="Full Sides">Lati gonfi</string>
- <string name="Glossy">Lucido</string>
- <string name="Glove Fingers">Dita con guanti</string>
- <string name="Glove Length">Lunghezza guanti</string>
- <string name="Hair">Capigliature</string>
- <string name="Hair Back">Capelli: Indietro</string>
- <string name="Hair Front">Capelli: anteriore</string>
- <string name="Hair Sides">Capelli: lati</string>
- <string name="Hair Sweep">Direzione capigliatura</string>
- <string name="Hair Thickess">Foltezza</string>
- <string name="Hair Thickness">Foltezza</string>
- <string name="Hair Tilt">Inclinazione</string>
- <string name="Hair Tilted Left">Verso sinistra</string>
- <string name="Hair Tilted Right">Verso destra</string>
- <string name="Hair Volume">Capelli: Volume</string>
- <string name="Hand Size">Grandezza mani</string>
- <string name="Handlebars">Baffi a manubrio</string>
- <string name="Head Length">Lunghezza testa</string>
- <string name="Head Shape">Forma della testa</string>
- <string name="Head Size">Grandezza della testa</string>
- <string name="Head Stretch">Allungamento testa</string>
- <string name="Heel Height">Altezza tacchi</string>
- <string name="Heel Shape">Forma tacchi</string>
- <string name="Height">Altezza</string>
- <string name="High">Alto</string>
- <string name="High Heels">Tacchi alti</string>
- <string name="High Jaw">Mandibola alta</string>
- <string name="High Platforms">Alta</string>
- <string name="High and Tight">Alto e stretto</string>
- <string name="Higher">Più alto</string>
- <string name="Hip Length">Altezza bacino</string>
- <string name="Hip Width">Larghezza bacino</string>
- <string name="Hover">Muovi sopra</string>
- <string name="In">Dentro</string>
- <string name="In Shdw Color">Colore ombretto interno</string>
- <string name="In Shdw Opacity">Opacità ombretto interno</string>
- <string name="Inner Eye Corner">Angolo interno</string>
- <string name="Inner Eye Shadow">Ombretto interno</string>
- <string name="Inner Shadow">Ombretto interno</string>
- <string name="Jacket Length">Lunghezza giacca</string>
- <string name="Jacket Wrinkles">Grinze della giacca</string>
- <string name="Jaw Angle">Angolo mandibola</string>
- <string name="Jaw Jut">Prognatismo mento</string>
- <string name="Jaw Shape">Forma del mento</string>
- <string name="Join">Iscriviti</string>
- <string name="Jowls">Guance</string>
- <string name="Knee Angle">Angolo ginocchia</string>
- <string name="Knock Kneed">Gambe ad X</string>
- <string name="Large">Grande</string>
- <string name="Large Hands">Mani grandi</string>
- <string name="Left Part">Riga a sinistra</string>
- <string name="Leg Length">Lunghezza gambe</string>
- <string name="Leg Muscles">Muscoli gambe</string>
- <string name="Less">Meno</string>
- <string name="Less Body Fat">Meno grasso corporeo</string>
- <string name="Less Curtains">Meno</string>
- <string name="Less Freckles">Meno lentiggini</string>
- <string name="Less Full">Meno piene</string>
- <string name="Less Gravity">Più alto</string>
- <string name="Less Love">Meno maniglie</string>
- <string name="Less Muscles">Meno muscoli</string>
- <string name="Less Muscular">Meno muscolari</string>
- <string name="Less Rosy">Meno rosato</string>
- <string name="Less Round">Meno rotondo</string>
- <string name="Less Saddle">Meno a sella</string>
- <string name="Less Square">Meno quadrato</string>
- <string name="Less Volume">Meno volume</string>
- <string name="Less soul">Meno</string>
- <string name="Lighter">Più leggero</string>
- <string name="Lip Cleft">Distanza fossetta labbro</string>
- <string name="Lip Cleft Depth">Prof. fossetta labbro</string>
- <string name="Lip Fullness">Volume labbra</string>
- <string name="Lip Pinkness">Tonalità rosa labbra</string>
- <string name="Lip Ratio">Proporzione labbra</string>
- <string name="Lip Thickness">Carnosità labbra</string>
- <string name="Lip Width">Larghezza labbra</string>
- <string name="Lipgloss">Lipgloss</string>
- <string name="Lipstick">Rossetto</string>
- <string name="Lipstick Color">Colore rossetto</string>
- <string name="Long">Lungo</string>
- <string name="Long Head">Testa lunga</string>
- <string name="Long Hips">Bacino alto</string>
- <string name="Long Legs">Gambe lunghe</string>
- <string name="Long Neck">Collo lungo</string>
- <string name="Long Pigtails">Codini lunghi</string>
- <string name="Long Ponytail">Codino lungo</string>
- <string name="Long Torso">Torace lungo</string>
- <string name="Long arms">Braccia lunghe</string>
- <string name="Loose Pants">Pantaloni ampi</string>
- <string name="Loose Shirt">Camicia ampia</string>
- <string name="Loose Sleeves">Maniche non attillate</string>
- <string name="Love Handles">Maniglie dell'amore</string>
- <string name="Low">Basso</string>
- <string name="Low Heels">Tacchi bassi</string>
- <string name="Low Jaw">Mandibola bassa</string>
- <string name="Low Platforms">Bassa</string>
- <string name="Low and Loose">Basso e ampio</string>
- <string name="Lower">Più basso</string>
- <string name="Lower Bridge">Parte bassa del setto</string>
- <string name="Lower Cheeks">Guance inferiori</string>
- <string name="Male">Maschio</string>
- <string name="Middle Part">Riga nel mezzo</string>
- <string name="More">Altro</string>
- <string name="More Blush">Più fard</string>
- <string name="More Body Fat">Più grasso corporeo</string>
- <string name="More Curtains">Più</string>
- <string name="More Eyeshadow">Più ombretto</string>
- <string name="More Freckles">Più lentiggini</string>
- <string name="More Full">Più piene</string>
- <string name="More Gravity">Più calato</string>
- <string name="More Lipstick">Più rossetto</string>
- <string name="More Love">Più maniglie</string>
- <string name="More Lower Lip">Labbro inf. pronunciato</string>
- <string name="More Muscles">Più muscoli</string>
- <string name="More Muscular">Più muscolatura</string>
- <string name="More Rosy">Più rosato</string>
- <string name="More Round">Più rotondo</string>
- <string name="More Saddle">Più a sella</string>
- <string name="More Sloped">Più orizzontale</string>
- <string name="More Square">Più quadrato</string>
- <string name="More Upper Lip">Labbro sup. pronunciato</string>
- <string name="More Vertical">Più verticale</string>
- <string name="More Volume">Più volume</string>
- <string name="More soul">Più</string>
- <string name="Moustache">Baffi</string>
- <string name="Mouth Corner">Angolo della bocca</string>
- <string name="Mouth Position">Posizione della bocca</string>
- <string name="Mowhawk">Moicana</string>
- <string name="Muscular">Muscolatura</string>
- <string name="Mutton Chops">Basette lunghe</string>
- <string name="Nail Polish">Smalto</string>
- <string name="Nail Polish Color">Colore smalto</string>
- <string name="Narrow">Socchiusi</string>
- <string name="Narrow Back">Laterali post. vicini</string>
- <string name="Narrow Front">Laterali ant. vicini</string>
- <string name="Narrow Lips">Labbra strette</string>
- <string name="Natural">Naturale</string>
- <string name="Neck Length">Lunghezza del collo</string>
- <string name="Neck Thickness">Grandezza del collo</string>
- <string name="No Blush">Senza fard</string>
- <string name="No Eyeliner">Senza eyeliner</string>
- <string name="No Eyeshadow">Senza ombretto</string>
- <string name="No Lipgloss">Senza lipgloss</string>
- <string name="No Lipstick">Senza rossetto</string>
- <string name="No Part">Senza riga</string>
- <string name="No Polish">Senza smalto</string>
- <string name="No Red">Senza rosso</string>
- <string name="No Spikes">Senza punte</string>
- <string name="No White">Senza bianco</string>
- <string name="No Wrinkles">Senza pieghe</string>
- <string name="Normal Lower">Inferiore normale</string>
- <string name="Normal Upper">Superiore normale</string>
- <string name="Nose Left">Naso a sinistra</string>
- <string name="Nose Right">Naso a destra</string>
- <string name="Nose Size">Grandezza naso</string>
- <string name="Nose Thickness">Spessore naso</string>
- <string name="Nose Tip Angle">Angolo punta naso</string>
- <string name="Nose Tip Shape">Forma punta naso</string>
- <string name="Nose Width">Larghezza naso</string>
- <string name="Nostril Division">Divisione narici</string>
- <string name="Nostril Width">Larghezza narici</string>
- <string name="Opaque">Opaco</string>
- <string name="Open">Apri</string>
- <string name="Open Back">Retro aperto</string>
- <string name="Open Front">Davanti aperto</string>
- <string name="Open Left">Lato sin. aperto</string>
- <string name="Open Right">Lato des. aperto</string>
- <string name="Orange">Arancio</string>
- <string name="Out">Fuori</string>
- <string name="Out Shdw Color">Colore ombretto esterno</string>
- <string name="Out Shdw Opacity">Opacità ombretto esterno</string>
- <string name="Outer Eye Corner">Angolo esterno occhio</string>
- <string name="Outer Eye Shadow">Ombretto esterno</string>
- <string name="Outer Shadow">Ombreggiatura esterna</string>
- <string name="Overbite">Denti sup. in fuori</string>
- <string name="Package">Genitali</string>
- <string name="Painted Nails">Unghie smaltate</string>
- <string name="Pale">Pallido</string>
- <string name="Pants Crotch">Cavallo</string>
- <string name="Pants Fit">Vestibilità pantaloni</string>
- <string name="Pants Length">Lunghezza pantaloni</string>
- <string name="Pants Waist">Taglia pantalone</string>
- <string name="Pants Wrinkles">Pantaloni con le grinze</string>
- <string name="Part">Con riga</string>
- <string name="Part Bangs">Frangetta divisa</string>
- <string name="Pectorals">Pettorali</string>
- <string name="Pigment">Pigmento</string>
- <string name="Pigtails">Codini</string>
- <string name="Pink">Rosa</string>
- <string name="Pinker">Più rosato</string>
- <string name="Platform Height">Altezza pianta</string>
- <string name="Platform Width">Larghezza pianta</string>
- <string name="Pointy">Appuntito</string>
- <string name="Pointy Heels">Tacchi a spillo</string>
- <string name="Ponytail">Codino</string>
- <string name="Poofy Skirt">Gonna gonfia</string>
- <string name="Pop Left Eye">Sinistro più aperto</string>
- <string name="Pop Right Eye">Destro più aperto</string>
- <string name="Puffy">Paffute</string>
- <string name="Puffy Eyelids">Palpebre gonfie</string>
- <string name="Rainbow Color">Tonalità</string>
- <string name="Red Hair">Presenza di rosso nei capelli</string>
- <string name="Regular">Normale</string>
- <string name="Right Part">Riga a destra</string>
- <string name="Rosy Complexion">Incarnato</string>
- <string name="Round">Rotondo</string>
- <string name="Ruddiness">Rossore</string>
- <string name="Ruddy">Rosse</string>
- <string name="Rumpled Hair">Capelli mossi</string>
- <string name="Saddle Bags">Rotondità fianchi</string>
- <string name="Scrawny Leg">Gambe magre</string>
- <string name="Separate">Separati</string>
- <string name="Shallow">Meno pronunciato</string>
- <string name="Shear Back">Taglio posteriore</string>
- <string name="Shear Face">Taglio del viso</string>
- <string name="Shear Front">Taglio anteriore</string>
- <string name="Shear Left Up">Distorto a sinistra</string>
- <string name="Shear Right Up">Distorto a destra</string>
- <string name="Sheared Back">Taglio verso dietro</string>
- <string name="Sheared Front">Taglio verso davanti</string>
- <string name="Shift Left">A sinistra</string>
- <string name="Shift Mouth">Spostamento bocca</string>
- <string name="Shift Right">A destra</string>
- <string name="Shirt Bottom">Parte inferiore camicia</string>
- <string name="Shirt Fit">Vestibilità camicia</string>
- <string name="Shirt Wrinkles">Camicia con le grinze</string>
- <string name="Shoe Height">Altezza scarpe</string>
- <string name="Short">Basso</string>
- <string name="Short Arms">Braccia corte</string>
- <string name="Short Legs">Gambe corte</string>
- <string name="Short Neck">Collo corto</string>
- <string name="Short Pigtails">Codini corti</string>
- <string name="Short Ponytail">Codino corto</string>
- <string name="Short Sideburns">Basette corte</string>
- <string name="Short Torso">Torace corto</string>
- <string name="Short hips">Bacino corto</string>
- <string name="Shoulders">Spalle</string>
- <string name="Side Fringe">Ciuffi laterali</string>
- <string name="Sideburns">Basette</string>
- <string name="Sides Hair">Capigliatura di lato</string>
- <string name="Sides Hair Down">Capigliatura di lato sciolta</string>
- <string name="Sides Hair Up">Capigliatura di lato raccolta</string>
- <string name="Skinny Neck">Collo fino</string>
- <string name="Skirt Fit">Vestibilità gonna</string>
- <string name="Skirt Length">Lunghezza gonna</string>
- <string name="Slanted Forehead">Fronte inclinata</string>
- <string name="Sleeve Length">Lunghezza maniche</string>
- <string name="Sleeve Looseness">Morbidezza maniche</string>
- <string name="Slit Back">Spacco: Indietro</string>
- <string name="Slit Front">Spacco: anteriore</string>
- <string name="Slit Left">Spacco: Sinistra</string>
- <string name="Slit Right">Spacco: Destra</string>
- <string name="Small">Piccola</string>
- <string name="Small Hands">Mani piccole</string>
- <string name="Small Head">Testa piccola</string>
- <string name="Smooth">Liscio</string>
- <string name="Smooth Hair">Capelli lisci</string>
- <string name="Socks Length">Lunghezza calze</string>
- <string name="Soulpatch">Pizzetto labbro inferiore</string>
- <string name="Sparse">Piu rade</string>
- <string name="Spiked Hair">Capelli a punta</string>
- <string name="Square">Quadrato</string>
- <string name="Square Toe">Punta quadrata</string>
- <string name="Squash Head">Testa schiacciata</string>
- <string name="Stretch Head">Testa allungata</string>
- <string name="Sunken">Scarne</string>
- <string name="Sunken Chest">Senza pettorali</string>
- <string name="Sunken Eyes">Occhi infossati</string>
- <string name="Sweep Back">Indietro</string>
- <string name="Sweep Forward">Avanti</string>
- <string name="Tall">Alto</string>
- <string name="Taper Back">Ravv. lat. posteriore</string>
- <string name="Taper Front">Ravv. lat. frontale</string>
- <string name="Thick Heels">Tacchi spessi</string>
- <string name="Thick Neck">Collo grosso</string>
- <string name="Thick Toe">Punta spessa</string>
- <string name="Thin">Sottili</string>
- <string name="Thin Eyebrows">Sopracciglia sottili</string>
- <string name="Thin Lips">Labbra sottili</string>
- <string name="Thin Nose">Naso sottile</string>
- <string name="Tight Chin">Mento stretto</string>
- <string name="Tight Cuffs">Fondo stretto</string>
- <string name="Tight Pants">Pantaloni attillati</string>
- <string name="Tight Shirt">Camicia attillata</string>
- <string name="Tight Skirt">Gonna attillata</string>
- <string name="Tight Sleeves">Maniche strette</string>
- <string name="Toe Shape">Forma della punta</string>
- <string name="Toe Thickness">Spessore della punta</string>
- <string name="Torso Length">Lunghezza del torace</string>
- <string name="Torso Muscles">Muscoli del torace</string>
- <string name="Torso Scrawny">Torso Scrawny</string>
- <string name="Unattached">Distaccato</string>
- <string name="Uncreased">Senza piega</string>
- <string name="Underbite">Denti inf. in fuori</string>
- <string name="Unnatural">Innaturale</string>
- <string name="Upper Bridge">Parte alta del setto</string>
- <string name="Upper Cheeks">Parte alta degli zigomi</string>
- <string name="Upper Chin Cleft">Fossetta sup. del mento</string>
- <string name="Upper Eyelid Fold">Piega palpebra sup.</string>
- <string name="Upturned">All'insù</string>
- <string name="Very Red">Molto rossi</string>
- <string name="Waist Height">Vita alta</string>
- <string name="Well-Fed">Pienotte</string>
- <string name="White Hair">Capelli bianchi</string>
- <string name="Wide">Largo</string>
- <string name="Wide Back">Dietro largo</string>
- <string name="Wide Front">Davanti largo</string>
- <string name="Wide Lips">Labbra larghe</string>
- <string name="Wild">Colorati</string>
- <string name="Wrinkles">Grinze</string>
- <string name="LocationCtrlAddLandmarkTooltip">Aggiungi ai miei punti di riferimento</string>
- <string name="LocationCtrlEditLandmarkTooltip">Modifica i miei punti di riferimento</string>
- <string name="LocationCtrlInfoBtnTooltip">Maggiori informazioni sulla posizione attuale</string>
- <string name="LocationCtrlComboBtnTooltip">La cronologia delle mie posizioni</string>
- <string name="LocationCtrlAdultIconTooltip">Regione con categoria adulti</string>
- <string name="LocationCtrlModerateIconTooltip">Regione con categoria moderata</string>
- <string name="LocationCtrlGeneralIconTooltip">Regione generale</string>
- <string name="LocationCtrlSeeAVsTooltip">Gli avatar in questo lotto non possono essere visti o sentiti da avatar all'esterno del lotto</string>
- <string name="LocationCtrlPathfindingDirtyTooltip">Gli oggetti che si muovono potrebbero non comportarsi correttamente in questa regione fino a quando non viene eseguito il rebake della regione.</string>
- <string name="LocationCtrlPathfindingDisabledTooltip">Il pathfinding dinamico non è attivato in questa regione.</string>
- <string name="UpdaterWindowTitle">Aggiornamento [APP_NAME]</string>
- <string name="UpdaterNowUpdating">Aggiornamento di [APP_NAME]...</string>
- <string name="UpdaterNowInstalling">Installazione di [APP_NAME]...</string>
- <string name="UpdaterUpdatingDescriptive">Il Viewer del programma [APP_NAME] si sta aggiornando all'ultima versione. Potrebbe volerci del tempo, attendi.</string>
- <string name="UpdaterProgressBarTextWithEllipses">Download dell'aggiornamento...</string>
- <string name="UpdaterProgressBarText">Download dell'aggiornamento</string>
- <string name="UpdaterFailDownloadTitle">Download dell'aggiornamento non riuscito</string>
- <string name="UpdaterFailUpdateDescriptive">Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com.</string>
- <string name="UpdaterFailInstallTitle">Installazione dell'aggiornamento non riuscita</string>
- <string name="UpdaterFailStartTitle">Errore nell'avvio del viewer</string>
- <string name="ItemsComingInTooFastFrom">[APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi</string>
- <string name="ItemsComingInTooFast">[APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi</string>
- <string name="IM_logging_string">-- Registrazione messaggi instantanei abilitata --</string>
- <string name="IM_typing_start_string">[NAME] sta scrivendo...</string>
- <string name="Unnamed">(anonimo)</string>
- <string name="IM_moderated_chat_label">(Moderato: Voci disattivate di default)</string>
- <string name="IM_unavailable_text_label">La chat di testo non è disponibile per questa chiamata.</string>
- <string name="IM_muted_text_label">La chat di testo è stata disabilitata da un moderatore di gruppo.</string>
- <string name="IM_default_text_label">Clicca qui per inviare un messaggio instantaneo.</string>
- <string name="IM_to_label">A</string>
- <string name="IM_moderator_label">(Moderatore)</string>
- <string name="Saved_message">(Salvato [LONG_TIMESTAMP])</string>
- <string name="IM_unblock_only_groups_friends">Per vedere questo messaggio, devi deselezionare 'Solo amici e gruppi possono chiamarmi o mandarmi IM' in Preferenze/Privacy.</string>
- <string name="OnlineStatus">Online</string>
- <string name="OfflineStatus">Offline</string>
- <string name="not_online_msg">Utente non online - il messaggio verrà memorizzato e inviato più tardi.</string>
- <string name="not_online_inventory">Utente non online - l'inventario è stato salvato</string>
- <string name="answered_call">Risposto alla chiamata</string>
- <string name="you_started_call">Hai iniziato una chiamata vocale</string>
- <string name="you_joined_call">Ti sei collegato alla chiamata in voce</string>
- <string name="you_auto_rejected_call-im">Hai rifiutato automaticamente la chiamata voce mentre era attivata la modalità 'Non disturbare'.</string>
- <string name="name_started_call">[NAME] ha iniziato una chiamata vocale</string>
- <string name="ringing-im">Collegamento alla chiamata vocale...</string>
- <string name="connected-im">Collegato, clicca Chiudi chiamata per agganciare</string>
- <string name="hang_up-im">Chiusa la chiamata</string>
- <string name="conference-title">Chat con più persone</string>
- <string name="conference-title-incoming">Chiamata in conferenza con [AGENT_NAME]</string>
- <string name="inventory_item_offered-im">Offerto oggetto di inventario &quot;[ITEM_NAME]&quot;</string>
- <string name="inventory_folder_offered-im">Offerta cartella di inventario &quot;[ITEM_NAME]&quot;</string>
- <string name="facebook_post_success">Hai pubblicato su Facebook.</string>
- <string name="flickr_post_success">Hai pubblicato su Flickr.</string>
- <string name="twitter_post_success">Hai pubblicato su Twitter.</string>
- <string name="no_session_message">(La sessione IM non esiste)</string>
- <string name="only_user_message">Sei l'unico utente di questa sessione.</string>
- <string name="offline_message">[NAME] è offline</string>
- <string name="invite_message">Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.</string>
- <string name="muted_message">Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato.</string>
- <string name="generic">Errore nella richiesta, riprova più tardi.</string>
- <string name="generic_request_error">Errore durante la richiesta, riprova più tardi.</string>
- <string name="insufficient_perms_error">Non hai sufficienti permessi.</string>
- <string name="session_does_not_exist_error">Questa sessione non esiste più</string>
- <string name="no_ability_error">Non hai questa abilitazione.</string>
- <string name="no_ability">Non hai questa abilitazione.</string>
- <string name="not_a_mod_error">Non sei un moderatore.</string>
- <string name="muted">Il moderatore del gruppo ha disattivato la tua chat di testo.</string>
- <string name="muted_error">Un moderatore di gruppo ti ha disabilitato dalla chat di testo.</string>
- <string name="add_session_event">Impossibile aggiungere utenti alla chat con [RECIPIENT].</string>
- <string name="message">Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT].</string>
- <string name="message_session_event">Impossibile inviare il messaggio nella chat con [RECIPIENT].</string>
- <string name="mute">Errore durante la moderazione.</string>
- <string name="removed">Sei stato rimosso dal gruppo.</string>
- <string name="removed_from_group">Sei stato espulso dal gruppo.</string>
- <string name="close_on_no_ability">Non hai più le abilitazioni per rimanere nella sessione chat.</string>
- <string name="unread_chat_single">[SOURCES] ha detto qualcosa di nuovo</string>
- <string name="unread_chat_multiple">[SOURCES] ha detto qualcosa di nuovo</string>
- <string name="session_initialization_timed_out_error">Sessione di inizializzazione scaduta</string>
- <string name="Home position set.">Posizione di base impostata.</string>
- <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string>
- <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string>
- <string name="paid_you_ldollars">[NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON].</string>
- <string name="paid_you_ldollars_gift">[NAME] ti ha inviato un pagamento di L$ [AMOUNT]: [REASON]</string>
- <string name="paid_you_ldollars_no_reason">[NAME] ti ha inviato un pagamento di L$[AMOUNT].</string>
- <string name="you_paid_ldollars">Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON].</string>
- <string name="you_paid_ldollars_gift">Hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON]</string>
- <string name="you_paid_ldollars_no_info">Hai pagato L$ [AMOUNT].</string>
- <string name="you_paid_ldollars_no_reason">Hai inviato un pagamento di L$[AMOUNT] a [NAME].</string>
- <string name="you_paid_ldollars_no_name">Hai pagato L$ [AMOUNT] [REASON].</string>
- <string name="you_paid_failure_ldollars">Non hai pagato [NAME] L$[AMOUNT] [REASON].</string>
- <string name="you_paid_failure_ldollars_gift">Non hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON]</string>
- <string name="you_paid_failure_ldollars_no_info">Non hai pagato L$ [AMOUNT].</string>
- <string name="you_paid_failure_ldollars_no_reason">Non hai pagato [NAME] L$[AMOUNT].</string>
- <string name="you_paid_failure_ldollars_no_name">Non hai pagato L$ [AMOUNT] [REASON].</string>
- <string name="for item">per [ITEM]</string>
- <string name="for a parcel of land">per un lotto di terreno</string>
- <string name="for a land access pass">per un permesso di accesso al terreno</string>
- <string name="for deeding land">per la cessione di terreno</string>
- <string name="to create a group">per creare un gruppo</string>
- <string name="to join a group">per aderire a un gruppo</string>
- <string name="to upload">per caricare</string>
- <string name="to publish a classified ad">per pubblicare un annuncio</string>
- <string name="giving">Contributo di L$ [AMOUNT]</string>
- <string name="uploading_costs">Il costo per il caricamento è di L$ [AMOUNT]</string>
- <string name="this_costs">Il costo è L$ [AMOUNT]</string>
- <string name="buying_selected_land">L'acquisto del terreno prescelto costa L$ [AMOUNT]</string>
- <string name="this_object_costs">Il costo dell'oggetto è L$ [AMOUNT]</string>
- <string name="group_role_everyone">Tutti</string>
- <string name="group_role_officers">Funzionari</string>
- <string name="group_role_owners">Proprietari</string>
- <string name="group_member_status_online">Online</string>
- <string name="uploading_abuse_report">Caricamento in corso...
+Se il messaggio persiste, contatta [SUPPORT_SITE].
+ </string>
+ <string name="5 O'Clock Shadow">
+ Barba leggera
+ </string>
+ <string name="All White">
+ Tutti bianchi
+ </string>
+ <string name="Anime Eyes">
+ Occhi grandi
+ </string>
+ <string name="Arced">
+ Arcuato
+ </string>
+ <string name="Arm Length">
+ Lunghezza braccia
+ </string>
+ <string name="Attached">
+ Attaccato
+ </string>
+ <string name="Attached Earlobes">
+ Lobi attaccati
+ </string>
+ <string name="Back Fringe">
+ Frangetta all'indietro
+ </string>
+ <string name="Baggy">
+ Larghi
+ </string>
+ <string name="Bangs">
+ Frange
+ </string>
+ <string name="Beady Eyes">
+ Occhi piccoli
+ </string>
+ <string name="Belly Size">
+ Punto vita
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Sedere grande
+ </string>
+ <string name="Big Hair Back">
+ Capigliatura grande: Indietro
+ </string>
+ <string name="Big Hair Front">
+ Capigliatura grande: anteriore
+ </string>
+ <string name="Big Hair Top">
+ Capigliatura grande: in alto
+ </string>
+ <string name="Big Head">
+ Grande testa
+ </string>
+ <string name="Big Pectorals">
+ Grandi pettorali
+ </string>
+ <string name="Big Spikes">
+ Capelli con punte
+ </string>
+ <string name="Black">
+ Nero
+ </string>
+ <string name="Blonde">
+ Biondo
+ </string>
+ <string name="Blonde Hair">
+ Capelli biondi
+ </string>
+ <string name="Blush">
+ Fard
+ </string>
+ <string name="Blush Color">
+ Colore fard
+ </string>
+ <string name="Blush Opacity">
+ Opacità fard
+ </string>
+ <string name="Body Definition">
+ Definizione muscolare
+ </string>
+ <string name="Body Fat">
+ Grasso corporeo
+ </string>
+ <string name="Body Freckles">
+ Lentiggini e nei
+ </string>
+ <string name="Body Thick">
+ Corpo più robusto
+ </string>
+ <string name="Body Thickness">
+ Robustezza del corpo
+ </string>
+ <string name="Body Thin">
+ Corpo più magro
+ </string>
+ <string name="Bow Legged">
+ Gambe arcuate
+ </string>
+ <string name="Breast Buoyancy">
+ Altezza del seno
+ </string>
+ <string name="Breast Cleavage">
+ Décolleté
+ </string>
+ <string name="Breast Size">
+ Grandezza del seno
+ </string>
+ <string name="Bridge Width">
+ Larghezza setto
+ </string>
+ <string name="Broad">
+ Largo
+ </string>
+ <string name="Brow Size">
+ Grandezza delle sopracciglia
+ </string>
+ <string name="Bug Eyes">
+ Occhi sporgenti
+ </string>
+ <string name="Bugged Eyes">
+ Occhi sporgenti
+ </string>
+ <string name="Bulbous">
+ Bulboso
+ </string>
+ <string name="Bulbous Nose">
+ Naso bulboso
+ </string>
+ <string name="Breast Physics Mass">
+ Massa seno
+ </string>
+ <string name="Breast Physics Smoothing">
+ Lisciatura seno
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravità seno
+ </string>
+ <string name="Breast Physics Drag">
+ Resistenza seno
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Attenuazione
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Attenuazione
+ </string>
+ <string name="Belly Physics Mass">
+ Massa pancia
+ </string>
+ <string name="Belly Physics Smoothing">
+ Lisciatura pancia
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravità pancia
+ </string>
+ <string name="Belly Physics Drag">
+ Resistenza pancia
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Butt Physics Mass">
+ Massa natiche
+ </string>
+ <string name="Butt Physics Smoothing">
+ Lisciatura natiche
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravità natiche
+ </string>
+ <string name="Butt Physics Drag">
+ Resistenza natiche
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticità
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Guadagno
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Attenuazione
+ </string>
+ <string name="Bushy Eyebrows">
+ Sopracciglia cespugliose
+ </string>
+ <string name="Bushy Hair">
+ Capelli a cespuglio
+ </string>
+ <string name="Butt Size">
+ Grandezza del sedere
+ </string>
+ <string name="Butt Gravity">
+ Gravità natiche
+ </string>
+ <string name="bustle skirt">
+ Crinolina
+ </string>
+ <string name="no bustle">
+ Nessuna crinolina
+ </string>
+ <string name="more bustle">
+ Più crinolina
+ </string>
+ <string name="Chaplin">
+ Baffetti
+ </string>
+ <string name="Cheek Bones">
+ Zigomi
+ </string>
+ <string name="Chest Size">
+ Ampiezza del torace
+ </string>
+ <string name="Chin Angle">
+ Angolo del mento
+ </string>
+ <string name="Chin Cleft">
+ Fossetta sul mento
+ </string>
+ <string name="Chin Curtains">
+ Barba sottomento
+ </string>
+ <string name="Chin Depth">
+ Profondità mento
+ </string>
+ <string name="Chin Heavy">
+ Mento forte
+ </string>
+ <string name="Chin In">
+ Mento in dentro
+ </string>
+ <string name="Chin Out">
+ Mento sporgente
+ </string>
+ <string name="Chin-Neck">
+ Mento-collo
+ </string>
+ <string name="Clear">
+ Trasparente
+ </string>
+ <string name="Cleft">
+ Fossetta
+ </string>
+ <string name="Close Set Eyes">
+ Occhi ravvicinati
+ </string>
+ <string name="Closed">
+ Chiusa
+ </string>
+ <string name="Closed Back">
+ Chiuso dietro
+ </string>
+ <string name="Closed Front">
+ Chiuso davanti
+ </string>
+ <string name="Closed Left">
+ Chiuso sinistra
+ </string>
+ <string name="Closed Right">
+ Chiuso destra
+ </string>
+ <string name="Coin Purse">
+ Meno pronunciati
+ </string>
+ <string name="Collar Back">
+ Colletto posteriore
+ </string>
+ <string name="Collar Front">
+ Colletto anteriore
+ </string>
+ <string name="Corner Down">
+ Angolo all'ingiù
+ </string>
+ <string name="Corner Up">
+ Angolo all'insù
+ </string>
+ <string name="Creased">
+ Piega
+ </string>
+ <string name="Crooked Nose">
+ Naso storto
+ </string>
+ <string name="Cuff Flare">
+ Svasato con risvolto
+ </string>
+ <string name="Dark">
+ Scuro
+ </string>
+ <string name="Dark Green">
+ Verde scuro
+ </string>
+ <string name="Darker">
+ Più scuro
+ </string>
+ <string name="Deep">
+ Profondo
+ </string>
+ <string name="Default Heels">
+ Tacchi standard
+ </string>
+ <string name="Dense">
+ Folti
+ </string>
+ <string name="Double Chin">
+ Doppio mento
+ </string>
+ <string name="Downturned">
+ All'ingiù
+ </string>
+ <string name="Duffle Bag">
+ Più pronunciati
+ </string>
+ <string name="Ear Angle">
+ Angolo orecchie
+ </string>
+ <string name="Ear Size">
+ Grandezza orecchie
+ </string>
+ <string name="Ear Tips">
+ Estremità orecchie
+ </string>
+ <string name="Egg Head">
+ Ovalizzazione testa
+ </string>
+ <string name="Eye Bags">
+ Occhiaie
+ </string>
+ <string name="Eye Color">
+ Colore degli occhi
+ </string>
+ <string name="Eye Depth">
+ Profondità degli occhi
+ </string>
+ <string name="Eye Lightness">
+ Luminosità degli occhi
+ </string>
+ <string name="Eye Opening">
+ Apertura degli occhi
+ </string>
+ <string name="Eye Pop">
+ Prominenza degli occhi
+ </string>
+ <string name="Eye Size">
+ Grandezza occhi
+ </string>
+ <string name="Eye Spacing">
+ Distanza occhi
+ </string>
+ <string name="Eyebrow Arc">
+ Arco delle sopracciglia
+ </string>
+ <string name="Eyebrow Density">
+ Densità delle sopracciglia
+ </string>
+ <string name="Eyebrow Height">
+ Altezza delle sopracciglia
+ </string>
+ <string name="Eyebrow Points">
+ Sopracciglia appuntite
+ </string>
+ <string name="Eyebrow Size">
+ Grandezza sopracciglia
+ </string>
+ <string name="Eyelash Length">
+ Lunghezza delle ciglia
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Colore dell'eyeliner
+ </string>
+ <string name="Eyes Bugged">
+ Occhi sporgenti
+ </string>
+ <string name="Face Shear">
+ Taglio del viso
+ </string>
+ <string name="Facial Definition">
+ Definizione del viso
+ </string>
+ <string name="Far Set Eyes">
+ Occhi distanti
+ </string>
+ <string name="Fat Lips">
+ Labbra carnose
+ </string>
+ <string name="Female">
+ Femmina
+ </string>
+ <string name="Fingerless">
+ Senza dita
+ </string>
+ <string name="Fingers">
+ Dita
+ </string>
+ <string name="Flared Cuffs">
+ Risvolti svasati
+ </string>
+ <string name="Flat">
+ Piatto
+ </string>
+ <string name="Flat Butt">
+ Sedere piatto
+ </string>
+ <string name="Flat Head">
+ Testa piatta
+ </string>
+ <string name="Flat Toe">
+ Punta piatta
+ </string>
+ <string name="Foot Size">
+ Misura piede
+ </string>
+ <string name="Forehead Angle">
+ Angolo della fronte
+ </string>
+ <string name="Forehead Heavy">
+ Fronte sporgente
+ </string>
+ <string name="Freckles">
+ Lentiggini
+ </string>
+ <string name="Front Fringe">
+ Frangetta
+ </string>
+ <string name="Full Back">
+ Dietro gonfi
+ </string>
+ <string name="Full Eyeliner">
+ Eyeliner marcato
+ </string>
+ <string name="Full Front">
+ Anteriore gonfio
+ </string>
+ <string name="Full Hair Sides">
+ Lati capelli gonfi
+ </string>
+ <string name="Full Sides">
+ Lati gonfi
+ </string>
+ <string name="Glossy">
+ Lucido
+ </string>
+ <string name="Glove Fingers">
+ Dita con guanti
+ </string>
+ <string name="Glove Length">
+ Lunghezza guanti
+ </string>
+ <string name="Hair">
+ Capigliature
+ </string>
+ <string name="Hair Back">
+ Capelli: Indietro
+ </string>
+ <string name="Hair Front">
+ Capelli: anteriore
+ </string>
+ <string name="Hair Sides">
+ Capelli: lati
+ </string>
+ <string name="Hair Sweep">
+ Direzione capigliatura
+ </string>
+ <string name="Hair Thickess">
+ Foltezza
+ </string>
+ <string name="Hair Thickness">
+ Foltezza
+ </string>
+ <string name="Hair Tilt">
+ Inclinazione
+ </string>
+ <string name="Hair Tilted Left">
+ Verso sinistra
+ </string>
+ <string name="Hair Tilted Right">
+ Verso destra
+ </string>
+ <string name="Hair Volume">
+ Capelli: Volume
+ </string>
+ <string name="Hand Size">
+ Grandezza mani
+ </string>
+ <string name="Handlebars">
+ Baffi a manubrio
+ </string>
+ <string name="Head Length">
+ Lunghezza testa
+ </string>
+ <string name="Head Shape">
+ Forma della testa
+ </string>
+ <string name="Head Size">
+ Grandezza della testa
+ </string>
+ <string name="Head Stretch">
+ Allungamento testa
+ </string>
+ <string name="Heel Height">
+ Altezza tacchi
+ </string>
+ <string name="Heel Shape">
+ Forma tacchi
+ </string>
+ <string name="Height">
+ Altezza
+ </string>
+ <string name="High">
+ Alto
+ </string>
+ <string name="High Heels">
+ Tacchi alti
+ </string>
+ <string name="High Jaw">
+ Mandibola alta
+ </string>
+ <string name="High Platforms">
+ Alta
+ </string>
+ <string name="High and Tight">
+ Alto e stretto
+ </string>
+ <string name="Higher">
+ Più alto
+ </string>
+ <string name="Hip Length">
+ Altezza bacino
+ </string>
+ <string name="Hip Width">
+ Larghezza bacino
+ </string>
+ <string name="Hover">
+ Muovi sopra
+ </string>
+ <string name="In">
+ Dentro
+ </string>
+ <string name="In Shdw Color">
+ Colore ombretto interno
+ </string>
+ <string name="In Shdw Opacity">
+ Opacità ombretto interno
+ </string>
+ <string name="Inner Eye Corner">
+ Angolo interno
+ </string>
+ <string name="Inner Eye Shadow">
+ Ombretto interno
+ </string>
+ <string name="Inner Shadow">
+ Ombretto interno
+ </string>
+ <string name="Jacket Length">
+ Lunghezza giacca
+ </string>
+ <string name="Jacket Wrinkles">
+ Grinze della giacca
+ </string>
+ <string name="Jaw Angle">
+ Angolo mandibola
+ </string>
+ <string name="Jaw Jut">
+ Prognatismo mento
+ </string>
+ <string name="Jaw Shape">
+ Forma del mento
+ </string>
+ <string name="Join">
+ Iscriviti
+ </string>
+ <string name="Jowls">
+ Guance
+ </string>
+ <string name="Knee Angle">
+ Angolo ginocchia
+ </string>
+ <string name="Knock Kneed">
+ Gambe ad X
+ </string>
+ <string name="Large">
+ Grande
+ </string>
+ <string name="Large Hands">
+ Mani grandi
+ </string>
+ <string name="Left Part">
+ Riga a sinistra
+ </string>
+ <string name="Leg Length">
+ Lunghezza gambe
+ </string>
+ <string name="Leg Muscles">
+ Muscoli gambe
+ </string>
+ <string name="Less">
+ Meno
+ </string>
+ <string name="Less Body Fat">
+ Meno grasso corporeo
+ </string>
+ <string name="Less Curtains">
+ Meno
+ </string>
+ <string name="Less Freckles">
+ Meno lentiggini
+ </string>
+ <string name="Less Full">
+ Meno piene
+ </string>
+ <string name="Less Gravity">
+ Più alto
+ </string>
+ <string name="Less Love">
+ Meno maniglie
+ </string>
+ <string name="Less Muscles">
+ Meno muscoli
+ </string>
+ <string name="Less Muscular">
+ Meno muscolari
+ </string>
+ <string name="Less Rosy">
+ Meno rosato
+ </string>
+ <string name="Less Round">
+ Meno rotondo
+ </string>
+ <string name="Less Saddle">
+ Meno a sella
+ </string>
+ <string name="Less Square">
+ Meno quadrato
+ </string>
+ <string name="Less Volume">
+ Meno volume
+ </string>
+ <string name="Less soul">
+ Meno
+ </string>
+ <string name="Lighter">
+ Più leggero
+ </string>
+ <string name="Lip Cleft">
+ Distanza fossetta labbro
+ </string>
+ <string name="Lip Cleft Depth">
+ Prof. fossetta labbro
+ </string>
+ <string name="Lip Fullness">
+ Volume labbra
+ </string>
+ <string name="Lip Pinkness">
+ Tonalità rosa labbra
+ </string>
+ <string name="Lip Ratio">
+ Proporzione labbra
+ </string>
+ <string name="Lip Thickness">
+ Carnosità labbra
+ </string>
+ <string name="Lip Width">
+ Larghezza labbra
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Rossetto
+ </string>
+ <string name="Lipstick Color">
+ Colore rossetto
+ </string>
+ <string name="Long">
+ Lungo
+ </string>
+ <string name="Long Head">
+ Testa lunga
+ </string>
+ <string name="Long Hips">
+ Bacino alto
+ </string>
+ <string name="Long Legs">
+ Gambe lunghe
+ </string>
+ <string name="Long Neck">
+ Collo lungo
+ </string>
+ <string name="Long Pigtails">
+ Codini lunghi
+ </string>
+ <string name="Long Ponytail">
+ Codino lungo
+ </string>
+ <string name="Long Torso">
+ Torace lungo
+ </string>
+ <string name="Long arms">
+ Braccia lunghe
+ </string>
+ <string name="Loose Pants">
+ Pantaloni ampi
+ </string>
+ <string name="Loose Shirt">
+ Camicia ampia
+ </string>
+ <string name="Loose Sleeves">
+ Maniche non attillate
+ </string>
+ <string name="Love Handles">
+ Maniglie dell'amore
+ </string>
+ <string name="Low">
+ Basso
+ </string>
+ <string name="Low Heels">
+ Tacchi bassi
+ </string>
+ <string name="Low Jaw">
+ Mandibola bassa
+ </string>
+ <string name="Low Platforms">
+ Bassa
+ </string>
+ <string name="Low and Loose">
+ Basso e ampio
+ </string>
+ <string name="Lower">
+ Più basso
+ </string>
+ <string name="Lower Bridge">
+ Parte bassa del setto
+ </string>
+ <string name="Lower Cheeks">
+ Guance inferiori
+ </string>
+ <string name="Male">
+ Maschio
+ </string>
+ <string name="Middle Part">
+ Riga nel mezzo
+ </string>
+ <string name="More">
+ Altro
+ </string>
+ <string name="More Blush">
+ Più fard
+ </string>
+ <string name="More Body Fat">
+ Più grasso corporeo
+ </string>
+ <string name="More Curtains">
+ Più
+ </string>
+ <string name="More Eyeshadow">
+ Più ombretto
+ </string>
+ <string name="More Freckles">
+ Più lentiggini
+ </string>
+ <string name="More Full">
+ Più piene
+ </string>
+ <string name="More Gravity">
+ Più calato
+ </string>
+ <string name="More Lipstick">
+ Più rossetto
+ </string>
+ <string name="More Love">
+ Più maniglie
+ </string>
+ <string name="More Lower Lip">
+ Labbro inf. pronunciato
+ </string>
+ <string name="More Muscles">
+ Più muscoli
+ </string>
+ <string name="More Muscular">
+ Più muscolatura
+ </string>
+ <string name="More Rosy">
+ Più rosato
+ </string>
+ <string name="More Round">
+ Più rotondo
+ </string>
+ <string name="More Saddle">
+ Più a sella
+ </string>
+ <string name="More Sloped">
+ Più orizzontale
+ </string>
+ <string name="More Square">
+ Più quadrato
+ </string>
+ <string name="More Upper Lip">
+ Labbro sup. pronunciato
+ </string>
+ <string name="More Vertical">
+ Più verticale
+ </string>
+ <string name="More Volume">
+ Più volume
+ </string>
+ <string name="More soul">
+ Più
+ </string>
+ <string name="Moustache">
+ Baffi
+ </string>
+ <string name="Mouth Corner">
+ Angolo della bocca
+ </string>
+ <string name="Mouth Position">
+ Posizione della bocca
+ </string>
+ <string name="Mowhawk">
+ Moicana
+ </string>
+ <string name="Muscular">
+ Muscolatura
+ </string>
+ <string name="Mutton Chops">
+ Basette lunghe
+ </string>
+ <string name="Nail Polish">
+ Smalto
+ </string>
+ <string name="Nail Polish Color">
+ Colore smalto
+ </string>
+ <string name="Narrow">
+ Socchiusi
+ </string>
+ <string name="Narrow Back">
+ Laterali post. vicini
+ </string>
+ <string name="Narrow Front">
+ Laterali ant. vicini
+ </string>
+ <string name="Narrow Lips">
+ Labbra strette
+ </string>
+ <string name="Natural">
+ Naturale
+ </string>
+ <string name="Neck Length">
+ Lunghezza del collo
+ </string>
+ <string name="Neck Thickness">
+ Grandezza del collo
+ </string>
+ <string name="No Blush">
+ Senza fard
+ </string>
+ <string name="No Eyeliner">
+ Senza eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Senza ombretto
+ </string>
+ <string name="No Lipgloss">
+ Senza lipgloss
+ </string>
+ <string name="No Lipstick">
+ Senza rossetto
+ </string>
+ <string name="No Part">
+ Senza riga
+ </string>
+ <string name="No Polish">
+ Senza smalto
+ </string>
+ <string name="No Red">
+ Senza rosso
+ </string>
+ <string name="No Spikes">
+ Senza punte
+ </string>
+ <string name="No White">
+ Senza bianco
+ </string>
+ <string name="No Wrinkles">
+ Senza pieghe
+ </string>
+ <string name="Normal Lower">
+ Inferiore normale
+ </string>
+ <string name="Normal Upper">
+ Superiore normale
+ </string>
+ <string name="Nose Left">
+ Naso a sinistra
+ </string>
+ <string name="Nose Right">
+ Naso a destra
+ </string>
+ <string name="Nose Size">
+ Grandezza naso
+ </string>
+ <string name="Nose Thickness">
+ Spessore naso
+ </string>
+ <string name="Nose Tip Angle">
+ Angolo punta naso
+ </string>
+ <string name="Nose Tip Shape">
+ Forma punta naso
+ </string>
+ <string name="Nose Width">
+ Larghezza naso
+ </string>
+ <string name="Nostril Division">
+ Divisione narici
+ </string>
+ <string name="Nostril Width">
+ Larghezza narici
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Apri
+ </string>
+ <string name="Open Back">
+ Retro aperto
+ </string>
+ <string name="Open Front">
+ Davanti aperto
+ </string>
+ <string name="Open Left">
+ Lato sin. aperto
+ </string>
+ <string name="Open Right">
+ Lato des. aperto
+ </string>
+ <string name="Orange">
+ Arancio
+ </string>
+ <string name="Out">
+ Fuori
+ </string>
+ <string name="Out Shdw Color">
+ Colore ombretto esterno
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacità ombretto esterno
+ </string>
+ <string name="Outer Eye Corner">
+ Angolo esterno occhio
+ </string>
+ <string name="Outer Eye Shadow">
+ Ombretto esterno
+ </string>
+ <string name="Outer Shadow">
+ Ombreggiatura esterna
+ </string>
+ <string name="Overbite">
+ Denti sup. in fuori
+ </string>
+ <string name="Package">
+ Genitali
+ </string>
+ <string name="Painted Nails">
+ Unghie smaltate
+ </string>
+ <string name="Pale">
+ Pallido
+ </string>
+ <string name="Pants Crotch">
+ Cavallo
+ </string>
+ <string name="Pants Fit">
+ Vestibilità pantaloni
+ </string>
+ <string name="Pants Length">
+ Lunghezza pantaloni
+ </string>
+ <string name="Pants Waist">
+ Taglia pantalone
+ </string>
+ <string name="Pants Wrinkles">
+ Pantaloni con le grinze
+ </string>
+ <string name="Part">
+ Con riga
+ </string>
+ <string name="Part Bangs">
+ Frangetta divisa
+ </string>
+ <string name="Pectorals">
+ Pettorali
+ </string>
+ <string name="Pigment">
+ Pigmento
+ </string>
+ <string name="Pigtails">
+ Codini
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Più rosato
+ </string>
+ <string name="Platform Height">
+ Altezza pianta
+ </string>
+ <string name="Platform Width">
+ Larghezza pianta
+ </string>
+ <string name="Pointy">
+ Appuntito
+ </string>
+ <string name="Pointy Heels">
+ Tacchi a spillo
+ </string>
+ <string name="Ponytail">
+ Codino
+ </string>
+ <string name="Poofy Skirt">
+ Gonna gonfia
+ </string>
+ <string name="Pop Left Eye">
+ Sinistro più aperto
+ </string>
+ <string name="Pop Right Eye">
+ Destro più aperto
+ </string>
+ <string name="Puffy">
+ Paffute
+ </string>
+ <string name="Puffy Eyelids">
+ Palpebre gonfie
+ </string>
+ <string name="Rainbow Color">
+ Tonalità
+ </string>
+ <string name="Red Hair">
+ Presenza di rosso nei capelli
+ </string>
+ <string name="Regular">
+ Normale
+ </string>
+ <string name="Right Part">
+ Riga a destra
+ </string>
+ <string name="Rosy Complexion">
+ Incarnato
+ </string>
+ <string name="Round">
+ Rotondo
+ </string>
+ <string name="Ruddiness">
+ Rossore
+ </string>
+ <string name="Ruddy">
+ Rosse
+ </string>
+ <string name="Rumpled Hair">
+ Capelli mossi
+ </string>
+ <string name="Saddle Bags">
+ Rotondità fianchi
+ </string>
+ <string name="Scrawny Leg">
+ Gambe magre
+ </string>
+ <string name="Separate">
+ Separati
+ </string>
+ <string name="Shallow">
+ Meno pronunciato
+ </string>
+ <string name="Shear Back">
+ Taglio posteriore
+ </string>
+ <string name="Shear Face">
+ Taglio del viso
+ </string>
+ <string name="Shear Front">
+ Taglio anteriore
+ </string>
+ <string name="Shear Left Up">
+ Distorto a sinistra
+ </string>
+ <string name="Shear Right Up">
+ Distorto a destra
+ </string>
+ <string name="Sheared Back">
+ Taglio verso dietro
+ </string>
+ <string name="Sheared Front">
+ Taglio verso davanti
+ </string>
+ <string name="Shift Left">
+ A sinistra
+ </string>
+ <string name="Shift Mouth">
+ Spostamento bocca
+ </string>
+ <string name="Shift Right">
+ A destra
+ </string>
+ <string name="Shirt Bottom">
+ Parte inferiore camicia
+ </string>
+ <string name="Shirt Fit">
+ Vestibilità camicia
+ </string>
+ <string name="Shirt Wrinkles">
+ Camicia con le grinze
+ </string>
+ <string name="Shoe Height">
+ Altezza scarpe
+ </string>
+ <string name="Short">
+ Basso
+ </string>
+ <string name="Short Arms">
+ Braccia corte
+ </string>
+ <string name="Short Legs">
+ Gambe corte
+ </string>
+ <string name="Short Neck">
+ Collo corto
+ </string>
+ <string name="Short Pigtails">
+ Codini corti
+ </string>
+ <string name="Short Ponytail">
+ Codino corto
+ </string>
+ <string name="Short Sideburns">
+ Basette corte
+ </string>
+ <string name="Short Torso">
+ Torace corto
+ </string>
+ <string name="Short hips">
+ Bacino corto
+ </string>
+ <string name="Shoulders">
+ Spalle
+ </string>
+ <string name="Side Fringe">
+ Ciuffi laterali
+ </string>
+ <string name="Sideburns">
+ Basette
+ </string>
+ <string name="Sides Hair">
+ Capigliatura di lato
+ </string>
+ <string name="Sides Hair Down">
+ Capigliatura di lato sciolta
+ </string>
+ <string name="Sides Hair Up">
+ Capigliatura di lato raccolta
+ </string>
+ <string name="Skinny Neck">
+ Collo fino
+ </string>
+ <string name="Skirt Fit">
+ Vestibilità gonna
+ </string>
+ <string name="Skirt Length">
+ Lunghezza gonna
+ </string>
+ <string name="Slanted Forehead">
+ Fronte inclinata
+ </string>
+ <string name="Sleeve Length">
+ Lunghezza maniche
+ </string>
+ <string name="Sleeve Looseness">
+ Morbidezza maniche
+ </string>
+ <string name="Slit Back">
+ Spacco: Indietro
+ </string>
+ <string name="Slit Front">
+ Spacco: anteriore
+ </string>
+ <string name="Slit Left">
+ Spacco: Sinistra
+ </string>
+ <string name="Slit Right">
+ Spacco: Destra
+ </string>
+ <string name="Small">
+ Piccola
+ </string>
+ <string name="Small Hands">
+ Mani piccole
+ </string>
+ <string name="Small Head">
+ Testa piccola
+ </string>
+ <string name="Smooth">
+ Liscio
+ </string>
+ <string name="Smooth Hair">
+ Capelli lisci
+ </string>
+ <string name="Socks Length">
+ Lunghezza calze
+ </string>
+ <string name="Soulpatch">
+ Pizzetto labbro inferiore
+ </string>
+ <string name="Sparse">
+ Piu rade
+ </string>
+ <string name="Spiked Hair">
+ Capelli a punta
+ </string>
+ <string name="Square">
+ Quadrato
+ </string>
+ <string name="Square Toe">
+ Punta quadrata
+ </string>
+ <string name="Squash Head">
+ Testa schiacciata
+ </string>
+ <string name="Stretch Head">
+ Testa allungata
+ </string>
+ <string name="Sunken">
+ Scarne
+ </string>
+ <string name="Sunken Chest">
+ Senza pettorali
+ </string>
+ <string name="Sunken Eyes">
+ Occhi infossati
+ </string>
+ <string name="Sweep Back">
+ Indietro
+ </string>
+ <string name="Sweep Forward">
+ Avanti
+ </string>
+ <string name="Tall">
+ Alto
+ </string>
+ <string name="Taper Back">
+ Ravv. lat. posteriore
+ </string>
+ <string name="Taper Front">
+ Ravv. lat. frontale
+ </string>
+ <string name="Thick Heels">
+ Tacchi spessi
+ </string>
+ <string name="Thick Neck">
+ Collo grosso
+ </string>
+ <string name="Thick Toe">
+ Punta spessa
+ </string>
+ <string name="Thin">
+ Sottili
+ </string>
+ <string name="Thin Eyebrows">
+ Sopracciglia sottili
+ </string>
+ <string name="Thin Lips">
+ Labbra sottili
+ </string>
+ <string name="Thin Nose">
+ Naso sottile
+ </string>
+ <string name="Tight Chin">
+ Mento stretto
+ </string>
+ <string name="Tight Cuffs">
+ Fondo stretto
+ </string>
+ <string name="Tight Pants">
+ Pantaloni attillati
+ </string>
+ <string name="Tight Shirt">
+ Camicia attillata
+ </string>
+ <string name="Tight Skirt">
+ Gonna attillata
+ </string>
+ <string name="Tight Sleeves">
+ Maniche strette
+ </string>
+ <string name="Toe Shape">
+ Forma della punta
+ </string>
+ <string name="Toe Thickness">
+ Spessore della punta
+ </string>
+ <string name="Torso Length">
+ Lunghezza del torace
+ </string>
+ <string name="Torso Muscles">
+ Muscoli del torace
+ </string>
+ <string name="Torso Scrawny">
+ Torso Scrawny
+ </string>
+ <string name="Unattached">
+ Distaccato
+ </string>
+ <string name="Uncreased">
+ Senza piega
+ </string>
+ <string name="Underbite">
+ Denti inf. in fuori
+ </string>
+ <string name="Unnatural">
+ Innaturale
+ </string>
+ <string name="Upper Bridge">
+ Parte alta del setto
+ </string>
+ <string name="Upper Cheeks">
+ Parte alta degli zigomi
+ </string>
+ <string name="Upper Chin Cleft">
+ Fossetta sup. del mento
+ </string>
+ <string name="Upper Eyelid Fold">
+ Piega palpebra sup.
+ </string>
+ <string name="Upturned">
+ All'insù
+ </string>
+ <string name="Very Red">
+ Molto rossi
+ </string>
+ <string name="Waist Height">
+ Vita alta
+ </string>
+ <string name="Well-Fed">
+ Pienotte
+ </string>
+ <string name="White Hair">
+ Capelli bianchi
+ </string>
+ <string name="Wide">
+ Largo
+ </string>
+ <string name="Wide Back">
+ Dietro largo
+ </string>
+ <string name="Wide Front">
+ Davanti largo
+ </string>
+ <string name="Wide Lips">
+ Labbra larghe
+ </string>
+ <string name="Wild">
+ Colorati
+ </string>
+ <string name="Wrinkles">
+ Grinze
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Aggiungi ai miei punti di riferimento
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Modifica i miei punti di riferimento
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Maggiori informazioni sulla posizione attuale
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ La cronologia delle mie posizioni
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Regione con categoria adulti
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Regione con categoria moderata
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Regione generale
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Gli avatar in questo lotto non possono essere visti o sentiti da avatar all'esterno del lotto
+ </string>
+ <string name="LocationCtrlPathfindingDirtyTooltip">
+ Gli oggetti che si muovono potrebbero non comportarsi correttamente in questa regione fino a quando non viene eseguito il rebake della regione.
+ </string>
+ <string name="LocationCtrlPathfindingDisabledTooltip">
+ Il pathfinding dinamico non è attivato in questa regione.
+ </string>
+ <string name="UpdaterWindowTitle">
+ Aggiornamento [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ Aggiornamento di [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installazione di [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Il Viewer del programma [APP_NAME] si sta aggiornando all'ultima versione. Potrebbe volerci del tempo, attendi.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Download dell'aggiornamento...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Download dell'aggiornamento
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Download dell'aggiornamento non riuscito
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Installazione dell'aggiornamento non riuscita
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Errore nell'avvio del viewer
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi
+ </string>
+ <string name="IM_logging_string">
+ -- Registrazione messaggi instantanei abilitata --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] sta scrivendo...
+ </string>
+ <string name="Unnamed">
+ (anonimo)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderato: Voci disattivate di default)
+ </string>
+ <string name="IM_unavailable_text_label">
+ La chat di testo non è disponibile per questa chiamata.
+ </string>
+ <string name="IM_muted_text_label">
+ La chat di testo è stata disabilitata da un moderatore di gruppo.
+ </string>
+ <string name="IM_default_text_label">
+ Clicca qui per inviare un messaggio instantaneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderatore)
+ </string>
+ <string name="Saved_message">
+ (Salvato [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Per vedere questo messaggio, devi deselezionare 'Solo amici e gruppi possono chiamarmi o mandarmi IM' in Preferenze/Privacy.
+ </string>
+ <string name="OnlineStatus">
+ Online
+ </string>
+ <string name="OfflineStatus">
+ Offline
+ </string>
+ <string name="not_online_msg">
+ Utente non online - il messaggio verrà memorizzato e inviato più tardi.
+ </string>
+ <string name="not_online_inventory">
+ Utente non online - l'inventario è stato salvato
+ </string>
+ <string name="answered_call">
+ Risposto alla chiamata
+ </string>
+ <string name="you_started_call">
+ Hai iniziato una chiamata vocale
+ </string>
+ <string name="you_joined_call">
+ Ti sei collegato alla chiamata in voce
+ </string>
+ <string name="you_auto_rejected_call-im">
+ Hai rifiutato automaticamente la chiamata voce mentre era attivata la modalità 'Non disturbare'.
+ </string>
+ <string name="name_started_call">
+ [NAME] ha iniziato una chiamata vocale
+ </string>
+ <string name="ringing-im">
+ Collegamento alla chiamata vocale...
+ </string>
+ <string name="connected-im">
+ Collegato, clicca Chiudi chiamata per agganciare
+ </string>
+ <string name="hang_up-im">
+ Chiusa la chiamata
+ </string>
+ <string name="conference-title">
+ Chat con più persone
+ </string>
+ <string name="conference-title-incoming">
+ Chiamata in conferenza con [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Offerto oggetto di inventario "[ITEM_NAME]"
+ </string>
+ <string name="inventory_folder_offered-im">
+ Offerta cartella di inventario "[ITEM_NAME]"
+ </string>
+ <string name="bot_warning">
+ Stai parlando con un bot, [NAME]. Non condividere informazioni personali.
+Scopri di più su https://second.life/scripted-agents.
+ </string>
+ <string name="facebook_post_success">
+ Hai pubblicato su Facebook.
+ </string>
+ <string name="flickr_post_success">
+ Hai pubblicato su Flickr.
+ </string>
+ <string name="twitter_post_success">
+ Hai pubblicato su Twitter.
+ </string>
+ <string name="no_session_message">
+ (La sessione IM non esiste)
+ </string>
+ <string name="only_user_message">
+ Sei l'unico utente di questa sessione.
+ </string>
+ <string name="offline_message">
+ [NAME] è offline
+ </string>
+ <string name="invite_message">
+ Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
+ </string>
+ <string name="muted_message">
+ Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato.
+ </string>
+ <string name="generic">
+ Errore nella richiesta, riprova più tardi.
+ </string>
+ <string name="generic_request_error">
+ Errore durante la richiesta, riprova più tardi.
+ </string>
+ <string name="insufficient_perms_error">
+ Non hai sufficienti permessi.
+ </string>
+ <string name="session_does_not_exist_error">
+ Questa sessione non esiste più
+ </string>
+ <string name="no_ability_error">
+ Non hai questa abilitazione.
+ </string>
+ <string name="no_ability">
+ Non hai questa abilitazione.
+ </string>
+ <string name="not_a_mod_error">
+ Non sei un moderatore.
+ </string>
+ <string name="muted">
+ Il moderatore del gruppo ha disattivato la tua chat di testo.
+ </string>
+ <string name="muted_error">
+ Un moderatore di gruppo ti ha disabilitato dalla chat di testo.
+ </string>
+ <string name="add_session_event">
+ Impossibile aggiungere utenti alla chat con [RECIPIENT].
+ </string>
+ <string name="message">
+ Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Impossibile inviare il messaggio nella chat con [RECIPIENT].
+ </string>
+ <string name="mute">
+ Errore durante la moderazione.
+ </string>
+ <string name="removed">
+ Sei stato rimosso dal gruppo.
+ </string>
+ <string name="removed_from_group">
+ Sei stato espulso dal gruppo.
+ </string>
+ <string name="close_on_no_ability">
+ Non hai più le abilitazioni per rimanere nella sessione chat.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] ha detto qualcosa di nuovo
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ha detto qualcosa di nuovo
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Sessione di inizializzazione scaduta
+ </string>
+ <string name="Home position set.">
+ Posizione di base impostata.
+ </string>
+ <string name="voice_morphing_url">
+ https://secondlife.com/destination/voice-island
+ </string>
+ <string name="premium_voice_morphing_url">
+ https://secondlife.com/destination/voice-morphing-premium
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] ti ha inviato un pagamento di L$ [AMOUNT]: [REASON]
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] ti ha inviato un pagamento di L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON].
+ </string>
+ <string name="you_paid_ldollars_gift">
+ Hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON]
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Hai pagato L$ [AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Hai inviato un pagamento di L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Hai pagato L$ [AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Non hai pagato [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_gift">
+ Non hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON]
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Non hai pagato L$ [AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Non hai pagato [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Non hai pagato L$ [AMOUNT] [REASON].
+ </string>
+ <string name="for item">
+ per [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ per un lotto di terreno
+ </string>
+ <string name="for a land access pass">
+ per un permesso di accesso al terreno
+ </string>
+ <string name="for deeding land">
+ per la cessione di terreno
+ </string>
+ <string name="to create a group">
+ per creare un gruppo
+ </string>
+ <string name="to join a group">
+ per aderire a un gruppo
+ </string>
+ <string name="to upload">
+ per caricare
+ </string>
+ <string name="to publish a classified ad">
+ per pubblicare un annuncio
+ </string>
+ <string name="giving">
+ Contributo di L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Il costo per il caricamento è di L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Il costo è L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ L'acquisto del terreno prescelto costa L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Il costo dell'oggetto è L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Tutti
+ </string>
+ <string name="group_role_officers">
+ Funzionari
+ </string>
+ <string name="group_role_owners">
+ Proprietari
+ </string>
+ <string name="group_member_status_online">
+ Online
+ </string>
+ <string name="uploading_abuse_report">
+ Caricamento in corso...
-Segnala abuso</string>
- <string name="New Shape">Nuova figura corporea</string>
- <string name="New Skin">Nuova pelle</string>
- <string name="New Hair">Nuovi capelli</string>
- <string name="New Eyes">Nuovi occhi</string>
- <string name="New Shirt">Nuova camicia</string>
- <string name="New Pants">Nuovi pantaloni</string>
- <string name="New Shoes">Nuove scarpe</string>
- <string name="New Socks">Nuove calze</string>
- <string name="New Jacket">Nuova giacca</string>
- <string name="New Gloves">Nuovi guanti</string>
- <string name="New Undershirt">Nuova maglietta intima</string>
- <string name="New Underpants">Nuovi slip</string>
- <string name="New Skirt">Nuova gonna</string>
- <string name="New Alpha">Nuovo Alpha (trasparenza)</string>
- <string name="New Tattoo">Nuovo tatuaggio</string>
- <string name="New Universal">Nuovo Universale</string>
- <string name="New Physics">Nuova fisica</string>
- <string name="Invalid Wearable">Capo da indossare non valido</string>
- <string name="New Gesture">Nuova gesture</string>
- <string name="New Script">Nuovo script</string>
- <string name="New Note">Nuovo appunto</string>
- <string name="New Folder">Nuova cartella</string>
- <string name="Contents">Contenuto</string>
- <string name="Gesture">Gesture</string>
- <string name="Male Gestures">Gesture maschili</string>
- <string name="Female Gestures">Gesture femminili</string>
- <string name="Other Gestures">Altre gesture</string>
- <string name="Speech Gestures">Gesture del parlato</string>
- <string name="Common Gestures">Gesture comuni</string>
- <string name="Male - Excuse me">Maschio - Chiedere scusa</string>
- <string name="Male - Get lost">Maschio - Levati dai piedi!</string>
- <string name="Male - Blow kiss">Maschio - Butta un bacio</string>
- <string name="Male - Boo">Maschio - Bu</string>
- <string name="Male - Bored">Maschio - Annoiato</string>
- <string name="Male - Hey">Maschio - Ehi</string>
- <string name="Male - Laugh">Maschio - Ridere</string>
- <string name="Male - Repulsed">Maschio - Disgustato</string>
- <string name="Male - Shrug">Maschio - Spallucce</string>
- <string name="Male - Stick tougue out">Maschio - Tira fuori la lingua</string>
- <string name="Male - Wow">Maschio - Accipicchia</string>
- <string name="Female - Chuckle">Femmina - Risatina</string>
- <string name="Female - Cry">Femmina - Pianto</string>
- <string name="Female - Embarrassed">Femmina - Imbarazzata</string>
- <string name="Female - Excuse me">Femmina - Chiedere scusa</string>
- <string name="Female - Get lost">Femmina - Levati dai piedi!</string>
- <string name="Female - Blow kiss">Femmina - Butta un bacio</string>
- <string name="Female - Boo">Femmina - Bu</string>
- <string name="Female - Bored">Femmina - Annoiata</string>
- <string name="Female - Hey">Femmina - Ehi</string>
- <string name="Female - Hey baby">Femmina - Ehi tu</string>
- <string name="Female - Laugh">Femmina - Ridere</string>
- <string name="Female - Looking good">Femmina - Sei in forma</string>
- <string name="Female - Over here">Femmina - Per di qua</string>
- <string name="Female - Please">Femmina - Per cortesia</string>
- <string name="Female - Repulsed">Femmina - Disgustata</string>
- <string name="Female - Shrug">Femmina - Spallucce</string>
- <string name="Female - Stick tougue out">Femmina - Tira fuori la lingua</string>
- <string name="Female - Wow">Femmina - Accipicchia</string>
- <string name="New Daycycle">Nuovo ciclo giornata</string>
- <string name="New Water">Nuova acqua</string>
- <string name="New Sky">Nuovo cielo</string>
- <string name="/bow">/inchino</string>
- <string name="/clap">/applausi</string>
- <string name="/count">/numero</string>
- <string name="/extinguish">/estingui</string>
- <string name="/kmb">/chissene</string>
- <string name="/muscle">/muscolo</string>
- <string name="/no">/no</string>
- <string name="/no!">/no!</string>
- <string name="/paper">/carta</string>
- <string name="/pointme">/indicome</string>
- <string name="/pointyou">/indicotu</string>
- <string name="/rock">/sasso</string>
- <string name="/scissor">/forbici</string>
- <string name="/smoke">/fumo</string>
- <string name="/stretch">/stiracchiata</string>
- <string name="/whistle">/fischietto</string>
- <string name="/yes">/si</string>
- <string name="/yes!">/si!</string>
- <string name="afk">non alla tastiera</string>
- <string name="dance1">danza1</string>
- <string name="dance2">danza2</string>
- <string name="dance3">danza3</string>
- <string name="dance4">danza4</string>
- <string name="dance5">danza5</string>
- <string name="dance6">danza6</string>
- <string name="dance7">danza7</string>
- <string name="dance8">danza8</string>
- <string name="AvatarBirthDateFormat">[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]</string>
- <string name="DefaultMimeType">nessuna/nessuna</string>
- <string name="texture_load_dimensions_error">Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT]</string>
- <string name="outfit_photo_load_dimensions_error">Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Ridimensiona l'immagine o usane un'altra</string>
- <string name="outfit_photo_select_dimensions_error">Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Seleziona un'altra texture</string>
- <string name="outfit_photo_verify_dimensions_error">Impossibile verificare le dimensioni della foto. Attendi che le dimensioni siano visualizzate nel selettore.</string>
+Segnala abuso
+ </string>
+ <string name="New Shape">
+ Nuova figura corporea
+ </string>
+ <string name="New Skin">
+ Nuova pelle
+ </string>
+ <string name="New Hair">
+ Nuovi capelli
+ </string>
+ <string name="New Eyes">
+ Nuovi occhi
+ </string>
+ <string name="New Shirt">
+ Nuova camicia
+ </string>
+ <string name="New Pants">
+ Nuovi pantaloni
+ </string>
+ <string name="New Shoes">
+ Nuove scarpe
+ </string>
+ <string name="New Socks">
+ Nuove calze
+ </string>
+ <string name="New Jacket">
+ Nuova giacca
+ </string>
+ <string name="New Gloves">
+ Nuovi guanti
+ </string>
+ <string name="New Undershirt">
+ Nuova maglietta intima
+ </string>
+ <string name="New Underpants">
+ Nuovi slip
+ </string>
+ <string name="New Skirt">
+ Nuova gonna
+ </string>
+ <string name="New Alpha">
+ Nuovo Alpha (trasparenza)
+ </string>
+ <string name="New Tattoo">
+ Nuovo tatuaggio
+ </string>
+ <string name="New Universal">
+ Nuovo Universale
+ </string>
+ <string name="New Physics">
+ Nuova fisica
+ </string>
+ <string name="Invalid Wearable">
+ Capo da indossare non valido
+ </string>
+ <string name="New Gesture">
+ Nuova gesture
+ </string>
+ <string name="New Script">
+ Nuovo script
+ </string>
+ <string name="New Note">
+ Nuovo appunto
+ </string>
+ <string name="New Folder">
+ Nuova cartella
+ </string>
+ <string name="Contents">
+ Contenuto
+ </string>
+ <string name="Gesture">
+ Gesture
+ </string>
+ <string name="Male Gestures">
+ Gesture maschili
+ </string>
+ <string name="Female Gestures">
+ Gesture femminili
+ </string>
+ <string name="Other Gestures">
+ Altre gesture
+ </string>
+ <string name="Speech Gestures">
+ Gesture del parlato
+ </string>
+ <string name="Common Gestures">
+ Gesture comuni
+ </string>
+ <string name="Male - Excuse me">
+ Maschio - Chiedere scusa
+ </string>
+ <string name="Male - Get lost">
+ Maschio - Levati dai piedi!
+ </string>
+ <string name="Male - Blow kiss">
+ Maschio - Butta un bacio
+ </string>
+ <string name="Male - Boo">
+ Maschio - Bu
+ </string>
+ <string name="Male - Bored">
+ Maschio - Annoiato
+ </string>
+ <string name="Male - Hey">
+ Maschio - Ehi
+ </string>
+ <string name="Male - Laugh">
+ Maschio - Ridere
+ </string>
+ <string name="Male - Repulsed">
+ Maschio - Disgustato
+ </string>
+ <string name="Male - Shrug">
+ Maschio - Spallucce
+ </string>
+ <string name="Male - Stick tougue out">
+ Maschio - Tira fuori la lingua
+ </string>
+ <string name="Male - Wow">
+ Maschio - Accipicchia
+ </string>
+ <string name="Female - Chuckle">
+ Femmina - Risatina
+ </string>
+ <string name="Female - Cry">
+ Femmina - Pianto
+ </string>
+ <string name="Female - Embarrassed">
+ Femmina - Imbarazzata
+ </string>
+ <string name="Female - Excuse me">
+ Femmina - Chiedere scusa
+ </string>
+ <string name="Female - Get lost">
+ Femmina - Levati dai piedi!
+ </string>
+ <string name="Female - Blow kiss">
+ Femmina - Butta un bacio
+ </string>
+ <string name="Female - Boo">
+ Femmina - Bu
+ </string>
+ <string name="Female - Bored">
+ Femmina - Annoiata
+ </string>
+ <string name="Female - Hey">
+ Femmina - Ehi
+ </string>
+ <string name="Female - Hey baby">
+ Femmina - Ehi tu
+ </string>
+ <string name="Female - Laugh">
+ Femmina - Ridere
+ </string>
+ <string name="Female - Looking good">
+ Femmina - Sei in forma
+ </string>
+ <string name="Female - Over here">
+ Femmina - Per di qua
+ </string>
+ <string name="Female - Please">
+ Femmina - Per cortesia
+ </string>
+ <string name="Female - Repulsed">
+ Femmina - Disgustata
+ </string>
+ <string name="Female - Shrug">
+ Femmina - Spallucce
+ </string>
+ <string name="Female - Stick tougue out">
+ Femmina - Tira fuori la lingua
+ </string>
+ <string name="Female - Wow">
+ Femmina - Accipicchia
+ </string>
+ <string name="New Daycycle">
+ Nuovo ciclo giornata
+ </string>
+ <string name="New Water">
+ Nuova acqua
+ </string>
+ <string name="New Sky">
+ Nuovo cielo
+ </string>
+ <string name="/bow">
+ /inchino
+ </string>
+ <string name="/clap">
+ /applausi
+ </string>
+ <string name="/count">
+ /numero
+ </string>
+ <string name="/extinguish">
+ /estingui
+ </string>
+ <string name="/kmb">
+ /chissene
+ </string>
+ <string name="/muscle">
+ /muscolo
+ </string>
+ <string name="/no">
+ /no
+ </string>
+ <string name="/no!">
+ /no!
+ </string>
+ <string name="/paper">
+ /carta
+ </string>
+ <string name="/pointme">
+ /indicome
+ </string>
+ <string name="/pointyou">
+ /indicotu
+ </string>
+ <string name="/rock">
+ /sasso
+ </string>
+ <string name="/scissor">
+ /forbici
+ </string>
+ <string name="/smoke">
+ /fumo
+ </string>
+ <string name="/stretch">
+ /stiracchiata
+ </string>
+ <string name="/whistle">
+ /fischietto
+ </string>
+ <string name="/yes">
+ /si
+ </string>
+ <string name="/yes!">
+ /si!
+ </string>
+ <string name="afk">
+ non alla tastiera
+ </string>
+ <string name="dance1">
+ danza1
+ </string>
+ <string name="dance2">
+ danza2
+ </string>
+ <string name="dance3">
+ danza3
+ </string>
+ <string name="dance4">
+ danza4
+ </string>
+ <string name="dance5">
+ danza5
+ </string>
+ <string name="dance6">
+ danza6
+ </string>
+ <string name="dance7">
+ danza7
+ </string>
+ <string name="dance8">
+ danza8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ nessuna/nessuna
+ </string>
+ <string name="texture_load_dimensions_error">
+ Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT]
+ </string>
+ <string name="outfit_photo_load_dimensions_error">
+ Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Ridimensiona l'immagine o usane un'altra
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Seleziona un'altra texture
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Impossibile verificare le dimensioni della foto. Attendi che le dimensioni siano visualizzate nel selettore.
+ </string>
<string name="words_separator" value=","/>
- <string name="server_is_down">Nonostante i nostri tentativi, si è verificato un errore imprevisto.
+ <string name="server_is_down">
+ Nonostante i nostri tentativi, si è verificato un errore imprevisto.
Consulta la pagina http://status.secondlifegrid.net per determinare se il problema del servizio è già stato riscontrato.
- Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e del firewall.</string>
- <string name="dateTimeWeekdaysNames">lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica</string>
- <string name="dateTimeWeekdaysShortNames">lun:mar:mer:gio:ven:sab:dom</string>
- <string name="dateTimeMonthNames">gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre</string>
- <string name="dateTimeMonthShortNames">gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic</string>
- <string name="dateTimeDayFormat">[MDAY]</string>
- <string name="dateTimeAM">antemeridiane</string>
- <string name="dateTimePM">pomeridiane</string>
- <string name="LocalEstimateUSD">US$ [AMOUNT]</string>
- <string name="Group Ban">Espulsione di gruppo</string>
- <string name="Membership">Abbonamento</string>
- <string name="Roles">Ruoli</string>
- <string name="Group Identity">Identità gruppo</string>
- <string name="Parcel Management">Gestione lotto</string>
- <string name="Parcel Identity">Identità lotto</string>
- <string name="Parcel Settings">Impostazioni lotto</string>
- <string name="Parcel Powers">Poteri lotto</string>
- <string name="Parcel Access">Accesso al lotto</string>
- <string name="Parcel Content">Contenuto lotto</string>
- <string name="Object Management">Gestione oggetti</string>
- <string name="Accounting">Contabilità</string>
- <string name="Notices">Avvisi</string>
- <string name="Chat" value="Chat :">Chat</string>
- <string name="BaseMembership">Base</string>
- <string name="PremiumMembership">Premium</string>
- <string name="Premium_PlusMembership">Premium Plus</string>
- <string name="DeleteItems">Cancellare gli elementi selezionati?</string>
- <string name="DeleteItem">Cancellare l’elemento selezionato?</string>
- <string name="EmptyOutfitText">Questo vestiario non contiene alcun elemento</string>
- <string name="ExternalEditorNotSet">Seleziona un editor usando le impostazioni ExternalEditor.</string>
- <string name="ExternalEditorNotFound">L'editor esterno specificato non è stato trovato.
+ Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e del firewall.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ lun:mar:mer:gio:ven:sab:dom
+ </string>
+ <string name="dateTimeMonthNames">
+ gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre
+ </string>
+ <string name="dateTimeMonthShortNames">
+ gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ antemeridiane
+ </string>
+ <string name="dateTimePM">
+ pomeridiane
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Group Ban">
+ Espulsione di gruppo
+ </string>
+ <string name="Membership">
+ Abbonamento
+ </string>
+ <string name="Roles">
+ Ruoli
+ </string>
+ <string name="Group Identity">
+ Identità gruppo
+ </string>
+ <string name="Parcel Management">
+ Gestione lotto
+ </string>
+ <string name="Parcel Identity">
+ Identità lotto
+ </string>
+ <string name="Parcel Settings">
+ Impostazioni lotto
+ </string>
+ <string name="Parcel Powers">
+ Poteri lotto
+ </string>
+ <string name="Parcel Access">
+ Accesso al lotto
+ </string>
+ <string name="Parcel Content">
+ Contenuto lotto
+ </string>
+ <string name="Object Management">
+ Gestione oggetti
+ </string>
+ <string name="Accounting">
+ Contabilità
+ </string>
+ <string name="Notices">
+ Avvisi
+ </string>
+ <string name="Chat" value="Chat :">
+ Chat
+ </string>
+ <string name="BaseMembership">
+ Base
+ </string>
+ <string name="PremiumMembership">
+ Premium
+ </string>
+ <string name="Premium_PlusMembership">
+ Premium Plus
+ </string>
+ <string name="DeleteItems">
+ Cancellare gli elementi selezionati?
+ </string>
+ <string name="DeleteItem">
+ Cancellare l’elemento selezionato?
+ </string>
+ <string name="EmptyOutfitText">
+ Questo vestiario non contiene alcun elemento
+ </string>
+ <string name="ExternalEditorNotSet">
+ Seleziona un editor usando le impostazioni ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ L'editor esterno specificato non è stato trovato.
Prova a racchiudere il percorso dell'editor in doppie virgolette.
-(per es. &quot;/percorso per il mio/editor&quot; &quot;%s&quot;)</string>
- <string name="ExternalEditorCommandParseError">Errore nell'elaborazione del comando dell'editor esterno.</string>
- <string name="ExternalEditorFailedToRun">L'editor esterno non è stato avviato.</string>
- <string name="TranslationFailed">Traduzione non riuscita: [REASON]</string>
- <string name="TranslationResponseParseError">Errore di elaborazione della risposta della traduzione.</string>
- <string name="Esc">Esc</string>
- <string name="Space">Space</string>
- <string name="Enter">Enter</string>
- <string name="Tab">Tab</string>
- <string name="Ins">Ins</string>
- <string name="Del">Del</string>
- <string name="Backsp">Backsp</string>
- <string name="Shift">Shift</string>
- <string name="Ctrl">Ctrl</string>
- <string name="Alt">Alt</string>
- <string name="CapsLock">CapsLock</string>
- <string name="Home">Home</string>
- <string name="End">End</string>
- <string name="PgUp">PgUp</string>
- <string name="PgDn">PgDn</string>
- <string name="F1">F1</string>
- <string name="F2">F2</string>
- <string name="F3">F3</string>
- <string name="F4">F4</string>
- <string name="F5">F5</string>
- <string name="F6">F6</string>
- <string name="F7">F7</string>
- <string name="F8">F8</string>
- <string name="F9">F9</string>
- <string name="F10">F10</string>
- <string name="F11">F11</string>
- <string name="F12">F12</string>
- <string name="Add">Aggiungi</string>
- <string name="Subtract">Sottrai</string>
- <string name="Multiply">Moltiplica</string>
- <string name="Divide">Dividi</string>
- <string name="PAD_DIVIDE">PAD_DIVIDE</string>
- <string name="PAD_LEFT">PAD_LEFT</string>
- <string name="PAD_RIGHT">PAD_RIGHT</string>
- <string name="PAD_DOWN">PAD_DOWN</string>
- <string name="PAD_UP">PAD_UP</string>
- <string name="PAD_HOME">PAD_HOME</string>
- <string name="PAD_END">PAD_END</string>
- <string name="PAD_PGUP">PAD_PGUP</string>
- <string name="PAD_PGDN">PAD_PGDN</string>
- <string name="PAD_CENTER">PAD_CENTER</string>
- <string name="PAD_INS">PAD_INS</string>
- <string name="PAD_DEL">PAD_DEL</string>
- <string name="PAD_Enter">PAD_Enter</string>
- <string name="PAD_BUTTON0">PAD_BUTTON0</string>
- <string name="PAD_BUTTON1">PAD_BUTTON1</string>
- <string name="PAD_BUTTON2">PAD_BUTTON2</string>
- <string name="PAD_BUTTON3">PAD_BUTTON3</string>
- <string name="PAD_BUTTON4">PAD_BUTTON4</string>
- <string name="PAD_BUTTON5">PAD_BUTTON5</string>
- <string name="PAD_BUTTON6">PAD_BUTTON6</string>
- <string name="PAD_BUTTON7">PAD_BUTTON7</string>
- <string name="PAD_BUTTON8">PAD_BUTTON8</string>
- <string name="PAD_BUTTON9">PAD_BUTTON9</string>
- <string name="PAD_BUTTON10">PAD_BUTTON10</string>
- <string name="PAD_BUTTON11">PAD_BUTTON11</string>
- <string name="PAD_BUTTON12">PAD_BUTTON12</string>
- <string name="PAD_BUTTON13">PAD_BUTTON13</string>
- <string name="PAD_BUTTON14">PAD_BUTTON14</string>
- <string name="PAD_BUTTON15">PAD_BUTTON15</string>
- <string name="-">-</string>
- <string name="=">=</string>
- <string name="`">`</string>
- <string name=";">;</string>
- <string name="[">[</string>
- <string name="]">]</string>
- <string name="\">\</string>
- <string name="0">0</string>
- <string name="1">1</string>
- <string name="2">2</string>
- <string name="3">3</string>
- <string name="4">4</string>
- <string name="5">5</string>
- <string name="6">6</string>
- <string name="7">7</string>
- <string name="8">8</string>
- <string name="9">9</string>
- <string name="A">A</string>
- <string name="B">B</string>
- <string name="C">C</string>
- <string name="D">D</string>
- <string name="E">E</string>
- <string name="F">F</string>
- <string name="G">G</string>
- <string name="H">H</string>
- <string name="I">I</string>
- <string name="J">J</string>
- <string name="K">K</string>
- <string name="L">L</string>
- <string name="M">M</string>
- <string name="N">N</string>
- <string name="O">O</string>
- <string name="P">P</string>
- <string name="Q">Q</string>
- <string name="R">R</string>
- <string name="S">S</string>
- <string name="T">T</string>
- <string name="U">U</string>
- <string name="V">V</string>
- <string name="W">W</string>
- <string name="X">X</string>
- <string name="Y">Y</string>
- <string name="Z">Z</string>
- <string name="BeaconParticle">Visualizzazione marcatori particelle (blu)</string>
- <string name="BeaconPhysical">Visualizzazione marcatori oggetti fisici (verde)</string>
- <string name="BeaconScripted">Visualizzazione marcatori oggetti scriptati (rosso)</string>
- <string name="BeaconScriptedTouch">Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso)</string>
- <string name="BeaconSound">Visualizzazione marcatori suoni (giallo)</string>
- <string name="BeaconMedia">Visualizzazione marcatori multimedia (bianco)</string>
- <string name="BeaconSun">Marcatore visualizza direzione sole (arancione)</string>
- <string name="BeaconMoon">Marcatore visualizza direzione luna (viola)</string>
- <string name="ParticleHiding">Particelle nascoste</string>
- <string name="Command_AboutLand_Label">Informazioni sul terreno</string>
- <string name="Command_Appearance_Label">Aspetto fisico</string>
- <string name="Command_Avatar_Label">Avatar</string>
- <string name="Command_Build_Label">Costruisci</string>
- <string name="Command_Chat_Label">Chat</string>
- <string name="Command_Conversations_Label">Conversazioni</string>
- <string name="Command_Compass_Label">Bussola</string>
- <string name="Command_Destinations_Label">Destinazioni</string>
- <string name="Command_Environments_Label">I miei ambienti</string>
- <string name="Command_Facebook_Label">Facebook</string>
- <string name="Command_Flickr_Label">Flickr</string>
- <string name="Command_Gestures_Label">Gesture</string>
- <string name="Command_Grid_Status_Label">Stato della griglia</string>
- <string name="Command_HowTo_Label">Istruzioni</string>
- <string name="Command_Inventory_Label">Inventario</string>
- <string name="Command_Map_Label">Mappa</string>
- <string name="Command_Marketplace_Label">Mercato</string>
- <string name="Command_MarketplaceListings_Label">Marketplace</string>
- <string name="Command_MiniMap_Label">Mini mappa</string>
- <string name="Command_Move_Label">Cammina / corri / vola</string>
- <string name="Command_Outbox_Label">Casella in uscita del rivenditore</string>
- <string name="Command_People_Label">Persone</string>
- <string name="Command_Picks_Label">Preferiti</string>
- <string name="Command_Places_Label">Luoghi</string>
- <string name="Command_Preferences_Label">Preferenze</string>
- <string name="Command_Profile_Label">Profilo</string>
- <string name="Command_Report_Abuse_Label">Segnala abuso</string>
- <string name="Command_Search_Label">Ricerca</string>
- <string name="Command_Snapshot_Label">Istantanea</string>
- <string name="Command_Speak_Label">Parla</string>
- <string name="Command_Twitter_Label">Twitter</string>
- <string name="Command_View_Label">Controlli fotocamera</string>
- <string name="Command_Voice_Label">Impostazioni voce</string>
- <string name="Command_AboutLand_Tooltip">Informazioni sul terreno che visiti</string>
- <string name="Command_Appearance_Tooltip">Cambia l'avatar</string>
- <string name="Command_Avatar_Tooltip">Seleziona un avatar completo</string>
- <string name="Command_Build_Tooltip">Costruzione oggetti e modifica terreno</string>
- <string name="Command_Chat_Tooltip">Chatta con persone vicine usando il testo</string>
- <string name="Command_Conversations_Tooltip">Conversa con chiunque</string>
- <string name="Command_Compass_Tooltip">Bussola</string>
- <string name="Command_Destinations_Tooltip">Destinazioni interessanti</string>
- <string name="Command_Environments_Tooltip">I miei ambienti</string>
- <string name="Command_Facebook_Tooltip">Pubblica su Facebook</string>
- <string name="Command_Flickr_Tooltip">Carica su Flickr</string>
- <string name="Command_Gestures_Tooltip">Gesti per il tuo avatar</string>
- <string name="Command_Grid_Status_Tooltip">Mostra stato griglia corrente</string>
- <string name="Command_HowTo_Tooltip">Come eseguire le attività più comuni</string>
- <string name="Command_Inventory_Tooltip">Visualizza e usa le tue cose</string>
- <string name="Command_Map_Tooltip">Mappa del mondo</string>
- <string name="Command_Marketplace_Tooltip">Vai allo shopping</string>
- <string name="Command_MarketplaceListings_Tooltip">Vendi le tue creazioni</string>
- <string name="Command_MiniMap_Tooltip">Mostra le persone vicine</string>
- <string name="Command_Move_Tooltip">Movimento avatar</string>
- <string name="Command_Outbox_Tooltip">Trasferisci elementi al tuo mercato per la vendita</string>
- <string name="Command_People_Tooltip">Amici, gruppi e persone vicine</string>
- <string name="Command_Picks_Tooltip">Luoghi da mostrare come preferiti nel profilo</string>
- <string name="Command_Places_Tooltip">Luoghi salvati</string>
- <string name="Command_Preferences_Tooltip">Preferenze</string>
- <string name="Command_Profile_Tooltip">Modifica o visualizza il tuo profilo</string>
- <string name="Command_Report_Abuse_Tooltip">Segnala abuso</string>
- <string name="Command_Search_Tooltip">Trova luoghi, eventi, persone</string>
- <string name="Command_Snapshot_Tooltip">Scatta una foto</string>
- <string name="Command_Speak_Tooltip">Parla con persone vicine usando il microfono</string>
- <string name="Command_Twitter_Tooltip">Twitter</string>
- <string name="Command_View_Tooltip">Modifica angolo fotocamera</string>
- <string name="Command_Voice_Tooltip">I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale</string>
- <string name="Toolbar_Bottom_Tooltip">attualmente nella barra degli strumenti in basso</string>
- <string name="Toolbar_Left_Tooltip">attualmente nella barra degli strumenti a sinistra</string>
- <string name="Toolbar_Right_Tooltip">attualmente nella barra degli strumenti a destra</string>
- <string name="Retain%">Mantieni%</string>
- <string name="Detail">Dettagli</string>
- <string name="Better Detail">Migliori dettagli</string>
- <string name="Surface">Superficie</string>
- <string name="Solid">Solido</string>
- <string name="Wrap">Involucro</string>
- <string name="Preview">Anteprima</string>
- <string name="Normal">Normale</string>
- <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string>
- <string name="Pathfinding_Object_Attr_None">Nessuno</string>
- <string name="Pathfinding_Object_Attr_Permanent">Influenza il navmesh</string>
- <string name="Pathfinding_Object_Attr_Character">Personaggio</string>
- <string name="Pathfinding_Object_Attr_MultiSelect">(Multiple)</string>
- <string name="snapshot_quality_very_low">Molto basso</string>
- <string name="snapshot_quality_low">Basso</string>
- <string name="snapshot_quality_medium">Medio</string>
- <string name="snapshot_quality_high">Alto</string>
- <string name="snapshot_quality_very_high">Molto alto</string>
- <string name="TeleportMaturityExceeded">Il Residente non può visitare questa regione.</string>
- <string name="UserDictionary">[User]</string>
- <string name="experience_tools_experience">Esperienza</string>
- <string name="ExperienceNameNull">(nessuna esperienza)</string>
- <string name="ExperienceNameUntitled">(esperienza senza titolo)</string>
- <string name="Land-Scope">A livello di terreno</string>
- <string name="Grid-Scope">A livello di griglia</string>
- <string name="Allowed_Experiences_Tab">CONSENTITO</string>
- <string name="Blocked_Experiences_Tab">BLOCCATO</string>
- <string name="Contrib_Experiences_Tab">FORNITORE</string>
- <string name="Admin_Experiences_Tab">AMMINISTRATORE</string>
- <string name="Recent_Experiences_Tab">RECENTE</string>
- <string name="Owned_Experiences_Tab">DI PROPRIETÀ</string>
- <string name="ExperiencesCounter">([EXPERIENCES], massimo [MAXEXPERIENCES])</string>
- <string name="ExperiencePermission1">gestione dei tuoi comandi</string>
- <string name="ExperiencePermission3">attivazione di animazioni per il tuo avatar</string>
- <string name="ExperiencePermission4">collegamento al tuo avatar</string>
- <string name="ExperiencePermission9">monitoraggio della tua videocamera</string>
- <string name="ExperiencePermission10">controllo della tua videocamera</string>
- <string name="ExperiencePermission11">ti teletrasporta</string>
- <string name="ExperiencePermission12">accettazione automatica delle autorizzazioni per le esperienze</string>
- <string name="ExperiencePermission16">obbliga l'avatar a sedersi</string>
- <string name="ExperiencePermission17">cambia le impostazioni dell’ambiente</string>
- <string name="ExperiencePermissionShortUnknown">ha eseguito un'operazione sconosciuta: [Permission]</string>
- <string name="ExperiencePermissionShort1">Gestione dei comandi</string>
- <string name="ExperiencePermissionShort3">Attivazione di animazioni</string>
- <string name="ExperiencePermissionShort4">Collegamento</string>
- <string name="ExperiencePermissionShort9">Monitoraggio videocamera</string>
- <string name="ExperiencePermissionShort10">Controllo videocamera</string>
- <string name="ExperiencePermissionShort11">Teleport</string>
- <string name="ExperiencePermissionShort12">Autorizzazione</string>
- <string name="ExperiencePermissionShort16">Siediti</string>
- <string name="ExperiencePermissionShort17">Ambiente</string>
- <string name="logging_calls_disabled_log_empty">Le conversazioni non vengono registrate. Per iniziare a registrare, seleziona &quot;Salva: Solo registro&quot; oppure &quot;Salva: Registri e trascrizioni&quot; in Preferenze &gt; Chat.</string>
- <string name="logging_calls_disabled_log_not_empty">Non verranno registrate più le conversazioni. Per riprendere a registrare, seleziona &quot;Salva: Solo registro&quot; oppure &quot;Salva: Registri e trascrizioni&quot; in Preferenze &gt; Chat.</string>
- <string name="logging_calls_enabled_log_empty">Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui.</string>
- <string name="loading_chat_logs">Caricamento in corso...</string>
- <string name="na">n/d</string>
- <string name="preset_combo_label">-Lista vuota-</string>
- <string name="Default">Predefinita</string>
- <string name="none_paren_cap">(Nulla)</string>
- <string name="no_limit">Senza limite</string>
- <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">La forma della fisica contiene triangoli troppo piccoli. Prova a semplificare il modello della fisica.</string>
- <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">La forma della fisica contiene dati di conferma errati. Prova a correggere il modello della fisica.</string>
- <string name="Mav_Details_MAV_UNKNOWN_VERSION">La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica.</string>
- <string name="couldnt_resolve_host">Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]).
+(per es. "/percorso per il mio/editor" "%s")
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Errore nell'elaborazione del comando dell'editor esterno.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ L'editor esterno non è stato avviato.
+ </string>
+ <string name="TranslationFailed">
+ Traduzione non riuscita: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Errore di elaborazione della risposta della traduzione.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Home
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Aggiungi
+ </string>
+ <string name="Subtract">
+ Sottrai
+ </string>
+ <string name="Multiply">
+ Moltiplica
+ </string>
+ <string name="Divide">
+ Dividi
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Visualizzazione marcatori particelle (blu)
+ </string>
+ <string name="BeaconPhysical">
+ Visualizzazione marcatori oggetti fisici (verde)
+ </string>
+ <string name="BeaconScripted">
+ Visualizzazione marcatori oggetti scriptati (rosso)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso)
+ </string>
+ <string name="BeaconSound">
+ Visualizzazione marcatori suoni (giallo)
+ </string>
+ <string name="BeaconMedia">
+ Visualizzazione marcatori multimedia (bianco)
+ </string>
+ <string name="BeaconSun">
+ Marcatore visualizza direzione sole (arancione)
+ </string>
+ <string name="BeaconMoon">
+ Marcatore visualizza direzione luna (viola)
+ </string>
+ <string name="ParticleHiding">
+ Particelle nascoste
+ </string>
+ <string name="Command_AboutLand_Label">
+ Informazioni sul terreno
+ </string>
+ <string name="Command_Appearance_Label">
+ Aspetto fisico
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Costruisci
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Conversations_Label">
+ Conversazioni
+ </string>
+ <string name="Command_Compass_Label">
+ Bussola
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinazioni
+ </string>
+ <string name="Command_Environments_Label">
+ I miei ambienti
+ </string>
+ <string name="Command_Facebook_Label">
+ Facebook
+ </string>
+ <string name="Command_Flickr_Label">
+ Flickr
+ </string>
+ <string name="Command_Gestures_Label">
+ Gesture
+ </string>
+ <string name="Command_Grid_Status_Label">
+ Stato della griglia
+ </string>
+ <string name="Command_HowTo_Label">
+ Istruzioni
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventario
+ </string>
+ <string name="Command_Map_Label">
+ Mappa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercato
+ </string>
+ <string name="Command_MarketplaceListings_Label">
+ Marketplace
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini mappa
+ </string>
+ <string name="Command_Move_Label">
+ Cammina / corri / vola
+ </string>
+ <string name="Command_Outbox_Label">
+ Casella in uscita del rivenditore
+ </string>
+ <string name="Command_People_Label">
+ Persone
+ </string>
+ <string name="Command_Picks_Label">
+ Preferiti
+ </string>
+ <string name="Command_Places_Label">
+ Luoghi
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferenze
+ </string>
+ <string name="Command_Profile_Label">
+ Profilo
+ </string>
+ <string name="Command_Report_Abuse_Label">
+ Segnala abuso
+ </string>
+ <string name="Command_Search_Label">
+ Ricerca
+ </string>
+ <string name="Command_Snapshot_Label">
+ Istantanea
+ </string>
+ <string name="Command_Speak_Label">
+ Parla
+ </string>
+ <string name="Command_Twitter_Label">
+ Twitter
+ </string>
+ <string name="Command_View_Label">
+ Controlli fotocamera
+ </string>
+ <string name="Command_Voice_Label">
+ Impostazioni voce
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informazioni sul terreno che visiti
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Cambia l'avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Seleziona un avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Costruzione oggetti e modifica terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Chatta con persone vicine usando il testo
+ </string>
+ <string name="Command_Conversations_Tooltip">
+ Conversa con chiunque
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Bussola
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinazioni interessanti
+ </string>
+ <string name="Command_Environments_Tooltip">
+ I miei ambienti
+ </string>
+ <string name="Command_Facebook_Tooltip">
+ Pubblica su Facebook
+ </string>
+ <string name="Command_Flickr_Tooltip">
+ Carica su Flickr
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gesti per il tuo avatar
+ </string>
+ <string name="Command_Grid_Status_Tooltip">
+ Mostra stato griglia corrente
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Come eseguire le attività più comuni
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Visualizza e usa le tue cose
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mappa del mondo
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Vai allo shopping
+ </string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Vendi le tue creazioni
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostra le persone vicine
+ </string>
+ <string name="Command_Move_Tooltip">
+ Movimento avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Trasferisci elementi al tuo mercato per la vendita
+ </string>
+ <string name="Command_People_Tooltip">
+ Amici, gruppi e persone vicine
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Luoghi da mostrare come preferiti nel profilo
+ </string>
+ <string name="Command_Places_Tooltip">
+ Luoghi salvati
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferenze
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Modifica o visualizza il tuo profilo
+ </string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Segnala abuso
+ </string>
+ <string name="Command_Search_Tooltip">
+ Trova luoghi, eventi, persone
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Scatta una foto
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Parla con persone vicine usando il microfono
+ </string>
+ <string name="Command_Twitter_Tooltip">
+ Twitter
+ </string>
+ <string name="Command_View_Tooltip">
+ Modifica angolo fotocamera
+ </string>
+ <string name="Command_Voice_Tooltip">
+ I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ attualmente nella barra degli strumenti in basso
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ attualmente nella barra degli strumenti a sinistra
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ attualmente nella barra degli strumenti a destra
+ </string>
+ <string name="Retain%">
+ Mantieni%
+ </string>
+ <string name="Detail">
+ Dettagli
+ </string>
+ <string name="Better Detail">
+ Migliori dettagli
+ </string>
+ <string name="Surface">
+ Superficie
+ </string>
+ <string name="Solid">
+ Solido
+ </string>
+ <string name="Wrap">
+ Involucro
+ </string>
+ <string name="Preview">
+ Anteprima
+ </string>
+ <string name="Normal">
+ Normale
+ </string>
+ <string name="Pathfinding_Wiki_URL">
+ http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </string>
+ <string name="Pathfinding_Object_Attr_None">
+ Nessuno
+ </string>
+ <string name="Pathfinding_Object_Attr_Permanent">
+ Influenza il navmesh
+ </string>
+ <string name="Pathfinding_Object_Attr_Character">
+ Personaggio
+ </string>
+ <string name="Pathfinding_Object_Attr_MultiSelect">
+ (Multiple)
+ </string>
+ <string name="snapshot_quality_very_low">
+ Molto basso
+ </string>
+ <string name="snapshot_quality_low">
+ Basso
+ </string>
+ <string name="snapshot_quality_medium">
+ Medio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Molto alto
+ </string>
+ <string name="TeleportMaturityExceeded">
+ Il Residente non può visitare questa regione.
+ </string>
+ <string name="UserDictionary">
+ [User]
+ </string>
+ <string name="experience_tools_experience">
+ Esperienza
+ </string>
+ <string name="ExperienceNameNull">
+ (nessuna esperienza)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (esperienza senza titolo)
+ </string>
+ <string name="Land-Scope">
+ A livello di terreno
+ </string>
+ <string name="Grid-Scope">
+ A livello di griglia
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ CONSENTITO
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOCCATO
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ FORNITORE
+ </string>
+ <string name="Admin_Experiences_Tab">
+ AMMINISTRATORE
+ </string>
+ <string name="Recent_Experiences_Tab">
+ RECENTE
+ </string>
+ <string name="Owned_Experiences_Tab">
+ DI PROPRIETÀ
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], massimo [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ gestione dei tuoi comandi
+ </string>
+ <string name="ExperiencePermission3">
+ attivazione di animazioni per il tuo avatar
+ </string>
+ <string name="ExperiencePermission4">
+ collegamento al tuo avatar
+ </string>
+ <string name="ExperiencePermission9">
+ monitoraggio della tua videocamera
+ </string>
+ <string name="ExperiencePermission10">
+ controllo della tua videocamera
+ </string>
+ <string name="ExperiencePermission11">
+ ti teletrasporta
+ </string>
+ <string name="ExperiencePermission12">
+ accettazione automatica delle autorizzazioni per le esperienze
+ </string>
+ <string name="ExperiencePermission16">
+ obbliga l'avatar a sedersi
+ </string>
+ <string name="ExperiencePermission17">
+ cambia le impostazioni dell’ambiente
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ ha eseguito un'operazione sconosciuta: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Gestione dei comandi
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Attivazione di animazioni
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Collegamento
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Monitoraggio videocamera
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Controllo videocamera
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teleport
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Autorizzazione
+ </string>
+ <string name="ExperiencePermissionShort16">
+ Siediti
+ </string>
+ <string name="ExperiencePermissionShort17">
+ Ambiente
+ </string>
+ <string name="logging_calls_disabled_log_empty">
+ Le conversazioni non vengono registrate. Per iniziare a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze &gt; Chat.
+ </string>
+ <string name="logging_calls_disabled_log_not_empty">
+ Non verranno registrate più le conversazioni. Per riprendere a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze &gt; Chat.
+ </string>
+ <string name="logging_calls_enabled_log_empty">
+ Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui.
+ </string>
+ <string name="loading_chat_logs">
+ Caricamento in corso...
+ </string>
+ <string name="na">
+ n/d
+ </string>
+ <string name="preset_combo_label">
+ -Lista vuota-
+ </string>
+ <string name="Default">
+ Predefinita
+ </string>
+ <string name="none_paren_cap">
+ (Nulla)
+ </string>
+ <string name="no_limit">
+ Senza limite
+ </string>
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ La forma della fisica contiene triangoli troppo piccoli. Prova a semplificare il modello della fisica.
+ </string>
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ La forma della fisica contiene dati di conferma errati. Prova a correggere il modello della fisica.
+ </string>
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica.
+ </string>
+ <string name="couldnt_resolve_host">
+ Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]).
Verifica di riuscire a connetterti al sito web www.secondlife.com.
Se riesci ma continui a ricevere questo errore, visita la sezione
-Assistenza e segnala il problema.</string>
- <string name="ssl_peer_certificate">Il server per il login non ha potuto effettuare la verifica tramite SSL.
+Assistenza e segnala il problema.
+ </string>
+ <string name="ssl_peer_certificate">
+ Il server per il login non ha potuto effettuare la verifica tramite SSL.
Se continui a ricevere questo errore, visita
la sezione Assistenza nel sito SecondLife.com
-e segnala il problema.</string>
- <string name="ssl_connect_error">Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente.
+e segnala il problema.
+ </string>
+ <string name="ssl_connect_error">
+ Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente.
Vai al Pannello di Controllo e assicurati che data e ora siano
esatte. Controlla anche che il network e il firewall siano impostati
correttamente. Se continui a ricevere questo errore, visita la sezione
Assistenza nel sito SecondLife.com e segnala il problema.
-[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze]</string>
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml
index 4a089fe7c3..b8a7bc8112 100644
--- a/indra/newview/skins/default/xui/it/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/it/teleport_strings.xml
@@ -1,38 +1,94 @@
<?xml version="1.0" ?>
<teleport_messages>
<message_set name="errors">
- <message name="invalid_tport">C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l'accesso prima di poter usare il teleport.
-Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].</message>
- <message name="invalid_region_handoff">Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l'accesso.
-Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].</message>
- <message name="blocked_tport">Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.</message>
- <message name="nolandmark_tport">Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark</message>
- <message name="timeout_tport">Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.</message>
- <message name="NoHelpIslandTP">Non puoi teleportarti nuovamente a Welcome Island.
-Per ripetere l'esercitazione, visita 'Welcome Island Public'.</message>
- <message name="noaccess_tport">Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.</message>
- <message name="missing_attach_tport">Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti.</message>
- <message name="too_many_uploads_tport">Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un'area meno affollata.</message>
- <message name="expired_tport">Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto.</message>
- <message name="expired_region_handoff">Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto.</message>
- <message name="no_host">Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto.</message>
- <message name="no_inventory_host">L'inventario è temporaneamente inaccessibile.</message>
- <message name="MustGetAgeRegion">Per poter entrare in questa regione devi avere almeno 18 anni.</message>
- <message name="RegionTPSpecialUsageBlocked">Impossibile entrare nella regione. '[REGION_NAME]' è una regione per giochi di abilità e per entrare è necessario soddisfare alcuni requisiti. Per dettagli, leggi le [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life domande frequenti sui giochi di abilità].</message>
- <message name="preexisting_tport">Mi dispiace, ma il sistema non è stato in grado di avviare il teletrasporto. Ti preghiamo di riprovare tra qualche minuto.</message>
+ <message name="invalid_tport">
+ C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l'accesso prima di poter usare il teleport.
+Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l'accesso.
+Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.
+ </message>
+ <message name="nolandmark_tport">
+ Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark
+ </message>
+ <message name="timeout_tport">
+ Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.
+ </message>
+ <message name="NoHelpIslandTP">
+ Non puoi teleportarti nuovamente a Welcome Island.
+Per ripetere l'esercitazione, visita 'Welcome Island Public'.
+ </message>
+ <message name="noaccess_tport">
+ Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.
+ </message>
+ <message name="missing_attach_tport">
+ Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti.
+ </message>
+ <message name="too_many_uploads_tport">
+ Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un'area meno affollata.
+ </message>
+ <message name="expired_tport">
+ Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto.
+ </message>
+ <message name="expired_region_handoff">
+ Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto.
+ </message>
+ <message name="no_host">
+ Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto.
+ </message>
+ <message name="no_inventory_host">
+ L'inventario è temporaneamente inaccessibile.
+ </message>
+ <message name="MustGetAgeRegion">
+ Per poter entrare in questa regione devi avere almeno 18 anni.
+ </message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Impossibile entrare nella regione. '[REGION_NAME]' è una regione per giochi di abilità e per entrare è necessario soddisfare alcuni requisiti. Per dettagli, leggi le [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life domande frequenti sui giochi di abilità].
+ </message>
+ <message name="preexisting_tport">
+ Mi dispiace, ma il sistema non è stato in grado di avviare il teletrasporto. Ti preghiamo di riprovare tra qualche minuto.
+ </message>
</message_set>
<message_set name="progress">
- <message name="sending_dest">In invio a destinazione.</message>
- <message name="redirecting">In reindirizzamento ad una nuova destinazione.</message>
- <message name="relaying">In reinvio a destinazione.</message>
- <message name="sending_home">In invio verso la destinazione casa.</message>
- <message name="sending_landmark">In invio verso la destinazione del landmark.</message>
- <message name="completing">Teletrasporto completato</message>
- <message name="completed_from">Teleport completato da [T_SLURL]</message>
- <message name="resolving">Elaborazione della destinazione in corso...</message>
- <message name="contacting">Contatto in corso con la nuova regione.</message>
- <message name="arriving">In arrivo a destinazione...</message>
- <message name="requesting">Avvio teletrasporto....</message>
- <message name="pending">Teleport in sospeso...</message>
+ <message name="sending_dest">
+ In invio a destinazione.
+ </message>
+ <message name="redirecting">
+ In reindirizzamento ad una nuova destinazione.
+ </message>
+ <message name="relaying">
+ In reinvio a destinazione.
+ </message>
+ <message name="sending_home">
+ In invio verso la destinazione casa.
+ </message>
+ <message name="sending_landmark">
+ In invio verso la destinazione del landmark.
+ </message>
+ <message name="completing">
+ Teletrasporto completato
+ </message>
+ <message name="completed_from">
+ Teleport completato da [T_SLURL]
+ </message>
+ <message name="resolving">
+ Elaborazione della destinazione in corso...
+ </message>
+ <message name="contacting">
+ Contatto in corso con la nuova regione.
+ </message>
+ <message name="arriving">
+ In arrivo a destinazione...
+ </message>
+ <message name="requesting">
+ Avvio teletrasporto....
+ </message>
+ <message name="pending">
+ Teleport in sospeso...
+ </message>
</message_set>
</teleport_messages>
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml
index 83f204648d..db833e2c8e 100644
--- a/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml
@@ -2,6 +2,6 @@
<contents>
<columns label="アクション" name="lst_action"/>
<columns label="優先コントロール" name="lst_ctrl1"/>
- <columns label="代わり1" name="lst_ctrl2"/>
- <columns label="代わり2" name="lst_ctrl3"/>
+ <columns label="代替1" name="lst_ctrl2"/>
+ <columns label="代替2" name="lst_ctrl3"/>
</contents>
diff --git a/indra/newview/skins/default/xui/ja/floater_360capture.xml b/indra/newview/skins/default/xui/ja/floater_360capture.xml
index d0a6eef0e0..4199327e88 100644
--- a/indra/newview/skins/default/xui/ja/floater_360capture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_360capture.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="360capture" title="360度Sショット">
+<floater name="360capture" title="360度スナップショット">
<panel name="ui_panel_left">
<text name="quality_level_label">
品質
@@ -11,7 +11,7 @@
<radio_item label="最高品位" name="maximum_quality" value="2048" tool_tip="最高品質"/>
</radio_group>
<check_box label="アバターをすべて隠す" name="360_hide_avatar"/>
- <button label="360度画像を作成" name="capture_button"/>
+ <button label="360度画像を作成" name="capture_button"/>
<button label="名前をつけて保存…" name="save_local_button"/>
</panel>
<panel name="ui_panel_right">
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index 7da5f41f90..ed057704fe 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -45,7 +45,7 @@
[AREA]㎡
</panel.string>
<panel.string name="auction_id_text">
- オークションID:[ID]
+ オークションID:[ID]
</panel.string>
<panel.string name="need_tier_to_modify">
この土地を修正変更するには、購入を承認する必要があります。
@@ -72,7 +72,7 @@
区画が選択されていません。
</panel.string>
<panel.string name="time_stamp_template">
- [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</panel.string>
<text name="Name:">
名前:
@@ -85,7 +85,7 @@
種類:
</text>
<text name="LandTypeText">
- メインランド/入植地
+ メインランド / ホームステッド
</text>
<text name="ContentRating">
区分:
@@ -136,7 +136,7 @@
4048m²
</text>
<text name="Traffic:">
- トラフィック:
+ 交通量:
</text>
<text name="DwellText">
読み込んでいます…
@@ -178,7 +178,7 @@
この不動産には約款がありません。
</text_editor>
<text name="covenant_timestamp_text">
- 最後更新:1969年12月31日水曜日 16:00:00
+ 最後更新:1969年12月31日水曜日 16:00:00
</text>
<text font="SansSerifLarge" name="region_section_lbl">
地域:
@@ -190,7 +190,7 @@
種類:
</text>
<text name="region_landtype_text">
- メインランド/入植地
+ メインランド / ホームステッド
</text>
<text name="region_maturity_lbl">
区分:
@@ -270,7 +270,7 @@
[COUNT]個
</text>
<text name="Autoreturn">
- 他者のオブジェクトの自動返却(分単位、0で自動返却なし):
+ 他者のオブジェクトの自動返却(分単位、0で自動返却なし):
</text>
<line_editor name="clean other time"/>
<text name="Object Owners:">
@@ -291,7 +291,7 @@
この区画を検索結果に表示する
</panel.string>
<panel.string name="search_disabled_small_tooltip">
- 区画面積が128㎡未満のため、このオプションは無効です。
+ 区画面積が128㎡未満のため、このオプションは無効です。
大きな区画のみ検索に表示させることが可能です。
</panel.string>
<panel.string name="search_disabled_permissions_tooltip">
@@ -385,7 +385,7 @@
<text name="with media:">
種類:
</text>
- <combo_box name="media type" tool_tip="動画や、Webページ、その他のメディアのURLを指定します。"/>
+ <combo_box name="media type" tool_tip="動画や、Webページ、その他のメディアのURLを指定します。"/>
<text name="at URL:">
ホームページ:
</text>
@@ -402,11 +402,11 @@
このテクスチャを使用するオブジェクトの「再生」をクリックすると、動画やWebページを表示します。テクスチャを変更するにはサムネイルを選択してください。
</text>
<check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="このオプションをチェックすると、この区画のコンテンツのスケールが自動的に設定されます。動作速度と画質が少し低下することがありますが、他のテクスチャのスケーリングや整列が必要になることはありません。"/>
- <text name="media_size" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。">
+ <text name="media_size" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。">
サイズ:
</text>
- <spinner name="media_size_width" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"/>
- <spinner name="media_size_height" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"/>
+ <spinner name="media_size_width" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"/>
+ <spinner name="media_size_height" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"/>
<text name="pixels">
ピクセル
</text>
@@ -417,7 +417,7 @@
</panel>
<panel label="サウンド" name="land_audio_panel">
<text name="MusicURL:">
- 音楽URL:
+ 音楽URL:
</text>
<text name="Sound:">
サウンド:
@@ -443,7 +443,7 @@
1つ以上のオプションが、不動産レベルで設定されています。
</panel.string>
<check_box label="誰でも訪問可(このオプションをオフにすると立入禁止ラインが作成されます)" name="public_access"/>
- <check_box label="18歳以上である必要があります。[ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="この区画にアクセスするには、18歳以上でなければなりません。詳細につきましては、[SUPPORT_SITE]をご覧になってください。"/>
+ <check_box label="18歳以上である必要があります。[ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="この区画にアクセスするには、18歳以上でなければなりません。詳細につきましては、[SUPPORT_SITE]をご覧になってください。"/>
<check_box label="支払情報が登録されている必要があります。[ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="アカウントに支払情報が登録されていない場合、この区画にアクセスすることはできません。詳細につきましては、[SUPPORT_SITE]をご覧になってください。"/>
<check_box label="制約なしにグループ[GROUP]を許可する。" name="GroupCheck" tool_tip="「一般」タブで、グループを選択してください。"/>
<check_box label="入場許可を販売:" name="PassCheck" tool_tip="この区画への一時的なアクセスを許可します。"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml b/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml
index fb2cd37cc3..b420bf7d20 100644
--- a/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml
+++ b/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml
@@ -5,7 +5,7 @@
</floater.string>
<panel label="wrapper_panel" name="wrapper_panel">
<text name="title_txt">
- 支払い方法を登録してリンデンドルを購入し、Second Lifeをもっと楽しみましょう。
+ 支払い方法を追加してリンデンドルを購入し、Second Lifeをもっと楽しみましょう。
</text>
<button label="始めましょう" name="continue_btn"/>
<button label="また後で"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
index 5de3486ea1..a4909c18fd 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
@@ -6,13 +6,13 @@
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text name="label">
- ベークド
+ ベイク済み
テクスチャ
</text>
<text name="composite_label">
合成テクスチャ
</text>
- <button label="IDをコンソールにダンプ" label_selected="ダンプ" name="Dump"/>
+ <button label="IDをコンソールにダンプ" label_selected="ダンプ" name="Dump"/>
<panel name="scroll_content_panel2">
<texture_picker label="髪" name="hair-baked"/>
<texture_picker label="髪" name="hair_grain"/>
@@ -53,12 +53,12 @@
<texture_picker label="左腕のタトゥ" name="leftarm_tattoo"/>
<texture_picker label="左足" name="leftleg-baked"/>
<texture_picker label="左足のタトゥ" name="leftleg_tattoo"/>
- <texture_picker label="予備1" name="aux1-baked"/>
- <texture_picker label="予備1タトゥ" name="aux1_tattoo"/>
- <texture_picker label="予備2" name="aux2-baked"/>
- <texture_picker label="予備2タトゥ" name="aux2_tattoo"/>
- <texture_picker label="予備3" name="aux3-baked"/>
- <texture_picker label="予備3タトゥ" name="aux3_tattoo"/>
+ <texture_picker label="予備1" name="aux1-baked"/>
+ <texture_picker label="予備1タトゥ" name="aux1_tattoo"/>
+ <texture_picker label="予備2" name="aux2-baked"/>
+ <texture_picker label="予備2タトゥ" name="aux2_tattoo"/>
+ <texture_picker label="予備3" name="aux3-baked"/>
+ <texture_picker label="予備3タトゥ" name="aux3_tattoo"/>
</panel>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml
index 8cd9c0cff9..c48296fa8f 100644
--- a/indra/newview/skins/default/xui/ja/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml
@@ -4,21 +4,21 @@
検出なし
</floater.string>
<floater.string name="bump">
- [TIME] [NAME]があなたに衝突しました。
+ [TIME] [NAME]があなたに衝突しました。
</floater.string>
<floater.string name="llpushobject">
- [TIME] [NAME]がスクリプトであなたを押しました。
+ [TIME] [NAME]がスクリプトであなたを押しました。
</floater.string>
<floater.string name="selected_object_collide">
- [TIME] [NAME]が、オブジェクトであなたを叩きました。
+ [TIME] [NAME]が、オブジェクトであなたを叩きました。
</floater.string>
<floater.string name="scripted_object_collide">
- [TIME] [NAME]が、スクリプトのオブジェクトであなたを叩きました。
+ [TIME] [NAME]が、スクリプトのオブジェクトであなたを叩きました。
</floater.string>
<floater.string name="physical_object_collide">
- [TIME] [NAME]が、物理オブジェクトであなたを叩きました。
+ [TIME] [NAME]が、物理オブジェクトであなたを叩きました。
</floater.string>
<floater.string name="timeStr">
- [[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]]
+ [[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]]
</floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml
index f75564cd4c..a72836bbbc 100644
--- a/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml
+++ b/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml
@@ -13,7 +13,7 @@
自分で作成したデイサイクルを編集するには、希望の設定に調節して、「保存」をクリックします。
</string>
<string name="time_label">
- ([HH]:[MM])
+ ([HH]:[MM])
</string>
<string name="sky_track_label">
空[ALT]
@@ -42,9 +42,9 @@
<layout_stack name="content_stack">
<layout_panel name="timeline_track_selection">
<panel name="timeline_layers">
- <button label="空4" name="sky4_track"/>
- <button label="空3" name="sky3_track"/>
- <button label="空2" name="sky2_track"/>
+ <button label="空4" name="sky4_track"/>
+ <button label="空3" name="sky3_track"/>
+ <button label="空2" name="sky2_track"/>
<button label="地面" name="sky1_track"/>
<button label="水面" name="water_track"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
index 3c96e2e340..d82be80c95 100644
--- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
@@ -20,17 +20,17 @@
<button label="地形を元に戻す" label_selected="地形を元に戻す" name="Revert Terrain" tool_tip="現在の地形をデフォルトに置換します。"/>
<button label="地形を交換" label_selected="地形を交換" name="Swap Terrain" tool_tip="現在の地形をデフォルトと入れ替えます。"/>
<text name="estate id">
- 不動産ID:
+ 不動産ID:
</text>
<text name="parent id">
- 親ID:
+ 親ID:
</text>
<line_editor name="parentestate" tool_tip="これは、このリージョン(地域)の親不動産です。"/>
<text name="Grid Pos: ">
グリッド位置:
</text>
- <line_editor name="gridposx" tool_tip="これは、このリージョン(地域)のグリッドX座標です。"/>
- <line_editor name="gridposy" tool_tip="これは、このリージョン(地域)のグリッドY座標です。"/>
+ <line_editor name="gridposx" tool_tip="これは、このリージョン(地域)のグリッドX座標です。"/>
+ <line_editor name="gridposy" tool_tip="これは、このリージョン(地域)のグリッドY座標です。"/>
<text name="Redirect to Grid: ">
グリッドにリダイレクト:
</text>
@@ -85,7 +85,7 @@
<combo_box.item label="コライダー<ステップ>" name="item1"/>
<combo_box.item label="スクリプト<回数>、<オプション・パターン>" name="item2"/>
<combo_box.item label="オブジェクト<パターン>" name="item3"/>
- <combo_box.item label="rez <アセットID>" name="item4"/>
+ <combo_box.item label="rez <アセットID>" name="item4"/>
</combo_box>
<text name="Parameter:">
パラメーター:
diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
index 319db34879..5b09d2da53 100644
--- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
@@ -4,7 +4,7 @@
5
</floater.string>
<floater.string name="localchat">
- 近隣のボイスチャット
+ 近くのボイスチャット
</floater.string>
<floater.string name="anonymous">
匿名ユーザー
diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml
index fca7b2eab8..0a859f9142 100644
--- a/indra/newview/skins/default/xui/ja/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="inspect" title="オブジェクトの調査">
<floater.string name="timeStamp">
- [year,datetime,slt]年[mth,datetime,slt]月[day,datetime,slt]日([wkday,datetime,slt]) [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]
+ [year,datetime,slt]年[mth,datetime,slt]月[day,datetime,slt]日([wkday,datetime,slt]) [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]
</floater.string>
<scroll_list name="object_list" tool_tip="このリストからオブジェクトを選択して、インワールドでハイライトします。">
<scroll_list.columns label="オブジェクト名" name="object_name"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml
index 559ecee5a8..0d3f0992a2 100644
--- a/indra/newview/skins/default/xui/ja/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml
@@ -6,9 +6,9 @@
<text name="joystick_lbl">
ジョイスティック:
</text>
- <spinner label="X軸マッピング" name="JoystickAxis1"/>
- <spinner label="Y軸マッピング" name="JoystickAxis2"/>
- <spinner label="Z軸マッピング" name="JoystickAxis0"/>
+ <spinner label="X軸マッピング" name="JoystickAxis1"/>
+ <spinner label="Y軸マッピング" name="JoystickAxis2"/>
+ <spinner label="Z軸マッピング" name="JoystickAxis0"/>
<spinner label="ピッチ・マッピング" name="JoystickAxis4"/>
<spinner label="ヨー・マッピング" name="JoystickAxis5"/>
<spinner label="ロール・マッピング" name="JoystickAxis3"/>
@@ -23,19 +23,19 @@
<check_box label="造る" name="JoystickBuildEnabled"/>
<check_box label="フライ・カメラ" name="JoystickFlycamEnabled"/>
<text name="XScale">
- Xスケール
+ Xスケール
</text>
<spinner name="AvatarAxisScale1"/>
<spinner name="BuildAxisScale1"/>
<spinner name="FlycamAxisScale1"/>
<text name="YScale">
- Yスケール
+ Yスケール
</text>
<spinner name="AvatarAxisScale2"/>
<spinner name="BuildAxisScale2"/>
<spinner name="FlycamAxisScale2"/>
<text name="ZScale">
- Zスケール
+ Zスケール
</text>
<spinner name="AvatarAxisScale0"/>
<spinner name="BuildAxisScale0"/>
@@ -58,19 +58,19 @@
<spinner name="BuildAxisScale3"/>
<spinner name="FlycamAxisScale3"/>
<text name="XDeadZone">
- Xデッド・ゾーン
+ Xデッド・ゾーン
</text>
<spinner name="AvatarAxisDeadZone1"/>
<spinner name="BuildAxisDeadZone1"/>
<spinner name="FlycamAxisDeadZone1"/>
<text name="YDeadZone">
- Yデッド・ゾーン
+ Yデッド・ゾーン
</text>
<spinner name="AvatarAxisDeadZone2"/>
<spinner name="BuildAxisDeadZone2"/>
<spinner name="FlycamAxisDeadZone2"/>
<text name="ZDeadZone">
- Zデッド・ゾーン
+ Zデッド・ゾーン
</text>
<spinner name="AvatarAxisDeadZone0"/>
<spinner name="BuildAxisDeadZone0"/>
@@ -110,12 +110,12 @@
<button label="OK" label_selected="OK" name="ok_btn"/>
<button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
<stat_view label="ジョイスティック・モニター" name="axis_view">
- <stat_bar label="軸0" name="axis0"/>
- <stat_bar label="軸1" name="axis1"/>
- <stat_bar label="軸2" name="axis2"/>
- <stat_bar label="軸3" name="axis3"/>
- <stat_bar label="軸4" name="axis4"/>
- <stat_bar label="軸5" name="axis5"/>
+ <stat_bar label="軸0" name="axis0"/>
+ <stat_bar label="軸1" name="axis1"/>
+ <stat_bar label="軸2" name="axis2"/>
+ <stat_bar label="軸3" name="axis3"/>
+ <stat_bar label="軸4" name="axis4"/>
+ <stat_bar label="軸5" name="axis5"/>
</stat_view>
<string name="NoDevice">
デバイスは検出されませんでした。
diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
index e7830bbd25..67b4e29e45 100644
--- a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_lagmeter" title="ラグメーター">
<floater.string name="max_title_msg">
- 遅延計測器
+ ラグメーター
</floater.string>
<floater.string name="max_width_px">
360
diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
index 31009cb2e0..cd32fac8ac 100644
--- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
@@ -17,13 +17,13 @@
<column label="面積" name="area"/>
</scroll_list>
<text name="allowed_label">
- 現在の支払いプランで利用可能な入植地:
+ 現在の支払いプランで所有可能な土地:
</text>
<text name="allowed_text">
[AREA]㎡
</text>
<text name="current_label">
- 現在の保有地:
+ 現在所有している土地:
</text>
<text name="current_text">
[AREA]㎡
diff --git a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
index 4bb370f6ea..f362bff2bd 100644
--- a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="LSLレファレンス">
+<floater name="script ed float" title="LSLレファレンス">
<check_box label="カーソルを追う" name="lock_check"/>
<combo_box label="ロック" name="history_combo"/>
<button label="戻る" name="back_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
index 69629f357f..123421a97d 100644
--- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
@@ -233,7 +233,7 @@
</panel>
<panel label="アップロードのオプション" name="modifiers_panel">
<text name="scale_label">
- スケール(1=増減なし):
+ スケール(1=増減なし):
</text>
<spinner name="import_scale" value="1.0"/>
<text name="dimensions_label">
@@ -250,7 +250,7 @@
<check_box label="ジョイント位置を含む" name="upload_joints"/>
<check_box label="ジョイント位置が定義されている場合、スケールをロック" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
- Zオフセット(アバターを上下調整):
+ Zオフセット(アバターを上下調整):
</text>
<spinner name="pelvis_offset" value="0.0"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
index d74b714b1a..35f4cd3ca3 100644
--- a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
@@ -4,7 +4,7 @@
5
</floater.string>
<floater.string name="localchat">
- 近隣のボイスチャット
+ 近くのボイスチャット
</floater.string>
<floater.string name="anonymous">
匿名ユーザー
diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml
index 00742aef23..092b564455 100644
--- a/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml
@@ -32,7 +32,7 @@
<scroll_list.columns label="名前" name="name"/>
<scroll_list.columns label="説明" name="description"/>
<scroll_list.columns label="所有者" name="owner"/>
- <scroll_list.columns label="CPU" name="cpu_time"/>
+ <scroll_list.columns label="CPU" name="cpu_time"/>
<scroll_list.columns label="高度" name="altitude"/>
</scroll_list>
<text name="messaging_status">
diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml
index 218fade27b..72d9f4b44a 100644
--- a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml
@@ -89,17 +89,17 @@
</text>
<combo_box name="show_heatmap_mode">
<combo_box.item label="表示しない" name="show_heatmap_mode_none"/>
- <combo_box.item label="キャラクタータイプA" name="show_heatmap_mode_a"/>
- <combo_box.item label="キャラクタータイプB" name="show_heatmap_mode_b"/>
- <combo_box.item label="キャラクタータイプC" name="show_heatmap_mode_c"/>
- <combo_box.item label="キャラクタータイプD" name="show_heatmap_mode_d"/>
+ <combo_box.item label="キャラクタータイプA" name="show_heatmap_mode_a"/>
+ <combo_box.item label="キャラクタータイプB" name="show_heatmap_mode_b"/>
+ <combo_box.item label="キャラクタータイプC" name="show_heatmap_mode_c"/>
+ <combo_box.item label="キャラクタータイプD" name="show_heatmap_mode_d"/>
</combo_box>
<check_box label="歩行可能" name="show_walkables"/>
<check_box label="素材ボリューム" name="show_material_volumes"/>
<check_box label="静的障害物" name="show_static_obstacles"/>
<check_box label="除外ボリューム" name="show_exclusion_volumes"/>
<check_box label="水上飛行機" name="show_water_plane"/>
- <check_box label="X線表示" name="show_xray"/>
+ <check_box label="X線表示" name="show_xray"/>
</panel>
<panel label="パスをテスト" name="test_panel">
<text name="ctrl_click_label">
@@ -113,17 +113,17 @@
</text>
<slider name="character_width" value="1"/>
<text name="character_width_unit_label">
- m
+ m
</text>
<text name="character_type_label">
キャラクタータイプ
</text>
<combo_box name="path_character_type">
<combo_box.item label="なし" name="path_character_type_none"/>
- <combo_box.item label="A" name="path_character_type_a"/>
- <combo_box.item label="B" name="path_character_type_b"/>
- <combo_box.item label="C" name="path_character_type_c"/>
- <combo_box.item label="D" name="path_character_type_d"/>
+ <combo_box.item label="A" name="path_character_type_a"/>
+ <combo_box.item label="B" name="path_character_type_b"/>
+ <combo_box.item label="C" name="path_character_type_c"/>
+ <combo_box.item label="D" name="path_character_type_d"/>
</combo_box>
<button label="経路をクリア" name="clear_path"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
index 0189cbd47b..0bf9b6a308 100644
--- a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
@@ -119,10 +119,10 @@
<scroll_list.columns label="ランドインパクト" name="land_impact"/>
<scroll_list.columns label="距離" name="dist_from_you"/>
<scroll_list.columns label="経路探索で使用" name="linkset_use"/>
- <scroll_list.columns label="A%" name="a_percent"/>
- <scroll_list.columns label="B%" name="b_percent"/>
- <scroll_list.columns label="C%" name="c_percent"/>
- <scroll_list.columns label="D%" name="d_percent"/>
+ <scroll_list.columns label="A %" name="a_percent"/>
+ <scroll_list.columns label="B %" name="b_percent"/>
+ <scroll_list.columns label="C %" name="c_percent"/>
+ <scroll_list.columns label="D %" name="d_percent"/>
</scroll_list>
<text name="messaging_status">
リンクセット:
@@ -150,21 +150,21 @@
歩行可能性:
</text>
<text name="edit_a_label">
- A
+ A
</text>
- <line_editor name="edit_a_value" tool_tip="タイプAのキャラクターの歩行可能性。キャラクタータイプの例はヒューマノイドです。"/>
+ <line_editor name="edit_a_value" tool_tip="タイプAのキャラクターの歩行可能性。キャラクタータイプの例はヒューマノイドです。"/>
<text name="edit_b_label">
- B
+ B
</text>
- <line_editor name="edit_b_value" tool_tip="タイプBのキャラクターの歩行可能性。キャラクタータイプの例はクリーチャーです。"/>
+ <line_editor name="edit_b_value" tool_tip="タイプBのキャラクターの歩行可能性。キャラクタータイプの例はクリーチャーです。"/>
<text name="edit_c_label">
- C
+ C
</text>
- <line_editor name="edit_c_value" tool_tip="タイプCのキャラクターの歩行可能性。キャラクタータイプの例はメカニカルです。"/>
+ <line_editor name="edit_c_value" tool_tip="タイプCのキャラクターの歩行可能性。キャラクタータイプの例はメカニカルです。"/>
<text name="edit_d_label">
- D
+ D
</text>
- <line_editor name="edit_d_value" tool_tip="タイプDのキャラクターの歩行可能性。キャラクタータイプの例はその他です。"/>
+ <line_editor name="edit_d_value" tool_tip="タイプDのキャラクターの歩行可能性。キャラクタータイプの例はその他です。"/>
<button label="変更を適用" name="apply_edit_values"/>
<text name="suggested_use_a_label">
(ヒューマノイド)
diff --git a/indra/newview/skins/default/xui/ja/floater_performance.xml b/indra/newview/skins/default/xui/ja/floater_performance.xml
index e2efc152a4..ecb00dd58c 100644
--- a/indra/newview/skins/default/xui/ja/floater_performance.xml
+++ b/indra/newview/skins/default/xui/ja/floater_performance.xml
@@ -39,7 +39,7 @@
</panel>
<panel name="nearby_subpanel">
<text name="avatars_nearby_lbl">
- 近隣のアバター
+ 近くのアバター
</text>
<text name="avatars_nearby_desc">
近くにいるアバターのうち、どのタイプのアバターを完全に表示するかを管理します。
@@ -51,16 +51,16 @@
アバターの複雑度
</text>
<text name="complexity_info">
- FPSが出ない場合は、アバターの複雑度を減らしてください。
+ FPSが出ない場合は、アバターの複雑度を減らしてください。
</text>
<icon name="icon_arrow4"/>
</panel>
<panel name="huds_subpanel">
<text name="huds_lbl">
- アクティブなHUD
+ アクティブなHUD
</text>
<text name="huds_desc">
- 使用していないHUDを外すと、速度が向上する可能性があります。
+ 使用していないHUDを外すと、速度が向上する可能性があります。
</text>
<icon name="icon_arrow4"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index c26bad3176..f75026c6a6 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -15,7 +15,7 @@
<panel label="色" name="colors"/>
<panel label="プライバシー" name="im"/>
<panel label="セットアップ" name="input"/>
- <panel label="拡張" name="advanced1"/>
+ <panel label="アドバンス" name="advanced1"/>
<panel label="アップロード" name="uploads"/>
<panel label="操作" name="controls"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
index 66a416f416..9a2ed64291 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="prefs_graphics_advanced" title="拡張グラフィック設定">
+<floater name="prefs_graphics_advanced" title="グラフィック詳細設定">
<text name="GeneralText">
全般
</text>
<slider label="描画距離:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
- m
+ m
</text>
<slider label="最大パーティクル数:" name="MaxParticleCount"/>
<slider label="ポストプロセス品質:" name="RenderPostProcess"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml
index 5efbbf7e17..5f686e41e4 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml
@@ -4,14 +4,14 @@
カメラのオフセット:
</text>
<spinner name="camera_x"/>
- <spinner label="Y" name="camera_y"/>
- <spinner label="Z" name="camera_z"/>
+ <spinner label="Y" name="camera_y"/>
+ <spinner label="Z" name="camera_z"/>
<text name="focus_offset_lbl">
焦点のオフセット:
</text>
<spinner name="focus_x"/>
- <spinner label="Y" name="focus_y"/>
- <spinner label="Z" name="focus_z"/>
+ <spinner label="Y" name="focus_y"/>
+ <spinner label="Z" name="focus_z"/>
<text name="offset_scale_lbl">
カメラのオフセット倍率:
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml
index 43d5223ecc..b43d54001c 100644
--- a/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml
+++ b/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml
@@ -4,7 +4,7 @@
<container_view name="statistics_view">
<stat_view name="basic" label="基本">
<stat_bar label="フレームごとのピクセル差" name="frame difference" unit_label="%"/>
- <stat_bar label="UDPデータの受信量" name="bandwidth" unit_label="kbps"/>
+ <stat_bar label="UDPデータの受信量" name="bandwidth" unit_label="kbps"/>
<stat_bar label="パケットロス" name="packet_loss" unit_label="%"/>
</stat_view>
<stat_view name="advanced" label="拡張">
@@ -57,15 +57,15 @@
<stat_bar name="simsimphysicsshapeupdatemsec" label=" 物理形状更新" unit_label="㎳"/>
<stat_bar name="simsimphysicsothermsec" label=" 他の物理作用" unit_label="㎳"/>
<stat_bar name="simsleepmsec" label=" スリープ時間" unit_label="㎳"/>
- <stat_bar name="simpumpiomsec" label=" ポンプI/O" unit_label="㎳"/>
+ <stat_bar name="simpumpiomsec" label=" ポンプIO" unit_label="㎳"/>
</stat_view>
</stat_view>
</stat_view>
<stat_view name="frame_stats" label="フレームの内訳">
<stat_bar name="scenery_frame_pct" label="景色" unit_label="%"/>
<stat_bar name="avatar_frame_pct" label="アバター" unit_label="%"/>
- <stat_bar name="ui_frame_pct" label="UI" unit_label="%"/>
- <stat_bar name="huds_frame_pct" label="HUD" unit_label="%"/>
+ <stat_bar name="ui_frame_pct" label="UI" unit_label="%"/>
+ <stat_bar name="huds_frame_pct" label="HUD" unit_label="%"/>
<stat_bar name="swap_frame_pct" label="スワップ" unit_label="%"/>
<stat_bar name="idle_frame_pct" label="タスク" unit_label="%"/>
</stat_view>
diff --git a/indra/newview/skins/default/xui/ja/floater_search.xml b/indra/newview/skins/default/xui/ja/floater_search.xml
deleted file mode 100644
index 531ac77f95..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- 読み込んでいます…。
- </floater.string>
- <floater.string name="done_text">
- 完了
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- 現在のゴッドレベルに反映させるため、検索をやり直してください。
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
index f304ab9769..ef1947dbce 100644
--- a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
@@ -16,10 +16,10 @@
</radio_group>
<line_editor name="val_text"/>
<color_swatch label="色" name="val_color_swatch"/>
- <spinner label="X" name="val_spinner_1"/>
- <spinner label="X" name="val_spinner_2"/>
- <spinner label="X" name="val_spinner_3"/>
- <spinner label="X" name="val_spinner_4"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
<button label="デフォルトにリセット" name="default_btn"/>
<check_box label="変更された設定のみ表示" name="hide_default"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index 8035e8a13f..be9c52fb12 100644
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -49,7 +49,7 @@
<combo_box.item label="色深度" name="Depth" value="depth"/>
</combo_box>
<check_box label="インターフェース" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
+ <check_box label="HUD" name="hud_check"/>
<check_box label="フレームをフリーズ(全画面)" name="freeze_frame_check"/>
<check_box label="自動リフレッシュ" name="auto_snapshot_check"/>
<text name="filter_list_label">
@@ -93,6 +93,6 @@
[SIZE]㎅
</text>
<text name="360_label">
- 360度Sショットを撮影
+ 360度スナップショットを撮影
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml
index 0c28b47351..41a482a4b9 100644
--- a/indra/newview/skins/default/xui/ja/floater_stats.xml
+++ b/indra/newview/skins/default/xui/ja/floater_stats.xml
@@ -3,15 +3,15 @@
<scroll_container name="statistics_scroll">
<container_view name="statistics_view">
<stat_view label="基本" name="basic">
- <stat_bar label="FPS" name="fps" unit_label="/秒"/>
+ <stat_bar label="FPS" name="fps" unit_label="/秒"/>
<stat_bar name="frame_mean" label="フレーム(平均)" unit_label="㎳"/>
<stat_bar name="frame_median" label="フレーム(中央値)" unit_label="㎳"/>
<stat_bar name="framet_jitter" label="ジッタ"/>
- <stat_bar label="受信したUDPデータ" name="bandwidth"/>
+ <stat_bar label="受信したUDPデータ" name="bandwidth"/>
<stat_bar label="パケットロス" name="packet_loss"/>
<stat_bar label="シムのPing" name="ping"/>
</stat_view>
- <stat_view label="拡張" name="advanced">
+ <stat_view label="詳細" name="advanced">
<stat_view label="描画" name="render">
<stat_bar label="フレームあたりのKTris" name="ktrisframe" unit_label="ktris/フレーム"/>
<stat_bar label="秒あたりのKTris" name="ktrissec"/>
@@ -27,15 +27,15 @@
<stat_bar label="キャッシュヒット率" name="texture_cache_hits"/>
<stat_bar label="キャッシュ読み取り遅延" name="texture_cache_read_latency"/>
<stat_bar label="カウント" name="numimagesstat"/>
- <stat_bar label="RAWカウント" name="numrawimagesstat"/>
- <stat_bar label="GLメモリ" name="gltexmemstat"/>
+ <stat_bar label="Rawカウント" name="numrawimagesstat"/>
+ <stat_bar label="GLメモリ" name="gltexmemstat"/>
<stat_bar label="フォーマット済メモリ" name="formattedmemstat"/>
- <stat_bar label="RAWメモリ" name="rawmemstat"/>
+ <stat_bar label="Rawメモリ" name="rawmemstat"/>
<stat_bar label="統合メモリ" name="glboundmemstat"/>
</stat_view>
<stat_view label="メモリ使用量" name="memory">
- <stat_bar label="LLトレース" name="LLTrace"/>
- <stat_bar label="UI" name="LLView"/>
+ <stat_bar label="LLトレース" name="LLTrace"/>
+ <stat_bar label="UI" name="LLView"/>
<stat_bar label="フォント" name="LLFontFreetype"/>
<stat_bar label="インベントリ" name="LLInventoryObject"/>
<stat_bar label="ビューアオブジェクト" name="LLViewerObject"/>
@@ -47,7 +47,7 @@
<stat_bar label="描画情報" name="LLDrawInfo"/>
<stat_bar label="テクスチャデータ" name="LLTexture"/>
<stat_bar label="画像データ" name="LLImage"/>
- <stat_bar label="GL画像データ" name="LLImageGL"/>
+ <stat_bar label="GL画像データ" name="LLImageGL"/>
<stat_bar label="頂点バッファ" name="LLVertexBuffer"/>
</stat_view>
<stat_view label="ネットワーク" name="network">
@@ -63,11 +63,11 @@
</stat_view>
<stat_view label="シミュレーター" name="sim">
<stat_bar label="遅延時間" name="simtimedilation"/>
- <stat_bar label="シムのFPS" name="simfps"/>
- <stat_bar label="物理作用のFPS" name="simphysicsfps"/>
+ <stat_bar label="シムのFPS" name="simfps"/>
+ <stat_bar label="物理作用のFPS" name="simphysicsfps"/>
<stat_view label="物理作用の詳細" name="physicsdetail">
<stat_bar label="ピン留めオブジェクト" name="physicspinnedtasks"/>
- <stat_bar label="低LODオブジェクト" name="physicslodtasks"/>
+ <stat_bar label="低LODオブジェクト" name="physicslodtasks"/>
<stat_bar label="メモリ配分" name="physicsmemoryallocated"/>
</stat_view>
<stat_bar label="エージェントの更新/秒" name="simagentups"/>
@@ -79,7 +79,7 @@
<stat_bar label="スクリプト実行" name="simpctscriptsrun"/>
<stat_bar label="スクリプトイベント" name="simscripteps" unit_label="eps"/>
<stat_view label="経路探索" name="simpathfinding">
- <stat_bar label="AIステップ時間" name="simsimaistepmsec"/>
+ <stat_bar label="AIステップ時間" name="simsimaistepmsec"/>
<stat_bar label="スキップされたシルエットステップ" name="simsimskippedsilhouettesteps" unit_label="/秒"/>
<stat_bar label="更新されたキャラクター" name="simsimpctsteppedcharacters" unit_label="%"/>
</stat_view>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index fb95a71ce0..f14d8f7241 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -40,7 +40,7 @@
土地をクリックし、ドラッグして選択
</floater.string>
<floater.string name="status_selectcount">
- 選択されているオブジェクトは[OBJ_COUNT]個、土地の負荷は[LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細]
+ 選択されているオブジェクトは[OBJ_COUNT]個、土地の負荷は[LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細]
</floater.string>
<floater.string name="status_remaining_capacity">
残りの許容数[LAND_CAPACITY]
@@ -123,7 +123,7 @@
何も選択されていません。
</text>
<text name="remaining_capacity">
- [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細]
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細]
</text>
<tab_container name="Object Info Tabs">
<panel label="一般" name="General">
@@ -232,22 +232,22 @@
<check_box label="コピー" name="checkbox next owner can copy" tool_tip="譲渡先の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制約があります。"/>
<check_box label="再販・譲渡" name="checkbox next owner can transfer" tool_tip="譲渡先の所有者は、このオブジェクトを他人に譲渡したり再販することができます。"/>
<text name="B:">
- B:
+ B:
</text>
<text name="O:">
- C:
+ O:
</text>
<text name="G:">
- G:
+ G:
</text>
<text name="E:">
- E:
+ E:
</text>
<text name="N:">
- N:
+ N:
</text>
<text name="F:">
- F:
+ F:
</text>
</panel>
<panel name="pathfinding_attrs_panel">
@@ -264,21 +264,21 @@
<text name="label position">
位置(メートル)
</text>
- <spinner label="X" name="Pos X"/>
- <spinner label="Y" name="Pos Y"/>
- <spinner label="Z" name="Pos Z"/>
+ <spinner label="X" name="Pos X"/>
+ <spinner label="Y" name="Pos Y"/>
+ <spinner label="Z" name="Pos Z"/>
<text name="label size">
サイズ(メートル)
</text>
- <spinner label="X" name="Scale X"/>
- <spinner label="Y" name="Scale Y"/>
- <spinner label="Z" name="Scale Z"/>
+ <spinner label="X" name="Scale X"/>
+ <spinner label="Y" name="Scale Y"/>
+ <spinner label="Z" name="Scale Z"/>
<text name="label rotation">
回転(度)
</text>
- <spinner label="X" name="Rot X"/>
- <spinner label="Y" name="Rot Y"/>
- <spinner label="Z" name="Rot Z"/>
+ <spinner label="X" name="Rot X"/>
+ <spinner label="Y" name="Rot Y"/>
+ <spinner label="Z" name="Rot Z"/>
<combo_box name="comboBaseType">
<combo_box.item label="ボックス" name="Box"/>
<combo_box.item label="シリンダー" name="Cylinder"/>
@@ -320,13 +320,13 @@
<text name="scale_hole">
穴寸法
</text>
- <spinner label="X" name="Taper Scale X"/>
- <spinner label="Y" name="Taper Scale Y"/>
+ <spinner label="X" name="Taper Scale X"/>
+ <spinner label="Y" name="Taper Scale Y"/>
<text name="text topshear">
上部層
</text>
- <spinner label="X" name="Shear X"/>
- <spinner label="Y" name="Shear Y"/>
+ <spinner label="X" name="Shear X"/>
+ <spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
プロフィールカット(始点と終点)
</text>
@@ -341,8 +341,8 @@
<text name="text taper2">
テーパー
</text>
- <spinner label="X" name="Taper X"/>
- <spinner label="Y" name="Taper Y"/>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
<text name="text radius delta">
半径
</text>
@@ -350,7 +350,7 @@
回転体
</text>
<texture_picker label="スカルプトテクスチャ" name="sculpt texture control" tool_tip="クリックして画像を選択してください。"/>
- <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムをX軸上で反転させます"/>
+ <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムをX軸上で反転させます"/>
<check_box label="裏返し" name="sculpt invert control" tool_tip="スカルプトプリムを反転させて裏返します"/>
<text name="label sculpt type">
縫い目のタイプ
@@ -379,20 +379,20 @@
オブジェクトの特徴を編集:
</text>
<check_box label="アニメーションメッシュ" name="Animated Mesh Checkbox Ctrl" tool_tip="リグ入りメッシュオブジェクトを、それぞれアニメーションさせることができるようになります。"/>
- <check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸を中心に、オブジェクトの屈曲を有効にします。(クライアント側のみ)"/>
+ <check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸を中心に、オブジェクトの屈曲を有効にします。(クライアント側のみ)"/>
<spinner label="柔軟性" name="FlexNumSections"/>
<spinner label="重力" name="FlexGravity"/>
<spinner label="ドラッグ" name="FlexFriction"/>
<spinner label="風" name="FlexWind"/>
<spinner label="緊張" name="FlexTension"/>
- <spinner label="X軸方向の力" name="FlexForceX"/>
- <spinner label="Y軸方向の力" name="FlexForceY"/>
- <spinner label="Z軸方向の力" name="FlexForceZ"/>
+ <spinner label="X軸方向の力" name="FlexForceX"/>
+ <spinner label="Y軸方向の力" name="FlexForceY"/>
+ <spinner label="Z軸方向の力" name="FlexForceZ"/>
<check_box label="発光" name="Light Checkbox Ctrl" tool_tip="オブジェクトが発光します"/>
<color_swatch label="" name="colorswatch" tool_tip="クリックしてカラーピッカーを開きます"/>
<texture_picker label="" name="light texture control" tool_tip="クリックで投影画を選択します(遅延レンダリング有効時のみ)"/>
<spinner label="輝度" name="Light Intensity"/>
- <spinner label="FOV" name="Light FOV"/>
+ <spinner label="FOV" name="Light FOV"/>
<spinner label="半径" name="Light Radius"/>
<spinner label="焦点" name="Light Focus"/>
<spinner label="弱まる" name="Light Falloff"/>
@@ -412,7 +412,7 @@
</combo_box>
<spinner label="重力" name="Physics Gravity"/>
<spinner label="摩擦" name="Physics Friction"/>
- <spinner label="密度(100㎏/㎥)" name="Physics Density"/>
+ <spinner label="密度(100㎏/㎥)" name="Physics Density"/>
<spinner label="復元" name="Physics Restitution"/>
</panel>
<panel label="材質" name="Texture"/>
@@ -426,13 +426,13 @@
区画情報
</text>
<text name="label_area_price">
- 価格:[AREA]㎡ L$ [PRICE]
+ 価格:[AREA]㎡ L$ [PRICE]
</text>
<text name="label_area">
面積:[AREA]㎡
</text>
<button label="土地情報" label_selected="土地情報" name="button about land"/>
- <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者の種類別に区画を色づけます:緑色=あなたの土地 水色=あなたのグループ所有地 赤色=他人が所有する土地 黄色 = 売り出し中 紫色=オークション 灰色=公共領域"/>
+ <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者の種類別に区画を色づけます:&#10;&#10;緑色=あなたの土地 &#10;水色=あなたのグループ所有地 &#10;赤色=他人が所有する土地 &#10;黄色 = 売り出し中 &#10;紫色=オークション &#10;灰色=公共領域"/>
<text name="label_parcel_modify">
区画の編集
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_top_objects.xml b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
index 86ab64cb3e..69d527a087 100644
--- a/indra/newview/skins/default/xui/ja/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
@@ -22,7 +22,7 @@
何も見つかりませんでした。
</floater.string>
<floater.string name="URLs">
- URL
+ URL
</floater.string>
<floater.string name="memory">
メモリ(㎅)
@@ -41,7 +41,7 @@
<scroll_list.columns label="メモリ(㎅)" name="memory"/>
</scroll_list>
<text name="id_text">
- 物体ID:
+ 物体ID:
</text>
<button label="標識を表示" name="show_beacon_btn"/>
<text name="obj_name_text">
diff --git a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
index 8bbcbcdfed..dbe5c3007a 100644
--- a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_translation_settings" title="チャットの翻訳設定">
<string name="azure_api_key_not_verified">
- Azureサービス識別子の認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
+ Azureサービス識別子の認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
</string>
<string name="google_api_key_not_verified">
- Google APIキーの認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
+ Google APIキーの認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
</string>
<string name="deepl_api_key_not_verified">
- DeepL Authキーの認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
+ DeepL Authキーの認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
</string>
<string name="azure_api_key_verified">
Azureサービス識別子が認証されました。
diff --git a/indra/newview/skins/default/xui/ja/floater_ui_preview.xml b/indra/newview/skins/default/xui/ja/floater_ui_preview.xml
index b907b4e8d7..c3d70e7055 100644
--- a/indra/newview/skins/default/xui/ja/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_ui_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gui_preview_tool" title="XUIプレビューツール">
+<floater name="gui_preview_tool" title="XUIプレビューツール">
<string name="ExternalEditorNotSet">
環境変数LL_XUI_EDITORまたはExternalEditor設定を設定するか、[EDITOR PATH]フィールドにそのパスを指定して、エディターを選択します。
</string>
@@ -10,11 +10,11 @@
<combo_box name="language_select_combo">
<combo_box.item label="ja" name="item1" value="ja"/>
</combo_box>
- <button label="表示" label_selected="表示" name="display_floater" tool_tip="選択したXMLファイルで定義されたXUIフロータを表示します。"/>
+ <button label="表示" label_selected="表示" name="display_floater" tool_tip="選択したXMLファイルで定義されたXUIフロータを表示します。"/>
<button label="非表示" label_selected="非表示" name="close_displayed_floater" tool_tip="現在表示されているフローターが存在する場合は、それを閉じます。"/>
- <button label="編集…" label_selected="編集…" name="edit_floater" tool_tip="選択したXMLファイルによって定義されたXUIフローターを編集します。(外部エディターを開きます)ローカライズされたバージョンが存在しない場合は、enバージョンを開きます。"/>
- <button label="保存" label_selected="保存" name="save_floater" tool_tip="選択したXMLファイルで定義されたXUIフロータを保存します。"/>
- <button label="全て保存" label_selected="全て保存" name="save_all_floaters" tool_tip="選択した言語で定義されたすべてのXUIフロータを保存します。"/>
+ <button label="編集…" label_selected="編集…" name="edit_floater" tool_tip="選択したXMLファイルによって定義されたXUIフローターを編集します。(外部エディターを開きます)ローカライズされたバージョンが存在しない場合は、enバージョンを開きます。"/>
+ <button label="保存" label_selected="保存" name="save_floater" tool_tip="選択したXMLファイルで定義されたXUIフロータを保存します。"/>
+ <button label="全て保存" label_selected="全て保存" name="save_all_floaters" tool_tip="選択した言語で定義されたすべてのXUIフロータを保存します。"/>
<button label="≫" label_selected="≪" name="toggle_overlap_panel" tool_tip="重なっている要素の強調表示と表示パネルを切り替えます。要素を右クリックして、この機能用に選択します。選択した要素は、赤い四角形でマークされます。"/>
<text name="select_language_label_2">
二次言語:
@@ -22,7 +22,7 @@
<combo_box name="language_select_combo_2">
<combo_box.item label="en" name="item1" value="en"/>
</combo_box>
- <button label="表示" name="display_floater_2" tool_tip="選択したXMLファイルで定義されたXUIフロータを表示します。"/>
+ <button label="表示" name="display_floater_2" tool_tip="選択したXMLファイルで定義されたXUIフロータを表示します。"/>
<button enabled="false" label="非表示" name="close_displayed_floater_2" tool_tip="現在表示されているフローターが存在する場合は、それを閉じます。"/>
<button label="スキーマをエクスポート" name="export_schema"/>
<check_box label="四角形を表示" name="show_rectangles"/>
@@ -35,8 +35,8 @@
<text name="editor_path_label">
エディタのパス:
</text>
- <line_editor name="executable_path_field" tool_tip="フローターXMLファイルを編集するためのエディター(実行可能ファイル)へのフルパス。(引用符は必要ありません)"/>
- <button follows="left|bottom" label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_executable" tool_tip="フローターXMLファイルを編集するためのエディター(実行可能ファイル)を参照します。"/>
+ <line_editor name="executable_path_field" tool_tip="フローターXMLファイルを編集するためのエディター(実行可能ファイル)へのフルパス。(引用符は必要ありません)"/>
+ <button follows="left|bottom" label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_executable" tool_tip="フローターXMLファイルを編集するためのエディター(実行可能ファイル)を参照します。"/>
<text name="executable_args_label">
エディタの引数:
</text>
@@ -46,7 +46,7 @@
<text name="diff_file_label">
差分ファイル:
</text>
- <line_editor name="vlt_diff_path_field" tool_tip="Viewer Localization Toolkitによって生成されたXMLのD0、D1言語差分ファイルへのフルパス"/>
+ <line_editor name="vlt_diff_path_field" tool_tip="Viewer Localization Toolkitによって生成されたXMLのD0、D1言語差分ファイルへのフルパス"/>
<button label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_vlt_diffs" tool_tip="VLTで生成されたD0、D1差分ファイルを参照して、変更されたファイルと要素を強調表示します。"/>
<button label="差分をハイライト" label_selected="ハイライトを解除" name="toggle_vlt_diff_highlight" tool_tip="変更された言語データを含むファイルと要素の強調表示を切り替えます。"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_url_entry.xml b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
index 3ff50854a5..534e0156c5 100644
--- a/indra/newview/skins/default/xui/ja/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="url_entry">
<text name="media_label">
- メディアURL:
+ メディアURL:
</text>
<combo_box name="media_entry"/>
<button label="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml
index be59547bf3..fd8e75da87 100644
--- a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="whitelist_entry" title="ホワイトリストの入力">
<text name="media_label">
- URLかURLパターンを入力して、許可するドメインをリストに追加します。
+ URLかURLパターンを入力して、許可するドメインをリストに追加します。
</text>
- <line_editor name="whitelist_entry" tool_tip="URLかURLパターンをホワイトリストに入力します。"/>
+ <line_editor name="whitelist_entry" tool_tip="URLかURLパターンをホワイトリストに入力します。"/>
<button label="OK" name="ok_btn"/>
<button label="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
index 284449d59d..87f469f91d 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
@@ -2,7 +2,7 @@
<context_menu name="Avatar Pie">
<menu_item_call label="プロフィールを見る" name="Profile..."/>
<menu_item_call label="フレンドに追加" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="IM" name="Send IM..."/>
<menu_item_call label="コール" name="Call"/>
<menu_item_call label="グループに招待…" name="Invite..."/>
<menu_item_separator/>
@@ -14,7 +14,7 @@
<menu_item_call label="フリーズ" name="Freeze..."/>
<menu_item_call label="追放" name="Eject..."/>
<menu_item_call label="テクスチャのデバッグ" name="Debug..."/>
- <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
+ <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="支払う" name="Pay..."/>
<menu_item_separator/>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
index a7989b35c8..0a022d16a1 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
@@ -2,7 +2,7 @@
<context_menu name="Avatar Pie">
<menu_item_call label="プロフィールを見る" name="Profile..."/>
<menu_item_call label="フレンドに追加" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="IM" name="Send IM..."/>
<menu_item_call label="コール" name="Call"/>
<menu_item_call label="グループへ招待" name="Invite..."/>
<menu_item_separator/>
@@ -14,7 +14,7 @@
<menu_item_call label="フリーズ" name="Freeze..."/>
<menu_item_call label="追放" name="Eject..."/>
<menu_item_call label="テクスチャのデバッグ" name="Debug..."/>
- <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
+ <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="支払う" name="Pay..."/>
<menu_item_separator/>
diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml
index 047f5d57cf..163feb5b56 100644
--- a/indra/newview/skins/default/xui/ja/menu_conversation.xml
+++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml
@@ -5,7 +5,7 @@
<menu_item_call label="ボイスチャットを切断する" name="disconnect_from_voice"/>
<menu_item_call label="選択した項目を閉じる" name="close_selected_conversations"/>
<menu_item_call label="プロフィールを表示" name="view_profile"/>
- <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="IM" name="im"/>
<menu_item_call label="テレポートのオファー" name="offer_teleport"/>
<menu_item_call label="ボイスコール" name="voice_call"/>
<menu_item_call label="チャットの履歴…" name="chat_history"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml
index 78c46d13b4..438b0c304b 100644
--- a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Conversation Context Menu">
- <menu_item_call label="IM…" name="IM"/>
+ <menu_item_call label="IM..." name="IM"/>
<menu_item_call label="ボイスコール…" name="Call"/>
<menu_item_call label="チャットの履歴を開く…" name="Chat history"/>
<menu_item_call label="プロフィールを表示" name="View Profile"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml
index bcda112d2f..2012eb88cc 100644
--- a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml
@@ -3,5 +3,5 @@
<menu_item_check label="名前で並べ替え" name="sort_by_name"/>
<menu_item_check label="日付で並べ替え" name="sort_by_date"/>
<menu_item_check label="上位のフレンドを並べ替え" name="sort_by_friends"/>
- <menu_item_call label="近隣チャットの履歴を表示…" name="view_nearby_chat_history"/>
+ <menu_item_call label="チャット履歴を表示…" name="view_nearby_chat_history"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml
index e1f24cdb39..3a8fd36ceb 100644
--- a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml
@@ -4,7 +4,7 @@
<menu_item_call label="名前変更" name="rename"/>
<menu_item_call label="コピー" name="copy_gesture"/>
<menu_item_call label="ペースト" name="paste"/>
- <menu_item_call label="UUIDをコピー" name="copy_uuid"/>
+ <menu_item_call label="UUIDをコピー" name="copy_uuid"/>
<menu_item_call label="現在のアウトフィットに保存" name="save_to_outfit"/>
<menu_item_call label="編集" name="edit_gesture"/>
<menu_item_call label="調べる" name="inspect"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index c7cba4845d..d602823fe4 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -82,7 +82,7 @@
<menu_item_call label="オリジナルを開く" name="Open Original"/>
<menu_item_call label="プロパティ" name="Properties"/>
<menu_item_call label="名前を変更" name="Rename"/>
- <menu_item_call label="アセットのUUIDをコピー" name="Copy Asset UUID"/>
+ <menu_item_call label="アセットのUUIDをコピー" name="Copy Asset UUID"/>
<menu_item_call label="メインパネルで表示" name="Show in Main Panel"/>
<menu_item_call label="カット" name="Cut"/>
<menu_item_call label="コピー" name="Copy"/>
@@ -113,7 +113,7 @@
<menu_item_separator name="Wearable And Object Separator"/>
<menu_item_call label="装着" name="Wearable And Object Wear"/>
<menu label="装着先" name="Attach To"/>
- <menu label="HUD 装着先" name="Attach To HUD"/>
+ <menu label="HUDの装着先" name="Attach To HUD"/>
<menu_item_call label="触る" name="Attachment Touch"/>
<menu_item_call label="編集" name="Wearable Edit"/>
<menu_item_call label="追加" name="Wearable Add"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml
index ebce5f7e6b..5756e3f8b5 100644
--- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml
@@ -4,7 +4,7 @@
<menu_item_check label="最近の発言者で並べ替え" name="SortByRecentSpeakers"/>
<menu_item_call label="プロフィールの表示" name="View Profile"/>
<menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="IM" name="IM"/>
<menu_item_call label="コール" name="Call"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="支払う" name="Pay"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
index bbe842a37e..13c940abf4 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Avatar Context Menu">
<menu_item_call label="プロフィールを表示" name="view_profile"/>
- <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="IM" name="im"/>
<menu_item_call label="テレポートを送る" name="offer_teleport"/>
<menu_item_call label="ボイスコール" name="voice_call"/>
<menu_item_call label="チャットの履歴を表示…" name="chat_history"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
index 4e3dbd3279..e8b8f0f694 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
@@ -2,7 +2,7 @@
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="フレンド登録" name="add_friends"/>
<menu_item_call label="フレンドを削除" name="remove_friends"/>
- <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="IM" name="im"/>
<menu_item_call label="コール" name="call"/>
<menu_item_call label="共有" name="share"/>
<menu_item_call label="支払い" name="pay"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_profile_other.xml b/indra/newview/skins/default/xui/ja/menu_profile_other.xml
index 0247a60803..9803735afc 100644
--- a/indra/newview/skins/default/xui/ja/menu_profile_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_profile_other.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Avatar Profile Menu">
- <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="IM" name="im"/>
<menu_item_call label="テレポートのオファー" name="offer_teleport"/>
<menu_item_call label="テレポートのリクエスト" name="request_teleport"/>
<menu_item_call label="ボイスコール" name="voice_call"/>
@@ -19,5 +19,5 @@
<menu_item_separator name="separator_copy_options"/>
<menu_item_call label="表示名をコピー" name="copy_display_name"/>
<menu_item_call label="エージェント名をコピー" name="copy_name"/>
- <menu_item_call label="エージェントIDをコピー" name="copy_id"/>
+ <menu_item_call label="エージェントIDをコピー" name="copy_id"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_profile_self.xml b/indra/newview/skins/default/xui/ja/menu_profile_self.xml
index 7c9570378e..f39593e417 100644
--- a/indra/newview/skins/default/xui/ja/menu_profile_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_profile_self.xml
@@ -8,5 +8,5 @@
<menu_item_separator name="separator_copy_options"/>
<menu_item_call label="表示名をコピー" name="copy_display_name"/>
<menu_item_call label="エージェント名をコピー" name="copy_name"/>
- <menu_item_call label="エージェントIDをコピー" name="copy_id"/>
+ <menu_item_call label="エージェントIDをコピー" name="copy_id"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml
index a8ff0d3721..3f5d30073b 100644
--- a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml
@@ -6,5 +6,5 @@
<menu_item_call label="リージョン(地域)に適用" name="Settings Apply Region"/>
<menu_item_call label="コピー" name="copy_settings"/>
<menu_item_call label="ペースト" name="paste_settings"/>
- <menu_item_call label="UUIDをコピー" name="copy_uuid"/>
+ <menu_item_call label="UUIDをコピー" name="copy_uuid"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml
index 820cc3cd53..e68128e429 100644
--- a/indra/newview/skins/default/xui/ja/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="URLについて" name="about_url"/>
- <menu_item_call label="URLにテレポートする" name="teleport_to_url"/>
+ <menu_item_call label="URLについて" name="about_url"/>
+ <menu_item_call label="URLにテレポートする" name="teleport_to_url"/>
<menu_item_call label="マップ" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
index 9ce9a070f2..d06f4896b2 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="プロフィールを表示" name="show_agent"/>
- <menu_item_call label="IMを送信…" name="send_im"/>
+ <menu_item_call label="IMを送信…" name="send_im"/>
<menu_item_call label="フレンドを追加…" name="add_friend"/>
<menu_item_call label="フレンドを削除…" name="remove_friend"/>
<menu_item_call label="嫌がらせの報告" name="report_abuse"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml
index ae97e8bd8d..c3da8a8686 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_http.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml
@@ -3,5 +3,5 @@
<menu_item_call label="Web ページを開く" name="url_open"/>
<menu_item_call label="内蔵ブラウザで開く" name="url_open_internal"/>
<menu_item_call label="外部ブラウザで開く" name="url_open_external"/>
- <menu_item_call label="URLをクリップボードにコピー" name="url_copy"/>
+ <menu_item_call label="URLをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index f6b10bb121..41df8fdbb1 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -17,7 +17,7 @@
<menu_item_call label="アカウントのダッシュボード…" name="Manage My Account"/>
<menu_item_call label="[Membership]" name="Membership"/>
<menu_item_separator/>
- <menu_item_call label="初期設定…" name="Preferences"/>
+ <menu_item_call label="環境設定…" name="Preferences"/>
<menu_item_call label="ツールバーのボタン…" name="Toolbars"/>
<menu_item_call label="全てのコントロールを隠す" name="Hide UI" shortcut="control|shift|U"/>
<menu_item_check label="HUDを表示" name="Show HUD Attachments" shortcut="alt|shift|H"/>
@@ -47,7 +47,7 @@
<menu_item_separator/>
<menu_item_call label="すべての服装" name="All Clothes"/>
</menu>
- <menu label="HUD" name="Avatar Detach HUD"/>
+ <menu label="HUD" name="Avatar Detach HUD"/>
<menu label="取り外す" name="Avatar Detach"/>
<menu_item_call label="全てを取り外す" name="Detach All"/>
</menu>
@@ -70,7 +70,7 @@
</menu>
<menu label="コミュニケーション" name="Communicate">
<menu_item_check label="会話…" name="Conversations"/>
- <menu_item_check label="近隣のチャット…" name="Nearby Chat"/>
+ <menu_item_check label="周辺チャット…" name="Nearby Chat"/>
<menu_item_check label="ボイスチャット" name="Speak"/>
<menu_item_check name="Conversation Log..." label="会話ログ…"/>
<menu_item_separator/>
@@ -95,7 +95,7 @@
<menu_item_call label="現在地をホームに設定" name="Set Home to Here"/>
<menu_item_separator/>
<menu_item_call label="スナップショット" name="Take Snapshot"/>
- <menu_item_call label="360度スナップショット" name="Capture 360"/>
+ <menu_item_call label="360度スナップショット" name="Capture 360"/>
<menu_item_separator/>
<menu_item_call label="場所のプロフィール" name="Place Profile"/>
<menu_item_call label="土地情報" name="About Land"/>
@@ -112,14 +112,14 @@
<menu_item_check label="座標" name="Coordinates"/>
<menu_item_check label="区画のプロパティ" name="Parcel Properties"/>
<menu_item_separator/>
- <menu_item_check label="拡張メニュー" name="Show Advanced Menu"/>
+ <menu_item_check label="アドバンスメニュー" name="Show Advanced Menu"/>
</menu>
<menu_item_check label="グラフィック性能の最適化…" name="Performance"/>
<menu_item_separator/>
<menu label="環境" name="Environment">
- <menu_item_check label="夜明け" name="Sunrise"/>
+ <menu_item_check label="日の出" name="Sunrise"/>
<menu_item_check label="正午" name="Noon"/>
- <menu_item_check label="夕方" name="Sunset"/>
+ <menu_item_check label="日没" name="Sunset"/>
<menu_item_check label="深夜" name="Midnight"/>
<menu_item_check label="共有された環境を使用" name="Use Shared Environment"/>
<menu_item_separator/>
@@ -188,7 +188,7 @@
<menu_item_check label="選択ビームを表示する" name="Show Selection Beam"/>
<menu_item_separator/>
<menu_item_check label="グリッド吸着" name="Snap to Grid"/>
- <menu_item_call label="オブジェクトのXY軸をグリッドに吸着" name="Snap Object XY to Grid"/>
+ <menu_item_call label="オブジェクトのXY軸をグリッドに吸着" name="Snap Object XY to Grid"/>
<menu_item_call label="選択をグリッドに使用する" name="Use Selection for Grid"/>
<menu_item_separator/>
<menu_item_call label="グリッドオプション…" name="Grid Options"/>
@@ -221,9 +221,9 @@
<menu_item_call label="衝突・プッシュ&打撃" name="Bumps, Pushes &amp;amp; Hits"/>
<menu_item_call label="[APP_NAME]について" name="About Second Life"/>
</menu>
- <menu label="拡張" name="Advanced">
+ <menu label="アドバンス" name="Advanced">
<menu_item_call label="テクスチャをリベークする" name="Rebake Texture"/>
- <menu_item_call label="UIサイズをデフォルトにする" name="Set UI Size to Default"/>
+ <menu_item_call label="UIサイズをデフォルトにする" name="Set UI Size to Default"/>
<menu_item_call label="ウィンドウサイズ設定…" name="Set Window Size..."/>
<menu_item_separator/>
<menu_item_check label="オブジェクトの選択距離の制限" name="Limit Select Distance"/>
@@ -233,7 +233,7 @@
<menu_item_check label="スナップショットをディスクに保存" name="QuietSnapshotsToDisk"/>
<menu_item_separator/>
<menu label="パフォーマンスツール" name="Performance Tools">
- <menu_item_call label="遅延メーター" name="Lag Meter"/>
+ <menu_item_call label="ラグメーター" name="Lag Meter"/>
<menu_item_check label="統計バー" name="Statistics Bar"/>
<menu_item_call label="シーン負荷の統計情報" name="Scene Load Statistics"/>
<menu_item_check label="アバターの複雑度を表示" name="Avatar Draw Info"/>
@@ -262,7 +262,7 @@
<menu_item_check label="衝突" name="Rendering Type Bump"/>
</menu>
<menu label="レンダリング機能" name="Rendering Features">
- <menu_item_check label="UI" name="ToggleUI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="選択済" name="Selected"/>
<menu_item_check label="ハイライト" name="Highlighted"/>
<menu_item_check label="動的テクスチャ" name="Dynamic Textures"/>
@@ -313,7 +313,7 @@
<menu_item_separator/>
<menu_item_check label="カメラ" name="Camera"/>
<menu_item_check label="風" name="Wind"/>
- <menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="FOV" name="FOV"/>
<menu_item_check label="バッジ" name="Badge"/>
</menu>
<menu label="情報を表示" name="Display Info">
@@ -352,7 +352,7 @@
</menu>
<menu label="メタデータの描画" name="Render Metadata">
<menu_item_check label="バウンディングボックス" name="Bounding Boxes"/>
- <menu_item_check label="普通" name="Normals"/>
+ <menu_item_check label="法線" name="Normals"/>
<menu_item_check label="八分木" name="Octree"/>
<menu_item_check label="シャドウ円錐" name="Shadow Frusta"/>
<menu_item_check label="実像" name="Physics Shapes"/>
@@ -363,7 +363,7 @@
<menu_item_check label="テクスチャ優先度" name="Texture Priority"/>
<menu_item_check label="テクスチャの範囲" name="Texture Area"/>
<menu_item_check label="側面" name="Face Area"/>
- <menu_item_check label="LOD情報" name="LOD Info"/>
+ <menu_item_check label="LOD情報" name="LOD Info"/>
<menu_item_check label="三角形の数" name="Triangle Count"/>
<menu_item_check label="制作・キュー" name="Build Queue"/>
<menu_item_check label="光" name="Lights"/>
@@ -372,7 +372,7 @@
<menu_item_check label="ジョイント" name="Joints"/>
<menu_item_check label="レイキャスト" name="Raycast"/>
<menu_item_check label="風のベクトル" name="Wind Vectors"/>
- <menu_item_check label="彫刻" name="Sculpt"/>
+ <menu_item_check label="スカルプト" name="Sculpt"/>
<menu label="テクスチャの密度" name="Texture Density">
<menu_item_check label="無し" name="None"/>
<menu_item_check label="原行" name="Current"/>
@@ -389,10 +389,10 @@
<menu_item_check label="オブジェクト間のオクルージョン" name="Object-Object Occlusion"/>
<menu_item_separator/>
<menu_item_check label="高度な光源モデル" name="Advanced Lighting Model"/>
- <menu_item_check label=" 太陽・月・プロジェクタからの影" name="Shadows from Sun/Moon/Projectors"/>
- <menu_item_check label=" SSAOと影のスムージング" name="SSAO and Shadow Smoothing"/>
+ <menu_item_check label=" 太陽・月・プロジェクタからの影" name="Shadows from Sun/Moon/Projectors"/>
+ <menu_item_check label=" SSAOと影のスムージング" name="SSAO and Shadow Smoothing"/>
<menu_item_separator/>
- <menu_item_check label="次回起動時にGLをデバッグ" name="Debug GL"/>
+ <menu_item_check label="次回起動時にGLのデバッグを開始" name="Debug GL"/>
<menu_item_check label="パイプラインをデバッグ" name="Debug Pipeline"/>
<menu_item_check label="自動アルファマスク(遅延)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="自動アルファマスク(遅延なし)" name="Automatic Alpha Masks (non-deferred)"/>
@@ -439,7 +439,7 @@
<menu_item_call label="リージョンオブジェクトのキャッシュをダンプ" name="Dump Region Object Cache"/>
<menu_item_call label="関心リスト:フルアップデート" name="Interest List: Full Update"/>
</menu>
- <menu label="UI" name="UI">
+ <menu label="UI" name="UI">
<menu_item_call label="メディアブラウザ" name="Media Browser"/>
<menu_item_call label="インベントリの出力" name="Dump Inventory"/>
<menu_item_call label="タイマーをダンプ" name="Dump Timers"/>
@@ -455,15 +455,15 @@
<menu_item_check label="デバッグキー" name="Debug Keys"/>
<menu_item_check label="WindowProcのデバッグ" name="Debug WindowProc"/>
</menu>
- <menu label="XUI" name="XUI">
+ <menu label="XUI" name="XUI">
<menu_item_call label="色の設定をリロード" name="Reload Color Settings"/>
<menu_item_call label="フォントテストを表示" name="Show Font Test"/>
- <menu_item_check label="XUI名を表示" name="Show XUI Names"/>
- <menu_item_call label="テストIMを送信する" name="Send Test IMs"/>
+ <menu_item_check label="XUI名を表示" name="Show XUI Names"/>
+ <menu_item_call label="テストIMを送信する" name="Send Test IMs"/>
<menu_item_call label="名前キャッシュをフラッシュ" name="Flush Names Caches"/>
</menu>
- <menu label="アバター" name="Character">
- <menu label="ベークドテクスチャを取得する" name="Grab Baked Texture">
+ <menu label="キャラクター" name="Character">
+ <menu label="ベイク済みテクスチャを取得する" name="Grab Baked Texture">
<menu_item_call label="瞳" name="Grab Iris"/>
<menu_item_call label="頭" name="Grab Head"/>
<menu_item_call label="上半身" name="Grab Upper Body"/>
@@ -488,7 +488,7 @@
<menu_item_check label="見ているものを表示する" name="Show Look At"/>
<menu_item_check label="クリックした場所を表示する" name="Show Point At"/>
<menu_item_check label="結合部のアップデートのデバッグ" name="Debug Joint Updates"/>
- <menu_item_check label="LODを無効にする" name="Disable LOD"/>
+ <menu_item_check label="LODを無効にする" name="Disable LOD"/>
<menu_item_check label="キャラクターVisのデバッグ" name="Debug Character Vis"/>
<menu_item_check label="スケルトンの衝突判定を表示する" name="Show Collision Skeleton"/>
<menu_item_check label="ボーンを表示" name="Show Bones"/>
@@ -499,7 +499,7 @@
<menu_item_call label="ローカルテクスチャをダンプ" name="Dump Local Textures"/>
</menu>
<menu_item_separator/>
- <menu_item_check label="HTTPテスクチャ" name="HTTP Textures"/>
+ <menu_item_check label="HTTPテスクチャ" name="HTTP Textures"/>
<menu_item_call label="圧縮画像" name="Compress Images"/>
<menu_item_call label="圧縮ファイルテスト" name="Compress File Test"/>
<menu_item_call label="Visual Leak Detectorを有効にする" name="Enable Visual Leak Detector"/>
@@ -517,14 +517,14 @@
<menu_item_call label="管理者ステータス解除" name="Leave Admin Options"/>
<menu_item_check label="管理者メニューを表示する" name="View Admin Options"/>
</menu>
- <menu label="管理" name="Admin">
+ <menu label="管理者" name="Admin">
<menu label="オブジェクト" name="AdminObject">
<menu_item_call label="コピーを取る" name="Admin Take Copy"/>
<menu_item_call label="自分を所有者にする" name="Force Owner To Me"/>
<menu_item_call label="所有者権限の実行" name="Force Owner Permissive"/>
<menu_item_call label="削除" name="Delete"/>
<menu_item_call label="ロック" name="Lock"/>
- <menu_item_call label="アセットのIDを取得" name="Get Assets IDs"/>
+ <menu_item_call label="アセットのIDを取得" name="Get Assets IDs"/>
</menu>
<menu label="区画" name="Parcel">
<menu_item_call label="自分を所有者にする" name="Owner To Me"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml
index 213a554bbd..2c13d50226 100644
--- a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml
@@ -6,8 +6,8 @@
<menu_item_call label="触る" name="touch"/>
<menu_item_call label="脱ぐ" name="take_off_or_detach"/>
<menu_item_call label="取り外す" name="detach"/>
- <context_menu label="装着:" name="wearable_attach_to"/>
- <context_menu label="HUDに装着" name="wearable_attach_to_hud"/>
+ <context_menu label="装着" name="wearable_attach_to"/>
+ <context_menu label="HUDに装着" name="wearable_attach_to_hud"/>
<menu_item_call label="取り外す" name="take_off"/>
<menu_item_call label="編集" name="edit"/>
<menu_item_call label="アイテムのプロフィール" name="object_profile"/>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 123e95df04..9ec7a0de98 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -451,7 +451,7 @@ L$が不足しているので、このグループに参加することができ
</notification>
<notification name="CreateGroupCost">このグループ作成にかかる費用:L$ [COST]
一人ではグループにならないので、永久に削除されてしまいます。
-48時間以内にメンバーを勧誘し、入会してもらってください。
+48時間以内にメンバーを勧誘し、入会してもらってください。
<tag>
group
</tag>
@@ -1260,7 +1260,7 @@ L$が不足しているので、このグループに参加することができ
fail
</tag>
</notification>
- <notification name="SoundFileInvalidTooLong">オーディオファイルが長すぎます。(最大10秒):
+ <notification name="SoundFileInvalidTooLong">オーディオファイルが長すぎます。(最大30秒):
[FILE]
<tag>
fail
@@ -1411,7 +1411,7 @@ L$が不足しているので、このグループに参加することができ
fail
</tag>
</notification>
- <notification name="invalid_tport">テレポートの試行は1分間に6回までと制限されています。1分待ってからもう一度テレポートしてみてください。問題が解決しない場合は、ログインし直してください。
+ <notification name="invalid_tport">テレポートの試行は1分間に6回までと制限されています。1分待ってからもう一度テレポートしてみてください。問題が解決しない場合は、ログインし直してください。
<tag>
fail
</tag>
@@ -1735,7 +1735,7 @@ L$が不足しているので、このグループに参加することができ
</tag>
</notification>
<notification name="YouHaveBeenLoggedOut">しまった、[SECOND_LIFE]からログアウトされてしまいました。[MESSAGE]
- <usetemplate name="okcancelbuttons" notext="終了" yestext="IMでチャット"/>
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="IM &amp; チャットを見る"/>
</notification>
<notification name="InventoryUnusable">インベントリの読み込み中に問題が発生しました。まず、ログアウトして再度ログインし直してみてください。
このメッセージが再度表示される場合は、サポートに連絡して問題を解決してください。
@@ -2126,7 +2126,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
HUDComplexityWarning
</context>
</unique>
- <usetemplate ignoretext="HUDが複雑すぎる場合の警告" name="notifyignore"/>
+ <usetemplate ignoretext="HUDが複雑すぎる場合の警告" name="notifyignore"/>
</notification>
<notification name="FirstRun">[APP_NAME]のインストールが完了しました。
[SECOND_LIFE]を使ったことがない場合は、ログインする前にアカウントの作成を行ってください。
@@ -2162,7 +2162,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
</form>
</notification>
<notification name="WelcomeChooseSex">まもなく、あなたのアバターが表示されます。矢印キーを使用して歩きます。
-ヘルプが必要なときや、[SECOND_LIFE]について知りたいときは、F1キーを押してください。
+ヘルプが必要なときや、[SECOND_LIFE]について知りたいときは、F1キーを押してください。
男性あるいは女性のアバターを選択してください。この設定は後で変更できます。
<tag>
confirm
@@ -2189,8 +2189,8 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
発行元:[ISSUER_NAME_STRING]
有効日:[VALID_FROM]
次の更新日:[VALID_TO]
-MD5フィンガープリント:[SHA1_DIGEST]
-SHA1フィンガープリント:[MD5_DIGEST]
+MD5フィンガープリント:[SHA1_DIGEST]
+SHA1フィンガープリント:[MD5_DIGEST]
キー使用法:[KEYUSAGE]
拡張キー使用法:[EXTENDEDKEYUSAGE]
サブジェクトキー認識別子:[SUBJECTKEYIDENTIFIER]
@@ -2201,15 +2201,15 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
</notification>
<notification name="TrustCertificateError">このサーバーの認証機関は不明です。
認証情報:
- サブジェクト名:[SUBJECT_NAME_STRING]
- 発行元:[ISSUER_NAME_STRING]
- 有効日:[VALID_FROM]
- 次の更新日:[VALID_TO]
- MD5フィンガープリント:[SHA1_DIGEST]
- SHA1フィンガープリント:[MD5_DIGEST]
- キー使用法:[KEYUSAGE]
- 拡張キー使用法:[EXTENDEDKEYUSAGE]
- サブジェクトキー認識別子:[SUBJECTKEYIDENTIFIER]
+サブジェクト名:[SUBJECT_NAME_STRING]
+発行元:[ISSUER_NAME_STRING]
+有効日:[VALID_FROM]
+次の更新日:[VALID_TO]
+MD5フィンガープリント:[SHA1_DIGEST]
+SHA1フィンガープリント:[MD5_DIGEST]
+キー使用法:[KEYUSAGE]
+拡張キー使用法:[EXTENDEDKEYUSAGE]
+サブジェクトキー認識別子:[SUBJECTKEYIDENTIFIER]
この認証局を信頼しますか?
<tag>
@@ -2232,7 +2232,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
[NAME]は、オブジェクトを編集する権限を取り消されました。
</notification>
<notification name="FlushMapVisibilityCaches">このリージョンのマップのキャッシュを消去します。デバッグ目的のみに便利な操作です。
-(作成中は5分経過すると、全員のマップが再度ログイン後に更新されます)
+(作成中は5分経過すると、全員のマップが再度ログイン後に更新されます)
<tag>
fail
</tag>
@@ -2281,7 +2281,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
テクスチャは、24ビットの512✕512以下の画像を選択し、「適用」ボタンを再度クリックしてください。
</notification>
<notification name="RawUploadStarted">
- アップロードを開始しました。接続速度によっては、最大2分程度かかります。
+ アップロードを開始しました。接続速度によっては、最大2分程度かかります。
</notification>
<notification name="ConfirmBakeTerrain">現在の地形を構築しようとしています。この操作を行うと現在の地形が、土地の隆起と沈降の制限範囲の基準となり、「復元」ツールのデフォルトになります。操作を続行しますか?
<tag>
@@ -2606,7 +2606,7 @@ OKをクリックして、ダウンロードとインストールを開始しま
</tag>
<form name="form">
<input name="message">
- あなたはフリーズされています。動くこともチャットすることもできません。管理者がIMであなたに連絡します。
+ あなたはフリーズされています。動くこともチャットすることもできません。管理者がIMであなたに連絡します。
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="キャンセル"/>
@@ -3150,19 +3150,19 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83
fail
</tag>
</notification>
- <notification name="UnableToLoadNotecardAsset">現在ノートカードのアセットIDを読み込むことができません。
+ <notification name="UnableToLoadNotecardAsset">現在ノートカードのアセットIDを読み込むことができません。
<tag>
fail
</tag>
<usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NotAllowedToViewNotecard">要求したアセットIDに関するノートカードを閲覧するには、権限が不十分です。
+ <notification name="NotAllowedToViewNotecard">要求したアセットIDに関するノートカードを閲覧するには、権限が不十分です。
<tag>
fail
</tag>
<usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="MissingNotecardAssetID">ノートカード用のアセットIDがデータベースに登録されていません。
+ <notification name="MissingNotecardAssetID">ノートカード用のアセットIDがデータベースに登録されていません。
<tag>
fail
</tag>
@@ -3189,7 +3189,7 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83
</tag>
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification label="再起動を確認" name="ConfirmRestart">このリージョンを2分後に再起動しようとしています。このまま続けてもよろしいですか?
+ <notification label="再起動を確認" name="ConfirmRestart">このリージョンを2分後に再起動しようとしています。このまま続けてもよろしいですか?
<tag>
confirm
</tag>
@@ -3489,7 +3489,7 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83
⑴嫌がらせの報告の手順。居住者が、[SECOND_LIFE]権限システムを悪用していると思われる場合(たとえば、CopyBotまたは同様のコピーツールを使用して、知的財産権を侵害していると思われる場合)は、不正使用報告を提出することができます。不正行為チームは、[SECOND_LIFE][http://secondlife.com/corporate/tos.php 利用規約]や、[http://jp.secondlife.com/corporate/cs.php コミュニティ・スタンダード]に違反する行為を調査し、に違反する行為に対する適切な処罰を下します。ただし、担当チームは[SECOND_LIFE]の世界からコンテンツを削除して欲しいというリクエストには応じません。
-⑵DMCA またはコンテンツ削除プロセス。[SECOND_LIFE]からコンテンツの削除をリクエストするには、[https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy DCMAポリシー]に規定されている有効な権利侵害通知を提出する必要があります。
+⑵DMCA またはコンテンツ削除プロセス。[SECOND_LIFE]からコンテンツの削除をリクエストするには、[https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy DMCAポリシー]に規定されている有効な権利侵害通知を提出する必要があります。
このまま嫌がらせの報告を続けたい場合は、このウィンドウを閉じて報告の送信を完了してください。特定のカテゴリ「コピー Bot 及び権限の悪用」を選択する必要がある場合があります。
@@ -3578,7 +3578,7 @@ Linden Lab
</tag>
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
</notification>
- <notification name="ConfirmClearMediaUrlList">保存されたURLのリストを消去します。このまま、リストを消去してもよろしいですか?
+ <notification name="ConfirmClearMediaUrlList">保存されたURLのリストを消去します。このまま、リストを消去してもよろしいですか?
<tag>
confirm
</tag>
@@ -3669,10 +3669,10 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
<notification name="AutoWearNewClothing">作成する服装を自動的に装着しますか?
<usetemplate ignoretext="「容姿」を編集中に、作成する服装を装着するとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="NotAgeVerified">訪問しようとしている場所は、18歳以上の住人に制限されています。
+ <notification name="NotAgeVerified">訪問しようとしている場所は、18歳以上の住人に制限されています。
<usetemplate ignoretext="年齢制限付きのエリアを訪問する年齢に達していません。" name="okignore" yestext="OK"/>
</notification>
- <notification name="NotAgeVerified_Notify">この場所への入場は、18歳以上に制限されています。
+ <notification name="NotAgeVerified_Notify">この場所への入場は、18歳以上に制限されています。
<tag>
fail
</tag>
@@ -3708,7 +3708,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
<notification name="ReplacedMissingWearable">
欠落している服装や身体部位をデフォルトに置き換えます。
</notification>
- <notification name="GroupNotice">件名:[SUBJECT] メッセージ:[MESSAGE]
+ <notification name="GroupNotice">件名:[SUBJECT] メッセージ:[MESSAGE]
<tag>
group
</tag>
@@ -3726,7 +3726,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
</notification>
<notification name="UploadingAuctionSnapshot">
インワールドとWebサイトのスナップショットをアップロード中です…
-(所要時間:約5分)
+(所要時間:約5分)
</notification>
<notification name="UploadPayment">アップロードにL$ [AMOUNT]支払いました。
<tag>
@@ -3774,7 +3774,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
</tag>
</notification>
<notification name="IMAcrossParentEstates">
- 親不動産間では、IMを送信できません。
+ 親不動産間では、IMを送信できません。
</notification>
<notification name="TransferInventoryAcrossParentEstates">
親不動産間でインベントリを移動することはできません。
@@ -3855,7 +3855,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
[NAME]は、インベントリの提供を断りました。
</notification>
<notification name="ObjectMessage">
- [NAME]:[MESSAGE]
+ [NAME]: [MESSAGE]
</notification>
<notification name="CallingCardAccepted">
コーリングカードが受理されました。
@@ -3870,7 +3870,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
(この操作は、ランドマークをダブルクリックするか、右クリックして「テレポート」を選択して実行することもできます。)
</notification>
<notification name="TeleportToPerson">
- 誰かとのプライベートな会話を開くには、相手のアバターをクリックして、メニューから「IM」を選択します。
+ 誰かとのプライベートな会話を開くには、相手のアバターをクリックして、メニューから「IM」を選択します。
</notification>
<notification name="CantSelectLandFromMultipleRegions">サーバーの境界を越えて土地を選択することできません。
もっと小さな土地を選択してください。
@@ -4000,14 +4000,14 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
<unique/>
<usetemplate name="okbutton" yestext="リージョンの再構築"/>
</notification>
- <notification name="DynamicPathfindingDisabled">このリージョン(地域)において、動的経路探索が有効になっていません。経路探索LSL呼び出しを使用するスクリプトの入ったオブジェクトは、このリージョンで期待どおりに動作しない可能性があります。
+ <notification name="DynamicPathfindingDisabled">このリージョン(地域)において、動的経路探索が有効になっていません。経路探索LSL呼び出しを使用するスクリプトの入ったオブジェクトは、このリージョンで期待どおりに動作しない可能性があります。
<unique/>
</notification>
<notification name="PathfindingCannotRebakeNavmesh">エラーが発生しました。ネットワークまたはサーバーに問題があるか、制作する権限がない可能性があります。この問題は、一度ログアウトしてから、ログインし直すと解決される場合があります。
<unique/>
<usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="SeeAvatars">この区画にいるアバターやこの区画内で行われる文字チャットは、他の区画から見えません。あなたには、この区画外にいる住人が見えず、外の住人にはあなたの姿が見えません。チャンネル0での通常の文字チャットもブロックされます。
+ <notification name="SeeAvatars">この区画にいるアバターやこの区画内で行われる文字チャットは、他の区画から見えません。あなたには、この区画外にいる住人が見えず、外の住人にはあなたの姿が見えません。チャンネル0での通常の文字チャットもブロックされます。
<unique/>
</notification>
<notification name="ScriptsStopped">
@@ -4048,12 +4048,12 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
fail
</tag>
</notification>
- <notification name="MustGetAgeRegion">このリージョン(地域)に入るには、18歳以上である必要があります。
+ <notification name="MustGetAgeRegion">このリージョン(地域)に入るには、18歳以上である必要があります。
<tag>
fail
</tag>
</notification>
- <notification name="MustGetAgeParcel">この区画に入るには、18歳以上である必要があります。
+ <notification name="MustGetAgeParcel">この区画に入るには、18歳以上である必要があります。
<tag>
fail
</tag>
@@ -4296,7 +4296,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
</tag>
</notification>
<notification name="OfferCallingCard">[NAME]が、コーリングカードを渡そうとしています。
-あなたのインベントリにブックマークが追加され、この住人に素早くIMを送ることができます。
+あなたのインベントリにブックマークが追加され、この住人に素早くIMを送ることができます。
<tag>
friendship
</tag>
@@ -4317,7 +4317,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
[MESSAGE]
-送信元のオブジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt; 所有者:[NAME_SLURL]
+送信元のオブジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt; 所有者:[NAME_SLURL]
<tag>
confirm
</tag>
@@ -4457,7 +4457,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
</notification>
<notification name="BuyLindenDollarSuccess">お支払ありがとうございます。
-あなたのL$残高は、処理が完了するとアップデートされます。処理に20分以上かかった場合、お取り引きがキャンセルされることがあります。その場合は、購入金額はあなたの US$残高に追加されます。 [https://secondlife.com/my/account/?lang=ja-JP マイアカウント]の取引履歴ページで、支払状況を確認できます。
+あなたのL$残高は、処理が完了するとアップデートされます。処理に20分以上かかった場合、お取り引きがキャンセルされることがあります。その場合は、購入金額はあなたの US$残高に追加されます。 [https://secondlife.com/my/account/?lang=ja-JP マイアカウント]の取引履歴ページで、支払状況を確認できます。
<tag>
funds
</tag>
@@ -4745,11 +4745,11 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ
<button name="respondbutton" text="返答"/>
</form>
</notification>
- <notification name="ConfirmCloseAll">すべてのIMを閉じますか?
+ <notification name="ConfirmCloseAll">すべてのIMを閉じますか?
<tag>
confirm
</tag>
- <usetemplate ignoretext="すべてのIMを閉じる前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="すべてのIMを閉じる前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="AttachmentSaved">
装着物が保存されました。
@@ -5075,7 +5075,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000
メモリプール残量が少なくなっています。クラッシュを避けるため[APP_NAME]の機能の一部は無効になりました。他のアプリケーションを終了し、状況が継続または再発する場合にはSecond Lifeを再起動してください。
</notification>
<notification name="ForceQuitDueToLowMemory">
- メモリ不足のため30秒以内に[APP_NAME]は終了します。
+ メモリ不足のため30秒以内に[APP_NAME]は終了します。
</notification>
<notification name="SOCKS_NOT_PERMITTED">ルールセットによって許可されていないため、SOCKS 5プロキシ"[HOST]:[PORT]"が接続を拒絶しました。
<tag>
@@ -5275,7 +5275,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000
<tag>
confirm
</tag>
- <usetemplate ignoretext="UIを非表示前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="UIを非表示前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="PathfindingLinksets_WarnOnPhantom">選択された一部のリンクセットはファントムフラグが切り替えられます。
@@ -6220,7 +6220,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000
fail
</tag>
</notification>
- <notification name="TenObjectsDisabledPlzRefresh">選択された最初の10個のオブジェクトのみが無効にされました。必要に応じて、リフレッシュして選択内容を追加してください。
+ <notification name="TenObjectsDisabledPlzRefresh">選択された最初の10個のオブジェクトのみが無効にされました。必要に応じて、リフレッシュして選択内容を追加してください。
<tag>
fail
</tag>
@@ -6638,9 +6638,9 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000
fail
</tag>
</notification>
- <notification name="CompressionTestResults">サイズ[SIZE]㎅のファイル[FILE]をgzipのレベル6で圧縮したテスト結果:
-圧縮:[PACK_TIME]秒 [PSIZE]㎅
-解凍:[UNPACK_TIME]秒 [USIZE]㎅
+ <notification name="CompressionTestResults">サイズ[SIZE]㎅のファイル[FILE]をgzipのレベル6で圧縮したテスト結果:
+圧縮:[PACK_TIME]秒 [PSIZE]㎅
+解凍:[UNPACK_TIME]秒 [USIZE]㎅
<tag>
fail
</tag>
@@ -6674,7 +6674,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000
</tag>
<usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="RiggedMeshAttachedToHUD">HUDポイント「[POINT]」にアタッチされたオブジェクト「[NAME]」にはリグメッシュが含まれています。
+ <notification name="RiggedMeshAttachedToHUD">HUDポイント「[POINT]」にアタッチされたオブジェクト「[NAME]」にはリグメッシュが含まれています。
リグメッシュオブジェクトは、アバターに取り付けるように設計されています。あなたにはこのオブジェクトが表示されますが、他の人には表示されません。
@@ -6682,9 +6682,9 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000
<tag>
confirm
</tag>
- <usetemplate ignoretext="リグメッシュがHUDポイントにアタッチされている場合に警告します。" name="okignore" yestext="OK"/>
+ <usetemplate ignoretext="リグメッシュがHUDポイントにアタッチされている場合に警告します。" name="okignore" yestext="OK"/>
</notification>
- <notification name="EnableAutoFPSWarning" type="alertmodal">自動FPSを有効にしようとしています。保存されていないグラフィック設定はすべて失われます。
+ <notification name="EnableAutoFPSWarning" type="alertmodal">自動FPSを有効にしようとしています。保存されていないグラフィック設定はすべて失われます。
まずそれらを保存しますか?
<tag>
diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
index b920a0a8f7..848e3d2f33 100644
--- a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
@@ -24,7 +24,7 @@
<icon name="hovered_icon"/>
<icon name="selected_icon"/>
<text name="avatar_name" value="(読み込んでいます)"/>
- <text name="last_interaction" value="0秒"/>
+ <text name="last_interaction" value="0秒"/>
<icon name="permission_edit_theirs_icon" tool_tip="このフレンドのオブジェクトを編集することができます。"/>
<icon name="permission_edit_mine_icon" tool_tip="このフレンドは、あなたのオブジェクトを編集・削除・取得することができます。"/>
<icon tool_tip="このフレンドはマップ上であなたの位置を表示できます。" name="permission_map_icon"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml
index 156f475fc6..56b6e88c7b 100644
--- a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="clothing_list_button_bar_panel">
- <button label="追加+" name="add_btn"/>
+ <button label="追加 +" name="add_btn"/>
<button name="clothing_shop_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_universal.xml b/indra/newview/skins/default/xui/ja/panel_edit_universal.xml
index fd5fe80848..6d6ee5622f 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_universal.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_universal.xml
@@ -10,9 +10,9 @@
<texture_picker label="目のタトゥ" name="Eyes Tattoo" tool_tip="クリックして画像を選択する"/>
<texture_picker label="左腕のタトゥ" name="Left Arm Tattoo" tool_tip="クリックして画像を選択する"/>
<texture_picker label="左脚のタトゥ" name="Left Leg Tattoo" tool_tip="クリックして画像を選択する"/>
- <texture_picker label="予備1のタトゥ" name="Aux1 Tattoo" tool_tip="クリックして画像を選択する"/>
- <texture_picker label="予備2のタトゥ" name="Aux2 Tattoo" tool_tip="クリックして画像を選択する"/>
- <texture_picker label="予備3のタトゥ" name="Aux3 Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="予備1のタトゥ" name="Aux1 Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="予備2のタトゥ" name="Aux2 Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="予備3のタトゥ" name="Aux3 Tattoo" tool_tip="クリックして画像を選択する"/>
<color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml b/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml
index 962d69c67c..27d9b088cb 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml
@@ -4,7 +4,7 @@
(読み込んでいます…)
</panel.string>
<panel.string name="ban_selection_too_large">
- グループのバンが送信されていません:選択した住人が多すぎます。グループへの立入禁止の数は1リクエスト当たり100人に制限されています。
+ グループのバンが送信されていません:選択した住人が多すぎます。グループへの立入禁止の数は1リクエスト当たり100人に制限されています。
</panel.string>
<panel.string name="ban_not_permitted">
グループのバンが送信されていません:「立入禁止リストの管理」の能力がありません。
diff --git a/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml
index 42e3b0050e..5e5fbfff9f 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml
@@ -53,7 +53,7 @@
</layout_panel>
</layout_stack>
<text name="info_deletion">
- 注:48時間メンバーが2人未満のグループは、自動的に解散されます。
+ 注:48時間メンバーが2人未満のグループは、自動的に解散されます。
</text>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
index 85f0cba760..1177d5930d 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
@@ -11,7 +11,7 @@
</panel.string>
<panel.string name="invite_selection_too_large">
グループへの招待が送信されていません:選択された住人が多すぎます。
-グループへの招待は1回のリクエストあたり100人に制限されています。
+グループへの招待は1回のリクエストあたり100人に制限されています。
</panel.string>
<text name="help_text">
グループには一度に複数の住人を招待することができます。「リストから住人を選択」をクリックしてください。
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
index ebde7f9944..8045c26724 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
@@ -9,8 +9,8 @@
過去の通知はありません
</panel.string>
<text name="lbl2">
- 通知は14日間保存されます。
-1日の制限数は200通です。
+ 通知は14日間保存されます。
+1日の制限数は200通です。
</text>
<scroll_list name="notice_list">
<scroll_list.columns label="" name="icon"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
index bd16e3e986..1a063a3592 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
@@ -30,7 +30,7 @@ Ctrlキーを押しながら、メンバー名をクリックすることで複
<panel.string name="help_text">
役割には、タイトルと許可された能力が割り当てられています。
メンバーは1つ以上の役割を持つことができます。
-グループで使える役割は10個までで、「全員(Everyone)」と「所有者(Owner)」がそれに含まれています。
+グループで使える役割は10個までで、「全員(Everyone)」と「所有者(Owner)」がそれに含まれています。
</panel.string>
<panel.string name="cant_delete_role">
「全員(Everyone)」と「所有者(Owner)」の役割は削除することができません。
diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
index c95320e53a..4055e23d9f 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
@@ -16,7 +16,7 @@
この位置の情報は、アクセス制限のためご利用いただけません。許可については区画所有者にお問い合わせください。
</string>
<string name="acquired_date">
- [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日([wkday,datetime,local]) [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日([wkday,datetime,local]) [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
<string name="icon_PG" value="Parcel_PG_Dark"/>
<string name="icon_M" value="Parcel_M_Dark"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
index 5b5116a05d..c75fd8b1ca 100644
--- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
@@ -19,7 +19,7 @@
<item label="名前" name="Name" value="search_by_name"/>
<item label="制作者" name="Creator" value="search_by_creator"/>
<item label="説明" name="Description" value="search_by_description"/>
- <item label="UUID" name="UUID" value="search_by_UUID"/>
+ <item label="UUID" name="UUID" value="search_by_UUID"/>
</combo_box>
<menu_button tool_tip="検索表示オプションを表示" name="options_visibility_btn"/>
<filter_editor label="検索用語を入力する" name="inventory search editor"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
index 5d984cb58c..39d9863a0a 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
@@ -28,7 +28,7 @@
サイズ:
</text>
<text name="X_label">
- X
+ X
</text>
<spinner label="" name="height_pixels"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
index 08edb447cb..7c7ce83a01 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="nearby_chat">
- <line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="Enterキーで発言し、Ctrl+Enterキーでシャウトします。"/>
+ <line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="Enterキーで発言し、Ctrl+Enterキーで叫びます。"/>
<button name="show_nearby_chat" tool_tip="近隣チャットログを表示/非表示"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
index 1093624cda..9c3b51adb9 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
@@ -19,8 +19,8 @@
<button label="すべて停止" name="all_nearby_media_disable_btn" tool_tip="近隣のメディアをすべてオフにします"/>
<button label="すべて開始" name="all_nearby_media_enable_btn" tool_tip="近隣のメディアをすべてオンにします"/>
<button name="open_prefs_btn" tool_tip="メディアの設定を開きます"/>
- <button label="詳細 ≫" label_selected="≪ 簡易" name="more_btn" tool_tip="拡張コントロール"/>
- <button label="詳細 ≫" label_selected="≪ 簡易" name="less_btn" tool_tip="拡張コントロール"/>
+ <button label="詳細 &gt;&gt;" label_selected="&lt;&lt; 簡易" name="more_btn" tool_tip="拡張コントロール"/>
+ <button label="詳細 &gt;&gt;" label_selected="&lt;&lt; 簡易" name="less_btn" tool_tip="拡張コントロール"/>
</panel>
<panel name="nearby_media_panel">
<text name="nearby_media_title">
diff --git a/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml b/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml
index 00733bf79d..f1fa54d14e 100644
--- a/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml
@@ -40,7 +40,7 @@
<text name="sender_or_fee_box">
送信者:住民 じゅうみん
</text>
- <text name="notification_time" value="2014年12月24日 23:30"/>
+ <text name="notification_time" value="2014年12月24日 23:30"/>
</panel>
</panel>
</layout_panel>
@@ -76,7 +76,7 @@
<text name="sender_or_fee_box_exp">
送信者:住民 じゅうみん
</text>
- <text name="notification_time_exp" value="2014年12月24日 23:30"/>
+ <text name="notification_time_exp" value="2014年12月24日 23:30"/>
</panel>
<panel name="notification_text_panel_exp">
<chat_editor name="notification_text_exp">
diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
index 516ee3c7d2..fbdaa319a2 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -19,7 +19,7 @@
<string name="AltMiniMapToolTipMsg" value="[地域](ダブルクリックでテレポート。Shift‐ドラッグで水平・垂直移動)"/>
<string name="GroupCountWithInfo" value="あなたは現在、[COUNT]グループに属しています。あと[REMAINING]グループに参加することができます。[secondlife:/// 上限を増やす]"/>
<tab_container name="tabs">
- <panel label="近隣" name="nearby_panel">
+ <panel label="近く" name="nearby_panel">
<panel label="bottom_panel" name="nearby_buttons_panel">
<filter_editor label="人物をフィルタ" name="nearby_filter_input"/>
<button name="gear_btn" tool_tip="選択した人物に対するアクション"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml b/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml
index 3a0eeae6d5..fdbfca64ce 100644
--- a/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml
+++ b/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml
@@ -24,12 +24,12 @@
<combo_box.item label="アバターとワールド" name="av_and_scene" value="1"/>
<combo_box.item label="ワールドのみ" name="scene_only" value="2"/>
</combo_box>
- <button label="今すぐ自動調整" name="start_autotune" tool_tip="ビューアーは、目標FPSを満たすように設定が調整されるまで停止します。"/>
+ <button label="今すぐ自動調整" name="start_autotune" tool_tip="ビューアーは、目標FPSを満たすように設定が調整されるまで停止します。"/>
<button label="キャンセル" name="stop_autotune" tool_tip="自動調整を中断します。"/>
<text name="wip_desc">
調整中です…
</text>
- <check_box label="継続的に調整する" name="AutoTuneContinuous" tool_tip="ビューアーは、このフローターが閉じていても停止するまで、目標FPSを満たすように設定を継続的に調整します。">
+ <check_box label="継続的に調整する" name="AutoTuneContinuous" tool_tip="ビューアーは、このフローターが閉じていても停止するまで、目標FPSを満たすように設定を継続的に調整します。">
</check_box>
<radio_group name="autotune_lock_type">
<radio_item label="このログインセッションのみ" name="one_session_lock" value="0"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_performance_huds.xml b/indra/newview/skins/default/xui/ja/panel_performance_huds.xml
index 51d9e73540..2d53d74d0d 100644
--- a/indra/newview/skins/default/xui/ja/panel_performance_huds.xml
+++ b/indra/newview/skins/default/xui/ja/panel_performance_huds.xml
@@ -5,13 +5,13 @@
戻る
</text>
<text name="huds_title">
- アクティブなHUD
+ アクティブなHUD
</text>
<text name="huds_desc1">
- 使用していないHUDを取り外すとメモリが節約され、Second Lifeの処理が高速化されます。
+ 使用していないHUDを取り外すとメモリが節約され、Second Lifeの処理が高速化されます。
</text>
<text name="huds_desc2">
- 注意:HUDの最小化ボタンを使用しても、HUDを取り外したことにはなりません。
+ 注意:HUDの最小化ボタンを使用しても、HUDを取り外したことにはなりません。
</text>
<name_list name="hud_list">
<name_list.columns label="" name="complex_visual"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml
index 40e7800adc..2e165b11b6 100644
--- a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml
@@ -7,7 +7,7 @@
<text name="settings_title">
グラフィック設定
</text>
- <button label="拡張設定を開く" name="advanced_btn"/>
+ <button label="詳細設定を開く" name="advanced_btn"/>
<button label="推奨設定にリセット" name="defaults_btn"/>
<view_border name="border0"/>
<text name="quality_lbl">
@@ -40,7 +40,7 @@
</text>
<slider name="draw_distance"/>
<text name="draw_distance_m">
- m
+ m
</text>
<text name="farther_lbl">
遠景
@@ -58,7 +58,7 @@
<check_box label="大気(周辺)シェーダー" name="atmospheric_shaders"/>
<check_box label="高度な光源モデル" name="advanced_lighting_model"/>
<text name="RenderShadowDetailText">
- 影:
+ 影
</text>
<combo_box name="ShadowDetail">
<combo_box.item label="なし" name="0" value="0"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
index 21843e4420..5bd1611a2e 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -39,7 +39,7 @@
この場所の情報は、アクセス制限のためご利用いただけません。許可については区画所有者にお問い合わせください。
</string>
<string name="acquired_date">
- [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
<button name="back_btn" tool_tip="戻る"/>
<text name="title" value="場所のプロフィール"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
index 6373eadabc..f74059e7f1 100644
--- a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
@@ -2,9 +2,9 @@
<panel name="panel_postcard_settings">
<combo_box label="解像度" name="postcard_size_combo">
<combo_box.item label="現在のウィンドウ" name="CurrentWindow"/>
- <combo_box.item label="640✕480" name="640x480"/>
- <combo_box.item label="800✕600" name="800x600"/>
- <combo_box.item label="1024✕768" name="1024x768"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="カスタム" name="Custom"/>
</combo_box>
<spinner label="横幅✕高さ" name="postcard_snapshot_width"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index 40998f8035..72da378efb 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="拡張" name="advanced">
+<panel label="アドバンス" name="advanced">
<panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
+ [NUM]:[DEN]
</panel.string>
<text name="Cache:">
キャッシュ:
@@ -17,19 +17,19 @@
<button label="参照" label_selected="参照" name="set_cache"/>
<button label="デフォルトの場所" label_selected="デフォルトの場所" name="default_cache_location"/>
<text name="UI Size:">
- UIのサイズ:
+ UIのサイズ:
</text>
<text name="HUD Size:">
- HUDのスケール:
+ HUDのスケール:
</text>
- <check_box label="スクリプトのエラーを表示:" name="show_script_errors"/>
+ <check_box label="スクリプトのエラーを表示:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="近隣チャット" name="0"/>
<radio_item label="別々のウィンドウ" name="1"/>
</radio_group>
<check_box label="複数のビューアを許可" name="allow_multiple_viewer_check"/>
<check_box label="ログイン時にグリッド選択を表示" name="show_grid_selection_check"/>
- <check_box label="拡張メニューを表示" name="show_advanced_menu_check"/>
+ <check_box label="アドバンスメニューを表示" name="show_advanced_menu_check"/>
<check_box label="開発メニューを表示" name="show_develop_menu_check"/>
<button label="記録済みのユーザ名" name="remembered_usernames"/>
<button label="デフォルトの作成権限" name="default_creation_permissions"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index dd11296729..8246c1e07c 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -4,12 +4,12 @@
<panel name="general_chat_settings">
<check_box initial_value="true" label="チャット中にタイピング動作のアニメーションを再生" name="play_typing_animation"/>
<check_box label="オフライン時に受け取ったIMはメールで受信する" name="send_im_to_email"/>
- <check_box label="フレンドとグループ以外からのコールとIMは受信しない" name="voice_call_friends_only_check"/>
+ <check_box label="フレンドとグループ以外からのコールとIMは受信しない" name="voice_call_friends_only_check"/>
<text name="email_settings">
- [https://accounts.secondlife.com/change_email?lang=ja オフライン時のIMのメール送信先の設定]
+ [https://accounts.secondlife.com/change_email?lang=ja オフライン時のIMのメール送信先の設定]
</text>
<text name="font_size">
- 文字の大きさ:
+ フォントサイズ:
</text>
<combo_box name="chat_font_size">
<item label="小" name="Small" value="0"/>
@@ -20,7 +20,7 @@
</panel>
<panel name="im_notification_settings">
<text name="friend_ims">
- フレンドIM:
+ フレンドからのIM:
</text>
<combo_box name="FriendIMOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -30,7 +30,7 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_friend_im"/>
<text name="non_friend_ims">
- フレンドのいないIM:
+ フレンド以外からのIM:
</text>
<combo_box name="NonFriendIMOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -40,7 +40,7 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_non_friend_im"/>
<text name="conference_ims">
- 会話IM:
+ 会議IM:
</text>
<combo_box name="ConferenceIMOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -70,7 +70,7 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_nearby_chat_im"/>
<text name="object_ims">
- オブジェクトによるIM:
+ オブジェクトによるIM:
</text>
<combo_box name="ObjectIMOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
index b740f85806..d57f8d12f5 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
@@ -29,13 +29,13 @@
所有者
</text>
<text name="text_box9">
- URL
+ URL
</text>
<text name="bubble_chat">
名前の表示の背景色(吹き出しチャットにも適用):
</text>
<color_swatch name="background" tool_tip="名前の表示色を選択"/>
- <slider label="不透明度:" name="bubble_chat_opacity" tool_tip="名前の表示の不透明度を選択"/>
+ <slider label="不透明度:" name="bubble_chat_opacity" tool_tip="名前の表示の不透明度を選択"/>
<text name="floater_opacity">
フローターの透過度:
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
index 9309dda5af..eff831a7ac 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -45,7 +45,7 @@
<check_box label="ユーザー名" name="show_slids" tool_tip="bobsmith123 などユーザー名を表示"/>
<check_box label="グループタイトル" name="show_all_title_checkbox1" tool_tip="オフィサーまたはメンバーなど、グループタイトルを表示"/>
<check_box label="フレンドをハイライト表示" name="show_friends" tool_tip="フレンドの名前をハイライト表示"/>
- <check_box label="表示名を表示" name="display_names_check" tool_tip="これを選択すると、チャット、IMなどで表示名が表示されます。"/>
+ <check_box label="表示名を表示" name="display_names_check" tool_tip="これを選択すると、チャット、IMなどで表示名が表示されます。"/>
<text name="inworld_typing_rg_label">
特定キーを押したときの動作:
</text>
@@ -57,10 +57,10 @@
「離席」とするまでの時間:
</text>
<combo_box label="「離席」とするまでの時間:" name="afk">
- <combo_box.item label="2分" name="item0"/>
- <combo_box.item label="5分" name="item1"/>
- <combo_box.item label="10分" name="item2"/>
- <combo_box.item label="30分" name="item3"/>
+ <combo_box.item label="2分" name="item0"/>
+ <combo_box.item label="5分" name="item1"/>
+ <combo_box.item label="10分" name="item2"/>
+ <combo_box.item label="30分" name="item3"/>
<combo_box.item label="離席設定なし" name="item4"/>
</combo_box>
<text name="text_box3">
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
index 79a4689526..a70b30c57f 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -37,7 +37,7 @@
<slider name="QualityPerformanceSelection"/>
<slider control_name="RenderFarClip" label="描画距離:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
- m
+ m
</text>
<check_box initial_value="true" label="大気(周辺)シェーダー" name="WindLightUseAtmosShaders"/>
<check_box initial_value="true" label="高度な光源モデル" name="UseLightShaders"/>
@@ -56,5 +56,5 @@
<button label="プリセットを削除…" name="PrefDeleteButton"/>
<button label="プリセットを削除…" name="PrefDeleteButton"/>
<button label="推奨設定にリセット" name="Defaults"/>
- <button label="拡張設定…" name="AdvancedSettings"/>
+ <button label="詳細設定…" name="AdvancedSettings"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
index 3956e07bf8..85be779053 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -4,10 +4,10 @@
中央のボタン
</panel.string>
<panel.string name="button4_mouse">
- 4ボタン
+ マウスボタン4
</panel.string>
<panel.string name="button5_mouse">
- 5ボタン
+ マウスボタン5
</panel.string>
<slider label="全体のボリューム" name="System Volume"/>
<button name="mute_audio"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml b/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml
index b4504dd39a..128669260a 100644
--- a/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml
+++ b/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml
@@ -5,6 +5,6 @@
</text>
<scroll_list name="preset_list"/>
<view_border name="horiz_separator"/>
- <button name="open_prefs_btn" label="グラフィック初期設定" tool_tip="グラフィック設定を呼び出します。"/>
- <button name="open_autofps_btn" label="自動FPS設定" tool_tip="自動調整設定を呼び出します。"/>
+ <button name="open_prefs_btn" label="グラフィック設定" tool_tip="グラフィック設定を呼び出します。"/>
+ <button name="open_autofps_btn" label="自動FPS設定" tool_tip="自動調整設定を呼び出します。"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
index 6c33bda5cd..038a7aa49f 100644
--- a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
@@ -64,7 +64,7 @@
<button name="close_btn" tool_tip="ズームバック"/>
</layout_panel>
<layout_panel name="new_window">
- <button name="new_window_btn" tool_tip="URLをブラウザで開く"/>
+ <button name="new_window_btn" tool_tip="URLをブラウザで開く"/>
</layout_panel>
</layout_stack>
<icon name="media_secure_lock_flag" tool_tip="安全なブラウジング"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml
index 71e223b90b..1c9111606e 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_profile" label="プロフィール">
- <string name="date_format" value="SLでの誕生日:[year,datetime,utc]年[mth,datetime,utc]月[day,datetime,utc]日"/>
+ <string name="date_format" value="SLでの誕生日:[year,datetime,utc]年[mth,datetime,utc]月[day,datetime,utc]日"/>
<string name="age_format" value="[AGE]経過"/>
<string name="partner_text" value="パートナー:[LINK]"/>
<string name="CaptionTextAcctInfo">
diff --git a/indra/newview/skins/default/xui/ja/panel_progress.xml b/indra/newview/skins/default/xui/ja/panel_progress.xml
index 1edada6098..cafc7c2d1d 100644
--- a/indra/newview/skins/default/xui/ja/panel_progress.xml
+++ b/indra/newview/skins/default/xui/ja/panel_progress.xml
@@ -1,8 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="login_progress_panel">
+ <layout_panel name="panel_icons"/>
<layout_stack name="vertical_centering"/>
<layout_panel name="panel4"/>
<layout_panel name="center"/>
<layout_stack name="horizontal_centering">
+ <text name="logos_lbl">
+ メガパイト使用
+ </text>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
index 9b2239e0bb..16349b45d4 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
@@ -45,7 +45,7 @@
種類:
</text>
<text name="region_landtype_text">
- メインランド/入植地
+ メインランド / ホームステッド
</text>
<text name="region_maturity_lbl">
区分:
diff --git a/indra/newview/skins/default/xui/ja/panel_region_environment.xml b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
index 48aa2a0adb..969c8f699c 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_environment.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
@@ -7,7 +7,7 @@
リージョン(地域)の設定を使用
</string>
<string name="str_altitude_desription">
- 空 [INDEX]([ALTITUDE]m)
+ 空 [INDEX]([ALTITUDE]m)
</string>
<string name="str_no_parcel">
区画が選択されていません。環境の設定は無効になっています。
@@ -48,7 +48,7 @@
</layout_panel>
<layout_panel name="pnl_environment_length">
<text name="lbl_apparent_time">
- [AP] [HH]:[MM]([PRC]%)
+ [AP] [HH]:[MM] ([PRC]%)
</text>
</layout_panel>
<layout_panel name="pnl_environment_buttons"/>
@@ -57,7 +57,7 @@
<layout_panel name="pnl_environment_altitudes">
<panel name="pnl_alt1">
<text name="txt_alt1">
- 空[INDEX] [ALTITUDE]m
+ 空[INDEX] [ALTITUDE]m
</text>
<line_editor name="edt_invname_alt1">
不明
@@ -66,7 +66,7 @@
</panel>
<panel name="pnl_alt2">
<text name="txt_alt2">
- 空[INDEX] [ALTITUDE]m
+ 空[INDEX] [ALTITUDE]m
</text>
<line_editor name="edt_invname_alt2">
不明
@@ -75,7 +75,7 @@
</panel>
<panel name="pnl_alt3">
<text name="txt_alt3">
- 空[INDEX] [ALTITUDE]m
+ 空[INDEX] [ALTITUDE]m
</text>
<line_editor name="edt_invname_alt3">
不明
diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
index df790376ec..429b55cb32 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
@@ -19,7 +19,7 @@
<radio_item label="アクセスタブに記載された住人とグループのみ許可する" name="estate_restricted_access"/>
<radio_item label="誰でも訪問可" name="estate_public_access"/>
</radio_group>
- <check_box label="18歳以上である必要があります" name="limit_age_verified" tool_tip="この不動産(不動産)にアクセスするには、18 才以上でなければなりません。詳細については、[SUPPORT_SITE]をご覧ください。"/>
+ <check_box label="18歳以上である必要があります" name="limit_age_verified" tool_tip="この不動産(不動産)にアクセスするには、18 才以上でなければなりません。詳細については、[SUPPORT_SITE]をご覧ください。"/>
<check_box label="支払情報が登録されている必要があります" name="limit_payment" tool_tip="支払情報が登録されていないと、この不動産にアクセスすることはできません。詳細については、[SUPPORT_SITE]をご覧ください。"/>
<check_box label="区画所有者" name="parcel_access_override"/>
<check_box label="ボイスチャットを許可" name="voice_chat_check"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
index 11e8d0d169..398f8d6718 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
@@ -13,16 +13,16 @@
地形テクスチャ
</text>
<text name="height_text_lbl">
- 1(低)
+ 1(低)
</text>
<text name="height_text_lbl2">
- 2
+ 2
</text>
<text name="height_text_lbl3">
- 3
+ 3
</text>
<text name="height_text_lbl4">
- 4(高)
+ 4(高)
</text>
<text name="height_text_lbl5">
地形の隆起範囲
@@ -31,7 +31,7 @@
数値は上のテクスチャのブレンド範囲を示します。
</text>
<text name="height_text_lbl11">
- 計測単位はメートルで、「低」の値は、1番のテクスチャの高さの「最大値」です。「高」の値は、4番のテクスチャの高さの「最低値」です。
+ 計測単位はメートルで、「低」の値は、1番のテクスチャの高さの「最大値」です。「高」の値は、4番のテクスチャの高さの「最低値」です。
</text>
<text name="height_text_lbl6">
北西
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
index c717b71194..68eb8b4f9d 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
@@ -8,7 +8,7 @@
</text>
<scroll_list name="scripts_list">
<scroll_list.columns label="サイズ (㎅)" name="size"/>
- <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="オブジェクト名" name="name"/>
<scroll_list.columns label="場所" name="location"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
index 71dedb55a6..30c3fdc9b5 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
@@ -10,7 +10,7 @@
</text>
<scroll_list name="scripts_list">
<scroll_list.columns label="サイズ (㎅)" name="size"/>
- <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="オブジェクト名" name="name"/>
<scroll_list.columns label="オブジェクトの所有者" name="owner"/>
<scroll_list.columns label="区画" name="parcel"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml
index f8837c40a7..844a556af1 100644
--- a/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml
+++ b/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml
@@ -44,8 +44,6 @@
<check_box label="ビーコンを表示" name="sunbeacon"/>
</layout_panel>
<layout_panel name="moon_layout">
- <layout_stack name="moon_stack">
- <layout_panel name="moon_layout">
<text name="moon_label">
</text>
@@ -74,8 +72,6 @@
</text>
<slider name="moon_brightness"/>
<check_box label="ビーコンを表示" name="moonbeacon"/>
- </layout_panel>
- </layout_stack>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_settings_water.xml b/indra/newview/skins/default/xui/ja/panel_settings_water.xml
index ead1ca9b2f..2510523897 100644
--- a/indra/newview/skins/default/xui/ja/panel_settings_water.xml
+++ b/indra/newview/skins/default/xui/ja/panel_settings_water.xml
@@ -63,7 +63,7 @@
<text follows="left|top|right" font="SansSerif" height="16" layout="topleft" left_delta="-5" top_pad="5" width="215">
ブラー乗数
</text>
- <slider control_name="water_blur_multip" follows="left|top" height="16" increment="0.001" initial_value="0" layout="topleft" left_delta="5" min_val="-0.5" max_val="0.5" name="water_blur_multip" top_pad="5" width="200" can_edit_text="true"/>
+ <slider control_name="water_blur_multip" follows="left|top" height="16" increment="0.001" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="0.5" name="water_blur_multip" top_pad="5" width="200" can_edit_text="true"/>
</layout_panel>
</layout_stack>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
index c55c11e928..04ecba4264 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
@@ -6,7 +6,7 @@
</text>
<view_border name="hr"/>
<combo_box label="解像度" name="texture_size_combo">
- <combo_box.item label="現在のウィンドウ (512✕512)" name="CurrentWindow"/>
+ <combo_box.item label="現在のウィンドウ" name="CurrentWindow"/>
<combo_box.item label="小(128✕128)" name="Small(128x128)"/>
<combo_box.item label="中(256✕256)" name="Medium(256x256)"/>
<combo_box.item label="大(512✕512)" name="Large(512x512)"/>
@@ -16,7 +16,7 @@
<spinner label="" name="inventory_snapshot_height"/>
<check_box label="縦横比の固定" name="inventory_keep_aspect_check"/>
<text name="hint_lbl">
- 画像をテクスチャとして保存する場合は、いずれかの正方形を選択してください。
+ 画像をインベントリに保存するには L$[UPLOAD_COST] の費用がかかります。画像をテクスチャとして保存するには平方形式の 1 つを選択してください。
</text>
<button label="キャンセル" name="cancel_btn"/>
<button label="保存" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
index 7a1aa280ec..a979e31c9a 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="ディスクに保存" name="save_to_computer_btn"/>
- <button label="インベントリに保存(L$ [AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="インベントリに保存" name="save_to_inventory_btn"/>
<button label="プロフィールフィードで共有する" name="save_to_profile_btn"/>
<button label="メールで送信" name="save_to_email_btn"/>
<text name="fee_hint_lbl">
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
index 9cb0b8f116..27a55aa653 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
@@ -10,7 +10,7 @@
送信中…
</string>
<text name="title">
- Eメール
+ Eメール
</text>
<tab_container name="postcard_tabs">
<panel label="メッセージ" name="panel_postcard_message"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index 9feae80624..2497b15548 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -7,10 +7,10 @@
帯域幅
</panel.string>
<panel.string name="time">
- [ampm, datetime, slt] [hour12, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]
+ [ampm, datetime, slt] [hour12, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]
</panel.string>
<panel.string name="timeTooltip">
- [year, datetime, slt]年[month, datetime, slt]月[day, datetime, slt]日([weekday, datetime, slt])
+ [year, datetime, slt]年[month, datetime, slt][day, datetime, slt]日([weekday, datetime, slt])
</panel.string>
<panel.string name="buycurrencylabel">
L$ [AMT]
@@ -24,7 +24,7 @@
<button label="ショップ" name="goShop" tool_tip="Second Lifeのマーケットプレイスを開きます。" width="70"/>
</panel>
<text name="TimeText" tool_tip="現在時刻(太平洋)">
- 午前 24:00 PST
+ 午前 24:00 PST
</text>
<icon image_name="Cam_FreeCam_Off" name="presets_icon_camera" tool_tip="カメラ"/>
<icon image_name="Presets_Icon" name="presets_icon_graphic" tool_tip="グラフィックのプリセット"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml
index 49efc529e4..968635e55b 100644
--- a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml
@@ -17,7 +17,7 @@
</combo_box>
<radio_group name="radio_material_type">
<radio_item label="テクスチャ (拡散)" name="Texture (diffuse)" value="0"/>
- <radio_item label="凹凸 (標準)" name="Bumpiness (normal)" value="1"/>
+ <radio_item label="凹凸 (法線)" name="Bumpiness (normal)" value="1"/>
<radio_item label="輝き (反射)" name="Shininess (specular)" value="2"/>
</radio_group>
<check_box initial_value="false" label="繰り返しをロックする" name="checkbox_sync_settings" tool_tip="すべてのマップの繰り返しを調整する"/>
@@ -79,7 +79,7 @@
</text>
<color_swatch label="" name="shinycolorswatch" tool_tip="クリックしてカラーピッカーを開きます"/>
<text name="media_info">
- 選択したメディアのURLがもしあれば、ここに入ります。
+ 選択したメディアのURLがもしあれば、ここに入ります。
</text>
<button label="選択…" name="add_media" tool_tip="メディアを追加します"/>
<button label="削除" name="delete_media" tool_tip="このメディアテクスチャを削除します"/>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
index fe9998b4ce..520ef848a0 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
@@ -19,7 +19,7 @@
所有者ができること:
</panel.string>
<panel.string name="acquiredDate">
- [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</panel.string>
<panel.string name="origin_inventory">
(インベントリ)
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
index 8ff543bf92..1240a2e670 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
@@ -48,7 +48,7 @@
<text name="Name:">
名前:
</text>
- <line_editor name="Object Name" tool_tip="使用できる名前の文字数は最大63文字までです。長いプリム名は短縮されます。名前に使用できる文字はASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
+ <line_editor name="Object Name" tool_tip="使用できる名前の文字数は最大63文字までです。長いプリム名は短縮されます。名前に使用できる文字はASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
<text name="Description:">
説明:
</text>
@@ -68,7 +68,7 @@
<text name="label click action">
クリックで:
</text>
- <combo_box name="clickaction" tool_tip="マウスで1回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリックアクションによっては、動作要件が必要なものもあります。例えば、「触る」や「支払い」にはスクリプトが必要になります。">
+ <combo_box name="clickaction" tool_tip="マウスで1回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリックアクションによっては、動作要件が必要なものもあります。例えば、「触る」や「支払い」にはスクリプトが必要になります。">
<combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
<combo_box.item label="オブジェクトに座る" name="Sitonobject"/>
<combo_box.item label="オブジェクトを買う" name="Buyobject"/>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 106bf91d0c..99909d80d1 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -31,7 +31,7 @@
グラフィックを初期化できませんでした。グラフィックドライバを更新してください。
</string>
<string name="AboutHeader">
- [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3]([ADDRESS_SIZE]bit)
+ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3]([ADDRESS_SIZE]bit)
[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
</string>
<string name="BuildConfig">
@@ -39,16 +39,16 @@
</string>
<string name="AboutPosition">
あなたは、現在[REGION]の[POSITION_LOCAL_0,number,1],[POSITION_LOCAL_1,number,1],[POSITION_LOCAL_2,number,1]にいます。
-位置は、&lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;です。([HOSTIP])
+位置は、&lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;です。
SLURL:&lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(グローバル座標は、[POSITION_0,number,1],[POSITION_1,number,1],[POSITION_2,number,1]です。)
[SERVER_VERSION]
[SERVER_RELEASE_NOTES_URL]
</string>
<string name="AboutSystem">
- CPU:[CPU]
+ CPU:[CPU]
メモリ:[MEMORY_MB]㎆
-OSのバージョン:[OS_VERSION]
+OSのバージョン:[OS_VERSION]
グラフィックカード製造元:[GRAPHICS_CARD_VENDOR]
グラフィックカード:[GRAPHICS_CARD]
</string>
@@ -61,15 +61,15 @@ SLURL:&lt;nolink&gt;[SLURL]&lt;/nolink&gt;
<string name="AboutSettings">
ウィンドウサイズ:[WINDOW_WIDTH]x[WINDOW_HEIGHT]
フォントサイズ調整:[FONT_SIZE_ADJUSTMENT]pt
-UIスケーリング:[UI_SCALE]
-描画距離:[DRAW_DISTANCE]m
-帯域幅:[NET_BANDWITH]kbit/秒
-LOD係数:[LOD_FACTOR]
+UIスケーリング:[UI_SCALE]
+描画距離:[DRAW_DISTANCE]m
+帯域幅:[NET_BANDWITH]kbit/s
+LOD係数:[LOD_FACTOR]
描画の質:[RENDER_QUALITY]
テクスチャメモリ:[TEXTURE_MEMORY]㎆
</string>
<string name="AboutOSXHiDPI">
- 高DPI表示モード:[HIDPI]
+ 高DPI表示モード:[HIDPI]
</string>
<string name="AboutLibs">
J2Cデコーダバージョン:[J2C_VERSION]
@@ -82,10 +82,10 @@ LibVLCバージョン:[LIBVLC_VERSION]
パケット損失:[PACKETS_LOST,number,0]/[PACKETS_IN,number,0]([PACKETS_PCT,number,1]%)
</string>
<string name="AboutTime">
- [year, datetime, slt]年[month, datetime, slt]月[day, datetime, slt]日 [hour, datetime, slt]:[min,datetime, slt]:[second,datetime,slt]
+ [year, datetime, slt]年[month, datetime, slt]月[day, datetime, slt]日 [hour, datetime, slt]:[min,datetime, slt]:[second,datetime,slt]
</string>
<string name="ErrorFetchingServerReleaseNotesURL">
- サーバーのリリースノートのURL取得時にエラーが発生しました。
+ サーバーのリリースノートのURL取得時にエラーが発生しました。
</string>
<string name="BuildConfiguration">
ビルド構成
@@ -357,7 +357,7 @@ support@secondlife.com にお問い合わせください。
白黒
</string>
<string name="Colors1970">
- 1970年代のカラー
+ 1970年代のカラー
</string>
<string name="Intense">
強調
@@ -540,7 +540,7 @@ support@secondlife.com にお問い合わせください。
<string name="TooltipSLAPP">
クリックして secondlife:// コマンドを出します。
</string>
- <string name="CurrentURL" value="現在のURL:[CurrentURL]"/>
+ <string name="CurrentURL" value="現在のURL:[CurrentURL]"/>
<string name="TooltipEmail">
クリックして電子メールを作成します。
</string>
@@ -557,7 +557,7 @@ support@secondlife.com にお問い合わせください。
ミュート解除
</string>
<string name="SLappAgentIM">
- IM
+ IM
</string>
<string name="SLappAgentPay">
支払い
@@ -821,28 +821,28 @@ support@secondlife.com にお問い合わせください。
泣く
</string>
<string name="anim_dance1">
- ダンス1
+ ダンス1
</string>
<string name="anim_dance2">
- ダンス2
+ ダンス2
</string>
<string name="anim_dance3">
- ダンス3
+ ダンス3
</string>
<string name="anim_dance4">
- ダンス4
+ ダンス4
</string>
<string name="anim_dance5">
- ダンス5
+ ダンス5
</string>
<string name="anim_dance6">
- ダンス6
+ ダンス6
</string>
<string name="anim_dance7">
- ダンス7
+ ダンス7
</string>
<string name="anim_dance8">
- ダンス8
+ ダンス8
</string>
<string name="anim_express_disdain">
侮蔑
@@ -1010,7 +1010,7 @@ support@secondlife.com にお問い合わせください。
オフライン
</string>
<string name="worldmap_item_tooltip_format">
- [AREA]㎡ L$ [PRICE]([SQMPRICE] L$/㎡)
+ [AREA]㎡ L$ [PRICE]([SQMPRICE] L$/㎡)
</string>
<string name="worldmap_results_none_found">
何も見つかりませんでした。
@@ -1034,7 +1034,7 @@ support@secondlife.com にお問い合わせください。
のささやき:
</string>
<string name="shout">
- のシャウト:
+ の叫び:
</string>
<string name="ringing">
インワールドボイスチャットに接続中…
@@ -1142,16 +1142,16 @@ support@secondlife.com にお問い合わせください。
(不明)
</string>
<string name="Estate / Full Region">
- 不動産/フルリージョン
+ 不動産 / フルリージョン
</string>
<string name="Estate / Homestead">
- 不動産/入植地
+ 不動産 / ホームステッド
</string>
<string name="Mainland / Homestead">
- メインランド/入植地
+ メインランド / ホームステッド
</string>
<string name="Mainland / Full Region">
- メインランド/フルリージョン
+ メインランド / フルリージョン
</string>
<string name="all_files">
全てのファイル
@@ -3225,7 +3225,7 @@ For AI Character: Get the closest navigable point to the point provided.
料金はサブスクリプションのレベルにより異なります。レベルが高いほど、料金が下がります。[https://accounts.secondlife.com/change_membership/?lang=ja-JP 詳細]
</string>
<string name="Open landmarks">
- オープン ランドマーク
+ ランドマーク一覧を開く
</string>
<string name="Unconstrained">
アンコンストレインド(制約なし)
@@ -3602,7 +3602,7 @@ For AI Character: Get the closest navigable point to the point provided.
あなたは、周囲の誰からも見えていない可能性があります。
</string>
<string name="hud_description_total">
- 利用中のHUD
+ 利用中のHUD
</string>
<string name="hud_name_with_joint">
[OBJ_NAME]([JNT_NAME]に装着中)
@@ -3695,7 +3695,7 @@ For AI Character: Get the closest navigable point to the point provided.
年齢未確認
</string>
<string name="Center 2">
- 中央2
+ 中央2
</string>
<string name="Top Right">
右上
@@ -3874,19 +3874,19 @@ For AI Character: Get the closest navigable point to the point provided.
区画一覧:[PARCELS]個
</string>
<string name="ScriptLimitsMemoryUsed">
- 使用されたメモリ:[MAX]㎅中[COUNT]㎅ [AVAILABLE]㎅利用可
+ 使用されたメモリ:[MAX]㎅中[COUNT]㎅ [AVAILABLE]㎅利用可
</string>
<string name="ScriptLimitsMemoryUsedSimple">
使用されたメモリ:[COUNT]㎅
</string>
<string name="ScriptLimitsParcelScriptURLs">
- 区画のスクリプトURL
+ 区画のスクリプトURL
</string>
<string name="ScriptLimitsURLsUsed">
- 使用されたURL:[MAX]件中[COUNT]件 [AVAILABLE]件利用可
+ 使用されたURL:[MAX]件中[COUNT]件 [AVAILABLE]件利用可
</string>
<string name="ScriptLimitsURLsUsedSimple">
- 使用されたURL:[COUNT]件
+ 使用されたURL:[COUNT]件
</string>
<string name="ScriptLimitsRequestError">
情報のリクエスト中にエラーが発生しました
@@ -3997,28 +3997,28 @@ For AI Character: Get the closest navigable point to the point provided.
右胸筋
</string>
<string name="ATTACH_HUD_CENTER_2">
- HUD(中央 2)
+ HUD(中央 2)
</string>
<string name="ATTACH_HUD_TOP_RIGHT">
- HUD(右上)
+ HUD(右上)
</string>
<string name="ATTACH_HUD_TOP_CENTER">
- HUD(上・中央)
+ HUD(上・中央)
</string>
<string name="ATTACH_HUD_TOP_LEFT">
- HUD(左上)
+ HUD(左上)
</string>
<string name="ATTACH_HUD_CENTER_1">
- HUD(中央 1)
+ HUD(中央 1)
</string>
<string name="ATTACH_HUD_BOTTOM_LEFT">
- HUD(左下)
+ HUD(左下)
</string>
<string name="ATTACH_HUD_BOTTOM">
- HUD(下)
+ HUD(下)
</string>
<string name="ATTACH_HUD_BOTTOM_RIGHT">
- HUD(右下)
+ HUD(右下)
</string>
<string name="ATTACH_NECK">
@@ -4078,10 +4078,10 @@ For AI Character: Get the closest navigable point to the point provided.
[COUNT]件見つかりました
</string>
<string name="PanelDirTimeStr">
- [ampm,datetime,utc] [hour12,datetime,utc]:[min,datetime,utc]
+ [ampm,datetime,utc] [hour12,datetime,utc]:[min,datetime,utc]
</string>
<string name="PanelDirEventsDateText">
- [mthnum,datetime,slt]/[day,datetime,slt]
+ [mthnum,datetime,slt]/[day,datetime,slt]
</string>
<string name="PanelContentsTooltip">
オブジェクトの中身
@@ -4545,10 +4545,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
ピクセル形式が設定できません。
</string>
<string name="MBGLContextErr">
- GLレンダーコンテキストが作れません
+ GLレンダーコンテキストが作れません
</string>
<string name="MBGLContextActErr">
- GLレンダーコンテキストを有効化できません。
+ GLレンダーコンテキストを有効化できません。
</string>
<string name="MBVideoDrvErr">
お使いのコンピューターのビデオカードのドライバが正常にインストールされていないか、古いまたはサポート対象外のため、[APP_NAME]を実行することができませんでした。
@@ -6149,11 +6149,15 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="inventory_folder_offered-im">
フォルダ「[ITEM_NAME]」がインベントリに送られてきました。
</string>
+ <string name="bot_warning">
+ [NAME]とチャットしています。個人情報を共有しないでください。
+詳細は https://second.life/scripted-agents をご覧ください。
+ </string>
<string name="share_alert">
インベントリからここにアイテムをドラッグします。
</string>
<string name="no_session_message">
- (IMセッションが存在しません)
+ (IMセッションが存在しません)
</string>
<string name="only_user_message">
このセッションにいるユーザーはあなただけです。
@@ -6578,28 +6582,28 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
一時退席中
</string>
<string name="dance1">
- ダンス1
+ ダンス1
</string>
<string name="dance2">
- ダンス2
+ ダンス2
</string>
<string name="dance3">
- ダンス3
+ ダンス3
</string>
<string name="dance4">
- ダンス4
+ ダンス4
</string>
<string name="dance5">
- ダンス5
+ ダンス5
</string>
<string name="dance6">
- ダンス6
+ ダンス6
</string>
<string name="dance7">
- ダンス7
+ ダンス7
</string>
<string name="dance8">
- ダンス8
+ ダンス8
</string>
<string name="AvatarBirthDateFormat">
[year,datetime,slt]年[mthnum,datetime,slt]月[day,datetime,slt]日
@@ -6619,7 +6623,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="outfit_photo_verify_dimensions_error">
画像の寸法を確認できません。画像サイズがピッカーに表示されるまでお待ちください。
</string>
- <string name="sentences_separator" value=" "/>
+ <string name="sentences_separator" value=" "/>
<string name="words_separator" value="、"/>
<string name="server_is_down">
大変申し訳ございませんが、予期しない問題が発生しました。サービスに関する既知の問題については、 https://status.secondlifegrid.net/?lang=ja-JP をご覧ください。
@@ -6632,7 +6636,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
日:月:火:水:木:金:土
</string>
<string name="dateTimeMonthNames">
- 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+ 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
</string>
<string name="dateTimeMonthShortNames">
㋀:㋁:㋂:㋃:㋄:㋅:㋆:㋇:㋈:㋉:㋊:㋋
@@ -7104,7 +7108,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
パーティクルを非表示
</string>
<string name="Command_360_Capture_Label">
- 360度Sショット
+ 360度スナップショット
</string>
<string name="Command_AboutLand_Label">
土地情報
@@ -7194,7 +7198,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
ボイス設定
</string>
<string name="Command_360_Capture_Tooltip">
- 360度の正距円筒図法のスナップショット画像を撮影します。
+ 360度の正距円筒図法のスナップショット画像を撮影します。
</string>
<string name="Command_AboutLand_Tooltip">
訪問先に関する情報を表示します。
@@ -7479,7 +7483,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
物理形状に不正な確認データがあります。物理モデルを修正してください。
</string>
<string name="Mav_Details_MAV_BLOCK_MISSING">
- データがありません。高LODが存在し、有効であることを確認してください。設定されていない場合は、物理モデルを設定します。
+ データがありません。高LODが存在し、有効であることを確認してください。設定されていない場合は、物理モデルを設定します。
</string>
<string name="Mav_Details_MAV_UNKNOWN_VERSION">
物理形状のバージョンが正しくありません。物理モデルに正しいバージョンを設定してください。
@@ -7490,7 +7494,7 @@ www.secondlife.com のウェブサイトに接続できるかご確認くださ
接続できても、このエラーが継続的に起こる場合は、サポートセクションから問題を報告してください。
</string>
<string name="ssl_peer_certificate">
- ログインサーバーがSSL経由で確認できませんでした。
+ ログインサーバーがSSL経由で確認できませんでした。
このエラーが継続的に起こる場合は、Secondlife.com のサポートセクションから問題を報告してください。
</string>
<string name="ssl_connect_error">
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index c1be98bef9..cdfdb1628b 100644
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -47,7 +47,7 @@
インベントリシステムは現在利用できません。
</message>
<message name="MustGetAgeRegion">
- このリージョン(地域)に入るには、18歳以上である必要があります。
+ このリージョン(地域)に入るには、18歳以上である必要があります。
</message>
<message name="RegionTPSpecialUsageBlocked">
リージョンに入ることができません。
diff --git a/indra/newview/skins/default/xui/pl/panel_progress.xml b/indra/newview/skins/default/xui/pl/panel_progress.xml
index 8da982cc3f..3f68a32a7f 100644
--- a/indra/newview/skins/default/xui/pl/panel_progress.xml
+++ b/indra/newview/skins/default/xui/pl/panel_progress.xml
@@ -5,6 +5,11 @@
<layout_stack name="vertical_centering1">
<layout_panel name="panel4">
<layout_stack name="vertical_centering2">
+ <layout_panel name="panel_icons">
+ <text name="logos_lbl">
+ Megapahit używa
+ </text>
+ </layout_panel>
</layout_stack>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml
index f807148617..7f9dee2369 100644
--- a/indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml
+++ b/indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml
@@ -35,8 +35,6 @@
<check_box label="Pokaż emiter" name="sunbeacon" />
</layout_panel>
<layout_panel name="moon_layout">
- <layout_stack name="moon_stack">
- <layout_panel name="moon_layout">
<text name="moon_label">
Księżyc
</text>
@@ -59,8 +57,6 @@
Jasność:
</text>
<check_box label="Pokaż emiter" name="moonbeacon" />
- </layout_panel>
- </layout_stack>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml
index 016b9ca197..04c01940e1 100644
--- a/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_snapshot_options">
<button label="Zapisz na dysku twardym" name="save_to_computer_btn" />
- <button label="Zapisz do Szafy ([AMOUNT]L$)" name="save_to_inventory_btn" />
+ <button label="Zapisz do Szafy" name="save_to_inventory_btn" />
<button label="Wyślij na mój Kanał" name="save_to_profile_btn" />
<button label="Załaduj na Facebook" name="send_to_facebook_btn" />
<button label="Załaduj na Twitter" name="send_to_twitter_btn" />
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 8032443020..7a61878618 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -22,14 +22,14 @@
Konfiguracja budowania: [BUILD_CONFIG]
</string>
<string name="AboutPosition">
-Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
+ Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(koordynaty globalne [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
[SERVER_RELEASE_NOTES_URL]
</string>
<string name="AboutSystem">
-Procesor (CPU): [CPU]
+ Procesor (CPU): [CPU]
Pamięć (Memory): [MEMORY_MB] MB
System operacyjny (OS Version): [OS_VERSION]
Dostawca karty graficznej (Graphics Card Vendor): [GRAPHICS_CARD_VENDOR]
@@ -42,7 +42,7 @@ Karta graficzna (Graphics Card): [GRAPHICS_CARD]
Wersja OpenGL: [OPENGL_VERSION]
</string>
<string name="AboutSettings">
-Rozmiar okna (Window size): [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+ Rozmiar okna (Window size): [WINDOW_WIDTH]x[WINDOW_HEIGHT]
Dostrojenie rozmiaru czcionki: [FONT_SIZE_ADJUSTMENT]pt
Skalowanie interfejsu (UI Scaling): [UI_SCALE]
Pole widzenia (Draw Distance): [DRAW_DISTANCE]m
@@ -56,7 +56,7 @@ Pamięć podręczna dysku (Disk cache): [DISK_CACHE_INFO]
Tryb obrazu HiDPI: [HIDPI]
</string>
<string name="AboutLibs">
-Wersja dekodera J2C: [J2C_VERSION]
+ Wersja dekodera J2C: [J2C_VERSION]
Wersja sterownika dźwięku (Audio Driver): [AUDIO_DRIVER_VERSION]
[LIBCEF_VERSION]
Wersja LibVLC: [LIBVLC_VERSION]
@@ -572,7 +572,7 @@ Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
Usunięcie znajomego
</string>
<string name="BUTTON_CLOSE_DARWIN">
- Zamknij (&#8984;W)
+ Zamknij (⌘W)
</string>
<string name="BUTTON_CLOSE_WIN">
Zamknij (Ctrl+W)
@@ -596,11 +596,11 @@ Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
Pokaż Pomoc
</string>
<string name="TooltipNotecardNotAllowedTypeDrop">
-Przedmioty tego typu nie mogą być dołączane
+ Przedmioty tego typu nie mogą być dołączane
do notek z tego regionu.
</string>
<string name="TooltipNotecardOwnerRestrictedDrop">
-Tylko przedmioty z nieograniczonymi
+ Tylko przedmioty z nieograniczonymi
uprawnieniami 'następnego właściciela'
mogą być dołączane do notek.
</string>
@@ -1622,7 +1622,7 @@ Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą technic
<string name="Scripts" value=" Skrypty,"/>
<string name="Sounds" value=" Dźwięki,"/>
<string name="Textures" value=" Tekstury,"/>
- <string name="Settings" value=" Otoczenia," />
+ <string name="Settings" value=" Otoczenia,"/>
<string name="Snapshots" value=" Zdjęcia,"/>
<string name="No Filters" value="Nie "/>
<string name="Since Logoff" value=" - od wylogowania"/>
@@ -4359,7 +4359,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
(Zapisano [LONG_TIMESTAMP])
</string>
<string name="IM_unblock_only_groups_friends">
- Aby zobaczyć tą wiadomość musisz odznaczyć &apos;Tylko znajomi i grupy mogą wysyłać mi wiad. prywatne (IM) oraz rozmowy głosowe&apos; w Ustawieniach/Prywatności.
+ Aby zobaczyć tą wiadomość musisz odznaczyć 'Tylko znajomi i grupy mogą wysyłać mi wiad. prywatne (IM) oraz rozmowy głosowe' w Ustawieniach/Prywatności.
</string>
<string name="OnlineStatus">
dostępny/a
@@ -4412,6 +4412,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="inventory_folder_offered-im">
Zaoferowano folder: '[ITEM_NAME]'
</string>
+ <string name="bot_warning">
+ Rozmawiasz z botem [NAME]. Nie udostępniaj żadnych danych osobowych.
+Dowiedz się więcej na https://second.life/scripted-agents.
+ </string>
<string name="share_alert">
Przeciągaj tutaj rzeczy z Szafy
</string>
@@ -5286,10 +5290,10 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
Otoczenie
</string>
<string name="logging_calls_disabled_log_empty">
- Rozmowy nie są zapisywane do dziennika. Jeśli chcesz zacząć je logować wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat.
+ Rozmowy nie są zapisywane do dziennika. Jeśli chcesz zacząć je logować wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje &gt; Czat.
</string>
<string name="logging_calls_disabled_log_not_empty">
- Rozmowy nie będą więcej zapisywane. Jeśli chcesz kontynuować ich logowanie wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat.
+ Rozmowy nie będą więcej zapisywane. Jeśli chcesz kontynuować ich logowanie wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje &gt; Czat.
</string>
<string name="logging_calls_enabled_log_empty">
Nie ma zapisanych rozmów. Jeśli skontaktujesz się z kimś, lub ktoś z Tobą, to wpis dziennika pojawi się tutaj.
diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml
index e86255100e..e091f79fe4 100644
--- a/indra/newview/skins/default/xui/pl/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml
@@ -22,7 +22,7 @@ Spróbuj jeszcze raz.
</message>
<message name="NoHelpIslandTP">
Brak możliwości ponownej teleportacji do Welcome Island.
-Odwiedź &apos;Welcome Island Public&apos; by powtórzyć szkolenie.
+Odwiedź 'Welcome Island Public' by powtórzyć szkolenie.
</message>
<message name="noaccess_tport">
Przepraszamy, ale nie masz dostępu do miejsca docelowego.
diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml
deleted file mode 100644
index 3509cb786d..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Carregando...
- </floater.string>
- <floater.string name="done_text">
- Pronto
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Buscar novamente com status God
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/panel_progress.xml b/indra/newview/skins/default/xui/pt/panel_progress.xml
index c9bed9fd9b..be0364a70a 100644
--- a/indra/newview/skins/default/xui/pt/panel_progress.xml
+++ b/indra/newview/skins/default/xui/pt/panel_progress.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" ?>
<panel name="login_progress_panel">
+ <layout_panel name="panel_icons"/>
<layout_stack name="vertical_centering"/>
<layout_panel name="panel4"/>
<layout_panel name="center"/>
<layout_stack name="horizontal_centering">
+ <text name="logos_lbl">Usos do Megapahit</text>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
index f3357026d5..28a5142baa 100644
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
@@ -7,7 +7,7 @@
Salvar uma imagem em seu inventário custa L$[UPLOAD_COST]. Para salvar sua imagem como uma textura, selecione um dos formatos quadrados.
</text>
<combo_box label="Resolução" name="texture_size_combo">
- <combo_box.item label="Janela ativa (512x512)" name="CurrentWindow"/>
+ <combo_box.item label="Janela ativa" name="CurrentWindow"/>
<combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/>
<combo_box.item label="Médio (256x256)" name="Medium(256x256)"/>
<combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
index 067e5dbd76..f71bc7cd12 100644
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="Salvar no disco" name="save_to_computer_btn"/>
- <button label="Salvar em inventário (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Salvar em inventário" name="save_to_inventory_btn"/>
<button label="Compartilhar no feed do perfil" name="save_to_profile_btn"/>
<button label="Compartilhar no Facebook" name="send_to_facebook_btn"/>
<button label="Compartilhar no Twitter" name="send_to_twitter_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 3e33744b85..34ddf434f2 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -1,574 +1,1628 @@
<?xml version="1.0" ?>
<strings>
- <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string>
- <string name="SUPPORT_SITE">Portal de Supporte Second Life</string>
- <string name="StartupDetectingHardware">Detectando hardware...</string>
- <string name="StartupLoading">Carregando [APP_NAME]...</string>
- <string name="StartupClearingCache">Limpando o cache...</string>
- <string name="StartupInitializingTextureCache">Iniciando cache de texturas...</string>
- <string name="StartupRequireDriverUpdate">Falha na inicialização dos gráficos. Atualize seu driver gráfico!</string>
- <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>
- <string name="BuildConfig">Configuração do corpo [BUILD_CONFIG]</string>
- <string name="AboutPosition">Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ <string name="CAPITALIZED_APP_NAME">
+ MEGAPAHIT
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal de Supporte Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Detectando hardware...
+ </string>
+ <string name="StartupLoading">
+ Carregando [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Limpando o cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Iniciando cache de texturas...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Falha na inicialização dos gráficos. Atualize seu driver gráfico!
+ </string>
+ <string name="AboutHeader">
+ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </string>
+ <string name="BuildConfig">
+ Configuração do corpo [BUILD_CONFIG]
+ </string>
+ <string name="AboutPosition">
+ Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(coordenadas globais [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]</string>
- <string name="AboutSystem">CPU: [CPU]
+[SERVER_RELEASE_NOTES_URL]
+ </string>
+ <string name="AboutSystem">
+ CPU: [CPU]
Memória: [MEMORY_MB] MBs
Versão OS: [OS_VERSION]
Placa de vídeo: [GRAPHICS_CARD_VENDOR]
-Placa gráfica: [GRAPHICS_CARD]</string>
- <string name="AboutDriver">Versão do driver de vídeo Windows: [GRAPHICS_DRIVER_VERSION]</string>
- <string name="AboutOGL">Versão do OpenGL: [OPENGL_VERSION]</string>
- <string name="AboutSettings">Tamanho da janela: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Placa gráfica: [GRAPHICS_CARD]
+ </string>
+ <string name="AboutDriver">
+ Versão do driver de vídeo Windows: [GRAPHICS_DRIVER_VERSION]
+ </string>
+ <string name="AboutOGL">
+ Versão do OpenGL: [OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Tamanho da janela: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
Ajuste do tamanho da fonte: [FONT_SIZE_ADJUSTMENT]pt
UI Escala: [UI_SCALE]
Estabelecer a distância: [DRAW_DISTANCE]m
Largura da banda: [NET_BANDWITH]kbit/s
LOD fator: [LOD_FACTOR]
Qualidade de renderização: [RENDER_QUALITY]
-Memória de textura: [TEXTURE_MEMORY]MB</string>
- <string name="AboutOSXHiDPI">HiDPI modo de exibição: [HIDPI]</string>
- <string name="AboutLibs">Versão do J2C Decoder: [J2C_VERSION]
+Memória de textura: [TEXTURE_MEMORY]MB
+ </string>
+ <string name="AboutOSXHiDPI">
+ HiDPI modo de exibição: [HIDPI]
+ </string>
+ <string name="AboutLibs">
+ Versão do J2C Decoder: [J2C_VERSION]
Versão do driver de áudio: [AUDIO_DRIVER_VERSION]
[LIBCEF_VERSION]
Versão do LibVLC: [LIBVLC_VERSION]
-Versão do servidor de voz: [VOICE_VERSION]</string>
- <string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>
- <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>
- <string name="ErrorFetchingServerReleaseNotesURL">Erro ao obter URL de notas de versão do servidor.</string>
- <string name="BuildConfiguration">Configuração do corpo</string>
- <string name="ProgressRestoring">Restaurando...</string>
- <string name="ProgressChangingResolution">Alterando a resolução...</string>
- <string name="Fullbright">Fullbright (antigo)</string>
- <string name="LoginInProgress">Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde.</string>
- <string name="LoginInProgressNoFrozen">Logando...</string>
- <string name="LoginAuthenticating">Autenticando</string>
- <string name="LoginMaintenance">Executando manutenção da conta...</string>
- <string name="LoginAttempt">Falha na tentativa anterior de login. Login, tentativa [NUMBER]</string>
- <string name="LoginPrecaching">Carregando mundo...</string>
- <string name="LoginInitializingBrowser">Inicializando navegador embutido...</string>
- <string name="LoginInitializingMultimedia">Inicializando multimídia...</string>
- <string name="LoginInitializingFonts">Carregando fontes...</string>
- <string name="LoginVerifyingCache">Verificando arquivos cache (pode levar de 60-90 segundos)...</string>
- <string name="LoginProcessingResponse">Processando resposta...</string>
- <string name="LoginInitializingWorld">Inicializando mundo...</string>
- <string name="LoginDecodingImages">Decodificando imagens...</string>
- <string name="LoginInitializingQuicktime">Inicializando o QuickTime...</string>
- <string name="LoginQuicktimeNotFound">O QuickTime não foi encontrado - falha ao iniciar.</string>
- <string name="LoginQuicktimeOK">O QuickTime foi inicializado com sucesso.</string>
- <string name="LoginRequestSeedCapGrant">Solicitando recursos da região...</string>
- <string name="LoginRetrySeedCapGrant">Solicitando recursos da região, tentativa [NUMBER]...</string>
- <string name="LoginWaitingForRegionHandshake">Aguardando handshake com a região...</string>
- <string name="LoginConnectingToRegion">Conectando à região...</string>
- <string name="LoginDownloadingClothing">Baixando roupas...</string>
- <string name="InvalidCertificate">O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid.</string>
- <string name="CertInvalidHostname">Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid.</string>
- <string name="CertExpired">O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid.</string>
- <string name="CertKeyUsage">O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid.</string>
- <string name="CertBasicConstraints">A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid.</string>
- <string name="CertInvalidSignature">A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid.</string>
- <string name="LoginFailedNoNetwork">Erro de rede: Falha de conexão: verifique sua conexão à internet.</string>
- <string name="LoginFailedHeader">Falha do login.</string>
- <string name="Quit">Sair</string>
- <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
- <string name="AgniGridLabel">Grade principal do Second Life (Agni)</string>
- <string name="AditiGridLabel">Grade de teste beta do Second Life (Aditi)</string>
- <string name="ViewerDownloadURL">http://secondlife.com/download</string>
- <string name="LoginFailedViewerNotPermitted">O visualizador utilizado já não é compatível com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download
+Versão do servidor de voz: [VOICE_VERSION]
+ </string>
+ <string name="AboutTraffic">
+ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
+ <string name="ErrorFetchingServerReleaseNotesURL">
+ Erro ao obter URL de notas de versão do servidor.
+ </string>
+ <string name="BuildConfiguration">
+ Configuração do corpo
+ </string>
+ <string name="ProgressRestoring">
+ Restaurando...
+ </string>
+ <string name="ProgressChangingResolution">
+ Alterando a resolução...
+ </string>
+ <string name="Fullbright">
+ Fullbright (antigo)
+ </string>
+ <string name="LoginInProgress">
+ Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Logando...
+ </string>
+ <string name="LoginAuthenticating">
+ Autenticando
+ </string>
+ <string name="LoginMaintenance">
+ Executando manutenção da conta...
+ </string>
+ <string name="LoginAttempt">
+ Falha na tentativa anterior de login. Login, tentativa [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Carregando mundo...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Inicializando navegador embutido...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Inicializando multimídia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Carregando fontes...
+ </string>
+ <string name="LoginVerifyingCache">
+ Verificando arquivos cache (pode levar de 60-90 segundos)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Processando resposta...
+ </string>
+ <string name="LoginInitializingWorld">
+ Inicializando mundo...
+ </string>
+ <string name="LoginDecodingImages">
+ Decodificando imagens...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Inicializando o QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ O QuickTime não foi encontrado - falha ao iniciar.
+ </string>
+ <string name="LoginQuicktimeOK">
+ O QuickTime foi inicializado com sucesso.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Solicitando recursos da região...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Solicitando recursos da região, tentativa [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Aguardando handshake com a região...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Conectando à região...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Baixando roupas...
+ </string>
+ <string name="InvalidCertificate">
+ O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertInvalidHostname">
+ Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid.
+ </string>
+ <string name="CertExpired">
+ O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid.
+ </string>
+ <string name="CertKeyUsage">
+ O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertBasicConstraints">
+ A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertInvalidSignature">
+ A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Erro de rede: Falha de conexão: verifique sua conexão à internet.
+ </string>
+ <string name="LoginFailedHeader">
+ Falha do login.
+ </string>
+ <string name="Quit">
+ Sair
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/?sourceid=[sourceid]
+ </string>
+ <string name="AgniGridLabel">
+ Grade principal do Second Life (Agni)
+ </string>
+ <string name="AditiGridLabel">
+ Grade de teste beta do Second Life (Aditi)
+ </string>
+ <string name="ViewerDownloadURL">
+ http://secondlife.com/download
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ O visualizador utilizado já não é compatível com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download
-Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq</string>
- <string name="LoginIntermediateOptionalUpdateAvailable">Existe uma versão atualizada do seu visualizador: [VERSION]</string>
- <string name="LoginFailedRequiredUpdate">Atualização de visualizador obrigatória: [VERSION]</string>
- <string name="LoginFailedAlreadyLoggedIn">Este agente já fez login.</string>
- <string name="LoginFailedAuthenticationFailed">Desculpe! Não foi possível fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.física) * e senha. Verifique também que a tecla Maiúscula está desativada.</string>
- <string name="LoginFailedPasswordChanged">Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.</string>
- <string name="LoginFailedPasswordReset">Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.</string>
- <string name="LoginFailedEmployeesOnly">O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações.</string>
- <string name="LoginFailedPremiumOnly">Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possível para os usuários no mundo virtual.
+Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Existe uma versão atualizada do seu visualizador: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Atualização de visualizador obrigatória: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Este agente já fez login.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Desculpe! Não foi possível fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.física) * e senha. Verifique também que a tecla Maiúscula está desativada.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possível para os usuários no mundo virtual.
-Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo Second Life.</string>
- <string name="LoginFailedComputerProhibited">O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equívoco, contate support@secondlife.com.</string>
- <string name="LoginFailedAcountSuspended">Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08).</string>
- <string name="LoginFailedAccountDisabled">Não é possível concluir a solicitação neste momento.
-Entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com.</string>
- <string name="LoginFailedTransformError">Dados discrepantes detectados durante o login. Contate support@secondlife.com.</string>
- <string name="LoginFailedAccountMaintenance">Sua conta está passando por um breve período de manutenção. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). Se você acredita que houve algum equívoco, contate support@secondlife.com.</string>
- <string name="LoginFailedPendingLogoutFault">Reação à solicitação de saída foi uma falha do simulador.</string>
- <string name="LoginFailedPendingLogout">O sistema o está desconectando no momento.
-Aguarde um minuto antes que tentar logar-se novamente.</string>
- <string name="LoginFailedUnableToCreateSession">Impossível criar sessão válida.</string>
- <string name="LoginFailedUnableToConnectToSimulator">Não foi possível conectar o simulador.</string>
- <string name="LoginFailedRestrictedHours">Sua conta possui acesso ao Second Life das [START] às [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equívoco, contate support@secondlife.com.</string>
- <string name="LoginFailedIncorrectParameters">Parâmetros incorretos. Se você acredita que houve algum equívoco, contate support@secondlife.com.</string>
- <string name="LoginFailedFirstNameNotAlphanumeric">O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.</string>
- <string name="LoginFailedLastNameNotAlphanumeric">O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.</string>
- <string name="LogoutFailedRegionGoingOffline">Região passando para modo offline. Tente novamente dentro de alguns instantes.</string>
- <string name="LogoutFailedAgentNotInRegion">Não há agente na região. Tente novamente dentro de alguns instantes.</string>
- <string name="LogoutFailedPendingLogin">A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes.</string>
- <string name="LogoutFailedLoggingOut">A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.</string>
- <string name="LogoutFailedStillLoggingOut">A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.</string>
- <string name="LogoutSucceeded">A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes.</string>
- <string name="LogoutFailedLogoutBegun">A região inicou o modo offline. Tente novamente dentro de alguns instantes.</string>
- <string name="LoginFailedLoggingOutSession">O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes.</string>
- <string name="AgentLostConnection">Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet.</string>
- <string name="SavingSettings">Salvando configurações...</string>
- <string name="LoggingOut">Saindo...</string>
- <string name="ShuttingDown">Fechando...</string>
- <string name="YouHaveBeenDisconnected">Você foi desconectado da região onde estava.</string>
- <string name="SentToInvalidRegion">Você foi enviado para uma região inválida.</string>
- <string name="TestingDisconnect">Teste de desconexão</string>
- <string name="SocialFacebookConnecting">Conectando ao Facebook...</string>
- <string name="SocialFacebookPosting">Publicando...</string>
- <string name="SocialFacebookDisconnecting">Desconectando do Facebook...</string>
- <string name="SocialFacebookErrorConnecting">Problema ao conectar ao Facebook</string>
- <string name="SocialFacebookErrorPosting">Problema ao publicar no Facebook</string>
- <string name="SocialFacebookErrorDisconnecting">Problema ao desconectar do Facebook</string>
- <string name="SocialFlickrConnecting">Conectando ao Flickr...</string>
- <string name="SocialFlickrPosting">Publicando...</string>
- <string name="SocialFlickrDisconnecting">Desconectando do Flickr...</string>
- <string name="SocialFlickrErrorConnecting">Problema ao conectar ao Flickr</string>
- <string name="SocialFlickrErrorPosting">Problema ao publicar no Flickr</string>
- <string name="SocialFlickrErrorDisconnecting">Problema ao desconectar do Flickr</string>
- <string name="SocialTwitterConnecting">Conectando ao Twitter...</string>
- <string name="SocialTwitterPosting">Publicando...</string>
- <string name="SocialTwitterDisconnecting">Desconectando do Twitter...</string>
- <string name="SocialTwitterErrorConnecting">Problema ao conectar ao Twitter</string>
- <string name="SocialTwitterErrorPosting">Problema ao publicar no Twitter</string>
- <string name="SocialTwitterErrorDisconnecting">Problema ao desconectar do Twitter</string>
- <string name="BlackAndWhite">Preto e branco</string>
- <string name="Colors1970">Cores dos anos 1970</string>
- <string name="Intense">Intenso</string>
- <string name="Newspaper">Retícula</string>
- <string name="Sepia">Sépia</string>
- <string name="Spotlight">Destaque</string>
- <string name="Video">Vídeo</string>
- <string name="Autocontrast">Autocontraste</string>
- <string name="LensFlare">Reflexo de flash</string>
- <string name="Miniature">Miniatura</string>
- <string name="Toycamera">Câmera de brinquedo</string>
- <string name="TooltipPerson">Pessoa</string>
- <string name="TooltipNoName">(sem nome)</string>
- <string name="TooltipOwner">Proprietário:</string>
- <string name="TooltipPublic">Público</string>
- <string name="TooltipIsGroup">(Grupo)</string>
- <string name="TooltipForSaleL$">À venda: L$[AMOUNT]</string>
- <string name="TooltipFlagGroupBuild">Construído por Grupo</string>
- <string name="TooltipFlagNoBuild">Não é permitido construir</string>
- <string name="TooltipFlagNoEdit">Construído por Grupo</string>
- <string name="TooltipFlagNotSafe">Não é seguro</string>
- <string name="TooltipFlagNoFly">Não é permitido voar</string>
- <string name="TooltipFlagGroupScripts">Scripts de Grupo</string>
- <string name="TooltipFlagNoScripts">Não são permitidos scripts</string>
- <string name="TooltipLand">Terreno:</string>
- <string name="TooltipMustSingleDrop">Apenas um item único pode ser arrastado para este local</string>
- <string name="TooltipTooManyWearables">Você não pode usar uma pasta que contenha mais de [AMOUNT] itens. Você pode mudar esse limite em Avançado &gt; Mostrar configurações de depuração &gt; WearFolderLimit.</string>
+Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo Second Life.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08).
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Não é possível concluir a solicitação neste momento.
+Entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com.
+ </string>
+ <string name="LoginFailedTransformError">
+ Dados discrepantes detectados durante o login. Contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Sua conta está passando por um breve período de manutenção. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Reação à solicitação de saída foi uma falha do simulador.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ O sistema o está desconectando no momento.
+Aguarde um minuto antes que tentar logar-se novamente.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Impossível criar sessão válida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Não foi possível conectar o simulador.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Sua conta possui acesso ao Second Life das [START] às [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parâmetros incorretos. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Região passando para modo offline. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Não há agente na região. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutSucceeded">
+ A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ A região inicou o modo offline. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="AgentLostConnection">
+ Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet.
+ </string>
+ <string name="SavingSettings">
+ Salvando configurações...
+ </string>
+ <string name="LoggingOut">
+ Saindo...
+ </string>
+ <string name="ShuttingDown">
+ Fechando...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Você foi desconectado da região onde estava.
+ </string>
+ <string name="SentToInvalidRegion">
+ Você foi enviado para uma região inválida.
+ </string>
+ <string name="TestingDisconnect">
+ Teste de desconexão
+ </string>
+ <string name="SocialFacebookConnecting">
+ Conectando ao Facebook...
+ </string>
+ <string name="SocialFacebookPosting">
+ Publicando...
+ </string>
+ <string name="SocialFacebookDisconnecting">
+ Desconectando do Facebook...
+ </string>
+ <string name="SocialFacebookErrorConnecting">
+ Problema ao conectar ao Facebook
+ </string>
+ <string name="SocialFacebookErrorPosting">
+ Problema ao publicar no Facebook
+ </string>
+ <string name="SocialFacebookErrorDisconnecting">
+ Problema ao desconectar do Facebook
+ </string>
+ <string name="SocialFlickrConnecting">
+ Conectando ao Flickr...
+ </string>
+ <string name="SocialFlickrPosting">
+ Publicando...
+ </string>
+ <string name="SocialFlickrDisconnecting">
+ Desconectando do Flickr...
+ </string>
+ <string name="SocialFlickrErrorConnecting">
+ Problema ao conectar ao Flickr
+ </string>
+ <string name="SocialFlickrErrorPosting">
+ Problema ao publicar no Flickr
+ </string>
+ <string name="SocialFlickrErrorDisconnecting">
+ Problema ao desconectar do Flickr
+ </string>
+ <string name="SocialTwitterConnecting">
+ Conectando ao Twitter...
+ </string>
+ <string name="SocialTwitterPosting">
+ Publicando...
+ </string>
+ <string name="SocialTwitterDisconnecting">
+ Desconectando do Twitter...
+ </string>
+ <string name="SocialTwitterErrorConnecting">
+ Problema ao conectar ao Twitter
+ </string>
+ <string name="SocialTwitterErrorPosting">
+ Problema ao publicar no Twitter
+ </string>
+ <string name="SocialTwitterErrorDisconnecting">
+ Problema ao desconectar do Twitter
+ </string>
+ <string name="BlackAndWhite">
+ Preto e branco
+ </string>
+ <string name="Colors1970">
+ Cores dos anos 1970
+ </string>
+ <string name="Intense">
+ Intenso
+ </string>
+ <string name="Newspaper">
+ Retícula
+ </string>
+ <string name="Sepia">
+ Sépia
+ </string>
+ <string name="Spotlight">
+ Destaque
+ </string>
+ <string name="Video">
+ Vídeo
+ </string>
+ <string name="Autocontrast">
+ Autocontraste
+ </string>
+ <string name="LensFlare">
+ Reflexo de flash
+ </string>
+ <string name="Miniature">
+ Miniatura
+ </string>
+ <string name="Toycamera">
+ Câmera de brinquedo
+ </string>
+ <string name="TooltipPerson">
+ Pessoa
+ </string>
+ <string name="TooltipNoName">
+ (sem nome)
+ </string>
+ <string name="TooltipOwner">
+ Proprietário:
+ </string>
+ <string name="TooltipPublic">
+ Público
+ </string>
+ <string name="TooltipIsGroup">
+ (Grupo)
+ </string>
+ <string name="TooltipForSaleL$">
+ À venda: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Construído por Grupo
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Não é permitido construir
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Construído por Grupo
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Não é seguro
+ </string>
+ <string name="TooltipFlagNoFly">
+ Não é permitido voar
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Scripts de Grupo
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Não são permitidos scripts
+ </string>
+ <string name="TooltipLand">
+ Terreno:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Apenas um item único pode ser arrastado para este local
+ </string>
+ <string name="TooltipTooManyWearables">
+ Você não pode usar uma pasta que contenha mais de [AMOUNT] itens. Você pode mudar esse limite em Avançado &gt; Mostrar configurações de depuração &gt; WearFolderLimit.
+ </string>
<string name="TooltipPrice" value="L$[AMOUNT]"/>
- <string name="TooltipSLIcon">Isso contém um link para uma página no domínio oficial do SecondLife.com ou LindenLab.com.</string>
- <string name="TooltipOutboxDragToWorld">Não é possível fazer rez de itens da pasta Listagens do Marketplace</string>
- <string name="TooltipOutboxWorn">Não é possível colocar itens que você estiver usando na pasta Listagens do Marketplace</string>
- <string name="TooltipOutboxFolderLevels">A profundidade das pastas aninhadas excede [AMOUNT]. Diminua a profundidade das pastas dentro de pastas. Agrupe os itens se necessário.</string>
- <string name="TooltipOutboxTooManyFolders">O número de subpastas excede [AMOUNT]. Diminua a o número de pastas em sua listagem. Agrupe os itens se necessário.</string>
- <string name="TooltipOutboxTooManyObjects">O número de itens excede [AMOUNT]. Para vender mais que [AMOUNT] itens em uma listagem, você deve agrupar alguns deles.</string>
- <string name="TooltipOutboxTooManyStockItems">O número de itens de estoque excede [AMOUNT].</string>
- <string name="TooltipOutboxCannotDropOnRoot">Você pode soltar somente itens ou pastas na aba TUDO ou NÃO ASSOCIADOS. Selecione uma dessas abas e mova seus itens ou pastas novamente.</string>
- <string name="TooltipOutboxNoTransfer">Um ou mais objetos não podem ser vendidos ou transferidos</string>
- <string name="TooltipOutboxNotInInventory">É possível colocar somente itens do seu inventário no Marketplace</string>
- <string name="TooltipOutboxLinked">Não é possível colocar itens ou pastas vinculadas no Marketplace</string>
- <string name="TooltipOutboxCallingCard">Não é possível colocar cartões de visitas no Marketplace</string>
- <string name="TooltipOutboxDragActive">Não é possível mover uma listagem publicada</string>
- <string name="TooltipOutboxCannotMoveRoot">Não é possível mover a pasta raiz das listagens do Marketplace</string>
- <string name="TooltipOutboxMixedStock">Todos os itens em uma pasta de estoque têm o mesmo tipo e permissão</string>
- <string name="TooltipDragOntoOwnChild">Não é possível mover uma pasta para seu filho</string>
- <string name="TooltipDragOntoSelf">Não é possível mover uma pasta para dentro dela mesma</string>
- <string name="TooltipHttpUrl">Clique para ver a página web</string>
- <string name="TooltipSLURL">Clique para ver os dados desta localização</string>
- <string name="TooltipAgentUrl">Clique para ver o perfil deste residente</string>
- <string name="TooltipAgentInspect">Saiba mais sobre este residente</string>
- <string name="TooltipAgentMute">Clique para silenciar este residente</string>
- <string name="TooltipAgentUnmute">Clique para desfazer silenciar neste residente</string>
- <string name="TooltipAgentIM">Clique para enviar uma MI para este residente</string>
- <string name="TooltipAgentPay">Clique para pagar este residente</string>
- <string name="TooltipAgentOfferTeleport">Clique para enviar um pedido de amizade a este residente</string>
- <string name="TooltipAgentRequestFriend">Clique para enviar um pedido de amizade a este residente</string>
- <string name="TooltipGroupUrl">Clique para ver a descrição deste Grupo</string>
- <string name="TooltipEventUrl">Clique para ver a descrição deste evento</string>
- <string name="TooltipClassifiedUrl">Clique para ver este anúncio</string>
- <string name="TooltipParcelUrl">Clique para ver a descrição desta parcela</string>
- <string name="TooltipTeleportUrl">Clique para teletransportar para esta localização</string>
- <string name="TooltipObjectIMUrl">Clique para ver a descrição deste objeto</string>
- <string name="TooltipMapUrl">Clique para ver esta localização no mapa</string>
- <string name="TooltipSLAPP">Clique para ativar no secondlife:// comando</string>
+ <string name="TooltipSLIcon">
+ Isso contém um link para uma página no domínio oficial do SecondLife.com ou LindenLab.com.
+ </string>
+ <string name="TooltipOutboxDragToWorld">
+ Não é possível fazer rez de itens da pasta Listagens do Marketplace
+ </string>
+ <string name="TooltipOutboxWorn">
+ Não é possível colocar itens que você estiver usando na pasta Listagens do Marketplace
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ A profundidade das pastas aninhadas excede [AMOUNT]. Diminua a profundidade das pastas dentro de pastas. Agrupe os itens se necessário.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ O número de subpastas excede [AMOUNT]. Diminua a o número de pastas em sua listagem. Agrupe os itens se necessário.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ O número de itens excede [AMOUNT]. Para vender mais que [AMOUNT] itens em uma listagem, você deve agrupar alguns deles.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ O número de itens de estoque excede [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Você pode soltar somente itens ou pastas na aba TUDO ou NÃO ASSOCIADOS. Selecione uma dessas abas e mova seus itens ou pastas novamente.
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Um ou mais objetos não podem ser vendidos ou transferidos
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ É possível colocar somente itens do seu inventário no Marketplace
+ </string>
+ <string name="TooltipOutboxLinked">
+ Não é possível colocar itens ou pastas vinculadas no Marketplace
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Não é possível colocar cartões de visitas no Marketplace
+ </string>
+ <string name="TooltipOutboxDragActive">
+ Não é possível mover uma listagem publicada
+ </string>
+ <string name="TooltipOutboxCannotMoveRoot">
+ Não é possível mover a pasta raiz das listagens do Marketplace
+ </string>
+ <string name="TooltipOutboxMixedStock">
+ Todos os itens em uma pasta de estoque têm o mesmo tipo e permissão
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Não é possível mover uma pasta para seu filho
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Não é possível mover uma pasta para dentro dela mesma
+ </string>
+ <string name="TooltipHttpUrl">
+ Clique para ver a página web
+ </string>
+ <string name="TooltipSLURL">
+ Clique para ver os dados desta localização
+ </string>
+ <string name="TooltipAgentUrl">
+ Clique para ver o perfil deste residente
+ </string>
+ <string name="TooltipAgentInspect">
+ Saiba mais sobre este residente
+ </string>
+ <string name="TooltipAgentMute">
+ Clique para silenciar este residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Clique para desfazer silenciar neste residente
+ </string>
+ <string name="TooltipAgentIM">
+ Clique para enviar uma MI para este residente
+ </string>
+ <string name="TooltipAgentPay">
+ Clique para pagar este residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Clique para enviar um pedido de amizade a este residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Clique para enviar um pedido de amizade a este residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Clique para ver a descrição deste Grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Clique para ver a descrição deste evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Clique para ver este anúncio
+ </string>
+ <string name="TooltipParcelUrl">
+ Clique para ver a descrição desta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Clique para teletransportar para esta localização
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Clique para ver a descrição deste objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Clique para ver esta localização no mapa
+ </string>
+ <string name="TooltipSLAPP">
+ Clique para ativar no secondlife:// comando
+ </string>
<string name="CurrentURL" value="URL atual: [CurrentURL]"/>
- <string name="TooltipEmail">Clique para escrever um email</string>
- <string name="SLurlLabelTeleport">Teletransportar para</string>
- <string name="SLurlLabelShowOnMap">Mostrar no mapa para</string>
- <string name="SLappAgentMute">Silenciar</string>
- <string name="SLappAgentUnmute">Desfazer silenciar</string>
- <string name="SLappAgentIM">MI</string>
- <string name="SLappAgentPay">Pagar</string>
- <string name="SLappAgentOfferTeleport">Oferecer teletransporte para</string>
- <string name="SLappAgentRequestFriend">Pedido de amizade</string>
- <string name="SLappAgentRemoveFriend">Remoção de amigo</string>
- <string name="BUTTON_CLOSE_DARWIN">Fechar (⌘W)</string>
- <string name="BUTTON_CLOSE_WIN">Fechar (Ctrl+W)</string>
- <string name="BUTTON_CLOSE_CHROME">Fechar</string>
- <string name="BUTTON_RESTORE">Restaurar</string>
- <string name="BUTTON_MINIMIZE">Minimizar</string>
- <string name="BUTTON_TEAR_OFF">Separar-se da janela</string>
- <string name="BUTTON_DOCK">conectar-se à barra</string>
- <string name="BUTTON_HELP">Mostrar ajuda</string>
- <string name="TooltipNotecardNotAllowedTypeDrop">Os itens deste tipo não podem ser anexados
-às anotações desta região.</string>
- <string name="TooltipNotecardOwnerRestrictedDrop">Somente itens com permissões irrestritas
+ <string name="TooltipEmail">
+ Clique para escrever um email
+ </string>
+ <string name="SLurlLabelTeleport">
+ Teletransportar para
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrar no mapa para
+ </string>
+ <string name="SLappAgentMute">
+ Silenciar
+ </string>
+ <string name="SLappAgentUnmute">
+ Desfazer silenciar
+ </string>
+ <string name="SLappAgentIM">
+ MI
+ </string>
+ <string name="SLappAgentPay">
+ Pagar
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Oferecer teletransporte para
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Pedido de amizade
+ </string>
+ <string name="SLappAgentRemoveFriend">
+ Remoção de amigo
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Fechar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Fechar (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Fechar
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restaurar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar-se da janela
+ </string>
+ <string name="BUTTON_DOCK">
+ conectar-se à barra
+ </string>
+ <string name="BUTTON_HELP">
+ Mostrar ajuda
+ </string>
+ <string name="TooltipNotecardNotAllowedTypeDrop">
+ Os itens deste tipo não podem ser anexados
+às anotações desta região.
+ </string>
+ <string name="TooltipNotecardOwnerRestrictedDrop">
+ Somente itens com permissões irrestritas
do 'próximo proprietário’ pode
-ser anexado às anotações.</string>
- <string name="Searching">Buscando...</string>
- <string name="NoneFound">Não encontrado.</string>
- <string name="RetrievingData">Buscando...</string>
- <string name="ReleaseNotes">Notas de versão</string>
- <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string>
- <string name="LoadingData">Carregando...</string>
- <string name="AvatarNameNobody">(ninguém)</string>
- <string name="AvatarNameWaiting">(aguardando)</string>
- <string name="GroupNameNone">(nenhum)</string>
- <string name="AssetErrorNone">Nenhum erro</string>
- <string name="AssetErrorRequestFailed">Item pedido falhou</string>
- <string name="AssetErrorNonexistentFile">Item pedido: arquivo inexistente</string>
- <string name="AssetErrorNotInDatabase">Item pedido: item não encontrado na base de dados.</string>
- <string name="AssetErrorEOF">Fim do arquivo</string>
- <string name="AssetErrorCannotOpenFile">Não é possível abrir arquivo</string>
- <string name="AssetErrorFileNotFound">Arquivo não encontrado</string>
- <string name="AssetErrorTCPTimeout">Tempo de transferência de arquivo expirado</string>
- <string name="AssetErrorCircuitGone">Circuito caiu</string>
- <string name="AssetErrorPriceMismatch">Visualizador e servidor não concordam no preço</string>
- <string name="AssetErrorUnknownStatus">Status desconhecido</string>
- <string name="AssetUploadServerUnreacheble">Serviço não disponível.</string>
- <string name="AssetUploadServerDifficulties">O servidor está enfrentando dificuldades inesperadas.</string>
- <string name="AssetUploadServerUnavaliable">Serviço não disponível ou o tempo final para upload foi atingido.</string>
- <string name="AssetUploadRequestInvalid">Erro na solicitação de upload. Acesso
-http://secondlife.com/support para ajuda ao resolver este problema.</string>
- <string name="SettingValidationError">Falha na validação para importação das configurações [NAME]</string>
- <string name="SettingImportFileError">Não foi possível abrir o arquivo [FILE]</string>
- <string name="SettingParseFileError">Não foi possível abrir o arquivo [FILE]</string>
- <string name="SettingTranslateError">Não foi possível traduzir o vento antigo [NAME]</string>
- <string name="texture">textura</string>
- <string name="sound">som</string>
- <string name="calling card">cartão de visitas</string>
- <string name="landmark">landmark</string>
- <string name="legacy script">script obsoleto</string>
- <string name="clothing">roupas</string>
- <string name="object">objeto</string>
- <string name="note card">anotação</string>
- <string name="folder">pasta</string>
- <string name="root">raiz</string>
- <string name="lsl2 script">script LSL2</string>
- <string name="lsl bytecode">bytecode LSL</string>
- <string name="tga texture">textura tga</string>
- <string name="body part">parte do corpo</string>
- <string name="snapshot">fotografia</string>
- <string name="lost and found">Achados e Perdidos</string>
- <string name="targa image">imagem targa</string>
- <string name="trash">Lixo</string>
- <string name="jpeg image">imagem jpeg</string>
- <string name="animation">animação</string>
- <string name="gesture">gesto</string>
- <string name="simstate">simstate</string>
- <string name="favorite">favorito</string>
- <string name="symbolic link">link</string>
- <string name="symbolic folder link">link da pasta</string>
- <string name="settings blob">configurações</string>
- <string name="mesh">mesh</string>
- <string name="AvatarEditingAppearance">(Edição Aparência)</string>
- <string name="AvatarAway">Distante</string>
- <string name="AvatarDoNotDisturb">Não perturbe</string>
- <string name="AvatarMuted">Mudo</string>
- <string name="anim_express_afraid">Temeroso</string>
- <string name="anim_express_anger">Bravo</string>
- <string name="anim_away">Distante</string>
- <string name="anim_backflip">Virar para trás</string>
- <string name="anim_express_laugh">Rir segurando a barriga</string>
- <string name="anim_express_toothsmile">Sorriso largo</string>
- <string name="anim_blowkiss">Mandar beijo</string>
- <string name="anim_express_bored">Entediado</string>
- <string name="anim_bow">Reverência</string>
- <string name="anim_clap">Aplaudir</string>
- <string name="anim_courtbow">Saudação formal</string>
- <string name="anim_express_cry">Chorar</string>
- <string name="anim_dance1">Dança 1</string>
- <string name="anim_dance2">Dança 2</string>
- <string name="anim_dance3">Dança 3</string>
- <string name="anim_dance4">Dança 4</string>
- <string name="anim_dance5">Dança 5</string>
- <string name="anim_dance6">Dança 6</string>
- <string name="anim_dance7">Dança 7</string>
- <string name="anim_dance8">Dança 8</string>
- <string name="anim_express_disdain">Desdém</string>
- <string name="anim_drink">Beber</string>
- <string name="anim_express_embarrased">Envergonhado</string>
- <string name="anim_angry_fingerwag">Negar com o dedo.</string>
- <string name="anim_fist_pump">Vibrar provocando</string>
- <string name="anim_yoga_float">Levitar Yoga</string>
- <string name="anim_express_frown">Careta</string>
- <string name="anim_impatient">Impaciente</string>
- <string name="anim_jumpforjoy">Pular de alegria</string>
- <string name="anim_kissmybutt">Beije meu bumbum</string>
- <string name="anim_express_kiss">Beijar</string>
- <string name="anim_laugh_short">Rir</string>
- <string name="anim_musclebeach">Exibir músculos</string>
- <string name="anim_no_unhappy">Não (descontente)</string>
- <string name="anim_no_head">Não</string>
- <string name="anim_nyanya">Nya-nya-nya</string>
- <string name="anim_punch_onetwo">Soco um-dois</string>
- <string name="anim_express_open_mouth">Abrir a boca</string>
- <string name="anim_peace">Paz</string>
- <string name="anim_point_you">Apontar para o outro</string>
- <string name="anim_point_me">Apontar para si</string>
- <string name="anim_punch_l">Soco esquerdo</string>
- <string name="anim_punch_r">Soco direito</string>
- <string name="anim_rps_countdown">RPS contar</string>
- <string name="anim_rps_paper">RPS papel</string>
- <string name="anim_rps_rock">RPS pedra</string>
- <string name="anim_rps_scissors">RPS tesoura</string>
- <string name="anim_express_repulsed">Repulsa</string>
- <string name="anim_kick_roundhouse_r">Chute giratório</string>
- <string name="anim_express_sad">Triste</string>
- <string name="anim_salute">Saúde</string>
- <string name="anim_shout">Gritar</string>
- <string name="anim_express_shrug">Encolher ombros</string>
- <string name="anim_express_smile">Sorrir</string>
- <string name="anim_smoke_idle">Fumar à toa</string>
- <string name="anim_smoke_inhale">Inalar fumaça</string>
- <string name="anim_smoke_throw_down">Expelir fumaça</string>
- <string name="anim_express_surprise">Surpresa</string>
- <string name="anim_sword_strike_r">Golpe de espada</string>
- <string name="anim_angry_tantrum">Enraivecer</string>
- <string name="anim_express_tongue_out">Mostrar a língua</string>
- <string name="anim_hello">Onda</string>
- <string name="anim_whisper">Sussurrar</string>
- <string name="anim_whistle">Assobiar</string>
- <string name="anim_express_wink">Piscar</string>
- <string name="anim_wink_hollywood">Piscar (Hollywood)</string>
- <string name="anim_express_worry">Preocupar-se</string>
- <string name="anim_yes_happy">Sim (Feliz)</string>
- <string name="anim_yes_head">Sim</string>
- <string name="multiple_textures">Múltiplo</string>
- <string name="use_texture">Usar textura</string>
- <string name="manip_hint1">Mova o cursor do mouse sobre a regra</string>
- <string name="manip_hint2">para ajustar à grade</string>
- <string name="texture_loading">Carregando...</string>
- <string name="worldmap_offline">Offline</string>
- <string name="worldmap_item_tooltip_format">L$[PRICE] por [AREA] m²</string>
- <string name="worldmap_results_none_found">Nenhum encontrado.</string>
- <string name="Ok">OK</string>
- <string name="Premature end of file">término prematuro do arquivo</string>
- <string name="ST_NO_JOINT">Não é possível encontrar a raiz (ROOT) ou junção (JOINT).</string>
- <string name="NearbyChatTitle">Bate-papo local</string>
- <string name="NearbyChatLabel">(Bate-papo local)</string>
- <string name="whisper">sussurra:</string>
- <string name="shout">grita:</string>
- <string name="ringing">Conectando à conversa de voz no mundo</string>
- <string name="connected">Conectado</string>
- <string name="unavailable">Voz não disponível na sua localização atual</string>
- <string name="hang_up">Desconectado da conversa de Voz no mundo</string>
- <string name="reconnect_nearby">Agora você será reconectado ao bate-papo local.</string>
- <string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].</string>
- <string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].</string>
- <string name="AdditionalPermissionsRequestHeader">Se você permitir acesso à sua conta, o objeto também poderá:</string>
- <string name="ScriptTakeMoney">Tomar linden dólares (L$) de você</string>
- <string name="ActOnControlInputs">Atue nas suas entradas de controle</string>
- <string name="RemapControlInputs">Remapeie suas entradas de controle</string>
- <string name="AnimateYourAvatar">Faça uma animação para o seu avatar</string>
- <string name="AttachToYourAvatar">Anexe ao seu avatar</string>
- <string name="ReleaseOwnership">Libere a propriedade e torne-a pública</string>
- <string name="LinkAndDelink">Una e desuna de outros objetos</string>
- <string name="AddAndRemoveJoints">Adicione e remova junções com outros objetos</string>
- <string name="ChangePermissions">Modifique as permissões</string>
- <string name="TrackYourCamera">Acompanhe sua câmera</string>
- <string name="ControlYourCamera">Controle sua camera</string>
- <string name="TeleportYourAgent">Teletransportá-lo</string>
- <string name="ForceSitAvatar">Forçar o avatar a sentar</string>
- <string name="ChangeEnvSettings">Alterar sua configurações de ambiente</string>
- <string name="AgentNameSubst">(Você)</string>
+ser anexado às anotações.
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ Não encontrado.
+ </string>
+ <string name="RetrievingData">
+ Buscando...
+ </string>
+ <string name="ReleaseNotes">
+ Notas de versão
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ https://megapahit.net/
+ </string>
+ <string name="LoadingData">
+ Carregando...
+ </string>
+ <string name="AvatarNameNobody">
+ (ninguém)
+ </string>
+ <string name="AvatarNameWaiting">
+ (aguardando)
+ </string>
+ <string name="GroupNameNone">
+ (nenhum)
+ </string>
+ <string name="AssetErrorNone">
+ Nenhum erro
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Item pedido falhou
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Item pedido: arquivo inexistente
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Item pedido: item não encontrado na base de dados.
+ </string>
+ <string name="AssetErrorEOF">
+ Fim do arquivo
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Não é possível abrir arquivo
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Arquivo não encontrado
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tempo de transferência de arquivo expirado
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuito caiu
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Visualizador e servidor não concordam no preço
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Status desconhecido
+ </string>
+ <string name="AssetUploadServerUnreacheble">
+ Serviço não disponível.
+ </string>
+ <string name="AssetUploadServerDifficulties">
+ O servidor está enfrentando dificuldades inesperadas.
+ </string>
+ <string name="AssetUploadServerUnavaliable">
+ Serviço não disponível ou o tempo final para upload foi atingido.
+ </string>
+ <string name="AssetUploadRequestInvalid">
+ Erro na solicitação de upload. Acesso
+http://secondlife.com/support para ajuda ao resolver este problema.
+ </string>
+ <string name="SettingValidationError">
+ Falha na validação para importação das configurações [NAME]
+ </string>
+ <string name="SettingImportFileError">
+ Não foi possível abrir o arquivo [FILE]
+ </string>
+ <string name="SettingParseFileError">
+ Não foi possível abrir o arquivo [FILE]
+ </string>
+ <string name="SettingTranslateError">
+ Não foi possível traduzir o vento antigo [NAME]
+ </string>
+ <string name="texture">
+ textura
+ </string>
+ <string name="sound">
+ som
+ </string>
+ <string name="calling card">
+ cartão de visitas
+ </string>
+ <string name="landmark">
+ landmark
+ </string>
+ <string name="legacy script">
+ script obsoleto
+ </string>
+ <string name="clothing">
+ roupas
+ </string>
+ <string name="object">
+ objeto
+ </string>
+ <string name="note card">
+ anotação
+ </string>
+ <string name="folder">
+ pasta
+ </string>
+ <string name="root">
+ raiz
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ textura tga
+ </string>
+ <string name="body part">
+ parte do corpo
+ </string>
+ <string name="snapshot">
+ fotografia
+ </string>
+ <string name="lost and found">
+ Achados e Perdidos
+ </string>
+ <string name="targa image">
+ imagem targa
+ </string>
+ <string name="trash">
+ Lixo
+ </string>
+ <string name="jpeg image">
+ imagem jpeg
+ </string>
+ <string name="animation">
+ animação
+ </string>
+ <string name="gesture">
+ gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorito
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ link da pasta
+ </string>
+ <string name="settings blob">
+ configurações
+ </string>
+ <string name="mesh">
+ mesh
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Edição Aparência)
+ </string>
+ <string name="AvatarAway">
+ Distante
+ </string>
+ <string name="AvatarDoNotDisturb">
+ Não perturbe
+ </string>
+ <string name="AvatarMuted">
+ Mudo
+ </string>
+ <string name="anim_express_afraid">
+ Temeroso
+ </string>
+ <string name="anim_express_anger">
+ Bravo
+ </string>
+ <string name="anim_away">
+ Distante
+ </string>
+ <string name="anim_backflip">
+ Virar para trás
+ </string>
+ <string name="anim_express_laugh">
+ Rir segurando a barriga
+ </string>
+ <string name="anim_express_toothsmile">
+ Sorriso largo
+ </string>
+ <string name="anim_blowkiss">
+ Mandar beijo
+ </string>
+ <string name="anim_express_bored">
+ Entediado
+ </string>
+ <string name="anim_bow">
+ Reverência
+ </string>
+ <string name="anim_clap">
+ Aplaudir
+ </string>
+ <string name="anim_courtbow">
+ Saudação formal
+ </string>
+ <string name="anim_express_cry">
+ Chorar
+ </string>
+ <string name="anim_dance1">
+ Dança 1
+ </string>
+ <string name="anim_dance2">
+ Dança 2
+ </string>
+ <string name="anim_dance3">
+ Dança 3
+ </string>
+ <string name="anim_dance4">
+ Dança 4
+ </string>
+ <string name="anim_dance5">
+ Dança 5
+ </string>
+ <string name="anim_dance6">
+ Dança 6
+ </string>
+ <string name="anim_dance7">
+ Dança 7
+ </string>
+ <string name="anim_dance8">
+ Dança 8
+ </string>
+ <string name="anim_express_disdain">
+ Desdém
+ </string>
+ <string name="anim_drink">
+ Beber
+ </string>
+ <string name="anim_express_embarrased">
+ Envergonhado
+ </string>
+ <string name="anim_angry_fingerwag">
+ Negar com o dedo.
+ </string>
+ <string name="anim_fist_pump">
+ Vibrar provocando
+ </string>
+ <string name="anim_yoga_float">
+ Levitar Yoga
+ </string>
+ <string name="anim_express_frown">
+ Careta
+ </string>
+ <string name="anim_impatient">
+ Impaciente
+ </string>
+ <string name="anim_jumpforjoy">
+ Pular de alegria
+ </string>
+ <string name="anim_kissmybutt">
+ Beije meu bumbum
+ </string>
+ <string name="anim_express_kiss">
+ Beijar
+ </string>
+ <string name="anim_laugh_short">
+ Rir
+ </string>
+ <string name="anim_musclebeach">
+ Exibir músculos
+ </string>
+ <string name="anim_no_unhappy">
+ Não (descontente)
+ </string>
+ <string name="anim_no_head">
+ Não
+ </string>
+ <string name="anim_nyanya">
+ Nya-nya-nya
+ </string>
+ <string name="anim_punch_onetwo">
+ Soco um-dois
+ </string>
+ <string name="anim_express_open_mouth">
+ Abrir a boca
+ </string>
+ <string name="anim_peace">
+ Paz
+ </string>
+ <string name="anim_point_you">
+ Apontar para o outro
+ </string>
+ <string name="anim_point_me">
+ Apontar para si
+ </string>
+ <string name="anim_punch_l">
+ Soco esquerdo
+ </string>
+ <string name="anim_punch_r">
+ Soco direito
+ </string>
+ <string name="anim_rps_countdown">
+ RPS contar
+ </string>
+ <string name="anim_rps_paper">
+ RPS papel
+ </string>
+ <string name="anim_rps_rock">
+ RPS pedra
+ </string>
+ <string name="anim_rps_scissors">
+ RPS tesoura
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsa
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Chute giratório
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Saúde
+ </string>
+ <string name="anim_shout">
+ Gritar
+ </string>
+ <string name="anim_express_shrug">
+ Encolher ombros
+ </string>
+ <string name="anim_express_smile">
+ Sorrir
+ </string>
+ <string name="anim_smoke_idle">
+ Fumar à toa
+ </string>
+ <string name="anim_smoke_inhale">
+ Inalar fumaça
+ </string>
+ <string name="anim_smoke_throw_down">
+ Expelir fumaça
+ </string>
+ <string name="anim_express_surprise">
+ Surpresa
+ </string>
+ <string name="anim_sword_strike_r">
+ Golpe de espada
+ </string>
+ <string name="anim_angry_tantrum">
+ Enraivecer
+ </string>
+ <string name="anim_express_tongue_out">
+ Mostrar a língua
+ </string>
+ <string name="anim_hello">
+ Onda
+ </string>
+ <string name="anim_whisper">
+ Sussurrar
+ </string>
+ <string name="anim_whistle">
+ Assobiar
+ </string>
+ <string name="anim_express_wink">
+ Piscar
+ </string>
+ <string name="anim_wink_hollywood">
+ Piscar (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Preocupar-se
+ </string>
+ <string name="anim_yes_happy">
+ Sim (Feliz)
+ </string>
+ <string name="anim_yes_head">
+ Sim
+ </string>
+ <string name="multiple_textures">
+ Múltiplo
+ </string>
+ <string name="use_texture">
+ Usar textura
+ </string>
+ <string name="manip_hint1">
+ Mova o cursor do mouse sobre a regra
+ </string>
+ <string name="manip_hint2">
+ para ajustar à grade
+ </string>
+ <string name="texture_loading">
+ Carregando...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ L$[PRICE] por [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ Nenhum encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ término prematuro do arquivo
+ </string>
+ <string name="ST_NO_JOINT">
+ Não é possível encontrar a raiz (ROOT) ou junção (JOINT).
+ </string>
+ <string name="NearbyChatTitle">
+ Bate-papo local
+ </string>
+ <string name="NearbyChatLabel">
+ (Bate-papo local)
+ </string>
+ <string name="whisper">
+ sussurra:
+ </string>
+ <string name="shout">
+ grita:
+ </string>
+ <string name="ringing">
+ Conectando à conversa de voz no mundo
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ Voz não disponível na sua localização atual
+ </string>
+ <string name="hang_up">
+ Desconectado da conversa de Voz no mundo
+ </string>
+ <string name="reconnect_nearby">
+ Agora você será reconectado ao bate-papo local.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].
+ </string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Se você permitir acesso à sua conta, o objeto também poderá:
+ </string>
+ <string name="ScriptTakeMoney">
+ Tomar linden dólares (L$) de você
+ </string>
+ <string name="ActOnControlInputs">
+ Atue nas suas entradas de controle
+ </string>
+ <string name="RemapControlInputs">
+ Remapeie suas entradas de controle
+ </string>
+ <string name="AnimateYourAvatar">
+ Faça uma animação para o seu avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexe ao seu avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Libere a propriedade e torne-a pública
+ </string>
+ <string name="LinkAndDelink">
+ Una e desuna de outros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Adicione e remova junções com outros objetos
+ </string>
+ <string name="ChangePermissions">
+ Modifique as permissões
+ </string>
+ <string name="TrackYourCamera">
+ Acompanhe sua câmera
+ </string>
+ <string name="ControlYourCamera">
+ Controle sua camera
+ </string>
+ <string name="TeleportYourAgent">
+ Teletransportá-lo
+ </string>
+ <string name="ForceSitAvatar">
+ Forçar o avatar a sentar
+ </string>
+ <string name="ChangeEnvSettings">
+ Alterar sua configurações de ambiente
+ </string>
+ <string name="AgentNameSubst">
+ (Você)
+ </string>
<string name="JoinAnExperience"/>
- <string name="SilentlyManageEstateAccess">Suprimir alertas ao gerenciar listas de acesso ao terreno</string>
- <string name="OverrideYourAnimations">Substituir suas animações padrão</string>
- <string name="ScriptReturnObjects">Retornar objetos em seu nome</string>
- <string name="UnknownScriptPermission">(desconhecido)!</string>
- <string name="SIM_ACCESS_PG">Público geral</string>
- <string name="SIM_ACCESS_MATURE">Moderado</string>
- <string name="SIM_ACCESS_ADULT">Adulto</string>
- <string name="SIM_ACCESS_DOWN">Desconectado</string>
- <string name="SIM_ACCESS_MIN">Desconhecido</string>
- <string name="land_type_unknown">(desconhecido)</string>
- <string name="Estate / Full Region">Propriedadade / Região inteira:</string>
- <string name="Estate / Homestead">Imóvel / Homestead</string>
- <string name="Mainland / Homestead">Continente / Homestead</string>
- <string name="Mainland / Full Region">Continente / Região inteira:</string>
- <string name="all_files">Todos os arquivos</string>
- <string name="sound_files">Sons</string>
- <string name="animation_files">Animações</string>
- <string name="image_files">Imagens</string>
- <string name="save_file_verb">Salvar</string>
- <string name="load_file_verb">Carregar</string>
- <string name="targa_image_files">Imagens Targa</string>
- <string name="bitmap_image_files">Imagens Bitmap</string>
- <string name="png_image_files">Imagens PNG</string>
- <string name="save_texture_image_files">Imagens targa ou PNG</string>
- <string name="avi_movie_file">Arquivo de vídeo AVI</string>
- <string name="xaf_animation_file">Arquivo de animação XAF</string>
- <string name="xml_file">Arquivo XML</string>
- <string name="raw_file">Arquivo RAW</string>
- <string name="compressed_image_files">Imagens compactadas</string>
- <string name="load_files">Carregar arquivos</string>
- <string name="choose_the_directory">Selecionar pasta</string>
- <string name="script_files">Scripts</string>
- <string name="dictionary_files">Dicionários</string>
- <string name="shape">Silhueta</string>
- <string name="skin">Pele</string>
- <string name="hair">Cabelo</string>
- <string name="eyes">Olhos</string>
- <string name="shirt">Camisa</string>
- <string name="pants">Calças</string>
- <string name="shoes">Sapatos</string>
- <string name="socks">Meias</string>
- <string name="jacket">Blusa</string>
- <string name="gloves">Luvas</string>
- <string name="undershirt">Camiseta</string>
- <string name="underpants">Roupa de baixo</string>
- <string name="skirt">Saia</string>
- <string name="alpha">Alpha</string>
- <string name="tattoo">Tatuagem</string>
- <string name="universal">Universal</string>
- <string name="physics">Físico</string>
- <string name="invalid">Inválido</string>
- <string name="none">nenhum</string>
- <string name="shirt_not_worn">Camisa não vestida</string>
- <string name="pants_not_worn">Calças não vestidas</string>
- <string name="shoes_not_worn">Sapatos não calçados</string>
- <string name="socks_not_worn">Meias não calçadas</string>
- <string name="jacket_not_worn">Jaqueta não vestida</string>
- <string name="gloves_not_worn">Luvas não calçadas</string>
- <string name="undershirt_not_worn">Camiseta não vestida</string>
- <string name="underpants_not_worn">Roupa de baixo não vestida</string>
- <string name="skirt_not_worn">Saia não vestida</string>
- <string name="alpha_not_worn">Alpha não vestido</string>
- <string name="tattoo_not_worn">Tatuagem não usada</string>
- <string name="universal_not_worn">Universal não usado</string>
- <string name="physics_not_worn">Físico não usado</string>
- <string name="invalid_not_worn">inválido</string>
- <string name="create_new_shape">Criar novo físico</string>
- <string name="create_new_skin">Criar pele nova</string>
- <string name="create_new_hair">Criar cabelo novo</string>
- <string name="create_new_eyes">Criar olhos novos</string>
- <string name="create_new_shirt">Criar camisa nova</string>
- <string name="create_new_pants">Criar calças novas</string>
- <string name="create_new_shoes">Criar sapatos novos</string>
- <string name="create_new_socks">Criar meias novas</string>
- <string name="create_new_jacket">Criar jaqueta nova</string>
- <string name="create_new_gloves">Criar luvas novas</string>
- <string name="create_new_undershirt">Criar camiseta nova</string>
- <string name="create_new_underpants">Criar roupa de baixo nova</string>
- <string name="create_new_skirt">Criar saia nova</string>
- <string name="create_new_alpha">Criar Alpha novo</string>
- <string name="create_new_tattoo">Criar nova tatuagem</string>
- <string name="create_new_universal">Criar um novo universal</string>
- <string name="create_new_physics">Criar novo físico</string>
- <string name="create_new_invalid">inválido</string>
- <string name="NewWearable">Novo [WEARABLE_ITEM]</string>
- <string name="next">Próximo</string>
- <string name="ok">OK</string>
- <string name="GroupNotifyGroupNotice">Anúncio de grupo</string>
- <string name="GroupNotifyGroupNotices">Anúncios do grupo</string>
- <string name="GroupNotifySentBy">Enviado por</string>
- <string name="GroupNotifyAttached">Anexo:</string>
- <string name="GroupNotifyViewPastNotices">Ver últimos anúncios ou optar por não receber essas mensagens aqui.</string>
- <string name="GroupNotifyOpenAttachment">Abrir anexo</string>
- <string name="GroupNotifySaveAttachment">Salvar anexo</string>
- <string name="TeleportOffer">Oferta de teletransporte</string>
- <string name="StartUpNotifications">Novas notificações chegaram enquanto você estava fora...</string>
- <string name="OverflowInfoChannelString">Você tem mais [%d] notificações</string>
- <string name="BodyPartsRightArm">Braço direito</string>
- <string name="BodyPartsHead">Cabeça</string>
- <string name="BodyPartsLeftArm">Braço esquerdo</string>
- <string name="BodyPartsLeftLeg">Perna esquerda</string>
- <string name="BodyPartsTorso">Tronco</string>
- <string name="BodyPartsRightLeg">Perna direita</string>
- <string name="BodyPartsEnhancedSkeleton">Esqueleto aprimorado</string>
- <string name="GraphicsQualityLow">Baixo</string>
- <string name="GraphicsQualityMid">Meio</string>
- <string name="GraphicsQualityHigh">Alto</string>
- <string name="LeaveMouselook">Pressione ESC para retornar para visão do mundo</string>
- <string name="InventoryNoMatchingItems">Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search].</string>
- <string name="InventoryNoMatchingRecentItems">Não encontrou o que procura? Tente [secondlife:///app/inventory/filters Show filters].</string>
- <string name="PlacesNoMatchingItems">Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search].</string>
- <string name="FavoritesNoMatchingItems">Arraste um marco para adicioná-lo aos seus favoritos.</string>
- <string name="MarketplaceNoMatchingItems">Nenhum item correspondente encontrado. Verifique a ortografia de sua cadeia de pesquisa e tente novamente.</string>
- <string name="InventoryNoTexture">Você não possui uma cópia desta textura no seu inventário</string>
- <string name="InventoryInboxNoItems">Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.</string>
- <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
- <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string>
- <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
- <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
- <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
- <string name="InventoryPlayAnimationTooltip">Abrir a janela com as opções do Jogo.</string>
- <string name="InventoryPlayGestureTooltip">Executar o gesto selecionado no mundo.</string>
- <string name="InventoryPlaySoundTooltip">Abrir a janela com as opções do Jogo.</string>
- <string name="InventoryOutboxNotMerchantTitle">Qualquer um pode vender itens no Mercado.</string>
+ <string name="SilentlyManageEstateAccess">
+ Suprimir alertas ao gerenciar listas de acesso ao terreno
+ </string>
+ <string name="OverrideYourAnimations">
+ Substituir suas animações padrão
+ </string>
+ <string name="ScriptReturnObjects">
+ Retornar objetos em seu nome
+ </string>
+ <string name="UnknownScriptPermission">
+ (desconhecido)!
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Público geral
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderado
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulto
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Desconectado
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Desconhecido
+ </string>
+ <string name="land_type_unknown">
+ (desconhecido)
+ </string>
+ <string name="Estate / Full Region">
+ Propriedadade / Região inteira:
+ </string>
+ <string name="Estate / Homestead">
+ Imóvel / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Região inteira:
+ </string>
+ <string name="all_files">
+ Todos os arquivos
+ </string>
+ <string name="sound_files">
+ Sons
+ </string>
+ <string name="animation_files">
+ Animações
+ </string>
+ <string name="image_files">
+ Imagens
+ </string>
+ <string name="save_file_verb">
+ Salvar
+ </string>
+ <string name="load_file_verb">
+ Carregar
+ </string>
+ <string name="targa_image_files">
+ Imagens Targa
+ </string>
+ <string name="bitmap_image_files">
+ Imagens Bitmap
+ </string>
+ <string name="png_image_files">
+ Imagens PNG
+ </string>
+ <string name="save_texture_image_files">
+ Imagens targa ou PNG
+ </string>
+ <string name="avi_movie_file">
+ Arquivo de vídeo AVI
+ </string>
+ <string name="xaf_animation_file">
+ Arquivo de animação XAF
+ </string>
+ <string name="xml_file">
+ Arquivo XML
+ </string>
+ <string name="raw_file">
+ Arquivo RAW
+ </string>
+ <string name="compressed_image_files">
+ Imagens compactadas
+ </string>
+ <string name="load_files">
+ Carregar arquivos
+ </string>
+ <string name="choose_the_directory">
+ Selecionar pasta
+ </string>
+ <string name="script_files">
+ Scripts
+ </string>
+ <string name="dictionary_files">
+ Dicionários
+ </string>
+ <string name="shape">
+ Silhueta
+ </string>
+ <string name="skin">
+ Pele
+ </string>
+ <string name="hair">
+ Cabelo
+ </string>
+ <string name="eyes">
+ Olhos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Calças
+ </string>
+ <string name="shoes">
+ Sapatos
+ </string>
+ <string name="socks">
+ Meias
+ </string>
+ <string name="jacket">
+ Blusa
+ </string>
+ <string name="gloves">
+ Luvas
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Roupa de baixo
+ </string>
+ <string name="skirt">
+ Saia
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatuagem
+ </string>
+ <string name="universal">
+ Universal
+ </string>
+ <string name="physics">
+ Físico
+ </string>
+ <string name="invalid">
+ Inválido
+ </string>
+ <string name="none">
+ nenhum
+ </string>
+ <string name="shirt_not_worn">
+ Camisa não vestida
+ </string>
+ <string name="pants_not_worn">
+ Calças não vestidas
+ </string>
+ <string name="shoes_not_worn">
+ Sapatos não calçados
+ </string>
+ <string name="socks_not_worn">
+ Meias não calçadas
+ </string>
+ <string name="jacket_not_worn">
+ Jaqueta não vestida
+ </string>
+ <string name="gloves_not_worn">
+ Luvas não calçadas
+ </string>
+ <string name="undershirt_not_worn">
+ Camiseta não vestida
+ </string>
+ <string name="underpants_not_worn">
+ Roupa de baixo não vestida
+ </string>
+ <string name="skirt_not_worn">
+ Saia não vestida
+ </string>
+ <string name="alpha_not_worn">
+ Alpha não vestido
+ </string>
+ <string name="tattoo_not_worn">
+ Tatuagem não usada
+ </string>
+ <string name="universal_not_worn">
+ Universal não usado
+ </string>
+ <string name="physics_not_worn">
+ Físico não usado
+ </string>
+ <string name="invalid_not_worn">
+ inválido
+ </string>
+ <string name="create_new_shape">
+ Criar novo físico
+ </string>
+ <string name="create_new_skin">
+ Criar pele nova
+ </string>
+ <string name="create_new_hair">
+ Criar cabelo novo
+ </string>
+ <string name="create_new_eyes">
+ Criar olhos novos
+ </string>
+ <string name="create_new_shirt">
+ Criar camisa nova
+ </string>
+ <string name="create_new_pants">
+ Criar calças novas
+ </string>
+ <string name="create_new_shoes">
+ Criar sapatos novos
+ </string>
+ <string name="create_new_socks">
+ Criar meias novas
+ </string>
+ <string name="create_new_jacket">
+ Criar jaqueta nova
+ </string>
+ <string name="create_new_gloves">
+ Criar luvas novas
+ </string>
+ <string name="create_new_undershirt">
+ Criar camiseta nova
+ </string>
+ <string name="create_new_underpants">
+ Criar roupa de baixo nova
+ </string>
+ <string name="create_new_skirt">
+ Criar saia nova
+ </string>
+ <string name="create_new_alpha">
+ Criar Alpha novo
+ </string>
+ <string name="create_new_tattoo">
+ Criar nova tatuagem
+ </string>
+ <string name="create_new_universal">
+ Criar um novo universal
+ </string>
+ <string name="create_new_physics">
+ Criar novo físico
+ </string>
+ <string name="create_new_invalid">
+ inválido
+ </string>
+ <string name="NewWearable">
+ Novo [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Próximo
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Anúncio de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Anúncios do grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Anexo:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver últimos anúncios ou optar por não receber essas mensagens aqui.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir anexo
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Salvar anexo
+ </string>
+ <string name="TeleportOffer">
+ Oferta de teletransporte
+ </string>
+ <string name="StartUpNotifications">
+ Novas notificações chegaram enquanto você estava fora...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Você tem mais [%d] notificações
+ </string>
+ <string name="BodyPartsRightArm">
+ Braço direito
+ </string>
+ <string name="BodyPartsHead">
+ Cabeça
+ </string>
+ <string name="BodyPartsLeftArm">
+ Braço esquerdo
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Perna esquerda
+ </string>
+ <string name="BodyPartsTorso">
+ Tronco
+ </string>
+ <string name="BodyPartsRightLeg">
+ Perna direita
+ </string>
+ <string name="BodyPartsEnhancedSkeleton">
+ Esqueleto aprimorado
+ </string>
+ <string name="GraphicsQualityLow">
+ Baixo
+ </string>
+ <string name="GraphicsQualityMid">
+ Meio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pressione ESC para retornar para visão do mundo
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string name="InventoryNoMatchingRecentItems">
+ Não encontrou o que procura? Tente [secondlife:///app/inventory/filters Show filters].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Arraste um marco para adicioná-lo aos seus favoritos.
+ </string>
+ <string name="MarketplaceNoMatchingItems">
+ Nenhum item correspondente encontrado. Verifique a ortografia de sua cadeia de pesquisa e tente novamente.
+ </string>
+ <string name="InventoryNoTexture">
+ Você não possui uma cópia desta textura no seu inventário
+ </string>
+ <string name="InventoryInboxNoItems">
+ Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryPlayAnimationTooltip">
+ Abrir a janela com as opções do Jogo.
+ </string>
+ <string name="InventoryPlayGestureTooltip">
+ Executar o gesto selecionado no mundo.
+ </string>
+ <string name="InventoryPlaySoundTooltip">
+ Abrir a janela com as opções do Jogo.
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Qualquer um pode vender itens no Mercado.
+ </string>
<string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado].</string>
- <string name="InventoryOutboxNoItemsTitle">Sua caixa de saída está vazia</string>
+ <string name="InventoryOutboxNotMerchant">
+ Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Sua caixa de saída está vazia
+ </string>
<string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">Arraste as pastas para estas áreas e então clique em &quot;Enviar para Mercado&quot; para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado].</string>
- <string name="InventoryOutboxInitializingTitle">Inicializando o Marketplace.</string>
- <string name="InventoryOutboxInitializing">Estamos acessando sua conta na [loja [MARKETPLACE_CREATE_STORE_URL] do Marketplace].</string>
- <string name="InventoryOutboxErrorTitle">Erros do Marketplace.</string>
- <string name="InventoryOutboxError">A loja [[MARKETPLACE_CREATE_STORE_URL] no Marketplace] está retornando erros.</string>
- <string name="InventoryMarketplaceError">Erro ao abrir as listagens do Marketplace.
-Se você continuar a receber essa mensagem, entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com</string>
- <string name="InventoryMarketplaceListingsNoItemsTitle">Sua pasta Listagens do Marketplace está vazia.</string>
- <string name="InventoryMarketplaceListingsNoItems">Arraste pastas para esta área para listá-las para venda no [Marketplace [MARKETPLACE_DASHBOARD_URL]].</string>
- <string name="InventoryItemsCount">( [ITEMS_COUNT] Items )</string>
- <string name="Marketplace Validation Warning Stock">a pasta de estoque deve estar em uma pasta de versões</string>
- <string name="Marketplace Validation Error Mixed Stock">: Erro: todos os itens em uma pasta de estoque devem ser de cópia proibida e todos do mesmo tipo</string>
- <string name="Marketplace Validation Error Subfolder In Stock">: Erro: a pasta de estoque não pode ter subpastas</string>
- <string name="Marketplace Validation Warning Empty">: Aviso: a pasta não contém itens</string>
- <string name="Marketplace Validation Warning Create Stock">: Aviso: criando pasta de estoque</string>
- <string name="Marketplace Validation Warning Create Version">: Aviso: criando pasta de versões</string>
- <string name="Marketplace Validation Warning Move">: Aviso: movendo itens</string>
- <string name="Marketplace Validation Warning Delete">: Aviso: conteúdo da pasta transferido para pasta de estoque, removendo pasta vazia</string>
- <string name="Marketplace Validation Error Stock Item">: Erro: itens de cópia proibida devem estar em uma pasta de estoque</string>
- <string name="Marketplace Validation Warning Unwrapped Item">: Aviso: os itens devem estar em uma pasta de versões</string>
- <string name="Marketplace Validation Error">: Erro:</string>
- <string name="Marketplace Validation Warning">: Aviso:</string>
- <string name="Marketplace Validation Error Empty Version">: Aviso: a pasta de versões deve conter pelo menos 1 item</string>
- <string name="Marketplace Validation Error Empty Stock">: Aviso: a pasta de estoque deve conter pelo menos 1 item</string>
- <string name="Marketplace Validation No Error">Não há erros ou avisos</string>
- <string name="Marketplace Error None">Sem erros</string>
- <string name="Marketplace Error Prefix">Erro:</string>
- <string name="Marketplace Error Not Merchant">antes de enviar os itens para o Marketplace, é necessário que você se defina como um lojista (sem custos).</string>
- <string name="Marketplace Error Not Accepted">Não é possível mover o item nessa pasta.</string>
- <string name="Marketplace Error Unsellable Item">Este item não pode ser vendido no Marketplace.</string>
- <string name="MarketplaceNoID">no Mkt ID</string>
- <string name="MarketplaceLive">publicada</string>
- <string name="MarketplaceActive">ativo</string>
- <string name="MarketplaceMax">máx</string>
- <string name="MarketplaceStock">estoque</string>
- <string name="MarketplaceNoStock">esgotado</string>
- <string name="MarketplaceUpdating">atualizando...</string>
- <string name="UploadFeeInfo">A taxa é baseada em seu nível de inscrição. Níveis mais altos possuem taxas mais baixas. [https://secondlife.com/my/account/membership.php? Saiba mais]</string>
- <string name="Open landmarks">Marcos em aberto</string>
- <string name="Unconstrained">Ilimitado</string>
+ <string name="InventoryOutboxNoItems">
+ Arraste as pastas para estas áreas e então clique em "Enviar para Mercado" para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado].
+ </string>
+ <string name="InventoryOutboxInitializingTitle">
+ Inicializando o Marketplace.
+ </string>
+ <string name="InventoryOutboxInitializing">
+ Estamos acessando sua conta na [loja [MARKETPLACE_CREATE_STORE_URL] do Marketplace].
+ </string>
+ <string name="InventoryOutboxErrorTitle">
+ Erros do Marketplace.
+ </string>
+ <string name="InventoryOutboxError">
+ A loja [[MARKETPLACE_CREATE_STORE_URL] no Marketplace] está retornando erros.
+ </string>
+ <string name="InventoryMarketplaceError">
+ Erro ao abrir as listagens do Marketplace.
+Se você continuar a receber essa mensagem, entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Sua pasta Listagens do Marketplace está vazia.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Arraste pastas para esta área para listá-las para venda no [Marketplace [MARKETPLACE_DASHBOARD_URL]].
+ </string>
+ <string name="InventoryItemsCount">
+ ( [ITEMS_COUNT] Items )
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ a pasta de estoque deve estar em uma pasta de versões
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Erro: todos os itens em uma pasta de estoque devem ser de cópia proibida e todos do mesmo tipo
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Erro: a pasta de estoque não pode ter subpastas
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Aviso: a pasta não contém itens
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Aviso: criando pasta de estoque
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Aviso: criando pasta de versões
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Aviso: movendo itens
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Aviso: conteúdo da pasta transferido para pasta de estoque, removendo pasta vazia
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Erro: itens de cópia proibida devem estar em uma pasta de estoque
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Aviso: os itens devem estar em uma pasta de versões
+ </string>
+ <string name="Marketplace Validation Error">
+ : Erro:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Aviso:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Aviso: a pasta de versões deve conter pelo menos 1 item
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Aviso: a pasta de estoque deve conter pelo menos 1 item
+ </string>
+ <string name="Marketplace Validation No Error">
+ Não há erros ou avisos
+ </string>
+ <string name="Marketplace Error None">
+ Sem erros
+ </string>
+ <string name="Marketplace Error Prefix">
+ Erro:
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ antes de enviar os itens para o Marketplace, é necessário que você se defina como um lojista (sem custos).
+ </string>
+ <string name="Marketplace Error Not Accepted">
+ Não é possível mover o item nessa pasta.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Este item não pode ser vendido no Marketplace.
+ </string>
+ <string name="MarketplaceNoID">
+ no Mkt ID
+ </string>
+ <string name="MarketplaceLive">
+ publicada
+ </string>
+ <string name="MarketplaceActive">
+ ativo
+ </string>
+ <string name="MarketplaceMax">
+ máx
+ </string>
+ <string name="MarketplaceStock">
+ estoque
+ </string>
+ <string name="MarketplaceNoStock">
+ esgotado
+ </string>
+ <string name="MarketplaceUpdating">
+ atualizando...
+ </string>
+ <string name="UploadFeeInfo">
+ A taxa é baseada em seu nível de inscrição. Níveis mais altos possuem taxas mais baixas. [https://secondlife.com/my/account/membership.php? Saiba mais]
+ </string>
+ <string name="Open landmarks">
+ Marcos em aberto
+ </string>
+ <string name="Unconstrained">
+ Ilimitado
+ </string>
<string name="no_transfer" value="(não transferível)"/>
<string name="no_modify" value="(não modificável)"/>
<string name="no_copy" value="(não copiável)"/>
<string name="worn" value="(vestido)"/>
<string name="link" value="(link)"/>
<string name="broken_link" value="(link_quebrado)&quot;"/>
- <string name="LoadingContents">Carregando conteúdo...</string>
- <string name="NoContents">Nenhum conteúdo</string>
+ <string name="LoadingContents">
+ Carregando conteúdo...
+ </string>
+ <string name="NoContents">
+ Nenhum conteúdo
+ </string>
<string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/>
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (ativado)"/>
@@ -595,1413 +1649,4139 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se
<string name="Snapshots" value="Fotografias"/>
<string name="No Filters" value="Não"/>
<string name="Since Logoff" value="- Desde desligado"/>
- <string name="InvFolder My Inventory">Meu inventário</string>
- <string name="InvFolder Library">Biblioteca</string>
- <string name="InvFolder Textures">Texturas</string>
- <string name="InvFolder Sounds">Sons</string>
- <string name="InvFolder Calling Cards">Cartões de visitas</string>
- <string name="InvFolder Landmarks">Marcos</string>
- <string name="InvFolder Scripts">Scripts</string>
- <string name="InvFolder Clothing">Vestuário</string>
- <string name="InvFolder Objects">Objetos</string>
- <string name="InvFolder Notecards">Anotações</string>
- <string name="InvFolder New Folder">Nova pasta</string>
- <string name="InvFolder Inventory">Inventário</string>
- <string name="InvFolder Uncompressed Images">Imagens descompactadas</string>
- <string name="InvFolder Body Parts">Corpo</string>
- <string name="InvFolder Trash">Lixo</string>
- <string name="InvFolder Photo Album">Álbum de fotografias</string>
- <string name="InvFolder Lost And Found">Achados e Perdidos</string>
- <string name="InvFolder Uncompressed Sounds">Sons descompactados</string>
- <string name="InvFolder Animations">Animações</string>
- <string name="InvFolder Gestures">Gestos</string>
- <string name="InvFolder Favorite">Meus favoritos</string>
- <string name="InvFolder favorite">Meus favoritos</string>
- <string name="InvFolder Favorites">Meus favoritos</string>
- <string name="InvFolder favorites">Meus favoritos</string>
- <string name="InvFolder Current Outfit">Look atual</string>
- <string name="InvFolder Initial Outfits">Looks iniciais</string>
- <string name="InvFolder My Outfits">Meus looks</string>
- <string name="InvFolder Accessories">Acessórios</string>
- <string name="InvFolder Meshes">Meshes:</string>
- <string name="InvFolder Received Items">Itens recebidos</string>
- <string name="InvFolder Merchant Outbox">Caixa de saída do lojista</string>
- <string name="InvFolder Friends">Amigos</string>
- <string name="InvFolder All">Tudo</string>
- <string name="no_attachments">Nenhum anexo vestido</string>
- <string name="Attachments remain">Anexos ([COUNT] slots permanecem)</string>
- <string name="Buy">Comprar</string>
- <string name="BuyforL$">Comprar por L$</string>
- <string name="Stone">Pedra</string>
- <string name="Metal">Metal</string>
- <string name="Glass">Vidro</string>
- <string name="Wood">Madeira</string>
- <string name="Flesh">Carne</string>
- <string name="Plastic">Plástico</string>
- <string name="Rubber">Borrracha</string>
- <string name="Light">Luz</string>
- <string name="KBShift">Shift</string>
- <string name="KBCtrl">Ctrl</string>
- <string name="Chest">Peito</string>
- <string name="Skull">Crânio</string>
- <string name="Left Shoulder">Ombro esquerdo</string>
- <string name="Right Shoulder">Ombro direito</string>
- <string name="Left Hand">Mão esquerda</string>
- <string name="Right Hand">Mão direita</string>
- <string name="Left Foot">Pé esquerdo</string>
- <string name="Right Foot">Pé direito</string>
- <string name="Spine">Espinha</string>
- <string name="Pelvis">Pélvis</string>
- <string name="Mouth">Boca</string>
- <string name="Chin">Queixo</string>
- <string name="Left Ear">Orelha esquerda</string>
- <string name="Right Ear">Orelha direita</string>
- <string name="Left Eyeball">Globo ocular esquerdo</string>
- <string name="Right Eyeball">Globo ocular direito</string>
- <string name="Nose">Nariz</string>
- <string name="R Upper Arm">Braço superior D</string>
- <string name="R Forearm">Antebraço D</string>
- <string name="L Upper Arm">Braço superior E</string>
- <string name="L Forearm">Antebraço E</string>
- <string name="Right Hip">Quadril direito</string>
- <string name="R Upper Leg">Coxa D</string>
- <string name="R Lower Leg">Perna inferior D</string>
- <string name="Left Hip">Quadril esquerdo</string>
- <string name="L Upper Leg">Coxa E</string>
- <string name="L Lower Leg">Perna inferior E</string>
- <string name="Stomach">Estômago</string>
- <string name="Left Pec">Peitoral E</string>
- <string name="Right Pec">Peitoral D</string>
- <string name="Neck">Pescoço</string>
- <string name="Avatar Center">Centro do avatar</string>
- <string name="Left Ring Finger">Anelar esquerdo</string>
- <string name="Right Ring Finger">Anelar direito</string>
- <string name="Tail Base">Base do rabo</string>
- <string name="Tail Tip">Ponta do rabo</string>
- <string name="Left Wing">Asa esquerda</string>
- <string name="Right Wing">Asa direita</string>
- <string name="Jaw">Maxilar</string>
- <string name="Alt Left Ear">Orelha esquerda alt.</string>
- <string name="Alt Right Ear">Orelha direita alt.</string>
- <string name="Alt Left Eye">Olho esquerdo alt.</string>
- <string name="Alt Right Eye">Olho direito alt.</string>
- <string name="Tongue">Língua</string>
- <string name="Groin">Virilha</string>
- <string name="Left Hind Foot">Pata esq. traseira</string>
- <string name="Right Hind Foot">Pata dir. traseira</string>
- <string name="Invalid Attachment">Ponto de encaixe inválido</string>
- <string name="ATTACHMENT_MISSING_ITEM">Erro: item ausente</string>
- <string name="ATTACHMENT_MISSING_BASE_ITEM">Erro: item base ausente</string>
- <string name="ATTACHMENT_NOT_ATTACHED">Erro: o objeto está no look atual, mas não foi anexado</string>
- <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] de idade</string>
- <string name="YearsOld">[AGEYEARS] de idade</string>
- <string name="MonthsOld">[AGEMONTHS] de idade</string>
- <string name="WeeksOld">[AGEWEEKS] de idade</string>
- <string name="DaysOld">[AGEDAYS] de idade</string>
- <string name="TodayOld">Cadastrado hoje</string>
- <string name="av_render_everyone_now">Agora, todos podem te ver.</string>
- <string name="av_render_not_everyone">Sua renderização pode não acontecer para todos ao seu redor.</string>
- <string name="av_render_over_half">Sua renderização pode não acontecer para metade das pessoas ao seu redor.</string>
- <string name="av_render_most_of">Sua renderização pode não acontecer para a maioria das pessoas ao seu redor.</string>
- <string name="av_render_anyone">Sua renderização pode não acontecer para ninguém ao seu redor.</string>
- <string name="hud_description_total">Seu HUD</string>
- <string name="hud_name_with_joint">[OBJ_NAME] (vestido em [JNT_NAME])</string>
- <string name="hud_render_memory_warning">[HUD_DETAILS] usa muita memória de textura</string>
- <string name="hud_render_cost_warning">[HUD_DETAILS] contém muitos objetos e texturas que utilizam o máximo de recursos</string>
- <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] contém muitas texturas grandes</string>
- <string name="hud_render_cramped_warning">[HUD_DETAILS] contém muitos objetos</string>
- <string name="hud_render_textures_warning">[HUD_DETAILS] contém muitas texturas</string>
- <string name="AgeYearsA">[COUNT] ano</string>
- <string name="AgeYearsB">[COUNT] anos</string>
- <string name="AgeYearsC">[COUNT] anos</string>
- <string name="AgeMonthsA">[COUNT] mês</string>
- <string name="AgeMonthsB">[COUNT] meses</string>
- <string name="AgeMonthsC">[COUNT] meses</string>
- <string name="AgeWeeksA">[COUNT] semana</string>
- <string name="AgeWeeksB">[COUNT] semanas</string>
- <string name="AgeWeeksC">[COUNT] semanas</string>
- <string name="AgeDaysA">[COUNT] dia</string>
- <string name="AgeDaysB">[COUNT] dias</string>
- <string name="AgeDaysC">[COUNT] dias</string>
- <string name="GroupMembersA">[COUNT] membro</string>
- <string name="GroupMembersB">[COUNT] membros</string>
- <string name="GroupMembersC">[COUNT] membros</string>
- <string name="AcctTypeResident">Residente</string>
- <string name="AcctTypeTrial">Prova</string>
- <string name="AcctTypeCharterMember">Lista de membros</string>
- <string name="AcctTypeEmployee">Empregado da Linden Lab</string>
- <string name="PaymentInfoUsed">Dados de pagamento usados</string>
- <string name="PaymentInfoOnFile">Dados de pagamento fornecidos</string>
- <string name="NoPaymentInfoOnFile">Nenhum dado de pagamento</string>
- <string name="AgeVerified">Idade comprovada</string>
- <string name="NotAgeVerified">Idade não comprovada</string>
- <string name="Center 2">Centro 2</string>
- <string name="Top Right">Topo direita</string>
- <string name="Top">Topo</string>
- <string name="Top Left">Topo esquerda</string>
- <string name="Center">Centro</string>
- <string name="Bottom Left">Inferior esquerdo</string>
- <string name="Bottom">Inferior</string>
- <string name="Bottom Right">Inferior direito</string>
- <string name="CompileQueueDownloadedCompiling">Baixado, agora compilando</string>
- <string name="CompileQueueServiceUnavailable">Serviço de compilação de scripts não disponível</string>
- <string name="CompileQueueScriptNotFound">Script não encontrado no servidor.</string>
- <string name="CompileQueueProblemDownloading">Problema no download</string>
- <string name="CompileQueueInsufficientPermDownload">Permissões insuficientes para fazer o download do script.</string>
- <string name="CompileQueueInsufficientPermFor">Permissões insuficientes para</string>
- <string name="CompileQueueUnknownFailure">Falha desconhecida para download</string>
- <string name="CompileNoExperiencePerm">Pulando script [SCRIPT] com experiência [EXPERIENCE]</string>
- <string name="CompileQueueTitle">Progresso do recompilamento</string>
- <string name="CompileQueueStart">recompilar</string>
- <string name="ResetQueueTitle">Reset Progresso</string>
- <string name="ResetQueueStart">Zerar</string>
- <string name="RunQueueTitle">Definir funcionamento do progresso</string>
- <string name="RunQueueStart">deixar funcionando</string>
- <string name="NotRunQueueTitle">Definir progresso não funcionando</string>
- <string name="NotRunQueueStart">não deixar funcionando</string>
- <string name="CompileSuccessful">Compilação bem sucedida</string>
- <string name="CompileSuccessfulSaving">Compilação bem sucedida, salvando...</string>
- <string name="SaveComplete">Salvo.</string>
- <string name="UploadFailed">Falha ao carregar arquivo:</string>
- <string name="ObjectOutOfRange">Script (objeto fora de alcance)</string>
- <string name="ScriptWasDeleted">Script (excluído do inventário)</string>
- <string name="GodToolsObjectOwnedBy">Objeto [OBJECT] de propriedade de [OWNER]</string>
- <string name="GroupsNone">nenhum</string>
+ <string name="InvFolder My Inventory">
+ Meu inventário
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sons
+ </string>
+ <string name="InvFolder Calling Cards">
+ Cartões de visitas
+ </string>
+ <string name="InvFolder Landmarks">
+ Marcos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Vestuário
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Anotações
+ </string>
+ <string name="InvFolder New Folder">
+ Nova pasta
+ </string>
+ <string name="InvFolder Inventory">
+ Inventário
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imagens descompactadas
+ </string>
+ <string name="InvFolder Body Parts">
+ Corpo
+ </string>
+ <string name="InvFolder Trash">
+ Lixo
+ </string>
+ <string name="InvFolder Photo Album">
+ Álbum de fotografias
+ </string>
+ <string name="InvFolder Lost And Found">
+ Achados e Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sons descompactados
+ </string>
+ <string name="InvFolder Animations">
+ Animações
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder Favorite">
+ Meus favoritos
+ </string>
+ <string name="InvFolder favorite">
+ Meus favoritos
+ </string>
+ <string name="InvFolder Favorites">
+ Meus favoritos
+ </string>
+ <string name="InvFolder favorites">
+ Meus favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Look atual
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Looks iniciais
+ </string>
+ <string name="InvFolder My Outfits">
+ Meus looks
+ </string>
+ <string name="InvFolder Accessories">
+ Acessórios
+ </string>
+ <string name="InvFolder Meshes">
+ Meshes:
+ </string>
+ <string name="InvFolder Received Items">
+ Itens recebidos
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Caixa de saída do lojista
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Tudo
+ </string>
+ <string name="no_attachments">
+ Nenhum anexo vestido
+ </string>
+ <string name="Attachments remain">
+ Anexos ([COUNT] slots permanecem)
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Pedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Vidro
+ </string>
+ <string name="Wood">
+ Madeira
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Borrracha
+ </string>
+ <string name="Light">
+ Luz
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Peito
+ </string>
+ <string name="Skull">
+ Crânio
+ </string>
+ <string name="Left Shoulder">
+ Ombro esquerdo
+ </string>
+ <string name="Right Shoulder">
+ Ombro direito
+ </string>
+ <string name="Left Hand">
+ Mão esquerda
+ </string>
+ <string name="Right Hand">
+ Mão direita
+ </string>
+ <string name="Left Foot">
+ Pé esquerdo
+ </string>
+ <string name="Right Foot">
+ Pé direito
+ </string>
+ <string name="Spine">
+ Espinha
+ </string>
+ <string name="Pelvis">
+ Pélvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Queixo
+ </string>
+ <string name="Left Ear">
+ Orelha esquerda
+ </string>
+ <string name="Right Ear">
+ Orelha direita
+ </string>
+ <string name="Left Eyeball">
+ Globo ocular esquerdo
+ </string>
+ <string name="Right Eyeball">
+ Globo ocular direito
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Braço superior D
+ </string>
+ <string name="R Forearm">
+ Antebraço D
+ </string>
+ <string name="L Upper Arm">
+ Braço superior E
+ </string>
+ <string name="L Forearm">
+ Antebraço E
+ </string>
+ <string name="Right Hip">
+ Quadril direito
+ </string>
+ <string name="R Upper Leg">
+ Coxa D
+ </string>
+ <string name="R Lower Leg">
+ Perna inferior D
+ </string>
+ <string name="Left Hip">
+ Quadril esquerdo
+ </string>
+ <string name="L Upper Leg">
+ Coxa E
+ </string>
+ <string name="L Lower Leg">
+ Perna inferior E
+ </string>
+ <string name="Stomach">
+ Estômago
+ </string>
+ <string name="Left Pec">
+ Peitoral E
+ </string>
+ <string name="Right Pec">
+ Peitoral D
+ </string>
+ <string name="Neck">
+ Pescoço
+ </string>
+ <string name="Avatar Center">
+ Centro do avatar
+ </string>
+ <string name="Left Ring Finger">
+ Anelar esquerdo
+ </string>
+ <string name="Right Ring Finger">
+ Anelar direito
+ </string>
+ <string name="Tail Base">
+ Base do rabo
+ </string>
+ <string name="Tail Tip">
+ Ponta do rabo
+ </string>
+ <string name="Left Wing">
+ Asa esquerda
+ </string>
+ <string name="Right Wing">
+ Asa direita
+ </string>
+ <string name="Jaw">
+ Maxilar
+ </string>
+ <string name="Alt Left Ear">
+ Orelha esquerda alt.
+ </string>
+ <string name="Alt Right Ear">
+ Orelha direita alt.
+ </string>
+ <string name="Alt Left Eye">
+ Olho esquerdo alt.
+ </string>
+ <string name="Alt Right Eye">
+ Olho direito alt.
+ </string>
+ <string name="Tongue">
+ Língua
+ </string>
+ <string name="Groin">
+ Virilha
+ </string>
+ <string name="Left Hind Foot">
+ Pata esq. traseira
+ </string>
+ <string name="Right Hind Foot">
+ Pata dir. traseira
+ </string>
+ <string name="Invalid Attachment">
+ Ponto de encaixe inválido
+ </string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Erro: item ausente
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Erro: item base ausente
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Erro: o objeto está no look atual, mas não foi anexado
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de idade
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de idade
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de idade
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de idade
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de idade
+ </string>
+ <string name="TodayOld">
+ Cadastrado hoje
+ </string>
+ <string name="av_render_everyone_now">
+ Agora, todos podem te ver.
+ </string>
+ <string name="av_render_not_everyone">
+ Sua renderização pode não acontecer para todos ao seu redor.
+ </string>
+ <string name="av_render_over_half">
+ Sua renderização pode não acontecer para metade das pessoas ao seu redor.
+ </string>
+ <string name="av_render_most_of">
+ Sua renderização pode não acontecer para a maioria das pessoas ao seu redor.
+ </string>
+ <string name="av_render_anyone">
+ Sua renderização pode não acontecer para ninguém ao seu redor.
+ </string>
+ <string name="hud_description_total">
+ Seu HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (vestido em [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] usa muita memória de textura
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] contém muitos objetos e texturas que utilizam o máximo de recursos
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] contém muitas texturas grandes
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] contém muitos objetos
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] contém muitas texturas
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] ano
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] anos
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] anos
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mês
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dia
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dias
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dias
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] membro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] membros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] membros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prova
+ </string>
+ <string name="AcctTypeCharterMember">
+ Lista de membros
+ </string>
+ <string name="AcctTypeEmployee">
+ Empregado da Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Dados de pagamento usados
+ </string>
+ <string name="PaymentInfoOnFile">
+ Dados de pagamento fornecidos
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Nenhum dado de pagamento
+ </string>
+ <string name="AgeVerified">
+ Idade comprovada
+ </string>
+ <string name="NotAgeVerified">
+ Idade não comprovada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Topo direita
+ </string>
+ <string name="Top">
+ Topo
+ </string>
+ <string name="Top Left">
+ Topo esquerda
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Inferior esquerdo
+ </string>
+ <string name="Bottom">
+ Inferior
+ </string>
+ <string name="Bottom Right">
+ Inferior direito
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Baixado, agora compilando
+ </string>
+ <string name="CompileQueueServiceUnavailable">
+ Serviço de compilação de scripts não disponível
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script não encontrado no servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema no download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permissões insuficientes para fazer o download do script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permissões insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Falha desconhecida para download
+ </string>
+ <string name="CompileNoExperiencePerm">
+ Pulando script [SCRIPT] com experiência [EXPERIENCE]
+ </string>
+ <string name="CompileQueueTitle">
+ Progresso do recompilamento
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Reset Progresso
+ </string>
+ <string name="ResetQueueStart">
+ Zerar
+ </string>
+ <string name="RunQueueTitle">
+ Definir funcionamento do progresso
+ </string>
+ <string name="RunQueueStart">
+ deixar funcionando
+ </string>
+ <string name="NotRunQueueTitle">
+ Definir progresso não funcionando
+ </string>
+ <string name="NotRunQueueStart">
+ não deixar funcionando
+ </string>
+ <string name="CompileSuccessful">
+ Compilação bem sucedida
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilação bem sucedida, salvando...
+ </string>
+ <string name="SaveComplete">
+ Salvo.
+ </string>
+ <string name="UploadFailed">
+ Falha ao carregar arquivo:
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fora de alcance)
+ </string>
+ <string name="ScriptWasDeleted">
+ Script (excluído do inventário)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objeto [OBJECT] de propriedade de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ nenhum
+ </string>
<string name="Group" value="(grupo)"/>
- <string name="Unknown">(Desconhecido)</string>
+ <string name="Unknown">
+ (Desconhecido)
+ </string>
<string name="SummaryForTheWeek" value="Resumo para esta semana, com início em "/>
<string name="NextStipendDay" value=". Próximo dia de salário é "/>
- <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value="Grupo Divisão individualI"/>
<string name="GroupColumn" value="Grupo"/>
- <string name="Balance">Balanço</string>
- <string name="Credits">Créditos</string>
- <string name="Debits">Débitos</string>
- <string name="Total">Total</string>
- <string name="NoGroupDataFound">Não há dados de grupo</string>
- <string name="IMParentEstate">Propriedade-pai</string>
- <string name="IMMainland">continente</string>
- <string name="IMTeen">adolescente</string>
- <string name="Anyone">qualquer um</string>
- <string name="RegionInfoError">erro</string>
- <string name="RegionInfoAllEstatesOwnedBy">todas as propriedades pertencem a [OWNER]</string>
- <string name="RegionInfoAllEstatesYouOwn">todas as propriedades que você possui</string>
- <string name="RegionInfoAllEstatesYouManage">todas as propriedades que você gerencia para [OWNER]</string>
- <string name="RegionInfoAllowedResidents">Sempre permitido: ([ALLOWEDAGENTS], máx [MAXACCESS])</string>
- <string name="RegionInfoAllowedGroups">Grupos sempre permitidos: ([ALLOWEDGROUPS], máx [MAXACCESS])</string>
- <string name="RegionInfoBannedResidents">Grupos banidos: ([BANNEDAGENTS], máx [MAXBANNED])</string>
- <string name="RegionInfoListTypeAllowedAgents">Sempre permitido</string>
- <string name="RegionInfoListTypeBannedAgents">Sempre banido</string>
- <string name="RegionInfoAllEstates">todos os terrenos</string>
- <string name="RegionInfoManagedEstates">administre terrenos</string>
- <string name="RegionInfoThisEstate">este terreno</string>
- <string name="AndNMore">e [EXTRA_COUNT] mais</string>
- <string name="ScriptLimitsParcelScriptMemory">Memória de scripts no lote</string>
- <string name="ScriptLimitsParcelsOwned">Lotes listados: [PARCELS]</string>
- <string name="ScriptLimitsMemoryUsed">Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponíveis</string>
- <string name="ScriptLimitsMemoryUsedSimple">Memória usada: [COUNT] kb</string>
- <string name="ScriptLimitsParcelScriptURLs">URL dos scripts do lote</string>
- <string name="ScriptLimitsURLsUsed">URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponíveis</string>
- <string name="ScriptLimitsURLsUsedSimple">URLs usados: [COUNT]</string>
- <string name="ScriptLimitsRequestError">Erro ao solicitar dados</string>
- <string name="ScriptLimitsRequestNoParcelSelected">Nenhum lote foi selecionado</string>
- <string name="ScriptLimitsRequestWrongRegion">Erro: dados de script só disponíveis na região da posição atual</string>
- <string name="ScriptLimitsRequestWaiting">Obtendo dados...</string>
- <string name="ScriptLimitsRequestDontOwnParcel">Você não está autorizado a examinar este lote.</string>
- <string name="SITTING_ON">Sentado em</string>
- <string name="ATTACH_CHEST">Peito</string>
- <string name="ATTACH_HEAD">Crânio</string>
- <string name="ATTACH_LSHOULDER">Ombro esquerdo</string>
- <string name="ATTACH_RSHOULDER">Ombro direito</string>
- <string name="ATTACH_LHAND">Mão esquerda</string>
- <string name="ATTACH_RHAND">Mão direita</string>
- <string name="ATTACH_LFOOT">Pé esquerdo</string>
- <string name="ATTACH_RFOOT">Pé direito</string>
- <string name="ATTACH_BACK">Coluna</string>
- <string name="ATTACH_PELVIS">Pélvis</string>
- <string name="ATTACH_MOUTH">Boca</string>
- <string name="ATTACH_CHIN">Queixo</string>
- <string name="ATTACH_LEAR">Orelha esquerda</string>
- <string name="ATTACH_REAR">Orelha direita</string>
- <string name="ATTACH_LEYE">Olho esquerdo</string>
- <string name="ATTACH_REYE">Olho direito</string>
- <string name="ATTACH_NOSE">Nariz</string>
- <string name="ATTACH_RUARM">Braço direito</string>
- <string name="ATTACH_RLARM">Antebraço direito</string>
- <string name="ATTACH_LUARM">Braço esquerdo</string>
- <string name="ATTACH_LLARM">Antebraço esquerdo</string>
- <string name="ATTACH_RHIP">Quadril direito</string>
- <string name="ATTACH_RULEG">Coxa direita</string>
- <string name="ATTACH_RLLEG">Perna direita</string>
- <string name="ATTACH_LHIP">Quadril esquerdo</string>
- <string name="ATTACH_LULEG">Coxa esquerda</string>
- <string name="ATTACH_LLLEG">Perna esquerda</string>
- <string name="ATTACH_BELLY">Estômago</string>
- <string name="ATTACH_LEFT_PEC">Peitorais E</string>
- <string name="ATTACH_RIGHT_PEC">Peitorais D</string>
- <string name="ATTACH_HUD_CENTER_2">HUD Central 2</string>
- <string name="ATTACH_HUD_TOP_RIGHT">HUD superior direito</string>
- <string name="ATTACH_HUD_TOP_CENTER">HUD centro superior</string>
- <string name="ATTACH_HUD_TOP_LEFT">HUD superior esquerdo</string>
- <string name="ATTACH_HUD_CENTER_1">HUD Central 1</string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">HUD esquerda inferior</string>
- <string name="ATTACH_HUD_BOTTOM">HUD inferior</string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD direito inferior</string>
- <string name="ATTACH_NECK">Pescoço</string>
- <string name="ATTACH_AVATAR_CENTER">Centro do avatar</string>
- <string name="ATTACH_LHAND_RING1">Anelar esquerdo</string>
- <string name="ATTACH_RHAND_RING1">Anelar direito</string>
- <string name="ATTACH_TAIL_BASE">Base do rabo</string>
- <string name="ATTACH_TAIL_TIP">Ponta do rabo</string>
- <string name="ATTACH_LWING">Asa esquerda</string>
- <string name="ATTACH_RWING">Asa direita</string>
- <string name="ATTACH_FACE_JAW">Maxilar</string>
- <string name="ATTACH_FACE_LEAR">Orelha esquerda alt.</string>
- <string name="ATTACH_FACE_REAR">Orelha direita alt.</string>
- <string name="ATTACH_FACE_LEYE">Olho esquerdo alt.</string>
- <string name="ATTACH_FACE_REYE">Olho direito alt.</string>
- <string name="ATTACH_FACE_TONGUE">Língua</string>
- <string name="ATTACH_GROIN">Virilha</string>
- <string name="ATTACH_HIND_LFOOT">Pata esq. traseira</string>
- <string name="ATTACH_HIND_RFOOT">Pata dir. traseira</string>
- <string name="CursorPos">Linha [LINE], Coluna [COLUMN]</string>
- <string name="PanelDirCountFound">[COUNT] encontrado</string>
- <string name="PanelContentsTooltip">Conteúdo do objeto</string>
- <string name="PanelContentsNewScript">Novo Script</string>
- <string name="DoNotDisturbModeResponseDefault">Este residente ativou o &quot;Não perturbe&quot; e verá sua mensagem mais tarde.</string>
- <string name="MuteByName">(por nome)</string>
- <string name="MuteAgent">(residente)</string>
- <string name="MuteObject">(objeto)</string>
- <string name="MuteGroup">(grupo)</string>
- <string name="MuteExternal">(Externo)</string>
- <string name="RegionNoCovenant">Não foi definido um contrato para essa região.</string>
- <string name="RegionNoCovenantOtherOwner">Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda.</string>
+ <string name="Balance">
+ Balanço
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Não há dados de grupo
+ </string>
+ <string name="IMParentEstate">
+ Propriedade-pai
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ adolescente
+ </string>
+ <string name="Anyone">
+ qualquer um
+ </string>
+ <string name="RegionInfoError">
+ erro
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todas as propriedades pertencem a [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todas as propriedades que você possui
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todas as propriedades que você gerencia para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Sempre permitido: ([ALLOWEDAGENTS], máx [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos sempre permitidos: ([ALLOWEDGROUPS], máx [MAXACCESS])
+ </string>
+ <string name="RegionInfoBannedResidents">
+ Grupos banidos: ([BANNEDAGENTS], máx [MAXBANNED])
+ </string>
+ <string name="RegionInfoListTypeAllowedAgents">
+ Sempre permitido
+ </string>
+ <string name="RegionInfoListTypeBannedAgents">
+ Sempre banido
+ </string>
+ <string name="RegionInfoAllEstates">
+ todos os terrenos
+ </string>
+ <string name="RegionInfoManagedEstates">
+ administre terrenos
+ </string>
+ <string name="RegionInfoThisEstate">
+ este terreno
+ </string>
+ <string name="AndNMore">
+ e [EXTRA_COUNT] mais
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memória de scripts no lote
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Lotes listados: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponíveis
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memória usada: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL dos scripts do lote
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponíveis
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs usados: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Erro ao solicitar dados
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Nenhum lote foi selecionado
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Erro: dados de script só disponíveis na região da posição atual
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Obtendo dados...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Você não está autorizado a examinar este lote.
+ </string>
+ <string name="SITTING_ON">
+ Sentado em
+ </string>
+ <string name="ATTACH_CHEST">
+ Peito
+ </string>
+ <string name="ATTACH_HEAD">
+ Crânio
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Ombro esquerdo
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Ombro direito
+ </string>
+ <string name="ATTACH_LHAND">
+ Mão esquerda
+ </string>
+ <string name="ATTACH_RHAND">
+ Mão direita
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pé esquerdo
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pé direito
+ </string>
+ <string name="ATTACH_BACK">
+ Coluna
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pélvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Boca
+ </string>
+ <string name="ATTACH_CHIN">
+ Queixo
+ </string>
+ <string name="ATTACH_LEAR">
+ Orelha esquerda
+ </string>
+ <string name="ATTACH_REAR">
+ Orelha direita
+ </string>
+ <string name="ATTACH_LEYE">
+ Olho esquerdo
+ </string>
+ <string name="ATTACH_REYE">
+ Olho direito
+ </string>
+ <string name="ATTACH_NOSE">
+ Nariz
+ </string>
+ <string name="ATTACH_RUARM">
+ Braço direito
+ </string>
+ <string name="ATTACH_RLARM">
+ Antebraço direito
+ </string>
+ <string name="ATTACH_LUARM">
+ Braço esquerdo
+ </string>
+ <string name="ATTACH_LLARM">
+ Antebraço esquerdo
+ </string>
+ <string name="ATTACH_RHIP">
+ Quadril direito
+ </string>
+ <string name="ATTACH_RULEG">
+ Coxa direita
+ </string>
+ <string name="ATTACH_RLLEG">
+ Perna direita
+ </string>
+ <string name="ATTACH_LHIP">
+ Quadril esquerdo
+ </string>
+ <string name="ATTACH_LULEG">
+ Coxa esquerda
+ </string>
+ <string name="ATTACH_LLLEG">
+ Perna esquerda
+ </string>
+ <string name="ATTACH_BELLY">
+ Estômago
+ </string>
+ <string name="ATTACH_LEFT_PEC">
+ Peitorais E
+ </string>
+ <string name="ATTACH_RIGHT_PEC">
+ Peitorais D
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Central 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD superior direito
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD centro superior
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD superior esquerdo
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Central 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD esquerda inferior
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD inferior
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD direito inferior
+ </string>
+ <string name="ATTACH_NECK">
+ Pescoço
+ </string>
+ <string name="ATTACH_AVATAR_CENTER">
+ Centro do avatar
+ </string>
+ <string name="ATTACH_LHAND_RING1">
+ Anelar esquerdo
+ </string>
+ <string name="ATTACH_RHAND_RING1">
+ Anelar direito
+ </string>
+ <string name="ATTACH_TAIL_BASE">
+ Base do rabo
+ </string>
+ <string name="ATTACH_TAIL_TIP">
+ Ponta do rabo
+ </string>
+ <string name="ATTACH_LWING">
+ Asa esquerda
+ </string>
+ <string name="ATTACH_RWING">
+ Asa direita
+ </string>
+ <string name="ATTACH_FACE_JAW">
+ Maxilar
+ </string>
+ <string name="ATTACH_FACE_LEAR">
+ Orelha esquerda alt.
+ </string>
+ <string name="ATTACH_FACE_REAR">
+ Orelha direita alt.
+ </string>
+ <string name="ATTACH_FACE_LEYE">
+ Olho esquerdo alt.
+ </string>
+ <string name="ATTACH_FACE_REYE">
+ Olho direito alt.
+ </string>
+ <string name="ATTACH_FACE_TONGUE">
+ Língua
+ </string>
+ <string name="ATTACH_GROIN">
+ Virilha
+ </string>
+ <string name="ATTACH_HIND_LFOOT">
+ Pata esq. traseira
+ </string>
+ <string name="ATTACH_HIND_RFOOT">
+ Pata dir. traseira
+ </string>
+ <string name="CursorPos">
+ Linha [LINE], Coluna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] encontrado
+ </string>
+ <string name="PanelContentsTooltip">
+ Conteúdo do objeto
+ </string>
+ <string name="PanelContentsNewScript">
+ Novo Script
+ </string>
+ <string name="DoNotDisturbModeResponseDefault">
+ Este residente ativou o "Não perturbe" e verá sua mensagem mais tarde.
+ </string>
+ <string name="MuteByName">
+ (por nome)
+ </string>
+ <string name="MuteAgent">
+ (residente)
+ </string>
+ <string name="MuteObject">
+ (objeto)
+ </string>
+ <string name="MuteGroup">
+ (grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
+ </string>
+ <string name="RegionNoCovenant">
+ Não foi definido um contrato para essa região.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda.
+ </string>
<string name="covenant_last_modified" value="Última modificação: "/>
<string name="none_text" value="(nenhum)"/>
<string name="never_text" value="(nunca)"/>
- <string name="GroupOwned">Propriedade do Grupo</string>
- <string name="Public">Público</string>
- <string name="LocalSettings">Configurações locais</string>
- <string name="RegionSettings">Configurações da região</string>
- <string name="NoEnvironmentSettings">Esta Região não suporta as configurações do ambiente.</string>
- <string name="EnvironmentSun">Dom</string>
- <string name="EnvironmentMoon">Lua</string>
- <string name="EnvironmentBloom">Florescer</string>
- <string name="EnvironmentCloudNoise">Ruído na nuvem</string>
- <string name="EnvironmentNormalMap">Mapa normal</string>
- <string name="EnvironmentTransparent">Transparente</string>
- <string name="ClassifiedClicksTxt">Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil</string>
- <string name="ClassifiedUpdateAfterPublish">(vai atualizar depois de publicado)</string>
- <string name="NoPicksClassifiedsText">Você não criou nenhum Destaque ou Anúncio. Clique no botão &quot;+&quot; para criar um Destaque ou Anúncio.</string>
- <string name="NoPicksText">Você não criou nenhuma Escolha. Clique em Novo Botão para criar um Escolher</string>
- <string name="NoClassifiedsText">Você criou nenhum Anúncio. Clique em Novo Botão para criar um Classificado</string>
- <string name="NoAvatarPicksClassifiedsText">O usuário não tem nenhum destaque ou anúncio</string>
- <string name="NoAvatarPicksText">Usuário não tem escolha</string>
- <string name="NoAvatarClassifiedsText">Usuário não tem anúncio</string>
- <string name="PicksClassifiedsLoadingText">Carregando...</string>
- <string name="MultiPreviewTitle">Preview</string>
- <string name="MultiPropertiesTitle">Propriedades</string>
- <string name="InvOfferAnObjectNamed">um objeto chamado</string>
- <string name="InvOfferOwnedByGroup">possuído pelo grupo</string>
- <string name="InvOfferOwnedByUnknownGroup">de um grupo desconhecido</string>
- <string name="InvOfferOwnedBy">de</string>
- <string name="InvOfferOwnedByUnknownUser">de usuário desconhecido</string>
- <string name="InvOfferGaveYou">deu a você</string>
- <string name="InvOfferDecline">Você recusou um(a) [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.</string>
- <string name="GroupMoneyTotal">Total</string>
- <string name="GroupMoneyBought">comprou</string>
- <string name="GroupMoneyPaidYou">pagou a você</string>
- <string name="GroupMoneyPaidInto">depositado</string>
- <string name="GroupMoneyBoughtPassTo">comprou passe para</string>
- <string name="GroupMoneyPaidFeeForEvent">pagou taxa para o evento</string>
- <string name="GroupMoneyPaidPrizeForEvent">pagou prêmio para o evento</string>
- <string name="GroupMoneyBalance">Saldo</string>
- <string name="GroupMoneyCredits">Créditos</string>
- <string name="GroupMoneyDebits">Débitos</string>
- <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>
- <string name="AcquiredItems">Itens adquiridos</string>
- <string name="Cancel">Cancelar</string>
- <string name="UploadingCosts">Carregar [NAME] custa L$ [AMOUNT]</string>
- <string name="BuyingCosts">Isso custa L$ [AMOUNT]</string>
- <string name="UnknownFileExtension">Extensão de arquivo desconhecida [.%s]
-Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh</string>
- <string name="MuteObject2">Bloquear</string>
- <string name="AddLandmarkNavBarMenu">Adicionar marco...</string>
- <string name="EditLandmarkNavBarMenu">Editar marco...</string>
- <string name="accel-mac-control">⌃</string>
- <string name="accel-mac-command">⌘</string>
- <string name="accel-mac-option">⌥</string>
- <string name="accel-mac-shift">⇧</string>
- <string name="accel-win-control">Ctrl+</string>
- <string name="accel-win-alt">Alt+</string>
- <string name="accel-win-shift">Shift+</string>
- <string name="FileSaved">Arquivo salvo</string>
- <string name="Receiving">Recebendo</string>
- <string name="AM">AM</string>
- <string name="PM">PM</string>
- <string name="PST">PST</string>
- <string name="PDT">PDT</string>
- <string name="Direction_Forward">Frente</string>
- <string name="Direction_Left">Esquerda</string>
- <string name="Direction_Right">Direita</string>
- <string name="Direction_Back">Atrás</string>
- <string name="Direction_North">Norte</string>
- <string name="Direction_South">Sul</string>
- <string name="Direction_West">Oeste</string>
- <string name="Direction_East">Leste</string>
- <string name="Direction_Up">P/ cima</string>
- <string name="Direction_Down">P/ baixo</string>
- <string name="Any Category">Qualquer categoria</string>
- <string name="Shopping">Compras</string>
- <string name="Land Rental">Aluguel de terrenos</string>
- <string name="Property Rental">Aluguel de propriedade</string>
- <string name="Special Attraction">Atração especial</string>
- <string name="New Products">Novos Produtos</string>
- <string name="Employment">Emprego</string>
- <string name="Wanted">Desejado</string>
- <string name="Service">Serviço</string>
- <string name="Personal">Pessoal</string>
- <string name="None">Nenhum</string>
- <string name="Linden Location">Locação Linden</string>
- <string name="Adult">Adulto</string>
- <string name="Arts&amp;Culture">Artes e Cultura</string>
- <string name="Business">Negócios</string>
- <string name="Educational">Educacional</string>
- <string name="Gaming">Games</string>
- <string name="Hangout">Moradia</string>
- <string name="Newcomer Friendly">Para recém-chegados</string>
- <string name="Parks&amp;Nature">Parques &amp; Natureza</string>
- <string name="Residential">Residencial</string>
- <string name="Stage">Estágio</string>
- <string name="Other">Outros</string>
- <string name="Rental">Aluguel</string>
- <string name="Any">Qualquer</string>
- <string name="You">Você</string>
- <string name="Multiple Media">Mídia múltipla</string>
- <string name="Play Media">Tocar/Pausar mídia</string>
- <string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string>
- <string name="NvidiaDriverPage">http://www.nvidia.com.br/Download/index.aspx?lang=br</string>
- <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string>
- <string name="MBCmdLineError">Um erro foi encontrado analisando a linha de comando.
+ <string name="GroupOwned">
+ Propriedade do Grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="LocalSettings">
+ Configurações locais
+ </string>
+ <string name="RegionSettings">
+ Configurações da região
+ </string>
+ <string name="NoEnvironmentSettings">
+ Esta Região não suporta as configurações do ambiente.
+ </string>
+ <string name="EnvironmentSun">
+ Dom
+ </string>
+ <string name="EnvironmentMoon">
+ Lua
+ </string>
+ <string name="EnvironmentBloom">
+ Florescer
+ </string>
+ <string name="EnvironmentCloudNoise">
+ Ruído na nuvem
+ </string>
+ <string name="EnvironmentNormalMap">
+ Mapa normal
+ </string>
+ <string name="EnvironmentTransparent">
+ Transparente
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (vai atualizar depois de publicado)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Você não criou nenhum Destaque ou Anúncio. Clique no botão "+" para criar um Destaque ou Anúncio.
+ </string>
+ <string name="NoPicksText">
+ Você não criou nenhuma Escolha. Clique em Novo Botão para criar um Escolher
+ </string>
+ <string name="NoClassifiedsText">
+ Você criou nenhum Anúncio. Clique em Novo Botão para criar um Classificado
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ O usuário não tem nenhum destaque ou anúncio
+ </string>
+ <string name="NoAvatarPicksText">
+ Usuário não tem escolha
+ </string>
+ <string name="NoAvatarClassifiedsText">
+ Usuário não tem anúncio
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Carregando...
+ </string>
+ <string name="MultiPreviewTitle">
+ Preview
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propriedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ um objeto chamado
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ possuído pelo grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ de um grupo desconhecido
+ </string>
+ <string name="InvOfferOwnedBy">
+ de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ de usuário desconhecido
+ </string>
+ <string name="InvOfferGaveYou">
+ deu a você
+ </string>
+ <string name="InvOfferDecline">
+ Você recusou um(a) [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprou
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagou a você
+ </string>
+ <string name="GroupMoneyPaidInto">
+ depositado
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ comprou passe para
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ pagou taxa para o evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ pagou prêmio para o evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="AcquiredItems">
+ Itens adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Carregar [NAME] custa L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ Isso custa L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Extensão de arquivo desconhecida [.%s]
+Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ Bloquear
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Adicionar marco...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar marco...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ Arquivo salvo
+ </string>
+ <string name="Receiving">
+ Recebendo
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Frente
+ </string>
+ <string name="Direction_Left">
+ Esquerda
+ </string>
+ <string name="Direction_Right">
+ Direita
+ </string>
+ <string name="Direction_Back">
+ Atrás
+ </string>
+ <string name="Direction_North">
+ Norte
+ </string>
+ <string name="Direction_South">
+ Sul
+ </string>
+ <string name="Direction_West">
+ Oeste
+ </string>
+ <string name="Direction_East">
+ Leste
+ </string>
+ <string name="Direction_Up">
+ P/ cima
+ </string>
+ <string name="Direction_Down">
+ P/ baixo
+ </string>
+ <string name="Any Category">
+ Qualquer categoria
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Aluguel de terrenos
+ </string>
+ <string name="Property Rental">
+ Aluguel de propriedade
+ </string>
+ <string name="Special Attraction">
+ Atração especial
+ </string>
+ <string name="New Products">
+ Novos Produtos
+ </string>
+ <string name="Employment">
+ Emprego
+ </string>
+ <string name="Wanted">
+ Desejado
+ </string>
+ <string name="Service">
+ Serviço
+ </string>
+ <string name="Personal">
+ Pessoal
+ </string>
+ <string name="None">
+ Nenhum
+ </string>
+ <string name="Linden Location">
+ Locação Linden
+ </string>
+ <string name="Adult">
+ Adulto
+ </string>
+ <string name="Arts&amp;Culture">
+ Artes e Cultura
+ </string>
+ <string name="Business">
+ Negócios
+ </string>
+ <string name="Educational">
+ Educacional
+ </string>
+ <string name="Gaming">
+ Games
+ </string>
+ <string name="Hangout">
+ Moradia
+ </string>
+ <string name="Newcomer Friendly">
+ Para recém-chegados
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques &amp; Natureza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Estágio
+ </string>
+ <string name="Other">
+ Outros
+ </string>
+ <string name="Rental">
+ Aluguel
+ </string>
+ <string name="Any">
+ Qualquer
+ </string>
+ <string name="You">
+ Você
+ </string>
+ <string name="Multiple Media">
+ Mídia múltipla
+ </string>
+ <string name="Play Media">
+ Tocar/Pausar mídia
+ </string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com.br/Download/index.aspx?lang=br
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
+ <string name="MBCmdLineError">
+ Um erro foi encontrado analisando a linha de comando.
Consulte: http://wiki.secondlife.com/wiki/Client_parameters
-Erro:</string>
- <string name="MBCmdLineUsg">[APP_NAME] Uso de linha de comando:</string>
- <string name="MBUnableToAccessFile">[APP_NAME] não é capaz de acessar um arquivo que ele precisa.
+Erro:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de linha de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] não é capaz de acessar um arquivo que ele precisa.
Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto.
Se a mensagem persistir, reinicie o computador e tente novamente.
-Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo.</string>
- <string name="MBFatalError">Erro fatal</string>
- <string name="MBRequiresAltiVec">[APP_NAME] exige processador com AltiVec (G4 ou superior).</string>
- <string name="MBAlreadyRunning">[APP_NAME] já está em execução.
+Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo.
+ </string>
+ <string name="MBFatalError">
+ Erro fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] exige processador com AltiVec (G4 ou superior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] já está em execução.
Verifique a sua barra de tarefas para obter uma cópia do programa minimizado.
-Se a mensagem persistir, reinicie o computador.</string>
- <string name="MBFrozenCrashed">[APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha?</string>
- <string name="MBAlert">Alerta</string>
- <string name="MBNoDirectX">[APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior.
+Se a mensagem persistir, reinicie o computador.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior.
[APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b.
-Deseja continuar?</string>
- <string name="MBWarning">Aviso</string>
- <string name="MBNoAutoUpdate">Atualização automática ainda não está implementada para o Linux.
-Faça o download da versão mais recente do www.secondlife.com.</string>
- <string name="MBRegClassFailed">RegisterClass falhou</string>
- <string name="MBError">Erro</string>
- <string name="MBFullScreenErr">Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT].
-Executando em janela.</string>
- <string name="MBDestroyWinFailed">Erro de desligamento ao destruir janela (DestroyWindow() failed)</string>
- <string name="MBShutdownErr">Erro de desligamento</string>
- <string name="MBDevContextErr">Não é possível fazer contexto do dispositivo GL</string>
- <string name="MBPixelFmtErr">Não é possível encontrar um formato de pixel adequado</string>
- <string name="MBPixelFmtDescErr">Não é possível encontrar descrição de formato de pixel</string>
- <string name="MBTrueColorWindow">[APP_NAME] requer True Color (32-bit) para ser executado.
-Por favor, vá para as configurações de vídeo do computador e defina o modo de cores para 32-bit.</string>
- <string name="MBAlpha">[APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vídeo.
+Deseja continuar?
+ </string>
+ <string name="MBWarning">
+ Aviso
+ </string>
+ <string name="MBNoAutoUpdate">
+ Atualização automática ainda não está implementada para o Linux.
+Faça o download da versão mais recente do www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass falhou
+ </string>
+ <string name="MBError">
+ Erro
+ </string>
+ <string name="MBFullScreenErr">
+ Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT].
+Executando em janela.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Erro de desligamento ao destruir janela (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Erro de desligamento
+ </string>
+ <string name="MBDevContextErr">
+ Não é possível fazer contexto do dispositivo GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Não é possível encontrar um formato de pixel adequado
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Não é possível encontrar descrição de formato de pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] requer True Color (32-bit) para ser executado.
+Por favor, vá para as configurações de vídeo do computador e defina o modo de cores para 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vídeo.
Por favor, certifique-se que os últimos drivers da placa de vídeo estão instalados.
Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações&gt; Display&gt;.
-Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].</string>
- <string name="MBPixelFmtSetErr">Não é possível definir o formato de pixel</string>
- <string name="MBGLContextErr">Não é possível criar o contexto de renderização GL</string>
- <string name="MBGLContextActErr">Não é possível ativar o contexto de renderização GL</string>
- <string name="MBVideoDrvErr">[APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vídeo mais recente e mesmo assim, tente reinstalá-los.
+Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Não é possível definir o formato de pixel
+ </string>
+ <string name="MBGLContextErr">
+ Não é possível criar o contexto de renderização GL
+ </string>
+ <string name="MBGLContextActErr">
+ Não é possível ativar o contexto de renderização GL
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vídeo mais recente e mesmo assim, tente reinstalá-los.
-If you continue to receive this message, contact the [SUPPORT_SITE].</string>
- <string name="5 O'Clock Shadow">Barba por fazer</string>
- <string name="All White">Todo branco</string>
- <string name="Anime Eyes">Olhos de Anime</string>
- <string name="Arced">Arqueados</string>
- <string name="Arm Length">Comprimento do braço</string>
- <string name="Attached">Anexado</string>
- <string name="Attached Earlobes">Lóbulos da orelha anexados</string>
- <string name="Back Fringe">corte traseiro</string>
- <string name="Baggy">folgado</string>
- <string name="Bangs">Franja</string>
- <string name="Beady Eyes">Olhos pequenos</string>
- <string name="Belly Size">Tamanho da barriga</string>
- <string name="Big">Grande</string>
- <string name="Big Butt">Bunda grande</string>
- <string name="Big Hair Back">Cabelo volumoso: Trás</string>
- <string name="Big Hair Front">Cabelo volumoso: Frente</string>
- <string name="Big Hair Top">Cabelo volumoso: Topo</string>
- <string name="Big Head">cabeça grande</string>
- <string name="Big Pectorals">Peitorais grandes</string>
- <string name="Big Spikes">Pontas grandes</string>
- <string name="Black">Negro</string>
- <string name="Blonde">Loiro</string>
- <string name="Blonde Hair">Cabelo loiro</string>
- <string name="Blush">Blush</string>
- <string name="Blush Color">Cor do blush</string>
- <string name="Blush Opacity">Opacidade do blush</string>
- <string name="Body Definition">Definição do corpo</string>
- <string name="Body Fat">Gordura</string>
- <string name="Body Freckles">Sardas</string>
- <string name="Body Thick">Corpo cheio</string>
- <string name="Body Thickness">Ossatura</string>
- <string name="Body Thin">Corpo magro</string>
- <string name="Bow Legged">Pernas arqueadas</string>
- <string name="Breast Buoyancy">Caimento dos seios</string>
- <string name="Breast Cleavage">Separação dos seios</string>
- <string name="Breast Size">Tamanho dos seios</string>
- <string name="Bridge Width">Largura do nariz</string>
- <string name="Broad">Largo</string>
- <string name="Brow Size">Tamanho da sobrancelha</string>
- <string name="Bug Eyes">Olhos saltados</string>
- <string name="Bugged Eyes">Olhos esbugalhados</string>
- <string name="Bulbous">Bulbos</string>
- <string name="Bulbous Nose">Nariz em bulbo</string>
- <string name="Breast Physics Mass">Seios - massa</string>
- <string name="Breast Physics Smoothing">Seios - suavização</string>
- <string name="Breast Physics Gravity">Seios - gravidade</string>
- <string name="Breast Physics Drag">Seios - resistência do ar</string>
- <string name="Breast Physics InOut Max Effect">Efeito máximo</string>
- <string name="Breast Physics InOut Spring">Vibração</string>
- <string name="Breast Physics InOut Gain">Ganho</string>
- <string name="Breast Physics InOut Damping">Duração</string>
- <string name="Breast Physics UpDown Max Effect">Efeito máximo</string>
- <string name="Breast Physics UpDown Spring">Vibração</string>
- <string name="Breast Physics UpDown Gain">Ganho</string>
- <string name="Breast Physics UpDown Damping">Duração</string>
- <string name="Breast Physics LeftRight Max Effect">Efeito máximo</string>
- <string name="Breast Physics LeftRight Spring">Vibração</string>
- <string name="Breast Physics LeftRight Gain">Ganho</string>
- <string name="Breast Physics LeftRight Damping">Duração</string>
- <string name="Belly Physics Mass">Barriga - massa</string>
- <string name="Belly Physics Smoothing">Barriga - suavização</string>
- <string name="Belly Physics Gravity">Barriga - gravidade</string>
- <string name="Belly Physics Drag">Barriga - resistência do ar</string>
- <string name="Belly Physics UpDown Max Effect">Efeito máximo</string>
- <string name="Belly Physics UpDown Spring">Vibração</string>
- <string name="Belly Physics UpDown Gain">Ganho</string>
- <string name="Belly Physics UpDown Damping">Duração</string>
- <string name="Butt Physics Mass">Nádegas - massa</string>
- <string name="Butt Physics Smoothing">Nádegas - suavização</string>
- <string name="Butt Physics Gravity">Nádegas - gravidade</string>
- <string name="Butt Physics Drag">Nádegas - resistência do ar</string>
- <string name="Butt Physics UpDown Max Effect">Efeito máximo</string>
- <string name="Butt Physics UpDown Spring">Vibração</string>
- <string name="Butt Physics UpDown Gain">Ganho</string>
- <string name="Butt Physics UpDown Damping">Duração</string>
- <string name="Butt Physics LeftRight Max Effect">Efeito máximo</string>
- <string name="Butt Physics LeftRight Spring">Vibração</string>
- <string name="Butt Physics LeftRight Gain">Ganho</string>
- <string name="Butt Physics LeftRight Damping">Duração</string>
- <string name="Bushy Eyebrows">Sobrancelhas grossas</string>
- <string name="Bushy Hair">Cabelo grosso</string>
- <string name="Butt Size">Tamanho do traseiro</string>
- <string name="Butt Gravity">Nádegas - gravidade</string>
- <string name="bustle skirt">Saia armada</string>
- <string name="no bustle">Saia reta</string>
- <string name="more bustle">Mais</string>
- <string name="Chaplin">Chaplin</string>
- <string name="Cheek Bones">Maçãs do rosto</string>
- <string name="Chest Size">Tamanho do peito</string>
- <string name="Chin Angle">Ângulo do queixo</string>
- <string name="Chin Cleft">Fissura do queixo</string>
- <string name="Chin Curtains">Barba de contorno</string>
- <string name="Chin Depth">Profundidade do queixo</string>
- <string name="Chin Heavy">Queixo pronunciado</string>
- <string name="Chin In">Queixo para dentro</string>
- <string name="Chin Out">Queixo para fora</string>
- <string name="Chin-Neck">Queixo-pescoço</string>
- <string name="Clear">Limpar</string>
- <string name="Cleft">Fenda</string>
- <string name="Close Set Eyes">Fechar conjunto de olhos</string>
- <string name="Closed">Fechado</string>
- <string name="Closed Back">Trás fechada</string>
- <string name="Closed Front">Frente fechada</string>
- <string name="Closed Left">Esquerda fechada</string>
- <string name="Closed Right">Direita fechada</string>
- <string name="Coin Purse">Pouco volume</string>
- <string name="Collar Back">Colarinho posterior</string>
- <string name="Collar Front">Colarinho anterior</string>
- <string name="Corner Down">Canto para baixo</string>
- <string name="Corner Up">Canto para cima</string>
- <string name="Creased">Vincado</string>
- <string name="Crooked Nose">Nariz torto</string>
- <string name="Cuff Flare">Bainha larga</string>
- <string name="Dark">Escuro</string>
- <string name="Dark Green">Verde escuro</string>
- <string name="Darker">Mais escuro</string>
- <string name="Deep">Profundidade</string>
- <string name="Default Heels">Salto padrão</string>
- <string name="Dense">Densidade</string>
- <string name="Double Chin">Queixo duplo</string>
- <string name="Downturned">Curvado para baixo</string>
- <string name="Duffle Bag">Mais volume</string>
- <string name="Ear Angle">Ângulo da orelha</string>
- <string name="Ear Size">Tamanho da orelha</string>
- <string name="Ear Tips">Pontas das orelhas</string>
- <string name="Egg Head">Cabeça oval</string>
- <string name="Eye Bags">Olheiras</string>
- <string name="Eye Color">Cor dos olhos</string>
- <string name="Eye Depth">Profundidade dos olhos</string>
- <string name="Eye Lightness">Luminosidade dos olhos</string>
- <string name="Eye Opening">Abertura dos olhos</string>
- <string name="Eye Pop">Olho saltado</string>
- <string name="Eye Size">Tamanho dos olhos</string>
- <string name="Eye Spacing">Espaçamento dos olhos</string>
- <string name="Eyebrow Arc">Arco da sobrancelha</string>
- <string name="Eyebrow Density">Densidade da sobrancelha</string>
- <string name="Eyebrow Height">Altura da sobrancelha</string>
- <string name="Eyebrow Points">Pontas da sobrancelha</string>
- <string name="Eyebrow Size">Tamanho da sobrancelha</string>
- <string name="Eyelash Length">Comprimento das pestanas</string>
- <string name="Eyeliner">Delineador</string>
- <string name="Eyeliner Color">Cor do delineador</string>
- <string name="Eyes Bugged">Olhos esbugalhados</string>
- <string name="Face Shear">Face raspada</string>
- <string name="Facial Definition">Definição facial</string>
- <string name="Far Set Eyes">Distância entre os olhos</string>
- <string name="Fat Lips">Lábios carnudos</string>
- <string name="Female">Feminino</string>
- <string name="Fingerless">Dedos</string>
- <string name="Fingers">Dedos</string>
- <string name="Flared Cuffs">Punhos largos</string>
- <string name="Flat">Chato</string>
- <string name="Flat Butt">Traseiro chato</string>
- <string name="Flat Head">Cabeça chata</string>
- <string name="Flat Toe">Dedos dos pés chatos</string>
- <string name="Foot Size">Tamanho dos pés</string>
- <string name="Forehead Angle">Ângulo da testa</string>
- <string name="Forehead Heavy">Testa pronunciada</string>
- <string name="Freckles">Sardas</string>
- <string name="Front Fringe">Franja</string>
- <string name="Full Back">Trás cheia</string>
- <string name="Full Eyeliner">Delienador cheio</string>
- <string name="Full Front">Frente cheia</string>
- <string name="Full Hair Sides">Cabelos laterais cheios</string>
- <string name="Full Sides">Lados cheios</string>
- <string name="Glossy">Brilhante</string>
- <string name="Glove Fingers">Dedos da luva</string>
- <string name="Glove Length">Comprimento das luvas</string>
- <string name="Hair">Cabelo</string>
- <string name="Hair Back">Cabelo: Trás</string>
- <string name="Hair Front">Cabelo: Frente</string>
- <string name="Hair Sides">Cabelos: Lateral</string>
- <string name="Hair Sweep">Cabelo penteado</string>
- <string name="Hair Thickess">Espessura do cabelo</string>
- <string name="Hair Thickness">Espessura do cabelo</string>
- <string name="Hair Tilt">Divisão do cabelo</string>
- <string name="Hair Tilted Left">Divistão do cabelo esquerda</string>
- <string name="Hair Tilted Right">Divisão do cabelo direita</string>
- <string name="Hair Volume">Cabelo: Volume</string>
- <string name="Hand Size">Tamanho das mãos</string>
- <string name="Handlebars">Bigode</string>
- <string name="Head Length">Comprimento da cabeça</string>
- <string name="Head Shape">Formato da cabeça</string>
- <string name="Head Size">Tamanho da cabeça</string>
- <string name="Head Stretch">Extensão da cabeça</string>
- <string name="Heel Height">Altura do salto</string>
- <string name="Heel Shape">Formato do salto</string>
- <string name="Height">Altura</string>
- <string name="High">Alto</string>
- <string name="High Heels">Salto alto</string>
- <string name="High Jaw">Maxilar alto</string>
- <string name="High Platforms">Plataformas altas</string>
- <string name="High and Tight">Alto e justo</string>
- <string name="Higher">Mais alto</string>
- <string name="Hip Length">Comprimento do quadril</string>
- <string name="Hip Width">Largura do quadril</string>
- <string name="Hover">Pairar</string>
- <string name="In">Dentro</string>
- <string name="In Shdw Color">Cor da sombra interna</string>
- <string name="In Shdw Opacity">Opacidade da sombra interna</string>
- <string name="Inner Eye Corner">Canto interno dos olhos</string>
- <string name="Inner Eye Shadow">Sombra interna dos olhos</string>
- <string name="Inner Shadow">Sombra interna</string>
- <string name="Jacket Length">Comprimento da blusa</string>
- <string name="Jacket Wrinkles">Dobras da jaqueta</string>
- <string name="Jaw Angle">Ângulo da mandíbula</string>
- <string name="Jaw Jut">Posição do maxilar</string>
- <string name="Jaw Shape">Formato do maxilar</string>
- <string name="Join">Juntar</string>
- <string name="Jowls">Papo</string>
- <string name="Knee Angle">Ângulo do joelho</string>
- <string name="Knock Kneed">Joelhos para dentro</string>
- <string name="Large">Grande</string>
- <string name="Large Hands">Mãos grandes</string>
- <string name="Left Part">Parte esquerda</string>
- <string name="Leg Length">Comprimento da perna</string>
- <string name="Leg Muscles">Musculatura da perna</string>
- <string name="Less">Menos</string>
- <string name="Less Body Fat">Menos gordura</string>
- <string name="Less Curtains">Menos barba</string>
- <string name="Less Freckles">Menos sardas</string>
- <string name="Less Full">Menos</string>
- <string name="Less Gravity">Menos gravidade</string>
- <string name="Less Love">Menos excesso</string>
- <string name="Less Muscles">Menos músculos</string>
- <string name="Less Muscular">Menos musculoso</string>
- <string name="Less Rosy">Menos rosado</string>
- <string name="Less Round">Menos arredondado</string>
- <string name="Less Saddle">Menos ancas</string>
- <string name="Less Square">Menos quadrado</string>
- <string name="Less Volume">Menos volume</string>
- <string name="Less soul">Menos alma</string>
- <string name="Lighter">Lighter</string>
- <string name="Lip Cleft">Fenda dos lábios</string>
- <string name="Lip Cleft Depth">Profundidade da fenda dos lábios</string>
- <string name="Lip Fullness">Volume dos lábios</string>
- <string name="Lip Pinkness">Rosado dos lábios</string>
- <string name="Lip Ratio">Proporção dos lábios</string>
- <string name="Lip Thickness">Espessura dos lábios</string>
- <string name="Lip Width">Largura dos lábios</string>
- <string name="Lipgloss">Brilho dos lábios</string>
- <string name="Lipstick">Batom</string>
- <string name="Lipstick Color">Cor do batom</string>
- <string name="Long">Longo</string>
- <string name="Long Head">Cabeça alongada</string>
- <string name="Long Hips">Lábios longos</string>
- <string name="Long Legs">Pernas longas</string>
- <string name="Long Neck">Pescoço longo</string>
- <string name="Long Pigtails">Chiquinhas longas</string>
- <string name="Long Ponytail">Rabo de cavalo longo</string>
- <string name="Long Torso">Torso longo</string>
- <string name="Long arms">Braços longos</string>
- <string name="Loose Pants">Pantalonas</string>
- <string name="Loose Shirt">Camisa folgada</string>
- <string name="Loose Sleeves">Mangas folgadas</string>
- <string name="Love Handles">Pneu</string>
- <string name="Low">Baixo</string>
- <string name="Low Heels">Salto baixo</string>
- <string name="Low Jaw">Maxilar baixo</string>
- <string name="Low Platforms">Plataformas baixas</string>
- <string name="Low and Loose">Baixo e solto</string>
- <string name="Lower">Mais baixo</string>
- <string name="Lower Bridge">Mais baixa</string>
- <string name="Lower Cheeks">Bochechas abaixadas</string>
- <string name="Male">Masculino</string>
- <string name="Middle Part">Parte do meio</string>
- <string name="More">Mais</string>
- <string name="More Blush">Mais blush</string>
- <string name="More Body Fat">Mais gordura</string>
- <string name="More Curtains">Mais barba</string>
- <string name="More Eyeshadow">Mais sombra dos olhos</string>
- <string name="More Freckles">Mais sardas</string>
- <string name="More Full">Mais volume</string>
- <string name="More Gravity">Mais gravidade</string>
- <string name="More Lipstick">Mais batom</string>
- <string name="More Love">Mais cintura</string>
- <string name="More Lower Lip">Mais lábio inferior</string>
- <string name="More Muscles">Mais músculos</string>
- <string name="More Muscular">Mais musculoso</string>
- <string name="More Rosy">Mais rosado</string>
- <string name="More Round">Mais arredondado</string>
- <string name="More Saddle">Mais ancas</string>
- <string name="More Sloped">Mais inclinado</string>
- <string name="More Square">Mais quadrado</string>
- <string name="More Upper Lip">Mais lábios superiores</string>
- <string name="More Vertical">Mais vertical</string>
- <string name="More Volume">Mais volume</string>
- <string name="More soul">Mais alma</string>
- <string name="Moustache">Bigode</string>
- <string name="Mouth Corner">Canto da boca</string>
- <string name="Mouth Position">Posição da boca</string>
- <string name="Mowhawk">Moicano</string>
- <string name="Muscular">Muscular</string>
- <string name="Mutton Chops">Costeletas</string>
- <string name="Nail Polish">Esmate das unhas</string>
- <string name="Nail Polish Color">Cor do esmalte das unhas</string>
- <string name="Narrow">Estreito</string>
- <string name="Narrow Back">Costas estreitas</string>
- <string name="Narrow Front">Frente estreita</string>
- <string name="Narrow Lips">Lábios estreitos</string>
- <string name="Natural">Natural</string>
- <string name="Neck Length">Comprimento do pescoço</string>
- <string name="Neck Thickness">Espessura do pescoço</string>
- <string name="No Blush">Sem blush</string>
- <string name="No Eyeliner">Sem delineador</string>
- <string name="No Eyeshadow">Sem sombra</string>
- <string name="No Lipgloss">Sem brilho</string>
- <string name="No Lipstick">Sem batom</string>
- <string name="No Part">Sem parte</string>
- <string name="No Polish">Sem esmalte</string>
- <string name="No Red">Sem vermelho</string>
- <string name="No Spikes">Sem pontas</string>
- <string name="No White">Sem branco</string>
- <string name="No Wrinkles">Sem dobras</string>
- <string name="Normal Lower">Normal inferior</string>
- <string name="Normal Upper">Normal superior</string>
- <string name="Nose Left">Nariz para esquerda</string>
- <string name="Nose Right">Nariz para direita</string>
- <string name="Nose Size">Tamanho do nariz</string>
- <string name="Nose Thickness">Espessura do nariz</string>
- <string name="Nose Tip Angle">Ângulo da ponta do nariz</string>
- <string name="Nose Tip Shape">Formato da ponta do nariz</string>
- <string name="Nose Width">Largura do nariz</string>
- <string name="Nostril Division">Divisão das narinas</string>
- <string name="Nostril Width">Largura das narinas</string>
- <string name="Opaque">Opaco</string>
- <string name="Open">Abrir</string>
- <string name="Open Back">Aberto atrás</string>
- <string name="Open Front">Aberto na frente</string>
- <string name="Open Left">Aberto esquerdo</string>
- <string name="Open Right">Aberto direito</string>
- <string name="Orange">Laranja</string>
- <string name="Out">Fora</string>
- <string name="Out Shdw Color">Cor da sombra externa</string>
- <string name="Out Shdw Opacity">Opacidade da sombra externa</string>
- <string name="Outer Eye Corner">Canto externo do olho</string>
- <string name="Outer Eye Shadow">Sombra externa do olho</string>
- <string name="Outer Shadow">Sombra externa</string>
- <string name="Overbite">Má oclusão</string>
- <string name="Package">Púbis</string>
- <string name="Painted Nails">Unhas pintadas</string>
- <string name="Pale">Pálido</string>
- <string name="Pants Crotch">Cavalo da calça</string>
- <string name="Pants Fit">Caimento das calças</string>
- <string name="Pants Length">Comprimento das calças</string>
- <string name="Pants Waist">Cintura da calça</string>
- <string name="Pants Wrinkles">Dobras das calças</string>
- <string name="Part">Parte</string>
- <string name="Part Bangs">Divisão da franja</string>
- <string name="Pectorals">Peitorais</string>
- <string name="Pigment">Pigmento</string>
- <string name="Pigtails">Chiquinhas</string>
- <string name="Pink">Rosa</string>
- <string name="Pinker">Mais rosado</string>
- <string name="Platform Height">Altura da plataforma</string>
- <string name="Platform Width">Largura da plataforma</string>
- <string name="Pointy">Pontudo</string>
- <string name="Pointy Heels">Salto agulha</string>
- <string name="Ponytail">Rabo de cavalo</string>
- <string name="Poofy Skirt">Saia bufante</string>
- <string name="Pop Left Eye">Olho saltado esquerdo</string>
- <string name="Pop Right Eye">Olho saltado direito</string>
- <string name="Puffy">Inchado</string>
- <string name="Puffy Eyelids">Pálpebras inchadas</string>
- <string name="Rainbow Color">Cor do arco íris</string>
- <string name="Red Hair">Cabelo ruivo</string>
- <string name="Regular">Normal</string>
- <string name="Right Part">Parte direita</string>
- <string name="Rosy Complexion">Rosado da face</string>
- <string name="Round">Arredondado</string>
- <string name="Ruddiness">Rubor</string>
- <string name="Ruddy">Corado</string>
- <string name="Rumpled Hair">Cabelo desalinhado</string>
- <string name="Saddle Bags">Culote</string>
- <string name="Scrawny Leg">Pernas magricelas</string>
- <string name="Separate">Separar</string>
- <string name="Shallow">Raso</string>
- <string name="Shear Back">Trás rente</string>
- <string name="Shear Face">Face raspada</string>
- <string name="Shear Front">Frente rente</string>
- <string name="Shear Left Up">Esquerda rente para cima</string>
- <string name="Shear Right Up">Trás rente para cima</string>
- <string name="Sheared Back">Rente atrás</string>
- <string name="Sheared Front">Rente frente</string>
- <string name="Shift Left">Deslocar p/ esquerda</string>
- <string name="Shift Mouth">Deslocar boca</string>
- <string name="Shift Right">Deslocar p/ direita</string>
- <string name="Shirt Bottom">Barra da camisa</string>
- <string name="Shirt Fit">Ajuste da camisa</string>
- <string name="Shirt Wrinkles">+/- amassada</string>
- <string name="Shoe Height">Altura do sapato</string>
- <string name="Short">Curto</string>
- <string name="Short Arms">Braços curtos</string>
- <string name="Short Legs">Pernas curtas</string>
- <string name="Short Neck">Pescoço curto</string>
- <string name="Short Pigtails">Chiquinhas curtas</string>
- <string name="Short Ponytail">Rabo de cavalo curto</string>
- <string name="Short Sideburns">Costeletas curtas</string>
- <string name="Short Torso">Tronco curto</string>
- <string name="Short hips">Quadril curto</string>
- <string name="Shoulders">Ombros</string>
- <string name="Side Fringe">pontas laterais</string>
- <string name="Sideburns">Costeletas</string>
- <string name="Sides Hair">Cabelo lateral</string>
- <string name="Sides Hair Down">Cabelo lateral long</string>
- <string name="Sides Hair Up">Cabelo lateral superior</string>
- <string name="Skinny Neck">Pescoço fino</string>
- <string name="Skirt Fit">Ajuste de saia</string>
- <string name="Skirt Length">Comprimento da saia</string>
- <string name="Slanted Forehead">Testa inclinada</string>
- <string name="Sleeve Length">Comprimento da manga</string>
- <string name="Sleeve Looseness">Folga da manga</string>
- <string name="Slit Back">Abertura : Atrás</string>
- <string name="Slit Front">Abertura: Frente</string>
- <string name="Slit Left">Abertura: Esquerda</string>
- <string name="Slit Right">Abertura: Direita</string>
- <string name="Small">Pequeno</string>
- <string name="Small Hands">Mãos pequenas</string>
- <string name="Small Head">Cabeça pequena</string>
- <string name="Smooth">Suavizar</string>
- <string name="Smooth Hair">Suavizar cabelo</string>
- <string name="Socks Length">Comprimento das meias</string>
- <string name="Soulpatch">Cavanhaque</string>
- <string name="Sparse">Disperso</string>
- <string name="Spiked Hair">Cabelo espetado</string>
- <string name="Square">Quadrado</string>
- <string name="Square Toe">Dedo quadrado</string>
- <string name="Squash Head">Cabeça de Pera</string>
- <string name="Stretch Head">Cabeça esticada</string>
- <string name="Sunken">Afundar</string>
- <string name="Sunken Chest">Peito afundado</string>
- <string name="Sunken Eyes">Olhos afundados</string>
- <string name="Sweep Back">Pentear para trás</string>
- <string name="Sweep Forward">Pentear para frente</string>
- <string name="Tall">Alto</string>
- <string name="Taper Back">Afinar atrás</string>
- <string name="Taper Front">Afinar a frente</string>
- <string name="Thick Heels">Salto grosso</string>
- <string name="Thick Neck">Pescoço grosso</string>
- <string name="Thick Toe">Dedo grosso</string>
- <string name="Thin">Fino</string>
- <string name="Thin Eyebrows">Sobrancelhas finas</string>
- <string name="Thin Lips">Lábios finos</string>
- <string name="Thin Nose">Nariz fino</string>
- <string name="Tight Chin">Queixo apertado</string>
- <string name="Tight Cuffs">Punho justo</string>
- <string name="Tight Pants">Calça justa</string>
- <string name="Tight Shirt">Camisa justa</string>
- <string name="Tight Skirt">Saia justa</string>
- <string name="Tight Sleeves">Tight Sleeves</string>
- <string name="Toe Shape">Formato dos dedos</string>
- <string name="Toe Thickness">Espessura dos dos dedos</string>
- <string name="Torso Length">Comprimento do tronco</string>
- <string name="Torso Muscles">Músculos do tronco</string>
- <string name="Torso Scrawny">Tronco magricela</string>
- <string name="Unattached">Desanexado</string>
- <string name="Uncreased">Uncreased</string>
- <string name="Underbite">Underbite</string>
- <string name="Unnatural">Não natural</string>
- <string name="Upper Bridge">Parte alta do nariz</string>
- <string name="Upper Cheeks">Bochechas altas</string>
- <string name="Upper Chin Cleft">fenda do queixo alta</string>
- <string name="Upper Eyelid Fold">Curvatura dos cílios supériores</string>
- <string name="Upturned">Voltado para cima</string>
- <string name="Very Red">Bem vermelho</string>
- <string name="Waist Height">Altura da cintura</string>
- <string name="Well-Fed">Corpulento</string>
- <string name="White Hair">Grisalho</string>
- <string name="Wide">Amplo</string>
- <string name="Wide Back">Costas largas</string>
- <string name="Wide Front">Testa larga</string>
- <string name="Wide Lips">Lábios amplos</string>
- <string name="Wild">Selvagem</string>
- <string name="Wrinkles">Rugas</string>
- <string name="LocationCtrlAddLandmarkTooltip">Adicionar às minhas Landmarks</string>
- <string name="LocationCtrlEditLandmarkTooltip">Editar minhas Landmarks</string>
- <string name="LocationCtrlInfoBtnTooltip">Ver mais informações sobre a localização atual</string>
- <string name="LocationCtrlComboBtnTooltip">Histórico de localizações</string>
- <string name="LocationCtrlAdultIconTooltip">Região Adulta</string>
- <string name="LocationCtrlModerateIconTooltip">Região Moderada</string>
- <string name="LocationCtrlGeneralIconTooltip">Região em geral</string>
- <string name="LocationCtrlSeeAVsTooltip">Os avatares neste lote não podem ser vistos ou ouvidos por avatares fora dele</string>
- <string name="LocationCtrlPathfindingDirtyTooltip">Os objetos que se movem podem não se comportar corretamente nesta região até que ela seja recarregada.</string>
- <string name="LocationCtrlPathfindingDisabledTooltip">O pathfinding dinâmico não está habilitado nesta região.</string>
- <string name="UpdaterWindowTitle">[APP_NAME] Atualização</string>
- <string name="UpdaterNowUpdating">Atualizando agora o [APP_NAME]...</string>
- <string name="UpdaterNowInstalling">Instalando [APP_NAME]...</string>
- <string name="UpdaterUpdatingDescriptive">Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente.</string>
- <string name="UpdaterProgressBarTextWithEllipses">Fazendo o download da atualização...</string>
- <string name="UpdaterProgressBarText">Fazendo o download da atualização</string>
- <string name="UpdaterFailDownloadTitle">Falha no download da atualização</string>
- <string name="UpdaterFailUpdateDescriptive">Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com.</string>
- <string name="UpdaterFailInstallTitle">Falha ao instalar a atualização</string>
- <string name="UpdaterFailStartTitle">Falha ao iniciar o visualizador</string>
- <string name="ItemsComingInTooFastFrom">[APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos</string>
- <string name="ItemsComingInTooFast">[APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos</string>
- <string name="IM_logging_string">-- Log de mensagem instantânea habilitado --</string>
- <string name="IM_typing_start_string">[NAME] está digitando...</string>
- <string name="Unnamed">(Anônimo)</string>
- <string name="IM_moderated_chat_label">(Moderado: Voz desativado por padrão)</string>
- <string name="IM_unavailable_text_label">Bate-papo de texto não está disponível para esta chamada.</string>
- <string name="IM_muted_text_label">Seu bate- papo de texto foi desabilitado por um Moderador do Grupo.</string>
- <string name="IM_default_text_label">Clique aqui para menagem instantânea.</string>
- <string name="IM_to_label">Para</string>
- <string name="IM_moderator_label">(Moderador)</string>
- <string name="Saved_message">(Salvo em [LONG_TIMESTAMP])</string>
- <string name="IM_unblock_only_groups_friends">Para visualizar esta mensagem, você deve desmarcar &quot;Apenas amigos e grupos podem me ligar ou enviar MIs&quot; em Preferências/Privacidade.</string>
- <string name="OnlineStatus">Conectado</string>
- <string name="OfflineStatus">Desconectado</string>
- <string name="not_online_msg">O usuário não está online. As mensagens serão armazenadas e enviadas mais tarde.</string>
- <string name="not_online_inventory">O usuário não está online. O inventário foi salvo.</string>
- <string name="answered_call">Ligação atendida</string>
- <string name="you_started_call">Você iniciou uma ligação de voz</string>
- <string name="you_joined_call">Você entrou na ligação</string>
- <string name="you_auto_rejected_call-im">Você recusou automaticamente a chamada de voz enquanto &quot;Não perturbe&quot; estava ativado.</string>
- <string name="name_started_call">[NAME] iniciou uma ligação de voz</string>
- <string name="ringing-im">Entrando em ligação de voz...</string>
- <string name="connected-im">Conectado. Para sair, clique em Desligar</string>
- <string name="hang_up-im">Saiu da ligação de voz</string>
- <string name="conference-title">Bate-papo com várias pessoas</string>
- <string name="conference-title-incoming">Conversa com [AGENT_NAME]</string>
- <string name="inventory_item_offered-im">Item do inventário '[ITEM_NAME]' oferecido</string>
- <string name="inventory_folder_offered-im">Pasta do inventário '[ITEM_NAME]' oferecida</string>
- <string name="facebook_post_success">Você publicou no Facebook.</string>
- <string name="flickr_post_success">Você publicou no Flickr.</string>
- <string name="twitter_post_success">Você publicou no Twitter.</string>
- <string name="no_session_message">(Sessão de MI inexistente)</string>
- <string name="only_user_message">Você é o único usuário desta sessão.</string>
- <string name="offline_message">[NAME] está offline.</string>
- <string name="invite_message">Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz.</string>
- <string name="muted_message">Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem.</string>
- <string name="generic">Erro de solicitação, tente novamente mais tarde.</string>
- <string name="generic_request_error">Erro na requisição, por favor, tente novamente.</string>
- <string name="insufficient_perms_error">Você não tem permissões suficientes.</string>
- <string name="session_does_not_exist_error">A sessão deixou de existir</string>
- <string name="no_ability_error">Você não possui esta habilidade.</string>
- <string name="no_ability">Você não possui esta habilidade.</string>
- <string name="not_a_mod_error">Você não é um moderador de sessão.</string>
- <string name="muted">Bate-papo de texto desativado por um moderador.</string>
- <string name="muted_error">Um moderador do grupo desabilitou seu bate-papo em texto.</string>
- <string name="add_session_event">Não foi possível adicionar usuários na sessão de bate-papo com [RECIPIENT].</string>
- <string name="message">Não foi possível enviar sua mensagem para o bate-papo com [RECIPIENT].</string>
- <string name="message_session_event">Não foi possível enviar sua mensagem na sessão de bate- papo com [RECIPIENT].</string>
- <string name="mute">Erro durante a moderação.</string>
- <string name="removed">Você foi tirado do grupo.</string>
- <string name="removed_from_group">Você foi removido do grupo.</string>
- <string name="close_on_no_ability">Você não possui mais a habilidade de estar na sessão de bate-papo.</string>
- <string name="unread_chat_single">[SOURCES] disse alguma coisa</string>
- <string name="unread_chat_multiple">[SOURCES] disseram alguma coisa</string>
- <string name="session_initialization_timed_out_error">A inicialização da sessão expirou</string>
- <string name="Home position set.">Posição inicial definida.</string>
- <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string>
- <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string>
- <string name="paid_you_ldollars">[NAME] lhe pagou L$ [AMOUNT] [REASON].</string>
- <string name="paid_you_ldollars_gift">[NAME] lhe pagou L$ [AMOUNT]: [REASON]</string>
- <string name="paid_you_ldollars_no_reason">[NAME] lhe pagou L$ [AMOUNT]</string>
- <string name="you_paid_ldollars">Você pagou L$[AMOUNT] por [REASON] a [NAME].</string>
- <string name="you_paid_ldollars_gift">Você pagou L$[AMOUNT] a [NAME]: [REASON]</string>
- <string name="you_paid_ldollars_no_info">Você acaba de pagar L$[AMOUNT].</string>
- <string name="you_paid_ldollars_no_reason">Você pagou L$[AMOUNT] a [NAME].</string>
- <string name="you_paid_ldollars_no_name">Você pagou L$[AMOUNT] por [REASON].</string>
- <string name="you_paid_failure_ldollars">Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON].</string>
- <string name="you_paid_failure_ldollars_gift">Você não pagou L$[AMOUNT] a [NAME]: [REASON]</string>
- <string name="you_paid_failure_ldollars_no_info">Você não pagou L$[AMOUNT].</string>
- <string name="you_paid_failure_ldollars_no_reason">Você não pagou L$[AMOUNT] a [NAME].</string>
- <string name="you_paid_failure_ldollars_no_name">Você não pagou L$[AMOUNT] referentes a [REASON].</string>
- <string name="for item">por [ITEM]</string>
- <string name="for a parcel of land">por uma parcela</string>
- <string name="for a land access pass">por um passe de acesso</string>
- <string name="for deeding land">para doar um terreno</string>
- <string name="to create a group">para criar um grupo</string>
- <string name="to join a group">para entrar em um grupo</string>
- <string name="to upload">para carregar</string>
- <string name="to publish a classified ad">para publicar um anúncio</string>
- <string name="giving">Dando L$ [AMOUNT]</string>
- <string name="uploading_costs">O upload custa L$ [AMOUNT]</string>
- <string name="this_costs">Isso custa L$ [AMOUNT]</string>
- <string name="buying_selected_land">Comprando terreno selecionado L$ [AMOUNT]</string>
- <string name="this_object_costs">Esse objeto custa L$ [AMOUNT]</string>
- <string name="group_role_everyone">Todos</string>
- <string name="group_role_officers">Oficiais</string>
- <string name="group_role_owners">Proprietários</string>
- <string name="group_member_status_online">Conectado</string>
- <string name="uploading_abuse_report">Carregando...
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="5 O'Clock Shadow">
+ Barba por fazer
+ </string>
+ <string name="All White">
+ Todo branco
+ </string>
+ <string name="Anime Eyes">
+ Olhos de Anime
+ </string>
+ <string name="Arced">
+ Arqueados
+ </string>
+ <string name="Arm Length">
+ Comprimento do braço
+ </string>
+ <string name="Attached">
+ Anexado
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos da orelha anexados
+ </string>
+ <string name="Back Fringe">
+ corte traseiro
+ </string>
+ <string name="Baggy">
+ folgado
+ </string>
+ <string name="Bangs">
+ Franja
+ </string>
+ <string name="Beady Eyes">
+ Olhos pequenos
+ </string>
+ <string name="Belly Size">
+ Tamanho da barriga
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Bunda grande
+ </string>
+ <string name="Big Hair Back">
+ Cabelo volumoso: Trás
+ </string>
+ <string name="Big Hair Front">
+ Cabelo volumoso: Frente
+ </string>
+ <string name="Big Hair Top">
+ Cabelo volumoso: Topo
+ </string>
+ <string name="Big Head">
+ cabeça grande
+ </string>
+ <string name="Big Pectorals">
+ Peitorais grandes
+ </string>
+ <string name="Big Spikes">
+ Pontas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Loiro
+ </string>
+ <string name="Blonde Hair">
+ Cabelo loiro
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Cor do blush
+ </string>
+ <string name="Blush Opacity">
+ Opacidade do blush
+ </string>
+ <string name="Body Definition">
+ Definição do corpo
+ </string>
+ <string name="Body Fat">
+ Gordura
+ </string>
+ <string name="Body Freckles">
+ Sardas
+ </string>
+ <string name="Body Thick">
+ Corpo cheio
+ </string>
+ <string name="Body Thickness">
+ Ossatura
+ </string>
+ <string name="Body Thin">
+ Corpo magro
+ </string>
+ <string name="Bow Legged">
+ Pernas arqueadas
+ </string>
+ <string name="Breast Buoyancy">
+ Caimento dos seios
+ </string>
+ <string name="Breast Cleavage">
+ Separação dos seios
+ </string>
+ <string name="Breast Size">
+ Tamanho dos seios
+ </string>
+ <string name="Bridge Width">
+ Largura do nariz
+ </string>
+ <string name="Broad">
+ Largo
+ </string>
+ <string name="Brow Size">
+ Tamanho da sobrancelha
+ </string>
+ <string name="Bug Eyes">
+ Olhos saltados
+ </string>
+ <string name="Bugged Eyes">
+ Olhos esbugalhados
+ </string>
+ <string name="Bulbous">
+ Bulbos
+ </string>
+ <string name="Bulbous Nose">
+ Nariz em bulbo
+ </string>
+ <string name="Breast Physics Mass">
+ Seios - massa
+ </string>
+ <string name="Breast Physics Smoothing">
+ Seios - suavização
+ </string>
+ <string name="Breast Physics Gravity">
+ Seios - gravidade
+ </string>
+ <string name="Breast Physics Drag">
+ Seios - resistência do ar
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Duração
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Duração
+ </string>
+ <string name="Belly Physics Mass">
+ Barriga - massa
+ </string>
+ <string name="Belly Physics Smoothing">
+ Barriga - suavização
+ </string>
+ <string name="Belly Physics Gravity">
+ Barriga - gravidade
+ </string>
+ <string name="Belly Physics Drag">
+ Barriga - resistência do ar
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Butt Physics Mass">
+ Nádegas - massa
+ </string>
+ <string name="Butt Physics Smoothing">
+ Nádegas - suavização
+ </string>
+ <string name="Butt Physics Gravity">
+ Nádegas - gravidade
+ </string>
+ <string name="Butt Physics Drag">
+ Nádegas - resistência do ar
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Vibração
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Ganho
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Duração
+ </string>
+ <string name="Bushy Eyebrows">
+ Sobrancelhas grossas
+ </string>
+ <string name="Bushy Hair">
+ Cabelo grosso
+ </string>
+ <string name="Butt Size">
+ Tamanho do traseiro
+ </string>
+ <string name="Butt Gravity">
+ Nádegas - gravidade
+ </string>
+ <string name="bustle skirt">
+ Saia armada
+ </string>
+ <string name="no bustle">
+ Saia reta
+ </string>
+ <string name="more bustle">
+ Mais
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Maçãs do rosto
+ </string>
+ <string name="Chest Size">
+ Tamanho do peito
+ </string>
+ <string name="Chin Angle">
+ Ângulo do queixo
+ </string>
+ <string name="Chin Cleft">
+ Fissura do queixo
+ </string>
+ <string name="Chin Curtains">
+ Barba de contorno
+ </string>
+ <string name="Chin Depth">
+ Profundidade do queixo
+ </string>
+ <string name="Chin Heavy">
+ Queixo pronunciado
+ </string>
+ <string name="Chin In">
+ Queixo para dentro
+ </string>
+ <string name="Chin Out">
+ Queixo para fora
+ </string>
+ <string name="Chin-Neck">
+ Queixo-pescoço
+ </string>
+ <string name="Clear">
+ Limpar
+ </string>
+ <string name="Cleft">
+ Fenda
+ </string>
+ <string name="Close Set Eyes">
+ Fechar conjunto de olhos
+ </string>
+ <string name="Closed">
+ Fechado
+ </string>
+ <string name="Closed Back">
+ Trás fechada
+ </string>
+ <string name="Closed Front">
+ Frente fechada
+ </string>
+ <string name="Closed Left">
+ Esquerda fechada
+ </string>
+ <string name="Closed Right">
+ Direita fechada
+ </string>
+ <string name="Coin Purse">
+ Pouco volume
+ </string>
+ <string name="Collar Back">
+ Colarinho posterior
+ </string>
+ <string name="Collar Front">
+ Colarinho anterior
+ </string>
+ <string name="Corner Down">
+ Canto para baixo
+ </string>
+ <string name="Corner Up">
+ Canto para cima
+ </string>
+ <string name="Creased">
+ Vincado
+ </string>
+ <string name="Crooked Nose">
+ Nariz torto
+ </string>
+ <string name="Cuff Flare">
+ Bainha larga
+ </string>
+ <string name="Dark">
+ Escuro
+ </string>
+ <string name="Dark Green">
+ Verde escuro
+ </string>
+ <string name="Darker">
+ Mais escuro
+ </string>
+ <string name="Deep">
+ Profundidade
+ </string>
+ <string name="Default Heels">
+ Salto padrão
+ </string>
+ <string name="Dense">
+ Densidade
+ </string>
+ <string name="Double Chin">
+ Queixo duplo
+ </string>
+ <string name="Downturned">
+ Curvado para baixo
+ </string>
+ <string name="Duffle Bag">
+ Mais volume
+ </string>
+ <string name="Ear Angle">
+ Ângulo da orelha
+ </string>
+ <string name="Ear Size">
+ Tamanho da orelha
+ </string>
+ <string name="Ear Tips">
+ Pontas das orelhas
+ </string>
+ <string name="Egg Head">
+ Cabeça oval
+ </string>
+ <string name="Eye Bags">
+ Olheiras
+ </string>
+ <string name="Eye Color">
+ Cor dos olhos
+ </string>
+ <string name="Eye Depth">
+ Profundidade dos olhos
+ </string>
+ <string name="Eye Lightness">
+ Luminosidade dos olhos
+ </string>
+ <string name="Eye Opening">
+ Abertura dos olhos
+ </string>
+ <string name="Eye Pop">
+ Olho saltado
+ </string>
+ <string name="Eye Size">
+ Tamanho dos olhos
+ </string>
+ <string name="Eye Spacing">
+ Espaçamento dos olhos
+ </string>
+ <string name="Eyebrow Arc">
+ Arco da sobrancelha
+ </string>
+ <string name="Eyebrow Density">
+ Densidade da sobrancelha
+ </string>
+ <string name="Eyebrow Height">
+ Altura da sobrancelha
+ </string>
+ <string name="Eyebrow Points">
+ Pontas da sobrancelha
+ </string>
+ <string name="Eyebrow Size">
+ Tamanho da sobrancelha
+ </string>
+ <string name="Eyelash Length">
+ Comprimento das pestanas
+ </string>
+ <string name="Eyeliner">
+ Delineador
+ </string>
+ <string name="Eyeliner Color">
+ Cor do delineador
+ </string>
+ <string name="Eyes Bugged">
+ Olhos esbugalhados
+ </string>
+ <string name="Face Shear">
+ Face raspada
+ </string>
+ <string name="Facial Definition">
+ Definição facial
+ </string>
+ <string name="Far Set Eyes">
+ Distância entre os olhos
+ </string>
+ <string name="Fat Lips">
+ Lábios carnudos
+ </string>
+ <string name="Female">
+ Feminino
+ </string>
+ <string name="Fingerless">
+ Dedos
+ </string>
+ <string name="Fingers">
+ Dedos
+ </string>
+ <string name="Flared Cuffs">
+ Punhos largos
+ </string>
+ <string name="Flat">
+ Chato
+ </string>
+ <string name="Flat Butt">
+ Traseiro chato
+ </string>
+ <string name="Flat Head">
+ Cabeça chata
+ </string>
+ <string name="Flat Toe">
+ Dedos dos pés chatos
+ </string>
+ <string name="Foot Size">
+ Tamanho dos pés
+ </string>
+ <string name="Forehead Angle">
+ Ângulo da testa
+ </string>
+ <string name="Forehead Heavy">
+ Testa pronunciada
+ </string>
+ <string name="Freckles">
+ Sardas
+ </string>
+ <string name="Front Fringe">
+ Franja
+ </string>
+ <string name="Full Back">
+ Trás cheia
+ </string>
+ <string name="Full Eyeliner">
+ Delienador cheio
+ </string>
+ <string name="Full Front">
+ Frente cheia
+ </string>
+ <string name="Full Hair Sides">
+ Cabelos laterais cheios
+ </string>
+ <string name="Full Sides">
+ Lados cheios
+ </string>
+ <string name="Glossy">
+ Brilhante
+ </string>
+ <string name="Glove Fingers">
+ Dedos da luva
+ </string>
+ <string name="Glove Length">
+ Comprimento das luvas
+ </string>
+ <string name="Hair">
+ Cabelo
+ </string>
+ <string name="Hair Back">
+ Cabelo: Trás
+ </string>
+ <string name="Hair Front">
+ Cabelo: Frente
+ </string>
+ <string name="Hair Sides">
+ Cabelos: Lateral
+ </string>
+ <string name="Hair Sweep">
+ Cabelo penteado
+ </string>
+ <string name="Hair Thickess">
+ Espessura do cabelo
+ </string>
+ <string name="Hair Thickness">
+ Espessura do cabelo
+ </string>
+ <string name="Hair Tilt">
+ Divisão do cabelo
+ </string>
+ <string name="Hair Tilted Left">
+ Divistão do cabelo esquerda
+ </string>
+ <string name="Hair Tilted Right">
+ Divisão do cabelo direita
+ </string>
+ <string name="Hair Volume">
+ Cabelo: Volume
+ </string>
+ <string name="Hand Size">
+ Tamanho das mãos
+ </string>
+ <string name="Handlebars">
+ Bigode
+ </string>
+ <string name="Head Length">
+ Comprimento da cabeça
+ </string>
+ <string name="Head Shape">
+ Formato da cabeça
+ </string>
+ <string name="Head Size">
+ Tamanho da cabeça
+ </string>
+ <string name="Head Stretch">
+ Extensão da cabeça
+ </string>
+ <string name="Heel Height">
+ Altura do salto
+ </string>
+ <string name="Heel Shape">
+ Formato do salto
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Alto
+ </string>
+ <string name="High Heels">
+ Salto alto
+ </string>
+ <string name="High Jaw">
+ Maxilar alto
+ </string>
+ <string name="High Platforms">
+ Plataformas altas
+ </string>
+ <string name="High and Tight">
+ Alto e justo
+ </string>
+ <string name="Higher">
+ Mais alto
+ </string>
+ <string name="Hip Length">
+ Comprimento do quadril
+ </string>
+ <string name="Hip Width">
+ Largura do quadril
+ </string>
+ <string name="Hover">
+ Pairar
+ </string>
+ <string name="In">
+ Dentro
+ </string>
+ <string name="In Shdw Color">
+ Cor da sombra interna
+ </string>
+ <string name="In Shdw Opacity">
+ Opacidade da sombra interna
+ </string>
+ <string name="Inner Eye Corner">
+ Canto interno dos olhos
+ </string>
+ <string name="Inner Eye Shadow">
+ Sombra interna dos olhos
+ </string>
+ <string name="Inner Shadow">
+ Sombra interna
+ </string>
+ <string name="Jacket Length">
+ Comprimento da blusa
+ </string>
+ <string name="Jacket Wrinkles">
+ Dobras da jaqueta
+ </string>
+ <string name="Jaw Angle">
+ Ângulo da mandíbula
+ </string>
+ <string name="Jaw Jut">
+ Posição do maxilar
+ </string>
+ <string name="Jaw Shape">
+ Formato do maxilar
+ </string>
+ <string name="Join">
+ Juntar
+ </string>
+ <string name="Jowls">
+ Papo
+ </string>
+ <string name="Knee Angle">
+ Ângulo do joelho
+ </string>
+ <string name="Knock Kneed">
+ Joelhos para dentro
+ </string>
+ <string name="Large">
+ Grande
+ </string>
+ <string name="Large Hands">
+ Mãos grandes
+ </string>
+ <string name="Left Part">
+ Parte esquerda
+ </string>
+ <string name="Leg Length">
+ Comprimento da perna
+ </string>
+ <string name="Leg Muscles">
+ Musculatura da perna
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos barba
+ </string>
+ <string name="Less Freckles">
+ Menos sardas
+ </string>
+ <string name="Less Full">
+ Menos
+ </string>
+ <string name="Less Gravity">
+ Menos gravidade
+ </string>
+ <string name="Less Love">
+ Menos excesso
+ </string>
+ <string name="Less Muscles">
+ Menos músculos
+ </string>
+ <string name="Less Muscular">
+ Menos musculoso
+ </string>
+ <string name="Less Rosy">
+ Menos rosado
+ </string>
+ <string name="Less Round">
+ Menos arredondado
+ </string>
+ <string name="Less Saddle">
+ Menos ancas
+ </string>
+ <string name="Less Square">
+ Menos quadrado
+ </string>
+ <string name="Less Volume">
+ Menos volume
+ </string>
+ <string name="Less soul">
+ Menos alma
+ </string>
+ <string name="Lighter">
+ Lighter
+ </string>
+ <string name="Lip Cleft">
+ Fenda dos lábios
+ </string>
+ <string name="Lip Cleft Depth">
+ Profundidade da fenda dos lábios
+ </string>
+ <string name="Lip Fullness">
+ Volume dos lábios
+ </string>
+ <string name="Lip Pinkness">
+ Rosado dos lábios
+ </string>
+ <string name="Lip Ratio">
+ Proporção dos lábios
+ </string>
+ <string name="Lip Thickness">
+ Espessura dos lábios
+ </string>
+ <string name="Lip Width">
+ Largura dos lábios
+ </string>
+ <string name="Lipgloss">
+ Brilho dos lábios
+ </string>
+ <string name="Lipstick">
+ Batom
+ </string>
+ <string name="Lipstick Color">
+ Cor do batom
+ </string>
+ <string name="Long">
+ Longo
+ </string>
+ <string name="Long Head">
+ Cabeça alongada
+ </string>
+ <string name="Long Hips">
+ Lábios longos
+ </string>
+ <string name="Long Legs">
+ Pernas longas
+ </string>
+ <string name="Long Neck">
+ Pescoço longo
+ </string>
+ <string name="Long Pigtails">
+ Chiquinhas longas
+ </string>
+ <string name="Long Ponytail">
+ Rabo de cavalo longo
+ </string>
+ <string name="Long Torso">
+ Torso longo
+ </string>
+ <string name="Long arms">
+ Braços longos
+ </string>
+ <string name="Loose Pants">
+ Pantalonas
+ </string>
+ <string name="Loose Shirt">
+ Camisa folgada
+ </string>
+ <string name="Loose Sleeves">
+ Mangas folgadas
+ </string>
+ <string name="Love Handles">
+ Pneu
+ </string>
+ <string name="Low">
+ Baixo
+ </string>
+ <string name="Low Heels">
+ Salto baixo
+ </string>
+ <string name="Low Jaw">
+ Maxilar baixo
+ </string>
+ <string name="Low Platforms">
+ Plataformas baixas
+ </string>
+ <string name="Low and Loose">
+ Baixo e solto
+ </string>
+ <string name="Lower">
+ Mais baixo
+ </string>
+ <string name="Lower Bridge">
+ Mais baixa
+ </string>
+ <string name="Lower Cheeks">
+ Bochechas abaixadas
+ </string>
+ <string name="Male">
+ Masculino
+ </string>
+ <string name="Middle Part">
+ Parte do meio
+ </string>
+ <string name="More">
+ Mais
+ </string>
+ <string name="More Blush">
+ Mais blush
+ </string>
+ <string name="More Body Fat">
+ Mais gordura
+ </string>
+ <string name="More Curtains">
+ Mais barba
+ </string>
+ <string name="More Eyeshadow">
+ Mais sombra dos olhos
+ </string>
+ <string name="More Freckles">
+ Mais sardas
+ </string>
+ <string name="More Full">
+ Mais volume
+ </string>
+ <string name="More Gravity">
+ Mais gravidade
+ </string>
+ <string name="More Lipstick">
+ Mais batom
+ </string>
+ <string name="More Love">
+ Mais cintura
+ </string>
+ <string name="More Lower Lip">
+ Mais lábio inferior
+ </string>
+ <string name="More Muscles">
+ Mais músculos
+ </string>
+ <string name="More Muscular">
+ Mais musculoso
+ </string>
+ <string name="More Rosy">
+ Mais rosado
+ </string>
+ <string name="More Round">
+ Mais arredondado
+ </string>
+ <string name="More Saddle">
+ Mais ancas
+ </string>
+ <string name="More Sloped">
+ Mais inclinado
+ </string>
+ <string name="More Square">
+ Mais quadrado
+ </string>
+ <string name="More Upper Lip">
+ Mais lábios superiores
+ </string>
+ <string name="More Vertical">
+ Mais vertical
+ </string>
+ <string name="More Volume">
+ Mais volume
+ </string>
+ <string name="More soul">
+ Mais alma
+ </string>
+ <string name="Moustache">
+ Bigode
+ </string>
+ <string name="Mouth Corner">
+ Canto da boca
+ </string>
+ <string name="Mouth Position">
+ Posição da boca
+ </string>
+ <string name="Mowhawk">
+ Moicano
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Costeletas
+ </string>
+ <string name="Nail Polish">
+ Esmate das unhas
+ </string>
+ <string name="Nail Polish Color">
+ Cor do esmalte das unhas
+ </string>
+ <string name="Narrow">
+ Estreito
+ </string>
+ <string name="Narrow Back">
+ Costas estreitas
+ </string>
+ <string name="Narrow Front">
+ Frente estreita
+ </string>
+ <string name="Narrow Lips">
+ Lábios estreitos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Comprimento do pescoço
+ </string>
+ <string name="Neck Thickness">
+ Espessura do pescoço
+ </string>
+ <string name="No Blush">
+ Sem blush
+ </string>
+ <string name="No Eyeliner">
+ Sem delineador
+ </string>
+ <string name="No Eyeshadow">
+ Sem sombra
+ </string>
+ <string name="No Lipgloss">
+ Sem brilho
+ </string>
+ <string name="No Lipstick">
+ Sem batom
+ </string>
+ <string name="No Part">
+ Sem parte
+ </string>
+ <string name="No Polish">
+ Sem esmalte
+ </string>
+ <string name="No Red">
+ Sem vermelho
+ </string>
+ <string name="No Spikes">
+ Sem pontas
+ </string>
+ <string name="No White">
+ Sem branco
+ </string>
+ <string name="No Wrinkles">
+ Sem dobras
+ </string>
+ <string name="Normal Lower">
+ Normal inferior
+ </string>
+ <string name="Normal Upper">
+ Normal superior
+ </string>
+ <string name="Nose Left">
+ Nariz para esquerda
+ </string>
+ <string name="Nose Right">
+ Nariz para direita
+ </string>
+ <string name="Nose Size">
+ Tamanho do nariz
+ </string>
+ <string name="Nose Thickness">
+ Espessura do nariz
+ </string>
+ <string name="Nose Tip Angle">
+ Ângulo da ponta do nariz
+ </string>
+ <string name="Nose Tip Shape">
+ Formato da ponta do nariz
+ </string>
+ <string name="Nose Width">
+ Largura do nariz
+ </string>
+ <string name="Nostril Division">
+ Divisão das narinas
+ </string>
+ <string name="Nostril Width">
+ Largura das narinas
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Aberto atrás
+ </string>
+ <string name="Open Front">
+ Aberto na frente
+ </string>
+ <string name="Open Left">
+ Aberto esquerdo
+ </string>
+ <string name="Open Right">
+ Aberto direito
+ </string>
+ <string name="Orange">
+ Laranja
+ </string>
+ <string name="Out">
+ Fora
+ </string>
+ <string name="Out Shdw Color">
+ Cor da sombra externa
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacidade da sombra externa
+ </string>
+ <string name="Outer Eye Corner">
+ Canto externo do olho
+ </string>
+ <string name="Outer Eye Shadow">
+ Sombra externa do olho
+ </string>
+ <string name="Outer Shadow">
+ Sombra externa
+ </string>
+ <string name="Overbite">
+ Má oclusão
+ </string>
+ <string name="Package">
+ Púbis
+ </string>
+ <string name="Painted Nails">
+ Unhas pintadas
+ </string>
+ <string name="Pale">
+ Pálido
+ </string>
+ <string name="Pants Crotch">
+ Cavalo da calça
+ </string>
+ <string name="Pants Fit">
+ Caimento das calças
+ </string>
+ <string name="Pants Length">
+ Comprimento das calças
+ </string>
+ <string name="Pants Waist">
+ Cintura da calça
+ </string>
+ <string name="Pants Wrinkles">
+ Dobras das calças
+ </string>
+ <string name="Part">
+ Parte
+ </string>
+ <string name="Part Bangs">
+ Divisão da franja
+ </string>
+ <string name="Pectorals">
+ Peitorais
+ </string>
+ <string name="Pigment">
+ Pigmento
+ </string>
+ <string name="Pigtails">
+ Chiquinhas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Mais rosado
+ </string>
+ <string name="Platform Height">
+ Altura da plataforma
+ </string>
+ <string name="Platform Width">
+ Largura da plataforma
+ </string>
+ <string name="Pointy">
+ Pontudo
+ </string>
+ <string name="Pointy Heels">
+ Salto agulha
+ </string>
+ <string name="Ponytail">
+ Rabo de cavalo
+ </string>
+ <string name="Poofy Skirt">
+ Saia bufante
+ </string>
+ <string name="Pop Left Eye">
+ Olho saltado esquerdo
+ </string>
+ <string name="Pop Right Eye">
+ Olho saltado direito
+ </string>
+ <string name="Puffy">
+ Inchado
+ </string>
+ <string name="Puffy Eyelids">
+ Pálpebras inchadas
+ </string>
+ <string name="Rainbow Color">
+ Cor do arco íris
+ </string>
+ <string name="Red Hair">
+ Cabelo ruivo
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Parte direita
+ </string>
+ <string name="Rosy Complexion">
+ Rosado da face
+ </string>
+ <string name="Round">
+ Arredondado
+ </string>
+ <string name="Ruddiness">
+ Rubor
+ </string>
+ <string name="Ruddy">
+ Corado
+ </string>
+ <string name="Rumpled Hair">
+ Cabelo desalinhado
+ </string>
+ <string name="Saddle Bags">
+ Culote
+ </string>
+ <string name="Scrawny Leg">
+ Pernas magricelas
+ </string>
+ <string name="Separate">
+ Separar
+ </string>
+ <string name="Shallow">
+ Raso
+ </string>
+ <string name="Shear Back">
+ Trás rente
+ </string>
+ <string name="Shear Face">
+ Face raspada
+ </string>
+ <string name="Shear Front">
+ Frente rente
+ </string>
+ <string name="Shear Left Up">
+ Esquerda rente para cima
+ </string>
+ <string name="Shear Right Up">
+ Trás rente para cima
+ </string>
+ <string name="Sheared Back">
+ Rente atrás
+ </string>
+ <string name="Sheared Front">
+ Rente frente
+ </string>
+ <string name="Shift Left">
+ Deslocar p/ esquerda
+ </string>
+ <string name="Shift Mouth">
+ Deslocar boca
+ </string>
+ <string name="Shift Right">
+ Deslocar p/ direita
+ </string>
+ <string name="Shirt Bottom">
+ Barra da camisa
+ </string>
+ <string name="Shirt Fit">
+ Ajuste da camisa
+ </string>
+ <string name="Shirt Wrinkles">
+ +/- amassada
+ </string>
+ <string name="Shoe Height">
+ Altura do sapato
+ </string>
+ <string name="Short">
+ Curto
+ </string>
+ <string name="Short Arms">
+ Braços curtos
+ </string>
+ <string name="Short Legs">
+ Pernas curtas
+ </string>
+ <string name="Short Neck">
+ Pescoço curto
+ </string>
+ <string name="Short Pigtails">
+ Chiquinhas curtas
+ </string>
+ <string name="Short Ponytail">
+ Rabo de cavalo curto
+ </string>
+ <string name="Short Sideburns">
+ Costeletas curtas
+ </string>
+ <string name="Short Torso">
+ Tronco curto
+ </string>
+ <string name="Short hips">
+ Quadril curto
+ </string>
+ <string name="Shoulders">
+ Ombros
+ </string>
+ <string name="Side Fringe">
+ pontas laterais
+ </string>
+ <string name="Sideburns">
+ Costeletas
+ </string>
+ <string name="Sides Hair">
+ Cabelo lateral
+ </string>
+ <string name="Sides Hair Down">
+ Cabelo lateral long
+ </string>
+ <string name="Sides Hair Up">
+ Cabelo lateral superior
+ </string>
+ <string name="Skinny Neck">
+ Pescoço fino
+ </string>
+ <string name="Skirt Fit">
+ Ajuste de saia
+ </string>
+ <string name="Skirt Length">
+ Comprimento da saia
+ </string>
+ <string name="Slanted Forehead">
+ Testa inclinada
+ </string>
+ <string name="Sleeve Length">
+ Comprimento da manga
+ </string>
+ <string name="Sleeve Looseness">
+ Folga da manga
+ </string>
+ <string name="Slit Back">
+ Abertura : Atrás
+ </string>
+ <string name="Slit Front">
+ Abertura: Frente
+ </string>
+ <string name="Slit Left">
+ Abertura: Esquerda
+ </string>
+ <string name="Slit Right">
+ Abertura: Direita
+ </string>
+ <string name="Small">
+ Pequeno
+ </string>
+ <string name="Small Hands">
+ Mãos pequenas
+ </string>
+ <string name="Small Head">
+ Cabeça pequena
+ </string>
+ <string name="Smooth">
+ Suavizar
+ </string>
+ <string name="Smooth Hair">
+ Suavizar cabelo
+ </string>
+ <string name="Socks Length">
+ Comprimento das meias
+ </string>
+ <string name="Soulpatch">
+ Cavanhaque
+ </string>
+ <string name="Sparse">
+ Disperso
+ </string>
+ <string name="Spiked Hair">
+ Cabelo espetado
+ </string>
+ <string name="Square">
+ Quadrado
+ </string>
+ <string name="Square Toe">
+ Dedo quadrado
+ </string>
+ <string name="Squash Head">
+ Cabeça de Pera
+ </string>
+ <string name="Stretch Head">
+ Cabeça esticada
+ </string>
+ <string name="Sunken">
+ Afundar
+ </string>
+ <string name="Sunken Chest">
+ Peito afundado
+ </string>
+ <string name="Sunken Eyes">
+ Olhos afundados
+ </string>
+ <string name="Sweep Back">
+ Pentear para trás
+ </string>
+ <string name="Sweep Forward">
+ Pentear para frente
+ </string>
+ <string name="Tall">
+ Alto
+ </string>
+ <string name="Taper Back">
+ Afinar atrás
+ </string>
+ <string name="Taper Front">
+ Afinar a frente
+ </string>
+ <string name="Thick Heels">
+ Salto grosso
+ </string>
+ <string name="Thick Neck">
+ Pescoço grosso
+ </string>
+ <string name="Thick Toe">
+ Dedo grosso
+ </string>
+ <string name="Thin">
+ Fino
+ </string>
+ <string name="Thin Eyebrows">
+ Sobrancelhas finas
+ </string>
+ <string name="Thin Lips">
+ Lábios finos
+ </string>
+ <string name="Thin Nose">
+ Nariz fino
+ </string>
+ <string name="Tight Chin">
+ Queixo apertado
+ </string>
+ <string name="Tight Cuffs">
+ Punho justo
+ </string>
+ <string name="Tight Pants">
+ Calça justa
+ </string>
+ <string name="Tight Shirt">
+ Camisa justa
+ </string>
+ <string name="Tight Skirt">
+ Saia justa
+ </string>
+ <string name="Tight Sleeves">
+ Tight Sleeves
+ </string>
+ <string name="Toe Shape">
+ Formato dos dedos
+ </string>
+ <string name="Toe Thickness">
+ Espessura dos dos dedos
+ </string>
+ <string name="Torso Length">
+ Comprimento do tronco
+ </string>
+ <string name="Torso Muscles">
+ Músculos do tronco
+ </string>
+ <string name="Torso Scrawny">
+ Tronco magricela
+ </string>
+ <string name="Unattached">
+ Desanexado
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Underbite
+ </string>
+ <string name="Unnatural">
+ Não natural
+ </string>
+ <string name="Upper Bridge">
+ Parte alta do nariz
+ </string>
+ <string name="Upper Cheeks">
+ Bochechas altas
+ </string>
+ <string name="Upper Chin Cleft">
+ fenda do queixo alta
+ </string>
+ <string name="Upper Eyelid Fold">
+ Curvatura dos cílios supériores
+ </string>
+ <string name="Upturned">
+ Voltado para cima
+ </string>
+ <string name="Very Red">
+ Bem vermelho
+ </string>
+ <string name="Waist Height">
+ Altura da cintura
+ </string>
+ <string name="Well-Fed">
+ Corpulento
+ </string>
+ <string name="White Hair">
+ Grisalho
+ </string>
+ <string name="Wide">
+ Amplo
+ </string>
+ <string name="Wide Back">
+ Costas largas
+ </string>
+ <string name="Wide Front">
+ Testa larga
+ </string>
+ <string name="Wide Lips">
+ Lábios amplos
+ </string>
+ <string name="Wild">
+ Selvagem
+ </string>
+ <string name="Wrinkles">
+ Rugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Adicionar às minhas Landmarks
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar minhas Landmarks
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver mais informações sobre a localização atual
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Histórico de localizações
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Região Adulta
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Região Moderada
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Região em geral
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Os avatares neste lote não podem ser vistos ou ouvidos por avatares fora dele
+ </string>
+ <string name="LocationCtrlPathfindingDirtyTooltip">
+ Os objetos que se movem podem não se comportar corretamente nesta região até que ela seja recarregada.
+ </string>
+ <string name="LocationCtrlPathfindingDisabledTooltip">
+ O pathfinding dinâmico não está habilitado nesta região.
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Atualização
+ </string>
+ <string name="UpdaterNowUpdating">
+ Atualizando agora o [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Fazendo o download da atualização...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Fazendo o download da atualização
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Falha no download da atualização
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Falha ao instalar a atualização
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Falha ao iniciar o visualizador
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos
+ </string>
+ <string name="IM_logging_string">
+ -- Log de mensagem instantânea habilitado --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está digitando...
+ </string>
+ <string name="Unnamed">
+ (Anônimo)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: Voz desativado por padrão)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Bate-papo de texto não está disponível para esta chamada.
+ </string>
+ <string name="IM_muted_text_label">
+ Seu bate- papo de texto foi desabilitado por um Moderador do Grupo.
+ </string>
+ <string name="IM_default_text_label">
+ Clique aqui para menagem instantânea.
+ </string>
+ <string name="IM_to_label">
+ Para
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
+ </string>
+ <string name="Saved_message">
+ (Salvo em [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Para visualizar esta mensagem, você deve desmarcar "Apenas amigos e grupos podem me ligar ou enviar MIs" em Preferências/Privacidade.
+ </string>
+ <string name="OnlineStatus">
+ Conectado
+ </string>
+ <string name="OfflineStatus">
+ Desconectado
+ </string>
+ <string name="not_online_msg">
+ O usuário não está online. As mensagens serão armazenadas e enviadas mais tarde.
+ </string>
+ <string name="not_online_inventory">
+ O usuário não está online. O inventário foi salvo.
+ </string>
+ <string name="answered_call">
+ Ligação atendida
+ </string>
+ <string name="you_started_call">
+ Você iniciou uma ligação de voz
+ </string>
+ <string name="you_joined_call">
+ Você entrou na ligação
+ </string>
+ <string name="you_auto_rejected_call-im">
+ Você recusou automaticamente a chamada de voz enquanto "Não perturbe" estava ativado.
+ </string>
+ <string name="name_started_call">
+ [NAME] iniciou uma ligação de voz
+ </string>
+ <string name="ringing-im">
+ Entrando em ligação de voz...
+ </string>
+ <string name="connected-im">
+ Conectado. Para sair, clique em Desligar
+ </string>
+ <string name="hang_up-im">
+ Saiu da ligação de voz
+ </string>
+ <string name="conference-title">
+ Bate-papo com várias pessoas
+ </string>
+ <string name="conference-title-incoming">
+ Conversa com [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Item do inventário '[ITEM_NAME]' oferecido
+ </string>
+ <string name="inventory_folder_offered-im">
+ Pasta do inventário '[ITEM_NAME]' oferecida
+ </string>
+ <string name="bot_warning">
+ Você está conversando com um bot, [NAME]. Não compartilhe informações pessoais.
+Saiba mais em https://second.life/scripted-agents.
+ </string>
+ <string name="facebook_post_success">
+ Você publicou no Facebook.
+ </string>
+ <string name="flickr_post_success">
+ Você publicou no Flickr.
+ </string>
+ <string name="twitter_post_success">
+ Você publicou no Twitter.
+ </string>
+ <string name="no_session_message">
+ (Sessão de MI inexistente)
+ </string>
+ <string name="only_user_message">
+ Você é o único usuário desta sessão.
+ </string>
+ <string name="offline_message">
+ [NAME] está offline.
+ </string>
+ <string name="invite_message">
+ Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz.
+ </string>
+ <string name="muted_message">
+ Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem.
+ </string>
+ <string name="generic">
+ Erro de solicitação, tente novamente mais tarde.
+ </string>
+ <string name="generic_request_error">
+ Erro na requisição, por favor, tente novamente.
+ </string>
+ <string name="insufficient_perms_error">
+ Você não tem permissões suficientes.
+ </string>
+ <string name="session_does_not_exist_error">
+ A sessão deixou de existir
+ </string>
+ <string name="no_ability_error">
+ Você não possui esta habilidade.
+ </string>
+ <string name="no_ability">
+ Você não possui esta habilidade.
+ </string>
+ <string name="not_a_mod_error">
+ Você não é um moderador de sessão.
+ </string>
+ <string name="muted">
+ Bate-papo de texto desativado por um moderador.
+ </string>
+ <string name="muted_error">
+ Um moderador do grupo desabilitou seu bate-papo em texto.
+ </string>
+ <string name="add_session_event">
+ Não foi possível adicionar usuários na sessão de bate-papo com [RECIPIENT].
+ </string>
+ <string name="message">
+ Não foi possível enviar sua mensagem para o bate-papo com [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Não foi possível enviar sua mensagem na sessão de bate- papo com [RECIPIENT].
+ </string>
+ <string name="mute">
+ Erro durante a moderação.
+ </string>
+ <string name="removed">
+ Você foi tirado do grupo.
+ </string>
+ <string name="removed_from_group">
+ Você foi removido do grupo.
+ </string>
+ <string name="close_on_no_ability">
+ Você não possui mais a habilidade de estar na sessão de bate-papo.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] disse alguma coisa
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] disseram alguma coisa
+ </string>
+ <string name="session_initialization_timed_out_error">
+ A inicialização da sessão expirou
+ </string>
+ <string name="Home position set.">
+ Posição inicial definida.
+ </string>
+ <string name="voice_morphing_url">
+ https://secondlife.com/destination/voice-island
+ </string>
+ <string name="premium_voice_morphing_url">
+ https://secondlife.com/destination/voice-morphing-premium
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] lhe pagou L$ [AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] lhe pagou L$ [AMOUNT]: [REASON]
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] lhe pagou L$ [AMOUNT]
+ </string>
+ <string name="you_paid_ldollars">
+ Você pagou L$[AMOUNT] por [REASON] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_gift">
+ Você pagou L$[AMOUNT] a [NAME]: [REASON]
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Você acaba de pagar L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Você pagou L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Você pagou L$[AMOUNT] por [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_gift">
+ Você não pagou L$[AMOUNT] a [NAME]: [REASON]
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Você não pagou L$[AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Você não pagou L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Você não pagou L$[AMOUNT] referentes a [REASON].
+ </string>
+ <string name="for item">
+ por [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ por uma parcela
+ </string>
+ <string name="for a land access pass">
+ por um passe de acesso
+ </string>
+ <string name="for deeding land">
+ para doar um terreno
+ </string>
+ <string name="to create a group">
+ para criar um grupo
+ </string>
+ <string name="to join a group">
+ para entrar em um grupo
+ </string>
+ <string name="to upload">
+ para carregar
+ </string>
+ <string name="to publish a classified ad">
+ para publicar um anúncio
+ </string>
+ <string name="giving">
+ Dando L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ O upload custa L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Isso custa L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Comprando terreno selecionado L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Esse objeto custa L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Todos
+ </string>
+ <string name="group_role_officers">
+ Oficiais
+ </string>
+ <string name="group_role_owners">
+ Proprietários
+ </string>
+ <string name="group_member_status_online">
+ Conectado
+ </string>
+ <string name="uploading_abuse_report">
+ Carregando...
-Denunciar abuso</string>
- <string name="New Shape">Nova forma</string>
- <string name="New Skin">Nova pele</string>
- <string name="New Hair">Novo cabelo</string>
- <string name="New Eyes">Novos olhos</string>
- <string name="New Shirt">Nova camisa</string>
- <string name="New Pants">Novas calças</string>
- <string name="New Shoes">Novos sapatos</string>
- <string name="New Socks">Novas meias</string>
- <string name="New Jacket">Nova blusa</string>
- <string name="New Gloves">Novas luvas</string>
- <string name="New Undershirt">Nova camiseta</string>
- <string name="New Underpants">Novas roupa de baixo</string>
- <string name="New Skirt">Nova saia</string>
- <string name="New Alpha">Novo alpha</string>
- <string name="New Tattoo">Nova tatuagem</string>
- <string name="New Universal">Novo universal</string>
- <string name="New Physics">Novo físico</string>
- <string name="Invalid Wearable">Item inválido</string>
- <string name="New Gesture">Novo gesto</string>
- <string name="New Script">Novo script</string>
- <string name="New Note">Nova nota</string>
- <string name="New Folder">Nova pasta</string>
- <string name="Contents">Conteúdo</string>
- <string name="Gesture">Gesto</string>
- <string name="Male Gestures">Gestos masculinos</string>
- <string name="Female Gestures">Gestos femininos</string>
- <string name="Other Gestures">Outros gestos</string>
- <string name="Speech Gestures">Gestos da fala</string>
- <string name="Common Gestures">Gestos comuns</string>
- <string name="Male - Excuse me">Perdão - masculino</string>
- <string name="Male - Get lost">Deixe-me em paz - masculino</string>
- <string name="Male - Blow kiss">Mandar beijo - masculino</string>
- <string name="Male - Boo">Vaia - masculino</string>
- <string name="Male - Bored">Maçante - masculino</string>
- <string name="Male - Hey">Ôpa! - masculino</string>
- <string name="Male - Laugh">Risada - masculino</string>
- <string name="Male - Repulsed">Quero distância! - masculino</string>
- <string name="Male - Shrug">Encolher de ombros - masculino</string>
- <string name="Male - Stick tougue out">Mostrar a língua - masculino</string>
- <string name="Male - Wow">Wow - masculino</string>
- <string name="Female - Chuckle">Engraçado - Feminino</string>
- <string name="Female - Cry">Chorar - Feminino</string>
- <string name="Female - Embarrassed">Com vergonha - Feminino</string>
- <string name="Female - Excuse me">Perdão - fem</string>
- <string name="Female - Get lost">Deixe-me em paz - feminino</string>
- <string name="Female - Blow kiss">Mandar beijo - fem</string>
- <string name="Female - Boo">Vaia - fem</string>
- <string name="Female - Bored">Maçante - feminino</string>
- <string name="Female - Hey">Ôpa - feminino</string>
- <string name="Female - Hey baby">E aí, beliza? - Feminino</string>
- <string name="Female - Laugh">Risada - feminina</string>
- <string name="Female - Looking good">Que chique - Feminino</string>
- <string name="Female - Over here">Acenar - Feminino</string>
- <string name="Female - Please">Por favor - Feminino</string>
- <string name="Female - Repulsed">Quero distância! - feminino</string>
- <string name="Female - Shrug">Encolher ombros - feminino</string>
- <string name="Female - Stick tougue out">Mostrar a língua - feminino</string>
- <string name="Female - Wow">Wow - feminino</string>
- <string name="New Daycycle">Novo ciclo de dias</string>
- <string name="New Water">Nova água</string>
- <string name="New Sky">Novo céu</string>
- <string name="/bow">/reverência</string>
- <string name="/clap">/palmas</string>
- <string name="/count">/contar</string>
- <string name="/extinguish">/apagar</string>
- <string name="/kmb">/dane_se</string>
- <string name="/muscle">/músculos</string>
- <string name="/no">/não</string>
- <string name="/no!">/não!</string>
- <string name="/paper">/papel</string>
- <string name="/pointme">/apontar_eu</string>
- <string name="/pointyou">/apontar_você</string>
- <string name="/rock">/pedra</string>
- <string name="/scissor">/tesoura</string>
- <string name="/smoke">/fumar</string>
- <string name="/stretch">/alongar</string>
- <string name="/whistle">/assobiar</string>
- <string name="/yes">/sim</string>
- <string name="/yes!">/sim!</string>
- <string name="afk">ldt</string>
- <string name="dance1">dança1</string>
- <string name="dance2">dança2</string>
- <string name="dance3">dança3</string>
- <string name="dance4">dança4</string>
- <string name="dance5">dança5</string>
- <string name="dance6">dança6</string>
- <string name="dance7">dança7</string>
- <string name="dance8">dança8</string>
- <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
- <string name="DefaultMimeType">nenhum/nehum</string>
- <string name="texture_load_dimensions_error">A imagem excede o limite [WIDTH]*[HEIGHT]</string>
- <string name="outfit_photo_load_dimensions_error">O tamanho máx. do look é [WIDTH]*[HEIGHT]. Redimensione ou use outra imagem</string>
- <string name="outfit_photo_select_dimensions_error">O tamanho máx. do look é [WIDTH]*[HEIGHT]. Selecione outra textura</string>
- <string name="outfit_photo_verify_dimensions_error">Não foi possível confirmar as dimensões da foto. Aguarde até que o tamanho da foto seja exibido no seletor</string>
+Denunciar abuso
+ </string>
+ <string name="New Shape">
+ Nova forma
+ </string>
+ <string name="New Skin">
+ Nova pele
+ </string>
+ <string name="New Hair">
+ Novo cabelo
+ </string>
+ <string name="New Eyes">
+ Novos olhos
+ </string>
+ <string name="New Shirt">
+ Nova camisa
+ </string>
+ <string name="New Pants">
+ Novas calças
+ </string>
+ <string name="New Shoes">
+ Novos sapatos
+ </string>
+ <string name="New Socks">
+ Novas meias
+ </string>
+ <string name="New Jacket">
+ Nova blusa
+ </string>
+ <string name="New Gloves">
+ Novas luvas
+ </string>
+ <string name="New Undershirt">
+ Nova camiseta
+ </string>
+ <string name="New Underpants">
+ Novas roupa de baixo
+ </string>
+ <string name="New Skirt">
+ Nova saia
+ </string>
+ <string name="New Alpha">
+ Novo alpha
+ </string>
+ <string name="New Tattoo">
+ Nova tatuagem
+ </string>
+ <string name="New Universal">
+ Novo universal
+ </string>
+ <string name="New Physics">
+ Novo físico
+ </string>
+ <string name="Invalid Wearable">
+ Item inválido
+ </string>
+ <string name="New Gesture">
+ Novo gesto
+ </string>
+ <string name="New Script">
+ Novo script
+ </string>
+ <string name="New Note">
+ Nova nota
+ </string>
+ <string name="New Folder">
+ Nova pasta
+ </string>
+ <string name="Contents">
+ Conteúdo
+ </string>
+ <string name="Gesture">
+ Gesto
+ </string>
+ <string name="Male Gestures">
+ Gestos masculinos
+ </string>
+ <string name="Female Gestures">
+ Gestos femininos
+ </string>
+ <string name="Other Gestures">
+ Outros gestos
+ </string>
+ <string name="Speech Gestures">
+ Gestos da fala
+ </string>
+ <string name="Common Gestures">
+ Gestos comuns
+ </string>
+ <string name="Male - Excuse me">
+ Perdão - masculino
+ </string>
+ <string name="Male - Get lost">
+ Deixe-me em paz - masculino
+ </string>
+ <string name="Male - Blow kiss">
+ Mandar beijo - masculino
+ </string>
+ <string name="Male - Boo">
+ Vaia - masculino
+ </string>
+ <string name="Male - Bored">
+ Maçante - masculino
+ </string>
+ <string name="Male - Hey">
+ Ôpa! - masculino
+ </string>
+ <string name="Male - Laugh">
+ Risada - masculino
+ </string>
+ <string name="Male - Repulsed">
+ Quero distância! - masculino
+ </string>
+ <string name="Male - Shrug">
+ Encolher de ombros - masculino
+ </string>
+ <string name="Male - Stick tougue out">
+ Mostrar a língua - masculino
+ </string>
+ <string name="Male - Wow">
+ Wow - masculino
+ </string>
+ <string name="Female - Chuckle">
+ Engraçado - Feminino
+ </string>
+ <string name="Female - Cry">
+ Chorar - Feminino
+ </string>
+ <string name="Female - Embarrassed">
+ Com vergonha - Feminino
+ </string>
+ <string name="Female - Excuse me">
+ Perdão - fem
+ </string>
+ <string name="Female - Get lost">
+ Deixe-me em paz - feminino
+ </string>
+ <string name="Female - Blow kiss">
+ Mandar beijo - fem
+ </string>
+ <string name="Female - Boo">
+ Vaia - fem
+ </string>
+ <string name="Female - Bored">
+ Maçante - feminino
+ </string>
+ <string name="Female - Hey">
+ Ôpa - feminino
+ </string>
+ <string name="Female - Hey baby">
+ E aí, beliza? - Feminino
+ </string>
+ <string name="Female - Laugh">
+ Risada - feminina
+ </string>
+ <string name="Female - Looking good">
+ Que chique - Feminino
+ </string>
+ <string name="Female - Over here">
+ Acenar - Feminino
+ </string>
+ <string name="Female - Please">
+ Por favor - Feminino
+ </string>
+ <string name="Female - Repulsed">
+ Quero distância! - feminino
+ </string>
+ <string name="Female - Shrug">
+ Encolher ombros - feminino
+ </string>
+ <string name="Female - Stick tougue out">
+ Mostrar a língua - feminino
+ </string>
+ <string name="Female - Wow">
+ Wow - feminino
+ </string>
+ <string name="New Daycycle">
+ Novo ciclo de dias
+ </string>
+ <string name="New Water">
+ Nova água
+ </string>
+ <string name="New Sky">
+ Novo céu
+ </string>
+ <string name="/bow">
+ /reverência
+ </string>
+ <string name="/clap">
+ /palmas
+ </string>
+ <string name="/count">
+ /contar
+ </string>
+ <string name="/extinguish">
+ /apagar
+ </string>
+ <string name="/kmb">
+ /dane_se
+ </string>
+ <string name="/muscle">
+ /músculos
+ </string>
+ <string name="/no">
+ /não
+ </string>
+ <string name="/no!">
+ /não!
+ </string>
+ <string name="/paper">
+ /papel
+ </string>
+ <string name="/pointme">
+ /apontar_eu
+ </string>
+ <string name="/pointyou">
+ /apontar_você
+ </string>
+ <string name="/rock">
+ /pedra
+ </string>
+ <string name="/scissor">
+ /tesoura
+ </string>
+ <string name="/smoke">
+ /fumar
+ </string>
+ <string name="/stretch">
+ /alongar
+ </string>
+ <string name="/whistle">
+ /assobiar
+ </string>
+ <string name="/yes">
+ /sim
+ </string>
+ <string name="/yes!">
+ /sim!
+ </string>
+ <string name="afk">
+ ldt
+ </string>
+ <string name="dance1">
+ dança1
+ </string>
+ <string name="dance2">
+ dança2
+ </string>
+ <string name="dance3">
+ dança3
+ </string>
+ <string name="dance4">
+ dança4
+ </string>
+ <string name="dance5">
+ dança5
+ </string>
+ <string name="dance6">
+ dança6
+ </string>
+ <string name="dance7">
+ dança7
+ </string>
+ <string name="dance8">
+ dança8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ nenhum/nehum
+ </string>
+ <string name="texture_load_dimensions_error">
+ A imagem excede o limite [WIDTH]*[HEIGHT]
+ </string>
+ <string name="outfit_photo_load_dimensions_error">
+ O tamanho máx. do look é [WIDTH]*[HEIGHT]. Redimensione ou use outra imagem
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ O tamanho máx. do look é [WIDTH]*[HEIGHT]. Selecione outra textura
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Não foi possível confirmar as dimensões da foto. Aguarde até que o tamanho da foto seja exibido no seletor
+ </string>
<string name="words_separator" value=","/>
- <string name="server_is_down">Aconteceu algo inesperado, apesar de termos tentado impedir isso.
+ <string name="server_is_down">
+ Aconteceu algo inesperado, apesar de termos tentado impedir isso.
Visite http://status.secondlifegrid.net para saber se foi detectado um problema com o serviço.
- Se o problema persistir, cheque a configuração da sua rede e firewall.</string>
- <string name="dateTimeWeekdaysNames">Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado</string>
- <string name="dateTimeWeekdaysShortNames">Dom:Seg:Ter:Qua:Qui:Sex:Sab</string>
- <string name="dateTimeMonthNames">Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro</string>
- <string name="dateTimeMonthShortNames">Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez</string>
- <string name="dateTimeDayFormat">[MDAY]</string>
- <string name="dateTimeAM">AM</string>
- <string name="dateTimePM">PM</string>
- <string name="LocalEstimateUSD">US$ [AMOUNT]</string>
- <string name="Group Ban">Banimento do grupo</string>
- <string name="Membership">Plano</string>
- <string name="Roles">Cargos</string>
- <string name="Group Identity">Identidade do lote</string>
- <string name="Parcel Management">Gestão do lote</string>
- <string name="Parcel Identity">ID do lote</string>
- <string name="Parcel Settings">Configurações do lote</string>
- <string name="Parcel Powers">Poderes do lote</string>
- <string name="Parcel Access">Acesso ao lote</string>
- <string name="Parcel Content">Conteúdo do lote</string>
- <string name="Object Management">Gestão de objetos</string>
- <string name="Accounting">Contabilidade</string>
- <string name="Notices">Avisos</string>
- <string name="Chat" value="Bate papo">Bate-papo</string>
- <string name="BaseMembership">Base</string>
- <string name="DeleteItems">Excluir itens selecionados?</string>
- <string name="DeleteItem">Excluir item selecionado?</string>
- <string name="EmptyOutfitText">Este look não possui nenhuma peça</string>
- <string name="ExternalEditorNotSet">Selecione um editor utilizando a configuração ExternalEditor.</string>
- <string name="ExternalEditorNotFound">O editor externo especificado não foi localizado.
+ Se o problema persistir, cheque a configuração da sua rede e firewall.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Dom:Seg:Ter:Qua:Qui:Sex:Sab
+ </string>
+ <string name="dateTimeMonthNames">
+ Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Group Ban">
+ Banimento do grupo
+ </string>
+ <string name="Membership">
+ Plano
+ </string>
+ <string name="Roles">
+ Cargos
+ </string>
+ <string name="Group Identity">
+ Identidade do lote
+ </string>
+ <string name="Parcel Management">
+ Gestão do lote
+ </string>
+ <string name="Parcel Identity">
+ ID do lote
+ </string>
+ <string name="Parcel Settings">
+ Configurações do lote
+ </string>
+ <string name="Parcel Powers">
+ Poderes do lote
+ </string>
+ <string name="Parcel Access">
+ Acesso ao lote
+ </string>
+ <string name="Parcel Content">
+ Conteúdo do lote
+ </string>
+ <string name="Object Management">
+ Gestão de objetos
+ </string>
+ <string name="Accounting">
+ Contabilidade
+ </string>
+ <string name="Notices">
+ Avisos
+ </string>
+ <string name="Chat" value="Bate papo">
+ Bate-papo
+ </string>
+ <string name="BaseMembership">
+ Base
+ </string>
+ <string name="DeleteItems">
+ Excluir itens selecionados?
+ </string>
+ <string name="DeleteItem">
+ Excluir item selecionado?
+ </string>
+ <string name="EmptyOutfitText">
+ Este look não possui nenhuma peça
+ </string>
+ <string name="ExternalEditorNotSet">
+ Selecione um editor utilizando a configuração ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ O editor externo especificado não foi localizado.
Tente colocar o caminho do editor entre aspas.
-(ex. &quot;/caminho para/editor&quot; &quot;%s&quot;)</string>
- <string name="ExternalEditorCommandParseError">Error ao analisar o comando do editor externo.</string>
- <string name="ExternalEditorFailedToRun">Falha de execução do editor externo.</string>
- <string name="TranslationFailed">Falha na tradução: [REASON]</string>
- <string name="TranslationResponseParseError">Erro ao analisar resposta de tradução.</string>
- <string name="Esc">Esc</string>
- <string name="Space">Space</string>
- <string name="Enter">Enter</string>
- <string name="Tab">Tab</string>
- <string name="Ins">Ins</string>
- <string name="Del">Del</string>
- <string name="Backsp">Backsp</string>
- <string name="Shift">Shift</string>
- <string name="Ctrl">Ctrl</string>
- <string name="Alt">Alt</string>
- <string name="CapsLock">CapsLock</string>
- <string name="Home">Início</string>
- <string name="End">End</string>
- <string name="PgUp">PgUp</string>
- <string name="PgDn">PgDn</string>
- <string name="F1">F1</string>
- <string name="F2">F2</string>
- <string name="F3">F3</string>
- <string name="F4">F4</string>
- <string name="F5">F5</string>
- <string name="F6">F6</string>
- <string name="F7">F7</string>
- <string name="F8">F8</string>
- <string name="F9">F9</string>
- <string name="F10">F10</string>
- <string name="F11">F11</string>
- <string name="F12">F12</string>
- <string name="Add">Adicionar</string>
- <string name="Subtract">Subtrair</string>
- <string name="Multiply">Multiplicar</string>
- <string name="Divide">Dividir</string>
- <string name="PAD_DIVIDE">PAD_DIVIDE</string>
- <string name="PAD_LEFT">PAD_LEFT</string>
- <string name="PAD_RIGHT">PAD_RIGHT</string>
- <string name="PAD_DOWN">PAD_DOWN</string>
- <string name="PAD_UP">PAD_UP</string>
- <string name="PAD_HOME">PAD_HOME</string>
- <string name="PAD_END">PAD_END</string>
- <string name="PAD_PGUP">PAD_PGUP</string>
- <string name="PAD_PGDN">PAD_PGDN</string>
- <string name="PAD_CENTER">PAD_CENTER</string>
- <string name="PAD_INS">PAD_INS</string>
- <string name="PAD_DEL">PAD_DEL</string>
- <string name="PAD_Enter">PAD_Enter</string>
- <string name="PAD_BUTTON0">PAD_BUTTON0</string>
- <string name="PAD_BUTTON1">PAD_BUTTON1</string>
- <string name="PAD_BUTTON2">PAD_BUTTON2</string>
- <string name="PAD_BUTTON3">PAD_BUTTON3</string>
- <string name="PAD_BUTTON4">PAD_BUTTON4</string>
- <string name="PAD_BUTTON5">PAD_BUTTON5</string>
- <string name="PAD_BUTTON6">PAD_BUTTON6</string>
- <string name="PAD_BUTTON7">PAD_BUTTON7</string>
- <string name="PAD_BUTTON8">PAD_BUTTON8</string>
- <string name="PAD_BUTTON9">PAD_BUTTON9</string>
- <string name="PAD_BUTTON10">PAD_BUTTON10</string>
- <string name="PAD_BUTTON11">PAD_BUTTON11</string>
- <string name="PAD_BUTTON12">PAD_BUTTON12</string>
- <string name="PAD_BUTTON13">PAD_BUTTON13</string>
- <string name="PAD_BUTTON14">PAD_BUTTON14</string>
- <string name="PAD_BUTTON15">PAD_BUTTON15</string>
- <string name="-">-</string>
- <string name="=">=</string>
- <string name="`">`</string>
- <string name=";">;</string>
- <string name="[">[</string>
- <string name="]">]</string>
- <string name="\">\</string>
- <string name="0">0</string>
- <string name="1">1</string>
- <string name="2">2</string>
- <string name="3">3</string>
- <string name="4">4</string>
- <string name="5">5</string>
- <string name="6">6</string>
- <string name="7">7</string>
- <string name="8">8</string>
- <string name="9">9</string>
- <string name="A">A</string>
- <string name="B">B</string>
- <string name="C">C</string>
- <string name="D">D</string>
- <string name="E">E</string>
- <string name="F">F</string>
- <string name="G">G</string>
- <string name="H">H</string>
- <string name="I">I</string>
- <string name="J">J</string>
- <string name="K">K</string>
- <string name="L">L</string>
- <string name="M">M</string>
- <string name="N">N</string>
- <string name="O">O</string>
- <string name="P">P</string>
- <string name="Q">Q</string>
- <string name="R">R</string>
- <string name="S">S</string>
- <string name="T">T</string>
- <string name="U">U</string>
- <string name="V">V</string>
- <string name="W">W</string>
- <string name="X">X</string>
- <string name="Y">Y</string>
- <string name="Z">Z</string>
- <string name="BeaconParticle">Vendo balizas de partículas (azul)</string>
- <string name="BeaconPhysical">Vendo balizas de objetos físicos (verde)</string>
- <string name="BeaconScripted">Vendo balizas de objetos com script (vermelho)</string>
- <string name="BeaconScriptedTouch">Vendo objeto com script com balizas com funcionalidade de toque (vermelho)</string>
- <string name="BeaconSound">Vendo balizas de som (amarelo)</string>
- <string name="BeaconMedia">Vendo balizas de mídia (branco)</string>
- <string name="BeaconSun">Visualizando farol de direção do sol (alaranjado)</string>
- <string name="BeaconMoon">Visualizando farol de direção da lua (roxo)</string>
- <string name="ParticleHiding">Ocultar partículas</string>
- <string name="Command_AboutLand_Label">Sobre terrenos</string>
- <string name="Command_Appearance_Label">Aparência</string>
- <string name="Command_Avatar_Label">Avatar</string>
- <string name="Command_Build_Label">Construir</string>
- <string name="Command_Chat_Label">Bate-papo</string>
- <string name="Command_Conversations_Label">Conversas</string>
- <string name="Command_Compass_Label">Bússola</string>
- <string name="Command_Destinations_Label">Destinos</string>
- <string name="Command_Environments_Label">Meus ambientes</string>
- <string name="Command_Facebook_Label">Facebook</string>
- <string name="Command_Flickr_Label">Flickr</string>
- <string name="Command_Gestures_Label">Gestos</string>
- <string name="Command_Grid_Status_Label">Status da grade</string>
- <string name="Command_HowTo_Label">Como</string>
- <string name="Command_Inventory_Label">Inventário</string>
- <string name="Command_Map_Label">Mapa</string>
- <string name="Command_Marketplace_Label">Mercado</string>
- <string name="Command_MarketplaceListings_Label">Marketplace</string>
- <string name="Command_MiniMap_Label">Mini Mapa</string>
- <string name="Command_Move_Label">Andar/correr/voar</string>
- <string name="Command_Outbox_Label">Caixa de saída do lojista</string>
- <string name="Command_People_Label">Pessoas</string>
- <string name="Command_Picks_Label">Destaques</string>
- <string name="Command_Places_Label">Lugares</string>
- <string name="Command_Preferences_Label">Preferências</string>
- <string name="Command_Profile_Label">Perfil</string>
- <string name="Command_Report_Abuse_Label">Relatar abuso</string>
- <string name="Command_Search_Label">Buscar</string>
- <string name="Command_Snapshot_Label">Foto</string>
- <string name="Command_Speak_Label">Falar</string>
- <string name="Command_Twitter_Label">Twitter</string>
- <string name="Command_View_Label">Controles da câmera</string>
- <string name="Command_Voice_Label">Configurações de voz</string>
- <string name="Command_AboutLand_Tooltip">Informações sobre o terreno que você está visitando</string>
- <string name="Command_Appearance_Tooltip">Mudar seu avatar</string>
- <string name="Command_Avatar_Tooltip">Escolha um avatar completo</string>
- <string name="Command_Build_Tooltip">Construindo objetos e redimensionando terreno</string>
- <string name="Command_Chat_Tooltip">Bater papo com pessoas próximas usando texto</string>
- <string name="Command_Conversations_Tooltip">Conversar com todos</string>
- <string name="Command_Compass_Tooltip">Bússola</string>
- <string name="Command_Destinations_Tooltip">Destinos de interesse</string>
- <string name="Command_Environments_Tooltip">Meus ambientes</string>
- <string name="Command_Facebook_Tooltip">Publicar no Facebook</string>
- <string name="Command_Flickr_Tooltip">Carregar no Flickr</string>
- <string name="Command_Gestures_Tooltip">Gestos para seu avatar</string>
- <string name="Command_Grid_Status_Tooltip">Mostrar status da grade atual</string>
- <string name="Command_HowTo_Tooltip">Como executar tarefas comuns</string>
- <string name="Command_Inventory_Tooltip">Exibir e usar seus pertences</string>
- <string name="Command_Map_Tooltip">Mapa-múndi</string>
- <string name="Command_Marketplace_Tooltip">Faça compras</string>
- <string name="Command_MarketplaceListings_Tooltip">Venda suas criações</string>
- <string name="Command_MiniMap_Tooltip">Mostrar quem está aqui</string>
- <string name="Command_Move_Tooltip">Movendo seu avatar</string>
- <string name="Command_Outbox_Tooltip">Transferir itens para o seu mercado para venda</string>
- <string name="Command_People_Tooltip">Amigos, grupos e pessoas próximas</string>
- <string name="Command_Picks_Tooltip">Lugares mostrados como favoritos em seu perfil</string>
- <string name="Command_Places_Tooltip">Lugares salvos</string>
- <string name="Command_Preferences_Tooltip">Preferências</string>
- <string name="Command_Profile_Tooltip">Edite ou visualize seu perfil</string>
- <string name="Command_Report_Abuse_Tooltip">Relatar abuso</string>
- <string name="Command_Search_Tooltip">Encontre lugares, eventos, pessoas</string>
- <string name="Command_Snapshot_Tooltip">Tirar uma foto</string>
- <string name="Command_Speak_Tooltip">Fale com pessoas próximas usando seu microfone</string>
- <string name="Command_Twitter_Tooltip">Twitter</string>
- <string name="Command_View_Tooltip">Alterar o ângulo da câmera</string>
- <string name="Command_Voice_Tooltip">Controles de volume das chamadas e pessoas próximas a você no mundo virtual</string>
- <string name="Toolbar_Bottom_Tooltip">atualmente na sua barra de ferramentas inferior</string>
- <string name="Toolbar_Left_Tooltip">atualmente na sua barra de ferramentas esquerda</string>
- <string name="Toolbar_Right_Tooltip">atualmente na sua barra de ferramentas direita</string>
- <string name="Retain%">Reter%</string>
- <string name="Detail">Detalhe</string>
- <string name="Better Detail">Detalhamento maior</string>
- <string name="Surface">Superfície</string>
- <string name="Solid">Sólido</string>
- <string name="Wrap">Conclusão</string>
- <string name="Preview">Visualizar</string>
- <string name="Normal">Normal</string>
- <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string>
- <string name="Pathfinding_Object_Attr_None">Nenhum</string>
- <string name="Pathfinding_Object_Attr_Permanent">Afeta o navmesh</string>
- <string name="Pathfinding_Object_Attr_Character">Personagem</string>
- <string name="Pathfinding_Object_Attr_MultiSelect">(Múltiplo)</string>
- <string name="snapshot_quality_very_low">Muito baixo</string>
- <string name="snapshot_quality_low">Baixo</string>
- <string name="snapshot_quality_medium">Médio</string>
- <string name="snapshot_quality_high">Alto</string>
- <string name="snapshot_quality_very_high">Muito alto</string>
- <string name="TeleportMaturityExceeded">O residente não pode visitar a região.</string>
- <string name="UserDictionary">[Usuário]</string>
- <string name="experience_tools_experience">Experiência</string>
- <string name="ExperienceNameNull">(nenhuma experiência)</string>
- <string name="ExperienceNameUntitled">(experiência sem título)</string>
- <string name="Land-Scope">Dentro do terreno</string>
- <string name="Grid-Scope">Dentro da grade</string>
- <string name="Allowed_Experiences_Tab">PERMITIDO</string>
- <string name="Blocked_Experiences_Tab">BLOQUEADO</string>
- <string name="Contrib_Experiences_Tab">COLABORADOR</string>
- <string name="Admin_Experiences_Tab">ADMINISTRADOR</string>
- <string name="Recent_Experiences_Tab">RECENTE</string>
- <string name="Owned_Experiences_Tab">PRÓPRIAS</string>
- <string name="ExperiencesCounter">([EXPERIENCES], máx. [MAXEXPERIENCES])</string>
- <string name="ExperiencePermission1">assumir seus controles</string>
- <string name="ExperiencePermission3">acionar animações no seu avatar</string>
- <string name="ExperiencePermission4">anexar ao avatar</string>
- <string name="ExperiencePermission9">rastrear sua câmera</string>
- <string name="ExperiencePermission10">controlar sua câmera</string>
- <string name="ExperiencePermission11">teletransportar você</string>
- <string name="ExperiencePermission12">aceitar automaticamente permissões de experiência</string>
- <string name="ExperiencePermission16">forçar o avatar a sentar</string>
- <string name="ExperiencePermission17">alterar sua configurações de ambiente</string>
- <string name="ExperiencePermissionShortUnknown">realizar uma operação desconhecida: [Permission]</string>
- <string name="ExperiencePermissionShort1">Assumir o controle</string>
- <string name="ExperiencePermissionShort3">Acionar animações</string>
- <string name="ExperiencePermissionShort4">Anexar</string>
- <string name="ExperiencePermissionShort9">Rastrear câmera</string>
- <string name="ExperiencePermissionShort10">Controlar câmera</string>
- <string name="ExperiencePermissionShort11">Teletransportar</string>
- <string name="ExperiencePermissionShort12">Autorização</string>
- <string name="ExperiencePermissionShort16">Sentar</string>
- <string name="ExperiencePermissionShort17">Ambiente</string>
- <string name="logging_calls_disabled_log_empty">As conversas não estão sendo registradas. Para começar a manter um registro, selecione &quot;Salvar: apenas registro&quot; ou &quot;Salvar: registro e transcrições&quot; em Preferências&gt; Bate-papo.</string>
- <string name="logging_calls_disabled_log_not_empty">Nenhuma conversa será registrada. Para recomeçar a gravação de registros, selecione &quot;Salvar: apenas registro&quot; ou &quot;Salvar: registro e transcrições&quot; em Preferências&gt; Bate-papo.</string>
- <string name="logging_calls_enabled_log_empty">Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui.</string>
- <string name="loading_chat_logs">Carregando...</string>
- <string name="na">n/d</string>
- <string name="preset_combo_label">-Lista vazia-</string>
- <string name="Default">Padrão</string>
- <string name="none_paren_cap">(nenhum)</string>
- <string name="no_limit">Sem limite</string>
- <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">A forma física contém triângulos muito pequenos. Tente simplificar o modelo físico.</string>
- <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">A forma física contém dados de confirmação ruins. Tente consertar o modelo físico.</string>
- <string name="Mav_Details_MAV_UNKNOWN_VERSION">A forma física não tem a versão correta. Defina a versão correta para o modelo físico.</string>
- <string name="couldnt_resolve_host">O DNS não pode resolver o nome do host([HOSTNAME]).
+(ex. "/caminho para/editor" "%s")
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error ao analisar o comando do editor externo.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Falha de execução do editor externo.
+ </string>
+ <string name="TranslationFailed">
+ Falha na tradução: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Erro ao analisar resposta de tradução.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Início
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Adicionar
+ </string>
+ <string name="Subtract">
+ Subtrair
+ </string>
+ <string name="Multiply">
+ Multiplicar
+ </string>
+ <string name="Divide">
+ Dividir
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Vendo balizas de partículas (azul)
+ </string>
+ <string name="BeaconPhysical">
+ Vendo balizas de objetos físicos (verde)
+ </string>
+ <string name="BeaconScripted">
+ Vendo balizas de objetos com script (vermelho)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Vendo objeto com script com balizas com funcionalidade de toque (vermelho)
+ </string>
+ <string name="BeaconSound">
+ Vendo balizas de som (amarelo)
+ </string>
+ <string name="BeaconMedia">
+ Vendo balizas de mídia (branco)
+ </string>
+ <string name="BeaconSun">
+ Visualizando farol de direção do sol (alaranjado)
+ </string>
+ <string name="BeaconMoon">
+ Visualizando farol de direção da lua (roxo)
+ </string>
+ <string name="ParticleHiding">
+ Ocultar partículas
+ </string>
+ <string name="Command_AboutLand_Label">
+ Sobre terrenos
+ </string>
+ <string name="Command_Appearance_Label">
+ Aparência
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construir
+ </string>
+ <string name="Command_Chat_Label">
+ Bate-papo
+ </string>
+ <string name="Command_Conversations_Label">
+ Conversas
+ </string>
+ <string name="Command_Compass_Label">
+ Bússola
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinos
+ </string>
+ <string name="Command_Environments_Label">
+ Meus ambientes
+ </string>
+ <string name="Command_Facebook_Label">
+ Facebook
+ </string>
+ <string name="Command_Flickr_Label">
+ Flickr
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestos
+ </string>
+ <string name="Command_Grid_Status_Label">
+ Status da grade
+ </string>
+ <string name="Command_HowTo_Label">
+ Como
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventário
+ </string>
+ <string name="Command_Map_Label">
+ Mapa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercado
+ </string>
+ <string name="Command_MarketplaceListings_Label">
+ Marketplace
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini Mapa
+ </string>
+ <string name="Command_Move_Label">
+ Andar/correr/voar
+ </string>
+ <string name="Command_Outbox_Label">
+ Caixa de saída do lojista
+ </string>
+ <string name="Command_People_Label">
+ Pessoas
+ </string>
+ <string name="Command_Picks_Label">
+ Destaques
+ </string>
+ <string name="Command_Places_Label">
+ Lugares
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferências
+ </string>
+ <string name="Command_Profile_Label">
+ Perfil
+ </string>
+ <string name="Command_Report_Abuse_Label">
+ Relatar abuso
+ </string>
+ <string name="Command_Search_Label">
+ Buscar
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Falar
+ </string>
+ <string name="Command_Twitter_Label">
+ Twitter
+ </string>
+ <string name="Command_View_Label">
+ Controles da câmera
+ </string>
+ <string name="Command_Voice_Label">
+ Configurações de voz
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informações sobre o terreno que você está visitando
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Mudar seu avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Escolha um avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construindo objetos e redimensionando terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Bater papo com pessoas próximas usando texto
+ </string>
+ <string name="Command_Conversations_Tooltip">
+ Conversar com todos
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Bússola
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinos de interesse
+ </string>
+ <string name="Command_Environments_Tooltip">
+ Meus ambientes
+ </string>
+ <string name="Command_Facebook_Tooltip">
+ Publicar no Facebook
+ </string>
+ <string name="Command_Flickr_Tooltip">
+ Carregar no Flickr
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestos para seu avatar
+ </string>
+ <string name="Command_Grid_Status_Tooltip">
+ Mostrar status da grade atual
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Como executar tarefas comuns
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Exibir e usar seus pertences
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mapa-múndi
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Faça compras
+ </string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Venda suas criações
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostrar quem está aqui
+ </string>
+ <string name="Command_Move_Tooltip">
+ Movendo seu avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transferir itens para o seu mercado para venda
+ </string>
+ <string name="Command_People_Tooltip">
+ Amigos, grupos e pessoas próximas
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lugares mostrados como favoritos em seu perfil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lugares salvos
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferências
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Edite ou visualize seu perfil
+ </string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Relatar abuso
+ </string>
+ <string name="Command_Search_Tooltip">
+ Encontre lugares, eventos, pessoas
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Tirar uma foto
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Fale com pessoas próximas usando seu microfone
+ </string>
+ <string name="Command_Twitter_Tooltip">
+ Twitter
+ </string>
+ <string name="Command_View_Tooltip">
+ Alterar o ângulo da câmera
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Controles de volume das chamadas e pessoas próximas a você no mundo virtual
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ atualmente na sua barra de ferramentas inferior
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ atualmente na sua barra de ferramentas esquerda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ atualmente na sua barra de ferramentas direita
+ </string>
+ <string name="Retain%">
+ Reter%
+ </string>
+ <string name="Detail">
+ Detalhe
+ </string>
+ <string name="Better Detail">
+ Detalhamento maior
+ </string>
+ <string name="Surface">
+ Superfície
+ </string>
+ <string name="Solid">
+ Sólido
+ </string>
+ <string name="Wrap">
+ Conclusão
+ </string>
+ <string name="Preview">
+ Visualizar
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="Pathfinding_Wiki_URL">
+ http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </string>
+ <string name="Pathfinding_Object_Attr_None">
+ Nenhum
+ </string>
+ <string name="Pathfinding_Object_Attr_Permanent">
+ Afeta o navmesh
+ </string>
+ <string name="Pathfinding_Object_Attr_Character">
+ Personagem
+ </string>
+ <string name="Pathfinding_Object_Attr_MultiSelect">
+ (Múltiplo)
+ </string>
+ <string name="snapshot_quality_very_low">
+ Muito baixo
+ </string>
+ <string name="snapshot_quality_low">
+ Baixo
+ </string>
+ <string name="snapshot_quality_medium">
+ Médio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Muito alto
+ </string>
+ <string name="TeleportMaturityExceeded">
+ O residente não pode visitar a região.
+ </string>
+ <string name="UserDictionary">
+ [Usuário]
+ </string>
+ <string name="experience_tools_experience">
+ Experiência
+ </string>
+ <string name="ExperienceNameNull">
+ (nenhuma experiência)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (experiência sem título)
+ </string>
+ <string name="Land-Scope">
+ Dentro do terreno
+ </string>
+ <string name="Grid-Scope">
+ Dentro da grade
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ PERMITIDO
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOQUEADO
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ COLABORADOR
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ADMINISTRADOR
+ </string>
+ <string name="Recent_Experiences_Tab">
+ RECENTE
+ </string>
+ <string name="Owned_Experiences_Tab">
+ PRÓPRIAS
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], máx. [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ assumir seus controles
+ </string>
+ <string name="ExperiencePermission3">
+ acionar animações no seu avatar
+ </string>
+ <string name="ExperiencePermission4">
+ anexar ao avatar
+ </string>
+ <string name="ExperiencePermission9">
+ rastrear sua câmera
+ </string>
+ <string name="ExperiencePermission10">
+ controlar sua câmera
+ </string>
+ <string name="ExperiencePermission11">
+ teletransportar você
+ </string>
+ <string name="ExperiencePermission12">
+ aceitar automaticamente permissões de experiência
+ </string>
+ <string name="ExperiencePermission16">
+ forçar o avatar a sentar
+ </string>
+ <string name="ExperiencePermission17">
+ alterar sua configurações de ambiente
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ realizar uma operação desconhecida: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Assumir o controle
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Acionar animações
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Anexar
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Rastrear câmera
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Controlar câmera
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teletransportar
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Autorização
+ </string>
+ <string name="ExperiencePermissionShort16">
+ Sentar
+ </string>
+ <string name="ExperiencePermissionShort17">
+ Ambiente
+ </string>
+ <string name="logging_calls_disabled_log_empty">
+ As conversas não estão sendo registradas. Para começar a manter um registro, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências&gt; Bate-papo.
+ </string>
+ <string name="logging_calls_disabled_log_not_empty">
+ Nenhuma conversa será registrada. Para recomeçar a gravação de registros, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências&gt; Bate-papo.
+ </string>
+ <string name="logging_calls_enabled_log_empty">
+ Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui.
+ </string>
+ <string name="loading_chat_logs">
+ Carregando...
+ </string>
+ <string name="na">
+ n/d
+ </string>
+ <string name="preset_combo_label">
+ -Lista vazia-
+ </string>
+ <string name="Default">
+ Padrão
+ </string>
+ <string name="none_paren_cap">
+ (nenhum)
+ </string>
+ <string name="no_limit">
+ Sem limite
+ </string>
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ A forma física contém triângulos muito pequenos. Tente simplificar o modelo físico.
+ </string>
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ A forma física contém dados de confirmação ruins. Tente consertar o modelo físico.
+ </string>
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ A forma física não tem a versão correta. Defina a versão correta para o modelo físico.
+ </string>
+ <string name="couldnt_resolve_host">
+ O DNS não pode resolver o nome do host([HOSTNAME]).
Verifique se você pode conectar ao site www.secondlife.com . Se você
puder, mas se continuar recebendo esta mensagem de erro, vá à sessão
-Suporte no site Secondlife.com e informe o problema.</string>
- <string name="ssl_peer_certificate">O servidor de acesso não pôde verificá-lo pelo SSL.
+Suporte no site Secondlife.com e informe o problema.
+ </string>
+ <string name="ssl_peer_certificate">
+ O servidor de acesso não pôde verificá-lo pelo SSL.
Se você continuar recebendo esta mensagem de erro,
vá à sessão Suporte no site Secondlife.com
-e informe o problema.</string>
- <string name="ssl_connect_error">Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto.
+e informe o problema.
+ </string>
+ <string name="ssl_connect_error">
+ Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto.
Vá em Painel de Controles e certifique-se de que a hora e data estejam corretos.
Além disso, verifique se a sua rede e firewall estejam corretos. Se você continuar
recebendo esta mensagem de erro, vá à sessão Suporte no site Secondlife.com
e informe o problema.
-[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento]</string>
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml
index 0cbf4dccd8..014e44a175 100644
--- a/indra/newview/skins/default/xui/pt/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml
@@ -1,38 +1,94 @@
<?xml version="1.0" ?>
<teleport_messages>
<message_set name="errors">
- <message name="invalid_tport">Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte.
-Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].</message>
- <message name="invalid_region_handoff">Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente.
-Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].</message>
- <message name="blocked_tport">Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.</message>
- <message name="nolandmark_tport">Desculpe, mas o sistema não conseguiu localizar a landmark de destino.</message>
- <message name="timeout_tport">Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.</message>
- <message name="NoHelpIslandTP">Não é possível se teletransportar de volta à Ilha Welcome.
-Vá para a 'Ilha Welcome Pública' para repetir o tutorial.</message>
- <message name="noaccess_tport">Desculpe, você não tem acesso ao destino deste teletransporte.</message>
- <message name="missing_attach_tport">Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente.</message>
- <message name="too_many_uploads_tport">Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possível em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada.</message>
- <message name="expired_tport">Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos.</message>
- <message name="expired_region_handoff">Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos.</message>
- <message name="no_host">Não foi possível encontrar o destino do teletransporte. O destino pode estar temporariamente indisponível ou não existir mais. Por favor, tente novamente em poucos minutos.</message>
- <message name="no_inventory_host">O sistema de inventário está indisponível no momento.</message>
- <message name="MustGetAgeRegion">Você deve ter 18 anos ou mais para acessar esta região.</message>
- <message name="RegionTPSpecialUsageBlocked">Não é possível inserir a região. '[REGION_NAME]' é uma Região de Skill Gaming, portanto você deve atender certos critérios para poder entrar. Para maiores detalhes, consulte as [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].</message>
- <message name="preexisting_tport">Desculpe, mas o sistema falhou ao iniciar o seu teletransporte. Por favor, tente novamente dentro de alguns minutos.</message>
+ <message name="invalid_tport">
+ Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte.
+Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente.
+Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.
+ </message>
+ <message name="nolandmark_tport">
+ Desculpe, mas o sistema não conseguiu localizar a landmark de destino.
+ </message>
+ <message name="timeout_tport">
+ Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.
+ </message>
+ <message name="NoHelpIslandTP">
+ Não é possível se teletransportar de volta à Ilha Welcome.
+Vá para a 'Ilha Welcome Pública' para repetir o tutorial.
+ </message>
+ <message name="noaccess_tport">
+ Desculpe, você não tem acesso ao destino deste teletransporte.
+ </message>
+ <message name="missing_attach_tport">
+ Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente.
+ </message>
+ <message name="too_many_uploads_tport">
+ Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possível em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada.
+ </message>
+ <message name="expired_tport">
+ Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos.
+ </message>
+ <message name="expired_region_handoff">
+ Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos.
+ </message>
+ <message name="no_host">
+ Não foi possível encontrar o destino do teletransporte. O destino pode estar temporariamente indisponível ou não existir mais. Por favor, tente novamente em poucos minutos.
+ </message>
+ <message name="no_inventory_host">
+ O sistema de inventário está indisponível no momento.
+ </message>
+ <message name="MustGetAgeRegion">
+ Você deve ter 18 anos ou mais para acessar esta região.
+ </message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Não é possível inserir a região. '[REGION_NAME]' é uma Região de Skill Gaming, portanto você deve atender certos critérios para poder entrar. Para maiores detalhes, consulte as [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ </message>
+ <message name="preexisting_tport">
+ Desculpe, mas o sistema falhou ao iniciar o seu teletransporte. Por favor, tente novamente dentro de alguns minutos.
+ </message>
</message_set>
<message_set name="progress">
- <message name="sending_dest">Enviando para o destino.</message>
- <message name="redirecting">Redirecionando para uma localidade diferente.</message>
- <message name="relaying">Transferindo para o destino.</message>
- <message name="sending_home">Enviando solicitação de localização de início.</message>
- <message name="sending_landmark">Enviando solicitação de localização de landmark.</message>
- <message name="completing">Completando teletransporte.</message>
- <message name="completed_from">Teletransporte de [T_SLURL] concluído</message>
- <message name="resolving">Identificando destino.</message>
- <message name="contacting">Contactando nova região.</message>
- <message name="arriving">Chegando...</message>
- <message name="requesting">Solicitando teletransporte...</message>
- <message name="pending">Teletransporte pendente...</message>
+ <message name="sending_dest">
+ Enviando para o destino.
+ </message>
+ <message name="redirecting">
+ Redirecionando para uma localidade diferente.
+ </message>
+ <message name="relaying">
+ Transferindo para o destino.
+ </message>
+ <message name="sending_home">
+ Enviando solicitação de localização de início.
+ </message>
+ <message name="sending_landmark">
+ Enviando solicitação de localização de landmark.
+ </message>
+ <message name="completing">
+ Completando teletransporte.
+ </message>
+ <message name="completed_from">
+ Teletransporte de [T_SLURL] concluído
+ </message>
+ <message name="resolving">
+ Identificando destino.
+ </message>
+ <message name="contacting">
+ Contactando nova região.
+ </message>
+ <message name="arriving">
+ Chegando...
+ </message>
+ <message name="requesting">
+ Solicitando teletransporte...
+ </message>
+ <message name="pending">
+ Teletransporte pendente...
+ </message>
</message_set>
</teleport_messages>
diff --git a/indra/newview/skins/default/xui/ru/floater_search.xml b/indra/newview/skins/default/xui/ru/floater_search.xml
deleted file mode 100644
index 405a6598ac..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Загрузка...
- </floater.string>
- <floater.string name="done_text">
- Готово
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Повторить поиск, чтобы показать текущий уровень творца
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
index f07e12e0ed..adc612dfd8 100644
--- a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
@@ -7,7 +7,7 @@
Сохранение изображения в инвентаре стоит L$[UPLOAD_COST]. Чтобы сохранить его как текстуру, выберите один из квадратных форматов.
</text>
<combo_box label="Размер" name="texture_size_combo">
- <combo_box.item label="Текущее окно (512x512)" name="CurrentWindow"/>
+ <combo_box.item label="Текущее окно" name="CurrentWindow"/>
<combo_box.item label="Маленький (128x128)" name="Small(128x128)"/>
<combo_box.item label="Средний (256x256)" name="Medium(256x256)"/>
<combo_box.item label="Большой (512x512)" name="Large(512x512)"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
index 7ba03ee0c9..f7fda0b1dc 100644
--- a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="Сохранить на диске" name="save_to_computer_btn"/>
- <button label="Сохранить в инвентаре (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Сохранить в инвентаре" name="save_to_inventory_btn"/>
<button label="Поделиться в профиле" name="save_to_profile_btn"/>
<button label="Поделиться в Facebook" name="send_to_facebook_btn"/>
<button label="Поделиться в Twitter" name="send_to_twitter_btn"/>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 10b0d3578f..682acd9191 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -1,8 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
- It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
- that are returned from one component and may appear in many places-->
<strings>
<string name="SECOND_LIFE">
Second Life
@@ -42,7 +38,7 @@
Конфигурация построения [BUILD_CONFIG]
</string>
<string name="AboutPosition">
- Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», расположенном на &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», расположенном на &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(глобальные координаты [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
@@ -1657,7 +1653,7 @@ support@secondlife.com.
Тариф зависит от типа вашей подписки. Тарифы для владельцев расширенных пакетов меньше. [https://secondlife.com/my/account/membership.php? Узнать больше]
</string>
<string name="Open landmarks">
- Открыть сохраненные локации
+ Открыть сохраненные локации
</string>
<string name="Unconstrained">
Без ограничений
@@ -2870,8 +2866,8 @@ support@secondlife.com.
<string name=".">
.
</string>
- <string name="&apos;">
- &apos;
+ <string name="'">
+ '
</string>
<string name="---">
---
@@ -2983,7 +2979,7 @@ support@secondlife.com.
Не удается запустить приложение [APP_NAME], поскольку драйверы видеокарты неправильно установлены, устарели или предназначены для оборудования, которое не поддерживается. Установите или переустановите последние драйверы видеокарты.
Если это сообщение продолжает отображаться, обратитесь на сайт [SUPPORT_SITE].
</string>
- <string name="5 O&apos;Clock Shadow">
+ <string name="5 O'Clock Shadow">
Жидкие
</string>
<string name="All White">
@@ -4576,6 +4572,10 @@ support@secondlife.com.
<string name="inventory_folder_offered-im">
Предложена папка инвентаря «[ITEM_NAME]»
</string>
+ <string name="bot_warning">
+ Вы общаетесь с ботом [NAME]. Не передавайте личные данные.
+Подробнее на https://second.life/scripted-agents.
+ </string>
<string name="share_alert">
Перетаскивайте вещи из инвентаря сюда
</string>
@@ -5143,7 +5143,7 @@ support@secondlife.com.
<string name="ExternalEditorNotFound">
Не удается найти указанный внешний редактор.
Попробуйте взять путь к редактору в двойные кавычки
-(например &quot;/path to my/editor&quot; &quot;%s&quot;)
+(например "/path to my/editor" "%s")
</string>
<string name="ExternalEditorCommandParseError">
Ошибка анализа командной строки для внешнего редактора.
diff --git a/indra/newview/skins/default/xui/tr/floater_search.xml b/indra/newview/skins/default/xui/tr/floater_search.xml
deleted file mode 100644
index 08c1e5162c..0000000000
--- a/indra/newview/skins/default/xui/tr/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Yükleniyor...
- </floater.string>
- <floater.string name="done_text">
- Tamamlandı
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Mevcut Yönetici seviyesini dikkate alarak aramayı yenile
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
index be5940c4b9..160cba8700 100644
--- a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
@@ -7,7 +7,7 @@
Bir görüntüyü envanterinize kaydetmenin maliyeti L$[UPLOAD_COST] olur. Görüntünüzü bir doku olarak kaydetmek için kare formatlardan birini seçin.
</text>
<combo_box label="Çözünürlük" name="texture_size_combo">
- <combo_box.item label="Mevcut Pencere(512x512)" name="CurrentWindow"/>
+ <combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
<combo_box.item label="Küçük (128x128)" name="Small(128x128)"/>
<combo_box.item label="Orta (256x256)" name="Medium(256x256)"/>
<combo_box.item label="Büyük (512x512)" name="Large(512x512)"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
index 1b48bbeec2..a028710b98 100644
--- a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="Diske Kaydet" name="save_to_computer_btn"/>
- <button label="Envantere Kaydet (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Envantere Kaydet" name="save_to_inventory_btn"/>
<button label="Profil Akışında Paylaş" name="save_to_profile_btn"/>
<button label="Facebook&apos;ta Paylaş" name="send_to_facebook_btn"/>
<button label="Twitter&apos;da Paylaş" name="send_to_twitter_btn"/>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index d992788e13..5c3f7ae256 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -1,8 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
- It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
- that are returned from one component and may appear in many places-->
<strings>
<string name="SECOND_LIFE">
Second Life
@@ -42,7 +38,7 @@
Yapı Konfigürasyonu [BUILD_CONFIG]
</string>
<string name="AboutPosition">
- &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız
+ &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız
SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(küresel koordinatlar [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
@@ -88,7 +84,7 @@ Ses Sunucusu Sürümü: [VOICE_VERSION]
[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
</string>
<string name="ErrorFetchingServerReleaseNotesURL">
- Sunucu sürümü notları URL&apos;si alınırken hata oluştu.
+ Sunucu sürümü notları URL'si alınırken hata oluştu.
</string>
<string name="BuildConfiguration">
Yapı Konfigürasyonu
@@ -205,7 +201,7 @@ Ses Sunucusu Sürümü: [VOICE_VERSION]
http://secondlife.com/download
</string>
<string name="LoginFailedViewerNotPermitted">
- Kullandığınız görüntüleyici ile artık Second Life&apos;a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin:
+ Kullandığınız görüntüleyici ile artık Second Life'a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin:
http://secondlife.com/download
Daha fazla bilgi edinmek için asağıdaki SSS sayfamızı ziyaret edin:
@@ -247,10 +243,10 @@ Güncelleştirmeler için www.secondlife.com/status adresini kontrol edin.
<string name="LoginFailedPremiumOnly">
Second Life üzerindeki aktif kullanıcıların olası en iyi deneyimi yaşamasını sağlamak için, oturum açılması geçici olarak kısıtlanmıştır.
-Second Life için ödeme yapmış olan kişilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kişiler bu süre içerisinde Second Life&apos;a erişemeyecekler.
+Second Life için ödeme yapmış olan kişilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kişiler bu süre içerisinde Second Life'a erişemeyecekler.
</string>
<string name="LoginFailedComputerProhibited">
- Second Life&apos;a bu bilgisayardan erişemezsiniz.
+ Second Life'a bu bilgisayardan erişemezsiniz.
Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun:
support@secondlife.com.
</string>
@@ -286,7 +282,7 @@ Lütfen yeniden oturum açmayı denemeden önce bir dakika bekleyin.
Bir simülatöre bağlanılamadı.
</string>
<string name="LoginFailedRestrictedHours">
- Hesabınız Second Life&apos;a sadece
+ Hesabınız Second Life'a sadece
Pasifik Saati ile [START] ve [END] arasında erişebilir.
Lütfen bu saatler arasında tekrar uğrayın.
Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
@@ -369,7 +365,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
Facebook ile bağlantı kurulurken sorun oluştu
</string>
<string name="SocialFacebookErrorPosting">
- Facebook&apos;ta yayınlarken sorun oluştu
+ Facebook'ta yayınlarken sorun oluştu
</string>
<string name="SocialFacebookErrorDisconnecting">
Facebook bağlantısı kesilirken sorun oluştu
@@ -387,7 +383,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
Flickr bağlantısı kurulurken sorun çıktı
</string>
<string name="SocialFlickrErrorPosting">
- Flickr&apos;da yayınlarken sorun çıktı
+ Flickr'da yayınlarken sorun çıktı
</string>
<string name="SocialFlickrErrorDisconnecting">
Flickr bağlantısı kesilirken sorun çıktı
@@ -405,7 +401,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
Twitter bağlantısı kurulurken sorun çıktı
</string>
<string name="SocialTwitterErrorPosting">
- Twitter&apos;da yayınlarken sorun çıktı
+ Twitter'da yayınlarken sorun çıktı
</string>
<string name="SocialTwitterErrorDisconnecting">
Twitter bağlantısı kesilirken sorun çıktı
@@ -414,7 +410,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
Siyah Beyaz
</string>
<string name="Colors1970">
- 70&apos;lerin Renkleri
+ 70'lerin Renkleri
</string>
<string name="Intense">
Yoğun
@@ -657,7 +653,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
not kartlarına eklenemez.
</string>
<string name="TooltipNotecardOwnerRestrictedDrop">
- Sadece kısıtlamasız &apos;sonraki sahip&apos;
+ Sadece kısıtlamasız 'sonraki sahip'
izinlerini içeren öğeler not
kartlarına eklenebilir.
</string>
@@ -1107,10 +1103,10 @@ http://secondlife.com/support adresini ziyaret edin.
Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
</string>
<string name="ScriptQuestionCautionChatGranted">
- &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verildi: [PERMISSIONS].
+ '[OWNERNAME]' adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine şunu yapma izni verildi: [PERMISSIONS].
</string>
<string name="ScriptQuestionCautionChatDenied">
- &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verilmedi: [PERMISSIONS].
+ '[OWNERNAME]' adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine şunu yapma izni verilmedi: [PERMISSIONS].
</string>
<string name="AdditionalPermissionsRequestHeader">
Eğer hesabınıza erişime izin verirseniz, bu nesneye aynı zamanda şunun için izin vermiş olacaksınız:
@@ -1486,7 +1482,7 @@ http://secondlife.com/support adresini ziyaret edin.
Yüksek
</string>
<string name="LeaveMouselook">
- Dünya Görünümüne dönmek için ESC&apos;e basın
+ Dünya Görünümüne dönmek için ESC'e basın
</string>
<string name="InventoryNoMatchingItems">
Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] ile bulmayı deneyin.
@@ -1545,7 +1541,7 @@ http://secondlife.com/support adresini ziyaret edin.
</string>
<string name="InventoryOutboxNoItemsTooltip"/>
<string name="InventoryOutboxNoItems">
- Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için &quot;Pazaryerine Gönder&quot; üzerine tıklayın.
+ Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için "Pazaryerine Gönder" üzerine tıklayın.
</string>
<string name="InventoryOutboxInitializingTitle">
Pazaryeri Başlatılıyor.
@@ -1815,7 +1811,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
Satın Al
</string>
<string name="BuyforL$">
- L$&apos;a Satın Al
+ L$'a Satın Al
</string>
<string name="Stone">
Taş
@@ -2001,19 +1997,19 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
Hata: Nesne mevcut dış görünüme dahil ama eklenmemiş
</string>
<string name="YearsMonthsOld">
- [AGEYEARS] [AGEMONTHS]&apos;lık
+ [AGEYEARS] [AGEMONTHS]'lık
</string>
<string name="YearsOld">
[AGEYEARS] yaşında
</string>
<string name="MonthsOld">
- [AGEMONTHS]&apos;lık
+ [AGEMONTHS]'lık
</string>
<string name="WeeksOld">
- [AGEWEEKS]&apos;lık
+ [AGEWEEKS]'lık
</string>
<string name="DaysOld">
- [AGEDAYS]&apos;lük
+ [AGEDAYS]'lük
</string>
<string name="TodayOld">
Bugün katıldı
@@ -2034,7 +2030,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
Çevrenizdeki kimse sizi işleyemeyebilir.
</string>
<string name="hud_description_total">
- BÜG&apos;niz
+ BÜG'niz
</string>
<string name="hud_name_with_joint">
[OBJ_NAME] ([JNT_NAME] üzerinde)
@@ -2312,13 +2308,13 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
Kullanılan bellek: [COUNT] kb
</string>
<string name="ScriptLimitsParcelScriptURLs">
- Parsel Komut Dosyası URL&apos;leri
+ Parsel Komut Dosyası URL'leri
</string>
<string name="ScriptLimitsURLsUsed">
- Kullanılan URL&apos;ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest
+ Kullanılan URL'ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest
</string>
<string name="ScriptLimitsURLsUsedSimple">
- Kullanılan URL&apos;ler: [COUNT]
+ Kullanılan URL'ler: [COUNT]
</string>
<string name="ScriptLimitsRequestError">
Bilgi talep edilirken hata oluştu
@@ -2522,7 +2518,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
Yeni Komut Dosyası
</string>
<string name="DoNotDisturbModeResponseDefault">
- Bu sakin &quot;Rahatsız Etme&quot; seçeneğini devreye almış, mesajınızı sonra görecek.
+ Bu sakin "Rahatsız Etme" seçeneğini devreye almış, mesajınızı sonra görecek.
</string>
<string name="MuteByName">
(Adına göre)
@@ -2633,7 +2629,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
size verdi:
</string>
<string name="InvOfferDecline">
- &lt;nolink&gt;[NAME]&lt;/nolink&gt; tarafından gönderilen [DESC]&apos;i reddettiniz.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; tarafından gönderilen [DESC]'i reddettiniz.
</string>
<string name="GroupMoneyTotal">
Toplam
@@ -2870,8 +2866,8 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
<string name=".">
.
</string>
- <string name="&apos;">
- &apos;
+ <string name="'">
+ '
</string>
<string name="---">
---
@@ -2986,7 +2982,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
</string>
- <string name="5 O&apos;Clock Shadow">
+ <string name="5 O'Clock Shadow">
Bir Günlük Sakal
</string>
<string name="All White">
@@ -4490,7 +4486,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
Görüntüleyici başlatılamadı
</string>
<string name="ItemsComingInTooFastFrom">
- [APP_NAME]: [FROM_NAME]&apos;den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
+ [APP_NAME]: [FROM_NAME]'den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
</string>
<string name="ItemsComingInTooFast">
[APP_NAME]: Öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
@@ -4526,7 +4522,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
(Kaydedildi [LONG_TIMESTAMP])
</string>
<string name="IM_unblock_only_groups_friends">
- Bu mesajı görmek için Tercihler/Gizlilik&apos;de &apos;Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin&apos; seçeneğinin işaretini kaldırmalısınız.
+ Bu mesajı görmek için Tercihler/Gizlilik'de 'Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin' seçeneğinin işaretini kaldırmalısınız.
</string>
<string name="OnlineStatus">
Çevrimiçi
@@ -4550,7 +4546,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
Sesli aramaya katıldınız
</string>
<string name="you_auto_rejected_call-im">
- &quot;Rahatsız Etme&quot; seçeneğini devredeyken sesli aramayı otomatik olarak reddettiniz.
+ "Rahatsız Etme" seçeneğini devredeyken sesli aramayı otomatik olarak reddettiniz.
</string>
<string name="name_started_call">
[NAME] bir sesli arama başlattı
@@ -4574,22 +4570,26 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
[AGENT_NAME] ile konferans
</string>
<string name="inventory_item_offered-im">
- &quot;[ITEM_NAME]&quot; envanter öğesi sunuldu
+ "[ITEM_NAME]" envanter öğesi sunuldu
</string>
<string name="inventory_folder_offered-im">
- &quot;[ITEM_NAME]&quot; envanter klasörü sunuldu
+ "[ITEM_NAME]" envanter klasörü sunuldu
+ </string>
+ <string name="bot_warning">
+ Bir bot ile sohbet ediyorsunuz, [NAME]. Kişisel bilgilerinizi paylaşmayın.
+Daha fazla bilgi için: https://second.life/scripted-agents.
</string>
<string name="share_alert">
Envanterinizden buraya öğeler sürükleyin
</string>
<string name="facebook_post_success">
- Facebook&apos;ta yayınladınız.
+ Facebook'ta yayınladınız.
</string>
<string name="flickr_post_success">
- Flickr&apos;da yayınladınız.
+ Flickr'da yayınladınız.
</string>
<string name="twitter_post_success">
- Twitter&apos;da yayınladınız.
+ Twitter'da yayınladınız.
</string>
<string name="no_session_message">
(Aİ Oturumu Mevcut Değil)
@@ -4682,7 +4682,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
[NAME] size L$[AMOUNT] ödedi.
</string>
<string name="you_paid_ldollars">
- [NAME]&apos;e [REASON] L$[AMOUNT] ödediniz.
+ [NAME]'e [REASON] L$[AMOUNT] ödediniz.
</string>
<string name="you_paid_ldollars_gift">
[NAME] adlı kullanıcıya [AMOUNT] L$ ödediniz. [REASON]
@@ -4691,13 +4691,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
L$[AMOUNT] ödediniz.
</string>
<string name="you_paid_ldollars_no_reason">
- [NAME]&apos;e L$[AMOUNT] ödediniz.
+ [NAME]'e L$[AMOUNT] ödediniz.
</string>
<string name="you_paid_ldollars_no_name">
[REASON] L$[AMOUNT] ödediniz.
</string>
<string name="you_paid_failure_ldollars">
- [REASON] [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
+ [REASON] [NAME]'e L$[AMOUNT] ödeyemediniz.
</string>
<string name="you_paid_failure_ldollars_gift">
[NAME] adlı kullanıcıya [AMOUNT] L$ ödeyemediniz. [REASON]
@@ -4706,7 +4706,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
L$[AMOUNT] ödeyemediniz.
</string>
<string name="you_paid_failure_ldollars_no_reason">
- [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
+ [NAME]'e L$[AMOUNT] ödeyemediniz.
</string>
<string name="you_paid_failure_ldollars_no_name">
[REASON] L$[AMOUNT] ödeyemediniz.
@@ -5138,7 +5138,7 @@ Hizmetle ilişkili bilinen bir sorun olup olmadığını görmek için lütfen h
<string name="ExternalEditorNotFound">
Belirttiğiniz harici düzenleyici bulunamadı.
Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
-(örn. &quot;/yolum/duzenleyici&quot; &quot;%s&quot;)
+(örn. "/yolum/duzenleyici" "%s")
</string>
<string name="ExternalEditorCommandParseError">
Harici düzenleyici komutu ayrıştırılırken hata oluştu.
@@ -5627,10 +5627,10 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
Ortamlarım
</string>
<string name="Command_Facebook_Tooltip">
- Facebook&apos;ta Yayınla
+ Facebook'ta Yayınla
</string>
<string name="Command_Flickr_Tooltip">
- Flickr&apos;a yükle
+ Flickr'a yükle
</string>
<string name="Command_Gestures_Tooltip">
Avatarınız için mimikler
@@ -5861,10 +5861,10 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
Ortam
</string>
<string name="logging_calls_disabled_log_empty">
- Sohbetlerin günlüğü tutulmuyor. Bir günlük tutmaya başlamak için, Tercihler &gt; Sohbet altında &quot;Kaydet: Sadece günlük&quot; veya &quot;Kaydet: Günlük ve dökümler&quot; seçimini yapın.
+ Sohbetlerin günlüğü tutulmuyor. Bir günlük tutmaya başlamak için, Tercihler &gt; Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın.
</string>
<string name="logging_calls_disabled_log_not_empty">
- Bundan böyle sohbetlerin günlükleri tutulmayacak. Bir günlük tutmaya devam etmek için, Tercihler &gt; Sohbet altında &quot;Kaydet: Sadece günlük&quot; veya &quot;Kaydet: Günlük ve dökümler&quot; seçimini yapın.
+ Bundan böyle sohbetlerin günlükleri tutulmayacak. Bir günlük tutmaya devam etmek için, Tercihler &gt; Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın.
</string>
<string name="logging_calls_enabled_log_empty">
Günlüğü tutulmuş sohbet yok. Siz biriyle iletişime geçtikten sonra veya biri sizinle iletişime geçtikten sonra, burada bir günlük girişi gösterilir.
@@ -5910,7 +5910,7 @@ bölümüne gidin ve sorunu bildirin.
</string>
<string name="ssl_connect_error">
Çoğunlukla, bu durum, bilgisayarınızın saatinin yanlış ayarlandığı anlamına gelir.
-Lütfen Denetim Masası&apos;na gidin ve tarih ve saat ayarlarının doğru yapıldığından emin olun.
+Lütfen Denetim Masası'na gidin ve tarih ve saat ayarlarının doğru yapıldığından emin olun.
Ayrıca, ağınızın ve güvenlik duvarınızın doğru şekilde ayarlanıp ayarlanmadığını kontrol edin.
Bu hatayı almaya devam ederseniz, lütfen SecondLife.com web sitesinin Destek bölümüne
gidin ve sorunu bildirin.
diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml
index e3a08e04b2..b403786bd2 100644
--- a/indra/newview/skins/default/xui/tr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml
@@ -21,8 +21,8 @@ Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp otu
Bir dakika sonra tekrar deneyin.
</message>
<message name="NoHelpIslandTP">
- Karşılama Ada&apos;sına geri ışınlanamazsınız.
-Öğreticiyi tekrarlamak için &apos;Karşılama Ada&apos;sı Kamusal Alanı&apos;na gidin.
+ Karşılama Ada'sına geri ışınlanamazsınız.
+Öğreticiyi tekrarlamak için 'Karşılama Ada'sı Kamusal Alanı'na gidin.
</message>
<message name="noaccess_tport">
Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz.
@@ -49,7 +49,7 @@ Bir dakika sonra tekrar deneyin.
Bu bölgeye girebilmek için 18 veya üzeri bir yaşta olmanız gerekir.
</message>
<message name="RegionTPSpecialUsageBlocked">
- Bölgeye girilemiyor. &quot;[REGION_NAME]&quot; bir Yetenek Oyunu Bölgesi. Buraya girebilmek için bazı ölçütleri karşılamanız gerekiyor. Ayrıntılar için lütfen [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ] adresini ziyaret edin.
+ Bölgeye girilemiyor. "[REGION_NAME]" bir Yetenek Oyunu Bölgesi. Buraya girebilmek için bazı ölçütleri karşılamanız gerekiyor. Ayrıntılar için lütfen [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ] adresini ziyaret edin.
</message>
</message_set>
<message_set name="progress">
diff --git a/indra/newview/skins/default/xui/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml
deleted file mode 100644
index 3e85a529ae..0000000000
--- a/indra/newview/skins/default/xui/zh/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- 載入中...
- </floater.string>
- <floater.string name="done_text">
- 完成
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- 以目前具備的神階級再搜尋一次
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml
index 094bf019b4..9c45c54a5e 100644
--- a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml
@@ -7,7 +7,7 @@
將圖像儲存到收納區的費用為 L$[UPLOAD_COST]。 若要將圖像存為材質,請選擇一個正方格式。
</text>
<combo_box label="解析度" name="texture_size_combo">
- <combo_box.item label="目前視窗(512x512)" name="CurrentWindow"/>
+ <combo_box.item label="目前視窗" name="CurrentWindow"/>
<combo_box.item label="小(128x128)" name="Small(128x128)"/>
<combo_box.item label="中(256x256)" name="Medium(256x256)"/>
<combo_box.item label="大(512x512)" name="Large(512x512)"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml
index d7c65bb25e..d9536882ac 100644
--- a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="儲存到硬碟" name="save_to_computer_btn"/>
- <button label="儲存到收納區(L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="儲存到收納區" name="save_to_inventory_btn"/>
<button label="分享至檔案訊息發佈" name="save_to_profile_btn"/>
<button label="分享到臉書" name="send_to_facebook_btn"/>
<button label="分享到推特" name="send_to_twitter_btn"/>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index d053d2b30d..cf6fa1d85f 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -1,8 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
- It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
- that are returned from one component and may appear in many places-->
<strings>
<string name="SECOND_LIFE">
第二人生
@@ -42,7 +38,7 @@
建製設置 [BUILD_CONFIG]
</string>
<string name="AboutPosition">
- 你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:&lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ 你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:&lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
第二人生URL:&lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(全域坐標:[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
@@ -1103,10 +1099,10 @@ http://secondlife.com/support 求助解決問題。
現在你將重新聯接到附近的語音聊天
</string>
<string name="ScriptQuestionCautionChatGranted">
- 物件「[OBJECTNAME]&apos;」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已獲得下列權限:[PERMISSIONS]。
+ 物件「[OBJECTNAME]'」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已獲得下列權限:[PERMISSIONS]。
</string>
<string name="ScriptQuestionCautionChatDenied">
- 物件「[OBJECTNAME]&apos;」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已被撤除下列權限:[PERMISSIONS]。
+ 物件「[OBJECTNAME]'」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已被撤除下列權限:[PERMISSIONS]。
</string>
<string name="AdditionalPermissionsRequestHeader">
你如果打開帳戶權限,也將一併允許該物件:
@@ -2863,8 +2859,8 @@ http://secondlife.com/support 求助解決問題。
<string name=".">
.
</string>
- <string name="&apos;">
- &apos;
+ <string name="'">
+ '
</string>
<string name="---">
---
@@ -2979,7 +2975,7 @@ http://secondlife.com/support 求助解決問題。
如果你繼續看到此訊息,請聯絡 [SUPPORT_SITE]。
</string>
- <string name="5 O&apos;Clock Shadow">
+ <string name="5 O'Clock Shadow">
下午五點的新鬍渣
</string>
<string name="All White">
@@ -4567,10 +4563,14 @@ http://secondlife.com/support 求助解決問題。
和 [AGENT_NAME] 多方通話
</string>
<string name="inventory_item_offered-im">
- 收納區物品&apos;[ITEM_NAME]&apos;已向人提供
+ 收納區物品'[ITEM_NAME]'已向人提供
</string>
<string name="inventory_folder_offered-im">
- 收納區資料夾&apos;[ITEM_NAME]&apos;已向人提供
+ 收納區資料夾'[ITEM_NAME]'已向人提供
+ </string>
+ <string name="bot_warning">
+ 您正在与人工智能机器人 [NAME] 聊天。请勿分享任何个人信息。
+了解更多:https://second.life/scripted-agents。
</string>
<string name="share_alert">
將收納區物品拖曳到這裡
@@ -5130,7 +5130,7 @@ http://secondlife.com/support 求助解決問題。
<string name="ExternalEditorNotFound">
找不到你指定的外部編輯器。
請嘗試在編輯器路經前後加上英文雙括號。
-(例:&quot;/path to my/editor&quot; &quot;%s&quot;)
+(例:"/path to my/editor" "%s")
</string>
<string name="ExternalEditorCommandParseError">
解析外部編輯器指令時出錯。
diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml
index 61db294272..5523c598b4 100644
--- a/indra/newview/skins/default/xui/zh/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml
@@ -49,7 +49,7 @@
你必須年滿 18 歲才可進入這地區。
</message>
<message name="RegionTPSpecialUsageBlocked">
- 無法進入地區。 &apos;[REGION_NAME]&apos; 是個「技巧性博奕」(Skill Gaming)地區,你必須符合一定條件才可進入。 欲知詳情,請參閱 [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life 技巧性博奕常見問題集]。
+ 無法進入地區。 '[REGION_NAME]' 是個「技巧性博奕」(Skill Gaming)地區,你必須符合一定條件才可進入。 欲知詳情,請參閱 [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life 技巧性博奕常見問題集]。
</message>
</message_set>
<message_set name="progress">
diff --git a/indra/newview/skins/gold/colors.xml b/indra/newview/skins/gold/colors.xml
new file mode 100644
index 0000000000..9755d19e17
--- /dev/null
+++ b/indra/newview/skins/gold/colors.xml
@@ -0,0 +1,1019 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<colors>
+
+ <!-- Named Colors -->
+ <color
+ name="EmphasisColor"
+ value="0.25 0.48 0.70 1" />
+ <color
+ name="EmphasisColor_13"
+ value="0.25 0.48 0.70 0.13" />
+ <color
+ name="EmphasisColor_35"
+ value="0.25 0.48 0.70 0.35" />
+ <color
+ name="BeaconColor"
+ value="0.749 0.298 0 1" />
+ <color
+ name="White"
+ value="1 1 1 1" />
+ <color
+ name="White_05"
+ value="1 1 1 0.05" />
+ <color
+ name="White_10"
+ value="1 1 1 0.1" />
+ <color
+ name="White_25"
+ value="1 1 1 0.25" />
+ <color
+ name="White_50"
+ value="1 1 1 0.5" />
+ <color
+ name="LtGray"
+ value="0.75 0.75 0.75 1" />
+ <color
+ name="LtGray_35"
+ value="0.75 0.75 0.75 0.35" />
+ <color
+ name="LtGray_50"
+ value="0.75 0.75 0.75 0.50" />
+ <color
+ name="Gray"
+ value="0.5 0.5 0.5 1" />
+ <color
+ name="DkGray0"
+ value="0.27 0.27 0.27 1" />
+ <color
+ name="DkGray"
+ value="0.125 0.125 0.125 1" />
+ <color
+ name="DkGray_66"
+ value="0.125 0.125 0.125 .66" />
+ <color
+ name="DkGray2"
+ value="0.169 0.169 0.169 1" />
+ <color
+ name="MouseGray"
+ value="0.191 0.191 0.191 1" />
+ <color
+ name="Black"
+ value="0 0 0 1" />
+ <color
+ name="Black_10"
+ value="0 0 0 0.1" />
+ <color
+ name="Black_25"
+ value="0 0 0 0.25" />
+ <color
+ name="Black_50"
+ value="0 0 0 0.5" />
+ <color
+ name="FrogGreen"
+ value="0.26 0.33 0.42 1" />
+ <!-- ^(Not actually green) -->
+ <color
+ name="Red"
+ value="1 0 0 1" />
+ <color
+ name="Blue"
+ value="0 0 1 1" />
+ <color
+ name="Yellow"
+ value="1 1 0 1" />
+ <color
+ name="Green"
+ value="0 1 0 1" />
+ <color
+ name="Transparent"
+ value="0 0 0 0" />
+ <color
+ name="Purple"
+ value="1 0 1 1" />
+ <color
+ name="Lime"
+ value=".8 1 .73 1" />
+ <color
+ name="LtYellow"
+ value="1 1 .79 1" />
+ <color
+ name="DrYellow"
+ value="1 0.86 0 1" />
+ <color
+ name="LtOrange"
+ value="1 .85 .73 1" />
+ <color
+ name="MdBlue"
+ value=".07 .38 .51 1" />
+ <color
+ name="DkBlue"
+ value=".06 .06 .3 1" />
+ <color
+ name="LtRed"
+ value="1 0.2 0.2 1" />
+ <color
+ name="LtGreen"
+ value="0.2 1 0.2 1" />
+ <color
+ name="Red_80"
+ value="1 0 0 0.8" />
+ <color
+ name="DkRed"
+ value="0.3 0.06 0.06 1" />
+ <color
+ name="Green_80"
+ value="0 1 0 0.8" />
+ <color
+ name="Blue_80"
+ value="0 0 1 0.8" />
+ <color
+ name="Orange"
+ value="1 .82 .46 1" />
+
+ <!-- This color name makes potentially unused colors show up bright purple.
+ Leave this here until all Unused? are removed below, otherwise
+ the viewer generates many warnings on startup. -->
+ <color
+ name="Unused?"
+ value=".831 1 0 1" />
+
+ <!-- UI Definitions -->
+
+ <color
+ name="AccordionHeaderTextColor"
+ reference="LtGray" />
+ <color
+ name="AgentChatColor"
+ reference="White" />
+ <color
+ name="AlertBoxColor"
+ value="0.24 0.24 0.24 1" />
+ <color
+ name="AlertCautionBoxColor"
+ value="1 0.82 0.46 1" />
+ <color
+ name="AlertCautionTextColor"
+ reference="LtYellow" />
+ <color
+ name="AvatarListItemIconDefaultColor"
+ reference="White" />
+ <color
+ name="AvatarListItemIconOnlineColor"
+ reference="White" />
+ <color
+ name="AvatarListItemIconOfflineColor"
+ value="0.5 0.5 0.5 0.5" />
+ <color
+ name="AvatarListItemIconVoiceInvitedColor"
+ reference="AvatarListItemIconOfflineColor" />
+ <color
+ name="AvatarListItemIconVoiceJoinedColor"
+ reference="AvatarListItemIconOnlineColor" />
+ <color
+ name="AvatarListItemIconVoiceLeftColor"
+ reference="AvatarListItemIconOfflineColor" />
+ <color
+ name="BadgeImageColor"
+ value="1.0 0.40 0.0 1.0" />
+ <color
+ name="BadgeBorderColor"
+ value="0.9 0.9 0.9 1.0" />
+ <color
+ name="BadgeLabelColor"
+ reference="White" />
+ <color
+ name="ButtonBorderColor"
+ reference="Unused?" />
+ <color
+ name="ButtonCautionImageColor"
+ reference="Unused?" />
+ <color
+ name="ButtonColor"
+ reference="Unused?" />
+ <color
+ name="ButtonFlashBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonImageColor"
+ reference="White" />
+ <color
+ name="ButtonLabelColor"
+ reference="LtGray" />
+ <color
+ name="ButtonLabelDisabledColor"
+ reference="White_25" />
+ <color
+ name="ButtonLabelSelectedColor"
+ reference="White" />
+ <color
+ name="ButtonLabelSelectedDisabledColor"
+ reference="White_25" />
+ <color
+ name="ButtonSelectedBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonSelectedColor"
+ reference="Unused?" />
+ <color
+ name="ButtonUnselectedBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonUnselectedFgColor"
+ reference="Unused?" />
+ <color
+ name="ChatHistoryBgColor"
+ reference="Transparent" />
+ <color
+ name="ChatHistoryTextColor"
+ reference="LtGray" />
+ <color
+ name="ChicletFlashColor"
+ value="0.114 0.65 0.1" />
+ <color
+ name="ColorDropShadow"
+ reference="Black_50" />
+ <color
+ name="ColorPaletteEntry01"
+ reference="Black" />
+ <color
+ name="ColorPaletteEntry02"
+ reference="Gray" />
+ <color
+ name="ColorPaletteEntry03"
+ value="0.5 0 0 1" />
+ <color
+ name="ColorPaletteEntry04"
+ value="0.5 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry05"
+ value="0 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry06"
+ value="0 0.5 0.5 1" />
+ <color
+ name="ColorPaletteEntry07"
+ value="0 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry08"
+ value="0.5 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry09"
+ value="0.5 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry10"
+ value="0 0.25 0.25 1" />
+ <color
+ name="ColorPaletteEntry11"
+ value="0 0.5 1 1" />
+ <color
+ name="ColorPaletteEntry12"
+ value="0 0.25 0.5 1" />
+ <color
+ name="ColorPaletteEntry13"
+ value="0.5 0 1 1" />
+ <color
+ name="ColorPaletteEntry14"
+ value="0.5 0.25 0 1" />
+ <color
+ name="ColorPaletteEntry15"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry16"
+ reference="LtYellow" />
+ <color
+ name="ColorPaletteEntry17"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry18"
+ reference="LtGray" />
+ <color
+ name="ColorPaletteEntry19"
+ reference="Red" />
+ <color
+ name="ColorPaletteEntry20"
+ reference="Yellow" />
+ <color
+ name="ColorPaletteEntry21"
+ reference="Green" />
+ <color
+ name="ColorPaletteEntry22"
+ value="0 1 1 1" />
+ <color
+ name="ColorPaletteEntry23"
+ reference="Blue" />
+ <color
+ name="ColorPaletteEntry24"
+ reference="Purple" />
+ <color
+ name="ColorPaletteEntry25"
+ value="1 1 0.5 1" />
+ <color
+ name="ColorPaletteEntry26"
+ value="0 1 0.5 1" />
+ <color
+ name="ColorPaletteEntry27"
+ value="0.5 1 1 1" />
+ <color
+ name="ColorPaletteEntry28"
+ value="0.5 0.5 1 1" />
+ <color
+ name="ColorPaletteEntry29"
+ value="1 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry30"
+ value="1 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry31"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry32"
+ reference="White" />
+ <color
+ name="ComboListBgColor"
+ reference="DkGray" />
+ <color
+ name="ConsoleBackground"
+ reference="Black" />
+ <color
+ name="ContextSilhouetteColor"
+ reference="EmphasisColor" />
+ <color
+ name="ConversationFriendColor"
+ value="0.5 0.7 0.85 1" />
+ <color
+ name="DefaultHighlightDark"
+ reference="White_10" />
+ <color
+ name="DefaultHighlightLight"
+ reference="White_25" />
+ <color
+ name="DefaultShadowDark"
+ reference="Black_50" />
+ <color
+ name="DefaultShadowLight"
+ reference="Black_50" />
+ <color
+ name="EffectColor"
+ reference="White" />
+ <color
+ name="FilterBackgroundColor"
+ reference="Black" />
+ <color
+ name="FilterTextColor"
+ reference="EmphasisColor" />
+ <color
+ name="FloaterButtonImageColor"
+ reference="LtGray" />
+ <color
+ name="FloaterDefaultBackgroundColor"
+ reference="DkGray_66" />
+ <color
+ name="FloaterFocusBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="FloaterFocusBorderColor"
+ reference="Black_50" />
+ <color
+ name="FloaterUnfocusBorderColor"
+ reference="Black_50" />
+ <color
+ name="FocusColor"
+ reference="EmphasisColor" />
+ <color
+ name="FolderViewLoadingMessageTextColor"
+ value="0.3344 0.545 0.645 1" />
+ <color
+ name="FpsTextColor"
+ value="0.34 0.51 0.64 0.8" />
+ <color
+ name="GridFocusPointColor"
+ reference="White_50" />
+ <color
+ name="GridlineBGColor"
+ value="0.92 0.92 1 0.78" />
+ <color
+ name="GridlineColor"
+ reference="White" />
+ <color
+ name="GridlineShadowColor"
+ value="0 0 0 0.31" />
+ <color
+ name="GroupNotifyBoxColor"
+ value="0.3344 0.5456 0.5159 1" />
+ <color
+ name="GroupNotifyTextColor"
+ reference="White"/>
+ <color
+ name="GroupNotifyDimmedTextColor"
+ reference="LtGray" />
+ <color
+ name="GroupOverTierColor"
+ value="0.43 0.06 0.06 1" />
+ <color
+ name="HTMLLinkColor"
+ reference="EmphasisColor" />
+ <color
+ name="HealthTextColor"
+ reference="White" />
+ <color
+ name="HelpBgColor"
+ reference="Unused?" />
+ <color
+ name="HelpFgColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollHighlightColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollShadowColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollThumbColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollTrackColor"
+ reference="Unused?" />
+ <color
+ name="HighlightChildColor"
+ reference="Yellow" />
+ <color
+ name="HighlightInspectColor"
+ value="1 0 1 1" />
+ <color
+ name="HighlightParentColor"
+ value="0.5 0.65 0.8 1" />
+ <color
+ name="IMHistoryBgColor"
+ reference="Unused?" />
+ <color
+ name="IMHistoryTextColor"
+ reference="Unused?" />
+ <color
+ name="IconDisabledColor"
+ reference="White_25" />
+ <color
+ name="IconEnabledColor"
+ reference="White" />
+ <color
+ name="InventoryBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="InventoryFocusOutlineColor"
+ reference="White_25" />
+ <color
+ name="InventoryItemSuffixColor"
+ reference="White_25" />
+ <color
+ name="InventoryItemLibraryColor"
+ reference="EmphasisColor" />
+ <color
+ name="InventoryItemLinkColor"
+ reference="LtGray_50" />
+ <color
+ name="InventoryMouseOverColor"
+ reference="LtGray_35" />
+ <color
+ name="InventorySearchStatusColor"
+ reference="EmphasisColor" />
+ <color
+ name="LabelDisabledColor"
+ reference="White_25" />
+ <color
+ name="LabelSelectedColor"
+ reference="White" />
+ <color
+ name="LabelSelectedDisabledColor"
+ reference="White_25" />
+ <color
+ name="LabelTextColor"
+ reference="LtGray" />
+ <color
+ name="LoginProgressBarBgColor"
+ reference="Unused?" />
+ <color
+ name="LoginProgressBarFgColor"
+ reference="Unused?" />
+ <color
+ name="LoginProgressBoxBorderColor"
+ value="0 0.12 0.24 0" />
+ <color
+ name="LoginProgressBoxCenterColor"
+ value="0 0 0 0.78" />
+ <color
+ name="LoginProgressBoxShadowColor"
+ value="0 0 0 0.78" />
+ <color
+ name="LoginProgressBoxTextColor"
+ reference="White" />
+ <color
+ name="MapAvatarColor"
+ reference="White" />
+ <color
+ name="MapAvatarFriendColor"
+ value="0.5 0.7 0.85 1" />
+ <color
+ name="MapAvatarSelfColor"
+ value="0.53125 0 0.498047 1" />
+ <color
+ name="MapFrustumColor"
+ reference="White_10" />
+ <color
+ name="MapParcelOutlineColor"
+ value="1 1 1 0.5" />
+ <color
+ name="MapTrackColor"
+ reference="Red" />
+ <color
+ name="MapTrackColorUnder"
+ reference="Blue" />
+ <color
+ name="MapTrackDisabledColor"
+ value="0.5 0 0 1" />
+ <color
+ name="MenuBarBgColor"
+ reference="MouseGray" />
+ <color
+ name="MenuBarGodBgColor"
+ reference="FrogGreen" />
+ <color
+ name="MenuDefaultBgColor"
+ reference="DkGray2" />
+ <color
+ name="MenuItemDisabledColor"
+ reference="LtGray_50" />
+ <color
+ name="MenuItemEnabledColor"
+ reference="LtGray" />
+ <color
+ name="MenuItemHighlightBgColor"
+ reference="EmphasisColor_35" />
+ <color
+ name="MenuItemFlashBgColor"
+ reference="BeaconColor" />
+ <color
+ name="MenuItemHighlightFgColor"
+ reference="White" />
+ <color
+ name="MenuNonProductionBgColor"
+ reference="Black" />
+ <color
+ name="MenuNonProductionGodBgColor"
+ value="0.263 0.325 0.345 1" />
+ <color
+ name="MenuPopupBgColor"
+ reference="DkGray2" />
+ <color
+ name="ModelUploaderLabels"
+ value="1 0.6 0 1" />
+ <color
+ name="MultiSliderDisabledThumbColor"
+ reference="Black" />
+ <color
+ name="MultiSliderThumbCenterColor"
+ reference="White" />
+ <color
+ name="MultiSliderThumbCenterSelectedColor"
+ reference="Green" />
+ <color
+ name="MultiSliderThumbOutlineColor"
+ reference="Unused?" />
+ <color
+ name="MultiSliderTrackColor"
+ reference="LtGray" />
+ <color
+ name="MultiSliderTriangleColor"
+ reference="Yellow" />
+ <!--
+ <color
+ name="NameTagBackground"
+ value="0.85 0.85 0.85 0.80" />
+ -->
+ <color
+ name="NameTagBackground"
+ value="0.101 0.101 0.101 0.6" />
+ <color
+ name="NameTagChat"
+ reference="White" />
+ <color
+ name="NameTagFriend"
+ value="0.85 0.75 0.5 1" />
+ <color
+ name="NameTagLegacy"
+ reference="White" />
+ <color
+ name="NameTagMatch"
+ reference="White" />
+ <color
+ name="NameTagMismatch"
+ reference="White" />
+ <color
+ name="NetMapBackgroundColor"
+ value="0 0 0 1" />
+ <color
+ name="NetMapGroupOwnAboveWater"
+ value="0.85 0 0.85 1" />
+ <color
+ name="NetMapGroupOwnBelowWater"
+ value="0.63 0 0.63 1" />
+ <color
+ name="NetMapOtherOwnAboveWater"
+ value="0.24 0.24 0.24 1" />
+ <color
+ name="NetMapOtherOwnBelowWater"
+ value="0.12 0.12 0.12 1" />
+ <color
+ name="NetMapYouOwnAboveWater"
+ value="0 0.85 0.85 1" />
+ <color
+ name="NetMapYouOwnBelowWater"
+ value="0 0.63 0.63 1" />
+ <color
+ name="NotifyBoxColor"
+ value="LtGray" />
+ <color
+ name="NotifyCautionBoxColor"
+ value="1 0.82 0.46 1" />
+ <color
+ name="NotifyCautionWarnColor"
+ reference="White" />
+ <color
+ name="NotifyTextColor"
+ reference="White" />
+ <color
+ name="ObjectBubbleColor"
+ reference="DkGray_66" />
+ <color
+ name="ObjectChatColor"
+ reference="LtYellow" />
+ <color
+ name="OverdrivenColor"
+ reference="Red" />
+ <color
+ name="PanelDefaultBackgroundColor"
+ reference="DkGray" />
+ <color
+ name="PanelDefaultHighlightLight"
+ reference="White_50" />
+ <color
+ name="PanelFocusBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="PanelNotificationBackground"
+ value="1 0.3 0.3 0" />
+ <color
+ name="ParcelHoverColor"
+ reference="White" />
+ <color
+ name="PathfindingErrorColor"
+ reference="LtRed" />
+ <color
+ name="PathfindingWarningColor"
+ reference="DrYellow" />
+ <color
+ name="PathfindingGoodColor"
+ reference="LtGreen" />
+ <color
+ name="MaterialErrorColor"
+ reference="LtRed" />
+ <color
+ name="MaterialWarningColor"
+ reference="DrYellow" />
+ <color
+ name="MaterialGoodColor"
+ reference="LtGreen" />
+ <color
+ name="PathfindingDefaultBeaconColor"
+ reference="Red_80" />
+ <color
+ name="PathfindingDefaultBeaconTextColor"
+ reference="White" />
+ <color
+ name="PathfindingLinksetBeaconColor"
+ reference="Blue_80" />
+ <color
+ name="PathfindingCharacterBeaconColor"
+ reference="Red_80" />
+ <color
+ name="PieMenuBgColor"
+ value="0.24 0.24 0.24 0.59" />
+ <color
+ name="PieMenuLineColor"
+ value="0 0 0 0.5" />
+ <color
+ name="PieMenuSelectedColor"
+ value="0.72 0.72 0.74 0.3" />
+ <color
+ name="PropertyColorAuction"
+ value="0.5 0 1 0.4" />
+ <color
+ name="PropertyColorAvail"
+ reference="Transparent" />
+ <color
+ name="PropertyColorForSale"
+ value="1 0.5 0 0.4" />
+ <color
+ name="PropertyColorGroup"
+ value="0 0.72 0.72 0.4" />
+ <color
+ name="PropertyColorOther"
+ value="1 0 0 0.4" />
+ <color
+ name="PropertyColorSelf"
+ value="0 1 0 0.4" />
+ <color
+ name="ScriptBgReadOnlyColor"
+ value="0.39 0.39 0.39 1" />
+ <color
+ name="ScriptErrorColor"
+ reference="Red" />
+ <color
+ name="ScrollBGStripeColor"
+ reference="Transparent" />
+ <color
+ name="ScrollBgReadOnlyColor"
+ reference="Transparent" />
+ <color
+ name="ScrollBgWriteableColor"
+ reference="White_05" />
+ <color
+ name="ScrollDisabledColor"
+ reference="White_25" />
+ <color
+ name="ScrollHighlightedColor"
+ reference="Unused?" />
+ <color
+ name="ScrollHoveredColor"
+ reference="EmphasisColor_13" />
+ <color
+ name="ScrollSelectedBGColor"
+ reference="EmphasisColor_35" />
+ <color
+ name="ScrollSelectedFGColor"
+ reference="White" />
+ <color
+ name="ScrollUnselectedColor"
+ reference="LtGray" />
+ <color
+ name="ScrollbarThumbColor"
+ reference="White" />
+ <color
+ name="ScrollbarTrackColor"
+ reference="Black" />
+ <color
+ name="SelectedOutfitTextColor"
+ reference="EmphasisColor" />
+ <color
+ name="SearchableControlHighlightFontColor"
+ value="1 0 0 1" />
+ <color
+ name="SearchableControlHighlightBgColor"
+ value="0.5 0.1 0.1 1" />
+ <color
+ name="SilhouetteChildColor"
+ value="0.13 0.42 0.77 1" />
+ <color
+ name="SilhouetteParentColor"
+ reference="Yellow" />
+ <color
+ name="SliderDisabledThumbColor"
+ reference="White_25" />
+ <color
+ name="SliderThumbCenterColor"
+ reference="White" />
+ <color
+ name="SliderThumbOutlineColor"
+ reference="White" />
+ <color
+ name="SliderTrackColor"
+ reference="Unused?" />
+ <color
+ name="SpeakingColor"
+ reference="FrogGreen" />
+ <color
+ name="SystemChatColor"
+ reference="LtGray" />
+ <color
+ name="TextBgFocusColor"
+ reference="White" />
+ <color
+ name="TextBgReadOnlyColor"
+ reference="White_05" />
+ <color
+ name="TextBgWriteableColor"
+ reference="LtGray" />
+ <color
+ name="TextCursorColor"
+ reference="Black" />
+ <color
+ name="TextDefaultColor"
+ reference="Black" />
+ <color
+ name="TextEmbeddedItemColor"
+ value="0 0 0.5 1" />
+ <color
+ name="TextEmbeddedItemReadOnlyColor"
+ reference="Unused?" />
+ <color
+ name="TextFgColor"
+ value="0.102 0.102 0.102 1" />
+ <color
+ name="TextFgReadOnlyColor"
+ reference="LtGray" />
+ <color
+ name="TextFgTentativeColor"
+ value="0.4 0.4 0.4 1" />
+ <color
+ name="TimeTextColor"
+ reference="LtGray" />
+ <color
+ name="TitleBarFocusColor"
+ reference="White_10" />
+ <color
+ name="ToastBackground"
+ value="0.3 0.3 0.3 0" />
+ <color
+ name="ToolTipBgColor"
+ value="0.937 0.89 0.655 1" />
+ <color
+ name="ToolTipBorderColor"
+ value="0.812 0.753 0.451 1" />
+ <color
+ name="ToolTipTextColor"
+ reference="DkGray2" />
+ <color
+ name="InspectorTipTextColor"
+ reference="LtGray" />
+ <color
+ name="UserChatColor"
+ reference="White" />
+ <color
+ name="llOwnerSayChatColor"
+ reference="LtOrange" />
+
+ <!-- New Colors -->
+ <color
+ name="OutputMonitorMutedColor"
+ reference="DkGray2" />
+ <color
+ name="SysWellItemUnselected"
+ value="0 0 0 0" />
+ <color
+ name="SysWellItemSelected"
+ value="0.3 0.3 0.3 1.0" />
+ <color
+ name="ColorSwatchBorderColor"
+ value="0.45098 0.517647 0.607843 1"/>
+ <color
+ name="ChatTeleportSeparatorColor"
+ reference="Black" />
+ <color
+ name="ChatTimestampColor"
+ reference="White" />
+ <color
+ name="MenuBarBetaBgColor"
+ reference="DkBlue" />
+ <color
+ name="MenuBarProjectBgColor"
+ reference="MdBlue" />
+ <color
+ name="MenuBarTestBgColor"
+ reference="DkRed" />
+ <color
+ name="MeshImportTableNormalColor"
+ value="1 1 1 1"/>
+ <color
+ name="MeshImportTableHighlightColor"
+ value="0.2 0.8 1 1"/>
+
+ <color
+ name="DirectChatColor"
+ reference="LtOrange" />
+
+ <color
+ name="ToolbarDropZoneColor"
+ value=".48 .69 1 .5" />
+ <color
+ name="PanelNotificationListItem"
+ value="0.3 0.3 0.3 .3" />
+
+ <!-- profiles -->
+ <color
+ name="StatusUserOnline"
+ reference="White" />
+ <color
+ name="StatusUserOffline"
+ reference="LtGray_35" />
+ <!-- Groups visible in own profiles -->
+ <color
+ name="GroupVisibleInProfile"
+ reference="TextBgFocusColor" />
+ <color
+ name="GroupHiddenInProfile"
+ reference="Gray" />
+
+
+ <!-- Generic color names (legacy) -->
+ <color
+ name="white"
+ value="1 1 1 1"/>
+ <color
+ name="black"
+ value="0 0 0 1"/>
+ <color
+ name="red"
+ value="1 0 0 1"/>
+ <color
+ name="green"
+ value="0 1 0 1"/>
+ <color
+ name="blue"
+ value="0 0 1 1"/>
+
+ <!--Resize bar colors -->
+
+ <color
+ name="ResizebarBorderLight"
+ value="0.231 0.231 0.231 1"/>
+
+ <color
+ name="ResizebarBorderDark"
+ value="0.133 0.133 0.133 1"/>
+
+ <color
+ name="ResizebarBody"
+ value="0.208 0.208 0.208 1"/>
+
+ <!-- syntax highlighting (LSL Scripts) -->
+ <color
+ name="ScriptText"
+ reference="Black" />
+ <color
+ name="ScriptBackground"
+ reference="White" />
+ <color
+ name="ScriptCursorColor"
+ reference="Black" />
+ <color
+ name="SyntaxLslComment"
+ value="0 0.5 0 1" />
+ <color
+ name="SyntaxLslConstant"
+ value="0 0.6 0.6 1" />
+ <color
+ name="SyntaxLslControlFlow"
+ value="0.4 0 0.8 1" />
+ <color
+ name="SyntaxLslControlLabel"
+ value="0 0 0.8 1" />
+ <color
+ name="SyntaxLslDataType"
+ value="0.8 0.4 0 1" />
+ <color
+ name="SyntaxLslDeprecated"
+ value="0.9 0.0 0.66, 1" />
+ <color
+ name="SyntaxLslEvent"
+ value="0 0.3 0.5 1" />
+ <color
+ name="SyntaxLslFunction"
+ value="0.3 0 0.5 1" />
+ <color
+ name="SyntaxLslGodMode"
+ value="0.7 .2 .35 1" />
+ <color
+ name="SyntaxLslStringLiteral"
+ value="1 0.14 0 1" />
+ <color
+ name="OutfitGalleryItemSelected"
+ reference="EmphasisColor_35" />
+ <color
+ name="OutfitGalleryItemWorn"
+ reference="EmphasisColor_13" />
+ <color
+ name="OutfitGalleryItemUnselected"
+ value="0.4 0.4 0.4 1" />
+ <color
+ name="PanelGray"
+ value="0.27 0.27 0.27 1" />
+ <color
+ name="PerformanceMid"
+ value="1 0.8 0 1" />
+ <color
+ name="OutfitSnapshotMacMask"
+ value="0.115 0.115 0.115 1"/>
+ <color
+ name="OutfitSnapshotMacMask2"
+ value="0.1 0.1 0.1 1"/>
+ <color
+ name="ChatMentionFont"
+ value="0.3 0.82 1 1" />
+ <color
+ name="ChatMentionHighlight"
+ value="0.82 0.91 0.98 0.15" />
+ <color
+ name="ChatSelfMentionHighlight"
+ value="1 1 0 0.35" />
+ <color
+ name="MentionFlashBgColor"
+ value="1 1 0 0.5" />
+</colors>
diff --git a/indra/newview/skins/gold/textures/3p_icons/fmod_logo.png b/indra/newview/skins/gold/textures/3p_icons/fmod_logo.png
new file mode 100644
index 0000000000..5a50e0ad34
--- /dev/null
+++ b/indra/newview/skins/gold/textures/3p_icons/fmod_logo.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/3p_icons/havok_logo.png b/indra/newview/skins/gold/textures/3p_icons/havok_logo.png
new file mode 100644
index 0000000000..ff1ea3a72e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/3p_icons/havok_logo.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/Blank.png b/indra/newview/skins/gold/textures/Blank.png
index f38e9f9100..f38e9f9100 100644
--- a/indra/newview/skins/contrast/textures/Blank.png
+++ b/indra/newview/skins/gold/textures/Blank.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/Rounded_Rect.png b/indra/newview/skins/gold/textures/Rounded_Rect.png
index c270c28039..c270c28039 100644
--- a/indra/newview/skins/contrast/textures/Rounded_Rect.png
+++ b/indra/newview/skins/gold/textures/Rounded_Rect.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/alpha_gradient.tga b/indra/newview/skins/gold/textures/alpha_gradient.tga
index 6fdba25d4e..6fdba25d4e 100644
--- a/indra/newview/skins/contrast/textures/alpha_gradient.tga
+++ b/indra/newview/skins/gold/textures/alpha_gradient.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/alpha_gradient_2d.j2c b/indra/newview/skins/gold/textures/alpha_gradient_2d.j2c
index 5de5a80a65..5de5a80a65 100644
--- a/indra/newview/skins/contrast/textures/alpha_gradient_2d.j2c
+++ b/indra/newview/skins/gold/textures/alpha_gradient_2d.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/arrow_down.tga b/indra/newview/skins/gold/textures/arrow_down.tga
index 81dc9d3b6c..81dc9d3b6c 100644
--- a/indra/newview/skins/contrast/textures/arrow_down.tga
+++ b/indra/newview/skins/gold/textures/arrow_down.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/arrow_up.tga b/indra/newview/skins/gold/textures/arrow_up.tga
index 22195cf7fb..22195cf7fb 100644
--- a/indra/newview/skins/contrast/textures/arrow_up.tga
+++ b/indra/newview/skins/gold/textures/arrow_up.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/avatar_thumb_bkgrnd.png b/indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.png
index 84cc2159c1..84cc2159c1 100644
--- a/indra/newview/skins/contrast/textures/avatar_thumb_bkgrnd.png
+++ b/indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/badge_note.j2c b/indra/newview/skins/gold/textures/badge_note.j2c
index 1ab5233faf..1ab5233faf 100644
--- a/indra/newview/skins/contrast/textures/badge_note.j2c
+++ b/indra/newview/skins/gold/textures/badge_note.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/badge_ok.j2c b/indra/newview/skins/gold/textures/badge_ok.j2c
index f85b880f1d..f85b880f1d 100644
--- a/indra/newview/skins/contrast/textures/badge_ok.j2c
+++ b/indra/newview/skins/gold/textures/badge_ok.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/badge_warn.j2c b/indra/newview/skins/gold/textures/badge_warn.j2c
index 26437ca426..26437ca426 100644
--- a/indra/newview/skins/contrast/textures/badge_warn.j2c
+++ b/indra/newview/skins/gold/textures/badge_warn.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Avatar_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.png
index 6b725e153a..6b725e153a 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Avatar_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_FreeCam_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.png
index 9f22080d13..9f22080d13 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_FreeCam_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Orbit_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.png
index 5b2a8eb339..5b2a8eb339 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Orbit_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Pan_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.png
index 9acf7053d5..9acf7053d5 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Pan_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.png
index 00158a7bc2..00158a7bc2 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.png
index 3748f5e190..3748f5e190 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_On.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Eye_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.png
index 2b50986780..2b50986780 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Eye_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.png
index c49b8f9a27..c49b8f9a27 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.png
index bc8c4db04d..bc8c4db04d 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_On.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.png
index b919a0a152..b919a0a152 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_On.png
index de9da359a0..de9da359a0 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_On.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Center.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Center.png
new file mode 100644
index 0000000000..0f1d1936f0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Center.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_In.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_In.png
new file mode 100644
index 0000000000..60d88e9316
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_In.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Out.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Out.png
new file mode 100644
index 0000000000..cc4e6f99ff
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Out.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Center.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Center.png
new file mode 100644
index 0000000000..fca4041b56
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Center.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_In.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_In.png
new file mode 100644
index 0000000000..d2ede098e4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_In.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Out.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Out.png
new file mode 100644
index 0000000000..cffead1703
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Out.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/ChatBarHandle.png b/indra/newview/skins/gold/textures/bottomtray/ChatBarHandle.png
new file mode 100644
index 0000000000..50239c8af8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/ChatBarHandle.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/DownArrow.png b/indra/newview/skins/gold/textures/bottomtray/DownArrow.png
new file mode 100644
index 0000000000..82f58b22b9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/DownArrow.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_Off.png b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_Off.png
index 8d32cad95f..8d32cad95f 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_On.png b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.png
index 4c98e35868..4c98e35868 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_On.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Move_Fly_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.png
index fade065ce7..fade065ce7 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Move_Fly_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Move_Run_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.png
index e2eb38e12d..e2eb38e12d 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Move_Run_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Move_Walk_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Walk_Off.png
index f314d4e001..f314d4e001 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Move_Walk_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Move_Walk_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_Off.png
new file mode 100644
index 0000000000..4dddc2b391
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_On.png
new file mode 100644
index 0000000000..a2ac8bd8c6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Down_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Down_Off.png
new file mode 100644
index 0000000000..2893c9a9f1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Down_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Down_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Down_On.png
new file mode 100644
index 0000000000..0cb73798b3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Down_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_Off.png
new file mode 100644
index 0000000000..80d227b6a7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_On.png
new file mode 100644
index 0000000000..2ee906cd6a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Left_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Left_Off.png
new file mode 100644
index 0000000000..3602efa9d9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Left_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Left_On.png
new file mode 100644
index 0000000000..6e7975818e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Left_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Right_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Right_Off.png
new file mode 100644
index 0000000000..9c3fc37dfe
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Right_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Right_On.png
new file mode 100644
index 0000000000..fe9bab6c17
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Right_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_Off.png
new file mode 100644
index 0000000000..282e8d62de
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_On.png
new file mode 100644
index 0000000000..329bd5b042
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_Off.png
new file mode 100644
index 0000000000..5039e57c32
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_On.png
new file mode 100644
index 0000000000..5654d44bfa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Up_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Up_Off.png
new file mode 100644
index 0000000000..a49c43c2cf
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Up_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Up_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Up_On.png
new file mode 100644
index 0000000000..bc205d592c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Up_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Notices_Unread.png b/indra/newview/skins/gold/textures/bottomtray/Notices_Unread.png
index eb2f3dbaa4..eb2f3dbaa4 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Notices_Unread.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Notices_Unread.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Object_View_Off.png b/indra/newview/skins/gold/textures/bottomtray/Object_View_Off.png
new file mode 100644
index 0000000000..e9dea7e17e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Object_View_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Object_View_On.png b/indra/newview/skins/gold/textures/bottomtray/Object_View_On.png
new file mode 100644
index 0000000000..7a348ba22e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Object_View_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/PanOrbit_Off.png b/indra/newview/skins/gold/textures/bottomtray/PanOrbit_Off.png
index 53efa3a9a9..53efa3a9a9 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/PanOrbit_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/PanOrbit_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/bottomtray/Snapshot_Off.png b/indra/newview/skins/gold/textures/bottomtray/Snapshot_Off.png
index 4ab4bbe4af..4ab4bbe4af 100644
--- a/indra/newview/skins/contrast/textures/bottomtray/Snapshot_Off.png
+++ b/indra/newview/skins/gold/textures/bottomtray/Snapshot_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Unread_Chiclet.png b/indra/newview/skins/gold/textures/bottomtray/Unread_Chiclet.png
new file mode 100644
index 0000000000..e8fe243dc7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Unread_Chiclet.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl1.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl1.png
new file mode 100644
index 0000000000..438b4912f8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl1.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl2.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl2.png
new file mode 100644
index 0000000000..693adc4781
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl2.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl3.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl3.png
new file mode 100644
index 0000000000..14ec77b99a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl3.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Off.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Off.png
new file mode 100644
index 0000000000..48be51e9af
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_On.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_On.png
new file mode 100644
index 0000000000..818b34d40f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit.png
new file mode 100644
index 0000000000..84711ddc29
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit_Selected.png
new file mode 100644
index 0000000000..9b9468c574
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Cone.png b/indra/newview/skins/gold/textures/build/Object_Cone.png
index 5167f1a820..5167f1a820 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Cone.png
+++ b/indra/newview/skins/gold/textures/build/Object_Cone.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Cone_Selected.png b/indra/newview/skins/gold/textures/build/Object_Cone_Selected.png
new file mode 100644
index 0000000000..0f04cb2f28
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Cone_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Cube.png b/indra/newview/skins/gold/textures/build/Object_Cube.png
index e82af1ca82..e82af1ca82 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Cube.png
+++ b/indra/newview/skins/gold/textures/build/Object_Cube.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Cube_Selected.png b/indra/newview/skins/gold/textures/build/Object_Cube_Selected.png
new file mode 100644
index 0000000000..2a10237771
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Cube_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Cylinder.png b/indra/newview/skins/gold/textures/build/Object_Cylinder.png
index fe1041d4c7..fe1041d4c7 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Cylinder.png
+++ b/indra/newview/skins/gold/textures/build/Object_Cylinder.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/gold/textures/build/Object_Cylinder_Selected.png
new file mode 100644
index 0000000000..ee6db5d64e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Cylinder_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Grass.png b/indra/newview/skins/gold/textures/build/Object_Grass.png
index a88efd5f3e..a88efd5f3e 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Grass.png
+++ b/indra/newview/skins/gold/textures/build/Object_Grass.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Grass_Selected.png b/indra/newview/skins/gold/textures/build/Object_Grass_Selected.png
new file mode 100644
index 0000000000..37f35f9339
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Grass_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone.png
index 595f64d480..595f64d480 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone.png
+++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Hemi_Cone_Selected.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone_Selected.png
new file mode 100644
index 0000000000..ad6ba66bed
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder.png
index dd41d56fb3..dd41d56fb3 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder.png
+++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder_Selected.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder_Selected.png
new file mode 100644
index 0000000000..03a47494f5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere.png
index 1489630624..1489630624 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere.png
+++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere_Selected.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere_Selected.png
new file mode 100644
index 0000000000..daefae7389
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Prism.png b/indra/newview/skins/gold/textures/build/Object_Prism.png
index 51c6c161a0..51c6c161a0 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Prism.png
+++ b/indra/newview/skins/gold/textures/build/Object_Prism.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Prism_Selected.png b/indra/newview/skins/gold/textures/build/Object_Prism_Selected.png
new file mode 100644
index 0000000000..73470c7af9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Prism_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Pyramid.png b/indra/newview/skins/gold/textures/build/Object_Pyramid.png
index a147b59553..a147b59553 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Pyramid.png
+++ b/indra/newview/skins/gold/textures/build/Object_Pyramid.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/gold/textures/build/Object_Pyramid_Selected.png
new file mode 100644
index 0000000000..361c915231
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Pyramid_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Ring.png b/indra/newview/skins/gold/textures/build/Object_Ring.png
index a9790fd60c..a9790fd60c 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Ring.png
+++ b/indra/newview/skins/gold/textures/build/Object_Ring.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Ring_Selected.png b/indra/newview/skins/gold/textures/build/Object_Ring_Selected.png
new file mode 100644
index 0000000000..49b76d137e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Ring_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Sphere.png b/indra/newview/skins/gold/textures/build/Object_Sphere.png
index 8e2dd92a82..8e2dd92a82 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Sphere.png
+++ b/indra/newview/skins/gold/textures/build/Object_Sphere.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/gold/textures/build/Object_Sphere_Selected.png
new file mode 100644
index 0000000000..473b90e867
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Sphere_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Tetrahedron.png b/indra/newview/skins/gold/textures/build/Object_Tetrahedron.png
index 23e22b1796..23e22b1796 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Tetrahedron.png
+++ b/indra/newview/skins/gold/textures/build/Object_Tetrahedron.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/gold/textures/build/Object_Tetrahedron_Selected.png
new file mode 100644
index 0000000000..20278c8f6d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Tetrahedron_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Torus.png b/indra/newview/skins/gold/textures/build/Object_Torus.png
index 15c62423a9..15c62423a9 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Torus.png
+++ b/indra/newview/skins/gold/textures/build/Object_Torus.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Torus_Selected.png b/indra/newview/skins/gold/textures/build/Object_Torus_Selected.png
new file mode 100644
index 0000000000..e6cad859fd
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Torus_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Tree.png b/indra/newview/skins/gold/textures/build/Object_Tree.png
index 82c422419b..82c422419b 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Tree.png
+++ b/indra/newview/skins/gold/textures/build/Object_Tree.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Tree_Selected.png b/indra/newview/skins/gold/textures/build/Object_Tree_Selected.png
new file mode 100644
index 0000000000..52b4f535f8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Tree_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Object_Tube.png b/indra/newview/skins/gold/textures/build/Object_Tube.png
index e47fce7511..e47fce7511 100644
--- a/indra/newview/skins/contrast/textures/build/Object_Tube.png
+++ b/indra/newview/skins/gold/textures/build/Object_Tube.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Object_Tube_Selected.png b/indra/newview/skins/gold/textures/build/Object_Tube_Selected.png
new file mode 100644
index 0000000000..4469814e1a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Object_Tube_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Tool_Create.png b/indra/newview/skins/gold/textures/build/Tool_Create.png
index 1f1097def5..1f1097def5 100644..100755
--- a/indra/newview/skins/contrast/textures/build/Tool_Create.png
+++ b/indra/newview/skins/gold/textures/build/Tool_Create.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Tool_Create_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Create_Selected.png
new file mode 100755
index 0000000000..48db281d27
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Tool_Create_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Tool_Dozer.png b/indra/newview/skins/gold/textures/build/Tool_Dozer.png
index 61744666f4..61744666f4 100644..100755
--- a/indra/newview/skins/contrast/textures/build/Tool_Dozer.png
+++ b/indra/newview/skins/gold/textures/build/Tool_Dozer.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Tool_Dozer_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Dozer_Selected.png
new file mode 100755
index 0000000000..0b44fca939
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Tool_Dozer_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Tool_Face.png b/indra/newview/skins/gold/textures/build/Tool_Face.png
index 5ab42a4ad6..5ab42a4ad6 100644..100755
--- a/indra/newview/skins/contrast/textures/build/Tool_Face.png
+++ b/indra/newview/skins/gold/textures/build/Tool_Face.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Tool_Face_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Face_Selected.png
new file mode 100755
index 0000000000..5fd649a577
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Tool_Face_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Tool_Grab.png b/indra/newview/skins/gold/textures/build/Tool_Grab.png
index 5c58288d5e..5c58288d5e 100644..100755
--- a/indra/newview/skins/contrast/textures/build/Tool_Grab.png
+++ b/indra/newview/skins/gold/textures/build/Tool_Grab.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Tool_Grab_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Grab_Selected.png
new file mode 100755
index 0000000000..664f6914a6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Tool_Grab_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/build/Tool_Zoom.png b/indra/newview/skins/gold/textures/build/Tool_Zoom.png
index ad493b0d66..ad493b0d66 100644..100755
--- a/indra/newview/skins/contrast/textures/build/Tool_Zoom.png
+++ b/indra/newview/skins/gold/textures/build/Tool_Zoom.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/build/Tool_Zoom_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Zoom_Selected.png
new file mode 100755
index 0000000000..e503c09d74
--- /dev/null
+++ b/indra/newview/skins/gold/textures/build/Tool_Zoom_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/button_anim_pause.tga b/indra/newview/skins/gold/textures/button_anim_pause.tga
index 577f9195d0..577f9195d0 100644
--- a/indra/newview/skins/contrast/textures/button_anim_pause.tga
+++ b/indra/newview/skins/gold/textures/button_anim_pause.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/button_anim_pause_selected.tga b/indra/newview/skins/gold/textures/button_anim_pause_selected.tga
index 21384316a8..21384316a8 100644
--- a/indra/newview/skins/contrast/textures/button_anim_pause_selected.tga
+++ b/indra/newview/skins/gold/textures/button_anim_pause_selected.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/button_anim_play.tga b/indra/newview/skins/gold/textures/button_anim_play.tga
index 9ed55f829d..9ed55f829d 100644
--- a/indra/newview/skins/contrast/textures/button_anim_play.tga
+++ b/indra/newview/skins/gold/textures/button_anim_play.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/button_anim_play_selected.tga b/indra/newview/skins/gold/textures/button_anim_play_selected.tga
index b166a4178d..b166a4178d 100644
--- a/indra/newview/skins/contrast/textures/button_anim_play_selected.tga
+++ b/indra/newview/skins/gold/textures/button_anim_play_selected.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/checker.png b/indra/newview/skins/gold/textures/checker.png
index 1ab87e3f02..1ab87e3f02 100644
--- a/indra/newview/skins/contrast/textures/checker.png
+++ b/indra/newview/skins/gold/textures/checker.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/cloud-particle.png b/indra/newview/skins/gold/textures/cloud-particle.png
new file mode 100644
index 0000000000..f2080ddb9f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/cloud-particle.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/color_swatch_alpha.tga b/indra/newview/skins/gold/textures/color_swatch_alpha.tga
index 814a004e62..814a004e62 100644
--- a/indra/newview/skins/contrast/textures/color_swatch_alpha.tga
+++ b/indra/newview/skins/gold/textures/color_swatch_alpha.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Off.png b/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Off.png
new file mode 100644
index 0000000000..19c842b816
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Press.png b/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Press.png
new file mode 100644
index 0000000000..b9879dcc8a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Off.png b/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Off.png
new file mode 100644
index 0000000000..d506cda5c9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Press.png b/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Press.png
new file mode 100644
index 0000000000..08f7493a02
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Accordion_Off.png b/indra/newview/skins/gold/textures/containers/Accordion_Off.png
new file mode 100644
index 0000000000..414f4509c6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Accordion_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Accordion_Over.png b/indra/newview/skins/gold/textures/containers/Accordion_Over.png
new file mode 100644
index 0000000000..5416d73310
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Accordion_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Accordion_Press.png b/indra/newview/skins/gold/textures/containers/Accordion_Press.png
new file mode 100644
index 0000000000..1578e0dfc5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Accordion_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Accordion_Selected.png b/indra/newview/skins/gold/textures/containers/Accordion_Selected.png
new file mode 100644
index 0000000000..2222954332
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Accordion_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Container.png b/indra/newview/skins/gold/textures/containers/Container.png
new file mode 100644
index 0000000000..511eb94386
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Container.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Left_Off.png b/indra/newview/skins/gold/textures/containers/TabTop_Left_Off.png
new file mode 100644
index 0000000000..c5b232d9ab
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/TabTop_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Left_Selected.png b/indra/newview/skins/gold/textures/containers/TabTop_Left_Selected.png
new file mode 100644
index 0000000000..345caaab1b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/TabTop_Left_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Middle.png b/indra/newview/skins/gold/textures/containers/TabTop_Middle.png
new file mode 100644
index 0000000000..a558943a9d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/TabTop_Middle.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Middle_Off.png b/indra/newview/skins/gold/textures/containers/TabTop_Middle_Off.png
new file mode 100644
index 0000000000..be624ab273
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/TabTop_Middle_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Middle_Selected.png b/indra/newview/skins/gold/textures/containers/TabTop_Middle_Selected.png
new file mode 100644
index 0000000000..a9a358645a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/TabTop_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Right_Flashing.png b/indra/newview/skins/gold/textures/containers/TabTop_Right_Flashing.png
new file mode 100644
index 0000000000..fd13bb699d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/TabTop_Right_Flashing.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Right_Off.png b/indra/newview/skins/gold/textures/containers/TabTop_Right_Off.png
new file mode 100644
index 0000000000..db28e9e13a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/TabTop_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Right_Selected.png b/indra/newview/skins/gold/textures/containers/TabTop_Right_Selected.png
new file mode 100644
index 0000000000..9544f96984
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/TabTop_Right_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Left_Flash.png b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Flash.png
new file mode 100644
index 0000000000..9f1e2a469d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Flash.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Left_Off.png b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Off.png
new file mode 100644
index 0000000000..f347505772
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Left_Over.png b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Over.png
new file mode 100644
index 0000000000..fd24e5b430
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Left_Selected.png b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Selected.png
new file mode 100644
index 0000000000..9299b563cc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Flash.png b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Flash.png
new file mode 100644
index 0000000000..dd73d655e9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Flash.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Off.png b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Off.png
new file mode 100644
index 0000000000..cf30330f1c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Over.png b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Over.png
new file mode 100644
index 0000000000..6ac1ce3ffb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Selected.png b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Selected.png
new file mode 100644
index 0000000000..e921cf84e2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Right_Flash.png b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Flash.png
new file mode 100644
index 0000000000..f6b775c2a0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Flash.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Right_Off.png b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Off.png
new file mode 100644
index 0000000000..d4881e21d3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Right_Over.png b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Over.png
new file mode 100644
index 0000000000..bf2a72d6f4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Right_Selected.png b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Selected.png
new file mode 100644
index 0000000000..69459ad8aa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/crosshairs.tga b/indra/newview/skins/gold/textures/crosshairs.tga
index ac4d63dc59..ac4d63dc59 100644
--- a/indra/newview/skins/contrast/textures/crosshairs.tga
+++ b/indra/newview/skins/gold/textures/crosshairs.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/default_irradiance.png b/indra/newview/skins/gold/textures/default_irradiance.png
index 899e0ddf2a..899e0ddf2a 100644
--- a/indra/newview/skins/contrast/textures/default_irradiance.png
+++ b/indra/newview/skins/gold/textures/default_irradiance.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/default_land_picture.j2c b/indra/newview/skins/gold/textures/default_land_picture.j2c
new file mode 100644
index 0000000000..34df0291ae
--- /dev/null
+++ b/indra/newview/skins/gold/textures/default_land_picture.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/default_profile_picture.j2c b/indra/newview/skins/gold/textures/default_profile_picture.j2c
new file mode 100644
index 0000000000..f21742cf09
--- /dev/null
+++ b/indra/newview/skins/gold/textures/default_profile_picture.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/direction_arrow.tga b/indra/newview/skins/gold/textures/direction_arrow.tga
index f3ef1068c4..f3ef1068c4 100644
--- a/indra/newview/skins/contrast/textures/direction_arrow.tga
+++ b/indra/newview/skins/gold/textures/direction_arrow.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/down_arrow.png b/indra/newview/skins/gold/textures/down_arrow.png
index 21a0fc5ec0..21a0fc5ec0 100644
--- a/indra/newview/skins/contrast/textures/down_arrow.png
+++ b/indra/newview/skins/gold/textures/down_arrow.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/eye_button_active.tga b/indra/newview/skins/gold/textures/eye_button_active.tga
index 014f785a7b..014f785a7b 100644
--- a/indra/newview/skins/contrast/textures/eye_button_active.tga
+++ b/indra/newview/skins/gold/textures/eye_button_active.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/eye_button_inactive.tga b/indra/newview/skins/gold/textures/eye_button_inactive.tga
index 8666f0bbe6..8666f0bbe6 100644
--- a/indra/newview/skins/contrast/textures/eye_button_inactive.tga
+++ b/indra/newview/skins/gold/textures/eye_button_inactive.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/flatnormal.tga b/indra/newview/skins/gold/textures/flatnormal.tga
index 6d5abd1782..6d5abd1782 100644
--- a/indra/newview/skins/contrast/textures/flatnormal.tga
+++ b/indra/newview/skins/gold/textures/flatnormal.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/folder_arrow.tga b/indra/newview/skins/gold/textures/folder_arrow.tga
index 77d470731b..77d470731b 100644
--- a/indra/newview/skins/contrast/textures/folder_arrow.tga
+++ b/indra/newview/skins/gold/textures/folder_arrow.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/foot_shadow.j2c b/indra/newview/skins/gold/textures/foot_shadow.j2c
index f9ce9da7d1..f9ce9da7d1 100644
--- a/indra/newview/skins/contrast/textures/foot_shadow.j2c
+++ b/indra/newview/skins/gold/textures/foot_shadow.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/green_checkmark.png b/indra/newview/skins/gold/textures/green_checkmark.png
index d2a5b348dc..d2a5b348dc 100644
--- a/indra/newview/skins/contrast/textures/green_checkmark.png
+++ b/indra/newview/skins/gold/textures/green_checkmark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icn_media_movie.tga b/indra/newview/skins/gold/textures/icn_media_movie.tga
index 43dd342c9d..43dd342c9d 100644
--- a/indra/newview/skins/contrast/textures/icn_media_movie.tga
+++ b/indra/newview/skins/gold/textures/icn_media_movie.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icn_media_web.tga b/indra/newview/skins/gold/textures/icn_media_web.tga
index 7c9131dfff..7c9131dfff 100644
--- a/indra/newview/skins/contrast/textures/icn_media_web.tga
+++ b/indra/newview/skins/gold/textures/icn_media_web.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_auction.tga b/indra/newview/skins/gold/textures/icon_auction.tga
index baf7d0d000..baf7d0d000 100644
--- a/indra/newview/skins/contrast/textures/icon_auction.tga
+++ b/indra/newview/skins/gold/textures/icon_auction.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_avatar_offline.tga b/indra/newview/skins/gold/textures/icon_avatar_offline.tga
index cfa95eb00e..cfa95eb00e 100644
--- a/indra/newview/skins/contrast/textures/icon_avatar_offline.tga
+++ b/indra/newview/skins/gold/textures/icon_avatar_offline.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_avatar_online.tga b/indra/newview/skins/gold/textures/icon_avatar_online.tga
index 45221213eb..45221213eb 100644
--- a/indra/newview/skins/contrast/textures/icon_avatar_online.tga
+++ b/indra/newview/skins/gold/textures/icon_avatar_online.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_diurnal.tga b/indra/newview/skins/gold/textures/icon_diurnal.tga
index fc720c8269..fc720c8269 100644
--- a/indra/newview/skins/contrast/textures/icon_diurnal.tga
+++ b/indra/newview/skins/gold/textures/icon_diurnal.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_for_sale_adult.tga b/indra/newview/skins/gold/textures/icon_for_sale_adult.tga
index 6a99188f87..6a99188f87 100644
--- a/indra/newview/skins/contrast/textures/icon_for_sale_adult.tga
+++ b/indra/newview/skins/gold/textures/icon_for_sale_adult.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_group.tga b/indra/newview/skins/gold/textures/icon_group.tga
index 79cd71689d..79cd71689d 100644
--- a/indra/newview/skins/contrast/textures/icon_group.tga
+++ b/indra/newview/skins/gold/textures/icon_group.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_legacy_event.tga b/indra/newview/skins/gold/textures/icon_legacy_event.tga
index 7805dbce60..7805dbce60 100644
--- a/indra/newview/skins/contrast/textures/icon_legacy_event.tga
+++ b/indra/newview/skins/gold/textures/icon_legacy_event.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_legacy_event_adult.tga b/indra/newview/skins/gold/textures/icon_legacy_event_adult.tga
index c344fb1e78..c344fb1e78 100644
--- a/indra/newview/skins/contrast/textures/icon_legacy_event_adult.tga
+++ b/indra/newview/skins/gold/textures/icon_legacy_event_adult.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_legacy_event_mature.tga b/indra/newview/skins/gold/textures/icon_legacy_event_mature.tga
index 61c879bc92..61c879bc92 100644
--- a/indra/newview/skins/contrast/textures/icon_legacy_event_mature.tga
+++ b/indra/newview/skins/gold/textures/icon_legacy_event_mature.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_place.tga b/indra/newview/skins/gold/textures/icon_place.tga
index e10655c6ec..e10655c6ec 100644
--- a/indra/newview/skins/contrast/textures/icon_place.tga
+++ b/indra/newview/skins/gold/textures/icon_place.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icon_top_pick.tga b/indra/newview/skins/gold/textures/icon_top_pick.tga
index 0b34882d2f..0b34882d2f 100644
--- a/indra/newview/skins/contrast/textures/icon_top_pick.tga
+++ b/indra/newview/skins/gold/textures/icon_top_pick.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/AddItem_Disabled.png b/indra/newview/skins/gold/textures/icons/AddItem_Disabled.png
new file mode 100644
index 0000000000..d21b72b973
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/AddItem_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/AddItem_Off.png b/indra/newview/skins/gold/textures/icons/AddItem_Off.png
new file mode 100644
index 0000000000..64108d133a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/AddItem_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/AddItem_Press.png b/indra/newview/skins/gold/textures/icons/AddItem_Press.png
new file mode 100644
index 0000000000..3168f51757
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/AddItem_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/AudioMute_Off.png b/indra/newview/skins/gold/textures/icons/AudioMute_Off.png
new file mode 100644
index 0000000000..dd89920fae
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/AudioMute_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/AudioMute_Over.png b/indra/newview/skins/gold/textures/icons/AudioMute_Over.png
new file mode 100644
index 0000000000..a4fbec4144
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/AudioMute_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Audio_Off.png b/indra/newview/skins/gold/textures/icons/Audio_Off.png
new file mode 100644
index 0000000000..4f6f5512c8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Audio_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Audio_Press.png b/indra/newview/skins/gold/textures/icons/Audio_Press.png
new file mode 100644
index 0000000000..0268a0f9fb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Audio_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/BackArrow_Off.png b/indra/newview/skins/gold/textures/icons/BackArrow_Off.png
index 3775690531..3775690531 100644
--- a/indra/newview/skins/contrast/textures/icons/BackArrow_Off.png
+++ b/indra/newview/skins/gold/textures/icons/BackArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.png
index c219ac4446..c219ac4446 100644
--- a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Off.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.png
index 586f577181..586f577181 100644
--- a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Off.png
+++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Press.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.png
index 697bee3bbd..697bee3bbd 100644
--- a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Press.png
+++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.png
index 12cc1857d4..12cc1857d4 100644
--- a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Off.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.png
index 7b40e33e11..7b40e33e11 100644
--- a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Off.png
+++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Press.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.png
index e030c44f01..e030c44f01 100644
--- a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Press.png
+++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_log_inbox.png b/indra/newview/skins/gold/textures/icons/Conv_log_inbox.png
index f4bbdc059d..f4bbdc059d 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_log_inbox.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_log_inbox.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_add_person.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.png
index acb3904e32..acb3904e32 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_add_person.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_ne.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.png
index 70dec7cad1..70dec7cad1 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_ne.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_sw.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.png
index 13d424832b..13d424832b 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_sw.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_call_log.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.png
index 1866dd965c..1866dd965c 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_call_log.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_close.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_close.png
index f4f2e2fd37..f4f2e2fd37 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_close.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_close.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_collapse.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.png
index 3c427a3cc5..3c427a3cc5 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_collapse.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_expand.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.png
index 6e8031b42c..6e8031b42c 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_expand.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_hang_up.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.png
index 887a3b8335..887a3b8335 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_hang_up.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_open_call.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.png
index fc0da5a810..fc0da5a810 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_open_call.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_plus.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.png
index 6d45dbbff6..6d45dbbff6 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_plus.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_sort.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.png
index e3e5f49741..e3e5f49741 100644
--- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_sort.png
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Copy.png b/indra/newview/skins/gold/textures/icons/Copy.png
index 8448e70385..8448e70385 100644
--- a/indra/newview/skins/contrast/textures/icons/Copy.png
+++ b/indra/newview/skins/gold/textures/icons/Copy.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/CopyBright.png b/indra/newview/skins/gold/textures/icons/CopyBright.png
index ac65d68e0b..ac65d68e0b 100644
--- a/indra/newview/skins/contrast/textures/icons/CopyBright.png
+++ b/indra/newview/skins/gold/textures/icons/CopyBright.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Default_Outfit_Photo.png b/indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.png
index 1113b4effe..1113b4effe 100644
--- a/indra/newview/skins/contrast/textures/icons/Default_Outfit_Photo.png
+++ b/indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/DownArrow_Off.png b/indra/newview/skins/gold/textures/icons/DownArrow_Off.png
index 2e1e2964a0..2e1e2964a0 100644
--- a/indra/newview/skins/contrast/textures/icons/DownArrow_Off.png
+++ b/indra/newview/skins/gold/textures/icons/DownArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Edit_Wrench.png b/indra/newview/skins/gold/textures/icons/Edit_Wrench.png
index 2b9ba9dc10..2b9ba9dc10 100644
--- a/indra/newview/skins/contrast/textures/icons/Edit_Wrench.png
+++ b/indra/newview/skins/gold/textures/icons/Edit_Wrench.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ExternalBrowser_Off.png b/indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.png
index dc4532b5a1..dc4532b5a1 100644
--- a/indra/newview/skins/contrast/textures/icons/ExternalBrowser_Off.png
+++ b/indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Facebook.png b/indra/newview/skins/gold/textures/icons/Facebook.png
index 9e51e3ac7f..9e51e3ac7f 100644
--- a/indra/newview/skins/contrast/textures/icons/Facebook.png
+++ b/indra/newview/skins/gold/textures/icons/Facebook.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Female.png b/indra/newview/skins/gold/textures/icons/Female.png
index c9fef87b6e..c9fef87b6e 100644
--- a/indra/newview/skins/contrast/textures/icons/Female.png
+++ b/indra/newview/skins/gold/textures/icons/Female.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ForSale_Badge.png b/indra/newview/skins/gold/textures/icons/ForSale_Badge.png
index 3b3a41c7c1..3b3a41c7c1 100644
--- a/indra/newview/skins/contrast/textures/icons/ForSale_Badge.png
+++ b/indra/newview/skins/gold/textures/icons/ForSale_Badge.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ForwardArrow_Off.png b/indra/newview/skins/gold/textures/icons/ForwardArrow_Off.png
index c33320cf6e..c33320cf6e 100644
--- a/indra/newview/skins/contrast/textures/icons/ForwardArrow_Off.png
+++ b/indra/newview/skins/gold/textures/icons/ForwardArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ForwardArrow_Press.png b/indra/newview/skins/gold/textures/icons/ForwardArrow_Press.png
index 86eb39c43a..86eb39c43a 100644
--- a/indra/newview/skins/contrast/textures/icons/ForwardArrow_Press.png
+++ b/indra/newview/skins/gold/textures/icons/ForwardArrow_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Group.png b/indra/newview/skins/gold/textures/icons/Generic_Group.png
index e96b7fc992..e96b7fc992 100644
--- a/indra/newview/skins/contrast/textures/icons/Generic_Group.png
+++ b/indra/newview/skins/gold/textures/icons/Generic_Group.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Group_Large.png b/indra/newview/skins/gold/textures/icons/Generic_Group_Large.png
index 9396819bfb..9396819bfb 100644
--- a/indra/newview/skins/contrast/textures/icons/Generic_Group_Large.png
+++ b/indra/newview/skins/gold/textures/icons/Generic_Group_Large.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Object_Small.png b/indra/newview/skins/gold/textures/icons/Generic_Object_Small.png
index 142390e3f3..142390e3f3 100644
--- a/indra/newview/skins/contrast/textures/icons/Generic_Object_Small.png
+++ b/indra/newview/skins/gold/textures/icons/Generic_Object_Small.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Person.png b/indra/newview/skins/gold/textures/icons/Generic_Person.png
index 162735d979..162735d979 100644
--- a/indra/newview/skins/contrast/textures/icons/Generic_Person.png
+++ b/indra/newview/skins/gold/textures/icons/Generic_Person.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Person_Large.png b/indra/newview/skins/gold/textures/icons/Generic_Person_Large.png
index 5be82418c1..5be82418c1 100644
--- a/indra/newview/skins/contrast/textures/icons/Generic_Person_Large.png
+++ b/indra/newview/skins/gold/textures/icons/Generic_Person_Large.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Group_Notices.png b/indra/newview/skins/gold/textures/icons/Group_Notices.png
index 601502d374..601502d374 100644
--- a/indra/newview/skins/contrast/textures/icons/Group_Notices.png
+++ b/indra/newview/skins/gold/textures/icons/Group_Notices.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Hierarchy_View_Disabled.png b/indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.png
index 6d8ea5fd93..6d8ea5fd93 100644
--- a/indra/newview/skins/contrast/textures/icons/Hierarchy_View_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Hierarchy_View_On.png b/indra/newview/skins/gold/textures/icons/Hierarchy_View_On.png
index 24f5210286..24f5210286 100644
--- a/indra/newview/skins/contrast/textures/icons/Hierarchy_View_On.png
+++ b/indra/newview/skins/gold/textures/icons/Hierarchy_View_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Icon_Attachment_Large.png b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.png
index fb57265dac..fb57265dac 100644
--- a/indra/newview/skins/contrast/textures/icons/Icon_Attachment_Large.png
+++ b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Icon_Attachment_Small.png b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.png
index 907113cbb7..907113cbb7 100644
--- a/indra/newview/skins/contrast/textures/icons/Icon_Attachment_Small.png
+++ b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Icon_Color_Palette.png b/indra/newview/skins/gold/textures/icons/Icon_Color_Palette.png
index 28906001ea..28906001ea 100644
--- a/indra/newview/skins/contrast/textures/icons/Icon_Color_Palette.png
+++ b/indra/newview/skins/gold/textures/icons/Icon_Color_Palette.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Icon_Font_Size.png b/indra/newview/skins/gold/textures/icons/Icon_Font_Size.png
index 37bdde69aa..37bdde69aa 100644
--- a/indra/newview/skins/contrast/textures/icons/Icon_Font_Size.png
+++ b/indra/newview/skins/gold/textures/icons/Icon_Font_Size.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Icon_For_Sale.png b/indra/newview/skins/gold/textures/icons/Icon_For_Sale.png
index 57a376f1bf..57a376f1bf 100644
--- a/indra/newview/skins/contrast/textures/icons/Icon_For_Sale.png
+++ b/indra/newview/skins/gold/textures/icons/Icon_For_Sale.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Icon_Notification_Condense.png b/indra/newview/skins/gold/textures/icons/Icon_Notification_Condense.png
new file mode 100644
index 0000000000..3a19e79f82
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Icon_Notification_Condense.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Icon_Notification_Expand.png b/indra/newview/skins/gold/textures/icons/Icon_Notification_Expand.png
new file mode 100644
index 0000000000..f5331feb02
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Icon_Notification_Expand.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Info.png b/indra/newview/skins/gold/textures/icons/Info.png
new file mode 100644
index 0000000000..e05a585f0b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Info.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Info_Over.png b/indra/newview/skins/gold/textures/icons/Info_Over.png
new file mode 100644
index 0000000000..07b65ddf8b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Info_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Info_Small.png b/indra/newview/skins/gold/textures/icons/Info_Small.png
new file mode 100644
index 0000000000..c4ce13e132
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Info_Small.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Alpha.png b/indra/newview/skins/gold/textures/icons/Inv_Alpha.png
index fdad36e2d3..fdad36e2d3 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Alpha.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Alpha.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Animation.png b/indra/newview/skins/gold/textures/icons/Inv_Animation.png
index 6715c736e7..6715c736e7 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Animation.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Animation.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_BodyShape.png b/indra/newview/skins/gold/textures/icons/Inv_BodyShape.png
index cb908a39fb..cb908a39fb 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_BodyShape.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_BodyShape.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_CallingCard.png b/indra/newview/skins/gold/textures/icons/Inv_CallingCard.png
index ee87f8e595..ee87f8e595 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_CallingCard.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_CallingCard.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Clothing.png b/indra/newview/skins/gold/textures/icons/Inv_Clothing.png
index 430dca6b5e..430dca6b5e 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Clothing.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Clothing.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Eye.png b/indra/newview/skins/gold/textures/icons/Inv_Eye.png
index d715f135d3..d715f135d3 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Eye.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Eye.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_FolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_FolderClosed.png
index ec99eaee9e..ec99eaee9e 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_FolderClosed.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_FolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_FolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_FolderOpen.png
index 615a6ec11b..615a6ec11b 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_FolderOpen.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_FolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Gesture.png b/indra/newview/skins/gold/textures/icons/Inv_Gesture.png
index 9fee34915e..9fee34915e 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Gesture.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Gesture.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Gloves.png b/indra/newview/skins/gold/textures/icons/Inv_Gloves.png
index aa151d5404..aa151d5404 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Gloves.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Gloves.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Hair.png b/indra/newview/skins/gold/textures/icons/Inv_Hair.png
index 62b3ae81c2..62b3ae81c2 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Hair.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Hair.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Invalid.png b/indra/newview/skins/gold/textures/icons/Inv_Invalid.png
index 6ab5ba5217..6ab5ba5217 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Invalid.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Invalid.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Jacket.png b/indra/newview/skins/gold/textures/icons/Inv_Jacket.png
index 26514f1c0f..26514f1c0f 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Jacket.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Jacket.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Landmark.png b/indra/newview/skins/gold/textures/icons/Inv_Landmark.png
index 338323fcee..338323fcee 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Landmark.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Landmark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Link.png b/indra/newview/skins/gold/textures/icons/Inv_Link.png
index 28c5f3635a..28c5f3635a 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Link.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Link.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LinkFolder.png b/indra/newview/skins/gold/textures/icons/Inv_LinkFolder.png
index 7c43ed3a43..7c43ed3a43 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_LinkFolder.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_LinkFolder.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LinkItem.png b/indra/newview/skins/gold/textures/icons/Inv_LinkItem.png
index 7c43ed3a43..7c43ed3a43 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_LinkItem.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_LinkItem.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LookFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.png
index 46f2038279..46f2038279 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_LookFolderClosed.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LookFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.png
index 06a1b05983..06a1b05983 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_LookFolderOpen.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LostClosed.png b/indra/newview/skins/gold/textures/icons/Inv_LostClosed.png
index fc9a2a2156..fc9a2a2156 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_LostClosed.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_LostClosed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LostOpen.png b/indra/newview/skins/gold/textures/icons/Inv_LostOpen.png
index b15dc3cfa3..b15dc3cfa3 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_LostOpen.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_LostOpen.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Material.png b/indra/newview/skins/gold/textures/icons/Inv_Material.png
index 5cbb4fc5c9..5cbb4fc5c9 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Material.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Material.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Mesh.png b/indra/newview/skins/gold/textures/icons/Inv_Mesh.png
index 69217d1cdc..69217d1cdc 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Mesh.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Mesh.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Notecard.png b/indra/newview/skins/gold/textures/icons/Inv_Notecard.png
index 96f45bc55e..96f45bc55e 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Notecard.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Notecard.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Object.png b/indra/newview/skins/gold/textures/icons/Inv_Object.png
index fe6b201570..fe6b201570 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Object.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Object.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Object_Multi.png b/indra/newview/skins/gold/textures/icons/Inv_Object_Multi.png
index 3793594059..3793594059 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Object_Multi.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Object_Multi.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Pants.png b/indra/newview/skins/gold/textures/icons/Inv_Pants.png
index 5673bc29ed..5673bc29ed 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Pants.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Pants.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Physics.png b/indra/newview/skins/gold/textures/icons/Inv_Physics.png
index 43bd082d8a..43bd082d8a 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Physics.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Physics.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Script.png b/indra/newview/skins/gold/textures/icons/Inv_Script.png
index 68d2ac425f..68d2ac425f 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Script.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Script.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Settings.png b/indra/newview/skins/gold/textures/icons/Inv_Settings.png
index ca6cf10314..ca6cf10314 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Settings.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Settings.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SettingsDay.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsDay.png
index d0c4b2cdcd..d0c4b2cdcd 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_SettingsDay.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsDay.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SettingsSky.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsSky.png
index 5332404d37..5332404d37 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_SettingsSky.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsSky.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SettingsWater.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsWater.png
index 88ff803756..88ff803756 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_SettingsWater.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsWater.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Shape.png b/indra/newview/skins/gold/textures/icons/Inv_Shape.png
index e5db447b36..e5db447b36 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Shape.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Shape.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Shirt.png b/indra/newview/skins/gold/textures/icons/Inv_Shirt.png
index ffabff9c6c..ffabff9c6c 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Shirt.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Shirt.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Shoe.png b/indra/newview/skins/gold/textures/icons/Inv_Shoe.png
index 784d1d23a3..784d1d23a3 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Shoe.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Shoe.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Skin.png b/indra/newview/skins/gold/textures/icons/Inv_Skin.png
index a232c5ac67..a232c5ac67 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Skin.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Skin.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Skirt.png b/indra/newview/skins/gold/textures/icons/Inv_Skirt.png
index 5970f39b1b..5970f39b1b 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Skirt.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Skirt.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Snapshot.png b/indra/newview/skins/gold/textures/icons/Inv_Snapshot.png
index 9eaca9e7ef..9eaca9e7ef 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Snapshot.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Snapshot.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Socks.png b/indra/newview/skins/gold/textures/icons/Inv_Socks.png
index 95a3a68de6..95a3a68de6 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Socks.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Socks.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Sound.png b/indra/newview/skins/gold/textures/icons/Inv_Sound.png
index 138d4c5c36..138d4c5c36 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Sound.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Sound.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_StockFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.png
index c3aae7c736..c3aae7c736 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_StockFolderClosed.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_StockFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.png
index 15fd8225fc..15fd8225fc 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_StockFolderOpen.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SysClosed.png b/indra/newview/skins/gold/textures/icons/Inv_SysClosed.png
index 2550cae0d4..2550cae0d4 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_SysClosed.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_SysClosed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SysOpen.png b/indra/newview/skins/gold/textures/icons/Inv_SysOpen.png
index 5b56d86184..5b56d86184 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_SysOpen.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_SysOpen.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Tattoo.png b/indra/newview/skins/gold/textures/icons/Inv_Tattoo.png
index af5a780685..af5a780685 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Tattoo.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Tattoo.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Texture.png b/indra/newview/skins/gold/textures/icons/Inv_Texture.png
index 168a97515a..168a97515a 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Texture.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Texture.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Toolbar_SearchVisibility.png b/indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.png
index c4b186c3de..c4b186c3de 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Toolbar_SearchVisibility.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_TrashClosed.png b/indra/newview/skins/gold/textures/icons/Inv_TrashClosed.png
index 89f0caa5a2..89f0caa5a2 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_TrashClosed.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_TrashClosed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_TrashOpen.png b/indra/newview/skins/gold/textures/icons/Inv_TrashOpen.png
index d1f1eeaf42..d1f1eeaf42 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_TrashOpen.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_TrashOpen.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Underpants.png b/indra/newview/skins/gold/textures/icons/Inv_Underpants.png
index 77f8e55270..77f8e55270 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Underpants.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Underpants.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Undershirt.png b/indra/newview/skins/gold/textures/icons/Inv_Undershirt.png
index 477d76cf11..477d76cf11 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Undershirt.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Undershirt.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Universal.png b/indra/newview/skins/gold/textures/icons/Inv_Universal.png
index 65b2f88f02..65b2f88f02 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_Universal.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_Universal.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_UnknownObject.png b/indra/newview/skins/gold/textures/icons/Inv_UnknownObject.png
index 603a6d7aaa..603a6d7aaa 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_UnknownObject.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_UnknownObject.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_VersionFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.png
index cd561d24ba..cd561d24ba 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_VersionFolderClosed.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Inv_VersionFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.png
index 6dc9d451cc..6dc9d451cc 100644
--- a/indra/newview/skins/contrast/textures/icons/Inv_VersionFolderOpen.png
+++ b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/List_View_Disabled.png b/indra/newview/skins/gold/textures/icons/List_View_Disabled.png
index 125034b0cb..125034b0cb 100644
--- a/indra/newview/skins/contrast/textures/icons/List_View_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/List_View_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/List_View_On.png b/indra/newview/skins/gold/textures/icons/List_View_On.png
index fcf77f004f..fcf77f004f 100644
--- a/indra/newview/skins/contrast/textures/icons/List_View_On.png
+++ b/indra/newview/skins/gold/textures/icons/List_View_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Lock.png b/indra/newview/skins/gold/textures/icons/Lock.png
index 2db6ed0213..2db6ed0213 100644
--- a/indra/newview/skins/contrast/textures/icons/Lock.png
+++ b/indra/newview/skins/gold/textures/icons/Lock.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Locked_Icon.png b/indra/newview/skins/gold/textures/icons/Locked_Icon.png
index 4985af1be1..4985af1be1 100644
--- a/indra/newview/skins/contrast/textures/icons/Locked_Icon.png
+++ b/indra/newview/skins/gold/textures/icons/Locked_Icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/MP_Logo.png b/indra/newview/skins/gold/textures/icons/MP_Logo.png
new file mode 100644
index 0000000000..6aba54189f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/MP_Logo.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Male.png b/indra/newview/skins/gold/textures/icons/Male.png
index 803171f5c6..803171f5c6 100644
--- a/indra/newview/skins/contrast/textures/icons/Male.png
+++ b/indra/newview/skins/gold/textures/icons/Male.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Microphone_On.png b/indra/newview/skins/gold/textures/icons/Microphone_On.png
index 7a7d39d982..7a7d39d982 100644
--- a/indra/newview/skins/contrast/textures/icons/Microphone_On.png
+++ b/indra/newview/skins/gold/textures/icons/Microphone_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/MinusItem_Disabled.png b/indra/newview/skins/gold/textures/icons/MinusItem_Disabled.png
new file mode 100644
index 0000000000..b62ed35182
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/MinusItem_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/MinusItem_Off.png b/indra/newview/skins/gold/textures/icons/MinusItem_Off.png
new file mode 100644
index 0000000000..eb7b8838f7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/MinusItem_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/MinusItem_Press.png b/indra/newview/skins/gold/textures/icons/MinusItem_Press.png
new file mode 100644
index 0000000000..2dc6081cb0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/MinusItem_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/MusicNote.png b/indra/newview/skins/gold/textures/icons/MusicNote.png
index 8d3534a94b..8d3534a94b 100644
--- a/indra/newview/skins/contrast/textures/icons/MusicNote.png
+++ b/indra/newview/skins/gold/textures/icons/MusicNote.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.png
index 5755315e23..5755315e23 100644
--- a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Off.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Off.png
index 2e9a5faa21..2e9a5faa21 100644
--- a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Off.png
+++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Press.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Press.png
index 1b08648b51..1b08648b51 100644
--- a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Press.png
+++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Disabled.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.png
index 1d2dbd6349..1d2dbd6349 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Off.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Off.png
index f8f3367c42..f8f3367c42 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Off.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_On.png b/indra/newview/skins/gold/textures/icons/OutboxPush_On.png
index b1fd734100..b1fd734100 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_On.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_On_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.png
index e234400b72..e234400b72 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_On_Over.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Over.png
index 9e1b0e2dfc..9e1b0e2dfc 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Over.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Press.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Press.png
index 14d9eacc52..14d9eacc52 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Press.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_1.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.png
index 85015fc913..85015fc913 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_1.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_2.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.png
index 6158242b68..6158242b68 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_2.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_3.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.png
index 7105380bff..7105380bff 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_3.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_4.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.png
index 0e65a60fc8..0e65a60fc8 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_4.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_5.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.png
index 7acef05891..7acef05891 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_5.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_6.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.png
index 4f5b34a643..4f5b34a643 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_6.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected.png
index d58826da67..d58826da67 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Disabled.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.png
index cad9f118b1..cad9f118b1 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.png
index 65d914c6b3..65d914c6b3 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Over.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Press.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.png
index cd50d41903..cd50d41903 100644
--- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Press.png
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.png
index dd12d94ad2..dd12d94ad2 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.png
index 4739c501ad..4739c501ad 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Light.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Build_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.png
index 9826491efd..9826491efd 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Build_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_DamageNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.png
index 7634e5fab0..7634e5fab0 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_DamageNo_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Damage_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.png
index 7ecd645df2..7ecd645df2 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Damage_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Exp_Color.png b/indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.png
index a1b0faa008..a1b0faa008 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Exp_Color.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.png
index 831c25a34b..831c25a34b 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.png
index be829fb5ef..be829fb5ef 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Light.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Fly_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.png
index 579bfe58f8..579bfe58f8 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Fly_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_ForSale_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.png
index 3f4ee0b482..3f4ee0b482 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_ForSale_Light.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Health_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Health_Dark.png
index 98618de927..98618de927 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Health_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Health_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_M_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_M_Dark.png
new file mode 100644
index 0000000000..ab5a1680a7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_M_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_M_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_M_Light.png
new file mode 100644
index 0000000000..2db94e37c9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_M_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_PG_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_PG_Dark.png
new file mode 100644
index 0000000000..e1f7613d04
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_PG_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_PG_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_PG_Light.png
new file mode 100644
index 0000000000..04d13027d2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_PG_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Dark.png
index 2867004014..2867004014 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.png
index a3a51973af..a3a51973af 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Light.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Push_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.png
index e8487ca092..e8487ca092 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Push_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_R_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_R_Dark.png
index 5c165c2fac..5c165c2fac 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_R_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_R_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_R_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_R_Light.png
new file mode 100644
index 0000000000..dbf43152b3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_R_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_ScriptsNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_ScriptsNo_Dark.png
index bfc55fc403..bfc55fc403 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_ScriptsNo_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_ScriptsNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Scripts_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.png
index 3477e0654c..3477e0654c 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Scripts_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.png
index eff089487e..eff089487e 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.png
index 68f0b14d44..68f0b14d44 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Light.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.png
index 200e04a59f..200e04a59f 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.png
index 14cafc5bd2..14cafc5bd2 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Light.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.png
index ec316e822e..ec316e822e 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.png
index de3532a70b..de3532a70b 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Light.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Voice_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.png
index 329620fa69..329620fa69 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Voice_Dark.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Voice_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.png
index 81e0fa7bc4..81e0fa7bc4 100644
--- a/indra/newview/skins/contrast/textures/icons/Parcel_Voice_Light.png
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Pathfinding_Dirty.png b/indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.png
index d8fee0fef7..d8fee0fef7 100644
--- a/indra/newview/skins/contrast/textures/icons/Pathfinding_Dirty.png
+++ b/indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Pathfinding_Disabled.png b/indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.png
index ea2ad79611..ea2ad79611 100644
--- a/indra/newview/skins/contrast/textures/icons/Pathfinding_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Pause_Off.png b/indra/newview/skins/gold/textures/icons/Pause_Off.png
index 5d44412783..5d44412783 100644
--- a/indra/newview/skins/contrast/textures/icons/Pause_Off.png
+++ b/indra/newview/skins/gold/textures/icons/Pause_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Pause_Over.png b/indra/newview/skins/gold/textures/icons/Pause_Over.png
index d1609a144b..d1609a144b 100644
--- a/indra/newview/skins/contrast/textures/icons/Pause_Over.png
+++ b/indra/newview/skins/gold/textures/icons/Pause_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Pause_Press.png b/indra/newview/skins/gold/textures/icons/Pause_Press.png
index 6b918d1ae6..6b918d1ae6 100644
--- a/indra/newview/skins/contrast/textures/icons/Pause_Press.png
+++ b/indra/newview/skins/gold/textures/icons/Pause_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Permission_Ungranted.png b/indra/newview/skins/gold/textures/icons/Permission_Ungranted.png
index d206af4433..d206af4433 100644
--- a/indra/newview/skins/contrast/textures/icons/Permission_Ungranted.png
+++ b/indra/newview/skins/gold/textures/icons/Permission_Ungranted.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Person_Check.png b/indra/newview/skins/gold/textures/icons/Person_Check.png
index 39a63a70cf..39a63a70cf 100644
--- a/indra/newview/skins/contrast/textures/icons/Person_Check.png
+++ b/indra/newview/skins/gold/textures/icons/Person_Check.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Person_Star.png b/indra/newview/skins/gold/textures/icons/Person_Star.png
index c4e625b3c1..c4e625b3c1 100644
--- a/indra/newview/skins/contrast/textures/icons/Person_Star.png
+++ b/indra/newview/skins/gold/textures/icons/Person_Star.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Play_Off.png b/indra/newview/skins/gold/textures/icons/Play_Off.png
index dac2f2d6db..dac2f2d6db 100644
--- a/indra/newview/skins/contrast/textures/icons/Play_Off.png
+++ b/indra/newview/skins/gold/textures/icons/Play_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Play_Over.png b/indra/newview/skins/gold/textures/icons/Play_Over.png
index 1d261efcda..1d261efcda 100644
--- a/indra/newview/skins/contrast/textures/icons/Play_Over.png
+++ b/indra/newview/skins/gold/textures/icons/Play_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Play_Press.png b/indra/newview/skins/gold/textures/icons/Play_Press.png
index f7251ce549..f7251ce549 100644
--- a/indra/newview/skins/contrast/textures/icons/Play_Press.png
+++ b/indra/newview/skins/gold/textures/icons/Play_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Presets_Icon.png b/indra/newview/skins/gold/textures/icons/Presets_Icon.png
index 13642e88d1..13642e88d1 100644
--- a/indra/newview/skins/contrast/textures/icons/Presets_Icon.png
+++ b/indra/newview/skins/gold/textures/icons/Presets_Icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Presets_Icon_Graphic.png b/indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.png
index 96d1021f81..96d1021f81 100644
--- a/indra/newview/skins/contrast/textures/icons/Presets_Icon_Graphic.png
+++ b/indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Friend_Offline.png b/indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.png
index 55d922cda7..55d922cda7 100644
--- a/indra/newview/skins/contrast/textures/icons/Profile_Friend_Offline.png
+++ b/indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Friend_Online.png b/indra/newview/skins/gold/textures/icons/Profile_Friend_Online.png
index febe8e78fa..febe8e78fa 100644
--- a/indra/newview/skins/contrast/textures/icons/Profile_Friend_Online.png
+++ b/indra/newview/skins/gold/textures/icons/Profile_Friend_Online.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.png
index 2632eb173b..2632eb173b 100644
--- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.png
index fd8b152c12..fd8b152c12 100644
--- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Enabled.png
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.png
index cef3ec4e5a..cef3ec4e5a 100644
--- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.png
index 5821566703..5821566703 100644
--- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Enabled.png
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.png
index ea1b55eca0..ea1b55eca0 100644
--- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.png
index eb3fc9e713..eb3fc9e713 100644
--- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Enabled.png
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_1.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_1.png
index ff277fc431..ff277fc431 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_1.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_1.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_10.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_10.png
index 1c94e21d89..1c94e21d89 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_10.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_10.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_11.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_11.png
index 89bea9b474..89bea9b474 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_11.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_11.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_12.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_12.png
index da38475ba4..da38475ba4 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_12.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_12.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_2.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_2.png
index c024275ebe..c024275ebe 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_2.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_2.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_3.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_3.png
index 87b931e72e..87b931e72e 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_3.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_3.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_4.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_4.png
index 6dbef74361..6dbef74361 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_4.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_4.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_5.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_5.png
index daccf9b375..daccf9b375 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_5.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_5.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_6.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_6.png
index cafddcb88d..cafddcb88d 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_6.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_6.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_7.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_7.png
index 8acf6472d4..8acf6472d4 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_7.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_7.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_8.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_8.png
new file mode 100644
index 0000000000..df0e825cef
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_8.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_9.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_9.png
index 293a7b8f5c..293a7b8f5c 100644
--- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_9.png
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_9.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_1.png b/indra/newview/skins/gold/textures/icons/Progress_1.png
index bc7a1e7e96..bc7a1e7e96 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_1.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_10.png b/indra/newview/skins/gold/textures/icons/Progress_10.png
index acf4d21aba..acf4d21aba 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_10.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_10.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_11.png b/indra/newview/skins/gold/textures/icons/Progress_11.png
index 1842cd09d0..1842cd09d0 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_11.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_11.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_12.png b/indra/newview/skins/gold/textures/icons/Progress_12.png
index 0ea9dda83e..0ea9dda83e 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_12.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_12.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_2.png b/indra/newview/skins/gold/textures/icons/Progress_2.png
index 29d6bbcbcb..29d6bbcbcb 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_2.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_3.png b/indra/newview/skins/gold/textures/icons/Progress_3.png
index 52a03125e9..52a03125e9 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_3.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_4.png b/indra/newview/skins/gold/textures/icons/Progress_4.png
index 4b2798519f..4b2798519f 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_4.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_5.png b/indra/newview/skins/gold/textures/icons/Progress_5.png
index 3f02b8f31a..3f02b8f31a 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_5.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_6.png b/indra/newview/skins/gold/textures/icons/Progress_6.png
index 04c8f716d4..04c8f716d4 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_6.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_7.png b/indra/newview/skins/gold/textures/icons/Progress_7.png
index c96b4c08d6..c96b4c08d6 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_7.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_7.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_8.png b/indra/newview/skins/gold/textures/icons/Progress_8.png
index 9463f50707..9463f50707 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_8.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_8.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Progress_9.png b/indra/newview/skins/gold/textures/icons/Progress_9.png
index 928a3e934e..928a3e934e 100644
--- a/indra/newview/skins/contrast/textures/icons/Progress_9.png
+++ b/indra/newview/skins/gold/textures/icons/Progress_9.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Refresh_Off.png b/indra/newview/skins/gold/textures/icons/Refresh_Off.png
index e645a8159f..e645a8159f 100644
--- a/indra/newview/skins/contrast/textures/icons/Refresh_Off.png
+++ b/indra/newview/skins/gold/textures/icons/Refresh_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/SL_Logo.png b/indra/newview/skins/gold/textures/icons/SL_Logo.png
new file mode 100644
index 0000000000..5e376c72f9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/SL_Logo.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Search_Icon.png b/indra/newview/skins/gold/textures/icons/Search_Icon.png
index 0ea7b14f81..0ea7b14f81 100644
--- a/indra/newview/skins/contrast/textures/icons/Search_Icon.png
+++ b/indra/newview/skins/gold/textures/icons/Search_Icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Shirt_Large.png b/indra/newview/skins/gold/textures/icons/Shirt_Large.png
index 06fce6bbaa..06fce6bbaa 100644
--- a/indra/newview/skins/contrast/textures/icons/Shirt_Large.png
+++ b/indra/newview/skins/gold/textures/icons/Shirt_Large.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Shop.png b/indra/newview/skins/gold/textures/icons/Shop.png
index 93353cf2fe..93353cf2fe 100644
--- a/indra/newview/skins/contrast/textures/icons/Shop.png
+++ b/indra/newview/skins/gold/textures/icons/Shop.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/SkipBackward_Off.png b/indra/newview/skins/gold/textures/icons/SkipBackward_Off.png
index 20fd2b8e22..20fd2b8e22 100644
--- a/indra/newview/skins/contrast/textures/icons/SkipBackward_Off.png
+++ b/indra/newview/skins/gold/textures/icons/SkipBackward_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/SkipForward_Off.png b/indra/newview/skins/gold/textures/icons/SkipForward_Off.png
index 30e28d3d31..30e28d3d31 100644
--- a/indra/newview/skins/contrast/textures/icons/SkipForward_Off.png
+++ b/indra/newview/skins/gold/textures/icons/SkipForward_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/StopReload_Off.png b/indra/newview/skins/gold/textures/icons/StopReload_Off.png
index 500a81d715..500a81d715 100644
--- a/indra/newview/skins/contrast/textures/icons/StopReload_Off.png
+++ b/indra/newview/skins/gold/textures/icons/StopReload_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/StopReload_Over.png b/indra/newview/skins/gold/textures/icons/StopReload_Over.png
index a065a37d14..a065a37d14 100644
--- a/indra/newview/skins/contrast/textures/icons/StopReload_Over.png
+++ b/indra/newview/skins/gold/textures/icons/StopReload_Over.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Stop_Off.png b/indra/newview/skins/gold/textures/icons/Stop_Off.png
index 2d00083e2e..2d00083e2e 100644
--- a/indra/newview/skins/contrast/textures/icons/Stop_Off.png
+++ b/indra/newview/skins/gold/textures/icons/Stop_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Disabled.png b/indra/newview/skins/gold/textures/icons/Sync_Disabled.png
index 7b39e7cd6f..7b39e7cd6f 100644
--- a/indra/newview/skins/contrast/textures/icons/Sync_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/Sync_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Enabled.png b/indra/newview/skins/gold/textures/icons/Sync_Enabled.png
index 0e7e5157cb..0e7e5157cb 100644
--- a/indra/newview/skins/contrast/textures/icons/Sync_Enabled.png
+++ b/indra/newview/skins/gold/textures/icons/Sync_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_1.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_1.png
index 218edaa986..218edaa986 100644
--- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_1.png
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_2.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_2.png
index 23cb9d63c0..23cb9d63c0 100644
--- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_2.png
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_3.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_3.png
index 490826011a..490826011a 100644
--- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_3.png
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_4.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_4.png
index de1c815e90..de1c815e90 100644
--- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_4.png
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_5.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_5.png
index 2897b37382..2897b37382 100644
--- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_5.png
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_6.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_6.png
index 862410e9e4..862410e9e4 100644
--- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_6.png
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/System_Notification_Large.png b/indra/newview/skins/gold/textures/icons/System_Notification_Large.png
index 01c6e31f41..01c6e31f41 100644
--- a/indra/newview/skins/contrast/textures/icons/System_Notification_Large.png
+++ b/indra/newview/skins/gold/textures/icons/System_Notification_Large.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/System_Notification_Small.png b/indra/newview/skins/gold/textures/icons/System_Notification_Small.png
index 69b823d852..69b823d852 100644
--- a/indra/newview/skins/contrast/textures/icons/System_Notification_Small.png
+++ b/indra/newview/skins/gold/textures/icons/System_Notification_Small.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/TrashItem_Disabled.png b/indra/newview/skins/gold/textures/icons/TrashItem_Disabled.png
index 800d9434d2..800d9434d2 100644
--- a/indra/newview/skins/contrast/textures/icons/TrashItem_Disabled.png
+++ b/indra/newview/skins/gold/textures/icons/TrashItem_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/TrashItem_Off.png b/indra/newview/skins/gold/textures/icons/TrashItem_Off.png
index 0cbff4f1d7..0cbff4f1d7 100644
--- a/indra/newview/skins/contrast/textures/icons/TrashItem_Off.png
+++ b/indra/newview/skins/gold/textures/icons/TrashItem_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/TrashItem_Press.png b/indra/newview/skins/gold/textures/icons/TrashItem_Press.png
index fac13226e7..fac13226e7 100644
--- a/indra/newview/skins/contrast/textures/icons/TrashItem_Press.png
+++ b/indra/newview/skins/gold/textures/icons/TrashItem_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/UnZoom_Off.png b/indra/newview/skins/gold/textures/icons/UnZoom_Off.png
index 34ec3f5de8..34ec3f5de8 100644
--- a/indra/newview/skins/contrast/textures/icons/UnZoom_Off.png
+++ b/indra/newview/skins/gold/textures/icons/UnZoom_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/UpArrow_Off.png b/indra/newview/skins/gold/textures/icons/UpArrow_Off.png
index d5ddc353e7..d5ddc353e7 100644
--- a/indra/newview/skins/contrast/textures/icons/UpArrow_Off.png
+++ b/indra/newview/skins/gold/textures/icons/UpArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Video_URL_Off.png b/indra/newview/skins/gold/textures/icons/Video_URL_Off.png
index d37a189645..d37a189645 100644
--- a/indra/newview/skins/contrast/textures/icons/Video_URL_Off.png
+++ b/indra/newview/skins/gold/textures/icons/Video_URL_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/VoiceMute_Off.png b/indra/newview/skins/gold/textures/icons/VoiceMute_Off.png
new file mode 100644
index 0000000000..425ba267a5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/VoiceMute_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl1.png b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl1.png
new file mode 100644
index 0000000000..cc3407b57d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl1.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl2.png b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl2.png
new file mode 100644
index 0000000000..49f58d7cd0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl2.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl3.png b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl3.png
new file mode 100644
index 0000000000..a4a171bd81
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl3.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_Off.png b/indra/newview/skins/gold/textures/icons/VoicePTT_Off.png
new file mode 100644
index 0000000000..533663a4fa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/VoicePTT_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_On.png b/indra/newview/skins/gold/textures/icons/VoicePTT_On.png
new file mode 100644
index 0000000000..204c4a376e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/VoicePTT_On.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Web_Profile_Off.png b/indra/newview/skins/gold/textures/icons/Web_Profile_Off.png
index cf8f9c8f94..cf8f9c8f94 100644
--- a/indra/newview/skins/contrast/textures/icons/Web_Profile_Off.png
+++ b/indra/newview/skins/gold/textures/icons/Web_Profile_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/YouAreHere_Badge.png b/indra/newview/skins/gold/textures/icons/YouAreHere_Badge.png
index ed1805c096..ed1805c096 100644
--- a/indra/newview/skins/contrast/textures/icons/YouAreHere_Badge.png
+++ b/indra/newview/skins/gold/textures/icons/YouAreHere_Badge.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/Zoom_Off.png b/indra/newview/skins/gold/textures/icons/Zoom_Off.png
index 833e608201..833e608201 100644
--- a/indra/newview/skins/contrast/textures/icons/Zoom_Off.png
+++ b/indra/newview/skins/gold/textures/icons/Zoom_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/add_icon.png b/indra/newview/skins/gold/textures/icons/add_icon.png
new file mode 100644
index 0000000000..b5b09ae6e0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/add_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/back_arrow_off.png b/indra/newview/skins/gold/textures/icons/back_arrow_off.png
new file mode 100644
index 0000000000..512d78669f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/back_arrow_off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/back_arrow_over.png b/indra/newview/skins/gold/textures/icons/back_arrow_over.png
new file mode 100644
index 0000000000..222cf067b2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/back_arrow_over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/back_arrow_press.png b/indra/newview/skins/gold/textures/icons/back_arrow_press.png
new file mode 100644
index 0000000000..bfa68d3a8a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/back_arrow_press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/check_mark.png b/indra/newview/skins/gold/textures/icons/check_mark.png
new file mode 100755
index 0000000000..3bc5665ee9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/check_mark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/collapse_to_one_line.png b/indra/newview/skins/gold/textures/icons/collapse_to_one_line.png
index 3730924ad8..3730924ad8 100644
--- a/indra/newview/skins/contrast/textures/icons/collapse_to_one_line.png
+++ b/indra/newview/skins/gold/textures/icons/collapse_to_one_line.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/copy_clipboard.png b/indra/newview/skins/gold/textures/icons/copy_clipboard.png
index 9ce67d8547..9ce67d8547 100644
--- a/indra/newview/skins/contrast/textures/icons/copy_clipboard.png
+++ b/indra/newview/skins/gold/textures/icons/copy_clipboard.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/delete_icon.png b/indra/newview/skins/gold/textures/icons/delete_icon.png
index 5a80155d8b..5a80155d8b 100644
--- a/indra/newview/skins/contrast/textures/icons/delete_icon.png
+++ b/indra/newview/skins/gold/textures/icons/delete_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/edit_mine.png b/indra/newview/skins/gold/textures/icons/edit_mine.png
index 2fb10deba2..2fb10deba2 100644
--- a/indra/newview/skins/contrast/textures/icons/edit_mine.png
+++ b/indra/newview/skins/gold/textures/icons/edit_mine.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/edit_theirs.png b/indra/newview/skins/gold/textures/icons/edit_theirs.png
index 586c08c181..586c08c181 100644
--- a/indra/newview/skins/contrast/textures/icons/edit_theirs.png
+++ b/indra/newview/skins/gold/textures/icons/edit_theirs.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/emoji_picker_icon.png b/indra/newview/skins/gold/textures/icons/emoji_picker_icon.png
index 6c1a1a3c62..6c1a1a3c62 100644
--- a/indra/newview/skins/contrast/textures/icons/emoji_picker_icon.png
+++ b/indra/newview/skins/gold/textures/icons/emoji_picker_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/expand_one_liner.png b/indra/newview/skins/gold/textures/icons/expand_one_liner.png
index 0d1a60547a..0d1a60547a 100644
--- a/indra/newview/skins/contrast/textures/icons/expand_one_liner.png
+++ b/indra/newview/skins/gold/textures/icons/expand_one_liner.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/file_upload.png b/indra/newview/skins/gold/textures/icons/file_upload.png
index 78b75fdd72..78b75fdd72 100644
--- a/indra/newview/skins/contrast/textures/icons/file_upload.png
+++ b/indra/newview/skins/gold/textures/icons/file_upload.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/hand.png b/indra/newview/skins/gold/textures/icons/hand.png
new file mode 100644
index 0000000000..5fbdb70c2b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/hand.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/map_placeholder.png b/indra/newview/skins/gold/textures/icons/map_placeholder.png
index 80e5deac7e..80e5deac7e 100644
--- a/indra/newview/skins/contrast/textures/icons/map_placeholder.png
+++ b/indra/newview/skins/gold/textures/icons/map_placeholder.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/multi_folder_mode.png b/indra/newview/skins/gold/textures/icons/multi_folder_mode.png
index b363848aba..b363848aba 100644
--- a/indra/newview/skins/contrast/textures/icons/multi_folder_mode.png
+++ b/indra/newview/skins/gold/textures/icons/multi_folder_mode.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/nearby_chat_icon.png b/indra/newview/skins/gold/textures/icons/nearby_chat_icon.png
index c5f52f010e..c5f52f010e 100644
--- a/indra/newview/skins/contrast/textures/icons/nearby_chat_icon.png
+++ b/indra/newview/skins/gold/textures/icons/nearby_chat_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/object_icon.png b/indra/newview/skins/gold/textures/icons/object_icon.png
index 51bf0b0649..51bf0b0649 100644
--- a/indra/newview/skins/contrast/textures/icons/object_icon.png
+++ b/indra/newview/skins/gold/textures/icons/object_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/paste_clipboard.png b/indra/newview/skins/gold/textures/icons/paste_clipboard.png
index ff8493d4ad..ff8493d4ad 100644
--- a/indra/newview/skins/contrast/textures/icons/paste_clipboard.png
+++ b/indra/newview/skins/gold/textures/icons/paste_clipboard.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/pop_up_caution.png b/indra/newview/skins/gold/textures/icons/pop_up_caution.png
index 63b5cdfe83..63b5cdfe83 100644
--- a/indra/newview/skins/contrast/textures/icons/pop_up_caution.png
+++ b/indra/newview/skins/gold/textures/icons/pop_up_caution.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_beta.png b/indra/newview/skins/gold/textures/icons/profile_badge_beta.png
index 95e277aab0..95e277aab0 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_badge_beta.png
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_beta.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_beta_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.png
index fb145901e2..fb145901e2 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_badge_beta_lifetime.png
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_lifetime.png
index 3f7fd343b3..3f7fd343b3 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_badge_lifetime.png
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_linden.png b/indra/newview/skins/gold/textures/icons/profile_badge_linden.png
index 6ab9fcebea..6ab9fcebea 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_badge_linden.png
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_linden.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_pplus_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.png
index 5c68ad40ce..5c68ad40ce 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_badge_pplus_lifetime.png
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_premium_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.png
index 58957b7b96..58957b7b96 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_badge_premium_lifetime.png
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.png
index 331553492c..331553492c 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off.png
+++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off_pressed.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.png
index e9e9c1b626..e9e9c1b626 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off_pressed.png
+++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.png
index 4f5374d614..4f5374d614 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on.png
+++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on_pressed.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.png
index e8a64541ee..e8a64541ee 100644
--- a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on_pressed.png
+++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/remove_icon.png b/indra/newview/skins/gold/textures/icons/remove_icon.png
index d8a45cc21c..d8a45cc21c 100644
--- a/indra/newview/skins/contrast/textures/icons/remove_icon.png
+++ b/indra/newview/skins/gold/textures/icons/remove_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/see_me_online.png b/indra/newview/skins/gold/textures/icons/see_me_online.png
new file mode 100644
index 0000000000..adc37f5528
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/see_me_online.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/see_on_map.png b/indra/newview/skins/gold/textures/icons/see_on_map.png
new file mode 100644
index 0000000000..73415b9afe
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/see_on_map.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/see_them_on_map.png b/indra/newview/skins/gold/textures/icons/see_them_on_map.png
new file mode 100644
index 0000000000..e5f2978dc0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/see_them_on_map.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/see_them_online.png b/indra/newview/skins/gold/textures/icons/see_them_online.png
new file mode 100644
index 0000000000..7ddd41f9a0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/see_them_online.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/single_folder_back.png b/indra/newview/skins/gold/textures/icons/single_folder_back.png
index b93bb2525a..b93bb2525a 100644
--- a/indra/newview/skins/contrast/textures/icons/single_folder_back.png
+++ b/indra/newview/skins/gold/textures/icons/single_folder_back.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/single_folder_forward.png b/indra/newview/skins/gold/textures/icons/single_folder_forward.png
index 12a21b2bba..12a21b2bba 100644
--- a/indra/newview/skins/contrast/textures/icons/single_folder_forward.png
+++ b/indra/newview/skins/gold/textures/icons/single_folder_forward.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/single_folder_mode.png b/indra/newview/skins/gold/textures/icons/single_folder_mode.png
index 0fc8475917..0fc8475917 100644
--- a/indra/newview/skins/contrast/textures/icons/single_folder_mode.png
+++ b/indra/newview/skins/gold/textures/icons/single_folder_mode.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/single_folder_up.png b/indra/newview/skins/gold/textures/icons/single_folder_up.png
index c1c8c63870..c1c8c63870 100644
--- a/indra/newview/skins/contrast/textures/icons/single_folder_up.png
+++ b/indra/newview/skins/gold/textures/icons/single_folder_up.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/snapshot_icon.png b/indra/newview/skins/gold/textures/icons/snapshot_icon.png
index 9b6ac6eeb0..9b6ac6eeb0 100644
--- a/indra/newview/skins/contrast/textures/icons/snapshot_icon.png
+++ b/indra/newview/skins/gold/textures/icons/snapshot_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/texture_icon.png b/indra/newview/skins/gold/textures/icons/texture_icon.png
index f5c205208c..f5c205208c 100644
--- a/indra/newview/skins/contrast/textures/icons/texture_icon.png
+++ b/indra/newview/skins/gold/textures/icons/texture_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/icons/thumbnail_fallback_icon.png b/indra/newview/skins/gold/textures/icons/thumbnail_fallback_icon.png
index 19629aba04..19629aba04 100644
--- a/indra/newview/skins/contrast/textures/icons/thumbnail_fallback_icon.png
+++ b/indra/newview/skins/gold/textures/icons/thumbnail_fallback_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/unknown_icon.png b/indra/newview/skins/gold/textures/icons/unknown_icon.png
new file mode 100644
index 0000000000..9a4e7f8616
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/unknown_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/jump_left_in.tga b/indra/newview/skins/gold/textures/jump_left_in.tga
index e0656c901d..e0656c901d 100644
--- a/indra/newview/skins/contrast/textures/jump_left_in.tga
+++ b/indra/newview/skins/gold/textures/jump_left_in.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/jump_left_out.tga b/indra/newview/skins/gold/textures/jump_left_out.tga
index fb6dac0c3d..fb6dac0c3d 100644
--- a/indra/newview/skins/contrast/textures/jump_left_out.tga
+++ b/indra/newview/skins/gold/textures/jump_left_out.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/jump_right_in.tga b/indra/newview/skins/gold/textures/jump_right_in.tga
index 010c748c2a..010c748c2a 100644
--- a/indra/newview/skins/contrast/textures/jump_right_in.tga
+++ b/indra/newview/skins/gold/textures/jump_right_in.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/jump_right_out.tga b/indra/newview/skins/gold/textures/jump_right_out.tga
index 33355262d4..33355262d4 100644
--- a/indra/newview/skins/contrast/textures/jump_right_out.tga
+++ b/indra/newview/skins/gold/textures/jump_right_out.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/lag_status_critical.tga b/indra/newview/skins/gold/textures/lag_status_critical.tga
index bbc71d9e77..bbc71d9e77 100644
--- a/indra/newview/skins/contrast/textures/lag_status_critical.tga
+++ b/indra/newview/skins/gold/textures/lag_status_critical.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/lag_status_good.tga b/indra/newview/skins/gold/textures/lag_status_good.tga
index 680ba90f17..680ba90f17 100644
--- a/indra/newview/skins/contrast/textures/lag_status_good.tga
+++ b/indra/newview/skins/gold/textures/lag_status_good.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/lag_status_warning.tga b/indra/newview/skins/gold/textures/lag_status_warning.tga
index 13ce3cc396..13ce3cc396 100644
--- a/indra/newview/skins/contrast/textures/lag_status_warning.tga
+++ b/indra/newview/skins/gold/textures/lag_status_warning.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/legend.tga b/indra/newview/skins/gold/textures/legend.tga
index 0dbb8fda4f..0dbb8fda4f 100644
--- a/indra/newview/skins/contrast/textures/legend.tga
+++ b/indra/newview/skins/gold/textures/legend.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/locked_image.j2c b/indra/newview/skins/gold/textures/locked_image.j2c
index 9e8998d675..9e8998d675 100644
--- a/indra/newview/skins/contrast/textures/locked_image.j2c
+++ b/indra/newview/skins/gold/textures/locked_image.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_avatar_16.tga b/indra/newview/skins/gold/textures/map_avatar_16.tga
index f59e9e9193..f59e9e9193 100644
--- a/indra/newview/skins/contrast/textures/map_avatar_16.tga
+++ b/indra/newview/skins/gold/textures/map_avatar_16.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_avatar_32.tga b/indra/newview/skins/gold/textures/map_avatar_32.tga
index aebeab4093..aebeab4093 100644
--- a/indra/newview/skins/contrast/textures/map_avatar_32.tga
+++ b/indra/newview/skins/gold/textures/map_avatar_32.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_avatar_8.tga b/indra/newview/skins/gold/textures/map_avatar_8.tga
index 8500eadeba..8500eadeba 100644
--- a/indra/newview/skins/contrast/textures/map_avatar_8.tga
+++ b/indra/newview/skins/gold/textures/map_avatar_8.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_avatar_above_32.tga b/indra/newview/skins/gold/textures/map_avatar_above_32.tga
index 65bd0561a7..65bd0561a7 100644
--- a/indra/newview/skins/contrast/textures/map_avatar_above_32.tga
+++ b/indra/newview/skins/gold/textures/map_avatar_above_32.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_avatar_below_32.tga b/indra/newview/skins/gold/textures/map_avatar_below_32.tga
index 496c44b369..496c44b369 100644
--- a/indra/newview/skins/contrast/textures/map_avatar_below_32.tga
+++ b/indra/newview/skins/gold/textures/map_avatar_below_32.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_avatar_unknown_32.tga b/indra/newview/skins/gold/textures/map_avatar_unknown_32.tga
index d1192478c6..d1192478c6 100644
--- a/indra/newview/skins/contrast/textures/map_avatar_unknown_32.tga
+++ b/indra/newview/skins/gold/textures/map_avatar_unknown_32.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_avatar_you_32.tga b/indra/newview/skins/gold/textures/map_avatar_you_32.tga
index 84b57aceaf..84b57aceaf 100644
--- a/indra/newview/skins/contrast/textures/map_avatar_you_32.tga
+++ b/indra/newview/skins/gold/textures/map_avatar_you_32.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_event.tga b/indra/newview/skins/gold/textures/map_event.tga
index 2c06d08fd2..2c06d08fd2 100644
--- a/indra/newview/skins/contrast/textures/map_event.tga
+++ b/indra/newview/skins/gold/textures/map_event.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_home.tga b/indra/newview/skins/gold/textures/map_home.tga
index acaaa3db44..acaaa3db44 100644
--- a/indra/newview/skins/contrast/textures/map_home.tga
+++ b/indra/newview/skins/gold/textures/map_home.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_infohub.tga b/indra/newview/skins/gold/textures/map_infohub.tga
index d0134fa5fe..d0134fa5fe 100644
--- a/indra/newview/skins/contrast/textures/map_infohub.tga
+++ b/indra/newview/skins/gold/textures/map_infohub.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_telehub.tga b/indra/newview/skins/gold/textures/map_telehub.tga
index 545b8e532c..545b8e532c 100644
--- a/indra/newview/skins/contrast/textures/map_telehub.tga
+++ b/indra/newview/skins/gold/textures/map_telehub.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_track_16.tga b/indra/newview/skins/gold/textures/map_track_16.tga
index 451ce24cf0..451ce24cf0 100644
--- a/indra/newview/skins/contrast/textures/map_track_16.tga
+++ b/indra/newview/skins/gold/textures/map_track_16.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_ui_collapse_icon.png b/indra/newview/skins/gold/textures/map_ui_collapse_icon.png
index e4de49d4af..e4de49d4af 100644
--- a/indra/newview/skins/contrast/textures/map_ui_collapse_icon.png
+++ b/indra/newview/skins/gold/textures/map_ui_collapse_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/map_ui_expand_icon.png b/indra/newview/skins/gold/textures/map_ui_expand_icon.png
index 08734b4cc0..08734b4cc0 100644
--- a/indra/newview/skins/contrast/textures/map_ui_expand_icon.png
+++ b/indra/newview/skins/gold/textures/map_ui_expand_icon.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/materials_ui_x_24.png b/indra/newview/skins/gold/textures/materials_ui_x_24.png
index 6d88554914..6d88554914 100644
--- a/indra/newview/skins/contrast/textures/materials_ui_x_24.png
+++ b/indra/newview/skins/gold/textures/materials_ui_x_24.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/megapahit/icon_group.png b/indra/newview/skins/gold/textures/megapahit/icon_group.png
new file mode 100644
index 0000000000..f3872dea3f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/megapahit/icon_group.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/megapahit/icon_land_auction.png b/indra/newview/skins/gold/textures/megapahit/icon_land_auction.png
new file mode 100644
index 0000000000..550703968f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/megapahit/icon_land_auction.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/megapahit/icon_land_forsale.png b/indra/newview/skins/gold/textures/megapahit/icon_land_forsale.png
new file mode 100644
index 0000000000..209bb868ea
--- /dev/null
+++ b/indra/newview/skins/gold/textures/megapahit/icon_land_forsale.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/megapahit/icon_place.png b/indra/newview/skins/gold/textures/megapahit/icon_place.png
new file mode 100644
index 0000000000..60cf42424a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/megapahit/icon_place.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/menu_separator.png b/indra/newview/skins/gold/textures/menu_separator.png
index 7bb27c499d..7bb27c499d 100644
--- a/indra/newview/skins/contrast/textures/menu_separator.png
+++ b/indra/newview/skins/gold/textures/menu_separator.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/missing_asset.tga b/indra/newview/skins/gold/textures/missing_asset.tga
index 9a43f4db5d..9a43f4db5d 100644
--- a/indra/newview/skins/contrast/textures/missing_asset.tga
+++ b/indra/newview/skins/gold/textures/missing_asset.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/model_wizard/progress_bar_bg.png b/indra/newview/skins/gold/textures/model_wizard/progress_bar_bg.png
new file mode 100644
index 0000000000..7c6920205f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/model_wizard/progress_bar_bg.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/model_wizard/progress_light.png b/indra/newview/skins/gold/textures/model_wizard/progress_light.png
new file mode 100755
index 0000000000..41de60badf
--- /dev/null
+++ b/indra/newview/skins/gold/textures/model_wizard/progress_light.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Arrow_Left_Off.png b/indra/newview/skins/gold/textures/navbar/Arrow_Left_Off.png
index 19569501fe..19569501fe 100644
--- a/indra/newview/skins/contrast/textures/navbar/Arrow_Left_Off.png
+++ b/indra/newview/skins/gold/textures/navbar/Arrow_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Arrow_Right_Off.png b/indra/newview/skins/gold/textures/navbar/Arrow_Right_Off.png
index 3648c42656..3648c42656 100644
--- a/indra/newview/skins/contrast/textures/navbar/Arrow_Right_Off.png
+++ b/indra/newview/skins/gold/textures/navbar/Arrow_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/BuyArrow_Off.png b/indra/newview/skins/gold/textures/navbar/BuyArrow_Off.png
new file mode 100755
index 0000000000..e7203bcb45
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/BuyArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/BuyArrow_Over.png b/indra/newview/skins/gold/textures/navbar/BuyArrow_Over.png
new file mode 100755
index 0000000000..75f33d1c1b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/BuyArrow_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/BuyArrow_Press.png b/indra/newview/skins/gold/textures/navbar/BuyArrow_Press.png
new file mode 100755
index 0000000000..e0924e56b7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/BuyArrow_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Favorite_Link_Over.png b/indra/newview/skins/gold/textures/navbar/Favorite_Link_Over.png
index d4f126f969..d4f126f969 100644
--- a/indra/newview/skins/contrast/textures/navbar/Favorite_Link_Over.png
+++ b/indra/newview/skins/gold/textures/navbar/Favorite_Link_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Favorite_Star_Active.png b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Active.png
new file mode 100644
index 0000000000..e662ca9577
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Active.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Favorite_Star_Off.png b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Off.png
new file mode 100644
index 0000000000..82d044d817
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Favorite_Star_Over.png b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Over.png
new file mode 100644
index 0000000000..03fef8334f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Favorite_Star_Press.png b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Press.png
new file mode 100644
index 0000000000..6670667022
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/FileMenu_Divider.png b/indra/newview/skins/gold/textures/navbar/FileMenu_Divider.png
index 5ab4abc5b8..5ab4abc5b8 100644
--- a/indra/newview/skins/contrast/textures/navbar/FileMenu_Divider.png
+++ b/indra/newview/skins/gold/textures/navbar/FileMenu_Divider.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Flag.png b/indra/newview/skins/gold/textures/navbar/Flag.png
index df53c89224..df53c89224 100644
--- a/indra/newview/skins/contrast/textures/navbar/Flag.png
+++ b/indra/newview/skins/gold/textures/navbar/Flag.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Help_Press.png b/indra/newview/skins/gold/textures/navbar/Help_Press.png
index ed3695f9d5..ed3695f9d5 100644
--- a/indra/newview/skins/contrast/textures/navbar/Help_Press.png
+++ b/indra/newview/skins/gold/textures/navbar/Help_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Home_Off.png b/indra/newview/skins/gold/textures/navbar/Home_Off.png
index fe3bc63b77..fe3bc63b77 100644
--- a/indra/newview/skins/contrast/textures/navbar/Home_Off.png
+++ b/indra/newview/skins/gold/textures/navbar/Home_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Info_Off.png b/indra/newview/skins/gold/textures/navbar/Info_Off.png
new file mode 100644
index 0000000000..07b65ddf8b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Info_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Info_Over.png b/indra/newview/skins/gold/textures/navbar/Info_Over.png
new file mode 100644
index 0000000000..fb7ff78fa4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Info_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Info_Press.png b/indra/newview/skins/gold/textures/navbar/Info_Press.png
new file mode 100644
index 0000000000..93e82f270b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Info_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Landmarks.png b/indra/newview/skins/gold/textures/navbar/Landmarks.png
index 2b35de913b..2b35de913b 100644
--- a/indra/newview/skins/contrast/textures/navbar/Landmarks.png
+++ b/indra/newview/skins/gold/textures/navbar/Landmarks.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Lock.png b/indra/newview/skins/gold/textures/navbar/Lock.png
index cf569d6ad2..cf569d6ad2 100644
--- a/indra/newview/skins/contrast/textures/navbar/Lock.png
+++ b/indra/newview/skins/gold/textures/navbar/Lock.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/NavBar_BG.png b/indra/newview/skins/gold/textures/navbar/NavBar_BG.png
new file mode 100644
index 0000000000..6a91700ae0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/NavBar_BG.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoFav_Bevel.png b/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoFav_Bevel.png
new file mode 100644
index 0000000000..c61dcde58c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoFav_Bevel.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoNav_Bevel.png b/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoNav_Bevel.png
new file mode 100644
index 0000000000..9e3da34596
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoNav_Bevel.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Row_Selection.png b/indra/newview/skins/gold/textures/navbar/Row_Selection.png
new file mode 100644
index 0000000000..cfc31f8d32
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Row_Selection.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/navbar/Search.png b/indra/newview/skins/gold/textures/navbar/Search.png
index 4c29e57f7b..4c29e57f7b 100644
--- a/indra/newview/skins/contrast/textures/navbar/Search.png
+++ b/indra/newview/skins/gold/textures/navbar/Search.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/separator.png b/indra/newview/skins/gold/textures/navbar/separator.png
new file mode 100644
index 0000000000..c1d74e5a64
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/separator.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/notify_caution_icon.tga b/indra/newview/skins/gold/textures/notify_caution_icon.tga
index abc23d1d7a..abc23d1d7a 100644
--- a/indra/newview/skins/contrast/textures/notify_caution_icon.tga
+++ b/indra/newview/skins/gold/textures/notify_caution_icon.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/pixiesmall.j2c b/indra/newview/skins/gold/textures/pixiesmall.j2c
index a1ff64014b..a1ff64014b 100644
--- a/indra/newview/skins/contrast/textures/pixiesmall.j2c
+++ b/indra/newview/skins/gold/textures/pixiesmall.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/red_x.png b/indra/newview/skins/gold/textures/red_x.png
index a61202f09b..a61202f09b 100644
--- a/indra/newview/skins/contrast/textures/red_x.png
+++ b/indra/newview/skins/gold/textures/red_x.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/rounded_square.j2c b/indra/newview/skins/gold/textures/rounded_square.j2c
index c8bb572fa9..c8bb572fa9 100644
--- a/indra/newview/skins/contrast/textures/rounded_square.j2c
+++ b/indra/newview/skins/gold/textures/rounded_square.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/script_error.j2c b/indra/newview/skins/gold/textures/script_error.j2c
index 893cb642e7..893cb642e7 100644
--- a/indra/newview/skins/contrast/textures/script_error.j2c
+++ b/indra/newview/skins/gold/textures/script_error.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/silhouette.j2c b/indra/newview/skins/gold/textures/silhouette.j2c
index 3859d4cb34..3859d4cb34 100644
--- a/indra/newview/skins/contrast/textures/silhouette.j2c
+++ b/indra/newview/skins/gold/textures/silhouette.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/slim_icon_16_viewer.tga b/indra/newview/skins/gold/textures/slim_icon_16_viewer.tga
index 552181d36a..552181d36a 100644
--- a/indra/newview/skins/contrast/textures/slim_icon_16_viewer.tga
+++ b/indra/newview/skins/gold/textures/slim_icon_16_viewer.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/snapshot_download.png b/indra/newview/skins/gold/textures/snapshot_download.png
index 6aa1abded5..6aa1abded5 100644
--- a/indra/newview/skins/contrast/textures/snapshot_download.png
+++ b/indra/newview/skins/gold/textures/snapshot_download.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/snapshot_email.png b/indra/newview/skins/gold/textures/snapshot_email.png
index dee784a9bf..dee784a9bf 100644
--- a/indra/newview/skins/contrast/textures/snapshot_email.png
+++ b/indra/newview/skins/gold/textures/snapshot_email.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/spacer24.tga b/indra/newview/skins/gold/textures/spacer24.tga
index c7cab6b38c..c7cab6b38c 100644
--- a/indra/newview/skins/contrast/textures/spacer24.tga
+++ b/indra/newview/skins/gold/textures/spacer24.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/tabarea.tga b/indra/newview/skins/gold/textures/tabarea.tga
index 5517aebfc8..5517aebfc8 100644
--- a/indra/newview/skins/contrast/textures/tabarea.tga
+++ b/indra/newview/skins/gold/textures/tabarea.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/Activate_Checkmark.png b/indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.png
index 213acbe87b..213acbe87b 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/Activate_Checkmark.png
+++ b/indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png
index 4e59042e33..4e59042e33 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png
+++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Press.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.png
index be7b298bb8..be7b298bb8 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Press.png
+++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png
index 1e234ff09b..1e234ff09b 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png
+++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Press.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.png
index 48c78b453d..48c78b453d 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Press.png
+++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Close_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.png
index bc4e00c646..bc4e00c646 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Close_Off.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Home_Selected.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.png
index 293aeef5e6..293aeef5e6 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Home_Selected.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Me_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.png
index 760db9360d..760db9360d 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Me_Off.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Open_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.png
index 4556602f58..4556602f58 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Open_Off.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_People_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.png
index 691b600510..691b600510 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_People_Off.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Places_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.png
index f5a5f7a846..f5a5f7a846 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Places_Off.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Things_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.png
index e56eda9802..e56eda9802 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Things_Off.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Off.png b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.png
index 4ed7a2b183..4ed7a2b183 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Off.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Selected.png b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.png
index b3316386b9..b3316386b9 100644
--- a/indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Selected.png
+++ b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/tearoff_pressed.tga b/indra/newview/skins/gold/textures/tearoff_pressed.tga
index 620d109de0..620d109de0 100644
--- a/indra/newview/skins/contrast/textures/tearoff_pressed.tga
+++ b/indra/newview/skins/gold/textures/tearoff_pressed.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/tearoffbox.tga b/indra/newview/skins/gold/textures/tearoffbox.tga
index 0670d2e91b..0670d2e91b 100644
--- a/indra/newview/skins/contrast/textures/tearoffbox.tga
+++ b/indra/newview/skins/gold/textures/tearoffbox.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/textures.xml b/indra/newview/skins/gold/textures/textures.xml
new file mode 100644
index 0000000000..1fe1ff333a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/textures.xml
@@ -0,0 +1,934 @@
+<!--
+This file contains metadata about how to load, display, and scale textures for rendering in the UI.
+Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
+to them by filename (relative to textures directory).
+NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry
+with the same filename but different name
+
+<texture
+ name="MyTexture" (mandatory)
+ - this is the name you reference the texture by in XUI. For example, <button image_unselected="MyTexture"/>
+ file_name="images/my_texture.png" (optional)
+ - this is the path to the actual file asset, relative to the current skins "textures" directory.
+ If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case.
+ NOTE: you need to provide an extension on the filename (".png", ".tga", ".jpg") for us to decode the image properly
+ preload="true" (optional, false by default)
+ - If true, we will attempt to load the image before displaying any UI.
+ If false, we will load in the background after initializing the UI.
+ use_mips="true" (currently unused)
+ scale.left="1"
+ scale.bottom="1"
+ scale.top="15"
+ scale.right="31"
+ - Specifies the segmentation for 9-slice image scaling. Specifically, the pixel offsets from the LOWER LEFT corner
+ that define the region of the image that is stretched to make the whole image fit in the required space.
+ In this example, if the source image is 32x16 pixels, we have defined a center region that starts one pixel up
+ and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left
+ corner. The end result is that the image will keep a 1 pixel border all around while stretching to fit the required
+ region.
+-->
+
+<textures version="101">
+ <!-- Please add new files alphabetically to prevent merge conflicts. JC -->
+ <texture name="Accordion_ArrowClosed_Off" file_name="containers/Accordion_ArrowClosed_Off.png" preload="false" />
+ <texture name="Accordion_ArrowClosed_Press" file_name="containers/Accordion_ArrowClosed_Press.png" preload="false" />
+ <texture name="Accordion_ArrowOpened_Off" file_name="containers/Accordion_ArrowOpened_Off.png" preload="false" />
+ <texture name="Accordion_ArrowOpened_Press" file_name="containers/Accordion_ArrowOpened_Press.png" preload="false" />
+ <texture name="Accordion_Off" file_name="containers/Accordion_Off.png" preload="false" />
+ <texture name="Accordion_Press" file_name="containers/Accordion_Press.png" preload="false" />
+ <texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" />
+ <texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" />
+
+ <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
+
+ <texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" />
+ <texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" />
+ <texture name="AddItem_Press" file_name="icons/AddItem_Press.png" preload="false" />
+
+ <texture name="add_payment_image_center" file_name="windows/add_payment_image_center.png" preload="true" />
+ <texture name="add_payment_image_left" file_name="windows/add_payment_image_left.png" preload="true" />
+ <texture name="add_payment_image_right" file_name="windows/add_payment_image_right.png" preload="true" />
+
+ <texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" />
+ <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
+
+ <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
+ <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
+ <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
+
+ <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
+ <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
+ <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
+ <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
+
+ <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
+ <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
+ <texture name="VoiceMute_Off" file_name="icons/VoiceMute_Off.png" preload="false" />
+
+ <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
+ <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
+
+ <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
+
+ <texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
+ <texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
+ <texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
+
+ <texture name="Error_Tag_Background" file_name="widgets/Error_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="New_Tag_Background" file_name="widgets/New_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="New_Tag_Border" file_name="widgets/New_Tag_Border.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+
+ <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="Badge_Border" file_name="widgets/Badge_Border.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+
+ <texture name="Blank" file_name="Blank.png" preload="false" />
+
+ <texture name="BreadCrumbBtn_Left_Disabled" file_name="widgets/BreadCrumbBtn_Left_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Off" file_name="widgets/BreadCrumbBtn_Left_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Over" file_name="widgets/BreadCrumbBtn_Left_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Press" file_name="widgets/BreadCrumbBtn_Left_Press.png" preload="false"/>
+
+ <texture name="BreadCrumbBtn_Middle_Disabled" file_name="widgets/BreadCrumbBtn_Middle_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Off" file_name="widgets/BreadCrumbBtn_Middle_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Over" file_name="widgets/BreadCrumbBtn_Middle_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Press" file_name="widgets/BreadCrumbBtn_Middle_Press.png" preload="false"/>
+
+ <texture name="BreadCrumbBtn_Right_Disabled" file_name="widgets/BreadCrumbBtn_Right_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Off" file_name="widgets/BreadCrumbBtn_Right_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Over" file_name="widgets/BreadCrumbBtn_Right_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Press" file_name="widgets/BreadCrumbBtn_Right_Press.png" preload="false"/>
+
+ <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="0" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+
+ <texture name="Cam_Avatar_Off" file_name="bottomtray/Cam_Avatar_Off.png" preload="true" />
+ <texture name="Cam_FreeCam_Off" file_name="bottomtray/Cam_FreeCam_Off.png" preload="false" />
+ <texture name="Cam_Orbit_Off" file_name="bottomtray/Cam_Orbit_Off.png" preload="false" />
+ <texture name="Cam_Pan_Off" file_name="bottomtray/Cam_Pan_Off.png" preload="false" />
+
+ <texture name="Cam_Preset_Back_Off" file_name="bottomtray/Cam_Preset_Back_Off.png" preload="false" />
+ <texture name="Cam_Preset_Back_On" file_name="bottomtray/Cam_Preset_Back_On.png" preload="false" />
+ <texture name="Cam_Preset_Eye_Off" file_name="bottomtray/Cam_Preset_Eye_Off.png" preload="false" />
+ <texture name="Cam_Preset_Front_Off" file_name="bottomtray/Cam_Preset_Front_Off.png" preload="false" />
+ <texture name="Cam_Preset_Front_On" file_name="bottomtray/Cam_Preset_Front_On.png" preload="false" />
+ <texture name="Cam_Preset_Side_Off" file_name="bottomtray/Cam_Preset_Side_Off.png" preload="false" />
+ <texture name="Cam_Preset_Side_On" file_name="bottomtray/Cam_Preset_Side_On.png" preload="false" />
+
+ <texture name="Cam_Rotate_In" file_name="bottomtray/Cam_Rotate_In.png" preload="false" />
+ <texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" />
+ <texture name="Cam_Rotate_Center" file_name="bottomtray/Cam_Rotate_Center.png" preload="false" />
+ <texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" />
+ <texture name="Cam_Tracking_Out" file_name="bottomtray/Cam_Tracking_Out.png" preload="false" />
+ <texture name="Cam_Tracking_Center" file_name="bottomtray/Cam_Tracking_Center.png" preload="false" />
+
+ <texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" />
+ <texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" />
+ <texture name="Checkbox_Off" file_name="widgets/Checkbox_Off.png" preload="true" />
+ <texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />
+ <texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />
+ <texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
+ <texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" />
+
+ <texture name="Checker" file_name="checker.png" preload="false" />
+
+ <texture name="Command_360_Capture_Icon" file_name="toolbar_icons/360_capture.png" preload="true" />
+ <texture name="Command_AboutLand_Icon" file_name="toolbar_icons/land.png" preload="true" />
+ <texture name="Command_Appearance_Icon" file_name="toolbar_icons/appearance.png" preload="true" />
+ <texture name="Command_Avatar_Icon" file_name="toolbar_icons/avatars.png" preload="true" />
+ <texture name="Command_Build_Icon" file_name="toolbar_icons/build.png" preload="true" />
+ <texture name="Command_Chat_Icon" file_name="toolbar_icons/chat.png" preload="true" />
+ <texture name="Command_Compass_Icon" file_name="toolbar_icons/land.png" preload="true" />
+ <texture name="Command_Destinations_Icon" file_name="toolbar_icons/destinations.png" preload="true" />
+ <texture name="Command_Gestures_Icon" file_name="toolbar_icons/gestures.png" preload="true" />
+ <texture name="Command_Grid_Status_Icon" file_name="toolbar_icons/grid_status.png" preload="true" />
+ <texture name="Command_HowTo_Icon" file_name="toolbar_icons/howto.png" preload="true" />
+ <texture name="Command_Inventory_Icon" file_name="toolbar_icons/inventory.png" preload="true" />
+ <texture name="Command_Map_Icon" file_name="toolbar_icons/map.png" preload="true" />
+ <texture name="Command_Marketplace_Icon" file_name="toolbar_icons/marketplace.png" preload="true" />
+ <texture name="Command_MktListings_Icon" file_name="toolbar_icons/mktlistings.png" preload="true" />
+ <texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" />
+ <texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" />
+ <texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
+ <texture name="Command_Environments_Icon" file_name="toolbar_icons/environments.png" preload="true" />
+ <texture name="Command_People_Icon" file_name="toolbar_icons/people.png" preload="true" />
+ <texture name="Command_Performance_Icon" file_name="toolbar_icons/performance.png" preload="true" />
+ <texture name="Command_Picks_Icon" file_name="toolbar_icons/picks.png" preload="true" />
+ <texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" />
+ <texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" />
+ <texture name="Command_Profile_Icon" file_name="toolbar_icons/profile.png" preload="true" />
+ <texture name="Command_Report_Abuse_Icon" file_name="toolbar_icons/report_abuse.png" preload="true" />
+ <texture name="Command_Search_Icon" file_name="toolbar_icons/search.png" preload="true" />
+ <texture name="Command_Snapshot_Icon" file_name="toolbar_icons/snapshot.png" preload="true" />
+ <texture name="Command_Speak_Icon" file_name="toolbar_icons/speak.png" preload="true" />
+ <texture name="Command_View_Icon" file_name="toolbar_icons/view.png" preload="true" />
+ <texture name="Command_Voice_Icon" file_name="toolbar_icons/nearbyvoice.png" preload="true" />
+ <texture name="Command_FavoriteFolder_Icon" file_name="toolbar_icons/favorite_folder.png" preload="true" />
+ <texture name="Command_Resync_Animations" file_name="toolbar_icons/resync_animations.png" preload="true" />
+ <texture name="Caret_Bottom_Icon" file_name="toolbar_icons/caret_bottom.png" preload="true" scale.left="1" scale.top="23" scale.right="15" scale.bottom="1" />
+ <texture name="Caret_Right_Icon" file_name="toolbar_icons/caret_right.png" preload="true" scale.left="5" scale.top="15" scale.right="28" scale.bottom="1" />
+ <texture name="Caret_Left_Icon" file_name="toolbar_icons/caret_left.png" preload="true" scale.left="1" scale.top="15" scale.right="23" scale.bottom="1" />
+
+ <texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+
+ <texture name="Container" file_name="containers/Container.png" preload="false" />
+
+ <texture name="Conv_toolbar_add_person" file_name="icons/Conv_toolbar_add_person.png" preload="false" />
+ <texture name="Conv_toolbar_arrow_ne" file_name="icons/Conv_toolbar_arrow_ne.png" preload="false" />
+ <texture name="Conv_toolbar_arrow_sw" file_name="icons/Conv_toolbar_arrow_sw.png" preload="false" />
+ <texture name="Conv_toolbar_call_log" file_name="icons/Conv_toolbar_call_log.png" preload="false" />
+ <texture name="Conv_toolbar_close" file_name="icons/Conv_toolbar_close.png" preload="false" />
+ <texture name="Conv_toolbar_collapse" file_name="icons/Conv_toolbar_collapse.png" preload="false" />
+ <texture name="Conv_collapse_to_one_line" file_name="icons/collapse_to_one_line.png" preload="false" />
+ <texture name="Conv_expand_one_line" file_name="icons/expand_one_liner.png" preload="false" />
+ <texture name="Conv_toolbar_expand" file_name="icons/Conv_toolbar_expand.png" preload="false" />
+ <texture name="Conv_toolbar_hang_up" file_name="icons/Conv_toolbar_hang_up.png" preload="false" />
+ <texture name="Conv_toolbar_open_call" file_name="icons/Conv_toolbar_open_call.png" preload="false" />
+ <texture name="Conv_toolbar_plus" file_name="icons/Conv_toolbar_plus.png" preload="false" />
+ <texture name="Conv_toolbar_sort" file_name="icons/Conv_toolbar_sort.png" preload="false" />
+ <texture name="Conv_log_inbox" file_name="icons/Conv_log_inbox.png" preload="false" />
+
+ <texture name="Copy" file_name="icons/Copy.png" preload="false" />
+ <texture name="CopyBright" file_name="icons/CopyBright.png" preload="false" />
+
+ <texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
+
+ <texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
+ <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
+ <texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
+ <texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />
+
+ <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+
+ <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
+
+ <texture name="Emoji_Picker_Icon" file_name="icons/emoji_picker_icon.png" preload="true" />
+ <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" />
+ <texture name="Edit_Wrench" file_name="icons/Edit_Wrench.png" preload="false" />
+
+ <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" />
+
+ <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" />
+ <texture name="Presets_Icon_Graphic" file_name="icons/Presets_Icon_Graphic.png" preload="true" />
+ <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
+ <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
+ <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" />
+ <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" />
+ <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" />
+
+
+ <texture name="Flag" file_name="navbar/Flag.png" preload="false" />
+
+ <texture name="Flyout_Left" file_name="windows/Flyout_Left.png" preload="false" />
+ <texture name="Flyout_Pointer" file_name="windows/Flyout_Pointer.png" preload="false" />
+ <texture name="Flyout_Right" file_name="windows/Flyout_Right.png" preload="false" />
+
+ <texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" />
+ <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
+ <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
+ <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
+
+ <texture name="Generic_Experience" file_name="Blank.png" preload="false" />
+ <texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
+ <texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
+ <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" />
+ <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" />
+ <texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
+ <texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
+
+ <texture name="Group_Notices" file_name="icons/Group_Notices.png" preload="false" />
+
+ <texture name="Hand" file_name="icons/hand.png" preload="false" />
+
+ <texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" />
+
+ <texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" />
+ <texture name="Hierarchy_View_On" file_name="icons/Hierarchy_View_On.png" preload="false" />
+
+
+ <texture name="Home_Off" file_name="navbar/Home_Off.png" preload="false" />
+ <texture name="Horizontal Drag Handle" file_name="widgets/horizontal_drag_handle.png" scale.left="8" scale.right="120" scale.bottom="1" scale.top="6" scale_type="scale_outer"/>
+
+ <texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" />
+ <texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" />
+ <texture name="Icon_Close_Toast" file_name="windows/Icon_Close_Toast.png" preload="true" />
+
+ <texture name="Icon_Copy" file_name="icons/copy_clipboard.png" preload="true" />
+
+ <texture name="Icon_Delete" file_name="icons/delete_icon.png" preload="true" />
+
+ <texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" />
+ <texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" />
+
+ <texture name="Icon_File_Upload" file_name="icons/file_upload.png" preload="true" />
+
+ <texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" />
+
+ <texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" />
+ <texture name="Icon_Gear_Foreground" file_name="windows/Icon_Gear_Foreground.png" preload="false" />
+ <texture name="Icon_Gear_Press" file_name="windows/Icon_Gear_Press.png" preload="false" />
+ <texture name="Icon_Gear" file_name="windows/Icon_Gear.png" preload="false" />
+
+ <texture name="Icon_Help_Foreground" file_name="windows/Icon_Help_Foreground.png" preload="true" />
+ <texture name="Icon_Help_Press" file_name="windows/Icon_Help_Press.png" preload="true" />
+
+ <texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" />
+ <texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" />
+
+ <texture name="Icon_Paste" file_name="icons/paste_clipboard.png" preload="true" />
+
+ <texture name="Icon_Restore_Foreground" file_name="windows/Icon_Restore_Foreground.png" preload="false" />
+ <texture name="Icon_Restore_Press" file_name="windows/Icon_Restore_Press.png" preload="false" />
+
+ <texture name="Icon_Snapshot" file_name="icons/snapshot_icon.png" preload="true" />
+
+ <texture name="Icon_Use_Texture" file_name="icons/texture_icon.png" preload="true" />
+
+ <texture name="Info" file_name="icons/Info.png" preload="false" />
+ <texture name="Info_Small" file_name="icons/Info_Small.png" preload="false" />
+ <texture name="Info_Off" file_name="navbar/Info_Off.png" preload="false" />
+ <texture name="Info_Over" file_name="icons/Info_Over.png" preload="false" />
+ <texture name="Info_Press" file_name="navbar/Info_Press.png" preload="false" />
+
+ <texture name="Inspector_Background" file_name="windows/Inspector_Background.png" preload="false"
+ scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
+ <texture name="Inspector_Hover" file_name="windows/Inspector_Hover.png" preload="false" />
+ <texture name="Inspector_I" file_name="windows/Inspector_I.png" preload="false" />
+
+ <texture name="Inv_Alpha" file_name="icons/Inv_Alpha.png" preload="false" />
+ <texture name="Inv_Animation" file_name="icons/Inv_Animation.png" preload="false" />
+ <texture name="Inv_BodyShape" file_name="icons/Inv_BodyShape.png" preload="false" />
+ <texture name="Inv_CallingCard" file_name="icons/Inv_CallingCard.png" preload="false" />
+ <texture name="Inv_Clothing" file_name="icons/Inv_Clothing.png" preload="false" />
+ <texture name="Inv_Eye" file_name="icons/Inv_Eye.png" preload="false" />
+ <texture name="Inv_FolderClosed" file_name="icons/Inv_FolderClosed.png" preload="false" />
+ <texture name="Inv_FolderOpen" file_name="icons/Inv_FolderOpen.png" preload="false" />
+ <texture name="Inv_Gesture" file_name="icons/Inv_Gesture.png" preload="false" />
+ <texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />
+ <texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />
+ <texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" />
+ <texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" />
+ <texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />
+ <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
+ <texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" />
+ <texture name="Inv_LostClosed" file_name="icons/Inv_LostClosed.png" preload="false" />
+ <texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" />
+ <texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
+ <texture name="Inv_Material" file_name="icons/Inv_Material.png" preload="false" />
+ <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" />
+ <texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
+ <texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
+ <texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" />
+ <texture name="Inv_Pants" file_name="icons/Inv_Pants.png" preload="false" />
+ <texture name="Inv_Script" file_name="icons/Inv_Script.png" preload="false" />
+ <texture name="Inv_Shirt" file_name="icons/Inv_Shirt.png" preload="false" />
+ <texture name="Inv_Shoe" file_name="icons/Inv_Shoe.png" preload="false" />
+ <texture name="Inv_Skin" file_name="icons/Inv_Skin.png" preload="false" />
+ <texture name="Inv_Skirt" file_name="icons/Inv_Skirt.png" preload="false" />
+ <texture name="Inv_Snapshot" file_name="icons/Inv_Snapshot.png" preload="false" />
+ <texture name="Inv_Socks" file_name="icons/Inv_Socks.png" preload="false" />
+ <texture name="Inv_Sound" file_name="icons/Inv_Sound.png" preload="false" />
+ <texture name="Inv_StockFolderClosed" file_name="icons/Inv_StockFolderClosed.png" preload="false" />
+ <texture name="Inv_StockFolderOpen" file_name="icons/Inv_StockFolderOpen.png" preload="false" />
+ <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
+ <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
+ <texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
+ <texture name="Inv_Universal" file_name="icons/Inv_Universal.png" preload="false" />
+ <texture name="Inv_Physics" file_name="icons/Inv_Physics.png" preload="false" />
+ <texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" />
+ <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" />
+ <texture name="Inv_TrashOpen" file_name="icons/Inv_TrashOpen.png" preload="false" />
+ <texture name="Inv_Underpants" file_name="icons/Inv_Underpants.png" preload="false" />
+ <texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" />
+ <texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" />
+ <texture name="Inv_Settings" file_name="icons/Inv_Settings.png" preload="false" />
+ <texture name="Inv_SettingsSky" file_name="icons/Inv_SettingsSky.png" preload="false" />
+ <texture name="Inv_SettingsWater" file_name="icons/Inv_SettingsWater.png" preload="false" />
+ <texture name="Inv_SettingsDay" file_name="icons/Inv_SettingsDay.png" preload="false" />
+
+ <texture name="Inv_Invalid" file_name="icons/Inv_Invalid.png" preload="false" />
+ <texture name="Inv_Unknown" file_name="icons/Inv_UnknownObject.png" preload="false" />
+ <texture name="Inv_VersionFolderClosed" file_name="icons/Inv_VersionFolderClosed.png" preload="false" />
+ <texture name="Inv_VersionFolderOpen" file_name="icons/Inv_VersionFolderOpen.png" preload="false" />
+
+ <texture name="Inv_Toolbar_SearchVisibility" file_name="icons/Inv_Toolbar_SearchVisibility.png" preload="false" />
+
+ <texture name="Landmarks_overlay" file_name="navbar/Landmarks.png" preload="false" />
+
+ <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>
+ <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/>
+
+ <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+ <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+
+ <texture name="List_View_Disabled" file_name="icons/List_View_Disabled.png" preload="false" />
+ <texture name="List_View_On" file_name="icons/List_View_On.png" preload="false" />
+
+ <texture name="Lock" file_name="icons/Lock.png" preload="false" />
+ <texture name="Lock2" file_name="navbar/Lock.png" preload="false" />
+
+ <texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" />
+
+ <texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" />
+
+ <texture name="Marketplace_Dropzone_Background" file_name="widgets/Marketplace_Dropzone_Background.png" preload="true" />
+ <texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
+ <texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
+
+ <texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" />
+
+ <texture name="MinusItem_Disabled" file_name="icons/MinusItem_Disabled.png" preload="false" />
+ <texture name="MinusItem_Off" file_name="icons/MinusItem_Off.png" preload="false" />
+ <texture name="MinusItem_Press" file_name="icons/MinusItem_Press.png" preload="false" />
+
+ <texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" />
+
+ <texture name="ModelImport_Status_Good" file_name="green_checkmark.png" preload="false"/>
+ <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/>
+ <texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/>
+
+ <texture name="MouseLook_View_Off" file_name="bottomtray/Mouselook_View_Off.png" preload="false" />
+ <texture name="MouseLook_View_On" file_name="bottomtray/Mouselook_View_On.png" preload="false" />
+
+ <texture name="Move_Fly_Off" file_name="bottomtray/Move_Fly_Off.png" preload="false" />
+ <texture name="Move_Run_Off" file_name="bottomtray/Move_Run_Off.png" preload="false" />
+ <texture name="Move_Walk_Off" file_name="bottomtray/Move_Walk_Off.png" preload="false" />
+ <texture name="Movement_Backward_Off" file_name="bottomtray/Movement_Backward_Off.png" preload="false" />
+ <texture name="Movement_Backward_On" file_name="bottomtray/Movement_Backward_On.png" preload="false" />
+ <texture name="Movement_Down_Off" file_name="bottomtray/Movement_Down_Off.png" preload="false" />
+ <texture name="Movement_Down_On" file_name="bottomtray/Movement_Down_On.png" preload="false" />
+ <texture name="Movement_Forward_Off" file_name="bottomtray/Movement_Forward_Off.png" preload="false" />
+ <texture name="Movement_Forward_On" file_name="bottomtray/Movement_Forward_On.png" preload="false" />
+ <texture name="Movement_Left_Off" file_name="bottomtray/Movement_Left_Off.png" preload="false" />
+ <texture name="Movement_Left_On" file_name="bottomtray/Movement_Left_On.png" preload="false" />
+ <texture name="Movement_Right_Off" file_name="bottomtray/Movement_Right_Off.png" preload="false" />
+ <texture name="Movement_Right_On" file_name="bottomtray/Movement_Right_On.png" preload="false" />
+ <texture name="Movement_TurnLeft_Off" file_name="bottomtray/Movement_TurnLeft_Off.png" preload="false" />
+ <texture name="Movement_TurnLeft_On" file_name="bottomtray/Movement_TurnLeft_On.png" preload="false" />
+ <texture name="Movement_TurnRight_Off" file_name="bottomtray/Movement_TurnRight_Off.png" preload="false" />
+ <texture name="Movement_TurnRight_On" file_name="bottomtray/Movement_TurnRight_On.png" preload="false" />
+ <texture name="Movement_Up_Off" file_name="bottomtray/Movement_Up_Off.png" preload="false" />
+ <texture name="Movement_Up_On" file_name="bottomtray/Movement_Up_On.png" preload="false" />
+
+ <texture name="NavBar_BG" file_name="navbar/NavBar_BG.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="NavBar_BG_NoFav_Bevel" file_name="navbar/NavBar_BG_NoFav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="NavBar_BG_NoNav_Bevel" file_name="navbar/NavBar_BG_NoNav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+
+ <texture name="Nearby_chat_icon" file_name="icons/nearby_chat_icon.png" preload="false" />
+
+ <texture name="Notices_Unread" file_name="bottomtray/Notices_Unread.png" preload="true" />
+
+ <texture name="NoEntryLines" file_name="world/NoEntryLines.png" use_mips="true" preload="false" />
+ <texture name="NoEntryPassLines" file_name="world/NoEntryPassLines.png" use_mips="true" preload="false" />
+
+ <texture name="Object_Cone" file_name="build/Object_Cone.png" preload="false" />
+ <texture name="Object_Cone_Selected" file_name="build/Object_Cone_Selected.png" preload="false" />
+ <texture name="Object_Cube" file_name="build/Object_Cube.png" preload="false" />
+ <texture name="Object_Cube_Selected" file_name="build/Object_Cube_Selected.png" preload="false" />
+ <texture name="Object_Cylinder" file_name="build/Object_Cylinder.png" preload="false" />
+ <texture name="Object_Cylinder_Selected" file_name="build/Object_Cylinder_Selected.png" preload="false" />
+ <texture name="Object_Grass" file_name="build/Object_Grass.png" preload="false" />
+ <texture name="Object_Grass_Selected" file_name="build/Object_Grass_Selected.png" preload="false" />
+ <texture name="Object_Hemi_Cone" file_name="build/Object_Hemi_Cone.png" preload="false" />
+ <texture name="Object_Hemi_Cone_Selected" file_name="build/Object_Hemi_Cone_Selected.png" preload="false" />
+ <texture name="Object_Hemi_Cylinder" file_name="build/Object_Hemi_Cylinder.png" preload="false" />
+ <texture name="Object_Hemi_Cylinder_Selected" file_name="build/Object_Hemi_Cylinder_Selected.png" preload="false" />
+ <texture name="Object_Hemi_Sphere" file_name="build/Object_Hemi_Sphere.png" preload="false" />
+ <texture name="Object_Hemi_Sphere_Selected" file_name="build/Object_Hemi_Sphere_Selected.png" preload="false" />
+ <texture name="Object_Prism" file_name="build/Object_Prism.png" preload="false" />
+ <texture name="Object_Prism_Selected" file_name="build/Object_Prism_Selected.png" preload="false" />
+ <texture name="Object_Pyramid" file_name="build/Object_Pyramid.png" preload="false" />
+ <texture name="Object_Pyramid_Selected" file_name="build/Object_Pyramid_Selected.png" preload="false" />
+ <texture name="Object_Ring" file_name="build/Object_Ring.png" preload="false" />
+ <texture name="Object_Ring_Selected" file_name="build/Object_Ring_Selected.png" preload="false" />
+ <texture name="Object_Sphere" file_name="build/Object_Sphere.png" preload="false" />
+ <texture name="Object_Sphere_Selected" file_name="build/Object_Sphere_Selected.png" preload="false" />
+ <texture name="Object_Tetrahedron" file_name="build/Object_Tetrahedron.png" preload="false" />
+ <texture name="Object_Tetrahedron_Selected" file_name="build/Object_Tetrahedron_Selected.png" preload="false" />
+ <texture name="Object_Torus" file_name="build/Object_Torus.png" preload="false" />
+ <texture name="Object_Torus_Selected" file_name="build/Object_Torus_Selected.png" preload="false" />
+ <texture name="Object_Tree" file_name="build/Object_Tree.png" preload="false" />
+ <texture name="Object_Tree_Selected" file_name="build/Object_Tree_Selected.png" preload="false" />
+ <texture name="Object_Tube" file_name="build/Object_Tube.png" preload="false" />
+ <texture name="Object_Tube_Selected" file_name="build/Object_Tube_Selected.png" preload="false" />
+
+ <texture name="Object_View_Off" file_name="bottomtray/Object_View_Off.png" preload="false" />
+ <texture name="Object_View_On" file_name="bottomtray/Object_View_On.png" preload="false" />
+
+ <texture name="OptionsMenu_Disabled" file_name="icons/OptionsMenu_Disabled.png" preload="false" />
+ <texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" />
+ <texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" />
+
+ <texture name="ClipboardSmallMenu_Disabled" file_name="icons/ClipboardSmallMenu_Disabled.png" preload="false" />
+ <texture name="ClipboardSmallMenu_Off" file_name="icons/ClipboardSmallMenu_Off.png" preload="false" />
+ <texture name="ClipboardSmallMenu_Press" file_name="icons/ClipboardSmallMenu_Press.png" preload="false" />
+ <texture name="ClipboardMenu_Disabled" file_name="icons/ClipboardMenu_Disabled.png" preload="false" />
+ <texture name="ClipboardMenu_Off" file_name="icons/ClipboardMenu_Off.png" preload="false" />
+ <texture name="ClipboardMenu_Press" file_name="icons/ClipboardMenu_Press.png" preload="false" />
+
+ <texture name="OutboxStatus_Success" file_name="green_checkmark.png" preload="false" />
+ <texture name="OutboxStatus_Warning" file_name="icons/pop_up_caution.png" preload="false" />
+ <texture name="OutboxStatus_Error" file_name="red_x.png" preload="false" />
+
+ <texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" />
+
+ <texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" />
+
+ <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" />
+ <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" />
+ <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" />
+ <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" />
+ <texture name="Parcel_Fly_Dark" file_name="icons/Parcel_Fly_Dark.png" preload="false" />
+ <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" />
+ <texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" />
+ <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" />
+ <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" />
+ <texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" />
+ <texture name="Parcel_PushNo_Dark" file_name="icons/Parcel_PushNo_Dark.png" preload="false" />
+ <texture name="Parcel_R_Dark" file_name="icons/Parcel_R_Dark.png" preload="false" />
+ <texture name="Parcel_Scripts_Dark" file_name="icons/Parcel_Scripts_Dark.png" preload="false" />
+ <texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
+ <texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
+ <texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Dark" file_name="icons/Parcel_SeeAVsOff_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Dark" file_name="icons/Parcel_SeeAVsOn_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Light" file_name="icons/Parcel_SeeAVsOff_Light.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Light" file_name="icons/Parcel_SeeAVsOn_Light.png" preload="false" />
+
+ <texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
+ <texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />
+ <texture name="Parcel_ForSale_Light" file_name="icons/Parcel_ForSale_Light.png" preload="false" />
+ <texture name="Parcel_M_Light" file_name="icons/Parcel_M_Light.png" preload="false" />
+ <texture name="Parcel_PG_Light" file_name="icons/Parcel_PG_Light.png" preload="false" />
+ <texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" />
+ <texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" />
+ <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
+ <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" />
+ <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" />
+
+ <texture name="Pathfinding_Dirty" file_name="icons/Pathfinding_Dirty.png" preload="false" />
+ <texture name="Pathfinding_Disabled" file_name="icons/Pathfinding_Disabled.png" preload="false" />
+
+ <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
+ <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
+ <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
+ <texture name="Person_Check" file_name="icons/Person_Check.png" preload="false" />
+ <texture name="Person_Star" file_name="icons/Person_Star.png" preload="false" />
+
+ <texture name="Permission_Visible_Online" file_name="icons/see_me_online.png" preload="false" />
+ <texture name="Permission_Visible_Map" file_name="icons/see_on_map.png" preload="false" />
+ <texture name="Permission_Edit_Objects_Mine" file_name="icons/edit_mine.png" preload="false" />
+ <texture name="Permission_Edit_Objects_Theirs" file_name="icons/edit_theirs.png" preload="false" />
+
+ <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
+ <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
+ <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
+
+ <texture name="Profile_Badge_Beta" file_name="icons/profile_badge_beta.png" preload="true"/>
+ <texture name="Profile_Badge_Beta_Lifetime" file_name="icons/profile_badge_beta_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Lifetime" file_name="icons/profile_badge_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Linden" file_name="icons/profile_badge_linden.png" preload="true"/>
+ <texture name="Profile_Badge_Pplus_Lifetime" file_name="icons/profile_badge_pplus_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Premium_Lifetime" file_name="icons/profile_badge_premium_lifetime.png" preload="true"/>
+ <texture name="Profile_Group_Visibility_Off" file_name="icons/profile_group_visibility_eye_off.png" preload="true"/>
+ <texture name="Profile_Group_Visibility_Off_Pressed" file_name="icons/profile_group_visibility_eye_off_pressed.png" preload="true"/>
+ <texture name="Profile_Group_Visibility_On" file_name="icons/profile_group_visibility_eye_on.png" preload="true"/>
+ <texture name="Profile_Group_Visibility_On_Pressed" file_name="icons/profile_group_visibility_eye_on_pressed.png" preload="true"/>
+ <texture name="Profile_Friend_Offline" file_name="icons/Profile_Friend_Offline.png" preload="true"/>
+ <texture name="Profile_Friend_Online" file_name="icons/Profile_Friend_Online.png" preload="true"/>
+ <texture name="Profile_Perm_Find_Disabled" file_name="icons/Profile_Perm_Find_Disabled.png" preload="true"/>
+ <texture name="Profile_Perm_Find_Enabled" file_name="icons/Profile_Perm_Find_Enabled.png" preload="true"/>
+ <texture name="Profile_Perm_Objects_Disabled" file_name="icons/Profile_Perm_Objects_Disabled.png" preload="true"/>
+ <texture name="Profile_Perm_Objects_Enabled" file_name="icons/Profile_Perm_Objects_Enabled.png" preload="true"/>
+ <texture name="Profile_Perm_Online_Disabled" file_name="icons/Profile_Perm_Online_Disabled.png" preload="true"/>
+ <texture name="Profile_Perm_Online_Enabled" file_name="icons/Profile_Perm_Online_Enabled.png" preload="true"/>
+
+ <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
+ <texture name="ProgressBarSolid" file_name="widgets/ProgressBarSolid.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
+ <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" />
+
+ <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
+ <texture name="PushButton_Login" file_name="widgets/PushButton_Login.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Login_Over" file_name="widgets/PushButton_Login_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Login_Pressed" file_name="widgets/PushButton_Login_Pressed.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
+
+ <texture name="RadioButton_Press" file_name="widgets/RadioButton_Press.png" preload="true" />
+ <texture name="RadioButton_On_Press" file_name="widgets/RadioButton_On_Press.png" preload="true" />
+ <texture name="RadioButton_Off" file_name="widgets/RadioButton_Off.png" preload="true" />
+ <texture name="RadioButton_On" file_name="widgets/RadioButton_On.png" preload="true" />
+ <texture name="RadioButton_Disabled" file_name="widgets/RadioButton_Disabled.png" preload="true" />
+ <texture name="RadioButton_On_Disabled" file_name="widgets/RadioButton_On_Disabled.png" preload="true" />
+
+
+ <texture name="Refresh_Off" file_name="icons/Refresh_Off.png" preload="true" />
+
+ <texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" />
+
+ <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="58" scale.bottom="6" />
+ <texture name="Rounded_Rect_Top" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="8" scale.right="58" scale.bottom="0" clip.left="0" clip.right="64" clip.bottom="16" clip.top="32" />
+ <texture name="Rounded_Rect_Bottom" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="16" scale.right="58" scale.bottom="8" clip.left="0" clip.right="64" clip.bottom="0" clip.top="16" />
+ <texture name="Rounded_Rect_Left" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="32" scale.bottom="6" clip.left="0" clip.right="32" clip.bottom="0" clip.top="32" />
+ <texture name="Rounded_Rect_Right" file_name="Rounded_Rect.png" preload="true" scale.left="0" scale.top="26" scale.right="26" scale.bottom="6" clip.left="32" clip.right="64" clip.bottom="0" clip.top="32" />
+ <texture name="Rounded_Square" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
+ <texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" />
+
+ <texture name="ScrollArrow_Down" file_name="widgets/ScrollArrow_Down.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
+ <texture name="ScrollArrow_Left" file_name="widgets/ScrollArrow_Left.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
+ <texture name="ScrollArrow_Right" file_name="widgets/ScrollArrow_Right.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
+ <texture name="ScrollArrow_Up" file_name="widgets/ScrollArrow_Up.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
+
+ <texture name="ScrollThumb_Horiz" file_name="widgets/ScrollThumb_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
+ <texture name="ScrollThumb_Vert" file_name="widgets/ScrollThumb_Vert.png" preload="true" scale.left="4" scale.top="53" scale.bottom="10" scale.right="4" />
+ <texture name="ScrollTrack_Vert" file_name="widgets/ScrollTrack_Vert.png" preload="true" scale.left="2" scale.top="40" scale.bottom="13" scale.right="0" />
+ <texture name="ScrollTrack_Horiz" file_name="widgets/ScrollTrack_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
+
+
+ <texture name="Search" file_name="navbar/Search.png" preload="false" />
+
+ <texture name="Search_Icon" file_name="icons/Search_Icon.png" preload="false" />
+
+ <texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected_Over" file_name="widgets/SegmentedBtn_Left_Selected_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected_Press" file_name="widgets/SegmentedBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected_Disabled" file_name="widgets/SegmentedBtn_Left_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+
+ <texture name="SegmentedBtn_Middle_Disabled" file_name="widgets/SegmentedBtn_Middle_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Middle_Selected" file_name="widgets/SegmentedBtn_Middle_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Middle_Selected_Press" file_name="widgets/SegmentedBtn_Middle_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Middle_Selected_Disabled" file_name="widgets/SegmentedBtn_Middle_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+
+ <texture name="SegmentedBtn_Right_Off" file_name="widgets/SegmentedBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Over" file_name="widgets/SegmentedBtn_Right_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Press" file_name="widgets/SegmentedBtn_Right_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Disabled" file_name="widgets/SegmentedBtn_Right_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Selected" file_name="widgets/SegmentedBtn_Right_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+
+ <texture name="Shirt_Large" file_name="icons/Shirt_Large.png" preload="false" />
+
+ <texture name="Sidebar_Icon_Dock_Foreground" file_name="taskpanel/Sidebar_Icon_Dock_Foreground.png" preload="false" />
+ <texture name="Sidebar_Icon_Dock_Press" file_name="taskpanel/Sidebar_Icon_Dock_Press.png" preload="false" />
+ <texture name="Sidebar_Icon_Undock_Foreground" file_name="taskpanel/Sidebar_Icon_Undock_Foreground.png" preload="false" />
+ <texture name="Sidebar_Icon_Undock_Press" file_name="taskpanel/Sidebar_Icon_Undock_Press.png" preload="false" />
+
+ <texture name="Shop" file_name="icons/Shop.png" preload="false" />
+
+ <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
+ <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" />
+
+ <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
+ <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
+ <texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" />
+ <texture name="SliderThumb_Disabled" file_name="widgets/SliderThumb_Disabled.png" />
+ <texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" />
+
+ <texture name="SL_Logo" file_name="icons/MP_Logo.png" preload="true" />
+ <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" />
+ <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" />
+
+ <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" />
+ <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" />
+ <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" />
+ <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" />
+ <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
+
+ <texture name="login_mp_logo" file_name="windows/login_mp_logo.png" preload="true" />
+ <texture name="login_mp_logo_small" file_name="windows/login_mp_logo_small.png" preload="true" />
+ <texture name="first_login_image" file_name="windows/first_login_image.jpg" preload="true" />
+
+ <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" />
+ <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" />
+ <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" />
+ <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />
+
+ <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="true" />
+ <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
+ <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
+
+ <texture name="Sync_Disabled" file_name="icons/Sync_Disabled.png" preload="true" />
+ <texture name="Sync_Enabled" file_name="icons/Sync_Enabled.png" preload="true" />
+ <texture name="Sync_Progress_1" file_name="icons/Sync_Progress_1.png" preload="true" />
+ <texture name="Sync_Progress_2" file_name="icons/Sync_Progress_2.png" preload="true" />
+ <texture name="Sync_Progress_3" file_name="icons/Sync_Progress_3.png" preload="true" />
+ <texture name="Sync_Progress_4" file_name="icons/Sync_Progress_4.png" preload="true" />
+ <texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" />
+ <texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" />
+
+ <texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />
+ <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" />
+ <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" />
+ <texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" />
+ <texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" />
+ <texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" />
+ <texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" />
+
+ <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Right_Flashing" file_name="containers/TabTop_Right_Flashing.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Middle_Off" file_name="containers/TabTop_Middle_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
+ <texture name="TabTop_Middle_Selected" file_name="containers/TabTop_Middle_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
+ <texture name="TabTop_Left_Off" file_name="containers/TabTop_Left_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
+ <texture name="TabTop_Left_Selected" file_name="containers/TabTop_Left_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
+
+ <texture name="TaskPanel_Tab_Off" file_name="taskpanel/TaskPanel_Tab_Off.png" preload="false" scale.left="4" scale.top="29" scale.right="36" scale.bottom="4" />
+ <texture name="TaskPanel_Tab_Selected" file_name="taskpanel/TaskPanel_Tab_Selected.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" />
+
+ <texture name="TextField_Search_Disabled" file_name="widgets/TextField_Search_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Off" file_name="widgets/TextField_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Search_Active" file_name="widgets/TextField_Search_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Search_Highlight" file_name="widgets/TextField_Search_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+
+ <texture name="Thumbnail_Fallback" file_name="icons/thumbnail_fallback_icon.png" preload="true" />
+
+ <texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" />
+ <texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true"
+ scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
+ <texture name="Toast_Over" file_name="windows/Toast_Over.png" preload="true"
+ scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
+
+ <texture name="Tool_Create" file_name="build/Tool_Create.png" preload="false" />
+ <texture name="Tool_Dozer" file_name="build/Tool_Dozer.png" preload="false" />
+ <texture name="Tool_Face" file_name="build/Tool_Face.png" preload="false" />
+ <texture name="Tool_Grab" file_name="build/Tool_Grab.png" preload="false" />
+ <texture name="Tool_Zoom" file_name="build/Tool_Zoom.png" preload="false" />
+
+ <texture name="Toolbar_Left_Flash" file_name="containers/Toolbar_Left_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Over" file_name="containers/Toolbar_Left_Over.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Selected" file_name="containers/Toolbar_Left_Selected.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Off" file_name="containers/Toolbar_Middle_Off.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Over" file_name="containers/Toolbar_Middle_Over.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Selected" file_name="containers/Toolbar_Middle_Selected.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Flash" file_name="containers/Toolbar_Middle_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Over" file_name="containers/Toolbar_Right_Over.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Flash" file_name="containers/Toolbar_Right_Flash.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+
+ <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
+
+ <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
+ <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
+ <texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" />
+
+ <texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />
+
+ <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" />
+
+ <texture name="Video_URL_Off" file_name="icons/Video_URL_Off.png" preload="true" />
+
+ <texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120" scale_type="scale_outer"/>
+
+ <texture name="VirtualTrackball_Moon_Back" file_name="widgets/track_control_moon_back.png" />
+ <texture name="VirtualTrackball_Moon_Front" file_name="widgets/track_control_moon_front.png" />
+ <texture name="VirtualTrackball_Rotate_Bottom" file_name="widgets/track_control_rotate_bottom.png" />
+ <texture name="VirtualTrackball_Rotate_Left" file_name="widgets/track_control_rotate_left_side.png" />
+ <texture name="VirtualTrackball_Rotate_Right" file_name="widgets/track_control_rotate_right_side.png" />
+ <texture name="VirtualTrackball_Rotate_Top" file_name="widgets/track_control_rotate_top.png" />
+ <texture name="VirtualTrackball_Rotate_Bottom_Active" file_name="widgets/track_control_rotate_bottom_active.png" />
+ <texture name="VirtualTrackball_Rotate_Left_Active" file_name="widgets/track_control_rotate_left_side_active.png" />
+ <texture name="VirtualTrackball_Rotate_Right_Active" file_name="widgets/track_control_rotate_right_side_active.png" />
+ <texture name="VirtualTrackball_Rotate_Top_Active" file_name="widgets/track_control_rotate_top_active.png" />
+ <texture name="VirtualTrackball_Sphere" file_name="widgets/track_control_sphere.png" />
+ <texture name="VirtualTrackball_Sun_Back" file_name="widgets/track_control_sun_back.png" />
+ <texture name="VirtualTrackball_Sun_Front" file_name="widgets/track_control_sun_front.png" />
+
+ <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
+ scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
+
+ <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
+ <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
+ <texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" />
+ <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
+ <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
+
+ <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
+
+ <texture name="Add_Icon" file_name="icons/add_icon.png" preload="false" />
+ <texture name="Remove_Icon" file_name="icons/remove_icon.png" preload="false" />
+
+ <texture name="Web_Profile_Off" file_name="icons/Web_Profile_Off.png" preload="false" />
+
+ <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
+ <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true"
+ scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
+ <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true"
+ scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
+ <texture name="Window_NoTitle_Background" file_name="windows/Window_Background.png" preload="true"
+ scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
+ <texture name="Window_NoTitle_Foreground" file_name="windows/Window_Foreground.png" preload="true"
+ scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
+
+ <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
+
+ <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
+ <texture name="UnZoom_Off" file_name="icons/UnZoom_Off.png" preload="false" />
+
+ <texture name="pixiesmall.j2c" use_mips="true" />
+ <texture name="script_error.j2c" use_mips="true" />
+ <texture name="silhouette.j2c" use_mips="true" />
+ <texture name="foot_shadow.j2c" use_mips="true" />
+ <texture name="cloud-particle.png" use_mips="true" />
+ <texture name="transparent.j2c" use_mips="true" />
+
+ <!--WARNING OLD ART BELOW *do not use*-->
+ <texture name="icn_media_web.tga" preload="true" />
+ <texture name="icn_media_movie.tga" preload="true" />
+
+ <texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" />
+ <texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" />
+ <texture name="jump_right_out.tga" file_name="widgets/jump_right_out.png" />
+ <texture name="jump_right_in.tga" file_name="widgets/jump_right_in.png" />
+
+ <texture name="scrollbutton_left_out_blue.tga" file_name="widgets/ScrollArrow_Left_Opaque.png" />
+ <texture name="scrollbutton_left_in_blue.tga" file_name="widgets/ScrollArrow_Left_Over_Opaque.png" />
+ <texture name="scrollbutton_right_out_blue.tga" file_name="widgets/ScrollArrow_Right_Opaque.png" />
+ <texture name="scrollbutton_right_in_blue.tga" file_name="widgets/ScrollArrow_Right_Over_Opaque.png" />
+ <texture name="scrollbutton_up_out_blue.tga" file_name="widgets/ScrollArrow_Up_Opaque.png" />
+ <texture name="scrollbutton_up_in_blue.tga" file_name="widgets/ScrollArrow_Up_Over_Opaque.png" />
+ <texture name="scrollbutton_down_out_blue.tga" file_name="widgets/ScrollArrow_Down_Opaque.png" />
+ <texture name="scrollbutton_down_in_blue.tga" file_name="widgets/ScrollArrow_Down_Over_Opaque.png" />
+
+ <texture name="up_arrow.tga" file_name="up_arrow.png" />
+ <texture name="down_arrow.tga" file_name="down_arrow.png" />
+ <texture name="arrow_down.tga" />
+
+ <texture name="tearoffbox.tga" />
+ <texture name="tearoff_pressed.tga" />
+
+ <texture name="color_swatch_alpha.tga" preload="true" />
+
+ <texture name="button_anim_pause.tga" />
+ <texture name="button_anim_pause_selected.tga" />
+ <texture name="button_anim_play.tga" />
+ <texture name="button_anim_play_selected.tga" />
+ <texture name="crosshairs.tga" />
+ <texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" />
+
+ <texture name="icon_avatar_offline.tga" />
+ <texture name="icon_avatar_online.tga" />
+ <texture name="icon_diurnal.tga" />
+ <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />
+ <texture name="icon_top_pick.tga" />
+
+ <texture name="lag_status_critical.tga" />
+ <texture name="lag_status_good.tga" />
+ <texture name="lag_status_warning.tga" />
+
+ <texture name="legend.tga" />
+
+ <texture name="map_avatar_16.tga" />
+ <texture name="map_avatar_8.tga" />
+ <texture name="map_event.tga" />
+ <texture name="map_home.tga" />
+ <texture name="map_infohub.tga" />
+ <texture name="map_telehub.tga" />
+ <texture name="map_track_16.tga" />
+ <texture name="map_ui_collapse_icon.png" />
+ <texture name="map_ui_expand_icon.png" />
+
+ <texture name="notify_caution_icon.tga" />
+
+ <texture name="default_land_picture.j2c" />
+ <texture name="default_profile_picture.j2c" />
+ <texture name="locked_image.j2c" />
+ <texture name="badge_note.j2c" />
+ <texture name="badge_warn.j2c" />
+ <texture name="badge_ok.j2c" />
+ <texture name="materials_ui_x_24.png" />
+
+ <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" />
+ <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" />
+ <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" />
+ <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" />
+ <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" />
+ <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" />
+ <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" />
+ <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" />
+ <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" />
+ <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" />
+ <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" />
+ <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" />
+
+ <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/>
+ <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+ <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+ <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+
+ <texture name="hint_background" file_name="windows/hint_background.png" preload="false" scale.left="8" scale.top="70" scale.right="195" scale.bottom="11"/>
+ <texture name="hint_arrow_left" file_name="windows/hint_arrow_left.png" preload="false"/>
+ <texture name="hint_arrow_right" file_name="windows/hint_arrow_right.png" preload="false"/>
+ <texture name="hint_arrow_up" file_name="windows/hint_arrow_up.png" preload="false"/>
+ <texture name="hint_arrow_down" file_name="windows/hint_arrow_down.png" preload="false"/>
+ <texture name="hint_arrow_lower_left" file_name="windows/hint_arrow_lower_left.png" preload="false"/>
+
+ <texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>
+ <texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>
+ <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
+ <texture name="NavBar Separator" file_name="navbar/separator.png"/>
+
+ <texture name="Default_Outfit_Photo" file_name="icons/Default_Outfit_Photo.png" preload="true"/>
+ <texture name="Notification_Condense" file_name="icons/Icon_Notification_Condense.png" preload="true"/>
+ <texture name="Notification_Expand" file_name="icons/Icon_Notification_Expand.png" preload="true"/>
+ <texture name="System_Notification" file_name="icons/MP_Logo.png" preload="true"/>
+ <texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/>
+ <texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/>
+
+ <texture name="Single_Folder_Mode" file_name="icons/single_folder_mode.png" preload="true"/>
+ <texture name="Multi_Folder_Mode" file_name="icons/multi_folder_mode.png" preload="true"/>
+ <texture name="Single_Folder_Back" file_name="icons/single_folder_back.png" preload="true"/>
+ <texture name="Single_Folder_Forward" file_name="icons/single_folder_forward.png" preload="true"/>
+ <texture name="Single_Folder_Up" file_name="icons/single_folder_up.png" preload="true"/>
+ <texture name="Icon_Color_Palette" file_name="icons/Icon_Color_Palette.png" preload="false"/>
+ <texture name="Icon_Font_Size" file_name="icons/Icon_Font_Size.png" preload="false"/>
+
+ <texture name="Icon_Place" file_name="megapahit/icon_place.png" preload="false" />
+ <texture name="Icon_Auction" file_name="megapahit/icon_land_auction.png" preload="false" />
+ <texture name="Icon_For_Sale" file_name="megapahit/icon_land_forsale.png" preload="false" />
+ <texture name="Icon_Group" file_name="megapahit/icon_group.png" preload="false" />
+ <texture name="Icon_Legacy_Event_PG" file_name="icons/Parcel_PG_Dark.png" preload="false" />
+ <texture name="Icon_Legacy_Event_Mature" file_name="icons/Parcel_M_Dark.png" preload="false" />
+ <texture name="Icon_Legacy_Event_Adult" file_name="icons/Parcel_R_Dark.png" preload="false" />
+
+ <texture name="ProgressLarge_1" file_name="icons/ProgressLarge_1.png" preload="true" />
+ <texture name="ProgressLarge_2" file_name="icons/ProgressLarge_2.png" preload="true" />
+ <texture name="ProgressLarge_3" file_name="icons/ProgressLarge_3.png" preload="true" />
+ <texture name="ProgressLarge_4" file_name="icons/ProgressLarge_4.png" preload="true" />
+ <texture name="ProgressLarge_5" file_name="icons/ProgressLarge_5.png" preload="true" />
+ <texture name="ProgressLarge_6" file_name="icons/ProgressLarge_6.png" preload="true" />
+ <texture name="ProgressLarge_7" file_name="icons/ProgressLarge_7.png" preload="true" />
+ <texture name="ProgressLarge_8" file_name="icons/ProgressLarge_8.png" preload="true" />
+ <texture name="ProgressLarge_9" file_name="icons/ProgressLarge_9.png" preload="true" />
+ <texture name="ProgressLarge_10" file_name="icons/ProgressLarge_10.png" preload="true" />
+ <texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" />
+ <texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" />
+
+</textures>
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/360_capture.png b/indra/newview/skins/gold/textures/toolbar_icons/360_capture.png
index 163cebe29f..163cebe29f 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/360_capture.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/360_capture.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/appearance.png b/indra/newview/skins/gold/textures/toolbar_icons/appearance.png
index e6b1365388..e6b1365388 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/appearance.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/appearance.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/avatars.png b/indra/newview/skins/gold/textures/toolbar_icons/avatars.png
index 8fa0600cee..8fa0600cee 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/avatars.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/avatars.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/build.png b/indra/newview/skins/gold/textures/toolbar_icons/build.png
index e21ab3f0e4..e21ab3f0e4 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/build.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/build.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/caret_bottom.png b/indra/newview/skins/gold/textures/toolbar_icons/caret_bottom.png
new file mode 100644
index 0000000000..5f6a01eaa1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/caret_bottom.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/caret_left.png b/indra/newview/skins/gold/textures/toolbar_icons/caret_left.png
new file mode 100644
index 0000000000..0b8090314c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/caret_left.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/caret_right.png b/indra/newview/skins/gold/textures/toolbar_icons/caret_right.png
new file mode 100644
index 0000000000..044751560f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/caret_right.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/chat.png b/indra/newview/skins/gold/textures/toolbar_icons/chat.png
index e0dbac495f..e0dbac495f 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/chat.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/chat.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/destinations.png b/indra/newview/skins/gold/textures/toolbar_icons/destinations.png
index e2325f083a..e2325f083a 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/destinations.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/destinations.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/environments.png b/indra/newview/skins/gold/textures/toolbar_icons/environments.png
index 620db9f793..620db9f793 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/environments.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/environments.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/facebook.png b/indra/newview/skins/gold/textures/toolbar_icons/facebook.png
index ae524b643f..ae524b643f 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/facebook.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/facebook.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/favorite_folder.png b/indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.png
index 811efffc0b..811efffc0b 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/favorite_folder.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/flickr.png b/indra/newview/skins/gold/textures/toolbar_icons/flickr.png
index 7fce9f0df2..7fce9f0df2 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/flickr.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/flickr.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/gestures.png b/indra/newview/skins/gold/textures/toolbar_icons/gestures.png
index 2404bb4e25..2404bb4e25 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/gestures.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/gestures.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/grid_status.png b/indra/newview/skins/gold/textures/toolbar_icons/grid_status.png
index b92b93cfb4..b92b93cfb4 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/grid_status.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/grid_status.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/highlighting.png b/indra/newview/skins/gold/textures/toolbar_icons/highlighting.png
new file mode 100644
index 0000000000..093bace257
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/highlighting.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/highlighting_selected.png b/indra/newview/skins/gold/textures/toolbar_icons/highlighting_selected.png
new file mode 100644
index 0000000000..899fefbdf4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/highlighting_selected.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/howto.png b/indra/newview/skins/gold/textures/toolbar_icons/howto.png
index 8594d71113..8594d71113 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/howto.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/howto.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/inventory.png b/indra/newview/skins/gold/textures/toolbar_icons/inventory.png
index ab3191255e..ab3191255e 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/inventory.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/inventory.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/land.png b/indra/newview/skins/gold/textures/toolbar_icons/land.png
index 89ea7604a4..89ea7604a4 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/land.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/land.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/map.png b/indra/newview/skins/gold/textures/toolbar_icons/map.png
index ed1049b7db..ed1049b7db 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/map.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/map.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/marketplace.png b/indra/newview/skins/gold/textures/toolbar_icons/marketplace.png
index 62bad20be6..62bad20be6 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/marketplace.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/marketplace.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/mini_cart.png b/indra/newview/skins/gold/textures/toolbar_icons/mini_cart.png
index 9eeb1d4e09..9eeb1d4e09 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/mini_cart.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/mini_cart.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/mini_map.png b/indra/newview/skins/gold/textures/toolbar_icons/mini_map.png
index ab0a654056..ab0a654056 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/mini_map.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/mini_map.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/mktlistings.png b/indra/newview/skins/gold/textures/toolbar_icons/mktlistings.png
index a6f90461d7..a6f90461d7 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/mktlistings.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/mktlistings.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/move.png b/indra/newview/skins/gold/textures/toolbar_icons/move.png
index 5c2ced7375..5c2ced7375 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/move.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/move.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/nearbyvoice.png b/indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.png
index 77a7cd5f44..77a7cd5f44 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/nearbyvoice.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/outbox.png b/indra/newview/skins/gold/textures/toolbar_icons/outbox.png
index 0f3db1c47c..0f3db1c47c 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/outbox.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/outbox.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/people.png b/indra/newview/skins/gold/textures/toolbar_icons/people.png
index 7228ae8e2f..7228ae8e2f 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/people.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/people.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/performance.png b/indra/newview/skins/gold/textures/toolbar_icons/performance.png
index 91baf849c8..91baf849c8 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/performance.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/performance.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/picks.png b/indra/newview/skins/gold/textures/toolbar_icons/picks.png
index befda04b42..befda04b42 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/picks.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/picks.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/places.png b/indra/newview/skins/gold/textures/toolbar_icons/places.png
index 97d9fa066c..97d9fa066c 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/places.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/places.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/preferences.png b/indra/newview/skins/gold/textures/toolbar_icons/preferences.png
index 4ccd7b8ae1..4ccd7b8ae1 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/preferences.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/preferences.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/profile.png b/indra/newview/skins/gold/textures/toolbar_icons/profile.png
index 32fe2bf8ac..32fe2bf8ac 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/profile.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/profile.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/report_abuse.png b/indra/newview/skins/gold/textures/toolbar_icons/report_abuse.png
index d5cb6ca259..d5cb6ca259 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/report_abuse.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/report_abuse.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/resync_animations.png b/indra/newview/skins/gold/textures/toolbar_icons/resync_animations.png
index dc9ee9c428..dc9ee9c428 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/resync_animations.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/resync_animations.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/search.png b/indra/newview/skins/gold/textures/toolbar_icons/search.png
index bcb11e950d..bcb11e950d 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/search.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/search.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/snapshot.png b/indra/newview/skins/gold/textures/toolbar_icons/snapshot.png
index d26da9b1d2..d26da9b1d2 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/snapshot.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/snapshot.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/speak.png b/indra/newview/skins/gold/textures/toolbar_icons/speak.png
index 10cd354c5c..10cd354c5c 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/speak.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/speak.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/twitter.png b/indra/newview/skins/gold/textures/toolbar_icons/twitter.png
index 0ad56f7802..0ad56f7802 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/twitter.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/twitter.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/view.png b/indra/newview/skins/gold/textures/toolbar_icons/view.png
index ddf0df7c26..ddf0df7c26 100644
--- a/indra/newview/skins/contrast/textures/toolbar_icons/view.png
+++ b/indra/newview/skins/gold/textures/toolbar_icons/view.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/transparent.j2c b/indra/newview/skins/gold/textures/transparent.j2c
index 1068e940b9..1068e940b9 100644
--- a/indra/newview/skins/contrast/textures/transparent.j2c
+++ b/indra/newview/skins/gold/textures/transparent.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/up_arrow.png b/indra/newview/skins/gold/textures/up_arrow.png
index 76f839510e..76f839510e 100644
--- a/indra/newview/skins/contrast/textures/up_arrow.png
+++ b/indra/newview/skins/gold/textures/up_arrow.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/uv_test1.j2c b/indra/newview/skins/gold/textures/uv_test1.j2c
index 3d5b541796..3d5b541796 100644
--- a/indra/newview/skins/contrast/textures/uv_test1.j2c
+++ b/indra/newview/skins/gold/textures/uv_test1.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/uv_test2.tga b/indra/newview/skins/gold/textures/uv_test2.tga
index a16000d1e4..a16000d1e4 100644
--- a/indra/newview/skins/contrast/textures/uv_test2.tga
+++ b/indra/newview/skins/gold/textures/uv_test2.tga
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/voice_meter_dot.j2c b/indra/newview/skins/gold/textures/voice_meter_dot.j2c
index e536c3338a..e536c3338a 100644
--- a/indra/newview/skins/contrast/textures/voice_meter_dot.j2c
+++ b/indra/newview/skins/gold/textures/voice_meter_dot.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/voice_meter_rings.j2c b/indra/newview/skins/gold/textures/voice_meter_rings.j2c
index 17e7c6c6a1..17e7c6c6a1 100644
--- a/indra/newview/skins/contrast/textures/voice_meter_rings.j2c
+++ b/indra/newview/skins/gold/textures/voice_meter_rings.j2c
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/white.tga b/indra/newview/skins/gold/textures/white.tga
index 9fe68631cf..9fe68631cf 100644
--- a/indra/newview/skins/contrast/textures/white.tga
+++ b/indra/newview/skins/gold/textures/white.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Down.png b/indra/newview/skins/gold/textures/widgets/Arrow_Down.png
new file mode 100644
index 0000000000..8b592ed840
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Arrow_Down.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Left.png b/indra/newview/skins/gold/textures/widgets/Arrow_Left.png
new file mode 100644
index 0000000000..04416541b9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Arrow_Left.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Right.png b/indra/newview/skins/gold/textures/widgets/Arrow_Right.png
new file mode 100644
index 0000000000..e57452a558
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Arrow_Right.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Small_Down.png b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Down.png
new file mode 100644
index 0000000000..8694cdf2d4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Down.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Small_Left.png b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Left.png
new file mode 100644
index 0000000000..a1b82d5101
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Left.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Small_Right.png b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Right.png
new file mode 100644
index 0000000000..0e05d76852
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Right.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Small_Up.png b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Up.png
new file mode 100644
index 0000000000..348bc4c019
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Up.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Up.png b/indra/newview/skins/gold/textures/widgets/Arrow_Up.png
new file mode 100644
index 0000000000..8b3da09d79
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Arrow_Up.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Badge_Background.png b/indra/newview/skins/gold/textures/widgets/Badge_Background.png
new file mode 100644
index 0000000000..5abc1bf489
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Badge_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Badge_Border.png b/indra/newview/skins/gold/textures/widgets/Badge_Border.png
new file mode 100644
index 0000000000..57d3be2320
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Badge_Border.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png
new file mode 100644
index 0000000000..139d71ae2e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Off.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Off.png
new file mode 100755
index 0000000000..cb0ae6b0c9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Over.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Over.png
new file mode 100755
index 0000000000..426c2c9d79
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Press.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Press.png
new file mode 100755
index 0000000000..9e71d224fa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png
new file mode 100644
index 0000000000..2cf3de24c0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Off.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Off.png
new file mode 100755
index 0000000000..c6f1d2f5d6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Over.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Over.png
new file mode 100755
index 0000000000..c87d907a68
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Press.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Press.png
new file mode 100755
index 0000000000..a36a3aaf02
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png
new file mode 100644
index 0000000000..d9c9692114
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Off.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Off.png
new file mode 100644
index 0000000000..bf7744ac21
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Over.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Over.png
new file mode 100644
index 0000000000..23e7be65a2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Press.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Press.png
new file mode 100644
index 0000000000..16ed3effa3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_Disabled.png b/indra/newview/skins/gold/textures/widgets/Checkbox_Disabled.png
new file mode 100644
index 0000000000..8439f82e29
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Checkbox_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_Off.png b/indra/newview/skins/gold/textures/widgets/Checkbox_Off.png
new file mode 100644
index 0000000000..cb9a04d84f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Checkbox_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_On.png b/indra/newview/skins/gold/textures/widgets/Checkbox_On.png
new file mode 100644
index 0000000000..0ec090504a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Checkbox_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_On_Disabled.png b/indra/newview/skins/gold/textures/widgets/Checkbox_On_Disabled.png
new file mode 100644
index 0000000000..5759f7de69
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Checkbox_On_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_On_Press.png b/indra/newview/skins/gold/textures/widgets/Checkbox_On_Press.png
new file mode 100644
index 0000000000..ba46e91c55
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Checkbox_On_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_Press.png b/indra/newview/skins/gold/textures/widgets/Checkbox_Press.png
new file mode 100644
index 0000000000..5f5a33d878
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Checkbox_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_Disabled.png b/indra/newview/skins/gold/textures/widgets/ComboButton_Disabled.png
new file mode 100644
index 0000000000..ebeb813349
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ComboButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_Hover.png b/indra/newview/skins/gold/textures/widgets/ComboButton_Hover.png
new file mode 100644
index 0000000000..1377d35e1a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ComboButton_Hover.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_Off.png b/indra/newview/skins/gold/textures/widgets/ComboButton_Off.png
new file mode 100644
index 0000000000..8c315a9d25
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ComboButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_On.png b/indra/newview/skins/gold/textures/widgets/ComboButton_On.png
new file mode 100644
index 0000000000..94cbf85ea7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ComboButton_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_Selected.png b/indra/newview/skins/gold/textures/widgets/ComboButton_Selected.png
new file mode 100644
index 0000000000..1bb4a43c4c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ComboButton_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/gold/textures/widgets/ComboButton_UpOff.png
new file mode 100644
index 0000000000..34edea9421
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ComboButton_UpOff.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_UpSelected.png b/indra/newview/skins/gold/textures/widgets/ComboButton_UpSelected.png
new file mode 100644
index 0000000000..2ee213ecd9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ComboButton_UpSelected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/DisclosureArrow_Opened_Off.png b/indra/newview/skins/gold/textures/widgets/DisclosureArrow_Opened_Off.png
new file mode 100644
index 0000000000..115ec7a11f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/DisclosureArrow_Opened_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/DropDown_Disabled.png b/indra/newview/skins/gold/textures/widgets/DropDown_Disabled.png
new file mode 100644
index 0000000000..9a69f7e0d9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/DropDown_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/DropDown_Off.png b/indra/newview/skins/gold/textures/widgets/DropDown_Off.png
new file mode 100644
index 0000000000..b118e7a7d4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/DropDown_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/DropDown_On.png b/indra/newview/skins/gold/textures/widgets/DropDown_On.png
new file mode 100644
index 0000000000..614c1fccc5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/DropDown_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/DropDown_Press.png b/indra/newview/skins/gold/textures/widgets/DropDown_Press.png
new file mode 100644
index 0000000000..0dc92f2435
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/DropDown_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/DropTarget.png b/indra/newview/skins/gold/textures/widgets/DropTarget.png
new file mode 100644
index 0000000000..01e7a88861
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/DropTarget.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Error_Tag_Background.png b/indra/newview/skins/gold/textures/widgets/Error_Tag_Background.png
new file mode 100644
index 0000000000..439fce3dd3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Error_Tag_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Alert.png b/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Alert.png
new file mode 100644
index 0000000000..76e078100f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Alert.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Background.png b/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Background.png
new file mode 100644
index 0000000000..6e71ef7b72
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ListItem_Over.png b/indra/newview/skins/gold/textures/widgets/ListItem_Over.png
new file mode 100644
index 0000000000..8c80522232
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ListItem_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ListItem_Select.png b/indra/newview/skins/gold/textures/widgets/ListItem_Select.png
new file mode 100644
index 0000000000..b27e0ee787
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ListItem_Select.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Off.png b/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Off.png
new file mode 100644
index 0000000000..de71f763d3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Selected.png b/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Selected.png
new file mode 100644
index 0000000000..a627dbaf34
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Marketplace_Dropzone_Background.png b/indra/newview/skins/gold/textures/widgets/Marketplace_Dropzone_Background.png
new file mode 100644
index 0000000000..9eb4a5c55d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Marketplace_Dropzone_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/New_Tag_Background.png b/indra/newview/skins/gold/textures/widgets/New_Tag_Background.png
new file mode 100644
index 0000000000..3631d90825
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/New_Tag_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/New_Tag_Border.png b/indra/newview/skins/gold/textures/widgets/New_Tag_Border.png
new file mode 100644
index 0000000000..d9b78eeea4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/New_Tag_Border.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ProgressBar.png b/indra/newview/skins/gold/textures/widgets/ProgressBar.png
new file mode 100644
index 0000000000..23e7ee4f16
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ProgressBar.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ProgressBarSolid.png b/indra/newview/skins/gold/textures/widgets/ProgressBarSolid.png
new file mode 100644
index 0000000000..59a798464d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ProgressBarSolid.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ProgressTrack.png b/indra/newview/skins/gold/textures/widgets/ProgressTrack.png
new file mode 100644
index 0000000000..f4be9f5ccd
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ProgressTrack.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Disabled.png b/indra/newview/skins/gold/textures/widgets/PushButton_Disabled.png
new file mode 100644
index 0000000000..e99ec4b14b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Login.png b/indra/newview/skins/gold/textures/widgets/PushButton_Login.png
new file mode 100644
index 0000000000..8e7d932ab1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Login.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Login_Over.png b/indra/newview/skins/gold/textures/widgets/PushButton_Login_Over.png
new file mode 100644
index 0000000000..038ba23be2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Login_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Login_Pressed.png b/indra/newview/skins/gold/textures/widgets/PushButton_Login_Pressed.png
new file mode 100644
index 0000000000..828aa1a139
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Login_Pressed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Off.png b/indra/newview/skins/gold/textures/widgets/PushButton_Off.png
new file mode 100644
index 0000000000..c74cea62d3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_On.png b/indra/newview/skins/gold/textures/widgets/PushButton_On.png
new file mode 100644
index 0000000000..fddde585a1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_On_Selected.png b/indra/newview/skins/gold/textures/widgets/PushButton_On_Selected.png
new file mode 100644
index 0000000000..6f0cd3574d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_On_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Over.png b/indra/newview/skins/gold/textures/widgets/PushButton_Over.png
new file mode 100644
index 0000000000..34a64a3ade
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Press.png b/indra/newview/skins/gold/textures/widgets/PushButton_Press.png
new file mode 100644
index 0000000000..e5cc0ba1d2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Selected.png b/indra/newview/skins/gold/textures/widgets/PushButton_Selected.png
new file mode 100644
index 0000000000..d711319160
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Disabled.png b/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Disabled.png
new file mode 100644
index 0000000000..26a47e0ab5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Press.png b/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Press.png
new file mode 100644
index 0000000000..f1549f9379
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_Disabled.png b/indra/newview/skins/gold/textures/widgets/RadioButton_Disabled.png
new file mode 100644
index 0000000000..32ec25fe0e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/RadioButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_Off.png b/indra/newview/skins/gold/textures/widgets/RadioButton_Off.png
new file mode 100644
index 0000000000..5d267af5dc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/RadioButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_On.png b/indra/newview/skins/gold/textures/widgets/RadioButton_On.png
new file mode 100644
index 0000000000..e6bf0db157
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/RadioButton_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_On_Disabled.png b/indra/newview/skins/gold/textures/widgets/RadioButton_On_Disabled.png
new file mode 100644
index 0000000000..72aae43618
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/RadioButton_On_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_On_Press.png b/indra/newview/skins/gold/textures/widgets/RadioButton_On_Press.png
new file mode 100644
index 0000000000..f3883b82b3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/RadioButton_On_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_Press.png b/indra/newview/skins/gold/textures/widgets/RadioButton_Press.png
new file mode 100644
index 0000000000..0025256045
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/RadioButton_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down.png
new file mode 100644
index 0000000000..768909d447
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Opaque.png
new file mode 100644
index 0000000000..1c57521e9e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png
new file mode 100644
index 0000000000..3db7be9ffa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left.png
new file mode 100644
index 0000000000..9ef73f48a5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Opaque.png
new file mode 100644
index 0000000000..0fb0671036
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png
new file mode 100644
index 0000000000..464130c359
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right.png
new file mode 100644
index 0000000000..8a59274b8a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Opaque.png
new file mode 100644
index 0000000000..ab1f1ac90b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png
new file mode 100644
index 0000000000..e5a94429a3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up.png
new file mode 100644
index 0000000000..064580f0c8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Opaque.png
new file mode 100644
index 0000000000..2cc4857d27
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png
new file mode 100644
index 0000000000..2018b53af9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollThumb_Horiz.png b/indra/newview/skins/gold/textures/widgets/ScrollThumb_Horiz.png
new file mode 100644
index 0000000000..9afc907c1c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollThumb_Horiz.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollThumb_Vert.png b/indra/newview/skins/gold/textures/widgets/ScrollThumb_Vert.png
new file mode 100644
index 0000000000..ede643e528
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollThumb_Vert.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollTrack_Horiz.png b/indra/newview/skins/gold/textures/widgets/ScrollTrack_Horiz.png
new file mode 100644
index 0000000000..35da770073
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollTrack_Horiz.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/ScrollTrack_Vert.png b/indra/newview/skins/gold/textures/widgets/ScrollTrack_Vert.png
new file mode 100644
index 0000000000..cf67c23133
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/ScrollTrack_Vert.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Disabled.png
new file mode 100644
index 0000000000..ef50fb5d51
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Off.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Off.png
new file mode 100644
index 0000000000..191dbf08fc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Over.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Over.png
new file mode 100644
index 0000000000..d5882bce85
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Press.png
new file mode 100644
index 0000000000..ddaab1cfcd
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected.png
new file mode 100644
index 0000000000..c8634b1294
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png
new file mode 100644
index 0000000000..d47a21fff7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png
new file mode 100644
index 0000000000..4919c9bcc3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png
new file mode 100644
index 0000000000..1182f90a11
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Disabled.png
new file mode 100644
index 0000000000..65d082b993
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected.png
new file mode 100644
index 0000000000..12f55c599e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
new file mode 100644
index 0000000000..123524f0e4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
new file mode 100644
index 0000000000..8fd7086252
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Disabled.png
new file mode 100644
index 0000000000..ccea8fc784
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Off.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Off.png
new file mode 100644
index 0000000000..f90ede3b71
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_On_Selected.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_On_Selected.png
new file mode 100644
index 0000000000..a8dba17a75
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_On_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Over.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Over.png
new file mode 100644
index 0000000000..cadcec085a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Press.png
new file mode 100644
index 0000000000..889d06a690
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected.png
new file mode 100644
index 0000000000..aa3906d236
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png
new file mode 100644
index 0000000000..2befd6985b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png
new file mode 100644
index 0000000000..7fe8926628
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SliderThumb_Disabled.png b/indra/newview/skins/gold/textures/widgets/SliderThumb_Disabled.png
new file mode 100644
index 0000000000..5cfa3ae4e1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SliderThumb_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SliderThumb_Off.png b/indra/newview/skins/gold/textures/widgets/SliderThumb_Off.png
new file mode 100644
index 0000000000..66cdcbeb94
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SliderThumb_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SliderThumb_Press.png b/indra/newview/skins/gold/textures/widgets/SliderThumb_Press.png
new file mode 100644
index 0000000000..0bf8e43e81
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SliderThumb_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SliderTrack_Horiz.png b/indra/newview/skins/gold/textures/widgets/SliderTrack_Horiz.png
new file mode 100644
index 0000000000..720830f83f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SliderTrack_Horiz.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/SliderTrack_Vert.png b/indra/newview/skins/gold/textures/widgets/SliderTrack_Vert.png
new file mode 100644
index 0000000000..c01db44707
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/SliderTrack_Vert.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Stepper_Down_Off.png b/indra/newview/skins/gold/textures/widgets/Stepper_Down_Off.png
new file mode 100644
index 0000000000..ff21034095
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Stepper_Down_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Stepper_Down_Press.png b/indra/newview/skins/gold/textures/widgets/Stepper_Down_Press.png
new file mode 100644
index 0000000000..40f42a670f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Stepper_Down_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Stepper_Up_Off.png b/indra/newview/skins/gold/textures/widgets/Stepper_Up_Off.png
new file mode 100644
index 0000000000..133845bdbc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Stepper_Up_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Stepper_Up_Press.png b/indra/newview/skins/gold/textures/widgets/Stepper_Up_Press.png
new file mode 100644
index 0000000000..8cefa97129
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Stepper_Up_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Active.png b/indra/newview/skins/gold/textures/widgets/TextField_Active.png
new file mode 100644
index 0000000000..66c3867b81
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/TextField_Active.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Disabled.png b/indra/newview/skins/gold/textures/widgets/TextField_Disabled.png
new file mode 100644
index 0000000000..baf747f581
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/TextField_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Off.png b/indra/newview/skins/gold/textures/widgets/TextField_Off.png
new file mode 100644
index 0000000000..a35562f950
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/TextField_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Search_Active.png b/indra/newview/skins/gold/textures/widgets/TextField_Search_Active.png
new file mode 100644
index 0000000000..572535f1ab
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/TextField_Search_Active.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Search_Disabled.png b/indra/newview/skins/gold/textures/widgets/TextField_Search_Disabled.png
new file mode 100644
index 0000000000..94b4b158f7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/TextField_Search_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Search_Highlight.png b/indra/newview/skins/gold/textures/widgets/TextField_Search_Highlight.png
new file mode 100644
index 0000000000..7768da04e8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/TextField_Search_Highlight.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Search_Off.png b/indra/newview/skins/gold/textures/widgets/TextField_Search_Off.png
new file mode 100644
index 0000000000..fccd38c807
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/TextField_Search_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/Tooltip.png b/indra/newview/skins/gold/textures/widgets/Tooltip.png
new file mode 100644
index 0000000000..1be53bdaa2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/Tooltip.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/bevel_background.png b/indra/newview/skins/gold/textures/widgets/bevel_background.png
new file mode 100644
index 0000000000..6304124aec
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/bevel_background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/buy_off.png b/indra/newview/skins/gold/textures/widgets/buy_off.png
new file mode 100644
index 0000000000..2582b6cfab
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/buy_off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/buy_over.png b/indra/newview/skins/gold/textures/widgets/buy_over.png
new file mode 100644
index 0000000000..5b8a39085d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/buy_over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/buy_press.png b/indra/newview/skins/gold/textures/widgets/buy_press.png
new file mode 100644
index 0000000000..8e0cc9f787
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/buy_press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/horizontal_drag_handle.png b/indra/newview/skins/gold/textures/widgets/horizontal_drag_handle.png
new file mode 100644
index 0000000000..631d653968
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/horizontal_drag_handle.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/jump_left_in.png b/indra/newview/skins/gold/textures/widgets/jump_left_in.png
new file mode 100644
index 0000000000..073606628c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/jump_left_in.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/jump_left_out.png b/indra/newview/skins/gold/textures/widgets/jump_left_out.png
new file mode 100644
index 0000000000..71d5c5c36a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/jump_left_out.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/jump_right_in.png b/indra/newview/skins/gold/textures/widgets/jump_right_in.png
new file mode 100644
index 0000000000..96f8501932
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/jump_right_in.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/jump_right_out.png b/indra/newview/skins/gold/textures/widgets/jump_right_out.png
new file mode 100644
index 0000000000..9c02f5f649
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/jump_right_out.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_moon_back.png b/indra/newview/skins/gold/textures/widgets/track_control_moon_back.png
index 03d1e805e1..03d1e805e1 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_moon_back.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_moon_back.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_moon_front.png b/indra/newview/skins/gold/textures/widgets/track_control_moon_front.png
index cdc52fe08a..cdc52fe08a 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_moon_front.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_moon_front.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.png
index c08b54c269..c08b54c269 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.png
index a2b37d1b43..a2b37d1b43 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom_active.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.png
index 3439e8717f..3439e8717f 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.png
index fa745175be..fa745175be 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side_active.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.png
index f92fdb3d92..f92fdb3d92 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.png
index 23571d6473..23571d6473 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side_active.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_top.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top.png
index ae67084a7d..ae67084a7d 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_top.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_top_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top_active.png
index 4e1d0ad096..4e1d0ad096 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_top_active.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top_active.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_sphere.png b/indra/newview/skins/gold/textures/widgets/track_control_sphere.png
new file mode 100644
index 0000000000..02b0854c7b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_sphere.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_sun_back.png b/indra/newview/skins/gold/textures/widgets/track_control_sun_back.png
index b3191ccc5d..b3191ccc5d 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_sun_back.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_sun_back.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_sun_front.png b/indra/newview/skins/gold/textures/widgets/track_control_sun_front.png
index 1cdcbf7861..1cdcbf7861 100644
--- a/indra/newview/skins/contrast/textures/widgets/track_control_sun_front.png
+++ b/indra/newview/skins/gold/textures/widgets/track_control_sun_front.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/vertical_drag_handle.png b/indra/newview/skins/gold/textures/widgets/vertical_drag_handle.png
new file mode 100644
index 0000000000..d78e898a9c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/vertical_drag_handle.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Dragbar.png b/indra/newview/skins/gold/textures/windows/Dragbar.png
new file mode 100644
index 0000000000..3a998abdc3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Dragbar.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Flyout_Left.png b/indra/newview/skins/gold/textures/windows/Flyout_Left.png
new file mode 100644
index 0000000000..3110d7f6b5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Flyout_Left.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Flyout_Pointer.png b/indra/newview/skins/gold/textures/windows/Flyout_Pointer.png
new file mode 100644
index 0000000000..4076bb393e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Flyout_Pointer.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Flyout_Right.png b/indra/newview/skins/gold/textures/windows/Flyout_Right.png
new file mode 100644
index 0000000000..4c55cd6287
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Flyout_Right.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Close_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Close_Foreground.png
new file mode 100644
index 0000000000..cb516886a2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Close_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Close_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Close_Press.png
new file mode 100644
index 0000000000..283981f6ea
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Close_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Close_Toast.png b/indra/newview/skins/gold/textures/windows/Icon_Close_Toast.png
new file mode 100644
index 0000000000..b08ffbc742
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Close_Toast.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Dock_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Dock_Foreground.png
new file mode 100644
index 0000000000..7508fcb25e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Dock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Dock_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Dock_Press.png
new file mode 100644
index 0000000000..3f2c560398
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Dock_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Gear.png b/indra/newview/skins/gold/textures/windows/Icon_Gear.png
new file mode 100644
index 0000000000..7cf85bece4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Gear.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Gear_Background.png b/indra/newview/skins/gold/textures/windows/Icon_Gear_Background.png
new file mode 100644
index 0000000000..09d83e62e4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Gear_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Gear_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Gear_Foreground.png
new file mode 100644
index 0000000000..fa998eee5d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Gear_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Gear_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Gear_Press.png
new file mode 100644
index 0000000000..603fa2f388
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Gear_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Help_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Help_Foreground.png
new file mode 100644
index 0000000000..1bde4c040a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Help_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Help_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Help_Press.png
new file mode 100644
index 0000000000..f3b885283f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Help_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Minimize_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Minimize_Foreground.png
new file mode 100644
index 0000000000..942efb40f7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Minimize_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Minimize_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Minimize_Press.png
new file mode 100644
index 0000000000..1fe37b7a2e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Minimize_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Restore_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Restore_Foreground.png
new file mode 100644
index 0000000000..7840deccb8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Restore_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Restore_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Restore_Press.png
new file mode 100644
index 0000000000..33258a0bc5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Restore_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Icon_Undock_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Undock_Foreground.png
new file mode 100644
index 0000000000..df826226e6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Icon_Undock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Inspector_Background.png b/indra/newview/skins/gold/textures/windows/Inspector_Background.png
new file mode 100644
index 0000000000..3053269b84
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Inspector_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Inspector_Hover.png b/indra/newview/skins/gold/textures/windows/Inspector_Hover.png
new file mode 100644
index 0000000000..0cb846eba0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Inspector_Hover.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Inspector_I.png b/indra/newview/skins/gold/textures/windows/Inspector_I.png
new file mode 100644
index 0000000000..f0848838e2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Inspector_I.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Resize_Corner.png b/indra/newview/skins/gold/textures/windows/Resize_Corner.png
new file mode 100644
index 0000000000..4a533011df
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Resize_Corner.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Toast_Background.png b/indra/newview/skins/gold/textures/windows/Toast_Background.png
new file mode 100644
index 0000000000..00676350ca
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Toast_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Toast_CloseBtn.png b/indra/newview/skins/gold/textures/windows/Toast_CloseBtn.png
new file mode 100644
index 0000000000..f37d8d085d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Toast_CloseBtn.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Toast_Over.png b/indra/newview/skins/gold/textures/windows/Toast_Over.png
new file mode 100644
index 0000000000..5191e0858d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Toast_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Volume_Background.png b/indra/newview/skins/gold/textures/windows/Volume_Background.png
new file mode 100644
index 0000000000..9f8680d079
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Volume_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Wearables_Divider.png b/indra/newview/skins/gold/textures/windows/Wearables_Divider.png
new file mode 100644
index 0000000000..8795ccd661
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Wearables_Divider.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Window_Background.png b/indra/newview/skins/gold/textures/windows/Window_Background.png
new file mode 100644
index 0000000000..f19fb0300b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Window_Background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/Window_Foreground.png b/indra/newview/skins/gold/textures/windows/Window_Foreground.png
new file mode 100644
index 0000000000..15d2ff72b6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/Window_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/windows/add_payment_image_center.png b/indra/newview/skins/gold/textures/windows/add_payment_image_center.png
index 0b99a72f32..0b99a72f32 100644
--- a/indra/newview/skins/contrast/textures/windows/add_payment_image_center.png
+++ b/indra/newview/skins/gold/textures/windows/add_payment_image_center.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/windows/add_payment_image_left.png b/indra/newview/skins/gold/textures/windows/add_payment_image_left.png
index a5b28d7023..a5b28d7023 100644
--- a/indra/newview/skins/contrast/textures/windows/add_payment_image_left.png
+++ b/indra/newview/skins/gold/textures/windows/add_payment_image_left.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/windows/add_payment_image_right.png b/indra/newview/skins/gold/textures/windows/add_payment_image_right.png
index 5724d39744..5724d39744 100644
--- a/indra/newview/skins/contrast/textures/windows/add_payment_image_right.png
+++ b/indra/newview/skins/gold/textures/windows/add_payment_image_right.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/first_login_image.jpg b/indra/newview/skins/gold/textures/windows/first_login_image.jpg
new file mode 100644
index 0000000000..58c417081a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/first_login_image.jpg
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_down.png b/indra/newview/skins/gold/textures/windows/hint_arrow_down.png
new file mode 100644
index 0000000000..b449d3be7c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/hint_arrow_down.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_left.png b/indra/newview/skins/gold/textures/windows/hint_arrow_left.png
new file mode 100644
index 0000000000..d93d621067
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/hint_arrow_left.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_lower_left.png b/indra/newview/skins/gold/textures/windows/hint_arrow_lower_left.png
new file mode 100644
index 0000000000..5e8def5a5b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/hint_arrow_lower_left.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_right.png b/indra/newview/skins/gold/textures/windows/hint_arrow_right.png
new file mode 100644
index 0000000000..3524487fb3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/hint_arrow_right.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_up.png b/indra/newview/skins/gold/textures/windows/hint_arrow_up.png
new file mode 100644
index 0000000000..aca440d712
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/hint_arrow_up.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/hint_background.png b/indra/newview/skins/gold/textures/windows/hint_background.png
new file mode 100644
index 0000000000..d045bc5e29
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/hint_background.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/login_mp_logo.png b/indra/newview/skins/gold/textures/windows/login_mp_logo.png
new file mode 100644
index 0000000000..7526374ba2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/login_mp_logo.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/login_mp_logo_small.png b/indra/newview/skins/gold/textures/windows/login_mp_logo_small.png
new file mode 100644
index 0000000000..779d8ff649
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/login_mp_logo_small.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/login_sl_logo.png b/indra/newview/skins/gold/textures/windows/login_sl_logo.png
new file mode 100644
index 0000000000..e4d4eb3ebf
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/login_sl_logo.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/login_sl_logo_small.png b/indra/newview/skins/gold/textures/windows/login_sl_logo_small.png
new file mode 100644
index 0000000000..36fb15de08
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/login_sl_logo_small.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/startup_logo.png b/indra/newview/skins/gold/textures/windows/startup_logo.png
new file mode 100644
index 0000000000..6a81a6451d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/startup_logo.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/yellow_gradient.png b/indra/newview/skins/gold/textures/windows/yellow_gradient.png
new file mode 100644
index 0000000000..4a07282ecb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/yellow_gradient.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/world/BeaconArrow.png b/indra/newview/skins/gold/textures/world/BeaconArrow.png
index 54934f738a..54934f738a 100644
--- a/indra/newview/skins/contrast/textures/world/BeaconArrow.png
+++ b/indra/newview/skins/gold/textures/world/BeaconArrow.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/world/CameraDragDot.png b/indra/newview/skins/gold/textures/world/CameraDragDot.png
new file mode 100644
index 0000000000..2ccf098e0f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/world/CameraDragDot.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/world/NoEntryLines.png b/indra/newview/skins/gold/textures/world/NoEntryLines.png
new file mode 100644
index 0000000000..b295ba1281
--- /dev/null
+++ b/indra/newview/skins/gold/textures/world/NoEntryLines.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/world/NoEntryPassLines.png b/indra/newview/skins/gold/textures/world/NoEntryPassLines.png
new file mode 100644
index 0000000000..34900e2c02
--- /dev/null
+++ b/indra/newview/skins/gold/textures/world/NoEntryPassLines.png
Binary files differ
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index bff2289a7c..29ca903256 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -66,6 +66,7 @@ static LLEventStream gTestPump("test_pump");
#include "../llstartup.h"
LLSLURL LLStartUp::sStartSLURL;
LLSLURL& LLStartUp::getStartSLURL() { return sStartSLURL; }
+std::string LLStartUp::getUserId() { return ""; };
#include "lllogin.h"
diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp
index d5e281bba8..10c68432a1 100644
--- a/indra/newview/tests/llviewerassetstats_test.cpp
+++ b/indra/newview/tests/llviewerassetstats_test.cpp
@@ -43,12 +43,15 @@ namespace LLStatViewer
LLTrace::SampleStatHandle<> FPS_SAMPLE("fpssample");
}
-void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars)
+void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars, S32& pending_meshes, S32& control_avatars)
{
counts.resize(3);
counts[0] = 0;
counts[1] = 0;
counts[2] = 1;
+ cloud_avatars = 0;
+ pending_meshes = 0;
+ control_avatars = 0;
}
// static
diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp
index d5bf189d82..60172b3960 100644
--- a/indra/newview/tests/llworldmap_test.cpp
+++ b/indra/newview/tests/llworldmap_test.cpp
@@ -32,6 +32,7 @@
#include "lltrans.h"
#include "lluistring.h"
#include "../llviewertexture.h"
+#include "../llviewercontrol.h"
#include "../llworldmapmessage.h"
// Class to test
#include "../llworldmap.h"
@@ -71,6 +72,11 @@ void LLUIString::updateResult() const { }
void LLUIString::setArg(const std::string& , const std::string& ) { }
void LLUIString::assign(const std::string& ) { }
+LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) {}
+LLControlGroup::~LLControlGroup() {}
+bool LLControlGroup::getBOOL(std::string_view) { return true; }
+LLControlGroup gSavedSettings("test_settings");
+
// End Stubbing
// -------------------------------------------------------------------------------------------
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index c778f1e838..0ce89df914 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -63,7 +63,6 @@ class ViewerManifest(LLManifest):
def construct(self):
super(ViewerManifest, self).construct()
self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg")
- self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
os.environ["XZ_DEFAULTS"] = "-T0"
@@ -248,6 +247,16 @@ class ViewerManifest(LLManifest):
}
return "%(channel_vendor_base)s%(channel_variant_underscores)s_%(version_underscores)s_%(arch)s" % substitution_strings
+ def installer_base_name_mac(self):
+ global CHANNEL_VENDOR_BASE
+ # a standard map of strings for replacing in the templates
+ substitution_strings = {
+ 'channel_vendor_base' : '_'.join(CHANNEL_VENDOR_BASE.split()),
+ 'channel_variant_underscores':self.channel_variant_app_suffix(),
+ 'version_underscores' : '_'.join(self.args['version'])
+ }
+ return "%(channel_vendor_base)s%(channel_variant_underscores)s_%(version_underscores)s_universal" % substitution_strings
+
def app_name(self):
global CHANNEL_VENDOR_BASE
channel_type=self.channel_type()
@@ -277,13 +286,13 @@ class ViewerManifest(LLManifest):
# All lines up to and including the first blank line are the file header; skip them
lines.reverse() # so that pop will pull from first to last line
- while not re.match("\s*$", lines.pop()) :
+ while not re.match(r"\s*$", lines.pop()) :
pass # do nothing
# A line that starts with a non-whitespace character is a name; all others describe contributions, so collect the names
names = []
for line in lines :
- if re.match("\S", line) :
+ if re.match(r"\S", line) :
names.append(line.rstrip())
# It's not fair to always put the same people at the head of the list
random.shuffle(names)
@@ -559,6 +568,9 @@ class Windows_x86_64_Manifest(ViewerManifest):
):
self.path(libfile)
+ if self.args['discord'] == 'ON':
+ self.path("discord_partner_sdk.dll")
+
if self.args['openal'] == 'ON':
# Get openal dll
self.path("OpenAL32.dll")
@@ -624,12 +636,16 @@ class Windows_x86_64_Manifest(ViewerManifest):
with self.prefix(src=os.path.join(pkgdir, 'bin', config)):
self.path("chrome_elf.dll")
self.path("d3dcompiler_47.dll")
+ self.path("dxcompiler.dll")
+ self.path("dxil.dll")
self.path("libcef.dll")
self.path("libEGL.dll")
self.path("libGLESv2.dll")
- self.path("dullahan_host.exe")
- self.path("snapshot_blob.bin")
self.path("v8_context_snapshot.bin")
+ self.path("vk_swiftshader.dll")
+ self.path("vk_swiftshader_icd.json")
+ self.path("vulkan-1.dll")
+ self.path("dullahan_host.exe")
# MSVC DLLs needed for CEF and have to be in same directory as plugin
with self.prefix(src=os.path.join(self.args['build'], os.pardir,
@@ -861,14 +877,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'):
@@ -928,16 +959,12 @@ class Darwin_x86_64_Manifest(ViewerManifest):
self.path("*.png")
self.path("*.gif")
- with self.prefix(src=relpkgdir, dst=""):
- self.path("libndofdev.dylib")
-
with self.prefix(src_dst="cursors_mac"):
self.path("*.tif")
self.path("licenses-mac.txt", dst="licenses.txt")
self.path("featuretable_mac.txt")
self.path("cube.dae")
- self.path("SecondLife.nib")
with self.prefix(src=pkgdir,dst=""):
self.path("ca-bundle.crt")
@@ -990,20 +1017,6 @@ class Darwin_x86_64_Manifest(ViewerManifest):
print("Skipping %s" % dst)
return added
- # WebRTC libraries
- with self.prefix(src=os.path.join(self.args['build'], os.pardir,
- 'sharedlibs', self.args['buildtype'], 'Resources')):
- for libfile in (
- 'libllwebrtc.dylib',
- ):
- self.path(libfile)
-
- oldpath = os.path.join("@rpath", libfile)
- self.run_command(
- ['install_name_tool', '-change', oldpath,
- '@executable_path/../Resources/%s' % libfile,
- executable])
-
# dylibs is a list of all the .dylib files we expect to need
# in our bundled sub-apps. For each of these we'll create a
# symlink from sub-app/Contents/Resources to the real .dylib.
@@ -1021,19 +1034,12 @@ class Darwin_x86_64_Manifest(ViewerManifest):
):
self.path2basename(relpkgdir, libfile)
- # OpenAL dylibs
- if self.args['openal'] == 'ON':
+ # Discord social SDK
+ if self.args['discord'] == 'ON':
for libfile in (
- "libopenal.dylib",
- "libalut.dylib",
+ "libdiscord_partner_sdk.dylib",
):
- dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
-
- oldpath = os.path.join("@rpath", libfile)
- self.run_command(
- ['install_name_tool', '-change', oldpath,
- '@executable_path/../Resources/%s' % libfile,
- executable])
+ self.path2basename(relpkgdir, libfile)
# our apps
executable_path = {}
@@ -1045,125 +1051,36 @@ class Darwin_x86_64_Manifest(ViewerManifest):
executable_path[app] = \
self.dst_path_of(os.path.join(app, "Contents", "MacOS"))
- # our apps dependencies on shared libs
- # for each app, for each dylib we collected in dylibs,
- # create a symlink to the real copy of the dylib.
- with self.prefix(dst=os.path.join(app, "Contents", "Resources")):
- for libfile in dylibs:
- self.relsymlinkf(os.path.join(libfile_parent, libfile))
-
# Dullahan helper apps go inside SLPlugin.app
with self.prefix(dst=os.path.join(
"SLPlugin.app", "Contents", "Frameworks")):
-
- frameworkname = 'Chromium Embedded Framework'
-
- # This code constructs a relative symlink from the
- # target framework folder back to the real CEF framework.
- # It needs to be relative so that the symlink still works when
- # (as is normal) the user moves the app bundle out of the DMG
- # and into the /Applications folder. Note we pass catch=False,
- # letting the uncaught exception terminate the process, since
- # without this symlink, Second Life web media can't possibly work.
-
- # It might seem simpler just to symlink Frameworks back to
- # the parent of Chromimum Embedded Framework.framework. But
- # that would create a symlink cycle, which breaks our
- # packaging step. So make a symlink from Chromium Embedded
- # Framework.framework to the directory of the same name, which
- # is NOT an ancestor of the symlink.
-
- # from SLPlugin.app/Contents/Frameworks/Chromium Embedded
- # Framework.framework back to
- # $viewer_app/Contents/Frameworks/Chromium Embedded Framework.framework
- SLPlugin_framework = self.relsymlinkf(CEF_framework, catch=False)
-
- # for all the multiple CEF/Dullahan (as of CEF 76) helper app bundles we need:
- for helper in (
- "DullahanHelper",
- "DullahanHelper (GPU)",
- "DullahanHelper (Renderer)",
- "DullahanHelper (Plugin)",
- ):
- # app is the directory name of the app bundle, with app/Contents/MacOS/helper as the executable
- app = helper + ".app"
-
- # copy DullahanHelper.app
- self.path2basename(relpkgdir, app)
-
- # and fix that up with a Frameworks/CEF symlink too
- with self.prefix(dst=os.path.join(
- app, 'Contents', 'Frameworks')):
- # from Dullahan Helper *.app/Contents/Frameworks/Chromium Embedded
- # Framework.framework back to
- # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework
- # Since SLPlugin_framework is itself a
- # symlink, don't let relsymlinkf() resolve --
- # explicitly call relpath(symlink=True) and
- # create that symlink here.
- helper_framework = \
- self.symlinkf(self.relpath(SLPlugin_framework, symlink=True), catch=False)
-
- # change_command includes install_name_tool, the
- # -change subcommand and the old framework rpath
- # stamped into the executable. To use it with
- # run_command(), we must still append the new
- # framework path and the pathname of the
- # executable to change.
- change_command = [
- 'install_name_tool', '-change',
- '@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework']
-
- with self.prefix(dst=os.path.join(
- app, 'Contents', 'MacOS')):
- # Now self.get_dst_prefix() is, at runtime,
- # @executable_path. Locate the helper app
- # framework (which is a symlink) from here.
- newpath = os.path.join(
- '@executable_path',
- self.relpath(helper_framework, symlink=True),
- frameworkname)
- # and restamp the Dullahan Helper executable itself
- self.run_command(
- change_command +
- [newpath, self.dst_path_of(helper)])
-
- # SLPlugin plugins
- with self.prefix(dst="llplugin"):
- dylibexecutable = 'media_plugin_cef.dylib'
+ # copy CEF plugin
self.path2basename("../media_plugins/cef/" + self.args['configuration'],
- dylibexecutable)
-
- # 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()
+ imagename = self.installer_base_name_mac()
self.set_github_output('imagename', imagename)
finalname = imagename + ".dmg"
self.package_file = finalname
@@ -1825,6 +1742,7 @@ if __name__ == "__main__":
extra_arguments = [
dict(name='bugsplat', description="""BugSplat database to which to post crashes,
if BugSplat crash reporting is desired""", default=''),
+ dict(name='discord', description="""Indication discord social sdk libraries are needed""", default='OFF'),
dict(name='openal', description="""Indication openal libraries are needed""", default='OFF'),
dict(name='tracy', description="""Indication tracy profiler is enabled""", default='OFF'),
]
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index 745c0eedf8..f80286a630 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -114,7 +114,7 @@ if (LL_TESTS)
# but the CMake $<TARGET_FILE_DIR> generator expression isn't evaluated by
# CREATE_LINK, so fudge it.
add_custom_command( TARGET lltest POST_BUILD
- COMMAND cmake -E create_symlink ${SHARED_LIB_STAGING_DIR} ${CMAKE_BINARY_DIR}/test/Resources
+ COMMAND ${CMAKE_COMMAND} -E create_symlink ${SHARED_LIB_STAGING_DIR} ${CMAKE_BINARY_DIR}/test/Resources
)
endif()
endif (LL_TESTS)
diff --git a/indra/test/llhttpdate_tut.cpp b/indra/test/llhttpdate_tut.cpp
index a47602dec5..b580b09a9f 100644
--- a/indra/test/llhttpdate_tut.cpp
+++ b/indra/test/llhttpdate_tut.cpp
@@ -112,13 +112,8 @@ namespace tut
void httpdate_object::test<4>()
{
// test localization of http dates
-#if LL_WINDOWS
- const char *en_locale = "english";
- const char *fr_locale = "french";
-#else
- const char *en_locale = "en_GB.UTF-8";
+ const char *en_locale = "en_US.UTF-8";
const char *fr_locale = "fr_FR.UTF-8";
-#endif
std::string prev_locale = LLStringUtil::getLocale();
std::string prev_clocale = std::string(setlocale(LC_TIME, NULL));
diff --git a/indra/test/test.cpp b/indra/test/test.cpp
index 6e280819df..09147a65a3 100644
--- a/indra/test/test.cpp
+++ b/indra/test/test.cpp
@@ -36,7 +36,6 @@
#include "linden_common.h"
#include "llerrorcontrol.h"
-#include "llexception.h"
#include "lltut.h"
#include "chained_callback.h"
#include "stringize.h"
@@ -57,6 +56,13 @@
#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
+// On Mac, got:
+// #error "Boost.Stacktrace requires `_Unwind_Backtrace` function. Define
+// `_GNU_SOURCE` macro or `BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED` if
+// _Unwind_Backtrace is available without `_GNU_SOURCE`."
+#define BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED
+#include <boost/stacktrace.hpp>
+
#include <fstream>
void wouldHaveCrashed(const std::string& message);
@@ -506,6 +512,64 @@ void wouldHaveCrashed(const std::string& message)
static LLTrace::ThreadRecorder* sMasterThreadRecorder = NULL;
+// this is used in platform-generic code -- define outside #if LL_WINDOWS
+struct Windows_SEH_exception: public std::runtime_error
+{
+ Windows_SEH_exception(const std::string& what): std::runtime_error(what) {}
+};
+
+#if LL_WINDOWS
+
+static constexpr U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
+static constexpr U32 STATUS_STACK_FULL = 0xC00000FD;
+
+U32 seh_filter(U32 code, struct _EXCEPTION_POINTERS*)
+{
+ if (code == STATUS_MSC_EXCEPTION)
+ {
+ // C++ exception, go on -- but TUT is supposed to have caught those already?!
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ else
+ {
+ // This is a non-C++ exception, e.g. hardware check.
+ // By the time the handler gets control, the stack has been unwound,
+ // so report the stack trace now at filter() time.
+ // Sadly, even though, at the time of this writing, stack overflow is
+ // the problem we would most like to diagnose, calling another
+ // function when the stack is already blown only terminates us faster.
+ if (code != STATUS_STACK_FULL)
+ {
+ std::cerr << boost::stacktrace::stacktrace() << std::endl;
+ }
+ // pass control into the handler block
+ return EXCEPTION_EXECUTE_HANDLER;
+ }
+}
+
+template <typename CALLABLE0, typename CALLABLE1>
+void seh_catcher(CALLABLE0&& trycode, CALLABLE1&& handler)
+{
+ __try
+ {
+ trycode();
+ }
+ __except (seh_filter(GetExceptionCode(), GetExceptionInformation()))
+ {
+ handler(GetExceptionCode());
+ }
+}
+
+#else // not LL_WINDOWS
+
+template <typename CALLABLE0, typename CALLABLE1>
+void seh_catcher(CALLABLE0&& trycode, CALLABLE1&&)
+{
+ trycode();
+}
+
+#endif // not LL_WINDOWS
+
int main(int argc, char **argv)
{
ll_init_apr();
@@ -638,7 +702,7 @@ int main(int argc, char **argv)
// a chained_callback subclass must be linked with previous
mycallback->link();
- LL::seh::catcher(
+ seh_catcher(
// __try
[test_group]
{
@@ -652,7 +716,7 @@ int main(int argc, char **argv)
}
},
// __except
- [mycallback](U32 code, const std::string& /*stacktrace*/)
+ [mycallback](U32 code)
{
static std::map<U32, const char*> codes = {
{ 0xC0000005, "Access Violation" },
diff --git a/indra/tools/vstool/DispatchUtility.cs b/indra/tools/vstool/DispatchUtility.cs
deleted file mode 100644
index 6056ac55a1..0000000000
--- a/indra/tools/vstool/DispatchUtility.cs
+++ /dev/null
@@ -1,271 +0,0 @@
-#region Using Directives
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Runtime.InteropServices;
-using System.Reflection;
-using System.Security.Permissions;
-
-#endregion
-
-namespace TestDispatchUtility
-{
- /// <summary>
- /// Provides helper methods for working with COM IDispatch objects that have a registered type library.
- /// </summary>
- public static class DispatchUtility
- {
- #region Private Constants
-
- private const int S_OK = 0; //From WinError.h
- private const int LOCALE_SYSTEM_DEFAULT = 2 << 10; //From WinNT.h == 2048 == 0x800
-
- #endregion
-
- #region Public Methods
-
- /// <summary>
- /// Gets whether the specified object implements IDispatch.
- /// </summary>
- /// <param name="obj">An object to check.</param>
- /// <returns>True if the object implements IDispatch. False otherwise.</returns>
- public static bool ImplementsIDispatch(object obj)
- {
- bool result = obj is IDispatchInfo;
- return result;
- }
-
- /// <summary>
- /// Gets a Type that can be used with reflection.
- /// </summary>
- /// <param name="obj">An object that implements IDispatch.</param>
- /// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
- /// <returns>A .NET Type that can be used with reflection.</returns>
- /// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
- [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
- public static Type GetType(object obj, bool throwIfNotFound)
- {
- RequireReference(obj, "obj");
- Type result = GetType((IDispatchInfo)obj, throwIfNotFound);
- return result;
- }
-
- /// <summary>
- /// Tries to get the DISPID for the requested member name.
- /// </summary>
- /// <param name="obj">An object that implements IDispatch.</param>
- /// <param name="name">The name of a member to lookup.</param>
- /// <param name="dispId">If the method returns true, this holds the DISPID on output.
- /// If the method returns false, this value should be ignored.</param>
- /// <returns>True if the member was found and resolved to a DISPID. False otherwise.</returns>
- /// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
- [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
- public static bool TryGetDispId(object obj, string name, out int dispId)
- {
- RequireReference(obj, "obj");
- bool result = TryGetDispId((IDispatchInfo)obj, name, out dispId);
- return result;
- }
-
- /// <summary>
- /// Invokes a member by DISPID.
- /// </summary>
- /// <param name="obj">An object that implements IDispatch.</param>
- /// <param name="dispId">The DISPID of a member. This can be obtained using
- /// <see cref="TryGetDispId(object, string, out int)"/>.</param>
- /// <param name="args">The arguments to pass to the member.</param>
- /// <returns>The member's return value.</returns>
- /// <remarks>
- /// This can invoke a method or a property get accessor.
- /// </remarks>
- public static object Invoke(object obj, int dispId, object[] args)
- {
- string memberName = "[DispId=" + dispId + "]";
- object result = Invoke(obj, memberName, args);
- return result;
- }
-
- /// <summary>
- /// Invokes a member by name.
- /// </summary>
- /// <param name="obj">An object.</param>
- /// <param name="memberName">The name of the member to invoke.</param>
- /// <param name="args">The arguments to pass to the member.</param>
- /// <returns>The member's return value.</returns>
- /// <remarks>
- /// This can invoke a method or a property get accessor.
- /// </remarks>
- public static object Invoke(object obj, string memberName, object[] args)
- {
- RequireReference(obj, "obj");
- Type type = obj.GetType();
- object result = type.InvokeMember(memberName, BindingFlags.InvokeMethod | BindingFlags.GetProperty,
- null, obj, args, null);
- return result;
- }
-
- #endregion
-
- #region Private Methods
-
- /// <summary>
- /// Requires that the value is non-null.
- /// </summary>
- /// <typeparam name="T">The type of the value.</typeparam>
- /// <param name="value">The value to check.</param>
- /// <param name="name">The name of the value.</param>
- private static void RequireReference<T>(T value, string name) where T : class
- {
- if (value == null)
- {
- throw new ArgumentNullException(name);
- }
- }
-
- /// <summary>
- /// Gets a Type that can be used with reflection.
- /// </summary>
- /// <param name="dispatch">An object that implements IDispatch.</param>
- /// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
- /// <returns>A .NET Type that can be used with reflection.</returns>
- private static Type GetType(IDispatchInfo dispatch, bool throwIfNotFound)
- {
- RequireReference(dispatch, "dispatch");
-
- Type result = null;
- int typeInfoCount;
- int hr = dispatch.GetTypeInfoCount(out typeInfoCount);
- if (hr == S_OK && typeInfoCount > 0)
- {
- // Type info isn't usually culture-aware for IDispatch, so we might as well pass
- // the default locale instead of looking up the current thread's LCID each time
- // (via CultureInfo.CurrentCulture.LCID).
- dispatch.GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, out result);
- }
-
- if (result == null && throwIfNotFound)
- {
- // If the GetTypeInfoCount called failed, throw an exception for that.
- Marshal.ThrowExceptionForHR(hr);
-
- // Otherwise, throw the same exception that Type.GetType would throw.
- throw new TypeLoadException();
- }
-
- return result;
- }
-
- /// <summary>
- /// Tries to get the DISPID for the requested member name.
- /// </summary>
- /// <param name="dispatch">An object that implements IDispatch.</param>
- /// <param name="name">The name of a member to lookup.</param>
- /// <param name="dispId">If the method returns true, this holds the DISPID on output.
- /// If the method returns false, this value should be ignored.</param>
- /// <returns>True if the member was found and resolved to a DISPID. False otherwise.</returns>
- private static bool TryGetDispId(IDispatchInfo dispatch, string name, out int dispId)
- {
- RequireReference(dispatch, "dispatch");
- RequireReference(name, "name");
-
- bool result = false;
-
- // Members names aren't usually culture-aware for IDispatch, so we might as well
- // pass the default locale instead of looking up the current thread's LCID each time
- // (via CultureInfo.CurrentCulture.LCID).
- Guid iidNull = Guid.Empty;
- int hr = dispatch.GetDispId(ref iidNull, ref name, 1, LOCALE_SYSTEM_DEFAULT, out dispId);
-
- const int DISP_E_UNKNOWNNAME = unchecked((int)0x80020006); //From WinError.h
- const int DISPID_UNKNOWN = -1; //From OAIdl.idl
- if (hr == S_OK)
- {
- result = true;
- }
- else if (hr == DISP_E_UNKNOWNNAME && dispId == DISPID_UNKNOWN)
- {
- // This is the only supported "error" case because it means IDispatch
- // is saying it doesn't know the member we asked about.
- result = false;
- }
- else
- {
- // The other documented result codes are all errors.
- Marshal.ThrowExceptionForHR(hr);
- }
-
- return result;
- }
-
- #endregion
-
- #region Private Interfaces
-
- /// <summary>
- /// A partial declaration of IDispatch used to lookup Type information and DISPIDs.
- /// </summary>
- /// <remarks>
- /// This interface only declares the first three methods of IDispatch. It omits the
- /// fourth method (Invoke) because there are already plenty of ways to do dynamic
- /// invocation in .NET. But the first three methods provide dynamic type metadata
- /// discovery, which .NET doesn't provide normally if you have a System.__ComObject
- /// RCW instead of a strongly-typed RCW.
- /// <para/>
- /// Note: The original declaration of IDispatch is in OAIdl.idl.
- /// </remarks>
- [ComImport]
- [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- [Guid("00020400-0000-0000-C000-000000000046")]
- private interface IDispatchInfo
- {
- /// <summary>
- /// Gets the number of Types that the object provides (0 or 1).
- /// </summary>
- /// <param name="typeInfoCount">Returns 0 or 1 for the number of Types provided by <see cref="GetTypeInfo"/>.</param>
- /// <remarks>
- /// http://msdn.microsoft.com/en-us/library/da876d53-cb8a-465c-a43e-c0eb272e2a12(VS.85)
- /// </remarks>
- [PreserveSig]
- int GetTypeInfoCount(out int typeInfoCount);
-
- /// <summary>
- /// Gets the Type information for an object if <see cref="GetTypeInfoCount"/> returned 1.
- /// </summary>
- /// <param name="typeInfoIndex">Must be 0.</param>
- /// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
- /// <param name="typeInfo">Returns the object's Type information.</param>
- /// <remarks>
- /// http://msdn.microsoft.com/en-us/library/cc1ec9aa-6c40-4e70-819c-a7c6dd6b8c99(VS.85)
- /// </remarks>
- void GetTypeInfo(int typeInfoIndex, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler,
- MarshalTypeRef = typeof(System.Runtime.InteropServices.CustomMarshalers.TypeToTypeInfoMarshaler))] out Type typeInfo);
-
- /// <summary>
- /// Gets the DISPID of the specified member name.
- /// </summary>
- /// <param name="riid">Must be IID_NULL. Pass a copy of Guid.Empty.</param>
- /// <param name="name">The name of the member to look up.</param>
- /// <param name="nameCount">Must be 1.</param>
- /// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
- /// <param name="dispId">If a member with the requested <paramref name="name"/>
- /// is found, this returns its DISPID and the method's return value is 0.
- /// If the method returns a non-zero value, then this parameter's output value is
- /// undefined.</param>
- /// <returns>Zero for success. Non-zero for failure.</returns>
- /// <remarks>
- /// http://msdn.microsoft.com/en-us/library/6f6cf233-3481-436e-8d6a-51f93bf91619(VS.85)
- /// </remarks>
- [PreserveSig]
- int GetDispId(ref Guid riid, ref string name, int nameCount, int lcid, out int dispId);
-
- // NOTE: The real IDispatch also has an Invoke method next, but we don't need it.
- // We can invoke methods using .NET's Type.InvokeMember method with the special
- // [DISPID=n] syntax for member "names", or we can get a .NET Type using GetTypeInfo
- // and invoke methods on that through reflection.
- // Type.InvokeMember: http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx
- }
-
- #endregion
- }
-}
diff --git a/indra/tools/vstool/README.txt b/indra/tools/vstool/README.txt
deleted file mode 100644
index e419180031..0000000000
--- a/indra/tools/vstool/README.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-VSTool is a command line utility to manipulate VisualStudio settings.
-
-The windows cmake project configuration uses VSTool.exe
-
-A handy upgrade:
- figure out how to make cmake build this csharp app
- - or write the app using script (jscript?!?) so it doesn't need to be built.
-
-
diff --git a/indra/tools/vstool/VSTool.csproj b/indra/tools/vstool/VSTool.csproj
deleted file mode 100755
index 7f431e85c7..0000000000
--- a/indra/tools/vstool/VSTool.csproj
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
- <PropertyGroup>
- <ProjectType>Local</ProjectType>
- <ProductVersion>8.0.50727</ProductVersion>
- <SchemaVersion>2.0</SchemaVersion>
- <ProjectGuid>{96943E2D-1373-4617-A117-D0F997A94919}</ProjectGuid>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ApplicationIcon>
- </ApplicationIcon>
- <AssemblyKeyContainerName>
- </AssemblyKeyContainerName>
- <AssemblyName>VSTool</AssemblyName>
- <AssemblyOriginatorKeyFile>
- </AssemblyOriginatorKeyFile>
- <DefaultClientScript>JScript</DefaultClientScript>
- <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
- <DefaultTargetSchema>IE50</DefaultTargetSchema>
- <DelaySign>false</DelaySign>
- <OutputType>Exe</OutputType>
- <RootNamespace>VSTool</RootNamespace>
- <RunPostBuildEvent>Always</RunPostBuildEvent>
- <StartupObject>VSTool.VSToolMain</StartupObject>
- <FileUpgradeFlags>
- </FileUpgradeFlags>
- <UpgradeBackupLocation>
- </UpgradeBackupLocation>
- <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
- <OldToolsVersion>2.0</OldToolsVersion>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <OutputPath>.\</OutputPath>
- <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
- <BaseAddress>285212672</BaseAddress>
- <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
- <ConfigurationOverrideFile>
- </ConfigurationOverrideFile>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <DocumentationFile>
- </DocumentationFile>
- <DebugSymbols>true</DebugSymbols>
- <FileAlignment>4096</FileAlignment>
- <NoStdLib>false</NoStdLib>
- <NoWarn>
- </NoWarn>
- <Optimize>false</Optimize>
- <RegisterForComInterop>false</RegisterForComInterop>
- <RemoveIntegerChecks>false</RemoveIntegerChecks>
- <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
- <WarningLevel>4</WarningLevel>
- <DebugType>full</DebugType>
- <ErrorReport>prompt</ErrorReport>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <OutputPath>.\</OutputPath>
- <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
- <BaseAddress>285212672</BaseAddress>
- <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
- <ConfigurationOverrideFile>
- </ConfigurationOverrideFile>
- <DefineConstants>TRACE</DefineConstants>
- <DocumentationFile>
- </DocumentationFile>
- <DebugSymbols>false</DebugSymbols>
- <FileAlignment>4096</FileAlignment>
- <NoStdLib>false</NoStdLib>
- <NoWarn>
- </NoWarn>
- <Optimize>true</Optimize>
- <RegisterForComInterop>false</RegisterForComInterop>
- <RemoveIntegerChecks>false</RemoveIntegerChecks>
- <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
- <WarningLevel>4</WarningLevel>
- <DebugType>none</DebugType>
- <ErrorReport>prompt</ErrorReport>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="System">
- <Name>System</Name>
- </Reference>
- <Reference Include="System.Data">
- <Name>System.Data</Name>
- </Reference>
- </ItemGroup>
- <ItemGroup>
- <Compile Include="main.cs">
- <SubType>Code</SubType>
- </Compile>
- </ItemGroup>
- <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
- <PropertyGroup>
- <PreBuildEvent>
- </PreBuildEvent>
- <PostBuildEvent>
- </PostBuildEvent>
- </PropertyGroup>
-</Project> \ No newline at end of file
diff --git a/indra/tools/vstool/VSTool.exe b/indra/tools/vstool/VSTool.exe
deleted file mode 100755
index 751540413a..0000000000
--- a/indra/tools/vstool/VSTool.exe
+++ /dev/null
Binary files differ
diff --git a/indra/tools/vstool/VSTool.sln b/indra/tools/vstool/VSTool.sln
deleted file mode 100755
index 21e3d75971..0000000000
--- a/indra/tools/vstool/VSTool.sln
+++ /dev/null
@@ -1,19 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/indra/tools/vstool/app.config b/indra/tools/vstool/app.config
deleted file mode 100644
index 8494f728ff..0000000000
--- a/indra/tools/vstool/app.config
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<configuration>
-<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
diff --git a/indra/tools/vstool/main.cs b/indra/tools/vstool/main.cs
deleted file mode 100755
index 1d6b2f14d1..0000000000
--- a/indra/tools/vstool/main.cs
+++ /dev/null
@@ -1,733 +0,0 @@
-// Code about getting running instances visual studio
-// was borrowed from
-// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx
-
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Reflection;
-using System.Runtime.InteropServices;
-using System.Runtime.InteropServices.ComTypes;
-using Microsoft.CSharp;
-
-namespace VSTool
-{
- // The MessageFilter class comes from:
- // http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx
- // It allows vstool to get timing error messages from
- // visualstudio and handle them.
- public class MessageFilter : IOleMessageFilter
- {
- //
- // Class containing the IOleMessageFilter
- // thread error-handling functions.
-
- // Start the filter.
- public static void Register()
- {
- IOleMessageFilter newFilter = new MessageFilter();
- IOleMessageFilter oldFilter = null;
- CoRegisterMessageFilter(newFilter, out oldFilter);
- }
-
- // Done with the filter, close it.
- public static void Revoke()
- {
- IOleMessageFilter oldFilter = null;
- CoRegisterMessageFilter(null, out oldFilter);
- }
-
- //
- // IOleMessageFilter functions.
- // Handle incoming thread requests.
- int IOleMessageFilter.HandleInComingCall(int dwCallType,
- System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr
- lpInterfaceInfo)
- {
- //Return the flag SERVERCALL_ISHANDLED.
- return 0;
- }
-
- // Thread call was rejected, so try again.
- int IOleMessageFilter.RetryRejectedCall(System.IntPtr
- hTaskCallee, int dwTickCount, int dwRejectType)
- {
- if (dwRejectType == 2)
- // flag = SERVERCALL_RETRYLATER.
- {
- // Retry the thread call immediately if return >=0 &
- // <100.
- return 99;
- }
- // Too busy; cancel call.
- return -1;
- }
-
- int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee,
- int dwTickCount, int dwPendingType)
- {
- //Return the flag PENDINGMSG_WAITDEFPROCESS.
- return 2;
- }
-
- // Implement the IOleMessageFilter interface.
- [DllImport("Ole32.dll")]
- private static extern int
- CoRegisterMessageFilter(IOleMessageFilter newFilter, out
- IOleMessageFilter oldFilter);
- }
-
- [ComImport(), Guid("00000016-0000-0000-C000-000000000046"),
- InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
- interface IOleMessageFilter
- {
- [PreserveSig]
- int HandleInComingCall(
- int dwCallType,
- IntPtr hTaskCaller,
- int dwTickCount,
- IntPtr lpInterfaceInfo);
-
- [PreserveSig]
- int RetryRejectedCall(
- IntPtr hTaskCallee,
- int dwTickCount,
- int dwRejectType);
-
- [PreserveSig]
- int MessagePending(
- IntPtr hTaskCallee,
- int dwTickCount,
- int dwPendingType);
- }
-
- class ViaCOM
- {
- public static object GetProperty(object from_obj, string prop_name)
- {
- try
- {
- Type objType = from_obj.GetType();
- return objType.InvokeMember(
- prop_name,
- BindingFlags.GetProperty, null,
- from_obj,
- null);
- }
- catch (Exception e)
- {
- Console.WriteLine("Error getting property: \"{0}\"", prop_name);
- Console.WriteLine(e.Message);
- throw e;
- }
- }
-
- public static object SetProperty(object from_obj, string prop_name, object new_value)
- {
- try
- {
- object[] args = { new_value };
- Type objType = from_obj.GetType();
- return objType.InvokeMember(
- prop_name,
- BindingFlags.DeclaredOnly |
- BindingFlags.Public |
- BindingFlags.NonPublic |
- BindingFlags.Instance |
- BindingFlags.SetProperty,
- null,
- from_obj,
- args);
- }
- catch (Exception e)
- {
- Console.WriteLine("Error setting property: \"{0}\"", prop_name);
- Console.WriteLine(e.Message);
- throw e;
- }
- }
-
- public static object CallMethod(object from_obj, string method_name, params object[] args)
- {
- try
- {
- Type objType = from_obj.GetType();
- return objType.InvokeMember(
- method_name,
- BindingFlags.DeclaredOnly |
- BindingFlags.Public |
- BindingFlags.NonPublic |
- BindingFlags.Instance |
- BindingFlags.InvokeMethod,
- null,
- from_obj,
- args);
- }
- catch (Exception e)
- {
- Console.WriteLine("Error calling method \"{0}\"", method_name);
- Console.WriteLine(e.Message);
- throw e;
- }
- }
- };
-
- /// <summary>
- /// The main entry point class for VSTool.
- /// </summary>
- class VSToolMain
- {
- #region Interop imports
- [DllImport("ole32.dll")]
- public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);
-
- [DllImport("ole32.dll")]
- public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);
- #endregion
-
- static System.Boolean ignore_case = true;
-
- static string solution_name = null;
- static bool use_new_vs = false;
- static Hashtable projectDict = new Hashtable();
- static string startup_project = null;
- static string config = null;
-
- static object dte = null;
- static object solution = null;
-
- /// <summary>
- /// The main entry point for the application.
- /// </summary>
- [STAThread]
- static int Main(string[] args)
- {
- int retVal = 0;
- bool need_save = false;
-
- try
- {
- parse_command_line(args);
-
- Console.WriteLine("Editing solution: {0}", solution_name);
-
- bool found_open_solution = GetDTEAndSolution();
-
- if (dte == null || solution == null)
- {
- retVal = 1;
- }
- else
- {
- MessageFilter.Register();
-
- // Walk through all of the projects in the solution
- // and list the type of each project.
- foreach (DictionaryEntry p in projectDict)
- {
- string project_name = (string)p.Key;
- string working_dir = (string)p.Value;
- if (SetProjectWorkingDir(solution, project_name, working_dir))
- {
- need_save = true;
- }
- }
-
- if (config != null)
- {
- need_save = SetActiveConfig(config);
- }
-
- if (startup_project != null)
- {
- need_save = SetStartupProject(startup_project);
- }
-
- if (need_save)
- {
- if (found_open_solution == false)
- {
- ViaCOM.CallMethod(solution, "Close", null);
- }
- }
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Message);
- retVal = 1;
- }
- finally
- {
- if (solution != null)
- {
- Marshal.ReleaseComObject(solution);
- solution = null;
- }
-
- if (dte != null)
- {
- Marshal.ReleaseComObject(dte);
- dte = null;
- }
-
- MessageFilter.Revoke();
- }
- return retVal;
- }
-
- public static bool parse_command_line(string[] args)
- {
- string options_desc =
- "--solution <solution_name> : MSVC solution name. (required)\n" +
- "--use_new_vs : Ignore running versions of visual studio.\n" +
- "--workingdir <project> <dir> : Set working dir of a VC project.\n" +
- "--config <config> : Set the active config for the solution.\n" +
- "--startup <project> : Set the startup project for the solution.\n";
-
- try
- {
- // Command line param parsing loop.
- int i = 0;
- for (; i < args.Length; ++i)
- {
- if ("--solution" == args[i])
- {
- if (solution_name != null)
- {
- throw new ApplicationException("Found second --solution option");
- }
- solution_name = args[++i];
- }
- else if ("--use_new_vs" == args[i])
- {
- use_new_vs = true;
- }
-
- else if ("--workingdir" == args[i])
- {
- string project_name = args[++i];
- string working_dir = args[++i];
- projectDict.Add(project_name, working_dir);
- }
- else if ("--config" == args[i])
- {
- if (config != null)
- {
- throw new ApplicationException("Found second --config option");
- }
- config = args[++i];
- }
- else if ("--startup" == args[i])
- {
- if (startup_project != null)
- {
- throw new ApplicationException("Found second --startup option");
- }
- startup_project = args[++i];
- }
- else
- {
- throw new ApplicationException("Found unrecognized token on command line: " + args[i]);
- }
- }
-
- if (solution_name == null)
- {
- throw new ApplicationException("The --solution option is required.");
- }
- }
- catch(ApplicationException e)
- {
-
- Console.WriteLine("Oops! " + e.Message);
- Console.Write("Command line:");
- foreach (string arg in args)
- {
- Console.Write(" " + arg);
- }
- Console.Write("\n\n");
- Console.WriteLine("VSTool command line usage");
- Console.Write(options_desc);
- throw e;
- }
- return true;
- }
-
- public static bool GetDTEAndSolution()
- {
- bool found_open_solution = true;
-
- Console.WriteLine("Looking for existing VisualStudio instance...");
-
- // Get an instance of the currently running Visual Studio .NET IDE.
- // dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1");
- string full_solution_name = System.IO.Path.GetFullPath(solution_name);
- if (false == use_new_vs)
- {
- dte = GetIDEInstance(full_solution_name);
- }
-
- if (dte == null)
- {
- try
- {
- Console.WriteLine(" Didn't find open solution, starting new background VisualStudio instance...");
- Console.WriteLine(" Reading .sln file version...");
- string version = GetSolutionVersion(full_solution_name);
-
- Console.WriteLine(" Using version: {0}...", version);
- string progid = GetVSProgID(version);
-
- Type objType = Type.GetTypeFromProgID(progid);
- dte = System.Activator.CreateInstance(objType);
- Console.WriteLine(" Reading solution: \"{0}\"", full_solution_name);
-
- solution = ViaCOM.GetProperty(dte, "Solution");
- object[] openArgs = { full_solution_name };
- ViaCOM.CallMethod(solution, "Open", openArgs);
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Message);
- Console.WriteLine("Quitting do to error opening: {0}", full_solution_name);
- solution = null;
- dte = null;
- return found_open_solution;
- }
- found_open_solution = false;
- }
-
- if (solution == null)
- {
- solution = ViaCOM.GetProperty(dte, "Solution");
- }
-
- return found_open_solution;
- }
-
- /// <summary>
- /// Get the DTE object for the instance of Visual Studio IDE that has
- /// the specified solution open.
- /// </summary>
- /// <param name="solutionFile">The absolute filename of the solution</param>
- /// <returns>Corresponding DTE object or null if no such IDE is running</returns>
- public static object GetIDEInstance( string solutionFile )
- {
- Hashtable runningInstances = GetIDEInstances( true );
- IDictionaryEnumerator enumerator = runningInstances.GetEnumerator();
-
- while ( enumerator.MoveNext() )
- {
- try
- {
- object ide = enumerator.Value;
- if (ide != null)
- {
- object sol = ViaCOM.GetProperty(ide, "Solution");
- if (0 == string.Compare((string)ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case))
- {
- return ide;
- }
- }
- }
- catch{}
- }
-
- return null;
- }
-
- /// <summary>
- /// Get a table of the currently running instances of the Visual Studio .NET IDE.
- /// </summary>
- /// <param name="openSolutionsOnly">Only return instances that have opened a solution</param>
- /// <returns>A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object</returns>
- public static Hashtable GetIDEInstances( bool openSolutionsOnly )
- {
- Hashtable runningIDEInstances = new Hashtable();
- Hashtable runningObjects = GetRunningObjectTable();
-
- IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator();
- while ( rotEnumerator.MoveNext() )
- {
- string candidateName = (string) rotEnumerator.Key;
- if (!candidateName.StartsWith("!VisualStudio.DTE"))
- continue;
-
- object ide = rotEnumerator.Value;
- if (ide == null)
- continue;
-
- if (openSolutionsOnly)
- {
- try
- {
- object sol = ViaCOM.GetProperty(ide, "Solution");
- string solutionFile = (string)ViaCOM.GetProperty(sol, "FullName");
- if (solutionFile != String.Empty)
- {
- runningIDEInstances[ candidateName ] = ide;
- }
- }
- catch {}
- }
- else
- {
- runningIDEInstances[ candidateName ] = ide;
- }
- }
- return runningIDEInstances;
- }
-
- /// <summary>
- /// Get a snapshot of the running object table (ROT).
- /// </summary>
- /// <returns>A hashtable mapping the name of the object in the ROT to the corresponding object</returns>
- [STAThread]
- public static Hashtable GetRunningObjectTable()
- {
- Hashtable result = new Hashtable();
-
- int numFetched = 0;
- IRunningObjectTable runningObjectTable;
- IEnumMoniker monikerEnumerator;
- IMoniker[] monikers = new IMoniker[1];
-
- GetRunningObjectTable(0, out runningObjectTable);
- runningObjectTable.EnumRunning(out monikerEnumerator);
- monikerEnumerator.Reset();
-
- while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0)
- {
- IBindCtx ctx;
- CreateBindCtx(0, out ctx);
-
- string runningObjectName;
- monikers[0].GetDisplayName(ctx, null, out runningObjectName);
-
- object runningObjectVal;
- runningObjectTable.GetObject( monikers[0], out runningObjectVal);
-
- result[ runningObjectName ] = runningObjectVal;
- }
-
- return result;
- }
-
- public static string GetSolutionVersion(string solutionFullFileName)
- {
- string version;
- System.IO.StreamReader solutionStreamReader = null;
- string firstLine;
- string format;
-
- try
- {
- solutionStreamReader = new System.IO.StreamReader(solutionFullFileName);
- do
- {
- firstLine = solutionStreamReader.ReadLine();
- }
- while (firstLine == "");
-
- format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim();
-
- switch(format)
- {
- case "7.00":
- version = "VC70";
- break;
-
- case "8.00":
- version = "VC71";
- break;
-
- case "9.00":
- version = "VC80";
- break;
-
- case "10.00":
- version = "VC90";
- break;
-
- case "11.00":
- version = "VC100";
- break;
-
- case "12.00":
- version = "VC150";
- break;
-
- default:
- throw new ApplicationException("Unknown .sln version: " + format);
- }
- }
- finally
- {
- if(solutionStreamReader != null)
- {
- solutionStreamReader.Close();
- }
- }
-
- return version;
- }
-
- public static string GetVSProgID(string version)
- {
- string progid = null;
- switch(version)
- {
- case "VC70":
- progid = "VisualStudio.DTE.7";
- break;
-
- case "VC71":
- progid = "VisualStudio.DTE.7.1";
- break;
-
- case "VC80":
- progid = "VisualStudio.DTE.8.0";
- break;
-
- case "VC90":
- progid = "VisualStudio.DTE.9.0";
- break;
-
- case "VC100":
- progid = "VisualStudio.DTE.10.0";
- break;
-
- case "VC120":
- progid = "VisualStudio.DTE.12.0";
- break;
-
- case "VC150":
- progid = "VisualStudio.DTE.15.0";
- break;
-
- default:
- throw new ApplicationException("Can't handle VS version: " + version);
- }
-
- return progid;
- }
-
- public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir)
- {
- bool made_change = false;
- Console.WriteLine("Looking for project {0}...", project_name);
- try
- {
- object prjs = ViaCOM.GetProperty(sol, "Projects");
- object count = ViaCOM.GetProperty(prjs, "Count");
- for(int i = 1; i <= (int)count; ++i)
- {
- object[] prjItemArgs = { (object)i };
- object prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs);
- string name = (string)ViaCOM.GetProperty(prj, "Name");
- if (0 == string.Compare(name, project_name, ignore_case))
- {
- Console.WriteLine("Found project: {0}", project_name);
- Console.WriteLine("Setting working directory");
-
- string full_project_name = (string)ViaCOM.GetProperty(prj, "FullName");
- Console.WriteLine(full_project_name);
-
- // *NOTE:Mani Thanks to incompatibilities between different versions of the
- // VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to
- // the VCProjectEngine types from a different version than the one built
- // with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built
- // in VS 8.0. To avoid this problem, we can use the com object interfaces directly,
- // without the type casting. Its tedious code, but it seems to work.
-
- // oCfgs should be assigned to a 'Project.Configurations' collection.
- object oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations");
-
- // oCount will be assigned to the number of configs present in oCfgs.
- object oCount = ViaCOM.GetProperty(oCfgs, "Count");
-
- for (int cfgIndex = 1; cfgIndex <= (int)oCount; ++cfgIndex)
- {
- object[] itemArgs = {(object)cfgIndex};
- object oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs);
- object oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings");
- ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", (object)working_dir);
- }
-
- break;
- }
- }
- made_change = true;
- }
- catch( Exception e )
- {
- Console.WriteLine(e.Message);
- Console.WriteLine("Failed to set working dir for project, {0}.", project_name);
- }
-
- return made_change;
- }
-
- public static bool SetStartupProject(string startup_project)
- {
- bool result = false;
- try
- {
- // You need the 'unique name of the project to set StartupProjects.
- // find the project by generic name.
- Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project);
- object prjs = ViaCOM.GetProperty(solution, "Projects");
- object count = ViaCOM.GetProperty(prjs, "Count");
- for (int i = 1; i <= (int)count; ++i)
- {
- object[] itemArgs = { (object)i };
- object prj = ViaCOM.CallMethod(prjs, "Item", itemArgs);
- object prjName = ViaCOM.GetProperty(prj, "Name");
- if (0 == string.Compare((string)prjName, startup_project, ignore_case))
- {
- object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
- ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName"));
- Console.WriteLine(" Success!");
- result = true;
- break;
- }
- }
-
- if (result == false)
- {
- Console.WriteLine(" Could not find project \"{0}\" in the solution.", startup_project);
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(" Failed to set the startup project!");
- Console.WriteLine(e.Message);
- }
- return result;
- }
-
- public static bool SetActiveConfig(string config)
- {
- bool result = false;
- try
- {
- Console.WriteLine("Trying to set active config to \"{0}\"", config);
- object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
- object solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations");
- object[] itemArgs = { (object)config };
- object solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs);
- ViaCOM.CallMethod(solCfg, "Activate", null);
- Console.WriteLine(" Success!");
- result = true;
- }
- catch (Exception e)
- {
- Console.WriteLine(" Failed to set \"{0}\" as the active config.", config);
- Console.WriteLine(e.Message);
- }
- return result;
- }
- }
-}
diff --git a/indra/win_crash_logger/README.txt b/indra/win_crash_logger/README.txt
deleted file mode 100644
index 6932a8d9c3..0000000000
--- a/indra/win_crash_logger/README.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This component is no longer used in Linden Lab builds.
-Change requests to support continued use by open source
-builds are welcome.