summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/pull_request_template.md36
-rw-r--r--.github/workflows/build.yaml7
-rw-r--r--.github/workflows/check-pr.yaml21
-rw-r--r--.github/workflows/qatest.yaml749
-rw-r--r--.pre-commit-config.yaml2
-rw-r--r--README.md90
-rw-r--r--autobuild.xml46
-rw-r--r--doc/testplans/PRIM_MEDIA_FIRST_CLICK_INTERACT.md160
-rw-r--r--indra/CMakeLists.txt2
-rw-r--r--indra/cmake/00-Common.cmake2
-rw-r--r--indra/cmake/APR.cmake2
-rw-r--r--indra/cmake/Boost.cmake12
-rw-r--r--indra/cmake/CEFPlugin.cmake10
-rw-r--r--indra/cmake/CMakeLists.txt2
-rw-r--r--indra/cmake/CURL.cmake7
-rw-r--r--indra/cmake/Discord.cmake45
-rw-r--r--indra/cmake/FMODSTUDIO.cmake32
-rw-r--r--indra/cmake/GLEXT.cmake4
-rw-r--r--indra/cmake/LLPrimitive.cmake73
-rw-r--r--indra/cmake/LLWindow.cmake2
-rw-r--r--indra/cmake/LibVLCPlugin.cmake7
-rw-r--r--indra/cmake/Linking.cmake2
-rw-r--r--indra/cmake/NDOF.cmake38
-rw-r--r--indra/cmake/NVAPI.cmake4
-rw-r--r--indra/cmake/OpenJPEG.cmake4
-rw-r--r--indra/cmake/OpenSSL.cmake5
-rw-r--r--indra/cmake/Variables.cmake1
-rw-r--r--indra/cmake/ViewerMiscLibs.cmake2
-rw-r--r--indra/cmake/WebRTC.cmake4
-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/lltexlayer.cpp29
-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.txt2
-rw-r--r--indra/llcommon/StackWalker.cpp8
-rw-r--r--indra/llcommon/always_return.h16
-rw-r--r--indra/llcommon/llassettype.cpp17
-rw-r--r--indra/llcommon/llassettype.h2
-rw-r--r--indra/llcommon/llexception.cpp44
-rw-r--r--indra/llcommon/llexception.h114
-rw-r--r--indra/llcommon/llfasttimer.h8
-rw-r--r--indra/llcommon/llpreprocessor.h4
-rw-r--r--indra/llcommon/llprocessor.cpp34
-rw-r--r--indra/llcommon/llsdjson.cpp4
-rw-r--r--indra/llcommon/llsdutil.h39
-rw-r--r--indra/llcommon/llstring.cpp2
-rw-r--r--indra/llcommon/llstring.h4
-rw-r--r--indra/llcommon/llthread.cpp105
-rw-r--r--indra/llcommon/llthread.h7
-rw-r--r--indra/llcommon/llwin32headers.h1
-rw-r--r--indra/llcommon/threadpool.h4
-rw-r--r--indra/llcommon/workqueue.cpp44
-rw-r--r--indra/llcommon/workqueue.h11
-rw-r--r--indra/llcorehttp/_httpoprequest.cpp4
-rw-r--r--indra/llcorehttp/httpcommon.cpp2
-rw-r--r--indra/llfilesystem/lldir.cpp9
-rw-r--r--indra/llfilesystem/lldiriterator.cpp8
-rw-r--r--indra/llfilesystem/lldiskcache.cpp31
-rw-r--r--indra/llimage/llimagedimensionsinfo.cpp20
-rw-r--r--indra/llimage/llimagedimensionsinfo.h4
-rw-r--r--indra/llimage/llimagej2c.cpp9
-rw-r--r--indra/llimagej2coj/llimagej2coj.cpp217
-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.cpp147
-rw-r--r--indra/llinventory/llinventory.h6
-rw-r--r--indra/llinventory/llparcel.h102
-rw-r--r--indra/llinventory/llpermissions.cpp16
-rw-r--r--indra/llinventory/llpermissions.h1
-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/llsettingssky.cpp7
-rw-r--r--indra/llinventory/tests/inventorymisc_test.cpp54
-rw-r--r--indra/llmath/llcoordframe.cpp26
-rw-r--r--indra/llmath/llmath.h2
-rw-r--r--indra/llmath/llquaternion.cpp4
-rw-r--r--indra/llmath/llquaternion2.inl5
-rw-r--r--indra/llmath/llvector4a.cpp10
-rw-r--r--indra/llmath/llvector4a.inl15
-rw-r--r--indra/llmath/raytrace.cpp1
-rw-r--r--indra/llmath/v2math.cpp7
-rw-r--r--indra/llmath/v2math.h90
-rw-r--r--indra/llmath/v3math.h150
-rw-r--r--indra/llmath/v4math.h154
-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/llplugin/llpluginclassmedia.cpp4
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp5
-rw-r--r--indra/llplugin/slplugin/CMakeLists.txt8
-rw-r--r--indra/llprimitive/CMakeLists.txt6
-rw-r--r--indra/llprimitive/lldaeloader.cpp11
-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/llmodel.cpp201
-rw-r--r--indra/llprimitive/llmodel.h11
-rw-r--r--indra/llprimitive/llmodelloader.cpp191
-rw-r--r--indra/llprimitive/llmodelloader.h15
-rw-r--r--indra/llrender/llfontfreetype.cpp2
-rw-r--r--indra/llrender/llgl.cpp5
-rw-r--r--indra/llrender/llimagegl.cpp27
-rw-r--r--indra/llui/llaccordionctrltab.h2
-rw-r--r--indra/llui/llflatlistview.cpp11
-rw-r--r--indra/llui/llflatlistview.h6
-rw-r--r--indra/llui/llfolderview.h1
-rw-r--r--indra/llui/llfolderviewitem.cpp249
-rw-r--r--indra/llui/llfolderviewitem.h30
-rw-r--r--indra/llui/llfolderviewmodel.h7
-rw-r--r--indra/llui/lllineeditor.cpp3
-rw-r--r--indra/llui/llmenugl.cpp2
-rw-r--r--indra/llui/llmodaldialog.cpp12
-rw-r--r--indra/llui/llscrolllistctrl.cpp2
-rw-r--r--indra/llui/lltexteditor.cpp30
-rw-r--r--indra/llui/lltexteditor.h4
-rw-r--r--indra/llwebrtc/CMakeLists.txt13
-rw-r--r--indra/llwindow/CMakeLists.txt3
-rw-r--r--indra/llwindow/llopenglview-objc.mm4
-rw-r--r--indra/llwindow/llwindow.cpp27
-rw-r--r--indra/llwindow/llwindow.h3
-rw-r--r--indra/llwindow/llwindowheadless.h2
-rw-r--r--indra/llwindow/llwindowsdl.cpp3
-rw-r--r--indra/llwindow/llwindowsdl.h2
-rw-r--r--indra/llwindow/llwindowwin32.cpp222
-rw-r--r--indra/llwindow/llwindowwin32.h2
-rw-r--r--indra/media_plugins/cef/CMakeLists.txt43
-rw-r--r--indra/media_plugins/libvlc/CMakeLists.txt13
-rw-r--r--indra/newview/CMakeLists.txt317
-rw-r--r--indra/newview/FixBundle.cmake.in1
-rw-r--r--indra/newview/FixPackage.cmake.in1
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/ViewerInstall.cmake120
-rw-r--r--indra/newview/app_settings/commands.xml4
-rw-r--r--indra/newview/app_settings/settings.xml162
-rw-r--r--indra/newview/app_settings/settings_per_account.xml2
-rw-r--r--indra/newview/gltf/asset.cpp198
-rw-r--r--indra/newview/gltf/asset.h13
-rw-r--r--indra/newview/gltf/buffer_util.h11
-rw-r--r--indra/newview/gltf/llgltfloader.cpp1819
-rw-r--r--indra/newview/gltf/llgltfloader.h216
-rw-r--r--indra/newview/gltfscenemanager.cpp5
-rw-r--r--indra/newview/icons/test/secondlife.icobin76861 -> 9662 bytes
-rw-r--r--indra/newview/icons/test/secondlife_256.BMPbin196662 -> 262954 bytes
-rwxr-xr-xindra/newview/linux_tools/launch_url.sh1
-rw-r--r--indra/newview/llagent.cpp104
-rw-r--r--indra/newview/llagent.h10
-rw-r--r--indra/newview/llagentcamera.cpp28
-rw-r--r--indra/newview/llagentcamera.h9
-rw-r--r--indra/newview/llagentpilot.cpp4
-rw-r--r--indra/newview/llagentwearables.cpp2
-rw-r--r--indra/newview/llaisapi.cpp2
-rw-r--r--indra/newview/llappearancemgr.cpp13
-rw-r--r--indra/newview/llappearancemgr.h2
-rw-r--r--indra/newview/llappviewer.cpp159
-rw-r--r--indra/newview/llappviewer.h7
-rw-r--r--indra/newview/llappviewerlinux.cpp4
-rw-r--r--indra/newview/llappviewerwin32.cpp75
-rw-r--r--indra/newview/llappviewerwin32.h1
-rw-r--r--indra/newview/llautoreplace.cpp5
-rw-r--r--indra/newview/llcontrolavatar.cpp16
-rw-r--r--indra/newview/llconversationlog.cpp2
-rw-r--r--indra/newview/llconversationmodel.h3
-rw-r--r--indra/newview/llfilepicker.cpp6
-rw-r--r--indra/newview/llfloaterautoreplacesettings.cpp51
-rw-r--r--indra/newview/llfloaterautoreplacesettings.h2
-rw-r--r--indra/newview/llfloateravatarwelcomepack.cpp (renamed from indra/newview/llfloateravatar.cpp)19
-rw-r--r--indra/newview/llfloateravatarwelcomepack.h (renamed from indra/newview/llfloateravatar.h)25
-rw-r--r--indra/newview/llfloaterbvhpreview.cpp11
-rw-r--r--indra/newview/llfloaterbvhpreview.h4
-rw-r--r--indra/newview/llfloatereditenvironmentbase.h3
-rw-r--r--indra/newview/llfloaterimagepreview.cpp4
-rw-r--r--indra/newview/llfloaterimagepreview.h2
-rw-r--r--indra/newview/llfloaterinventorysettings.cpp28
-rw-r--r--indra/newview/llfloaterinventorysettings.h5
-rw-r--r--indra/newview/llfloatermodelpreview.cpp21
-rw-r--r--indra/newview/llfloatermodelpreview.h7
-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/llfloaterobjectweights.cpp96
-rw-r--r--indra/newview/llfloaterobjectweights.h19
-rw-r--r--indra/newview/llfloaterpreference.cpp14
-rw-r--r--indra/newview/llfloateruipreview.cpp5
-rwxr-xr-xindra/newview/llfloaterworldmap.cpp257
-rw-r--r--indra/newview/llfloaterworldmap.h14
-rw-r--r--indra/newview/llfolderviewmodelinventory.cpp30
-rw-r--r--indra/newview/llfolderviewmodelinventory.h2
-rw-r--r--indra/newview/llgltffolderitem.h5
-rw-r--r--indra/newview/llhudeffectresetskeleton.cpp211
-rw-r--r--indra/newview/llhudeffectresetskeleton.h59
-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/llimview.cpp2
-rw-r--r--indra/newview/llinspecttexture.cpp13
-rw-r--r--indra/newview/llinventorybridge.cpp125
-rw-r--r--indra/newview/llinventorybridge.h46
-rw-r--r--indra/newview/llinventoryfilter.cpp85
-rw-r--r--indra/newview/llinventoryfilter.h17
-rw-r--r--indra/newview/llinventoryfunctions.cpp248
-rw-r--r--indra/newview/llinventoryfunctions.h22
-rw-r--r--indra/newview/llinventorygallery.cpp35
-rw-r--r--indra/newview/llinventorygallery.h5
-rw-r--r--indra/newview/llinventorygallerymenu.cpp65
-rw-r--r--indra/newview/llinventoryitemslist.cpp2
-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.cpp21
-rw-r--r--indra/newview/llinventoryobserver.cpp29
-rw-r--r--indra/newview/llinventoryobserver.h19
-rw-r--r--indra/newview/llinventorypanel.cpp395
-rw-r--r--indra/newview/llinventorypanel.h9
-rw-r--r--indra/newview/lllogchat.cpp2
-rw-r--r--indra/newview/llmaterialeditor.cpp76
-rw-r--r--indra/newview/llmaterialeditor.h14
-rw-r--r--indra/newview/llmeshrepository.cpp91
-rw-r--r--indra/newview/llmeshrepository.h29
-rw-r--r--indra/newview/llmodelpreview.cpp114
-rw-r--r--indra/newview/llmoveview.cpp2
-rw-r--r--indra/newview/llmoveview.h1
-rw-r--r--indra/newview/lloutfitgallery.cpp208
-rw-r--r--indra/newview/lloutfitgallery.h39
-rw-r--r--indra/newview/lloutfitslist.cpp332
-rw-r--r--indra/newview/lloutfitslist.h64
-rw-r--r--indra/newview/llpanelappearancetab.h7
-rw-r--r--indra/newview/llpanelface.cpp290
-rw-r--r--indra/newview/llpanelface.h6
-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/llpanelmaininventory.cpp263
-rw-r--r--indra/newview/llpanelobject.cpp24
-rw-r--r--indra/newview/llpanelobjectinventory.cpp19
-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/llpanelpeoplemenus.cpp5
-rw-r--r--indra/newview/llpanelpermissions.cpp17
-rw-r--r--indra/newview/llpanelpermissions.h1
-rw-r--r--indra/newview/llpanelprofile.cpp1
-rw-r--r--indra/newview/llpanelprofilepicks.cpp42
-rw-r--r--indra/newview/llpanelprofilepicks.h10
-rw-r--r--indra/newview/llpanelwearing.cpp28
-rw-r--r--indra/newview/llpanelwearing.h6
-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.h2
-rw-r--r--indra/newview/llreflectionmapmanager.cpp2
-rw-r--r--indra/newview/llselectmgr.cpp1
-rw-r--r--indra/newview/llselectmgr.h1
-rw-r--r--indra/newview/llsidepanelappearance.cpp9
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp21
-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/llsnapshotlivepreview.cpp2
-rw-r--r--indra/newview/llsprite.h2
-rw-r--r--indra/newview/llstartup.cpp69
-rw-r--r--indra/newview/llstartup.h6
-rw-r--r--indra/newview/llsurface.h1
-rw-r--r--indra/newview/llteleporthistorystorage.cpp6
-rw-r--r--indra/newview/lltexturectrl.cpp78
-rw-r--r--indra/newview/lltexturectrl.h6
-rw-r--r--indra/newview/lltexturefetch.cpp13
-rw-r--r--indra/newview/lltexturefetch.h3
-rw-r--r--indra/newview/llthumbnailctrl.cpp10
-rw-r--r--indra/newview/lltoast.cpp2
-rw-r--r--indra/newview/lltooldraganddrop.cpp4
-rw-r--r--indra/newview/lltoolpie.cpp141
-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/llviewercamera.cpp78
-rw-r--r--indra/newview/llviewercamera.h16
-rw-r--r--indra/newview/llviewerdisplay.cpp63
-rw-r--r--indra/newview/llviewerfloaterreg.cpp4
-rw-r--r--indra/newview/llviewerinventory.cpp16
-rw-r--r--indra/newview/llviewerinventory.h6
-rw-r--r--indra/newview/llviewerjoystick.cpp21
-rw-r--r--indra/newview/llviewermedia.cpp2
-rw-r--r--indra/newview/llviewermenu.cpp134
-rw-r--r--indra/newview/llviewermenufile.cpp35
-rw-r--r--indra/newview/llviewermenufile.h11
-rw-r--r--indra/newview/llviewermessage.cpp2
-rw-r--r--indra/newview/llviewerobject.cpp8
-rw-r--r--indra/newview/llviewerobject.h4
-rwxr-xr-xindra/newview/llviewerparceloverlay.cpp74
-rw-r--r--indra/newview/llviewerparceloverlay.h13
-rwxr-xr-xindra/newview/llviewerregion.cpp1
-rw-r--r--indra/newview/llviewerregion.h1
-rw-r--r--indra/newview/llviewerstats.cpp106
-rw-r--r--indra/newview/llviewerstats.h11
-rw-r--r--indra/newview/llviewertexture.cpp39
-rw-r--r--indra/newview/llviewertexture.h1
-rw-r--r--indra/newview/llviewertexturelist.cpp16
-rw-r--r--indra/newview/llviewerwindow.cpp52
-rw-r--r--indra/newview/llvoavatar.cpp153
-rw-r--r--indra/newview/llvoavatar.h20
-rw-r--r--indra/newview/llvoavatarself.cpp6
-rw-r--r--indra/newview/llvoavatarself.h2
-rw-r--r--indra/newview/llvoicecallhandler.cpp5
-rw-r--r--indra/newview/llvoicechannel.cpp6
-rw-r--r--indra/newview/llvoiceclient.cpp82
-rw-r--r--indra/newview/llvovolume.cpp58
-rw-r--r--indra/newview/llwatchdog.cpp34
-rw-r--r--indra/newview/llwatchdog.h12
-rw-r--r--indra/newview/llwearableitemslist.cpp23
-rw-r--r--indra/newview/llwearableitemslist.h2
-rwxr-xr-xindra/newview/res/viewerRes.rc12
-rw-r--r--indra/newview/rlvdefines.h8
-rw-r--r--indra/newview/rlvhandler.cpp172
-rw-r--r--indra/newview/rlvhelper.cpp14
-rw-r--r--indra/newview/skins/contrast/textures/cloud-particle.j2cbin4049 -> 0 bytes
-rw-r--r--indra/newview/skins/contrast/textures/cloud-particle.pngbin0 -> 42378 bytes
-rw-r--r--indra/newview/skins/contrast/textures/textures.xml2
-rw-r--r--indra/newview/skins/default/colors.xml5
-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.pngbin294 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.pngbin620 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.pngbin485 -> 0 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.xml37
-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/xui/de/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml112
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml25
-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_model_preview.xml27
-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_graphics_advanced.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_trash.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml45
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_chat_volume.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.xml146
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml121
-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_login.xml7
-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_viewer.xml81
-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.xml41
-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_inventory_gallery_item.xml10
-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_places.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml27
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml73
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml13
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml286
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_pick.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_progress.xml40
-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.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_tools_texture.xml13
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml111
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml15
-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/es/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_progress.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_progress.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml4
-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/pt/panel_progress.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.pngbin0 -> 110 bytes
-rw-r--r--indra/newview/skins/gold/textures/Rounded_Rect.pngbin0 -> 338 bytes
-rw-r--r--indra/newview/skins/gold/textures/alpha_gradient.tgabin0 -> 300 bytes
-rw-r--r--indra/newview/skins/gold/textures/alpha_gradient_2d.j2cbin0 -> 4325 bytes
-rw-r--r--indra/newview/skins/gold/textures/arrow_down.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/arrow_up.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.pngbin0 -> 17692 bytes
-rw-r--r--indra/newview/skins/gold/textures/badge_note.j2cbin0 -> 2040 bytes
-rw-r--r--indra/newview/skins/gold/textures/badge_ok.j2cbin0 -> 2043 bytes
-rw-r--r--indra/newview/skins/gold/textures/badge_warn.j2cbin0 -> 2043 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.pngbin0 -> 527 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.pngbin0 -> 365 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.pngbin0 -> 532 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.pngbin0 -> 328 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.pngbin0 -> 49285 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.pngbin0 -> 50855 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.pngbin0 -> 914 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.pngbin0 -> 50394 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.pngbin0 -> 50127 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.pngbin0 -> 49268 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_On.pngbin0 -> 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.pngbin0 -> 51189 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.pngbin0 -> 53113 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.pngbin0 -> 609 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.pngbin0 -> 496 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Move_Walk_Off.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 51539 bytes
-rw-r--r--indra/newview/skins/gold/textures/bottomtray/Snapshot_Off.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 460 bytes
-rw-r--r--indra/newview/skins/gold/textures/build/Object_Tube_Selected.pngbin0 -> 5131 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Create.pngbin0 -> 705 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Create_Selected.pngbin0 -> 621 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Dozer.pngbin0 -> 492 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Dozer_Selected.pngbin0 -> 537 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Face.pngbin0 -> 304 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Face_Selected.pngbin0 -> 373 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Grab.pngbin0 -> 417 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Grab_Selected.pngbin0 -> 456 bytes
-rwxr-xr-xindra/newview/skins/gold/textures/build/Tool_Zoom.pngbin0 -> 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.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/button_anim_pause_selected.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/button_anim_play.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/button_anim_play_selected.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/checker.pngbin0 -> 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.tgabin0 -> 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.tgabin0 -> 300 bytes
-rw-r--r--indra/newview/skins/gold/textures/default_irradiance.pngbin0 -> 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.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/down_arrow.pngbin0 -> 423 bytes
-rw-r--r--indra/newview/skins/gold/textures/eye_button_active.tgabin0 -> 3116 bytes
-rw-r--r--indra/newview/skins/gold/textures/eye_button_inactive.tgabin0 -> 3116 bytes
-rw-r--r--indra/newview/skins/gold/textures/flatnormal.tgabin0 -> 92 bytes
-rw-r--r--indra/newview/skins/gold/textures/folder_arrow.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/foot_shadow.j2cbin0 -> 1647 bytes
-rw-r--r--indra/newview/skins/gold/textures/green_checkmark.pngbin0 -> 414 bytes
-rw-r--r--indra/newview/skins/gold/textures/icn_media_movie.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/icn_media_web.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_auction.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_avatar_offline.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_avatar_online.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_diurnal.tgabin0 -> 6162 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_for_sale_adult.tgabin0 -> 743 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_group.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_legacy_event.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_legacy_event_adult.tgabin0 -> 648 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_legacy_event_mature.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_place.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/icon_top_pick.tgabin0 -> 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.pngbin0 -> 434 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.pngbin0 -> 406 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.pngbin0 -> 392 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.pngbin0 -> 403 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.pngbin0 -> 395 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.pngbin0 -> 386 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.pngbin0 -> 395 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_log_inbox.pngbin0 -> 544 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.pngbin0 -> 522 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.pngbin0 -> 428 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.pngbin0 -> 428 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.pngbin0 -> 592 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_close.pngbin0 -> 479 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.pngbin0 -> 538 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.pngbin0 -> 533 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.pngbin0 -> 609 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.pngbin0 -> 546 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.pngbin0 -> 368 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.pngbin0 -> 424 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Copy.pngbin0 -> 588 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/CopyBright.pngbin0 -> 615 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.pngbin0 -> 13832 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/DownArrow_Off.pngbin0 -> 431 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Edit_Wrench.pngbin0 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.pngbin0 -> 476 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Facebook.pngbin0 -> 576 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Female.pngbin0 -> 489 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ForSale_Badge.pngbin0 -> 5896 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ForwardArrow_Off.pngbin0 -> 424 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ForwardArrow_Press.pngbin0 -> 424 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Group.pngbin0 -> 2683 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Group_Large.pngbin0 -> 2772 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Object_Small.pngbin0 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Person.pngbin0 -> 544 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Generic_Person_Large.pngbin0 -> 2510 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Group_Notices.pngbin0 -> 3502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.pngbin0 -> 401 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Hierarchy_View_On.pngbin0 -> 356 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.pngbin0 -> 1593 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.pngbin0 -> 1383 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Color_Palette.pngbin0 -> 3419 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_Font_Size.pngbin0 -> 2994 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Icon_For_Sale.pngbin0 -> 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.pngbin0 -> 494 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Animation.pngbin0 -> 708 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_BodyShape.pngbin0 -> 828 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_CallingCard.pngbin0 -> 462 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Clothing.pngbin0 -> 463 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Eye.pngbin0 -> 654 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_FolderClosed.pngbin0 -> 441 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_FolderOpen.pngbin0 -> 614 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Gesture.pngbin0 -> 615 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Gloves.pngbin0 -> 582 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Hair.pngbin0 -> 551 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Invalid.pngbin0 -> 539 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Jacket.pngbin0 -> 893 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Landmark.pngbin0 -> 965 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Link.pngbin0 -> 367 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LinkFolder.pngbin0 -> 508 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LinkItem.pngbin0 -> 508 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.pngbin0 -> 538 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.pngbin0 -> 697 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LostClosed.pngbin0 -> 495 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_LostOpen.pngbin0 -> 745 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Material.pngbin0 -> 1008 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Mesh.pngbin0 -> 977 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Notecard.pngbin0 -> 414 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Object.pngbin0 -> 575 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Object_Multi.pngbin0 -> 976 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Pants.pngbin0 -> 611 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Physics.pngbin0 -> 758 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Script.pngbin0 -> 551 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Settings.pngbin0 -> 1623 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SettingsDay.pngbin0 -> 1812 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SettingsSky.pngbin0 -> 1811 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SettingsWater.pngbin0 -> 1621 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Shape.pngbin0 -> 693 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Shirt.pngbin0 -> 612 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Shoe.pngbin0 -> 3875 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Skin.pngbin0 -> 627 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Skirt.pngbin0 -> 702 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Snapshot.pngbin0 -> 722 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Socks.pngbin0 -> 565 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Sound.pngbin0 -> 584 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.pngbin0 -> 1120 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.pngbin0 -> 1282 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SysClosed.pngbin0 -> 4558 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_SysOpen.pngbin0 -> 4649 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Tattoo.pngbin0 -> 559 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Texture.pngbin0 -> 379 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.pngbin0 -> 722 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_TrashClosed.pngbin0 -> 480 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_TrashOpen.pngbin0 -> 479 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Underpants.pngbin0 -> 577 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Undershirt.pngbin0 -> 423 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_Universal.pngbin0 -> 1081 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_UnknownObject.pngbin0 -> 1752 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.pngbin0 -> 1120 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.pngbin0 -> 1438 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/List_View_Disabled.pngbin0 -> 374 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/List_View_On.pngbin0 -> 379 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Lock.pngbin0 -> 577 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Locked_Icon.pngbin0 -> 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.pngbin0 -> 494 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Microphone_On.pngbin0 -> 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.pngbin0 -> 764 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.pngbin0 -> 520 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OptionsMenu_Off.pngbin0 -> 523 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OptionsMenu_Press.pngbin0 -> 506 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.pngbin0 -> 5520 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Off.pngbin0 -> 5495 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_On.pngbin0 -> 5570 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.pngbin0 -> 5556 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Over.pngbin0 -> 5274 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Press.pngbin0 -> 5563 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.pngbin0 -> 5529 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.pngbin0 -> 5483 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.pngbin0 -> 5486 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.pngbin0 -> 5557 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.pngbin0 -> 5593 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.pngbin0 -> 5526 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Selected.pngbin0 -> 5596 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.pngbin0 -> 5554 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.pngbin0 -> 5576 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.pngbin0 -> 5628 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.pngbin0 -> 721 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.pngbin0 -> 730 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.pngbin0 -> 527 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.pngbin0 -> 636 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.pngbin0 -> 511 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.pngbin0 -> 460 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.pngbin0 -> 943 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.pngbin0 -> 934 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.pngbin0 -> 524 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.pngbin0 -> 652 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Health_Dark.pngbin0 -> 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.pngbin0 -> 683 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.pngbin0 -> 654 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.pngbin0 -> 596 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_R_Dark.pngbin0 -> 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.pngbin0 -> 723 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.pngbin0 -> 553 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.pngbin0 -> 660 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.pngbin0 -> 655 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.pngbin0 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.pngbin0 -> 503 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.pngbin0 -> 710 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.pngbin0 -> 710 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.pngbin0 -> 550 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.pngbin0 -> 599 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.pngbin0 -> 713 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pause_Off.pngbin0 -> 385 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pause_Over.pngbin0 -> 380 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Pause_Press.pngbin0 -> 376 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Permission_Ungranted.pngbin0 -> 834 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Person_Check.pngbin0 -> 855 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Person_Star.pngbin0 -> 690 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Play_Off.pngbin0 -> 451 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Play_Over.pngbin0 -> 443 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Play_Press.pngbin0 -> 448 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Presets_Icon.pngbin0 -> 1069 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.pngbin0 -> 535 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.pngbin0 -> 420 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Friend_Online.pngbin0 -> 433 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.pngbin0 -> 1008 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.pngbin0 -> 1051 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.pngbin0 -> 888 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.pngbin0 -> 949 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.pngbin0 -> 897 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.pngbin0 -> 939 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_1.pngbin0 -> 6163 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_10.pngbin0 -> 6310 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_11.pngbin0 -> 6169 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_12.pngbin0 -> 6197 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_2.pngbin0 -> 6227 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_3.pngbin0 -> 6090 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_4.pngbin0 -> 6295 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_5.pngbin0 -> 6158 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_6.pngbin0 -> 6220 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/ProgressLarge_7.pngbin0 -> 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.pngbin0 -> 6034 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_1.pngbin0 -> 678 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_10.pngbin0 -> 671 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_11.pngbin0 -> 674 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_12.pngbin0 -> 685 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_2.pngbin0 -> 675 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_3.pngbin0 -> 679 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_4.pngbin0 -> 673 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_5.pngbin0 -> 671 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_6.pngbin0 -> 684 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_7.pngbin0 -> 674 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_8.pngbin0 -> 680 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Progress_9.pngbin0 -> 680 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Refresh_Off.pngbin0 -> 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.pngbin0 -> 628 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Shirt_Large.pngbin0 -> 641 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Shop.pngbin0 -> 523 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/SkipBackward_Off.pngbin0 -> 477 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/SkipForward_Off.pngbin0 -> 469 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/StopReload_Off.pngbin0 -> 639 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/StopReload_Over.pngbin0 -> 626 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Stop_Off.pngbin0 -> 363 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Disabled.pngbin0 -> 1089 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Enabled.pngbin0 -> 4636 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_1.pngbin0 -> 1080 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_2.pngbin0 -> 1077 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_3.pngbin0 -> 1114 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_4.pngbin0 -> 1108 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_5.pngbin0 -> 1070 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Sync_Progress_6.pngbin0 -> 1095 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/System_Notification_Large.pngbin0 -> 1170 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/System_Notification_Small.pngbin0 -> 593 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/TrashItem_Disabled.pngbin0 -> 416 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/TrashItem_Off.pngbin0 -> 415 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/TrashItem_Press.pngbin0 -> 407 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/UnZoom_Off.pngbin0 -> 587 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/UpArrow_Off.pngbin0 -> 428 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Video_URL_Off.pngbin0 -> 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.pngbin0 -> 460 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/YouAreHere_Badge.pngbin0 -> 6385 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/Zoom_Off.pngbin0 -> 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.pngbin0 -> 621 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/copy_clipboard.pngbin0 -> 811 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/delete_icon.pngbin0 -> 809 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/edit_mine.pngbin0 -> 896 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/edit_theirs.pngbin0 -> 902 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/emoji_picker_icon.pngbin0 -> 787 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/expand_one_liner.pngbin0 -> 627 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/file_upload.pngbin0 -> 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.pngbin0 -> 8718 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/multi_folder_mode.pngbin0 -> 329 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/nearby_chat_icon.pngbin0 -> 586 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/object_icon.pngbin0 -> 502 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/paste_clipboard.pngbin0 -> 792 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/pop_up_caution.pngbin0 -> 765 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_beta.pngbin0 -> 644 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.pngbin0 -> 641 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_lifetime.pngbin0 -> 780 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_linden.pngbin0 -> 1065 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.pngbin0 -> 780 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.pngbin0 -> 777 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.pngbin0 -> 656 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.pngbin0 -> 656 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.pngbin0 -> 616 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.pngbin0 -> 646 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/remove_icon.pngbin0 -> 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.pngbin0 -> 607 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/single_folder_forward.pngbin0 -> 608 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/single_folder_mode.pngbin0 -> 320 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/single_folder_up.pngbin0 -> 545 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/snapshot_icon.pngbin0 -> 717 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/texture_icon.pngbin0 -> 349 bytes
-rw-r--r--indra/newview/skins/gold/textures/icons/thumbnail_fallback_icon.pngbin0 -> 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.tgabin0 -> 812 bytes
-rw-r--r--indra/newview/skins/gold/textures/jump_left_out.tgabin0 -> 812 bytes
-rw-r--r--indra/newview/skins/gold/textures/jump_right_in.tgabin0 -> 812 bytes
-rw-r--r--indra/newview/skins/gold/textures/jump_right_out.tgabin0 -> 812 bytes
-rw-r--r--indra/newview/skins/gold/textures/lag_status_critical.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/lag_status_good.tgabin0 -> 658 bytes
-rw-r--r--indra/newview/skins/gold/textures/lag_status_warning.tgabin0 -> 658 bytes
-rw-r--r--indra/newview/skins/gold/textures/legend.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/locked_image.j2cbin0 -> 6140 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_16.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_32.tgabin0 -> 2894 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_8.tgabin0 -> 300 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_above_32.tgabin0 -> 2909 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_below_32.tgabin0 -> 3037 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_unknown_32.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_avatar_you_32.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_event.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_home.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_infohub.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_telehub.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_track_16.tgabin0 -> 1068 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_ui_collapse_icon.pngbin0 -> 300 bytes
-rw-r--r--indra/newview/skins/gold/textures/map_ui_expand_icon.pngbin0 -> 284 bytes
-rw-r--r--indra/newview/skins/gold/textures/materials_ui_x_24.pngbin0 -> 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.pngbin0 -> 304 bytes
-rw-r--r--indra/newview/skins/gold/textures/missing_asset.tgabin0 -> 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.pngbin0 -> 382 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Arrow_Right_Off.pngbin0 -> 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.pngbin0 -> 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.pngbin0 -> 116 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Flag.pngbin0 -> 338 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Help_Press.pngbin0 -> 384 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Home_Off.pngbin0 -> 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.pngbin0 -> 15870 bytes
-rw-r--r--indra/newview/skins/gold/textures/navbar/Lock.pngbin0 -> 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.pngbin0 -> 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.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/gold/textures/pixiesmall.j2cbin0 -> 2845 bytes
-rw-r--r--indra/newview/skins/gold/textures/red_x.pngbin0 -> 624 bytes
-rw-r--r--indra/newview/skins/gold/textures/rounded_square.j2cbin0 -> 1074 bytes
-rw-r--r--indra/newview/skins/gold/textures/script_error.j2cbin0 -> 8132 bytes
-rw-r--r--indra/newview/skins/gold/textures/silhouette.j2cbin0 -> 1460 bytes
-rw-r--r--indra/newview/skins/gold/textures/slim_icon_16_viewer.tgabin0 -> 1032 bytes
-rw-r--r--indra/newview/skins/gold/textures/snapshot_download.pngbin0 -> 1226 bytes
-rw-r--r--indra/newview/skins/gold/textures/snapshot_email.pngbin0 -> 1231 bytes
-rw-r--r--indra/newview/skins/gold/textures/spacer24.tgabin0 -> 2348 bytes
-rw-r--r--indra/newview/skins/gold/textures/tabarea.tgabin0 -> 1340 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.pngbin0 -> 435 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.pngbin0 -> 355 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.pngbin0 -> 339 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.pngbin0 -> 341 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.pngbin0 -> 344 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.pngbin0 -> 305 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.pngbin0 -> 790 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.pngbin0 -> 297 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.pngbin0 -> 294 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.pngbin0 -> 367 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.pngbin0 -> 405 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.pngbin0 -> 223 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.pngbin0 -> 272 bytes
-rw-r--r--indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.pngbin0 -> 325 bytes
-rw-r--r--indra/newview/skins/gold/textures/tearoff_pressed.tgabin0 -> 513 bytes
-rw-r--r--indra/newview/skins/gold/textures/tearoffbox.tgabin0 -> 408 bytes
-rw-r--r--indra/newview/skins/gold/textures/textures.xml934
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/360_capture.pngbin0 -> 793 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/appearance.pngbin0 -> 1205 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/avatars.pngbin0 -> 1432 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/build.pngbin0 -> 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.pngbin0 -> 1277 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/destinations.pngbin0 -> 1297 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/environments.pngbin0 -> 1630 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/facebook.pngbin0 -> 424 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.pngbin0 -> 572 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/flickr.pngbin0 -> 15530 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/gestures.pngbin0 -> 1675 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/grid_status.pngbin0 -> 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.pngbin0 -> 1306 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/inventory.pngbin0 -> 1114 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/land.pngbin0 -> 1123 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/map.pngbin0 -> 1206 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/marketplace.pngbin0 -> 1311 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/mini_cart.pngbin0 -> 474 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/mini_map.pngbin0 -> 1766 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/mktlistings.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/move.pngbin0 -> 1328 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.pngbin0 -> 1479 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/outbox.pngbin0 -> 1521 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/people.pngbin0 -> 1313 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/performance.pngbin0 -> 451 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/picks.pngbin0 -> 1396 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/places.pngbin0 -> 1391 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/preferences.pngbin0 -> 1587 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/profile.pngbin0 -> 1180 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/report_abuse.pngbin0 -> 407 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/resync_animations.pngbin0 -> 3627 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/search.pngbin0 -> 1406 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/snapshot.pngbin0 -> 1142 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/speak.pngbin0 -> 1253 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/twitter.pngbin0 -> 5696 bytes
-rw-r--r--indra/newview/skins/gold/textures/toolbar_icons/view.pngbin0 -> 1487 bytes
-rw-r--r--indra/newview/skins/gold/textures/transparent.j2cbin0 -> 172 bytes
-rw-r--r--indra/newview/skins/gold/textures/up_arrow.pngbin0 -> 426 bytes
-rw-r--r--indra/newview/skins/gold/textures/uv_test1.j2cbin0 -> 1206 bytes
-rw-r--r--indra/newview/skins/gold/textures/uv_test2.tgabin0 -> 1308 bytes
-rw-r--r--indra/newview/skins/gold/textures/voice_meter_dot.j2cbin0 -> 499 bytes
-rw-r--r--indra/newview/skins/gold/textures/voice_meter_rings.j2cbin0 -> 2518 bytes
-rw-r--r--indra/newview/skins/gold/textures/white.tgabin0 -> 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.pngbin0 -> 1767 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_moon_front.pngbin0 -> 2060 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.pngbin0 -> 1125 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.pngbin0 -> 617 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.pngbin0 -> 1107 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.pngbin0 -> 561 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.pngbin0 -> 1121 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.pngbin0 -> 591 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_top.pngbin0 -> 1133 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_rotate_top_active.pngbin0 -> 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.pngbin0 -> 1626 bytes
-rw-r--r--indra/newview/skins/gold/textures/widgets/track_control_sun_front.pngbin0 -> 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.pngbin0 -> 36083 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/add_payment_image_left.pngbin0 -> 34181 bytes
-rw-r--r--indra/newview/skins/gold/textures/windows/add_payment_image_right.pngbin0 -> 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.pngbin0 -> 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/test/test.cpp70
1225 files changed, 11131 insertions, 8089 deletions
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000000..473498833e
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,36 @@
+## Description
+
+<!--
+Describe what this PR changes or adds. Include any relevant context or motivation.
+-->
+
+## Related Issues
+
+- [ ] **Please link to a relevant GitHub issue for additional context.**
+ - **Bug Fix:** Link to an issue that includes reproduction steps and testing guidance.
+ - **Feature/Enhancement:** Link to an issue with a write-up, rationale, and requirements.
+
+Issue Link: <!-- e.g., closes #123 or relates to #456 -->
+
+---
+
+## Checklist
+
+Please ensure the following before requesting review:
+
+- [ ] I have provided a clear title and detailed description for this pull request.
+- [ ] The PR is linked to a relevant issue with sufficient context.
+- [ ] I have tested the changes locally and verified they work as intended.
+- [ ] All new and existing tests pass.
+- [ ] Code follows the project's style guidelines.
+- [ ] Documentation has been updated if needed.
+- [ ] Any dependent changes have been merged and published in downstream modules
+- [ ] I have reviewed the [contributing guidelines](https://github.com/secondlife/viewer/blob/develop/CONTRIBUTING.md).
+
+---
+
+## Additional Notes
+
+<!--
+Add any other information, screenshots, or suggestions for reviewers here.
+-->
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 50b0cf02bc..4bf2af644a 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -218,8 +218,10 @@ jobs:
prefix=${ba[0]}
if [ "$prefix" == "project" ]; then
IFS='_' read -ra prj <<< "${ba[1]}"
+ prj_str="${prj[*]}"
# uppercase first letter of each word
- export viewer_channel="Second Life Project ${prj[*]^}"
+ capitalized=$(echo "$prj_str" | awk '{for (i=1; i<=NF; i++) $i = toupper(substr($i,1,1)) substr($i,2); print}')
+ export viewer_channel="Second Life Project $capitalized"
elif [[ "$prefix" == "release" || "$prefix" == "main" ]];
then
export viewer_channel="Second Life Release"
@@ -304,7 +306,7 @@ jobs:
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
needs: build
- runs-on: windows-large
+ runs-on: windows-latest
steps:
- name: Sign and package Windows viewer
if: env.AZURE_KEY_VAULT_URI && env.AZURE_CERT_NAME && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET && env.AZURE_TENANT_ID
@@ -455,7 +457,6 @@ jobs:
prerelease: true
generate_release_notes: true
target_commitish: ${{ github.sha }}
- previous_tag: release
append_body: true
fail_on_unmatched_files: true
files: |
diff --git a/.github/workflows/check-pr.yaml b/.github/workflows/check-pr.yaml
new file mode 100644
index 0000000000..a5cee9157c
--- /dev/null
+++ b/.github/workflows/check-pr.yaml
@@ -0,0 +1,21 @@
+name: Check PR
+
+on:
+ pull_request:
+ types: [opened, edited, reopened, synchronize]
+
+permissions:
+ contents: read
+
+jobs:
+ check-description:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check PR description
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const description = context.payload.pull_request.body || '';
+ if (description.trim().length < 20) {
+ core.setFailed("❌ PR description is too short. Please provide at least 20 characters.");
+ }
diff --git a/.github/workflows/qatest.yaml b/.github/workflows/qatest.yaml
index 4892cfaae3..5d8894a3f4 100644
--- a/.github/workflows/qatest.yaml
+++ b/.github/workflows/qatest.yaml
@@ -1,174 +1,575 @@
-name: Run QA Test # Runs automated tests on a self-hosted QA machine
-permissions:
- contents: read
- #pull-requests: write # maybe need to re-add this later
-
-on:
- workflow_run:
- workflows: ["Build"]
- types:
- - completed
-
-concurrency:
- group: qa-test-run
- cancel-in-progress: true # Cancels any queued job when a new one starts
-
-jobs:
- debug-workflow:
- runs-on: ubuntu-latest
- steps:
- - name: Debug Workflow Variables
- env:
- HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }}
- HEAD_COMMIT_MSG: ${{ github.event.workflow_run.head_commit.message }}
- run: |
- echo "Workflow Conclusion: ${{ github.event.workflow_run.conclusion }}"
- echo "Workflow Head Branch: $HEAD_BRANCH"
- echo "Workflow Run ID: ${{ github.event.workflow_run.id }}"
- echo "Head Commit Message: $HEAD_COMMIT_MSG"
- echo "GitHub Ref: ${{ github.ref }}"
- echo "GitHub Ref Name: ${{ github.ref_name }}"
- echo "GitHub Event Name: ${{ github.event_name }}"
- echo "GitHub Workflow Name: ${{ github.workflow }}"
-
- install-viewer-and-run-tests:
- runs-on: [self-hosted, qa-machine]
- # Run test only on successful builds of Second_Life_X branches
- if: >
- github.event.workflow_run.conclusion == 'success' &&
- (
- startsWith(github.event.workflow_run.head_branch, 'Second_Life')
- )
-
- steps:
- - name: Temporarily Allow PowerShell Scripts (Process Scope)
- run: |
- Set-ExecutionPolicy RemoteSigned -Scope Process -Force
-
- - name: Verify viewer-sikulix-main Exists
- run: |
- if (-Not (Test-Path -Path 'C:\viewer-sikulix-main')) {
- Write-Host '❌ Error: viewer-sikulix not found on runner!'
- exit 1
- }
- Write-Host '✅ viewer-sikulix is already available.'
-
- - name: Fetch & Download Windows Installer Artifact
- shell: pwsh
- run: |
- $BUILD_ID = "${{ github.event.workflow_run.id }}"
- $ARTIFACTS_URL = "https://api.github.com/repos/secondlife/viewer/actions/runs/$BUILD_ID/artifacts"
-
- # Fetch the correct artifact URL
- $response = Invoke-RestMethod -Headers @{Authorization="token ${{ secrets.GITHUB_TOKEN }}" } -Uri $ARTIFACTS_URL
- $ARTIFACT_NAME = ($response.artifacts | Where-Object { $_.name -eq "Windows-installer" }).archive_download_url
-
- if (-Not $ARTIFACT_NAME) {
- Write-Host "❌ Error: Windows-installer artifact not found!"
- exit 1
- }
-
- Write-Host "✅ Artifact found: $ARTIFACT_NAME"
-
- # Secure download path
- $DownloadPath = "$env:TEMP\secondlife-build-$BUILD_ID"
- New-Item -ItemType Directory -Path $DownloadPath -Force | Out-Null
- $InstallerPath = "$DownloadPath\installer.zip"
-
- # Download the ZIP
- Invoke-WebRequest -Uri $ARTIFACT_NAME -Headers @{Authorization="token ${{ secrets.GITHUB_TOKEN }}"} -OutFile $InstallerPath
-
- # Ensure download succeeded
- if (-Not (Test-Path $InstallerPath)) {
- Write-Host "❌ Error: Failed to download Windows-installer.zip"
- exit 1
- }
-
- - name: Extract Installer & Locate Executable
- shell: pwsh
- run: |
- # Explicitly set BUILD_ID again (since it does not appear to persist across steps)
- $BUILD_ID = "${{ github.event.workflow_run.id }}"
- $ExtractPath = "$env:TEMP\secondlife-build-$BUILD_ID"
- $InstallerZip = "$ExtractPath\installer.zip"
-
- # Print paths for debugging
- Write-Host "Extract Path: $ExtractPath"
- Write-Host "Installer ZIP Path: $InstallerZip"
-
- # Verify ZIP exists before extracting
- if (-Not (Test-Path $InstallerZip)) {
- Write-Host "❌ Error: ZIP file not found at $InstallerZip!"
- exit 1
- }
-
- Write-Host "✅ ZIP file exists and is valid. Extracting..."
-
- Expand-Archive -Path $InstallerZip -DestinationPath $ExtractPath -Force
-
- # Find installer executable
- $INSTALLER_PATH = (Get-ChildItem -Path $ExtractPath -Filter '*.exe' -Recurse | Select-Object -First 1).FullName
-
- if (-Not $INSTALLER_PATH -or $INSTALLER_PATH -eq "") {
- Write-Host "❌ Error: No installer executable found in the extracted files!"
- Write-Host "📂 Extracted Files:"
- Get-ChildItem -Path $ExtractPath -Recurse | Format-Table -AutoSize
- exit 1
- }
-
- Write-Host "✅ Installer found: $INSTALLER_PATH"
- echo "INSTALLER_PATH=$INSTALLER_PATH" | Out-File -FilePath $env:GITHUB_ENV -Append
-
- - name: Install Second Life Using Task Scheduler (Bypass UAC)
- shell: pwsh
- run: |
- $action = New-ScheduledTaskAction -Execute "${{ env.INSTALLER_PATH }}" -Argument "/S"
- $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
- $task = New-ScheduledTask -Action $action -Principal $principal
- Register-ScheduledTask -TaskName "SilentSLInstaller" -InputObject $task -Force
- Start-ScheduledTask -TaskName "SilentSLInstaller"
-
- - name: Wait for Installation to Complete
- shell: pwsh
- run: |
- Write-Host "Waiting for the Second Life installer to finish..."
- do {
- Start-Sleep -Seconds 5
- $installerProcess = Get-Process | Where-Object { $_.Path -eq "${{ env.INSTALLER_PATH }}" }
- } while ($installerProcess)
-
- Write-Host "✅ Installation completed!"
-
- - name: Cleanup Task Scheduler Entry
- shell: pwsh
- run: |
- Unregister-ScheduledTask -TaskName "SilentSLInstaller" -Confirm:$false
- Write-Host "✅ Task Scheduler entry removed."
-
- - name: Delete Installer ZIP
- shell: pwsh
- run: |
- # Explicitly set BUILD_ID again
- $BUILD_ID = "${{ github.event.workflow_run.id }}"
- $DeletePath = "$env:TEMP\secondlife-build-$BUILD_ID\installer.zip"
-
- Write-Host "Checking if installer ZIP exists: $DeletePath"
-
- # Ensure the ZIP file exists before trying to delete it
- if (Test-Path $DeletePath) {
- Remove-Item -Path $DeletePath -Force
- Write-Host "✅ Successfully deleted: $DeletePath"
- } else {
- Write-Host "⚠️ Warning: ZIP file does not exist, skipping deletion."
- }
-
- - name: Run QA Test Script
- run: |
- Write-Host "Running QA Test script..."
- python C:\viewer-sikulix-main\runTests.py
-
- # - name: Upload Test Results
- # uses: actions/upload-artifact@v3
- # with:
- # name: test-results
- # path: C:\viewer-sikulix-main\regressionTest\test_results.html
+name: Run QA Test # Runs automated tests on self-hosted QA machines
+
+permissions:
+ contents: read
+
+on:
+ workflow_run:
+ workflows: ["Build"]
+ types:
+ - completed
+ workflow_dispatch:
+ inputs:
+ build_id:
+ description: 'Build workflow run ID (e.g. For github.com/secondlife/viewer/actions/runs/1234567890 the ID is 1234567890)'
+ required: true
+ default: '14806728332'
+
+jobs:
+ debug-workflow:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Debug Workflow Variables
+ run: |
+ echo "Workflow Conclusion: ${{ github.event.workflow_run.conclusion }}"
+ echo "Workflow Head Branch: ${{ github.event.workflow_run.head_branch }}"
+ echo "Workflow Run ID: ${{ github.event.workflow_run.id }}"
+ echo "Head Commit Message: ${{ github.event.workflow_run.head_commit.message }}"
+ echo "GitHub Ref: ${{ github.ref }}"
+ echo "GitHub Ref Name: ${{ github.ref_name }}"
+ echo "GitHub Event Name: ${{ github.event_name }}"
+ echo "GitHub Workflow Name: ${{ github.workflow }}"
+
+ install-viewer-and-run-tests:
+ concurrency:
+ group: ${{ github.workflow }}-${{ matrix.runner }}
+ cancel-in-progress: false # Prevents cancellation of in-progress jobs
+
+ strategy:
+ matrix:
+ include:
+ - os: windows
+ runner: qa-windows-atlas
+ artifact: Windows-installer
+ install-path: 'C:\viewer-automation-main'
+ - os: windows
+ runner: qa-dan-asus
+ artifact: Windows-installer
+ install-path: 'C:\viewer-automation-main'
+ # Commented out until mac runner is available
+ # - os: mac
+ # runner: qa-mac-atlas
+ # artifact: Mac-installer
+ # install-path: '$HOME/Documents/viewer-automation'
+ fail-fast: false
+
+ runs-on: [self-hosted, "${{ matrix.runner }}"]
+ # Run test only on successful builds of Second_Life_X branches or on manual dispatch
+ if: >
+ (github.event_name == 'workflow_run' &&
+ github.event.workflow_run.conclusion == 'success' &&
+ startsWith(github.event.workflow_run.head_branch, 'Second_Life')) ||
+ github.event_name == 'workflow_dispatch'
+
+ steps:
+ # Windows-specific steps
+ - name: Set Build ID
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ if ("${{ github.event_name }}" -eq "workflow_dispatch") {
+ echo "BUILD_ID=${{ github.event.inputs.build_id }}" | Out-File -FilePath $env:GITHUB_ENV -Append
+ echo "ARTIFACTS_URL=https://api.github.com/repos/secondlife/viewer/actions/runs/${{ github.event.inputs.build_id }}/artifacts" | Out-File -FilePath $env:GITHUB_ENV -Append
+ } else {
+ echo "BUILD_ID=${{ github.event.workflow_run.id }}" | Out-File -FilePath $env:GITHUB_ENV -Append
+ echo "ARTIFACTS_URL=https://api.github.com/repos/secondlife/viewer/actions/runs/${{ github.event.workflow_run.id }}/artifacts" | Out-File -FilePath $env:GITHUB_ENV -Append
+ }
+
+ - name: Temporarily Allow PowerShell Scripts (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ Set-ExecutionPolicy RemoteSigned -Scope Process -Force
+
+ - name: Verify viewer-automation-main Exists (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ if (-Not (Test-Path -Path '${{ matrix.install-path }}')) {
+ Write-Host '❌ Error: viewer-automation folder not found on runner!'
+ exit 1
+ }
+ Write-Host '✅ viewer-automation folder is provided.'
+
+ - name: Verify viewer-automation-main is Up-To-Date (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ continue-on-error: true
+ run: |
+ cd ${{ matrix.install-path }}
+ Write-Host "Checking for repository updates..."
+
+ # Check if .git directory exists
+ if (Test-Path -Path ".git") {
+ try {
+ # Save local changes instead of discarding them
+ git stash push -m "Automated stash before update $(Get-Date)"
+ Write-Host "Local changes saved (if any)"
+
+ # Update the repository
+ git pull
+ Write-Host "✅ Repository updated successfully"
+
+ # Try to restore local changes if any were stashed
+ $stashList = git stash list
+ if ($stashList -match "Automated stash before update") {
+ try {
+ git stash pop
+ Write-Host "✅ Local changes restored successfully"
+ } catch {
+ Write-Host "⚠️ Conflict when restoring local changes"
+ # Save the conflicted state in a new branch for later review
+ $branchName = "conflict-recovery-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
+ git checkout -b $branchName
+ Write-Host "✅ Created branch '$branchName' with conflicted state"
+
+ # For test execution, revert to a clean state
+ git reset --hard HEAD
+ Write-Host "✅ Reset to clean state for test execution"
+ }
+ }
+ } catch {
+ Write-Host "⚠️ Could not update repository: $_"
+ Write-Host "Continuing with existing files..."
+ }
+ } else {
+ Write-Host "⚠️ Not a Git repository, using existing files"
+ }
+
+ - name: Verify Python Installation (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ try {
+ $pythonVersion = (python --version)
+ Write-Host "✅ Python found: $pythonVersion"
+ } catch {
+ Write-Host "❌ Error: Python not found in PATH. Please install Python on this runner."
+ exit 1
+ }
+
+ - name: Setup Python Virtual Environment (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
+ cd ${{ matrix.install-path }}
+
+ if (-Not (Test-Path -Path ".venv")) {
+ Write-Host "Creating virtual environment..."
+ python -m venv .venv
+ } else {
+ Write-Host "Using existing virtual environment"
+ }
+
+ # Direct environment activation to avoid script execution issues
+ $env:VIRTUAL_ENV = "$PWD\.venv"
+ $env:PATH = "$env:VIRTUAL_ENV\Scripts;$env:PATH"
+
+ # Install dependencies
+ if (Test-Path -Path "requirements.txt") {
+ Write-Host "Installing dependencies from requirements.txt..."
+ pip install -r requirements.txt
+
+ # Install Playwright browsers - add this line
+ Write-Host "Installing Playwright browsers..."
+ python -m playwright install
+ } else {
+ pip install outleap requests behave playwright
+ # Install Playwright browsers - add this line
+ Write-Host "Installing Playwright browsers..."
+ python -m playwright install
+ }
+
+ - name: Fetch & Download Installer Artifact (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ $BUILD_ID = "${{ env.BUILD_ID }}"
+ $ARTIFACTS_URL = "${{ env.ARTIFACTS_URL }}"
+
+ # Fetch the correct artifact URL
+ $response = Invoke-RestMethod -Headers @{Authorization="token ${{ secrets.GITHUB_TOKEN }}" } -Uri $ARTIFACTS_URL
+ $ARTIFACT_NAME = ($response.artifacts | Where-Object { $_.name -eq "${{ matrix.artifact }}" }).archive_download_url
+
+ if (-Not $ARTIFACT_NAME) {
+ Write-Host "❌ Error: ${{ matrix.artifact }} artifact not found!"
+ exit 1
+ }
+
+ Write-Host "✅ Artifact found: $ARTIFACT_NAME"
+
+ # Secure download path
+ $DownloadPath = "$env:TEMP\secondlife-build-$BUILD_ID"
+ New-Item -ItemType Directory -Path $DownloadPath -Force | Out-Null
+ $InstallerPath = "$DownloadPath\installer.zip"
+
+ # Download the ZIP
+ Invoke-WebRequest -Uri $ARTIFACT_NAME -Headers @{Authorization="token ${{ secrets.GITHUB_TOKEN }}"} -OutFile $InstallerPath
+
+ # Ensure download succeeded
+ if (-Not (Test-Path $InstallerPath)) {
+ Write-Host "❌ Error: Failed to download ${{ matrix.artifact }}.zip"
+ exit 1
+ }
+
+ # Set the path for other steps
+ echo "DOWNLOAD_PATH=$DownloadPath" | Out-File -FilePath $env:GITHUB_ENV -Append
+
+ - name: Extract Installer & Locate Executable (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ $BUILD_ID = "${{ env.BUILD_ID }}"
+ $ExtractPath = "${{ env.DOWNLOAD_PATH }}"
+ $InstallerZip = "$ExtractPath\installer.zip"
+
+ # Print paths for debugging
+ Write-Host "Extract Path: $ExtractPath"
+ Write-Host "Installer ZIP Path: $InstallerZip"
+
+ # Verify ZIP exists before extracting
+ if (-Not (Test-Path $InstallerZip)) {
+ Write-Host "❌ Error: ZIP file not found at $InstallerZip!"
+ exit 1
+ }
+
+ Write-Host "✅ ZIP file exists and is valid. Extracting..."
+
+ Expand-Archive -Path $InstallerZip -DestinationPath $ExtractPath -Force
+
+ # Find installer executable
+ $INSTALLER_PATH = (Get-ChildItem -Path $ExtractPath -Filter '*.exe' -Recurse | Select-Object -First 1).FullName
+
+ if (-Not $INSTALLER_PATH -or $INSTALLER_PATH -eq "") {
+ Write-Host "❌ Error: No installer executable found in the extracted files!"
+ Write-Host "📂 Extracted Files:"
+ Get-ChildItem -Path $ExtractPath -Recurse | Format-Table -AutoSize
+ exit 1
+ }
+
+ Write-Host "✅ Installer found: $INSTALLER_PATH"
+ echo "INSTALLER_PATH=$INSTALLER_PATH" | Out-File -FilePath $env:GITHUB_ENV -Append
+
+ - name: Install Second Life (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ # Windows - Use Task Scheduler to bypass UAC
+ $action = New-ScheduledTaskAction -Execute "${{ env.INSTALLER_PATH }}" -Argument "/S"
+ $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
+ $task = New-ScheduledTask -Action $action -Principal $principal
+ Register-ScheduledTask -TaskName "SilentSLInstaller" -InputObject $task -Force
+ Start-ScheduledTask -TaskName "SilentSLInstaller"
+
+ - name: Wait for Installation to Complete (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ Write-Host "Waiting for the Second Life installer to finish..."
+ do {
+ Start-Sleep -Seconds 5
+ $installerProcess = Get-Process | Where-Object { $_.Path -eq "${{ env.INSTALLER_PATH }}" }
+ } while ($installerProcess)
+
+ Write-Host "✅ Installation completed!"
+
+ - name: Cleanup After Installation (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ # Cleanup Task Scheduler Entry
+ Unregister-ScheduledTask -TaskName "SilentSLInstaller" -Confirm:$false
+ Write-Host "✅ Task Scheduler entry removed."
+
+ # Delete Installer ZIP
+ $DeletePath = "${{ env.DOWNLOAD_PATH }}\installer.zip"
+
+ Write-Host "Checking if installer ZIP exists: $DeletePath"
+
+ # Ensure the ZIP file exists before trying to delete it
+ if (Test-Path $DeletePath) {
+ Remove-Item -Path $DeletePath -Force
+ Write-Host "✅ Successfully deleted: $DeletePath"
+ } else {
+ Write-Host "⚠️ Warning: ZIP file does not exist, skipping deletion."
+ }
+
+ - name: Run QA Test Script (Windows)
+ if: matrix.os == 'windows'
+ shell: pwsh
+ run: |
+ Write-Host "Running QA Test script on Windows runner: ${{ matrix.runner }}..."
+ cd ${{ matrix.install-path }}
+
+ # Activate virtual environment
+ Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
+ $env:VIRTUAL_ENV = "$PWD\.venv"
+ $env:PATH = "$env:VIRTUAL_ENV\Scripts;$env:PATH"
+
+ # Set runner name as environment variable
+ $env:RUNNER_NAME = "${{ matrix.runner }}"
+
+ # Run the test script
+ python runTests.py
+
+ # Mac-specific steps
+ - name: Set Build ID (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
+ echo "BUILD_ID=${{ github.event.inputs.build_id }}" >> $GITHUB_ENV
+ echo "ARTIFACTS_URL=https://api.github.com/repos/secondlife/viewer/actions/runs/${{ github.event.inputs.build_id }}/artifacts" >> $GITHUB_ENV
+ else
+ echo "BUILD_ID=${{ github.event.workflow_run.id }}" >> $GITHUB_ENV
+ echo "ARTIFACTS_URL=https://api.github.com/repos/secondlife/viewer/actions/runs/${{ github.event.workflow_run.id }}/artifacts" >> $GITHUB_ENV
+ fi
+
+ - name: Verify viewer-automation-main Exists (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ if [ ! -d "${{ matrix.install-path }}" ]; then
+ echo "❌ Error: viewer-automation folder not found on runner!"
+ exit 1
+ fi
+ echo "✅ viewer-automation is provided."
+
+ - name: Verify viewer-automation-main is Up-To-Date (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ continue-on-error: true
+ run: |
+ cd ${{ matrix.install-path }}
+ echo "Checking for repository updates..."
+
+ # Check if .git directory exists
+ if [ -d ".git" ]; then
+ # Save local changes instead of discarding them
+ git stash push -m "Automated stash before update $(date)"
+ echo "Local changes saved (if any)"
+
+ # Update the repository
+ git pull || echo "⚠️ Could not update repository"
+ echo "✅ Repository updated (or attempted update)"
+
+ # Try to restore local changes if any were stashed
+ if git stash list | grep -q "Automated stash before update"; then
+ # Try to pop the stash, but be prepared for conflicts
+ if ! git stash pop; then
+ echo "⚠️ Conflict when restoring local changes"
+ # Save the conflicted state in a new branch for later review
+ branch_name="conflict-recovery-$(date +%Y%m%d-%H%M%S)"
+ git checkout -b "$branch_name"
+ echo "✅ Created branch '$branch_name' with conflicted state"
+
+ # For test execution, revert to a clean state
+ git reset --hard HEAD
+ echo "✅ Reset to clean state for test execution"
+ else
+ echo "✅ Local changes restored successfully"
+ fi
+ fi
+ else
+ echo "⚠️ Not a Git repository, using existing files"
+ fi
+
+ - name: Verify Python Installation (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ if command -v python3 &> /dev/null; then
+ PYTHON_VERSION=$(python3 --version)
+ echo "✅ Python found: $PYTHON_VERSION"
+ else
+ echo "❌ Error: Python3 not found in PATH. Please install Python on this runner."
+ exit 1
+ fi
+
+ - name: Setup Python Virtual Environment (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ cd ${{ matrix.install-path }}
+
+ # Create virtual environment if it doesn't exist
+ if [ ! -d ".venv" ]; then
+ echo "Creating virtual environment..."
+ python3 -m venv .venv
+ else
+ echo "Using existing virtual environment"
+ fi
+
+ # Activate virtual environment
+ source .venv/bin/activate
+
+ # Install dependencies
+ if [ -f "requirements.txt" ]; then
+ pip install -r requirements.txt
+ echo "✅ Installed dependencies from requirements.txt"
+
+ # Install Playwright browsers - add this line
+ echo "Installing Playwright browsers..."
+ python -m playwright install
+ else
+ pip install outleap requests behave playwright
+ echo "⚠️ requirements.txt not found, installed basic dependencies"
+
+ # Install Playwright browsers - add this line
+ echo "Installing Playwright browsers..."
+ python -m playwright install
+ fi
+
+ - name: Fetch & Download Installer Artifact (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ # Mac-specific Bash commands
+ response=$(curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -s ${{ env.ARTIFACTS_URL }})
+ ARTIFACT_NAME=$(echo $response | jq -r '.artifacts[] | select(.name=="${{ matrix.artifact }}") | .archive_download_url')
+
+ if [ -z "$ARTIFACT_NAME" ]; then
+ echo "❌ Error: ${{ matrix.artifact }} artifact not found!"
+ exit 1
+ fi
+
+ echo "✅ Artifact found: $ARTIFACT_NAME"
+
+ # Secure download path
+ DOWNLOAD_PATH="/tmp/secondlife-build-${{ env.BUILD_ID }}"
+ mkdir -p $DOWNLOAD_PATH
+ INSTALLER_PATH="$DOWNLOAD_PATH/installer.zip"
+
+ # Download the ZIP
+ curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -L $ARTIFACT_NAME -o $INSTALLER_PATH
+
+ # Ensure download succeeded
+ if [ ! -f "$INSTALLER_PATH" ]; then
+ echo "❌ Error: Failed to download ${{ matrix.artifact }}.zip"
+ exit 1
+ fi
+
+ # Set the path for other steps
+ echo "DOWNLOAD_PATH=$DOWNLOAD_PATH" >> $GITHUB_ENV
+
+ - name: Extract Installer & Locate Executable (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ EXTRACT_PATH="${{ env.DOWNLOAD_PATH }}"
+ INSTALLER_ZIP="$EXTRACT_PATH/installer.zip"
+
+ # Debug output
+ echo "Extract Path: $EXTRACT_PATH"
+ echo "Installer ZIP Path: $INSTALLER_ZIP"
+
+ # Verify ZIP exists
+ if [ ! -f "$INSTALLER_ZIP" ]; then
+ echo "❌ Error: ZIP file not found at $INSTALLER_ZIP!"
+ exit 1
+ fi
+
+ echo "✅ ZIP file exists and is valid. Extracting..."
+
+ # Extract the ZIP
+ unzip -o "$INSTALLER_ZIP" -d "$EXTRACT_PATH"
+
+ # Find DMG file
+ INSTALLER_PATH=$(find "$EXTRACT_PATH" -name "*.dmg" -type f | head -1)
+
+ if [ -z "$INSTALLER_PATH" ]; then
+ echo "❌ Error: No installer DMG found in the extracted files!"
+ echo "📂 Extracted Files:"
+ ls -la "$EXTRACT_PATH"
+ exit 1
+ fi
+
+ echo "✅ Installer found: $INSTALLER_PATH"
+ echo "INSTALLER_PATH=$INSTALLER_PATH" >> $GITHUB_ENV
+
+ - name: Install Second Life (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ # Mac installation
+ echo "Mounting DMG installer..."
+ MOUNT_POINT="/tmp/secondlife-dmg"
+ mkdir -p "$MOUNT_POINT"
+
+ # Mount the DMG
+ hdiutil attach "${{ env.INSTALLER_PATH }}" -mountpoint "$MOUNT_POINT" -nobrowse
+
+ echo "✅ DMG mounted at $MOUNT_POINT"
+
+ # Find the app in the mounted DMG
+ APP_PATH=$(find "$MOUNT_POINT" -name "*.app" -type d | head -1)
+
+ if [ -z "$APP_PATH" ]; then
+ echo "❌ Error: No .app bundle found in the mounted DMG!"
+ exit 1
+ fi
+
+ echo "Installing application to Applications folder..."
+
+ # Copy the app to the Applications folder (or specified install path)
+ cp -R "$APP_PATH" "${{ matrix.install-path }}"
+
+ # Verify the app was copied successfully
+ if [ ! -d "${{ matrix.install-path }}/$(basename "$APP_PATH")" ]; then
+ echo "❌ Error: Failed to install application to ${{ matrix.install-path }}!"
+ exit 1
+ fi
+
+ echo "✅ Application installed successfully to ${{ matrix.install-path }}"
+
+ # Save mount point for cleanup
+ echo "MOUNT_POINT=$MOUNT_POINT" >> $GITHUB_ENV
+
+ - name: Wait for Installation to Complete (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ echo "Waiting for installation to complete..."
+ # Sleep to allow installation to finish (adjust as needed)
+ sleep 30
+ echo "✅ Installation completed"
+
+ - name: Cleanup After Installation (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ # Mac cleanup
+ # Unmount the DMG
+ echo "Unmounting DMG..."
+ hdiutil detach "${{ env.MOUNT_POINT }}" -force
+
+ # Clean up temporary files
+ echo "Cleaning up temporary files..."
+ rm -rf "${{ env.DOWNLOAD_PATH }}"
+ rm -rf "${{ env.MOUNT_POINT }}"
+
+ echo "✅ Cleanup completed"
+
+ - name: Run QA Test Script (Mac)
+ if: matrix.os == 'mac'
+ shell: bash
+ run: |
+ echo "Running QA Test script on Mac runner: ${{ matrix.runner }}..."
+ cd ${{ matrix.install-path }}
+
+ # Activate virtual environment
+ source .venv/bin/activate
+
+ # Set runner name as environment variable
+ export RUNNER_NAME="${{ matrix.runner }}"
+
+ # Run the test script
+ python runTests.py
+
+ # - name: Upload Test Results
+ # if: always()
+ # uses: actions/upload-artifact@v4
+ # with:
+ # name: test-results-${{ matrix.runner }}
+ # path: ${{ matrix.install-path }}/regressionTest/test_results.html
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 1dd7c8c800..8baac5a81d 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -12,7 +12,7 @@ repos:
- id: indent-with-spaces
files: \.(cpp|c|h|inl|py|glsl|cmake)$
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.4.0
+ rev: v5.0.0
hooks:
- id: check-xml
- id: mixed-line-ending
diff --git a/README.md b/README.md
index a5fd7a08e0..d27f5cd72b 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ As a third party maintained fork of the [Second Life][] viewer, which includes A
## Download
-Most people use a pre-built viewer release to access Second Life. macOS, GNU/Linux and FreeBSD builds are
+Most people use a pre-built viewer release to access Second Life. FreeBSD, GNU/Linux, macOS and Windows builds are
[published on the official website][download]. More experimental viewers, such as release candidates and
project viewers, would be detailed on the same page, [in-world group][] notices, or [Discord][] server.
@@ -21,14 +21,23 @@ $ cd build-`uname -s|tr '[:upper:]' '[:lower:]'`-`uname -m`
```
$ sudo pacman -S cmake base-devel python apr-util boost fltk glm glu hunspell minizip nanosvg libnghttp2 openjpeg2 libpipewire sdl2 vlc libvorbis xxhash
$ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1"
-$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr ../indra
+```
+build with FMOD Studio: ([register with fmod to get linux package][fmod] and then place the `.tar.gz` in `~/Downloads`)
+```
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DCMAKE_INSTALL_PREFIX=/usr ../indra
+```
+OR, use openal audio: (currently breaks CEF)
+```
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DCMAKE_INSTALL_PREFIX=/usr ../indra
+```
+```
$ make -j`nproc`
$ makepkg -R
$ sudo pacman -U megapahit-`cat newview/viewer_version.txt|sed 's/\(.*\)\./\1-/'`-`uname -m`.pkg.tar.zst
$ megapahit
```
-### Debian
+### Debian amd64
```
$ sudo apt install cmake pkg-config libxml2-utils libalut-dev libaprutil1-dev libboost-fiber1.81-dev libboost-json1.81-dev libboost-program-options1.81-dev libboost-regex1.81-dev libboost-url1.81-dev libexpat1-dev libfltk1.3-dev libfontconfig-dev libfreetype-dev libglu1-mesa-dev libhunspell-dev libjpeg-dev libmeshoptimizer-dev libminizip-dev libnghttp2-dev libpipewire-0.3-dev libpng-dev libsdl2-dev libvlc-dev libvlccore-dev libvorbis-dev libxft-dev libxml2-dev libxxhash-dev
@@ -40,12 +49,33 @@ $ sudo apt install ./megapahit-`cat newview/viewer_version.txt`-Linux.deb
$ megapahit
```
+### Debian arm64
+
+```
+$ sudo apt install cmake pkg-config libxml2-utils libalut-dev libaprutil1-dev libboost-fiber-dev libboost-json-dev libboost-program-options-dev libboost-regex-dev libboost-url-dev libexpat1-dev libfltk1.3-dev libfontconfig-dev libfreetype-dev libglu1-mesa-dev libhunspell-dev libjpeg-dev libmeshoptimizer-dev libminizip-dev libnanosvg-dev libnghttp2-dev libopenjp2-7-dev libpipewire-0.3-dev libpng-dev libsdl2-dev libvlc-dev libvlccore-dev libvorbis-dev libxft-dev libxml2-dev libxxhash-dev
+$ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1"
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DOPENGL_glu_LIBRARY:FILEPATH=/usr/lib/aarch64-linux-gnu/libGLU.so -DOPENGL_glx_LIBRARY:FILEPATH=/usr/lib/aarch64-linux-gnu/libGLX.so -DOPENGL_opengl_LIBRARY:FILEPATH=/usr/lib/aarch64-linux-gnu/libOpenGL.so ../indra
+$ make -j`nproc`
+$ cpack -G DEB
+$ sudo apt install ./megapahit-`cat newview/viewer_version.txt`-Linux.deb
+$ megapahit
+```
+
### Fedora
```
$ sudo dnf install cmake gcc-c++ patch patchelf rpm-build perl-FindBin apr-util-devel boost-devel boost-url expat-devel fltk-devel glm-devel mesa-libGLU-devel hunspell-devel minizip-ng-compat-devel libnghttp2-devel nanosvg-devel openjpeg-devel pipewire-devel pulseaudio-libs-devel SDL2-devel vlc-devel libvorbis-devel libXcursor-devel libXfixes-devel libXinerama-devel xxhash-devel
$ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1"
+```
+build with FMOD Studio: ([register with fmod to get linux package][fmod] and then place the `.tar.gz` in `~/Downloads`)
+```
$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra
+```
+OR, use openal audio: (currently breaks CEF)
+```
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra
+```
+```
$ make -j`nproc`
$ cpack -G RPM
$ sudo dnf install megapahit-`cat newview/viewer_version.txt`-Linux.rpm
@@ -53,8 +83,9 @@ $ megapahit
```
### FreeBSD
+(Currently does not have CEF or WebRTC Voice)
```
-$ sudo su -
+$ su -
# portmaster devel/cmake devel/pkgconf audio/freealut devel/apr1 devel/boost-libs x11-toolkits/fltk math/glm textproc/hunspell misc/meshoptimizer archivers/minizip graphics/nanosvg www/libnghttp2 graphics/openjpeg devel/sdl20 multimedia/vlc audio/libvorbis devel/xxhash
# exit
$ setenv LL_BUILD "-O3 -std=c++20 -fPIC"
@@ -75,6 +106,7 @@ $ megapahit
### Gentoo
```
$ su -
+# emerge -a eselect-repository
# eselect repository add megapahit git git://megapahit.org/ebuild.git
# emaint sync -r megapahit
# emerge -a megapahit
@@ -96,9 +128,18 @@ $ open newview/Megapahit.app
### openSUSE Tumbleweed
```
-$ sudo zypper install gcc-c++ patchelf apr-util-devel boost-devel libboost_program_options-devel libboost_url1_87_0-devel libboost_context-devel libboost_fiber-devel libboost_filesystem-devel libboost_regex-devel libboost_system-devel libboost_thread-devel libexpat-devel fltk-devel glu-devel hunspell-devel minizip-devel nanosvg-devel libnghttp2-devel openjpeg2-devel pipewire-devel libpulse-devel libSDL2_gfx-1_0-0 libSDL2_gfx-devel sdl2-compat-devel vlc-devel libvorbis-devel xxhash-devel zlib-ng-devel libXrender-devel libXcursor-devel libXfixes-devel libXext-devel libXft-devel libXinerama-devel freetype2-devel fontconfig-devel libjpeg8-devel libjpeg8-devel freealut-devel
+$ sudo zypper install cmake gcc-c++ patch patchelf apr-util-devel boost-devel libboost_program_options-devel libboost_url1_88_0 libboost_url1_88_0-devel libboost_context-devel libboost_fiber-devel libboost_filesystem-devel libboost_regex-devel libboost_system-devel libboost_thread-devel libpng16-devel libxml++-devel libexpat-devel fltk-devel glu-devel hunspell-devel minizip-devel nanosvg-devel libnghttp2-devel openjpeg2-devel pipewire-devel libpulse-devel libSDL2_gfx-1_0-0 libSDL2_gfx-devel sdl2-compat-devel vlc-devel libvorbis-devel xxhash-devel zlib-ng-devel libXrender-devel libXcursor-devel libXfixes-devel libXext-devel libXft-devel libXinerama-devel freetype2-devel fontconfig-devel libjpeg8-devel libjpeg8-devel freealut-devel rpm-build
$ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1"
-$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra
+```
+build with FMOD Studio: ([register with fmod to get linux package][fmod] and then place the `.tar.gz` in `~/Downloads`)
+```
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra
+```
+OR, use openal audio: (currently breaks CEF)
+```
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra
+```
+```
$ make -j`nproc`
$ cpack -G RPM
$ rpm --addsign megapahit-`cat newview/viewer_version.txt`-Linux.rpm (Set up pgp public key first)
@@ -111,21 +152,45 @@ $ megapahit
```
$ sudo apt install cmake pkg-config libxml2-utils libaprutil1-dev libboost-fiber-dev libboost-json-dev libboost-program-options-dev libboost-regex-dev libboost-url-dev libexpat1-dev libfltk1.3-dev libfontconfig-dev libfreetype-dev libglu1-mesa-dev libhunspell-dev libjpeg-dev libmeshoptimizer-dev libminizip-dev libnanosvg-dev libnghttp2-dev libpipewire-0.3-dev libpng-dev libsdl2-dev libvlc-dev libvlccore-dev libvorbis-dev libxft-dev libxml2-dev libxxhash-dev
$ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1"
+```
+build with FMOD Studio: ([register with fmod to get linux package][fmod] and then place the `.tar.gz` in `~/Downloads`)
+```
$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra
+```
+OR, use openal audio: (currently breaks CEF)
+```
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra
+```
+```
$ make -j`nproc`
$ cpack -G DEB
$ sudo apt install ./megapahit-`cat newview/viewer_version.txt`-Linux.deb
$ megapahit
```
-### Windows
+### Windows arm64
+```
+$ vcpkg install python3 freealut apr-util boost curl freetype glm hunspell libjpeg-turbo meshoptimizer minizip nanosvg nghttp2 openjpeg sse2neon libvorbis libxml2[tools] xxhash
+$ vcpkg install --allow-unsupported boost-fiber
+$ export LL_BUILD="/MD /O2 /Ob2 /std:c++20 /Zc:wchar_t- /Zi /GR /DLL_RELEASE=1 /DLL_RELEASE_FOR_DOWNLOAD=1 /DNDEBUG /D_SECURE_STL=0 /D_HAS_ITERATOR_DEBUGGING=0 /DWIN32 /D_WINDOWS /DLL_WINDOWS=1 /DUNICODE /D_UNICODE /DWINVER=0x0602 /D_WIN32_WINNT=0x0602 /Zc:preprocessor"
+$ export PATH="$VCPKG_ROOT/downloads/tools/cmake-3.30.1-windows/cmake-3.30.1-windows-arm64/bin:$VCPKG_ROOT/installed/arm64-windows/tools/libxml2:/c/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin:$PATH"
+$ export PYTHON="$VCPKG_ROOT/installed/arm64-windows/tools/python3/python.exe"
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=OFF -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=Megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DCMAKE_TOOLCHAIN_FILE:FILEPATH=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake -DVS_DISABLE_FATAL_WARNINGS:BOOL=ON ../indra
+$ MSBuild.exe Megapahit.sln -p:Configuration=Release
+$ cpack -G NSIS
+$ start Megapahit-`cat newview/viewer_version.txt`-win64.exe
+```
+
+### Windows x64
```
-$ vcpkg install pkgconf python3 freealut apr-util boost freetype glm hunspell libjpeg-turbo meshoptimizer minizip nghttp2 openjpeg libvorbis libxml2[tools] xxhash
+$ vcpkg install python3 freealut apr-util boost freetype glm hunspell libjpeg-turbo meshoptimizer minizip nanosvg nghttp2 openjpeg libvorbis libxml2[tools] xxhash
$ export LL_BUILD="/MD /O2 /Ob2 /std:c++20 /Zc:wchar_t- /Zi /GR /DLL_RELEASE=1 /DLL_RELEASE_FOR_DOWNLOAD=1 /DNDEBUG /D_SECURE_STL=0 /D_HAS_ITERATOR_DEBUGGING=0 /DWIN32 /D_WINDOWS /DLL_WINDOWS=1 /DUNICODE /D_UNICODE /DWINVER=0x0602 /D_WIN32_WINNT=0x0602"
-$ export PATH="/c/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin:$VCPKG_ROOT/downloads/tools/msys2/21caed2f81ec917b/mingw64/bin:$VCPKG_ROOT/installed/`uname -m|sed 's/86_//'`-windows/tools/libxml2:$PATH"
-$ export PKG_CONFIG_LIBDIR="$VCPKG_ROOT/installed/`uname -m|sed 's/86_//'`-windows/lib/pkgconfig"
-$ export PYTHON="$VCPKG_ROOT/installed/`uname -m|sed 's/86_//'`-windows/tools/python3/python.exe"
-$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=OFF -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=OFF -DPACKAGE:BOOL=OFF ../indra
+$ export PATH="$VCPKG_ROOT/downloads/tools/cmake-3.30.1-windows/cmake-3.30.1-windows-i386/bin:$VCPKG_ROOT/installed/x64-windows/tools/libxml2:/c/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin:$PATH"
+$ export PYTHON="$VCPKG_ROOT/installed/x64-windows/tools/python3/python.exe"
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=Megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DCMAKE_TOOLCHAIN_FILE:FILEPATH=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake -DVS_DISABLE_FATAL_WARNINGS:BOOL=ON ../indra
+$ MSBuild.exe Megapahit.sln -p:Configuration=Release
+$ cpack -G NSIS
+$ start Megapahit-`cat newview/viewer_version.txt`-win64.exe
```
## Contribute
@@ -140,3 +205,4 @@ pull requests and more. See the [CONTRIBUTING][] and the [open source portal][]
[contributing]: https://megapahit.org/viewer.git/tree/CONTRIBUTING.md
[in-world group]: https://world.secondlife.com/group/1142646c-5fb2-162c-ecf8-c5e422ab5c6d
[Discord]: https://discord.gg/jpt33HPVEK
+[fmod]: https://www.fmod.com/studio
diff --git a/autobuild.xml b/autobuild.xml
index ff1c9414a3..e22c5a25f2 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -2347,17 +2347,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
</map>
<key>threejs</key>
<map>
- <key>copyright</key>
- <string>Copyright © 2010-2021 three.js authors</string>
- <key>license</key>
- <string>MIT</string>
- <key>license_file</key>
- <string>LICENSES/THREEJS_LICENSE.txt</string>
- <key>name</key>
- <string>threejs</string>
<key>platforms</key>
<map>
- <key>common</key>
+ <key>darwin64</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>cfed00d8ea7265c035c2d86a234b28efb0b23756</string>
+ <key>hash_algorithm</key>
+ <string>sha1</string>
+ <key>url</key>
+ <string>https://github.com/secondlife/3p-three_js/releases/download/v0.132.2-b8f6746/threejs-0.132.2-darwin64-b8f6746.tar.zst</string>
+ </map>
+ <key>name</key>
+ <string>darwin64</string>
+ </map>
+ <key>linux64</key>
<map>
<key>archive</key>
<map>
@@ -2368,12 +2374,32 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>url</key>
<string>https://github.com/secondlife/3p-three_js/releases/download/v0.132.2-5da28d9/threejs-0.132.2-common-8454371083.tar.zst</string>
</map>
+ </map>
+ <key>windows64</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>4141710fccbd1ea2b3b53d00e189bdfa2ee9d441</string>
+ <key>hash_algorithm</key>
+ <string>sha1</string>
+ <key>url</key>
+ <string>https://github.com/secondlife/3p-three_js/releases/download/v0.132.2-b8f6746/threejs-0.132.2-windows64-b8f6746.tar.zst</string>
+ </map>
<key>name</key>
- <string>common</string>
+ <string>windows64</string>
</map>
</map>
+ <key>license</key>
+ <string>MIT</string>
+ <key>license_file</key>
+ <string>LICENSES/THREEJS_LICENSE.txt</string>
+ <key>copyright</key>
+ <string>Copyright © 2010-2021 three.js authors</string>
<key>version</key>
<string>0.132.2</string>
+ <key>name</key>
+ <string>threejs</string>
</map>
<key>tinygltf</key>
<map>
diff --git a/doc/testplans/PRIM_MEDIA_FIRST_CLICK_INTERACT.md b/doc/testplans/PRIM_MEDIA_FIRST_CLICK_INTERACT.md
new file mode 100644
index 0000000000..690146265c
--- /dev/null
+++ b/doc/testplans/PRIM_MEDIA_FIRST_CLICK_INTERACT.md
@@ -0,0 +1,160 @@
+# Test plan for PRIM_MEDIA_FIRST_CLICK_INTERACT
+
+## Requirements
+
+- At least two accounts
+- At least one group
+- Land under your control
+
+## Feature Brief
+
+Historically media-on-a-prim (MOAP) in Second Life has been bound to a focus system which blocks mouse click/hover events, this feature creates exceptions to this focus system for a configurable set of objects to meet user preference.
+
+## Testing
+
+The following scripts and test cases cover each individual operational mode of the feature; in practice these modes can be combined by advanced users in any configuration they desire from debug settings. Even though the intended use case combines multiple modes, individual modes can be tested for functionality when tested as described below.
+
+If testing an arbitrary combination of operational modes beyond what the GUI offers is desired, the parameters of the bitfield for calculation are located in lltoolpie.h under the MediaFirstClickTypes enum. As of writing there exists a total of ~127 possible unique/valid combinations, which is why testing each mode individually is considered the most efficient for a full functionality test.
+
+### Scripts
+
+#### Script A
+
+This script creates a media surface that is eligible for media first-click interact. Depending on test conditions, this will exhibit new behavior.
+
+```lsl
+default {
+ state_entry() {
+ llSetLinkMedia( LINK_THIS, 0, [
+ PRIM_MEDIA_CURRENT_URL, "http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/agni/avatars.html",
+ PRIM_MEDIA_HOME_URL, "http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/agni/avatars.html",
+ PRIM_MEDIA_FIRST_CLICK_INTERACT, TRUE,
+ PRIM_MEDIA_AUTO_PLAY, TRUE,
+ PRIM_MEDIA_CONTROLS, PRIM_MEDIA_CONTROLS_MINI
+ ] );
+ }
+}
+
+```
+
+#### Script B
+
+This script creates a media surface that is NOT eligible for media first-click interact. In all but one test case, this will behave the same way.
+
+```lsl
+default {
+ state_entry() {
+ llSetLinkMedia( LINK_THIS, 0, [
+ PRIM_MEDIA_CURRENT_URL, "http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/agni/avatars.html",
+ PRIM_MEDIA_HOME_URL, "http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/agni/avatars.html",
+ PRIM_MEDIA_FIRST_CLICK_INTERACT, FALSE,
+ PRIM_MEDIA_AUTO_PLAY, TRUE,
+ PRIM_MEDIA_CONTROLS, PRIM_MEDIA_CONTROLS_MINI
+ ] );
+ }
+}
+
+```
+
+## Standard testing procedure
+
+You will be asked to enable media faces on multiple cubes, make sure that the webpage loads on each, and interact with them in the following ways.
+
+1. Enable media for the cube, and verify that it displays a webpage.
+2. Click on the terrain to clear any focus.
+3. Hover your mouse over UI elements of the webpage, and **observe** if they highlight/react to the mouse cursor.
+4. If hover events are not registered, clicking on the webpage and then **observe** if they begin reacting to hover events.
+5. Clicking on the terrain to clear any focus once again.
+6. Clicking on a UI element of the webpage and **observe** if it reacts to the first click, or requires a second click. *(Maximum of 2 clicks per attempt)*
+
+These steps will be repeated for one or more pairs of cubes per test case to ensure that media first click interact is functioning within expectations. Unless otherwise mentioned for a specific test case, you simply need only be in the same region as the cubes to test with them.
+
+## Test cases
+
+All test cases begin with at least two cubes rezzed, one containing Script A henceforth referred to as Cube A and one with Script B referred to as Cube B. The steps of some test cases may impact the condition of the cubes, so keeping a spare set rezzed or in inventory to rapidly duplicate should improve efficiency if testing cases in series.
+
+### Case 1 (MEDIA_FIRST_CLICK_NONE)
+
+Ensure that debug setting `MediaFirstClickInteract` is set to `0`
+
+Starting with Cube A and Cube B, perform the testing procedure on each.
+
+**Expected observations:** Both webpages do not react to hover events until clicked, both webpages do not react to clicks until clicked once to establish focus
+
+### Case 2 (MEDIA_FIRST_CLICK_HUD)
+
+Ensure that debug setting `MediaFirstClickInteract` is set to `1`
+
+Starting with Cube A and Cube B, attach them both to your HUD and perform the testing procedure on each. You may need to rotate or scale the cubes to fit on your screen before beginning testing. You may attach both at the same time, or only one at a time.
+
+**Expected observations:** The webpage on Cube A will react to mouse cursor hover events and clicks without needing a focus click, but the webpage on Cube B will not.
+
+### Case 3 (MEDIA_FIRST_CLICK_OWN)
+
+Ensure that debug setting `MediaFirstClickInteract` is set to `2`
+
+This test case requires two pairs of cubes, and the second pair must not be owned by your testing account. What owns them is not important, it can be a group or your second testing account.
+
+Perform the testing procedure on both sets of cubes.
+
+**Expected observations:** The webpage on Cube A will react to mouse cursor hover events and clicks without needing a focus click, but the webpage on Cube B will not. The other pair of cubes will react the same as your Cube B.
+
+### Case 4 (MEDIA_FIRST_CLICK_GROUP)
+
+Ensure that debug setting `MediaFirstClickInteract` is set to `4`
+
+This test case requires two pairs of cubes, and the second pair must be deeded or set to a group that your testing account is a member of, but does not have set as active at the beginning of the test. As long as the second set of cubes is set to a group that your primary test account is a member of, the avatar that owns them does not matter.
+
+1. Perform the testing procedure on both sets of cubes.
+2. Activate the group that the second set of cubes is set / deeded to
+3. Perform the testing procedure on both sets of cubes once more.
+
+**Expected observations:** Both cubes owned by your primary testing account will not react to mouse cursor hover events and clicks without needing a focus click. Cube A set to group will react to mouse cursor hover events and clicks without needing a focus click, but Cube B will not.
+
+### Case 5 (MEDIA_FIRST_CLICK_FRIEND)
+
+Ensure that debug setting `MediaFirstClickInteract` is set to `8`
+
+This test case requires three sets of cubes, one owned by you, one owned by another avatar on your friend list, and a third set owned by an avatar that is not on your friend list, or deeded to group. You can optionally use two sets of cubes, and dissolve friendship with your second account to test non-friend cubes.
+
+Perform the testing procedure on all cubes
+
+**Expected observations:** Cube A owned by a friended avatar will react to mouse cursor hover events and clicks without needing a focus click. All other cubes will not.
+
+### Case 6 (MEDIA_FIRST_CLICK_LAND)
+
+Ensure that debug setting `MediaFirstClickInteract` is set to `16`
+
+This is the most tricky test case due to the multiple combinations that this operational mode considers valid. You will need multiple cubes, and can omit Cube B for brevity unless running a full test pass. This is probably most efficiently tested from your second account, using your first account to adjust the test parameters to fit other sub-cases.
+
+Note: This requires the avatar that is performing the tests to physically be in the same parcel as the test cube(s). If you are standing outside of the parcel the media cubes are in, they will never react to mouse cursor hover events and clicks without needing a focus click under this operational mode.
+
+1. Place down a set of cubes owned by the same avatar as the land
+ - The second account should see Cube A react to mouse cursor hover events and clicks without needing a focus click
+ - Cube B if tested, will not react in all further sub-cases and will not be mentioned further.
+
+2. Adjust the conditions of the cubes and parcel such that they are owned by another avatar, but have the same group as the land set
+ - The second account should see Cube A react to mouse cursor hover events and clicks without needing a focus click
+
+3. Adjust the conditions of the cubes and parcel such that they are deeded to the same group that the parcel is deeded to
+ - The second account should see Cube A react to mouse cursor hover events and clicks without needing a focus click
+
+4. Adjust the conditions of the cubes and parcel such that the parcel and cubes do not share an owner, or a group
+ - The second account should see Cube A NOT react to mouse cursor hover events until clicked, and clicks WILL need a focus click before registering.
+
+### Case 7 (MEDIA_FIRST_CLICK_ANY) (optional)
+
+Ensure that debug setting `MediaFirstClickInteract` is set to `31`
+
+Repeat test cases 1-6.
+
+1. Test case 1 should fail
+2. Test cases 2-6 should pass
+
+### Case 8 (MEDIA_FIRST_CLICK_ALL) (optional)
+
+Ensure that debug setting `MediaFirstClickInteract` is set to `1073741824`
+
+Repeat test cases 1-6, there is no pass/fail for this run.
+
+All cubes including B types should exhibit the same first-click interact behavior.
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index b1970fba35..9224b04549 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -59,7 +59,7 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llmessage)
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)))
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..5cb0c23d6d 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
diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake
index fa3b8a4ffb..58a00c74da 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)
diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake
index 9ea1f6c9a6..8459214f59 100644
--- a/indra/cmake/Boost.cmake
+++ b/indra/cmake/Boost.cmake
@@ -12,7 +12,11 @@ if (DARWIN)
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_88)
+ else ()
+ set(sfx -vc143-mt-x64-1_88)
+ endif ()
else ()
find_package( Boost REQUIRED )
endif ()
@@ -21,11 +25,15 @@ target_link_libraries( ll::boost INTERFACE
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 ()
target_compile_definitions( ll::boost INTERFACE BOOST_BIND_GLOBAL_PLACEHOLDERS )
return()
diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake
index 70e6c366a4..b70be7926f 100644
--- a/indra/cmake/CEFPlugin.cmake
+++ b/indra/cmake/CEFPlugin.cmake
@@ -88,12 +88,10 @@ else (CMAKE_OSX_ARCHITECTURES MATCHES arm64)
use_prebuilt_binary(dullahan)
endif (CMAKE_OSX_ARCHITECTURES MATCHES arm64)
-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)
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 746d242560..a77e0fca06 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
diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake
index 06d5927174..f8048ab324 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(
@@ -36,7 +37,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA
INPUT ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.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
diff --git a/indra/cmake/Discord.cmake b/indra/cmake/Discord.cmake
new file mode 100644
index 0000000000..52c0765ae7
--- /dev/null
+++ b/indra/cmake/Discord.cmake
@@ -0,0 +1,45 @@
+include(Prebuilt)
+
+add_library(ll::discord INTERFACE IMPORTED)
+target_compile_definitions(ll::discord INTERFACE LL_DISCORD=1)
+
+if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/discord_installed OR NOT ${discord_installed} EQUAL 0)
+ file(ARCHIVE_EXTRACT
+ INPUT $ENV{HOME}/Downloads/DiscordSocialSdk-1.4.9649.zip
+ DESTINATION ${CMAKE_BINARY_DIR}
+ )
+ 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
+ )
+ 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_installed "0")
+endif ()
+
+target_include_directories(ll::discord SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include)
+target_link_libraries(ll::discord INTERFACE discord_partner_sdk)
diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake
index fb4734fe7b..8cac756ead 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 fmodstudioapi20229mac-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/fmodstudioapi20229linux.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}/fmodstudioapi20229linux/api/core/inc/fmod.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/inc/fmod.hpp
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/inc/fmod_codec.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/inc/fmod_common.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/inc/fmod_dsp.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/inc/fmod_dsp_effects.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/inc/fmod_errors.h
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/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}/fmodstudioapi20229linux/api/core/lib/arm64/libfmod.so
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/lib/arm64/libfmod.so.13
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/lib/arm64/libfmod.so.13.29
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}/fmodstudioapi20229linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so.13
+ ${CMAKE_BINARY_DIR}/fmodstudioapi20229linux/api/core/lib/${CMAKE_SYSTEM_PROCESSOR}/libfmod.so.13.29
DESTINATION ${ARCH_PREBUILT_DIRS_RELEASE}
FOLLOW_SYMLINK_CHAIN
)
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/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake
index 3429a744f5..b092f064c2 100644
--- a/indra/cmake/LLPrimitive.cmake
+++ b/indra/cmake/LLPrimitive.cmake
@@ -18,44 +18,53 @@ if( USE_CONAN )
"${CONAN_INCLUDE_DIRS_COLLADADOM}/collada-dom/1.4/" )
endif()
-if( LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
+if (LINUX AND NOT (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) 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 )
+else ()
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-r8.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
)
- endif()
+ endif ()
file(ARCHIVE_EXTRACT
INPUT ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz
DESTINATION ${CMAKE_BINARY_DIR}
)
- if ( WINDOWS )
+ if (WINDOWS)
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/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-r8/src
)
- 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/SHARED/STATIC/" src/1.4/CMakeLists.txt
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8
)
endif ()
- if( DARWIN )
+ 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)
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_88)
+ else ()
+ set(BOOST_LIBRARY_SUFFIX -vc143-mt-x64-1_88)
+ endif ()
+ endif ()
file(MAKE_DIRECTORY ${LIBS_PREBUILT_DIR}/include/collada/1.4)
try_compile(COLLADADOM_RESULT
PROJECT colladadom
@@ -78,7 +87,27 @@ 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-r8/Project.sln -p:Configuration=${CMAKE_BUILD_TYPE}
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8
+ OUTPUT_VARIABLE colladadom_installed
+ )
+ file(REMOVE_RECURSE ${LIBS_PREBUILT_DIR}/include/collada)
+ file(
+ COPY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8/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-r8/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
@@ -88,17 +117,15 @@ elseif ( NOT WINDOWS )
${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 ()
+endif ()
-#use_system_binary( colladadom )
+if (FALSE)
+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)
@@ -113,7 +140,7 @@ if (WINDOWS)
else()
target_link_libraries( ll::libxml INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libxml2.a)
endif()
-endif( FALSE )
+endif (FALSE)
target_include_directories( ll::colladadom SYSTEM INTERFACE
${LIBS_PREBUILT_DIR}/include/collada
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..45ef25a63c 100644
--- a/indra/cmake/LibVLCPlugin.cmake
+++ b/indra/cmake/LibVLCPlugin.cmake
@@ -27,6 +27,12 @@ if (DARWIN)
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 a1a24de04b..fab649fed8 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -72,7 +72,6 @@ elseif (DARWIN)
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)
@@ -81,7 +80,6 @@ elseif (DARWIN)
${IOKIT_LIBRARY}
${COREFOUNDATION_LIBRARY}
${CARBON_LIBRARY}
- ${AGL_LIBRARY}
${APPKIT_LIBRARY}
${COREAUDIO_LIBRARY}
)
diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake
index d6e5e53ac9..9f33c6e220 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,8 +44,37 @@ 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)
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/OpenJPEG.cmake b/indra/cmake/OpenJPEG.cmake
index 5729f6a10e..94dcde0d5c 100644
--- a/indra/cmake/OpenJPEG.cmake
+++ b/indra/cmake/OpenJPEG.cmake
@@ -19,7 +19,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 debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR (${LINUX_DISTRO} MATCHES ubuntu))
try_compile(OPENJPEG_RESULT
PROJECT OPENJPEG
SOURCE_DIR ${CMAKE_BINARY_DIR}/openjpeg-2.5.3
@@ -61,7 +61,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 debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR (${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..afa2ba377d 100644
--- a/indra/cmake/OpenSSL.cmake
+++ b/indra/cmake/OpenSSL.cmake
@@ -5,8 +5,9 @@ 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)
if (DARWIN)
execute_process(
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index c287f135fe..0720bbf53b 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
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..a7f43be13e 100644
--- a/indra/cmake/WebRTC.cmake
+++ b/indra/cmake/WebRTC.cmake
@@ -6,9 +6,9 @@ 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 (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86-64 OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64 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)))
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)
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/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp
index e368ace35e..f72f47723f 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();
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 0b9b148463..0046c5da7e 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,8 +119,6 @@ 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..e8c51c4c8e 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -297,6 +297,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/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 9672a3262b..c09cf7abd2 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -29,7 +29,6 @@
#include "llassettype.h"
#include "lldictionary.h"
#include "llmemory.h"
-#include "llsd.h"
#include "llsingleton.h"
///----------------------------------------------------------------------------
@@ -247,19 +246,3 @@ 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 17177d81c3..547c3f4329 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -165,8 +165,6 @@ 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/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.h b/indra/llcommon/llfasttimer.h
index a69a03e419..8499655bfa 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -99,7 +99,11 @@ public:
#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 +111,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
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index e9f07f6fdf..268109e8b7 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -169,7 +169,11 @@
#define LL_TO_STRING_HELPER(x) #x
#define LL_TO_STRING(x) LL_TO_STRING_HELPER(x)
+#if _M_ARM64
+#define LL_TO_WSTRING_HELPER(x) L## #x
+#else
#define LL_TO_WSTRING_HELPER(x) L#x
+#endif
#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
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 56fd0fa7b3..c0b1a5c9e3 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,8 +669,7 @@ 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);
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 497c0ad3eb..c31030c5ea 100644
--- a/indra/llcommon/llsdutil.h
+++ b/indra/llcommon/llsdutil.h
@@ -554,45 +554,6 @@ 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
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/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/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/threadpool.h b/indra/llcommon/threadpool.h
index ac4f415f3e..0eb1891754 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.
*/
- void close();
+ virtual 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, false), auto_shutdown)
+ ThreadPoolBase(name, threads, new queue_t(name, capacity), auto_shutdown)
{}
~ThreadPoolUsing() override {}
diff --git a/indra/llcommon/workqueue.cpp b/indra/llcommon/workqueue.cpp
index 0eb20323ad..c8ece616b2 100644
--- a/indra/llcommon/workqueue.cpp
+++ b/indra/llcommon/workqueue.cpp
@@ -21,7 +21,6 @@
#include "llcoros.h"
#include LLCOROS_MUTEX_HEADER
#include "llerror.h"
-#include "llevents.h"
#include "llexception.h"
#include "stringize.h"
@@ -31,38 +30,11 @@ using Lock = LLCoros::LockType;
/*****************************************************************************
* WorkQueueBase
*****************************************************************************/
-LL::WorkQueueBase::WorkQueueBase(const std::string& name, bool auto_shutdown)
- : super(makeName(name))
+LL::WorkQueueBase::WorkQueueBase(const std::string& name):
+ super(makeName(name))
{
- 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);
- }
+ // TODO: register for "LLApp" events so we can implicitly close() on
+ // viewer shutdown.
}
void LL::WorkQueueBase::runUntilClose()
@@ -240,8 +212,8 @@ void LL::WorkQueueBase::checkCoroutine(const std::string& method)
/*****************************************************************************
* WorkQueue
*****************************************************************************/
-LL::WorkQueue::WorkQueue(const std::string& name, size_t capacity, bool auto_shutdown):
- super(name, auto_shutdown),
+LL::WorkQueue::WorkQueue(const std::string& name, size_t capacity):
+ super(name),
mQueue(capacity)
{
}
@@ -289,8 +261,8 @@ bool LL::WorkQueue::tryPop_(Work& work)
/*****************************************************************************
* WorkSchedule
*****************************************************************************/
-LL::WorkSchedule::WorkSchedule(const std::string& name, size_t capacity, bool auto_shutdown):
- super(name, auto_shutdown),
+LL::WorkSchedule::WorkSchedule(const std::string& name, size_t capacity):
+ super(name),
mQueue(capacity)
{
}
diff --git a/indra/llcommon/workqueue.h b/indra/llcommon/workqueue.h
index 735ad38a26..9d7bbfbf7a 100644
--- a/indra/llcommon/workqueue.h
+++ b/indra/llcommon/workqueue.h
@@ -51,9 +51,7 @@ 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, bool auto_shutdown);
-
- virtual ~WorkQueueBase();
+ WorkQueueBase(const std::string& name);
/**
* Since the point of WorkQueue is to pass work to some other worker
@@ -199,9 +197,6 @@ 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;
};
/*****************************************************************************
@@ -217,7 +212,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, bool auto_shutdown = true);
+ WorkQueue(const std::string& name = std::string(), size_t capacity=1024);
/**
* Since the point of WorkQueue is to pass work to some other worker
@@ -287,7 +282,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, bool auto_shutdown = true);
+ WorkSchedule(const std::string& name = std::string(), size_t capacity=1024);
/**
* 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..56c0a97635 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);
@@ -603,7 +605,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/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/llfilesystem/lldir.cpp b/indra/llfilesystem/lldir.cpp
index e8e5d6538b..918bb0d117 100644
--- a/indra/llfilesystem/lldir.cpp
+++ b/indra/llfilesystem/lldir.cpp
@@ -110,9 +110,10 @@ std::vector<std::string> LLDir::getFilesInDir(const std::string &dirname)
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
}
}
}
diff --git a/indra/llfilesystem/lldiriterator.cpp b/indra/llfilesystem/lldiriterator.cpp
index 61f768c512..cd99c79357 100644
--- a/indra/llfilesystem/lldiriterator.cpp
+++ b/indra/llfilesystem/lldiriterator.cpp
@@ -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..d9b223fb49 100644
--- a/indra/llfilesystem/lldiskcache.cpp
+++ b/indra/llfilesystem/lldiskcache.cpp
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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/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/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/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index 04b527d783..717b0a6e86 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -32,8 +32,6 @@
#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()
{
@@ -132,73 +130,96 @@ static void opj_error(const char* msg, void* user_data)
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,14 +229,54 @@ 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:
@@ -430,15 +491,16 @@ public:
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 +555,22 @@ 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;
+ 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]));
- }
-
- //ensure that we have at least a minimal size
- max_cs_size = llmax(max_cs_size, (U32)FIRST_PACKET_SIZE);
+ // fills parameters.tcp_rates and updates parameters.tcp_numlayers
+ set_tcp_rates(&parameters, nb_layers, LAST_TCP_RATE);
- parameters.max_cs_size = max_cs_size;
}
if (!opj_setup_encoder(encoder, &parameters, image))
@@ -551,7 +582,20 @@ public:
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 width_tiles = (rawImageIn.getWidth() >> 6);
+ U32 height_tiles = (rawImageIn.getHeight() >> 6);
+
+ // 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;
+ }
+
+ 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 +610,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 +651,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 +667,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 +679,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;
@@ -857,12 +899,11 @@ bool LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
{
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 670405e9b5..7e1be17ecc 100644
--- a/indra/llinventory/llfoldertype.cpp
+++ b/indra/llinventory/llfoldertype.cpp
@@ -29,7 +29,6 @@
#include "llfoldertype.h"
#include "lldictionary.h"
#include "llmemory.h"
-#include "llsd.h"
#include "llsingleton.h"
///----------------------------------------------------------------------------
@@ -221,21 +220,3 @@ 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 dd12693f66..46a1b92a96 100644
--- a/indra/llinventory/llfoldertype.h
+++ b/indra/llinventory/llfoldertype.h
@@ -115,8 +115,6 @@ 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 fe60800700..075abf9536 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -46,7 +46,6 @@ 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");
@@ -60,7 +59,6 @@ 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");
@@ -84,16 +82,14 @@ LLInventoryObject::LLInventoryObject(const LLUUID& uuid,
mParentUUID(parent_uuid),
mType(type),
mName(name),
- mCreationDate(0),
- mFavorite(false)
+ mCreationDate(0)
{
correctInventoryName(mName);
}
LLInventoryObject::LLInventoryObject()
: mType(LLAssetType::AT_NONE),
- mCreationDate(0),
- mFavorite(false)
+ mCreationDate(0)
{
}
@@ -108,7 +104,6 @@ void LLInventoryObject::copyObject(const LLInventoryObject* other)
mType = other->mType;
mName = other->mName;
mThumbnailUUID = other->mThumbnailUUID;
- mFavorite = other->mFavorite;
}
const LLUUID& LLInventoryObject::getUUID() const
@@ -126,11 +121,6 @@ const LLUUID& LLInventoryObject::getThumbnailUUID() const
return mThumbnailUUID;
}
-bool LLInventoryObject::getIsFavorite() const
-{
- return mFavorite;
-}
-
const std::string& LLInventoryObject::getName() const
{
return mName;
@@ -185,11 +175,6 @@ 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;
@@ -262,23 +247,6 @@ 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))
{
@@ -767,23 +735,6 @@ 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))
{
@@ -928,7 +879,7 @@ bool LLInventoryItem::exportLegacyStream(std::ostream& output_stream, bool inclu
LLSD LLInventoryItem::asLLSD() const
{
- LLSD sd;
+ LLSD sd = LLSD();
asLLSD(sd);
return sd;
}
@@ -937,18 +888,13 @@ void LLInventoryItem::asLLSD( LLSD& sd ) const
{
sd[INV_ITEM_ID_LABEL] = mUUID;
sd[INV_PARENT_ID_LABEL] = mParentUUID;
- ll_fill_sd_from_permissions(sd[INV_PERMISSIONS_LABEL], mPermissions);
+ sd[INV_PERMISSIONS_LABEL] = ll_create_sd_from_permissions(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()))
@@ -963,22 +909,19 @@ 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] = std::string(LLAssetType::lookup(mType));
+ sd[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(mType);
+ sd[INV_INVENTORY_TYPE_LABEL] = mInventoryType;
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);
- mSaleInfo.asLLSD(sd[INV_SALE_INFO_LABEL]);
+ sd[INV_SALE_INFO_LABEL] = mSaleInfo.asLLSD();
sd[INV_NAME_LABEL] = mName;
sd[INV_DESC_LABEL] = mDescription;
- sd[INV_CREATION_DATE_LABEL] = (LLSD::Integer)mCreationDate;
+ sd[INV_CREATION_DATE_LABEL] = (S32) mCreationDate;
}
bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
@@ -994,7 +937,6 @@ 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;
// iterate as map to avoid making unnecessary temp copies of everything
LLSD::map_const_iterator i, end;
@@ -1040,17 +982,6 @@ 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);
@@ -1246,11 +1177,6 @@ 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;
}
@@ -1262,17 +1188,11 @@ 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;
}
@@ -1320,17 +1240,6 @@ 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))
{
@@ -1453,23 +1362,6 @@ 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
{
@@ -1504,11 +1396,12 @@ bool LLInventoryCategory::exportLegacyStream(std::ostream& output_stream, bool)
return true;
}
-void LLInventoryCategory::exportLLSD(LLSD& cat_data) const
+LLSD LLInventoryCategory::exportLLSD() const
{
+ LLSD cat_data;
cat_data[INV_FOLDER_ID_LABEL] = mUUID;
cat_data[INV_PARENT_ID_LABEL] = mParentUUID;
- cat_data[INV_ASSET_TYPE_LABEL] = std::string(LLAssetType::lookup(mType));
+ cat_data[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(mType);
cat_data[INV_PREFERRED_TYPE_LABEL] = LLFolderType::lookup(mPreferredType);
cat_data[INV_NAME_LABEL] = mName;
@@ -1516,10 +1409,8 @@ void LLInventoryCategory::exportLLSD(LLSD& cat_data) 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::importLLSD(const LLSD& cat_data)
@@ -1550,16 +1441,6 @@ bool LLInventoryCategory::importLLSD(const LLSD& cat_data)
}
setThumbnailUUID(thumbnail_uuid);
}
- if (cat_data.has(INV_FAVORITE_LABEL))
- {
- bool favorite = false;
- const LLSD& favorite_data = cat_data[INV_FAVORITE_LABEL];
- if (favorite_data.has(INV_TOGGLED_LABEL))
- {
- favorite = favorite_data[INV_TOGGLED_LABEL].asBoolean();
- }
- setFavorite(favorite);
- }
if (cat_data.has(INV_NAME_LABEL))
{
mName = cat_data[INV_NAME_LABEL].asString();
@@ -1570,7 +1451,7 @@ bool LLInventoryCategory::importLLSD(const LLSD& cat_data)
return true;
}
///----------------------------------------------------------------------------
-/// Local function definitions for testing purposes
+/// Local function definitions
///----------------------------------------------------------------------------
LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item)
diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h
index 17670d2ea1..e63f2deba7 100644
--- a/indra/llinventory/llinventory.h
+++ b/indra/llinventory/llinventory.h
@@ -71,7 +71,6 @@ 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
@@ -87,7 +86,6 @@ 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
@@ -113,7 +111,6 @@ 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
@@ -273,7 +270,7 @@ public:
virtual bool importLegacyStream(std::istream& input_stream);
virtual bool exportLegacyStream(std::ostream& output_stream, bool include_asset_key = true) const;
- virtual void exportLLSD(LLSD& sd) const;
+ LLSD exportLLSD() const;
bool importLLSD(const LLSD& cat_data);
//--------------------------------------------------------------------
// Member Variables
@@ -288,7 +285,6 @@ 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 759638b956..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);
diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp
index d800ca02c9..c8963881df 100644
--- a/indra/llinventory/llpermissions.cpp
+++ b/indra/llinventory/llpermissions.cpp
@@ -1012,21 +1012,17 @@ 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] = (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();
+ 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;
}
LLPermissions ll_permissions_from_sd(const LLSD& sd_perm)
diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h
index f3e10af25c..a68abcfa34 100644
--- a/indra/llinventory/llpermissions.h
+++ b/indra/llinventory/llpermissions.h
@@ -435,7 +435,6 @@ 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 b4d64bb4fb..35bbc1dbb1 100644
--- a/indra/llinventory/llsaleinfo.cpp
+++ b/indra/llinventory/llsaleinfo.cpp
@@ -90,20 +90,15 @@ 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"] = std::string(type);
+ sd["sale_type"] = 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 7186e8ab49..44eb841641 100644
--- a/indra/llinventory/llsaleinfo.h
+++ b/indra/llinventory/llsaleinfo.h
@@ -86,7 +86,6 @@ 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/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index ad37b08df7..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();
diff --git a/indra/llinventory/tests/inventorymisc_test.cpp b/indra/llinventory/tests/inventorymisc_test.cpp
index e41500b4c5..9779cb8fbc 100644
--- a/indra/llinventory/tests/inventorymisc_test.cpp
+++ b/indra/llinventory/tests/inventorymisc_test.cpp
@@ -39,34 +39,6 @@
#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;
@@ -103,7 +75,6 @@ LLPointer<LLInventoryItem> create_random_inventory_item()
sale_info,
flags,
creation);
- set_random_inventory_metadata(item);
return item;
}
@@ -119,7 +90,6 @@ LLPointer<LLInventoryCategory> create_random_inventory_cat()
parent_id,
LLFolderType::FT_NONE,
std::string("Sample category"));
- set_random_inventory_metadata(cat);
return cat;
}
@@ -320,7 +290,6 @@ 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);
@@ -360,9 +329,7 @@ namespace tut
}
LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
- LLSD sd;
- src1->asLLSD(sd);
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(sd) << std::endl;
+ fileXML << LLSDOStreamer<LLSDNotationFormatter>(src1->asLLSD()) << std::endl;
fileXML.close();
@@ -397,13 +364,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;
@@ -423,8 +390,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<>
@@ -454,8 +421,6 @@ 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*******//
@@ -493,9 +458,7 @@ namespace tut
}
LLPointer<LLInventoryCategory> src1 = create_random_inventory_cat();
- LLSD sd;
- src1->exportLLSD(sd);
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(sd) << std::endl;
+ fileXML << LLSDOStreamer<LLSDNotationFormatter>(src1->exportLLSD()) << std::endl;
fileXML.close();
llifstream file(filename.c_str());
@@ -525,8 +488,6 @@ 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("6.thumbnails::getThumbnailUUID() failed", src1->getThumbnailUUID(), src2->getThumbnailUUID());
- ensure_equals("7.favorites::getIsFavorite() failed", src1->getIsFavorite(), src2->getIsFavorite());
}
template<> template<>
@@ -546,7 +507,6 @@ 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/llmath/llcoordframe.cpp b/indra/llmath/llcoordframe.cpp
index b42541c7c0..15c9f6ff3f 100644
--- a/indra/llmath/llcoordframe.cpp
+++ b/indra/llmath/llcoordframe.cpp
@@ -328,30 +328,28 @@ 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)
{
- rotate2(mYAxis, mZAxis, angle);
+ LLQuaternion q(angle, mXAxis);
+ LLMatrix3 rotation_matrix(q);
+ rotate(rotation_matrix);
+ CHECK_FINITE_OBJ();
}
void LLCoordFrame::pitch(F32 angle)
{
- rotate2(mZAxis, mXAxis, angle);
+ LLQuaternion q(angle, mYAxis);
+ LLMatrix3 rotation_matrix(q);
+ rotate(rotation_matrix);
+ CHECK_FINITE_OBJ();
}
void LLCoordFrame::yaw(F32 angle)
{
- rotate2(mXAxis, mYAxis, angle);
+ LLQuaternion q(angle, mZAxis);
+ LLMatrix3 rotation_matrix(q);
+ rotate(rotation_matrix);
+ CHECK_FINITE_OBJ();
}
// get*() routines
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 891f0ffc4c..7f51de7820 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -65,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.43429448190325182765112891891661f;
+constexpr F32 OO_LN10 = 0.43429448190325182765112891891661;
constexpr F32 F_LN2 = 0.69314718056f;
constexpr F32 OO_LN2 = 1.4426950408889634073599246810019f;
diff --git a/indra/llmath/llquaternion.cpp b/indra/llmath/llquaternion.cpp
index 3a6748bdb3..1ab3a73d79 100644
--- a/indra/llmath/llquaternion.cpp
+++ b/indra/llmath/llquaternion.cpp
@@ -57,7 +57,7 @@ LLQuaternion::LLQuaternion(const LLMatrix3 &mat)
LLQuaternion::LLQuaternion(F32 angle, const LLVector4 &vec)
{
- F32 mag = vec.length();
+ F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
if (mag > FP_MAG_THRESHOLD)
{
angle *= 0.5;
@@ -76,7 +76,7 @@ LLQuaternion::LLQuaternion(F32 angle, const LLVector4 &vec)
LLQuaternion::LLQuaternion(F32 angle, const LLVector3 &vec)
{
- F32 mag = vec.length();
+ F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
if (mag > FP_MAG_THRESHOLD)
{
angle *= 0.5;
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/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.inl b/indra/llmath/llvector4a.inl
index 36dbec078c..17e7de6eeb 100644
--- a/indra/llmath/llvector4a.inl
+++ b/indra/llmath/llvector4a.inl
@@ -335,8 +335,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 +364,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 +393,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))
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/v2math.cpp b/indra/llmath/v2math.cpp
index 175f08df88..59e6d947ca 100644
--- a/indra/llmath/v2math.cpp
+++ b/indra/llmath/v2math.cpp
@@ -66,13 +66,6 @@ F32 angle_between(const LLVector2& a, const LLVector2& b)
return angle;
}
-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;
diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h
index 6b9d37535b..18ad02a411 100644
--- a/indra/llmath/v2math.h
+++ b/indra/llmath/v2math.h
@@ -107,14 +107,13 @@ 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
};
// Non-member functions
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
@@ -125,22 +124,26 @@ LLVector2 lerp(const LLVector2& a, const LLVector2& b, F32 u); // Returns a vect
inline LLVector2::LLVector2()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
}
inline LLVector2::LLVector2(F32 x, F32 y)
{
- set(x, y);
+ mV[VX] = x;
+ mV[VY] = y;
}
inline LLVector2::LLVector2(const F32 *vec)
{
- set(vec);
+ mV[VX] = vec[VX];
+ mV[VY] = vec[VY];
}
inline LLVector2::LLVector2(const LLVector3 &vec)
{
- set(vec.mV);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
}
inline LLVector2::LLVector2(const LLSD &sd)
@@ -152,24 +155,28 @@ inline LLVector2::LLVector2(const LLSD &sd)
inline void LLVector2::clear()
{
- mV[VX] = mV[VY] = 0.f;
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
}
inline void LLVector2::setZero()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
}
// deprecated
inline void LLVector2::clearVec()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
}
// deprecated
inline void LLVector2::zeroVec()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
}
inline void LLVector2::set(F32 x, F32 y)
@@ -180,31 +187,36 @@ inline void LLVector2::set(F32 x, F32 y)
inline void LLVector2::set(const LLVector2 &vec)
{
- set(vec.mV);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
}
inline void LLVector2::set(const F32 *vec)
{
- set(vec[VX], vec[VY]);
+ mV[VX] = vec[VX];
+ mV[VY] = vec[VY];
}
// deprecated
inline void LLVector2::setVec(F32 x, F32 y)
{
- set(x, y);
+ mV[VX] = x;
+ mV[VY] = y;
}
// deprecated
inline void LLVector2::setVec(const LLVector2 &vec)
{
- set(vec);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
}
// deprecated
inline void LLVector2::setVec(const F32 *vec)
{
- set(vec);
+ mV[VX] = vec[VX];
+ mV[VY] = vec[VY];
}
@@ -212,7 +224,7 @@ inline void LLVector2::setVec(const F32 *vec)
inline F32 LLVector2::length() const
{
- return sqrt(lengthSquared());
+ return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY]);
}
inline F32 LLVector2::lengthSquared() const
@@ -222,42 +234,61 @@ inline F32 LLVector2::lengthSquared() const
inline F32 LLVector2::normalize()
{
- F32 mag = length();
+ F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY]);
+ F32 oomag;
if (mag > FP_MAG_THRESHOLD)
{
- *this /= mag;
+ oomag = 1.f/mag;
+ mV[VX] *= oomag;
+ mV[VY] *= oomag;
}
else
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
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() const
{
- return length();
+ return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY]);
}
// deprecated
inline F32 LLVector2::magVecSquared() const
{
- return lengthSquared();
+ return mV[VX]*mV[VX] + mV[VY]*mV[VY];
}
// deprecated
inline F32 LLVector2::normVec()
{
- return normalize();
+ F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY]);
+ F32 oomag;
+
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ oomag = 1.f/mag;
+ mV[VX] *= oomag;
+ mV[VY] *= oomag;
+ }
+ else
+ {
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mag = 0;
+ }
+ return (mag);
}
inline const LLVector2& LLVector2::scaleVec(const LLVector2& vec)
@@ -270,7 +301,11 @@ inline const LLVector2& LLVector2::scaleVec(const LLVector2& vec)
inline bool LLVector2::isNull() const
{
- return F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY];
+ if (F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY])
+ {
+ return true;
+ }
+ return false;
}
@@ -370,7 +405,10 @@ inline const LLVector2& operator*=(LLVector2& a, F32 k)
inline const LLVector2& operator/=(LLVector2& a, F32 k)
{
- return a *= 1.f / k;
+ F32 t = 1.f / k;
+ a.mV[VX] *= t;
+ a.mV[VY] *= t;
+ return a;
}
inline LLVector2 operator-(const LLVector2& a)
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index 098ca5218c..551c7df6c9 100644
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -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]; }
@@ -183,17 +183,23 @@ bool box_valid_and_non_zero(const LLVector3* box);
inline LLVector3::LLVector3()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
}
inline LLVector3::LLVector3(const F32 x, const F32 y, const F32 z)
{
- set(x, y, z);
+ mV[VX] = x;
+ mV[VY] = y;
+ mV[VZ] = z;
}
inline LLVector3::LLVector3(const F32 *vec)
{
- set(vec);
+ mV[VX] = vec[VX];
+ mV[VY] = vec[VY];
+ mV[VZ] = vec[VZ];
}
inline LLVector3::LLVector3(const glm::vec3& vec)
@@ -224,7 +230,7 @@ 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]));
}
@@ -232,22 +238,30 @@ inline bool LLVector3::isFinite() const
inline void LLVector3::clear()
{
- set(0.f, 0.f, 0.f);
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
}
inline void LLVector3::setZero()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
}
inline void LLVector3::clearVec()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
}
inline void LLVector3::zeroVec()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
}
inline void LLVector3::set(F32 x, F32 y, F32 z)
@@ -259,12 +273,16 @@ inline void LLVector3::set(F32 x, F32 y, F32 z)
inline void LLVector3::set(const LLVector3& vec)
{
- set(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
}
inline void LLVector3::set(const F32* vec)
{
- set(vec[VX], vec[VY], vec[VZ]);
+ mV[VX] = vec[VX];
+ mV[VY] = vec[VY];
+ mV[VZ] = vec[VZ];
}
inline void LLVector3::set(const glm::vec4& vec)
@@ -284,66 +302,95 @@ inline void LLVector3::set(const glm::vec3& vec)
// deprecated
inline void LLVector3::setVec(F32 x, F32 y, F32 z)
{
- set(x, y, z);
+ mV[VX] = x;
+ mV[VY] = y;
+ mV[VZ] = z;
}
// deprecated
inline void LLVector3::setVec(const LLVector3& vec)
{
- set(vec);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
}
// deprecated
inline void LLVector3::setVec(const F32* vec)
{
- set(vec);
+ mV[VX] = vec[0];
+ mV[VY] = vec[1];
+ mV[VZ] = vec[2];
}
inline F32 LLVector3::normalize()
{
F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 oomag;
if (mag > FP_MAG_THRESHOLD)
{
- *this /= mag;
+ oomag = 1.f/mag;
+ mV[VX] *= oomag;
+ mV[VY] *= oomag;
+ mV[VZ] *= oomag;
}
else
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
mag = 0;
}
- return mag;
+ return (mag);
}
// deprecated
inline F32 LLVector3::normVec()
{
- return normalize();
+ F32 mag = 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[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
+ mag = 0;
+ }
+ return (mag);
}
// LLVector3 Magnitude and Normalization Functions
-inline F32 LLVector3::length() const
+inline F32 LLVector3::length() const
{
- return sqrt(lengthSquared());
+ return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
-inline F32 LLVector3::lengthSquared() const
+inline F32 LLVector3::lengthSquared() const
{
return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
}
-inline F32 LLVector3::magVec() const
+inline F32 LLVector3::magVec() const
{
- return length();
+ return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
-inline F32 LLVector3::magVecSquared() const
+inline F32 LLVector3::magVecSquared() const
{
- return lengthSquared();
+ return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
}
-inline bool LLVector3::inRange(F32 min, F32 max) const
+inline bool LLVector3::inRange( F32 min, F32 max ) const
{
return mV[VX] >= min && mV[VX] <= max &&
mV[VY] >= min && mV[VY] <= max &&
@@ -369,7 +416,7 @@ inline F32 operator*(const LLVector3& a, const LLVector3& b)
inline LLVector3 operator%(const LLVector3& a, const LLVector3& b)
{
- 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]);
+ 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)
@@ -429,7 +476,7 @@ inline const LLVector3& operator-=(LLVector3& a, const LLVector3& b)
inline const LLVector3& operator%=(LLVector3& a, const LLVector3& b)
{
- 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]);
+ 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;
}
@@ -452,7 +499,9 @@ inline const LLVector3& operator*=(LLVector3& a, const LLVector3& b)
inline const LLVector3& operator/=(LLVector3& a, F32 k)
{
- a *= 1.f / k;
+ a.mV[VX] /= k;
+ a.mV[VY] /= k;
+ a.mV[VZ] /= k;
return a;
}
@@ -477,7 +526,7 @@ inline F32 dist_vec(const LLVector3& a, const LLVector3& b)
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);
+ return sqrt( x*x + y*y + z*z );
}
inline F32 dist_vec_squared(const LLVector3& a, const LLVector3& b)
@@ -502,7 +551,10 @@ inline LLVector3 projected_vec(const LLVector3& a, const LLVector3& b)
{
return ((a * b) / bb) * b;
}
- return b.zero;
+ else
+ {
+ return b.zero;
+ }
}
inline LLVector3 inverse_projected_vec(const LLVector3& a, const LLVector3& b)
@@ -539,7 +591,11 @@ inline LLVector3 lerp(const LLVector3& a, const LLVector3& b, F32 u)
inline bool LLVector3::isNull() const
{
- return F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
+ if ( F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ] )
+ {
+ return true;
+ }
+ return false;
}
inline void update_min_max(LLVector3& min, LLVector3& max, const LLVector3& pos)
@@ -580,7 +636,7 @@ 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(c.length(), ab); // return the angle
+ return atan2f(sqrtf(c * c), ab); // return the angle
}
inline bool are_parallel(const LLVector3& a, const LLVector3& b, F32 epsilon)
@@ -590,7 +646,7 @@ inline bool are_parallel(const LLVector3& a, const LLVector3& b, F32 epsilon)
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/v4math.h b/indra/llmath/v4math.h
index 1cbd0d9a78..37492e7f98 100644
--- a/indra/llmath/v4math.h
+++ b/indra/llmath/v4math.h
@@ -107,9 +107,9 @@ public:
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
+ 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
@@ -118,8 +118,8 @@ public:
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& 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
@@ -159,22 +159,34 @@ LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u); // Returns a vect
inline LLVector4::LLVector4(void)
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
+ mV[VW] = 1.f;
}
inline LLVector4::LLVector4(F32 x, F32 y, F32 z)
{
- set(x, y, z, 1.f);
+ mV[VX] = x;
+ mV[VY] = y;
+ mV[VZ] = z;
+ mV[VW] = 1.f;
}
inline LLVector4::LLVector4(F32 x, F32 y, F32 z, F32 w)
{
- set(x, y, z, w);
+ mV[VX] = x;
+ mV[VY] = y;
+ mV[VZ] = z;
+ mV[VW] = w;
}
inline LLVector4::LLVector4(const F32 *vec)
{
- set(vec);
+ mV[VX] = vec[VX];
+ mV[VY] = vec[VY];
+ mV[VZ] = vec[VZ];
+ mV[VW] = vec[VW];
}
inline LLVector4::LLVector4(const F64 *vec)
@@ -203,12 +215,18 @@ inline LLVector4::LLVector4(const LLVector2 &vec, F32 z, F32 w)
inline LLVector4::LLVector4(const LLVector3 &vec)
{
- set(vec, 1.f);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
+ mV[VW] = 1.f;
}
inline LLVector4::LLVector4(const LLVector3 &vec, F32 w)
{
- set(vec, w);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
+ mV[VW] = w;
}
inline LLVector4::LLVector4(const LLSD &sd)
@@ -234,31 +252,43 @@ 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()
{
- set(0.f, 0.f, 0.f, 1.f);
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
+ mV[VW] = 1.f;
}
// deprecated
inline void LLVector4::clearVec()
{
- clear();
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
+ mV[VW] = 1.f;
}
// deprecated
inline void LLVector4::zeroVec()
{
- set(0.f, 0.f, 0.f, 0.f);
+ mV[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
+ mV[VW] = 0.f;
}
inline void LLVector4::set(F32 x, F32 y, F32 z)
{
- set(x, y, z, 1.f);
+ mV[VX] = x;
+ mV[VY] = y;
+ mV[VZ] = z;
+ mV[VW] = 1.f;
}
inline void LLVector4::set(F32 x, F32 y, F32 z, F32 w)
@@ -271,7 +301,10 @@ inline void LLVector4::set(F32 x, F32 y, F32 z, F32 w)
inline void LLVector4::set(const LLVector4& vec)
{
- set(vec.mV);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
+ mV[VW] = vec.mV[VW];
}
inline void LLVector4::set(const LLVector3& vec, F32 w)
@@ -289,6 +322,7 @@ inline void LLVector4::set(const F32* vec)
mV[VZ] = vec[VZ];
mV[VW] = vec[VW];
}
+
inline void LLVector4::set(const glm::vec4& vec)
{
mV[VX] = vec.x;
@@ -308,53 +342,68 @@ inline void LLVector4::set(const glm::vec3& vec, F32 w)
// deprecated
inline void LLVector4::setVec(F32 x, F32 y, F32 z)
{
- set(x, y, z);
+ mV[VX] = x;
+ mV[VY] = y;
+ mV[VZ] = z;
+ mV[VW] = 1.f;
}
// deprecated
inline void LLVector4::setVec(F32 x, F32 y, F32 z, F32 w)
{
- set(x, y, z, w);
+ mV[VX] = x;
+ mV[VY] = y;
+ mV[VZ] = z;
+ mV[VW] = w;
}
// deprecated
inline void LLVector4::setVec(const LLVector4& vec)
{
- set(vec);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
+ mV[VW] = vec.mV[VW];
}
// deprecated
inline void LLVector4::setVec(const LLVector3& vec, F32 w)
{
- set(vec, w);
+ mV[VX] = vec.mV[VX];
+ mV[VY] = vec.mV[VY];
+ mV[VZ] = vec.mV[VZ];
+ mV[VW] = w;
}
// deprecated
inline void LLVector4::setVec(const F32* vec)
{
- set(vec);
+ mV[VX] = vec[VX];
+ mV[VY] = vec[VY];
+ mV[VZ] = vec[VZ];
+ mV[VW] = vec[VW];
}
// LLVector4 Magnitude and Normalization Functions
-inline F32 LLVector4::length() const
+inline F32 LLVector4::length() const
{
- return sqrt(lengthSquared());
+ return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
-inline F32 LLVector4::lengthSquared() const
+inline F32 LLVector4::lengthSquared() const
{
return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
}
-inline F32 LLVector4::magVec() const
+inline F32 LLVector4::magVec() const
{
- return length();
+ return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
-inline F32 LLVector4::magVecSquared() const
+inline F32 LLVector4::magVecSquared() const
{
- return lengthSquared();
+ return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
}
// LLVector4 Operators
@@ -373,7 +422,7 @@ inline LLVector4 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)
@@ -446,7 +495,11 @@ inline const LLVector4& operator*=(LLVector4& a, F32 k)
inline const LLVector4& operator/=(LLVector4& a, F32 k)
{
- return a *= 1.f / k;
+ F32 t = 1.f / k;
+ a.mV[VX] *= t;
+ a.mV[VY] *= t;
+ a.mV[VZ] *= t;
+ return a;
}
inline LLVector4 operator-(const LLVector4& a)
@@ -464,16 +517,16 @@ 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)
@@ -485,13 +538,17 @@ 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()
+inline F32 LLVector4::normalize()
{
F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 oomag;
if (mag > FP_MAG_THRESHOLD)
{
- *this /= mag;
+ oomag = 1.f/mag;
+ mV[VX] *= oomag;
+ mV[VY] *= oomag;
+ mV[VZ] *= oomag;
}
else
{
@@ -500,13 +557,30 @@ inline F32 LLVector4::normalize()
mV[VZ] = 0.f;
mag = 0.f;
}
- return mag;
+ return (mag);
}
// deprecated
-inline F32 LLVector4::normVec()
+inline F32 LLVector4::normVec()
{
- return normalize();
+ F32 mag = 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[VX] = 0.f;
+ mV[VY] = 0.f;
+ mV[VZ] = 0.f;
+ mag = 0.f;
+ }
+ return (mag);
}
// Because apparently some parts of the viewer use this for color info.
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/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 17f403e8e8..5eb22332d4 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
@@ -936,10 +934,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);
}
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 19a0ce639a..63f1de8d6a 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");
diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt
index d29731894f..2100e6f556 100644
--- a/indra/llplugin/slplugin/CMakeLists.txt
+++ b/indra/llplugin/slplugin/CMakeLists.txt
@@ -66,14 +66,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/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index 00d821c470..b084098532 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -11,7 +11,7 @@ include(LLPrimitive)
include(GLM)
include(TinyGLTF)
-if(LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
+if (LINUX AND NOT (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) 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(
@@ -30,11 +30,10 @@ if(LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
${colladadom_SOURCE_DIR}/include/1.4
)
target_link_libraries( ll::colladadom INTERFACE collada14dom )
-endif(LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
+endif ()
set(llprimitive_SOURCE_FILES
lldaeloader.cpp
- llgltfloader.cpp
llgltfmaterial.cpp
llmaterialid.cpp
llmaterial.cpp
@@ -54,7 +53,6 @@ set(llprimitive_SOURCE_FILES
set(llprimitive_HEADER_FILES
CMakeLists.txt
lldaeloader.h
- llgltfloader.h
llgltfmaterial.h
llgltfmaterial_templates.h
legacy_object_types.h
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index 0759447902..a11f9b5ca2 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -880,9 +880,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 +896,9 @@ LLDAELoader::LLDAELoader(
jointTransformMap,
jointsFromNodes,
jointAliasMap,
- maxJointsPerMesh),
- mGeneratedModelLimit(modelLimit),
+ maxJointsPerMesh,
+ modelLimit,
+ debugMode),
mPreprocessDAE(preprocess)
{
}
@@ -1680,6 +1682,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 +2415,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/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index d8a1e4b6e1..4c0f3edb62 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -66,12 +66,7 @@ LLModel::~LLModel()
{
if (mDecompID >= 0)
{
- // can be null on shutdown
- LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
- if (decomp)
- {
- decomp->deleteDecomposition(mDecompID);
- }
+ LLConvexDecomposition::getInstance()->deleteDecomposition(mDecompID);
}
mPhysics.mMesh.clear();
}
@@ -339,6 +334,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;
@@ -667,7 +818,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)
{
@@ -946,10 +1097,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;
@@ -1011,7 +1162,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);
@@ -1566,11 +1721,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];
}
}
}
@@ -1583,15 +1748,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..a4ba6acd7e 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();
diff --git a/indra/llprimitive/llmodelloader.cpp b/indra/llprimitive/llmodelloader.cpp
index 84adec4da5..9521fec54f 100644
--- a/indra/llprimitive/llmodelloader.cpp
+++ b/indra/llprimitive/llmodelloader.cpp
@@ -113,7 +113,9 @@ LLModelLoader::LLModelLoader(
JointTransformMap& jointTransformMap,
JointNameSet& jointsFromNodes,
JointMap& legalJointNamesMap,
- U32 maxJointsPerMesh)
+ U32 maxJointsPerMesh,
+ U32 modelLimit,
+ U32 debugMode)
: mJointList( jointTransformMap )
, mJointsFromNode( jointsFromNodes )
, LLThread("Model Loader")
@@ -133,6 +135,8 @@ LLModelLoader::LLModelLoader(
, mNoOptimize(false)
, mCacheOnlyHitIfRigged(false)
, mMaxJointsPerMesh(maxJointsPerMesh)
+, mGeneratedModelLimit(modelLimit)
+, mDebugMode(debugMode)
, mJointMap(legalJointNamesMap)
{
assert_main_thread();
@@ -149,7 +153,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"] = "Unknown exception";
+ 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 +242,9 @@ bool LLModelLoader::doLoadModel()
}
}
- return OpenFile(mFilename);
+ bool res = OpenFile(mFilename);
+ dumpDebugData(); // conditional on mDebugMode
+ return res;
}
void LLModelLoader::setLoadState(U32 state)
@@ -466,6 +509,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()
diff --git a/indra/llprimitive/llmodelloader.h b/indra/llprimitive/llmodelloader.h
index 530e61e2b8..06a17f006e 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;
@@ -111,6 +111,7 @@ public:
bool mCacheOnlyHitIfRigged; // ignore cached SLM if it does not contain rig info (and we want rig info)
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 +120,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 +142,9 @@ public:
JointTransformMap& jointTransformMap,
JointNameSet& jointsFromNodes,
JointMap& legalJointNamesMap,
- U32 maxJointsPerMesh);
+ U32 maxJointsPerMesh,
+ U32 modelLimit,
+ U32 debugMode);
virtual ~LLModelLoader();
virtual void setNoNormalize() { mNoNormalize = true; }
@@ -192,6 +201,7 @@ public:
const LLSD logOut() const { return mWarningsArray; }
void clearLog() { mWarningsArray.clear(); }
+ void dumpDebugData();
protected:
@@ -203,6 +213,7 @@ protected:
bool mRigValidJointUpload;
U32 mLegacyRigFlags;
+ U32 mGeneratedModelLimit; // Attempt to limit amount of generated submodels
bool mNoNormalize;
bool mNoOptimize;
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index 41d0a1af31..e93c98970b 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"
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 70a28a1740..ac66faaf5a 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;
@@ -1434,7 +1431,6 @@ void LLGLManager::initExtensions()
mInited = true;
-/*
#if LL_WINDOWS
LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;
@@ -2272,7 +2268,6 @@ void LLGLManager::initExtensions()
glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC)GLH_EXT_GET_PROC_ADDRESS("glPolygonOffsetClamp");
#endif
-*/
}
void rotate_quat(LLQuaternion& rotation)
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 0146ed3119..558c3b062a 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -1966,8 +1966,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 +1987,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 ;
}
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index bb0b8ce04f..3fdcf9f7f2 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -140,7 +140,7 @@ public:
S32 notify(const LLSD& info);
bool notifyChildren(const LLSD& info);
- virtual void draw();
+ void draw();
void storeOpenCloseState();
void restoreOpenCloseState();
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 5be20bd314..8178bada42 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -1346,17 +1346,9 @@ bool LLFlatListViewEx::getForceShowingUnmatchedItems() const
return mForceShowingUnmatchedItems;
}
-void LLFlatListViewEx::setForceShowingUnmatchedItems(bool show, bool notify_parent)
-{
- if (mForceShowingUnmatchedItems != show)
+void LLFlatListViewEx::setForceShowingUnmatchedItems(bool show)
{
mForceShowingUnmatchedItems = show;
- if (!mFilterSubString.empty())
- {
- updateNoItemsMessage(mFilterSubString);
- filterItems(false, true);
- }
- }
}
void LLFlatListViewEx::setFilterSubString(const std::string& filter_str, bool notify_parent)
@@ -1424,7 +1416,6 @@ 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 1f22360a8a..6271231183 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -484,11 +484,7 @@ public:
bool getForceShowingUnmatchedItems() const;
- /**
- * 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);
+ void setForceShowingUnmatchedItems(bool show);
/**
* Sets up new filter string and filters the list.
diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index 368a86ea84..bdce9dec54 100644
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -221,7 +221,6 @@ 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);
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 9ca77dbe46..6d0cfcba95 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -31,12 +31,11 @@
#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"
@@ -61,11 +60,7 @@ 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;
@@ -73,9 +68,6 @@ 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)
@@ -110,8 +102,6 @@ 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);
@@ -131,8 +121,6 @@ void LLFolderViewItem::cleanupClass()
sFonts.clear();
sFolderArrowImg = nullptr;
sSelectionImg = nullptr;
- sFavoriteImg = nullptr;
- sFavoriteContentImg = nullptr;
sSuffixFont = nullptr;
}
@@ -141,15 +129,13 @@ 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(),
- marketplace_item("marketplace_item", false),
+ allow_wear("allow_wear", true),
allow_drop("allow_drop", true),
font_color("font_color"),
font_highlight_color("font_highlight_color"),
@@ -169,8 +155,6 @@ 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 ),
@@ -191,7 +175,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mRoot(p.root),
mViewModelItem(p.listener),
mIsMouseOverTitle(false),
- mMarketplaceItem(p.marketplace_item),
+ mAllowWear(p.allow_wear),
mAllowDrop(p.allow_drop),
mFontColor(p.font_color),
mFontHighlightColor(p.font_highlight_color),
@@ -205,21 +189,6 @@ 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);
@@ -242,7 +211,6 @@ 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)
@@ -357,7 +325,6 @@ 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()
@@ -392,8 +359,6 @@ void LLFolderViewItem::refreshSuffix()
mIconOpen = vmi->getIconOpen();
mIconOverlay = vmi->getIconOverlay();
- mIsFavorite = vmi->isFavorite() && !vmi->isItemInTrash();
-
if (mRoot->useLabelSuffix())
{
// Very Expensive!
@@ -463,10 +428,6 @@ 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);
@@ -593,15 +554,10 @@ void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags)
void LLFolderViewItem::openItem( void )
{
- if (!mMarketplaceItem || !getViewModelItem()->isItemWearable())
+ if (mAllowWear || !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)
@@ -815,45 +771,6 @@ 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;
@@ -1011,7 +928,6 @@ void LLFolderViewItem::draw()
{
drawOpenFolderArrow();
}
- drawFavoriteIcon();
drawHighlight(show_context, filled, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
@@ -1083,20 +999,7 @@ void LLFolderViewItem::draw()
}
}
- static LLUICachedControl<bool> highlight_color("InventoryFavoritesColorText", true);
- LLColor4 color;
- if (mIsSelected && filled)
- {
- color = mFontHighlightColor;
- }
- else if (mIsFavorite && highlight_color)
- {
- color = sFavoriteColor;
- }
- else
- {
- color = mFontColor;
- }
+ LLColor4 color = (mIsSelected && filled) ? mFontHighlightColor : mFontColor;
if (isFadeItem())
{
@@ -1190,8 +1093,7 @@ 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),
- mFavoritesDirtyFlags(0)
+ mLastCalculatedWidth(0)
{
}
@@ -1217,11 +1119,6 @@ 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
@@ -1865,140 +1762,6 @@ 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 == 0)
- {
- // already processed either on previous run or by a different callback
- gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, self);
- 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 = 0;
- }
- 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 = 0;
- }
- 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 = 0;
- }
- parent = parent->getParentFolder();
- }
- }
-}
-
bool LLFolderViewFolder::isRemovable()
{
diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h
index c9b003b892..2ee018a90a 100644
--- a/indra/llui/llfolderviewitem.h
+++ b/indra/llui/llfolderviewitem.h
@@ -50,9 +50,7 @@ class LLFolderViewItem : public LLView
public:
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
- Optional<LLUIImage*> favorite_image,
- favorite_content_image,
- folder_arrow_image,
+ Optional<LLUIImage*> folder_arrow_image,
selection_image;
Mandatory<LLFolderView*> root;
Mandatory<LLFolderViewModelItem*> listener;
@@ -62,7 +60,7 @@ public:
item_top_pad;
Optional<time_t> creation_date;
- Optional<bool> marketplace_item;
+ Optional<bool> allow_wear;
Optional<bool> allow_drop;
Optional<LLUIColor> font_color;
@@ -95,8 +93,6 @@ protected:
LLWString mLabel;
S32 mLabelWidth;
bool mLabelWidthDirty;
- bool mIsFavorite;
- bool mHasFavorites;
S32 mLabelPaddingRight;
LLFolderViewFolder* mParentFolder;
LLPointer<LLFolderViewModelItem> mViewModelItem;
@@ -126,7 +122,7 @@ protected:
mIsCurSelection,
mDragAndDropTarget,
mIsMouseOverTitle,
- mMarketplaceItem,
+ mAllowWear,
mAllowDrop,
mSingleFolderMode,
mDoubleClickOverride,
@@ -137,7 +133,6 @@ protected:
LLUIColor mFontColor;
LLUIColor mFontHighlightColor;
- static bool sColorSetInitialized;
// For now assuming all colors are the same in derived classes.
static LLUIColor sFgColor;
@@ -150,8 +145,6 @@ 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.
@@ -215,8 +208,6 @@ 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();
@@ -307,7 +298,6 @@ 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,
@@ -321,8 +311,6 @@ private:
static S32 sTopPad;
static LLUIImagePtr sFolderArrowImg;
static LLUIImagePtr sSelectionImg;
- static LLUIImagePtr sFavoriteImg;
- static LLUIImagePtr sFavoriteContentImg;
static LLFontGL* sSuffixFont;
LLFontVertexBuffer mLabelFontBuffer;
@@ -412,18 +400,6 @@ 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;
- S32 mFavoritesDirtyFlags { 0 };
-public:
-
// destroys this folder, and all children
virtual void destroyView();
void destroyRoot();
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index ba9d0b8de3..9372818ca5 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -162,7 +162,6 @@ 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;
@@ -171,8 +170,7 @@ 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 isItemInTrash(void) const = 0;
+ virtual bool isItemRemovable( bool check_worn = true ) const = 0; // Can be destroyed
virtual bool removeItem() = 0;
virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) = 0;
@@ -185,9 +183,6 @@ 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?
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 45dab88e87..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
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 2ca2454040..c11b42a348 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -46,7 +46,6 @@
#include "llfocusmgr.h"
#include "llcoord.h"
#include "llwindow.h"
-#include "llemojihelper.h"
#include "llcriticaldamp.h"
#include "lluictrlfactory.h"
@@ -1412,7 +1411,6 @@ 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/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp
index 225ff607ad..c5c31f7252 100644
--- a/indra/llui/llmodaldialog.cpp
+++ b/indra/llui/llmodaldialog.cpp
@@ -28,7 +28,6 @@
#include "llmodaldialog.h"
-#include "llemojihelper.h"
#include "llfocusmgr.h"
#include "v4color.h"
#include "v2math.h"
@@ -36,7 +35,6 @@
#include "llwindow.h"
#include "llkeyboard.h"
#include "llmenugl.h"
-
// static
std::list<LLModalDialog*> LLModalDialog::sModalStack;
@@ -100,7 +98,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();
@@ -157,12 +155,6 @@ 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 );
@@ -309,6 +301,7 @@ void LLModalDialog::centerOnScreen()
centerWithin(LLRect(0, 0, ll_round(window_size.mV[VX]), ll_round(window_size.mV[VY])));
}
+
// static
void LLModalDialog::onAppFocusLost()
{
@@ -340,7 +333,6 @@ void LLModalDialog::onAppFocusGained()
}
}
-// static
void LLModalDialog::shutdownModals()
{
// This method is only for use during app shutdown. ~LLModalDialog()
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/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 58b785fcdd..cfe729be06 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -274,9 +274,7 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mShowChatMentionPicker(false),
mEnableTooltipPaste(p.enable_tooltip_paste),
mPassDelete(false),
- mKeepSelectionOnReturn(false),
- mSelectAllOnFocusReceived(false),
- mSelectedOnFocusReceived(false)
+ mKeepSelectionOnReturn(false)
{
mSourceID.generate();
@@ -400,7 +398,6 @@ 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()));
}
@@ -680,13 +677,6 @@ bool LLTextEditor::canSelectAll() const
return true;
}
-//virtual
-void LLTextEditor::deselect()
-{
- LLTextBase::deselect();
- mSelectedOnFocusReceived = false;
-}
-
// virtual
void LLTextEditor::selectAll()
{
@@ -704,11 +694,6 @@ 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;
@@ -810,16 +795,8 @@ 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;
@@ -2223,11 +2200,6 @@ void LLTextEditor::focusLostHelper()
gEditMenuHandler = NULL;
}
- if (mSelectedOnFocusReceived)
- {
- deselect();
- }
-
if (mCommitOnFocusLost)
{
onCommit();
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index cdfcbcdd63..882bb145df 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -144,10 +144,8 @@ 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();
@@ -338,8 +336,6 @@ 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/llwebrtc/CMakeLists.txt b/indra/llwebrtc/CMakeLists.txt
index 6c0216234c..a64a3e4dac 100644
--- a/indra/llwebrtc/CMakeLists.txt
+++ b/indra/llwebrtc/CMakeLists.txt
@@ -82,8 +82,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/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 1f0820a9f6..6debd54665 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
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 6177eb4873..3cb6686c02 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -657,7 +657,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 +685,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
// we must clear the marked text when aString is null.
[self unmarkText];
}
+
+ delete [] text;
} else {
if (mHasMarkedText)
{
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..0514f63830 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -92,7 +92,7 @@ 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 void showCursor() = 0;
@@ -223,7 +223,6 @@ protected:
bool mFullscreen;
S32 mFullscreenWidth;
S32 mFullscreenHeight;
- S32 mFullscreenBits;
S32 mFullscreenRefresh;
LLWindowResolution* mSupportedResolutions;
S32 mNumSupportedResolutions;
diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h
index 5696b69a59..acec401133 100644
--- a/indra/llwindow/llwindowheadless.h
+++ b/indra/llwindow/llwindowheadless.h
@@ -60,7 +60,7 @@ 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*/ void showCursor() override {}
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 69332e36b6..b733ee9015 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -427,14 +427,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 +443,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);
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index 144216f658..076d7234bc 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"
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index d237fdb334..3a87d2070c 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -160,7 +160,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,14 +350,10 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
LLWindowWin32Thread();
void run() override;
+ void close() override;
- // 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();
+ // closes queue, wakes thread, waits until thread closes
+ void wakeAndDestroy();
void glReady()
{
@@ -403,7 +410,6 @@ 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;
};
@@ -570,6 +576,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;
@@ -584,6 +591,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
{
gDirectInput8 = di8_interface;
}
+#endif
mSwapMethod = SWAP_METHOD_UNDEFINED;
@@ -689,8 +697,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)
@@ -730,7 +737,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
@@ -743,7 +750,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
@@ -757,7 +763,6 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
mFullscreen = false;
mFullscreenWidth = -1;
mFullscreenHeight = -1;
- mFullscreenBits = -1;
mFullscreenRefresh = -1;
std::map<std::string,std::string> args;
@@ -847,7 +852,6 @@ LLWindowWin32::~LLWindowWin32()
}
delete mDragDrop;
- mDragDrop = NULL;
delete [] mWindowTitle;
mWindowTitle = NULL;
@@ -859,7 +863,6 @@ LLWindowWin32::~LLWindowWin32()
mWindowClassName = NULL;
delete mWindowThread;
- mWindowThread = NULL;
}
void LLWindowWin32::show()
@@ -978,11 +981,7 @@ void LLWindowWin32::close()
mhDC = NULL;
mWindowHandle = NULL;
- if (mWindowThread->wakeAndDestroy())
- {
- // thread will delete itselfs once done
- mWindowThread = NULL;
- }
+ mWindowThread->wakeAndDestroy();
}
bool LLWindowWin32::isValid()
@@ -1185,7 +1184,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
@@ -1197,7 +1196,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
@@ -1223,7 +1221,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;
@@ -3104,14 +3101,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
break;
}
}
- else // (NULL == window_imp)
+ else
{
+ // (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
@@ -3521,7 +3514,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));
@@ -3533,7 +3526,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
@@ -3545,9 +3537,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);
@@ -3557,7 +3548,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;
@@ -3568,7 +3559,7 @@ bool LLWindowWin32::setFullscreenResolution()
{
if (mFullscreen)
{
- return setDisplayResolution( mFullscreenWidth, mFullscreenHeight, mFullscreenBits, mFullscreenRefresh);
+ return setDisplayResolution( mFullscreenWidth, mFullscreenHeight, mFullscreenRefresh);
}
else
{
@@ -4583,11 +4574,25 @@ std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList()
#endif // LL_WINDOWS
inline LLWindowWin32::LLWindowWin32Thread::LLWindowWin32Thread()
- : LL::ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE, false)
+ : LL::ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE, true /*should be false, temporary workaround for SL-18721*/)
{
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
@@ -4811,105 +4816,108 @@ 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;
-}
-
-bool LLWindowWin32::LLWindowWin32Thread::wakeAndDestroy()
+void LLWindowWin32::LLWindowWin32Thread::wakeAndDestroy()
{
if (mQueue->isClosed())
{
LL_WARNS() << "Tried to close Queue. Win32 thread Queue already closed." << LL_ENDL;
- return false;
- }
-
- // Hide the window immediately to prevent user interaction during shutdown
- if (mWindowHandleThrd)
- {
- ShowWindow(mWindowHandleThrd, SW_HIDE);
+ return;
}
- mGLReady = 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);
- // Capture current handle before we lose it
+ // Schedule destruction
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;
+ });
- // Clear the user data to prevent callbacks from finding us
- if (old_handle)
- {
- SetWindowLongPtr(old_handle, GWLP_USERDATA, NULL);
- }
-
- // Signal thread to clean up when done
- mDeleteOnExit = true;
-
- // Close the queue first
LL_DEBUGS("Window") << "Closing window's pool queue" << LL_ENDL;
mQueue->close();
- // Wake up the thread if it's stuck in GetMessage()
+ // Post a nonsense user message to wake up the thread in
+ // case it is waiting for a getMessage()
if (old_handle)
{
WPARAM wparam{ 0xB0B0 };
LL_DEBUGS("Window") << "PostMessage(" << std::hex << old_handle
<< ", " << WM_DUMMY_
<< ", " << wparam << ")" << std::dec << LL_ENDL;
-
- // Use PostMessage to signal thread to wake up
PostMessage(old_handle, WM_DUMMY_, wparam, 0x1337);
}
- // Cleanly detach threads instead of joining them to avoid blocking the main thread
- // This is acceptable since the thread will self-delete with mDeleteOnExit
- for (auto& pair : mThreads)
+ // 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)
{
- try {
- // Only detach if the thread is joinable
- if (pair.second.joinable())
- {
- pair.second.detach();
- }
+ ms_sleep(100);
+ }
+
+ if (getQueue().done() || mWindowHandleThrd == NULL)
+ {
+ // 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;
}
- catch (const std::system_error& e) {
- LL_WARNS("Window") << "Exception detaching thread: " << e.what() << LL_ENDL;
+ else
+ {
+ LL_DEBUGS("Window") << "Waiting on pool's thread, time since post: " << timeout.getElapsedSeconds() << "s" << LL_ENDL;
+ }
+ for (auto& pair : mThreads)
+ {
+ pair.second.join();
}
}
+ else
+ {
+ // 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;
+ for (auto& pair : mThreads)
+ {
+ // very unsafe
+ TerminateThread(pair.second.native_handle(), 0);
+ pair.second.detach();
+ }
+ }
LL_DEBUGS("Window") << "thread pool shutdown complete" << LL_ENDL;
- return true;
}
void LLWindowWin32::post(const std::function<void()>& func)
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 36e89e4586..561f07d388 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -150,7 +150,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();
diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index 9142a4516a..304d387eea 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 debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR (${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 debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR (${LINUX_DISTRO} MATCHES ubuntu))
target_compile_definitions(media_plugin_cef PRIVATE USE_VOLUME_CATCHER_PW=1)
endif ()
@@ -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/libvlc/CMakeLists.txt b/indra/media_plugins/libvlc/CMakeLists.txt
index e99f25a1df..1919f54a82 100644
--- a/indra/media_plugins/libvlc/CMakeLists.txt
+++ b/indra/media_plugins/libvlc/CMakeLists.txt
@@ -95,8 +95,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/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 53cf2a1086..2734ab034f 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,6 +49,9 @@ include(VisualLeakDetector)
#include(VulkanGltf)
include(ZLIBNG)
include(LLPrimitive)
+if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
+ include(UnixInstall)
+endif ()
if (ENABLE_MEDIA_PLUGINS)
include(LibVLCPlugin)
@@ -81,6 +87,7 @@ set(viewer_SOURCE_FILES
gltf/accessor.cpp
gltf/primitive.cpp
gltf/animation.cpp
+ gltf/llgltfloader.cpp
groupchatlistener.cpp
llaccountingcostmanager.cpp
llaisapi.cpp
@@ -183,11 +190,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
@@ -345,7 +352,6 @@ set(viewer_SOURCE_FILES
llhudeffectpointat.cpp
llhudeffecttrail.cpp
llhudeffectblob.cpp
- llhudeffectresetskeleton.cpp
llhudicon.cpp
llhudmanager.cpp
llhudnametag.cpp
@@ -371,7 +377,6 @@ set(viewer_SOURCE_FILES
llinventorygallerymenu.cpp
llinventoryicon.cpp
llinventoryitemslist.cpp
- llinventorylistener.cpp
llinventorylistitem.cpp
llinventorymodel.cpp
llinventorymodelbackgroundfetch.cpp
@@ -747,7 +752,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))
list(REMOVE_ITEM viewer_SOURCE_FILES llvoicewebrtc.cpp)
endif ()
@@ -764,6 +769,7 @@ set(viewer_HEADER_FILES
gltf/buffer_util.h
gltf/primitive.h
gltf/animation.h
+ gltf/llgltfloader.h
llaccountingcost.h
llaccountingcostmanager.h
llaisapi.h
@@ -867,11 +873,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
@@ -1031,7 +1037,6 @@ set(viewer_HEADER_FILES
llhudeffectpointat.h
llhudeffecttrail.h
llhudeffectblob.h
- llhudeffectresetskeleton.h
llhudicon.h
llhudmanager.h
llhudnametag.h
@@ -1056,7 +1061,6 @@ set(viewer_HEADER_FILES
llinventorygallerymenu.h
llinventoryicon.h
llinventoryitemslist.h
- llinventorylistener.h
llinventorylistitem.h
llinventorymodel.h
llinventorymodelbackgroundfetch.h
@@ -1496,12 +1500,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)
@@ -1754,6 +1759,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)
@@ -1911,6 +2007,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}
@@ -1957,6 +2064,7 @@ 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)
@@ -2027,7 +2135,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
ll::openxr
)
-if (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD)
+if (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64)))
target_link_libraries(${VIEWER_BINARY_NAME} llwebrtc )
endif ()
@@ -2038,6 +2146,10 @@ if (ENABLE_MEDIA_PLUGINS)
endif ()
endif ()
+if (USE_DISCORD)
+ target_link_libraries(${VIEWER_BINARY_NAME} ll::discord )
+endif ()
+
if( TARGET ll::intel_memops )
target_link_libraries(${VIEWER_BINARY_NAME} ll::intel_memops )
endif()
@@ -2049,8 +2161,9 @@ 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
@@ -2072,6 +2185,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
@@ -2127,38 +2241,47 @@ foreach(elem ${country_codes})
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}"
+ "--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(
@@ -2167,8 +2290,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}
@@ -2176,8 +2302,13 @@ 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"
+ 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.3t64, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libopenjp2-7, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
CACHE STRING "Debian package dependencies.")
+ else ()
+ 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.")
+ 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"
CACHE STRING "Debian package dependencies.")
@@ -2200,54 +2331,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_88_0, libboost_program_options1_88_0, libboost_regex1_88_0, libboost_thread1_88_0, libboost_url1_88_0, libboost_url1_88_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}
@@ -2283,45 +2373,22 @@ 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)
diff --git a/indra/newview/FixBundle.cmake.in b/indra/newview/FixBundle.cmake.in
index 829c19e5e4..1d460a9b45 100644
--- a/indra/newview/FixBundle.cmake.in
+++ b/indra/newview/FixBundle.cmake.in
@@ -293,6 +293,7 @@ execute_process(
Frameworks/libbrotlicommon.1.1.0.dylib
Frameworks/libbrotlidec.1.1.0.dylib
Frameworks/libbz2.1.0.8.dylib
+ Frameworks/libdiscord_partner_sdk.dylib
Frameworks/libexpat.1.10.0.dylib
Frameworks/libfreetype.6.dylib
Frameworks/libhunspell-1.7.0.dylib
diff --git a/indra/newview/FixPackage.cmake.in b/indra/newview/FixPackage.cmake.in
index 49f7b75b4d..23d52a9ef9 100644
--- a/indra/newview/FixPackage.cmake.in
+++ b/indra/newview/FixPackage.cmake.in
@@ -293,6 +293,7 @@ execute_process(
Frameworks/libbrotlicommon.1.1.0.dylib
Frameworks/libbrotlidec.1.1.0.dylib
Frameworks/libbz2.1.0.8.dylib
+ Frameworks/libdiscord_partner_sdk.dylib
Frameworks/libexpat.1.10.0.dylib
Frameworks/libfreetype.6.dylib
Frameworks/libhunspell-1.7.0.dylib
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 6329380f96..0ee843cc60 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-7.1.15
+7.2.0
diff --git a/indra/newview/ViewerInstall.cmake b/indra/newview/ViewerInstall.cmake
index 1281136cef..aaa0c21fa5 100644
--- a/indra/newview/ViewerInstall.cmake
+++ b/indra/newview/ViewerInstall.cmake
@@ -84,22 +84,114 @@ 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
+ ${SCRIPTS_DIR}/../etc/message.xml
+ ${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_88.dll
+ ${prefix_result}/../bin/boost_fiber-vc143-mt-${BOOST_PLATFORM}-1_88.dll
+ ${prefix_result}/../bin/boost_filesystem-vc143-mt-${BOOST_PLATFORM}-1_88.dll
+ ${prefix_result}/../bin/boost_json-vc143-mt-${BOOST_PLATFORM}-1_88.dll
+ ${prefix_result}/../bin/boost_program_options-vc143-mt-${BOOST_PLATFORM}-1_88.dll
+ ${prefix_result}/../bin/boost_thread-vc143-mt-${BOOST_PLATFORM}-1_88.dll
+ ${prefix_result}/../bin/boost_url-vc143-mt-${BOOST_PLATFORM}-1_88.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_88.dll
+ ${prefix_result}/../bin/boost_fiber-vc143-mt-${BOOST_PLATFORM}-1_88.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 +200,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.29
DESTINATION ${_LIB})
endif (USE_FMODSTUDIO)
endif (LINUX)
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/settings.xml b/indra/newview/app_settings/settings.xml
index 7163a2ef34..13826358b5 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</real>
+ <real>300.0</real>
</map>
<key>AckCollectTime</key>
<map>
@@ -643,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>
@@ -1886,17 +1897,6 @@
<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>
@@ -11642,6 +11642,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>
@@ -14722,32 +14744,10 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>OutfitGallerySortOrder</key>
+ <key>OutfitGallerySortByName</key>
<map>
<key>Comment</key>
- <string>Gallery sorting: 0 - sort outfits by name, 1 - images frst, 2 - favorites first</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>OutfitListSortOrder</key>
- <map>
- <key>Comment</key>
- <string>How outfit list in Avatar's floater is sorted. 0 - by name 1 - favorites to top</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>OutfitListFilterFullList</key>
- <map>
- <key>Comment</key>
- <string> 0 - show only matches. 1 - show all items in outfit as long as outfit or item inside matches.</string>
+ <string>Always sort outfits by name in Outfit Gallery</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -15013,7 +15013,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>
@@ -16628,50 +16628,6 @@
<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>
@@ -16760,5 +16716,27 @@
<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=3; Friend objects=7; Group objects=15; Landowner objects=31; Any object=31; All MOAP=1073741824. 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>1</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 8361a50b6c..80a4bec57f 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 2 - both, 1 - logs, 0 - none</string>
+ <string>Keep a conversation log and transcripts</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
diff --git a/indra/newview/gltf/asset.cpp b/indra/newview/gltf/asset.cpp
index a399a59f40..f40cc58440 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,106 @@ bool Asset::prep()
return false;
}
}
+ if (mLoadIntoVRAM)
+ {
+ // prepare vertex buffers
- // prepare vertex buffers
-
- // material count is number of materials + 1 for default material
- U32 mat_count = (U32) mMaterials.size() + 1;
-
- if (LLGLSLShader::sCurBoundShaderPtr == nullptr)
- { // make sure a shader is bound to satisfy mVertexBuffer->setBuffer
- gDebugProgram.bind();
- }
+ // material count is number of materials + 1 for default material
+ U32 mat_count = (U32) mMaterials.size() + 1;
- for (S32 double_sided = 0; double_sided < 2; ++double_sided)
- {
- RenderData& rd = mRenderData[double_sided];
- for (U32 i = 0; i < LLGLSLShader::NUM_GLTF_VARIANTS; ++i)
- {
- rd.mBatches[i].resize(mat_count);
+ if (LLGLSLShader::sCurBoundShaderPtr == nullptr)
+ { // make sure a shader is bound to satisfy mVertexBuffer->setBuffer
+ gDebugProgram.bind();
}
- // for each material
- for (S32 mat_id = -1; mat_id < (S32)mMaterials.size(); ++mat_id)
+ for (S32 double_sided = 0; double_sided < 2; ++double_sided)
{
- // for each shader variant
- U32 vertex_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 };
- U32 index_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 };
-
- S32 ds_mat = mat_id == -1 ? 0 : mMaterials[mat_id].mDoubleSided;
- if (ds_mat != double_sided)
+ RenderData& rd = mRenderData[double_sided];
+ for (U32 i = 0; i < LLGLSLShader::NUM_GLTF_VARIANTS; ++i)
{
- continue;
+ rd.mBatches[i].resize(mat_count);
}
- for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant)
+ // for each material
+ for (S32 mat_id = -1; mat_id < (S32)mMaterials.size(); ++mat_id)
{
- U32 attribute_mask = 0;
- // for each mesh
- for (auto& mesh : mMeshes)
+ // for each shader variant
+ U32 vertex_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 };
+ U32 index_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 };
+
+ S32 ds_mat = mat_id == -1 ? 0 : mMaterials[mat_id].mDoubleSided;
+ if (ds_mat != double_sided)
{
- // for each primitive
- for (auto& primitive : mesh.mPrimitives)
+ continue;
+ }
+
+ for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant)
+ {
+ U32 attribute_mask = 0;
+ // for each mesh
+ for (auto& mesh : mMeshes)
{
- if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant)
+ // for each primitive
+ for (auto& primitive : mesh.mPrimitives)
{
- // accumulate vertex and index counts
- primitive.mVertexOffset = vertex_count[variant];
- primitive.mIndexOffset = index_count[variant];
+ if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant)
+ {
+ // accumulate vertex and index counts
+ primitive.mVertexOffset = vertex_count[variant];
+ primitive.mIndexOffset = index_count[variant];
- vertex_count[variant] += primitive.getVertexCount();
- index_count[variant] += primitive.getIndexCount();
+ vertex_count[variant] += primitive.getVertexCount();
+ index_count[variant] += primitive.getIndexCount();
- // all primitives of a given variant and material should all have the same attribute mask
- llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask);
- attribute_mask |= primitive.mAttributeMask;
+ // all primitives of a given variant and material should all have the same attribute mask
+ llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask);
+ attribute_mask |= primitive.mAttributeMask;
+ }
}
}
- }
- // allocate vertex buffer and pack it
- if (vertex_count[variant] > 0)
- {
- U32 mat_idx = mat_id + 1;
- LLVertexBuffer* vb = new LLVertexBuffer(attribute_mask);
+ // allocate vertex buffer and pack it
+ if (vertex_count[variant] > 0)
+ {
+ U32 mat_idx = mat_id + 1;
+ #if 0
+ LLVertexBuffer* vb = new LLVertexBuffer(attribute_mask);
- rd.mBatches[variant][mat_idx].mVertexBuffer = vb;
- vb->allocateBuffer(vertex_count[variant],
- index_count[variant] * 2); // hack double index count... TODO: find a better way to indicate 32-bit indices will be used
- vb->setBuffer();
+ rd.mBatches[variant][mat_idx].mVertexBuffer = vb;
+ vb->allocateBuffer(vertex_count[variant],
+ index_count[variant] * 2); // hack double index count... TODO: find a better way to indicate 32-bit indices will be used
+ vb->setBuffer();
- for (auto& mesh : mMeshes)
- {
- for (auto& primitive : mesh.mPrimitives)
+ for (auto& mesh : mMeshes)
{
- if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant)
+ for (auto& primitive : mesh.mPrimitives)
{
- primitive.upload(vb);
+ if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant)
+ {
+ primitive.upload(vb);
+ }
}
}
- }
- vb->unmapBuffer();
+ vb->unmapBuffer();
- vb->unbind();
+ vb->unbind();
+ #endif
+ }
}
}
}
- }
- // sanity check that all primitives have a vertex buffer
- for (auto& mesh : mMeshes)
- {
- for (auto& primitive : mesh.mPrimitives)
+ // sanity check that all primitives have a vertex buffer
+ for (auto& mesh : mMeshes)
{
- llassert(primitive.mVertexBuffer.notNull());
+ for (auto& primitive : mesh.mPrimitives)
+ {
+ //llassert(primitive.mVertexBuffer.notNull());
+ }
}
}
-
+ #if 0
// build render batches
for (S32 node_id = 0; node_id < mNodes.size(); ++node_id)
{
@@ -664,6 +680,7 @@ bool Asset::prep()
}
}
}
+ #endif
return true;
}
@@ -672,9 +689,10 @@ 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);
@@ -692,7 +710,7 @@ bool Asset::load(std::string_view filename)
}
else if (ext == "glb")
{
- return loadBinary(str);
+ return loadBinary(str, mLoadIntoVRAM);
}
else
{
@@ -709,8 +727,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 +954,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 +971,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 +991,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 +1011,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..be36c5e90b 100644
--- a/indra/newview/gltf/buffer_util.h
+++ b/indra/newview/gltf/buffer_util.h
@@ -159,6 +159,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,6 +375,11 @@ namespace LL
template<class T>
inline void copy(Asset& asset, Accessor& accessor, LLStrider<T>& dst)
{
+ if (accessor.mBufferView == INVALID_INDEX)
+ {
+ LL_WARNS("GLTF") << "Invalid buffer" << LL_ENDL;
+ return;
+ }
const BufferView& bufferView = asset.mBufferViews[accessor.mBufferView];
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..3019a12446
--- /dev/null
+++ b/indra/newview/gltf/llgltfloader.cpp
@@ -0,0 +1,1819 @@
+/**
+ * @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 <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 VERTICIES_LIMIT = USHRT_MAX - 2;
+
+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"] = "Unknown exception";
+ 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())
+ {
+ LLMatrix4 transformation;
+ material_map mats;
+
+ LLModel* pModel = new LLModel(volume_params, 0.f);
+ const LL::GLTF::Mesh& mesh = mGLTFAsset.mMeshes[node.mMesh];
+
+ // Get base mesh name and track usage
+ std::string base_name = getLodlessLabel(mesh);
+ if (base_name.empty())
+ {
+ base_name = "mesh_" + std::to_string(node.mMesh);
+ }
+
+ 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);
+ }
+
+ 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())
+ {
+ 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);
+ }
+
+ 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() >= VERTICIES_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() >= VERTICIES_LIMIT - 1)
+ {
+ 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::Mesh& mesh)
+{
+ size_t ext_pos = getSuffixPosition(mesh.mName);
+ if (ext_pos != -1)
+ {
+ return mesh.mName.substr(0, ext_pos);
+ }
+ return mesh.mName;
+}
+
diff --git a/indra/newview/gltf/llgltfloader.h b/indra/newview/gltf/llgltfloader.h
new file mode 100644
index 0000000000..e8b91996c7
--- /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::Mesh& 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 d106f738a9..5dec4dd62f 100644
--- a/indra/newview/gltfscenemanager.cpp
+++ b/indra/newview/gltfscenemanager.cpp
@@ -220,7 +220,6 @@ void GLTFSceneManager::uploadSelection()
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost,
- LLUUID::null,
false,
finish,
failure));
@@ -284,7 +283,6 @@ void GLTFSceneManager::uploadSelection()
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost,
- LLUUID::null,
false,
finish,
failure));
@@ -319,7 +317,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();
@@ -561,7 +559,6 @@ void GLTFSceneManager::update()
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost,
- LLUUID::null,
false,
finish,
failure));
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/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 085155714a..9ce14eb0ab 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, flag holds: 1 - inventory thumbnails, 2 - gltf, 4 - inventory favorites
-const S32 UI_FEATURE_FLAGS = 7;
+// For version 1: 1 - inventory, 2 - gltf
+const S32 UI_FEATURE_FLAGS = 3;
// The agent instance.
LLAgent gAgent;
@@ -223,6 +223,7 @@ private:
LLVector3d mPosGlobal;
};
+
class LLTeleportRequestViaLocationLookAt : public LLTeleportRequestViaLocation
{
public:
@@ -385,6 +386,10 @@ LLAgent::LLAgent() :
mbRunning(false),
mbTeleportKeepsLookAt(false),
+ mAllowedToStand(true),
+ mAllowedToSit(true),
+ mSitObjectID(LLUUID::null),
+
mAgentAccess(new LLAgentAccess(gSavedSettings)),
mGodLevelChangeSignal(),
mCanEditParcel(false),
@@ -603,7 +608,7 @@ void LLAgent::getFeatureVersionAndFlags(S32& version, S32& flags)
if (feature_version.isInteger())
{
version = feature_version.asInteger();
- flags = 3; // show 'favorites' notification
+ flags = 1; // inventory flag
}
else if (feature_version.isMap())
{
@@ -629,8 +634,13 @@ void LLAgent::showLatestFeatureNotification(const std::string key)
if (key == "inventory")
{
- // Notify user about new favorites support
- flag = 4;
+ // Notify user about new thumbnail support
+ flag = 1;
+ }
+
+ if (key == "gltf")
+ {
+ flag = 2;
}
if ((flags & flag) == 0)
@@ -837,6 +847,7 @@ void LLAgent::movePitch(F32 mag)
}
}
+
// Does this parcel allow you to fly?
bool LLAgent::canFly()
{
@@ -916,6 +927,7 @@ void LLAgent::setFlying(bool fly, bool fail_sound)
LLFloaterMove::setFlyingMode(fly);
}
+
// UI based mechanism of setting fly state
//-----------------------------------------------------------------------------
// toggleFlying()
@@ -961,7 +973,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()
@@ -994,6 +1010,7 @@ void LLAgent::capabilityReceivedCallback(const LLUUID &region_id, LLViewerRegion
}
}
+
//-----------------------------------------------------------------------------
// setRegion()
//-----------------------------------------------------------------------------
@@ -1099,6 +1116,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
mRegionChangedSignal();
}
+
//-----------------------------------------------------------------------------
// getRegion()
//-----------------------------------------------------------------------------
@@ -1107,6 +1125,7 @@ LLViewerRegion *LLAgent::getRegion() const
return mRegionp;
}
+
LLHost LLAgent::getRegionHost() const
{
if (mRegionp)
@@ -1137,6 +1156,7 @@ bool LLAgent::inPrelude()
return mRegionp && mRegionp->isPrelude();
}
+
std::string LLAgent::getRegionCapability(const std::string &name)
{
if (!mRegionp)
@@ -1145,6 +1165,7 @@ std::string LLAgent::getRegionCapability(const std::string &name)
return mRegionp->getCapability(name);
}
+
//-----------------------------------------------------------------------------
// canManageEstate()
//-----------------------------------------------------------------------------
@@ -1172,6 +1193,7 @@ void LLAgent::sendMessage()
gMessageSystem->sendMessage(mRegionp->getHost());
}
+
//-----------------------------------------------------------------------------
// sendReliableMessage()
//-----------------------------------------------------------------------------
@@ -1205,6 +1227,7 @@ LLVector3 LLAgent::getVelocity() const
}
}
+
//-----------------------------------------------------------------------------
// setPositionAgent()
//-----------------------------------------------------------------------------
@@ -1278,6 +1301,7 @@ const LLVector3 &LLAgent::getPositionAgent()
}
}
+
return mFrameAgent.getOrigin();
}
@@ -1286,6 +1310,7 @@ boost::signals2::connection LLAgent::whenPositionChanged(position_signal_t::slot
return mOnPositionChanged.connect(fn);
}
+
//-----------------------------------------------------------------------------
// getRegionsVisited()
//-----------------------------------------------------------------------------
@@ -1302,6 +1327,7 @@ F64 LLAgent::getDistanceTraveled() const
return mDistanceTraveled;
}
+
//-----------------------------------------------------------------------------
// getPosAgentFromGlobal()
//-----------------------------------------------------------------------------
@@ -1312,6 +1338,7 @@ LLVector3 LLAgent::getPosAgentFromGlobal(const LLVector3d &pos_global) const
return pos_agent;
}
+
//-----------------------------------------------------------------------------
// getPosGlobalFromAgent()
//-----------------------------------------------------------------------------
@@ -1324,9 +1351,10 @@ 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()
//-----------------------------------------------------------------------------
@@ -1335,6 +1363,7 @@ void LLAgent::resetAxes()
mFrameAgent.resetAxes();
}
+
// Copied from LLCamera::setOriginAndLookAt
// Look_at must be unit vector
//-----------------------------------------------------------------------------
@@ -1363,6 +1392,7 @@ void LLAgent::resetAxes(const LLVector3 &look_at)
mFrameAgent.setAxes(look_at, left, up);
}
+
//-----------------------------------------------------------------------------
// rotate()
//-----------------------------------------------------------------------------
@@ -1371,6 +1401,7 @@ void LLAgent::rotate(F32 angle, const LLVector3 &axis)
mFrameAgent.rotate(angle, axis);
}
+
//-----------------------------------------------------------------------------
// rotate()
//-----------------------------------------------------------------------------
@@ -1379,6 +1410,7 @@ void LLAgent::rotate(F32 angle, F32 x, F32 y, F32 z)
mFrameAgent.rotate(angle, x, y, z);
}
+
//-----------------------------------------------------------------------------
// rotate()
//-----------------------------------------------------------------------------
@@ -1387,6 +1419,7 @@ void LLAgent::rotate(const LLMatrix3 &matrix)
mFrameAgent.rotate(matrix);
}
+
//-----------------------------------------------------------------------------
// rotate()
//-----------------------------------------------------------------------------
@@ -1395,6 +1428,7 @@ void LLAgent::rotate(const LLQuaternion &quaternion)
mFrameAgent.rotate(quaternion);
}
+
//-----------------------------------------------------------------------------
// getReferenceUpVector()
//-----------------------------------------------------------------------------
@@ -1423,6 +1457,7 @@ LLVector3 LLAgent::getReferenceUpVector()
return up_vector;
}
+
// Radians, positive is forward into ground
//-----------------------------------------------------------------------------
// pitch()
@@ -1466,6 +1501,7 @@ void LLAgent::pitch(F32 angle)
}
}
+
//-----------------------------------------------------------------------------
// roll()
//-----------------------------------------------------------------------------
@@ -1474,6 +1510,7 @@ void LLAgent::roll(F32 angle)
mFrameAgent.roll(angle);
}
+
//-----------------------------------------------------------------------------
// yaw()
//-----------------------------------------------------------------------------
@@ -1485,6 +1522,7 @@ void LLAgent::yaw(F32 angle)
}
}
+
// Returns a quat that represents the rotation of the agent in the absolute frame
//-----------------------------------------------------------------------------
// getQuat()
@@ -1510,6 +1548,7 @@ void LLAgent::setControlFlags(U32 mask)
mControlFlags |= mask;
}
+
//-----------------------------------------------------------------------------
// clearControlFlags()
//-----------------------------------------------------------------------------
@@ -1597,6 +1636,7 @@ bool LLAgent::isDoNotDisturb() const
return mIsDoNotDisturb;
}
+
//-----------------------------------------------------------------------------
// startAutoPilotGlobal()
//-----------------------------------------------------------------------------
@@ -1702,6 +1742,7 @@ void LLAgent::startAutoPilotGlobal(
mAutoPilotNoProgressFrameCount = 0;
}
+
//-----------------------------------------------------------------------------
// setAutoPilotTargetGlobal
//-----------------------------------------------------------------------------
@@ -1755,6 +1796,7 @@ void LLAgent::startFollowPilot(const LLUUID &leader_id, bool allow_flying, F32 s
allow_flying);
}
+
//-----------------------------------------------------------------------------
// stopAutoPilot()
//-----------------------------------------------------------------------------
@@ -1796,6 +1838,7 @@ void LLAgent::stopAutoPilot(bool user_cancel)
}
}
+
// Returns necessary agent pitch and yaw changes, radians.
//-----------------------------------------------------------------------------
// autoPilot()
@@ -1984,6 +2027,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
}
}
+
//-----------------------------------------------------------------------------
// propagate()
//-----------------------------------------------------------------------------
@@ -2004,19 +2048,18 @@ void LLAgent::propagate(const F32 dt)
}
// handle rotation based on keyboard levels
- if (fabs(dt) > 1e-6)
+ 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(gAgentCamera.getYawKey()) > 1e-6)
- {
- static const F32 YAW_RATE = 90.f * DEG_TO_RAD; // radians per second
- yaw(YAW_RATE * gAgentCamera.getYawKey() * dt);
- }
+ yaw(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);
- }
+ 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);
}
// handle auto-land behavior
@@ -2178,6 +2221,7 @@ void LLAgent::clearRenderState(U8 clearstate)
mRenderState &= ~clearstate;
}
+
//-----------------------------------------------------------------------------
// getRenderState()
//-----------------------------------------------------------------------------
@@ -2219,7 +2263,6 @@ void LLAgent::endAnimationUpdateUI()
{
return;
}
-
if (gAgentCamera.getCameraMode() == gAgentCamera.getLastCameraMode())
{
// We're already done endAnimationUpdateUI for this transition.
@@ -2285,6 +2328,7 @@ void LLAgent::endAnimationUpdateUI()
mViewsPushed = false;
}
+
gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
if( gMorphView )
{
@@ -2916,6 +2960,7 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity)
}
}
+
void LLAgent::processMaturityPreferenceFromServer(const LLSD &result, U8 perferredMaturity)
{
U8 maturity = SIM_ACCESS_MIN;
@@ -2985,6 +3030,7 @@ 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())
@@ -3311,6 +3357,7 @@ 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
@@ -3430,11 +3477,14 @@ void LLAgent::initOriginGlobal(const LLVector3d &origin_global)
bool LLAgent::leftButtonGrabbed() const
{
- const bool camera_mouse_look = gAgentCamera.cameraMouselook();
- return (!camera_mouse_look && mControlsTakenCount[CONTROL_LBUTTON_DOWN_INDEX] > 0)
- || (camera_mouse_look && mControlsTakenCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0)
- || (!camera_mouse_look && mControlsTakenPassedOnCount[CONTROL_LBUTTON_DOWN_INDEX] > 0)
- || (camera_mouse_look && mControlsTakenPassedOnCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0);
+ if (gAgentCamera.cameraMouselook())
+ {
+ return mControlsTakenCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0;
+ }
+ else
+ {
+ return mControlsTakenCount[CONTROL_LBUTTON_DOWN_INDEX] > 0;
+ }
}
bool LLAgent::rotateGrabbed() const
@@ -4240,6 +4290,7 @@ void LLAgent::onCapabilitiesReceivedAfterTeleport()
check_merchant_status();
}
+
void LLAgent::teleportRequest(
const U64& region_handle,
const LLVector3& pos_local,
@@ -4353,6 +4404,7 @@ void LLAgent::doTeleportViaLure(const LLUUID& lure_id, bool godlike)
}
}
+
// James Cook, July 28, 2005
void LLAgent::teleportCancel()
{
@@ -4477,6 +4529,7 @@ LLAgent::ETeleportState LLAgent::getTeleportState() const
TELEPORT_NONE : mTeleportState;
}
+
void LLAgent::setTeleportState(ETeleportState state)
{
if (mTeleportRequest && (state != TELEPORT_NONE) && (mTeleportRequest->getStatus() == LLTeleportRequest::kFailed))
@@ -4521,6 +4574,7 @@ void LLAgent::setTeleportState(ETeleportState state)
}
}
+
void LLAgent::stopCurrentAnimations()
{
LL_DEBUGS("Avatar") << "Stopping current animations" << LL_ENDL;
@@ -4635,6 +4689,7 @@ void LLAgent::stopFidget()
gAgent.sendAnimationRequests(anims, ANIM_REQUEST_STOP);
}
+
void LLAgent::requestEnterGodMode()
{
LLMessageSystem* msg = gMessageSystem;
@@ -4755,6 +4810,7 @@ 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);
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index c1d3c6c14b..b475782946 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -446,6 +446,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 7558d1f907..3a0d55eeba 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -1462,12 +1462,13 @@ 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);
- // Try to move the camera
+ mCameraPositionAgent = gAgent.getPosAgentFromGlobal(camera_pos_global);
- if (!LLViewerCamera::getInstance()->updateCameraLocation(position_agent, mCameraUpVector, focus_agent))
- return;
+ // Move the camera
+
+ LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, mCameraUpVector, focus_agent);
+ //LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, camera_skyward, focus_agent);
// Change FOV
LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / (1.f + mCameraCurrentFOVZoomFactor));
@@ -1475,7 +1476,7 @@ void LLAgentCamera::updateCamera()
// follow camera when in customize mode
if (cameraCustomizeAvatar())
{
- setLookAt(LOOKAT_TARGET_FOCUS, NULL, position_agent);
+ setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent);
}
// update the travel distance stat
@@ -1494,8 +1495,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 = position_agent - head_pos;
- diff *= ~gAgentAvatarp->mRoot->getWorldRotation();
+ LLVector3 diff = mCameraPositionAgent - head_pos;
+ diff = diff * ~gAgentAvatarp->mRoot->getWorldRotation();
LLJoint* torso_joint = gAgentAvatarp->mTorsop;
LLJoint* chest_joint = gAgentAvatarp->mChestp;
@@ -1989,16 +1990,6 @@ 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
@@ -2267,8 +2258,7 @@ void LLAgentCamera::changeCameraToFollow(bool animate)
mCameraMode = CAMERA_MODE_FOLLOW;
// bang-in the current focus, position, and up vector of the follow cam
- const LLViewerCamera& camera = LLViewerCamera::instance();
- mFollowCam.reset(camera.getOrigin(), camera.getPointOfInterest(), LLVector3::z_axis);
+ mFollowCam.reset(mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis);
if (gBasicToolset)
{
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index d277fd6158..52571f3c55 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -112,7 +112,6 @@ 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 */
@@ -139,14 +138,13 @@ 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() const { return (F32)mCameraFocusOffset.length(); }
+ F32 getCurrentCameraBuildOffset() { return (F32)mCameraFocusOffset.length(); }
void clearCameraLag() { mCameraLag.clearVec(); }
- const LLVector3& getCameraUpVector() const { return mCameraUpVector; }
private:
LLVector3 getAvatarRootPosition();
@@ -156,6 +154,7 @@ 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;
@@ -279,7 +278,7 @@ public:
F32 getAgentHUDTargetZoom();
void resetCameraZoomFraction();
- F32 getCurrentCameraZoomFraction() const { return mCameraZoomFraction; }
+ F32 getCurrentCameraZoomFraction() { return mCameraZoomFraction; }
//--------------------------------------------------------------------
// Pan
diff --git a/indra/newview/llagentpilot.cpp b/indra/newview/llagentpilot.cpp
index 8b18b7d5a2..0b5198bbd3 100644
--- a/indra/newview/llagentpilot.cpp
+++ b/indra/newview/llagentpilot.cpp
@@ -322,7 +322,9 @@ void LLAgentPilot::moveCamera()
LLViewerCamera::getInstance()->setView(view);
LLViewerCamera::getInstance()->setOrigin(origin);
- LLViewerCamera::getInstance()->setAxes(mat);
+ LLViewerCamera::getInstance()->mXAxis = LLVector3(mat.mMatrix[0]);
+ LLViewerCamera::getInstance()->mYAxis = LLVector3(mat.mMatrix[1]);
+ LLViewerCamera::getInstance()->mZAxis = LLVector3(mat.mMatrix[2]);
}
}
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index cd4222dddf..5211884bc2 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1304,7 +1304,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;
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 5114ac8a08..11c5ffecb6 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->getDebugName() + "_ais_update", update);
+ dump_sequential_xml(gAgentAvatarp->getFullname() + "_ais_update", update);
}
AISUpdate ais_update(update, type, request_body);
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 5d70bfbc9e..242d407219 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2045,7 +2045,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, bool warn_on_type_mismatch) const
+bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids) const
{
// TODO: investigate wearables may not be loaded at this point EXT-8231
@@ -2075,10 +2075,7 @@ bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids, bool warn_on_t
}
else
{
- if (warn_on_type_mismatch)
- {
LL_WARNS() << "Unexpected wearable type" << LL_ENDL;
- }
return false;
}
}
@@ -2269,7 +2266,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
}
if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))
{
- dump_sequential_xml(gAgentAvatarp->getDebugName() + "_slam_request", contents);
+ dump_sequential_xml(gAgentAvatarp->getFullname() + "_slam_request", contents);
}
slam_inventory_folder(getCOF(), contents, link_waiter);
@@ -3962,7 +3959,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL;
if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))
{
- dump_sequential_xml(gAgentAvatarp->getDebugName() + "_appearance_request_ok", result);
+ dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_ok", result);
}
} while (bRetry);
@@ -3971,7 +3968,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
/*static*/
void LLAppearanceMgr::debugAppearanceUpdateCOF(const LLSD& content)
{
- dump_sequential_xml(gAgentAvatarp->getDebugName() + "_appearance_request_error", content);
+ dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_error", content);
LL_INFOS("Avatar") << "AIS COF, version received: " << content["expected"].asInteger()
<< " ================================= " << LL_ENDL;
@@ -4163,6 +4160,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)
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 0a41a91750..bc7dc9506b 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -103,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, bool warn_on_type_mismatch = true) const;
+ bool canAddWearables(const uuid_vec_t& item_ids) 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 d149d4119d..91232c0bed 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
@@ -456,28 +456,13 @@ 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 > afk_timeout()))
+ if (afk_timeout() && (current_idle > (F32)afk_timeout()) && !gAgent.getAFK())
{
- 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();
- }
+ LL_INFOS("IdleAway") << "Idle more than " << afk_timeout << " seconds: automatically changing to Away status" << LL_ENDL;
+ gAgent.setAFK();
}
}
@@ -1002,7 +987,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())
{
@@ -1363,6 +1348,10 @@ bool LLAppViewer::doFrame()
U64 fpsLimitSleepFor = 0;
TimePoint fpsLimitFrameStartTime = std::chrono::steady_clock::now();
+#ifdef LL_DISCORD
+ LLStartUp::runDiscordCallbacks();
+#endif
+
LL_RECORD_BLOCK_TIME(FTM_FRAME);
{
// and now adjust the visuals from previous frame.
@@ -1559,7 +1548,11 @@ bool LLAppViewer::doFrame()
if(fpsLimitSleepFor)
{
+#if LL_WINDOWS
+ std::this_thread::sleep_for(std::chrono::microseconds(fpsLimitSleepFor));
+#else
usleep(fpsLimitSleepFor);
+#endif
}
// yield some time to the os based on command line option
@@ -1899,6 +1892,36 @@ 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();
@@ -2059,36 +2082,6 @@ 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();
@@ -2309,10 +2302,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:
@@ -2320,6 +2310,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);
@@ -2327,6 +2321,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()
@@ -3438,7 +3436,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;
@@ -3468,7 +3466,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 << ".";
@@ -3476,11 +3474,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)
@@ -5746,9 +5742,30 @@ 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()
+ {
+ throw std::exception();
+ }
+ };
+
+ 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);
@@ -5757,20 +5774,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;
}
@@ -5781,19 +5798,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;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 3da0246ccf..bafe952659 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -175,6 +175,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 +198,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!!
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index c1e8f38c51..376eeca9fd 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -126,7 +126,11 @@ int main( int argc, char **argv )
// install unexpected exception handler
gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);
+#ifdef __aarch64__
+ setenv("LD_PRELOAD", APP_PLUGIN_DIR"/libcef.so", 1);
+#else
unsetenv( "LD_PRELOAD" ); // <FS:ND/> Get rid of any preloading, we do not want this to happen during startup of plugins.
+#endif
bool ok = viewer_app_ptr->init();
if(!ok)
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index ef609026ad..f3214e2a20 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>
@@ -206,6 +210,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 +224,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 +247,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
@@ -395,11 +402,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 +425,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 +456,10 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
#endif
#endif
+#if !LL_SDL
// *FIX: global
gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);
+#endif
LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(ll_convert_wide_to_string(pCmdLine).c_str());
@@ -457,6 +476,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 +501,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
}
}
}
+#endif
// Have to wait until after logging is initialized to display LFH info
if (num_heaps > 0)
@@ -538,16 +559,39 @@ 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();
@@ -788,6 +832,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();
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 1ea2899ba4..f200ca8e31 100644
--- a/indra/newview/llautoreplace.cpp
+++ b/indra/newview/llautoreplace.cpp
@@ -536,12 +536,11 @@ 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;
+ for ( search_index = 0, targetList = mLists[0];
!listFound && search_index < mLists.size();
- search_index += 1
+ search_index += 1, targetList = mLists[search_index]
)
{
- targetList = mLists[search_index];
if ( targetList.isMap() )
{
if ( listNameMatches( targetList, listName) )
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 660fb1b41a..9201241856 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") << getDebugName() << " pos fix, offset_dist " << offset_dist << " pos fixup "
+ LL_DEBUGS("ConstraintFix") << getFullname() << " 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") << getDebugName() << " 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") << getFullname() << " 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") << getDebugName() << " bind shape " << skin_info->mBindShapeMatrix << LL_ENDL;
+ LL_DEBUGS("BindShape") << getFullname() << " 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 cea68c1779..e6a720e734 100644
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -663,7 +663,7 @@ void LLConversationLog::onClearLogResponse(const LLSD& notification, const LLSD&
{
mConversations.clear();
notifyObservers();
- saveToFile(getFileName());
+ cache();
deleteBackupLogs();
}
}
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index d5486b9f4a..c1e48c63a9 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -79,9 +79,6 @@ 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/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 2516bece8d..9e19d16957 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:
@@ -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/llfloaterautoreplacesettings.cpp b/indra/newview/llfloaterautoreplacesettings.cpp
index d93bd624f5..99f24e161e 100644
--- a/indra/newview/llfloaterautoreplacesettings.cpp
+++ b/indra/newview/llfloaterautoreplacesettings.cpp
@@ -422,13 +422,7 @@ bool LLFloaterAutoReplaceSettings::callbackNewListName(const LLSD& notification,
LLSD newList = notification["payload"]["list"];
- 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() )
+ if ( response.has("listname") && response["listname"].isString() )
{
std::string newName = response["listname"].asString();
LLAutoReplaceSettings::setListName(newList, newName);
@@ -514,53 +508,12 @@ 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() )
{
- 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) )
+ 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 1a8068ab7c..94a7c00c15 100644
--- a/indra/newview/llfloaterautoreplacesettings.h
+++ b/indra/newview/llfloaterautoreplacesettings.h
@@ -105,8 +105,6 @@ 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/llfloateravatarwelcomepack.cpp
index 404316275d..82e44d1398 100644
--- a/indra/newview/llfloateravatar.cpp
+++ b/indra/newview/llfloateravatarwelcomepack.cpp
@@ -1,7 +1,7 @@
/**
- * @file llfloateravatar.h
- * @author Leyla Farazha
- * @brief floater for the avatar changer
+ * @file llfloateravatarwelcomepack.cpp
+ * @author Callum Prentice (callum@lindenlab.com)
+ * @brief Floater container for the Avatar Welcome Pack we app
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -27,17 +27,16 @@
#include "llviewerprecompiledheaders.h"
-#include "llfloateravatar.h"
+#include "llfloateravatarwelcomepack.h"
#include "lluictrlfactory.h"
#include "llmediactrl.h"
-
-LLFloaterAvatar::LLFloaterAvatar(const LLSD& key)
+LLFloaterAvatarWelcomePack::LLFloaterAvatarWelcomePack(const LLSD& key)
: LLFloater(key)
{
}
-LLFloaterAvatar::~LLFloaterAvatar()
+LLFloaterAvatarWelcomePack::~LLFloaterAvatarWelcomePack()
{
if (mAvatarPicker)
{
@@ -47,15 +46,13 @@ LLFloaterAvatar::~LLFloaterAvatar()
}
}
-bool LLFloaterAvatar::postBuild()
+bool LLFloaterAvatarWelcomePack::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/llfloateravatarwelcomepack.h
index fb591c8306..a332d46708 100644
--- a/indra/newview/llfloateravatar.h
+++ b/indra/newview/llfloateravatarwelcomepack.h
@@ -1,7 +1,7 @@
/**
- * @file llfloateravatar.h
- * @author Leyla Farazha
- * @brief floater for the avatar changer
+ * @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
@@ -25,22 +25,21 @@
* $/LicenseInfo$
*/
-#ifndef LL_FLOATER_AVATAR_H
-#define LL_FLOATER_AVATAR_H
+#pragma once
#include "llfloater.h"
+
class LLMediaCtrl;
-class LLFloaterAvatar:
+class LLFloaterAvatarWelcomePack:
public LLFloater
{
friend class LLFloaterReg;
-private:
- LLFloaterAvatar(const LLSD& key);
- ~LLFloaterAvatar();
- bool postBuild() override;
- LLMediaCtrl* mAvatarPicker;
-};
+ private:
+ LLFloaterAvatarWelcomePack(const LLSD& key);
+ ~LLFloaterAvatarWelcomePack();
+ bool postBuild() override;
-#endif
+ LLMediaCtrl* mAvatarPicker;
+};
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index 7450be45f1..5ee93be061 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -118,8 +118,8 @@ std::string STATUS[] =
//-----------------------------------------------------------------------------
// LLFloaterBvhPreview()
//-----------------------------------------------------------------------------
-LLFloaterBvhPreview::LLFloaterBvhPreview(const LLSD& args) :
- LLFloaterNameDesc(args)
+LLFloaterBvhPreview::LLFloaterBvhPreview(const std::string& filename) :
+ LLFloaterNameDesc(filename)
{
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,8 +1028,7 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
LLFloaterPerms::getNextOwnerPerms("Uploads"),
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
- expected_upload_cost,
- floaterp->mDestinationFolderId));
+ expected_upload_cost));
upload_new_resource(assetUploadInfo);
}
diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h
index c6b75c00b2..bb69ab65ef 100644
--- a/indra/newview/llfloaterbvhpreview.h
+++ b/indra/newview/llfloaterbvhpreview.h
@@ -70,7 +70,7 @@ protected:
class LLFloaterBvhPreview : public LLFloaterNameDesc
{
public:
- LLFloaterBvhPreview(const LLSD& args);
+ LLFloaterBvhPreview(const std::string& filename);
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/llfloatereditenvironmentbase.h b/indra/newview/llfloatereditenvironmentbase.h
index 41192f3d30..37fda5d33e 100644
--- a/indra/newview/llfloatereditenvironmentbase.h
+++ b/indra/newview/llfloatereditenvironmentbase.h
@@ -133,8 +133,7 @@ protected:
LLSettingsEditPanel() :
LLPanel(),
mIsDirty(false),
- mOnDirtyChanged(),
- mCanEdit(false)
+ mOnDirtyChanged()
{}
private:
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index f254fdafaf..989e1d8d04 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -72,8 +72,8 @@ const S32 PREVIEW_TEXTURE_HEIGHT = 320;
//-----------------------------------------------------------------------------
// LLFloaterImagePreview()
//-----------------------------------------------------------------------------
-LLFloaterImagePreview::LLFloaterImagePreview(const LLSD& args) :
- LLFloaterNameDesc(args),
+LLFloaterImagePreview::LLFloaterImagePreview(const std::string& filename) :
+ LLFloaterNameDesc(filename),
mAvatarPreview(NULL),
mSculptedPreview(NULL),
diff --git a/indra/newview/llfloaterimagepreview.h b/indra/newview/llfloaterimagepreview.h
index 9bc57246cf..ed395722de 100644
--- a/indra/newview/llfloaterimagepreview.h
+++ b/indra/newview/llfloaterimagepreview.h
@@ -110,7 +110,7 @@ protected:
class LLFloaterImagePreview : public LLFloaterNameDesc
{
public:
- LLFloaterImagePreview(const LLSD& args);
+ LLFloaterImagePreview(const std::string& filename);
virtual ~LLFloaterImagePreview();
bool postBuild() override;
diff --git a/indra/newview/llfloaterinventorysettings.cpp b/indra/newview/llfloaterinventorysettings.cpp
index aab632bcb8..e5ee69f240 100644
--- a/indra/newview/llfloaterinventorysettings.cpp
+++ b/indra/newview/llfloaterinventorysettings.cpp
@@ -28,14 +28,9 @@
#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()
@@ -44,29 +39,6 @@ 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 c27d5d2e1b..3fe3a001b9 100644
--- a/indra/newview/llfloaterinventorysettings.h
+++ b/indra/newview/llfloaterinventorysettings.h
@@ -40,11 +40,6 @@ 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/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index b5489d2dd8..bd33ab2dbe 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
-void LLFloaterModelPreview::showModelPreview(const LLUUID& dest_folder)
+bool LLFloaterModelPreview::showModelPreview()
{
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*)LLFloaterReg::getInstance("upload_model");
if (fmp && !fmp->isModelLoading())
{
- fmp->setUploadDestination(dest_folder);
fmp->loadHighLodModel();
}
+ return true;
}
void LLFloaterModelPreview::onUploadOptionChecked(LLUICtrl* ctrl)
@@ -505,7 +506,7 @@ void LLFloaterModelPreview::onClickCalculateBtn()
gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
childGetValue("upload_textures").asBoolean(),
upload_skinweights, upload_joint_positions, lock_scale_if_joint_position,
- mUploadModelUrl, mDestinationFolderId, false,
+ mUploadModelUrl, false,
getWholeModelFeeObserverHandle());
toggleCalculateButton(false);
@@ -619,11 +620,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)
@@ -1488,7 +1487,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;
@@ -1660,7 +1659,7 @@ void LLFloaterModelPreview::onUpload(void* user_data)
gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale,
mp->childGetValue("upload_textures").asBoolean(),
upload_skinweights, upload_joint_positions, lock_scale_if_joint_position,
- mp->mUploadModelUrl, mp->mDestinationFolderId,
+ mp->mUploadModelUrl,
true, LLHandle<LLWholeModelFeeObserver>(), mp->getWholeModelUploadObserverHandle());
}
@@ -1770,15 +1769,9 @@ 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()
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 7b652a3613..6adc084fe8 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -73,8 +73,7 @@ public:
/*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true);
void initModelPreview();
- void setUploadDestination(const LLUUID& dest_folder) { mDestinationFolderId = dest_folder; }
- static void showModelPreview(const LLUUID& dest_folder = LLUUID::null);
+ static bool showModelPreview();
bool handleMouseDown(S32 x, S32 y, MASK mask);
bool handleMouseUp(S32 x, S32 y, MASK mask);
@@ -165,6 +164,9 @@ 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();
@@ -223,7 +225,6 @@ private:
void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
- LLUUID mDestinationFolderId;
LLButton* mUploadBtn;
LLButton* mCalculateBtn;
LLViewerTextEditor* mUploadLogText;
diff --git a/indra/newview/llfloatermyenvironment.cpp b/indra/newview/llfloatermyenvironment.cpp
index c0405c106e..891e16a8ef 100644
--- a/indra/newview/llfloatermyenvironment.cpp
+++ b/indra/newview/llfloatermyenvironment.cpp
@@ -38,9 +38,7 @@
#include "llcheckboxctrl.h"
#include "llviewerinventory.h"
#include "llenvironment.h"
-#include "llnotificationsutil.h"
#include "llparcel.h"
-#include "lltrans.h"
#include "llviewerparcelmgr.h"
//=========================================================================
@@ -225,13 +223,16 @@ void LLFloaterMyEnvironment::onFilterEdit(const std::string& search_string)
mInventoryList->setFilterSubString(search_string);
}
-void LLFloaterMyEnvironment::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, uuid_vec_t item_ids)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option == 0)
+void LLFloaterMyEnvironment::onDeleteSelected()
{
+ uuid_vec_t selected;
+
+ getSelectedIds(selected);
+ if (selected.empty())
+ return;
+
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- for (const LLUUID& itemid : item_ids)
+ for (const LLUUID& itemid: selected)
{
LLInventoryItem* inv_item = gInventory.getItem(itemid);
@@ -252,27 +253,6 @@ void LLFloaterMyEnvironment::onItemsRemovalConfirmation(const LLSD& notification
}
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)
@@ -338,13 +318,13 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context)
if (context == PARAMETER_EDIT)
{
- return (selected.size() == 1) && isSettingId(selected.front());
+ return (selected.size() == 1) && isSettingSelected(selected.front());
}
else if (context == PARAMETER_COPY)
{
for (std::vector<LLUUID>::iterator it = selected.begin(); it != selected.end(); it++)
{
- if(!isSettingId(*it))
+ if(!isSettingSelected(*it))
{
return false;
}
@@ -362,7 +342,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 (!isSettingId(*it))
+ if (!isSettingSelected(*it))
{
return false;
}
@@ -371,7 +351,7 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context)
}
else if (context == PARAMETER_COPYUUID)
{
- return (selected.size() == 1) && isSettingId(selected.front());
+ return (selected.size() == 1) && isSettingSelected(selected.front());
}
return false;
@@ -387,42 +367,16 @@ bool LLFloaterMyEnvironment::canApply(const std::string &context)
if (context == PARAMETER_REGION)
{
- return isSettingId(selected.front()) && LLEnvironment::instance().canAgentUpdateRegionEnvironment();
+ return LLEnvironment::instance().canAgentUpdateRegionEnvironment();
}
else if (context == PARAMETER_PARCEL)
{
- return isSettingId(selected.front()) && LLEnvironment::instance().canAgentUpdateParcelEnvironment();
+ return LLEnvironment::instance().canAgentUpdateParcelEnvironment();
}
- else if (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))
+ else
{
- return false;
+ return (context == PARAMETER_LOCAL);
}
-
- return true;
}
//-------------------------------------------------------------------------
@@ -435,14 +389,7 @@ void LLFloaterMyEnvironment::refreshButtonStates()
getChild<LLUICtrl>(BUTTON_GEAR)->setEnabled(settings_ok);
getChild<LLUICtrl>(BUTTON_NEWSETTINGS)->setEnabled(true);
-
- bool enable_delete = false;
- if(settings_ok && !selected.empty())
- {
- enable_delete = can_delete(selected.front());
- }
-
- getChild<LLUICtrl>(BUTTON_DELETE)->setEnabled(enable_delete);
+ getChild<LLUICtrl>(BUTTON_DELETE)->setEnabled(settings_ok && !selected.empty());
}
//-------------------------------------------------------------------------
@@ -491,7 +438,7 @@ LLUUID LLFloaterMyEnvironment::findItemByAssetId(LLUUID asset_id, bool copyable_
return LLUUID::null;
}
-bool LLFloaterMyEnvironment::isSettingId(const LLUUID& item_id)
+bool LLFloaterMyEnvironment::isSettingSelected(LLUUID item_id)
{
LLInventoryItem* itemp = gInventory.getItem(item_id);
diff --git a/indra/newview/llfloatermyenvironment.h b/indra/newview/llfloatermyenvironment.h
index c5d521d207..8e81b8e5e2 100644
--- a/indra/newview/llfloatermyenvironment.h
+++ b/indra/newview/llfloatermyenvironment.h
@@ -60,7 +60,6 @@ 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);
@@ -70,7 +69,7 @@ private:
void getSelectedIds(uuid_vec_t& ids) const;
void refreshButtonStates();
- static bool isSettingId(const LLUUID &item_id);
+ bool isSettingSelected(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 569b41cfa9..01c50d89c5 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -62,20 +62,11 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
//-----------------------------------------------------------------------------
// LLFloaterNameDesc()
//-----------------------------------------------------------------------------
-LLFloaterNameDesc::LLFloaterNameDesc(const LLSD& args)
- : LLFloater(args)
- , mIsAudio(false)
- , mIsText(false)
+LLFloaterNameDesc::LLFloaterNameDesc(const LLSD& filename )
+ : LLFloater(filename),
+ mIsAudio(false)
{
- if (args.isString())
- {
- mFilenameAndPath = args.asString();
- }
- else
- {
- mFilenameAndPath = args["filename"].asString();
- mDestinationFolderId = args["dest"].asUUID();
- }
+ mFilenameAndPath = filename.asString();
mFilename = gDirUtilp->getBaseFileName(mFilenameAndPath, false);
}
@@ -212,8 +203,7 @@ void LLFloaterNameDesc::onBtnOK( )
LLFloaterPerms::getNextOwnerPerms("Uploads"),
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
- expected_upload_cost,
- mDestinationFolderId));
+ expected_upload_cost));
upload_new_resource(uploadInfo, callback, nruserdata);
}
@@ -240,8 +230,8 @@ void LLFloaterNameDesc::onBtnCancel()
// LLFloaterSoundPreview()
//-----------------------------------------------------------------------------
-LLFloaterSoundPreview::LLFloaterSoundPreview(const LLSD& args )
- : LLFloaterNameDesc(args)
+LLFloaterSoundPreview::LLFloaterSoundPreview(const LLSD& filename )
+ : LLFloaterNameDesc(filename)
{
mIsAudio = true;
}
@@ -261,8 +251,8 @@ bool LLFloaterSoundPreview::postBuild()
// LLFloaterAnimPreview()
//-----------------------------------------------------------------------------
-LLFloaterAnimPreview::LLFloaterAnimPreview(const LLSD& args )
- : LLFloaterNameDesc(args)
+LLFloaterAnimPreview::LLFloaterAnimPreview(const LLSD& filename )
+ : LLFloaterNameDesc(filename)
{
}
@@ -280,8 +270,8 @@ bool LLFloaterAnimPreview::postBuild()
// LLFloaterScriptPreview()
//-----------------------------------------------------------------------------
-LLFloaterScriptPreview::LLFloaterScriptPreview(const LLSD& args )
- : LLFloaterNameDesc(args)
+LLFloaterScriptPreview::LLFloaterScriptPreview(const LLSD& filename )
+ : LLFloaterNameDesc(filename)
{
mIsText = true;
}
diff --git a/indra/newview/llfloaternamedesc.h b/indra/newview/llfloaternamedesc.h
index 8c8ec49a8e..aa5571ccc0 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& args);
+ LLFloaterNameDesc(const LLSD& filename);
virtual ~LLFloaterNameDesc();
bool postBuild() override;
@@ -58,7 +58,6 @@ protected:
std::string mFilenameAndPath;
std::string mFilename;
- LLUUID mDestinationFolderId;
};
class LLFloaterSoundPreview : public LLFloaterNameDesc
diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp
index fa491a4b27..26b7304b9a 100644
--- a/indra/newview/llfloaterobjectweights.cpp
+++ b/indra/newview/llfloaterobjectweights.cpp
@@ -36,14 +36,6 @@
#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)
{
@@ -83,10 +75,7 @@ LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key)
mSelectedOnLand(NULL),
mRezzedOnLand(NULL),
mRemainingCapacity(NULL),
- mTotalCapacity(NULL),
- mLodLevel(nullptr),
- mTrianglesShown(nullptr),
- mPixelArea(nullptr)
+ mTotalCapacity(NULL)
{
}
@@ -110,10 +99,6 @@ 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;
}
@@ -150,69 +135,6 @@ 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())
@@ -330,17 +252,6 @@ 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");
@@ -358,11 +269,6 @@ 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 bda625564b..3b999f6b9b 100644
--- a/indra/newview/llfloaterobjectweights.h
+++ b/indra/newview/llfloaterobjectweights.h
@@ -58,24 +58,21 @@ public:
LLFloaterObjectWeights(const LLSD& key);
~LLFloaterObjectWeights();
- bool postBuild() override;
+ /*virtual*/ bool postBuild();
- void onOpen(const LLSD& key) override;
+ /*virtual*/ void onOpen(const LLSD& key);
- void onWeightsUpdate(const SelectionCost& selection_cost) override;
- void setErrorStatus(S32 status, const std::string& reason) override;
-
- void draw() override;
+ /*virtual*/ void onWeightsUpdate(const SelectionCost& selection_cost);
+ /*virtual*/ void setErrorStatus(S32 status, const std::string& reason);
void updateLandImpacts(const LLParcel* parcel);
- void refresh() override;
+ void refresh();
private:
- void generateTransactionID() override;
+ /*virtual*/ void generateTransactionID();
void toggleWeightsLoadingIndicators(bool visible);
void toggleLandImpactsLoadingIndicators(bool visible);
- void toggleRenderLoadingIndicators(bool visible);
void updateIfNothingSelected();
@@ -91,10 +88,6 @@ private:
LLTextBox *mRezzedOnLand;
LLTextBox *mRemainingCapacity;
LLTextBox *mTotalCapacity;
-
- LLTextBox *mLodLevel;
- LLTextBox *mTrianglesShown;
- LLTextBox *mPixelArea;
};
#endif //LL_LLFLOATEROBJECTWEIGHTS_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index c881821153..fdac390e8a 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1968,21 +1968,7 @@ 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();
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/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index a798ba31ee..565642e683 100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -327,9 +327,6 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
mSetToUserPosition(true),
mTrackedLocation(0.0,0.0,0.0),
mTrackedStatus(LLTracker::TRACKING_NOTHING),
- mListFriendCombo(nullptr),
- mListLandmarkCombo(nullptr),
- mListSearchResults(nullptr),
mParcelInfoObserver(nullptr),
mShowParcelInfo(false)
{
@@ -383,32 +380,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();
@@ -608,7 +606,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()) );
@@ -700,26 +697,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);
}
@@ -728,52 +723,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);
}
@@ -782,7 +770,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)
@@ -790,7 +778,7 @@ 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)
@@ -804,7 +792,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 );
@@ -818,7 +806,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 );
@@ -849,7 +837,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
@@ -964,7 +952,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
{
@@ -1025,17 +1013,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);
}
@@ -1045,15 +1030,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
@@ -1061,29 +1043,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();
@@ -1115,13 +1094,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();
}
@@ -1139,10 +1118,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 = "";
@@ -1153,11 +1131,7 @@ void LLFloaterWorldMap::clearLandmarkSelection(bool clear_ui)
{
if (clear_ui || !childHasKeyboardFocus("landmark combo"))
{
- LLCtrlListInterface *list = mListLandmarkCombo;
- if (list)
- {
- list->selectByValue( "None" );
- }
+ mLandmarkCombo->selectByValue("None");
}
}
@@ -1167,10 +1141,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");
}
}
}
@@ -1226,25 +1199,21 @@ void LLFloaterWorldMap::onGoHome()
}
-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()
@@ -1264,33 +1233,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();
}
@@ -1301,34 +1265,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);
}
@@ -1336,26 +1297,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);
}
}
@@ -1375,11 +1331,11 @@ void LLFloaterWorldMap::updateSearchEnabled()
if (childHasKeyboardFocus("location") &&
mLocationEditor->getValue().asString().length() > 0)
{
- setDefaultBtn("DoSearch");
+ mTrackCtrlsPanel->setDefaultBtn(mSearchButton);
}
else
{
- setDefaultBtn(NULL);
+ mTrackCtrlsPanel->setDefaultBtn(nullptr);
}
}
@@ -1487,8 +1443,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);
}
@@ -1680,9 +1637,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());
}
}
@@ -1693,8 +1650,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();
@@ -1722,7 +1678,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++;
}
}
@@ -1737,21 +1693,22 @@ 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();
}
- // else select first found item
+ // else let user decide
else
{
- list->selectFirstItem();
+ mSearchResults->operateOnAll(LLCtrlListInterface::OP_DESELECT);
+ mSearchResults->setFocus(true);
}
- 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);
+ mSearchResults->setCommentText(LLTrans::getString("worldmap_results_none_found"));
+ mSearchResults->operateOnAll(LLCtrlListInterface::OP_DESELECT);
}
}
@@ -1765,11 +1722,7 @@ void LLFloaterWorldMap::onTeleportFinished()
void LLFloaterWorldMap::onCommitSearchResult()
{
- 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;
@@ -1785,7 +1738,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?
@@ -1800,7 +1753,7 @@ void LLFloaterWorldMap::onCommitSearchResult()
mLocationEditor->setValue(sim_name);
trackLocation(pos_global);
- setDefaultBtn("Teleport");
+ mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);
break;
}
}
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index 2f2b2b7a0d..bf1650eb7c 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
{
@@ -218,14 +220,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 +244,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 a0621bb015..c668d414d3 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -68,10 +68,9 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )
if (!folder->areChildrenInited() || !needsSort(folder->getViewModelItem())) return;
- LLFolderViewModelItemInventory* sort_modelp = static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem());
- if (!sort_modelp->canSortContent()) return;
+ LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem());
+ if (modelp->getUUID().isNull()) return;
- bool has_favorites = false;
for (std::list<LLFolderViewFolder*>::iterator it = folder->getFoldersBegin(), end_it = folder->getFoldersEnd();
it != end_it;
++it)
@@ -80,14 +79,11 @@ 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)
{
- LLFolderViewModelItemInventory* folderp = static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem());
- time_t most_recent_folder_time = folderp->getCreationDate();
-
+ time_t most_recent_folder_time =
+ static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem())->getCreationDate();
+ LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem());
if (most_recent_folder_time > modelp->getCreationDate())
{
modelp->setCreationDate(most_recent_folder_time);
@@ -95,26 +91,16 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )
}
if (child_folderp->getItemsCount() > 0)
{
- LLFolderViewModelItemInventory* itemp = static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem());
- time_t most_recent_item_time = itemp->getCreationDate();
+ time_t most_recent_item_time =
+ static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem())->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 74645a19e0..48b4ee5fd9 100644
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -48,7 +48,6 @@ 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;
@@ -59,7 +58,6 @@ 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/llgltffolderitem.h b/indra/newview/llgltffolderitem.h
index 40a4c6fef1..89d90c81cc 100644
--- a/indra/newview/llgltffolderitem.h
+++ b/indra/newview/llgltffolderitem.h
@@ -114,11 +114,6 @@ 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/llhudeffectresetskeleton.cpp b/indra/newview/llhudeffectresetskeleton.cpp
deleted file mode 100644
index 31065a3e76..0000000000
--- a/indra/newview/llhudeffectresetskeleton.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * @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::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
deleted file mode 100644
index 39a6137054..0000000000
--- a/indra/newview/llhudeffectresetskeleton.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * @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();
- /*virtual*/ void setSourceObject(LLViewerObject* objectp);
-
- void setTargetObject(LLViewerObject *objp);
- void setResetAnimations(bool enable){ mResetAnimations = enable; };
-
-protected:
- LLHUDEffectResetSkeleton(const U8 type);
- ~LLHUDEffectResetSkeleton();
-
- /*virtual*/ void packData(LLMessageSystem *mesgsys);
- /*virtual*/ void unpackData(LLMessageSystem *mesgsys, S32 blocknum);
-
- void update();
-private:
- bool mResetAnimations;
-};
-
-#endif // LL_LLHUDEFFECTRESETSKELETON_H
diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp
index 04e9e2dff2..e6fbfbfb38 100644
--- a/indra/newview/llhudobject.cpp
+++ b/indra/newview/llhudobject.cpp
@@ -36,7 +36,6 @@
#include "llhudeffecttrail.h"
#include "llhudeffectlookat.h"
#include "llhudeffectpointat.h"
-#include "llhudeffectresetskeleton.h"
#include "llhudnametag.h"
#include "llvoicevisualizer.h"
@@ -242,9 +241,6 @@ 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 f683f21e96..8c628e3f92 100644
--- a/indra/newview/llhudobject.h
+++ b/indra/newview/llhudobject.h
@@ -96,8 +96,7 @@ public:
LL_HUD_EFFECT_POINTAT,
LL_HUD_EFFECT_VOICE_VISUALIZER, // Ventrella
LL_HUD_NAME_TAG,
- LL_HUD_EFFECT_BLOB,
- LL_HUD_EFFECT_RESET_SKELETON
+ LL_HUD_EFFECT_BLOB
};
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/llimview.cpp b/indra/newview/llimview.cpp
index bc89af2eed..0a941403f2 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1702,8 +1702,6 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from,
}
else
{
- // will check KeepConversationLogTranscripts on its own
- LLConversationLog::instance().cache();
return false;
}
}
diff --git a/indra/newview/llinspecttexture.cpp b/indra/newview/llinspecttexture.cpp
index 9f0d236826..24dbe61bad 100644
--- a/indra/newview/llinspecttexture.cpp
+++ b/indra/newview/llinspecttexture.cpp
@@ -115,6 +115,7 @@ public:
protected:
LLPointer<LLViewerFetchedTexture> m_Image;
+ S32 mImageBoostLevel = LLGLTexture::BOOST_NONE;
std::string mLoadingText;
};
@@ -127,8 +128,12 @@ LLTexturePreviewView::LLTexturePreviewView(const LLView::Params& p)
LLTexturePreviewView::~LLTexturePreviewView()
{
+ if (m_Image)
+ {
+ m_Image->setBoostLevel(mImageBoostLevel);
m_Image = nullptr;
}
+}
void LLTexturePreviewView::draw()
{
@@ -148,18 +153,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->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE);
+ m_Image->addTextureStats((isLoading) ? MAX_IMAGE_AREA : (F32)(rctClient.getWidth() * rctClient.getHeight()));
}
}
void LLTexturePreviewView::setImageFromAssetId(const LLUUID& idAsset)
{
- m_Image = LLViewerTextureManager::getFetchedTexture(idAsset, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_THUMBNAIL);
+ m_Image = LLViewerTextureManager::getFetchedTexture(idAsset, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
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 edefb5d109..25025038d2 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -829,8 +829,6 @@ 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)
{
@@ -845,8 +843,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
disabled_items.push_back(std::string("Copy"));
}
- bool is_agent_inventory = isAgentInventory();
- if (is_agent_inventory && !single_folder_root && !is_cof && !is_inbox)
+ if (isAgentInventory() && !single_folder_root && !isMarketplaceListingsFolder())
{
items.push_back(std::string("New folder from selected"));
items.push_back(std::string("Subfolder Separator"));
@@ -859,19 +856,6 @@ 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"));
@@ -884,7 +868,6 @@ 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
@@ -894,7 +877,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
items.push_back(std::string("Find Links"));
}
- if (!is_inbox && !single_folder_root)
+ if (!isInboxFolder() && !single_folder_root)
{
items.push_back(std::string("Rename"));
if (!isItemRenameable() || ((flags & FIRST_SELECTED_ITEM) == 0))
@@ -934,7 +917,6 @@ 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())
@@ -957,7 +939,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
}
// Don't allow items to be pasted directly into the COF or the inbox
- if (!is_cof && !is_inbox)
+ if (!isCOFFolder() && !isInboxFolder())
{
items.push_back(std::string("Paste"));
}
@@ -1351,13 +1333,6 @@ 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);
@@ -2305,21 +2280,7 @@ const LLUUID& LLItemBridge::getThumbnailUUID() const
return LLUUID::null;
}
-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;
-}
-
+// virtual
bool LLItemBridge::isItemPermissive() const
{
if (LLViewerInventoryItem* item = getItem())
@@ -2464,16 +2425,6 @@ 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)
@@ -4469,7 +4420,6 @@ 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"));
}
@@ -4495,7 +4445,6 @@ 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"));
}
@@ -4597,7 +4546,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
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"));
@@ -4629,15 +4577,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
if (model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) == mUUID)
{
items.push_back(std::string("Copy outfit list to clipboard"));
- if (isFavorite())
- {
- items.push_back(std::string("Remove from Favorites"));
- }
- else
- {
- items.push_back(std::string("Add to Favorites"));
- }
-
addOpenFolderMenuOptions(flags, items);
}
@@ -7152,13 +7091,12 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)
item = (LLViewerInventoryItem*)gInventory.getItem(object_id);
if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID()))
{
- static LLCachedControl<bool> replace_item(gSavedSettings, "InventoryAddAttachmentBehavior", false);
- rez_attachment(item, NULL, ("attach" == action) ? replace_item() : true); // Replace if "Wear"ing.
+ rez_attachment(item, NULL, 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, true));
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0));
copy_inventory_item(
gAgent.getID(),
item->getPermissions().getOwner(),
@@ -8283,8 +8221,7 @@ void LLObjectBridgeAction::attachOrDetach()
}
else
{
- static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryAddAttachmentBehavior", false);
- LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, inventory_linking()); // Don't replace if adding.
+ LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, false); // Don't replace if adding.
}
}
@@ -8475,7 +8412,6 @@ 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);
}
@@ -8510,51 +8446,6 @@ 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()
{
}
@@ -8565,7 +8456,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, false) && canWearSelected(ids))
+ if (!LLAppearanceMgr::instance().canAddWearables(ids) && 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 ea80b6959a..b7bdef9b21 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -86,7 +86,6 @@ 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() {}
@@ -176,7 +175,6 @@ 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
@@ -261,7 +259,6 @@ public:
LLViewerInventoryItem* getItem() const;
virtual const LLUUID& getThumbnailUUID() const;
- virtual bool isFavorite() const;
protected:
bool confirmRemoveItem(const LLSD& notification, const LLSD& response);
@@ -304,7 +301,6 @@ 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;}
@@ -759,46 +755,6 @@ 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
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -825,7 +781,7 @@ private:
void rez_attachment(LLViewerInventoryItem* item,
LLViewerJointAttachment* attachment,
- bool replace);
+ bool replace = false);
// 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 6c5421596b..01f2c6c525 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -64,7 +64,6 @@ LLInventoryFilter::FilterOps::FilterOps(const Params& p)
mFilterUUID(p.uuid),
mFilterLinks(p.links),
mFilterThumbnails(p.thumbnails),
- mFilterFavorites(p.favorites),
mSearchVisibility(p.search_visibility)
{
}
@@ -160,7 +159,6 @@ 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;
@@ -223,19 +221,6 @@ 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 |
@@ -288,16 +273,6 @@ 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)
@@ -636,24 +611,6 @@ 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)
@@ -854,32 +811,6 @@ 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;
@@ -992,11 +923,6 @@ void LLInventoryFilter::toggleSearchVisibilityLibrary()
}
}
-void LLInventoryFilter::setFilterNoTrashFolder()
-{
- mFilterOps.mFilterTypes |= FILTERTYPE_NO_TRASH_ITEMS;
-}
-
void LLInventoryFilter::setFilterNoMarketplaceFolder()
{
mFilterOps.mFilterTypes |= FILTERTYPE_NO_MARKETPLACE_ITEMS;
@@ -1033,7 +959,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);
}
@@ -1099,7 +1025,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;
@@ -1689,11 +1615,6 @@ U64 LLInventoryFilter::getFilterThumbnails() const
return mFilterOps.mFilterThumbnails;
}
-U64 LLInventoryFilter::getFilterFavorites() const
-{
- return mFilterOps.mFilterFavorites;
-}
-
bool LLInventoryFilter::hasFilterString() const
{
return mFilterSubString.size() > 0;
@@ -1786,7 +1707,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 2bdc646084..612a161ba2 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -61,7 +61,6 @@ 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
@@ -84,13 +83,6 @@ public:
FILTER_ONLY_THUMBNAILS
};
- enum EFilterFavorite
- {
- FILTER_INCLUDE_FAVORITES,
- FILTER_EXCLUDE_FAVORITES,
- FILTER_ONLY_FAVORITES
- };
-
enum ESortOrderType
{
SO_NAME = 0, // Sort inventory by name
@@ -157,7 +149,6 @@ public:
Optional<PermissionMask> permissions;
Optional<EFilterCreatorType> creator_type;
Optional<EFilterThumbnail> thumbnails;
- Optional<EFilterFavorite> favorites;
Params()
: types("filter_types", FILTERTYPE_OBJECT),
@@ -165,7 +156,6 @@ 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),
@@ -187,7 +177,6 @@ public:
mFilterWearableTypes,
mFilterSettingsTypes, // for _SETTINGS
mFilterThumbnails,
- mFilterFavorites,
mFilterLinks,
mFilterCategoryTypes; // For _CATEGORY
LLUUID mFilterUUID; // for UUID
@@ -231,7 +220,6 @@ public:
U64 getFilterSettingsTypes() const;
U64 getSearchVisibilityTypes() const;
U64 getFilterThumbnails() const;
- U64 getFilterFavorites() const;
bool isFilterObjectTypesWith(LLInventoryType::EType t) const;
void setFilterObjectTypes(U64 types);
@@ -245,10 +233,8 @@ 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; }
@@ -353,10 +339,9 @@ 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 b577e302a8..d2ed7168c5 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -51,7 +51,6 @@
#include "lldirpicker.h"
#include "lldonotdisturbnotificationstorage.h"
#include "llfloatermarketplacelistings.h"
-#include "llfloatermodelpreview.h"
#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
@@ -63,7 +62,6 @@
#include "llinventorymodel.h"
#include "llinventorypanel.h"
#include "lllineeditor.h"
-#include "llmaterialeditor.h"
#include "llmarketplacenotifications.h"
#include "llmarketplacefunctions.h"
#include "llmenugl.h"
@@ -88,7 +86,6 @@
#include "llviewermessage.h"
#include "llviewerfoldertype.h"
#include "llviewerobjectlist.h"
-#include "llviewermenufile.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
@@ -2175,10 +2172,21 @@ void validate_marketplacelistings(
void change_item_parent(const LLUUID& item_id, const LLUUID& new_parent_id)
{
- LLViewerInventoryItem* inv_item = gInventory.getItem(item_id);
+ LLInventoryItem* inv_item = gInventory.getItem(item_id);
if (inv_item)
{
- gInventory.changeItemParent(inv_item, new_parent_id, false);
+ 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();
}
}
@@ -2186,17 +2194,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)
{
- LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
+ LLInventoryItem* inv_item = gInventory.getItem(*it);
if (inv_item)
{
- gInventory.changeItemParent(inv_item, new_cat_uuid, false);
+ change_item_parent(*it, new_cat_uuid);
}
else
{
- LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ LLInventoryCategory* inv_cat = gInventory.getCategory(*it);
if (inv_cat && !LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
{
- gInventory.changeCategoryParent(inv_cat, new_cat_uuid, false);
+ gInventory.changeCategoryParent((LLViewerInventoryCategory*)inv_cat, new_cat_uuid, false);
}
}
}
@@ -2342,9 +2350,9 @@ bool can_move_to_my_outfits_as_outfit(LLInventoryModel* model, LLInventoryCatego
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;
}
@@ -2480,143 +2488,6 @@ 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)
@@ -2951,20 +2822,6 @@ 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)
{
@@ -3449,7 +3306,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
for (LLInventoryModel::item_array_t::value_type& item : items)
{
- if (!item->getIsLinkType() && get_is_item_worn(item))
+ if (get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@@ -3469,7 +3326,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
}
}
LLViewerInventoryItem* item = gInventory.getItem(obj_id);
- if (item && !item->getIsLinkType() && get_is_item_worn(item))
+ if (item && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@@ -3675,6 +3532,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
}
else if ("new_folder_from_selected" == action)
{
+
LLInventoryObject* first_item = gInventory.getObject(*ids.begin());
if (!first_item)
{
@@ -3718,20 +3576,6 @@ 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)
@@ -3842,54 +3686,6 @@ 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);
- }
-}
-
void LLInventoryAction::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index ae7bb8770d..b23f82a189 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -118,11 +118,6 @@ bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCat
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);
@@ -206,9 +201,7 @@ class LLInventoryCollectFunctor
{
public:
virtual ~LLInventoryCollectFunctor(){};
- virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0;
-
- virtual bool exceedsLimit() { return false; }
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0;
static bool itemTransferCommonlyAllowed(const LLInventoryItem* item);
};
@@ -383,18 +376,6 @@ 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
@@ -652,7 +633,6 @@ 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 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 a4cb6ea65d..43d4edb069 100644
--- a/indra/newview/llinventorygallery.cpp
+++ b/indra/newview/llinventorygallery.cpp
@@ -636,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, bool is_favorite)
+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::Params giparams;
giparams.visible = true;
@@ -647,7 +647,6 @@ 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);
@@ -940,19 +939,8 @@ bool LLInventoryGallery::updateAddedItem(LLUUID item_id)
}
bool res = false;
- bool is_favorite = get_is_favorite(obj);
-
- LLInventoryGalleryItem* item = buildGalleryItem(
- name,
- item_id,
- obj->getType(),
- thumbnail_id,
- inventory_type,
- misc_flags,
- obj->getCreationDate(),
- obj->getIsLinkType(),
- is_worn,
- is_favorite);
+
+ LLInventoryGalleryItem* item = buildGalleryItem(name, item_id, obj->getType(), thumbnail_id, inventory_type, misc_flags, obj->getCreationDate(), obj->getIsLinkType(), is_worn);
mItemMap.insert(LLInventoryGallery::gallery_item_map_t::value_type(item_id, item));
if (mGalleryCreated)
{
@@ -989,7 +977,7 @@ void LLInventoryGallery::updateRemovedItem(LLUUID item_id)
mItemBuildQuery.erase(item_id);
}
-void LLInventoryGallery::updateChangedItemData(LLUUID item_id, std::string name, bool is_favorite)
+void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name)
{
gallery_item_map_t::iterator iter = mItemMap.find(item_id);
if (iter != mItemMap.end())
@@ -998,7 +986,6 @@ void LLInventoryGallery::updateChangedItemData(LLUUID item_id, std::string name,
if (item)
{
item->setItemName(name);
- item->setFavorite(is_favorite);
}
}
}
@@ -2014,7 +2001,7 @@ void LLInventoryGallery::deleteSelection()
for (LLInventoryModel::item_array_t::value_type& item : items)
{
- if (!item->getIsLinkType() && get_is_item_worn(item))
+ if (get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@@ -2035,7 +2022,7 @@ void LLInventoryGallery::deleteSelection()
}
LLViewerInventoryItem* item = gInventory.getItem(id);
- if (item && !item->getIsLinkType() && get_is_item_worn(item))
+ if (item && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@@ -2348,7 +2335,7 @@ void LLInventoryGallery::refreshList(const LLUUID& category_id)
return;
}
- updateChangedItemData(*items_iter, obj->getName(), get_is_favorite(obj));
+ updateChangedItemName(*items_iter, obj->getName());
mNeedsArrange = true;
}
@@ -2864,14 +2851,6 @@ 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();
diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h
index 7f53f9998d..59d08d19ed 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 updateChangedItemData(LLUUID item_id, std::string name, bool is_favorite);
+ void updateChangedItemName(LLUUID item_id, std::string name);
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, bool is_favorite);
+ 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* getItem(const LLUUID& id) const;
void buildGalleryPanel(int row_count);
@@ -343,7 +343,6 @@ 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 388e1604ea..3fede1a001 100644
--- a/indra/newview/llinventorygallerymenu.cpp
+++ b/indra/newview/llinventorygallerymenu.cpp
@@ -252,20 +252,6 @@ 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);
@@ -488,7 +474,22 @@ void LLInventoryGalleryContextMenu::onRename(const LLSD& notification, const LLS
void LLInventoryGalleryContextMenu::fileUploadLocation(const LLSD& userdata)
{
const std::string param = userdata.asString();
- LLInventoryAction::fileUploadLocation(mUUIDs.front(), param);
+ 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());
+ }
}
bool LLInventoryGalleryContextMenu::canSetUploadLocation(const LLSD& userdata)
@@ -788,7 +789,6 @@ 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"));
}
@@ -810,18 +810,6 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
}
}
- if (!is_trash && !is_in_trash && gInventory.getRootFolderID() != selected_id)
- {
- if (get_is_favorite(obj))
- {
- items.push_back(std::string("Remove from Favorites"));
- }
- else
- {
- items.push_back(std::string("Add to Favorites"));
- }
- }
-
items.push_back(std::string("Subfolder Separator"));
if (!is_system_folder && !isRootFolder() && !is_outfits)
{
@@ -867,17 +855,6 @@ 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"));
@@ -1016,7 +993,6 @@ 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"));
}
@@ -1067,15 +1043,6 @@ 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/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index cfa37cc3ee..2e0669fc38 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -115,7 +115,7 @@ void LLInventoryItemsList::doIdle()
{
if (mRefreshState == REFRESH_COMPLETE) return;
- if (isInVisibleChain() || mForceRefresh || !getFilterSubString().empty())
+ if (isInVisibleChain() || mForceRefresh )
{
refresh();
diff --git a/indra/newview/llinventorylistener.cpp b/indra/newview/llinventorylistener.cpp
deleted file mode 100644
index 028483e134..0000000000
--- a/indra/newview/llinventorylistener.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-/**
- * @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
deleted file mode 100644
index d50397730c..0000000000
--- a/indra/newview/llinventorylistener.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * @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 5fb5b0f23f..e210975a5a 100644
--- a/indra/newview/llinventorylistitem.cpp
+++ b/indra/newview/llinventorylistitem.cpp
@@ -43,19 +43,7 @@
static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(&typeid(LLPanelInventoryListItemBase::Params), "inventory_list_item");
-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();
-}
+static const S32 WIDGET_SPACING = 3;
LLPanelInventoryListItemBase::Params::Params()
: default_style("default_style"),
@@ -87,30 +75,19 @@ void LLPanelInventoryListItemBase::draw()
LLViewerInventoryItem* inv_item = getItem();
if (inv_item)
{
- updateItem(inv_item->getName(), get_is_item_favorite(inv_item));
+ updateItem(inv_item->getName());
}
setNeedsRefresh(false);
}
- static LLUICachedControl<bool> draw_star("InventoryFavoritesUseStar", true);
-
- LLRect local_rect = getLocalRect();
if (mHovered && mHoverImage)
{
- 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());
+ mHoverImage->draw(getLocalRect());
}
if (mSelected && mSelectedImage)
{
- mSelectedImage->draw(local_rect);
+ mSelectedImage->draw(getLocalRect());
}
if (mSeparatorVisible && mSeparatorImage)
@@ -118,7 +95,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 = local_rect;
+ LLRect separator_rect = getLocalRect();
separator_rect.mTop = separator_rect.mBottom;
separator_rect.mBottom -= mSeparatorImage->getHeight();
F32 alpha = getCurrentTransparency();
@@ -130,15 +107,9 @@ 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);
}
@@ -193,7 +164,7 @@ bool LLPanelInventoryListItemBase::postBuild()
if (inv_item)
{
mIconImage = LLInventoryIcon::getIcon(inv_item->getType(), inv_item->getInventoryType(), inv_item->getFlags(), false);
- updateItem(inv_item->getName(), get_is_item_favorite(inv_item));
+ updateItem(inv_item->getName());
}
setNeedsRefresh(true);
@@ -319,7 +290,6 @@ LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem
mHovered(false),
mSelected(false),
mSeparatorVisible(false),
- mIsFavorite(false),
mHoverImage(params.hover_image),
mSelectedImage(params.selected_image),
mSeparatorImage(params.separator_image)
@@ -422,16 +392,6 @@ 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,
@@ -506,10 +466,6 @@ 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 40a86001a4..21540a380b 100644
--- a/indra/newview/llinventorylistitem.h
+++ b/indra/newview/llinventorylistitem.h
@@ -167,7 +167,6 @@ 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; }
@@ -223,9 +222,8 @@ private:
LLUIImagePtr mSelectedImage;
LLUIImagePtr mSeparatorImage;
- bool mSelected = false;
- bool mSeparatorVisible = false;
- bool mIsFavorite = false; // note that any setter needs to update tittle
+ bool mSelected;
+ bool mSeparatorVisible;
std::string mHighlightedText;
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index d9ee3f8bf4..c9e9d50e19 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 = 4;
+const S32 LLInventoryModel::sCurrentInvCacheVersion = 3;
bool LLInventoryModel::sFirstTimeInViewer2 = true;
S32 LLInventoryModel::sPendingSystemFolders = 0;
@@ -1283,10 +1283,6 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
{
for (auto& cat : *cat_array)
{
- if (add.exceedsLimit())
- {
- break;
- }
if(add(cat,NULL))
{
cats.push_back(cat);
@@ -1302,10 +1298,6 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
{
for (auto& item : *item_array)
{
- if (add.exceedsLimit())
- {
- break;
- }
if(add(NULL, item))
{
items.push_back(item);
@@ -2816,9 +2808,8 @@ bool LLInventoryModel::loadSkeleton(
cached_ids.insert(tcat->getUUID());
// At the moment download does not provide a thumbnail
- // uuid or favorite, use values from cache
+ // uuid, use the one from cache
tcat->setThumbnailUUID(cat->getThumbnailUUID());
- tcat->setFavorite(cat->getIsFavorite());
}
}
@@ -3510,9 +3501,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename,
{
if (cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
{
- LLSD sd = LLSD::emptyMap();
- cat->exportLLSD(sd);
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(sd) << std::endl;
+ fileXML << LLSDOStreamer<LLSDNotationFormatter>(cat->exportLLSD()) << std::endl;
cat_count++;
}
@@ -3526,9 +3515,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename,
auto it_count = items.size();
for (auto& item : items)
{
- LLSD sd = LLSD::emptyMap();
- item->asLLSD(sd);
- fileXML << LLSDOStreamer<LLSDNotationFormatter>(sd) << std::endl;
+ fileXML << LLSDOStreamer<LLSDNotationFormatter>(item->asLLSD()) << std::endl;
if (fileXML.fail())
{
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index ac22be9d5a..ac791e224e 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -749,13 +749,6 @@ 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();
@@ -773,7 +766,6 @@ 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);
@@ -787,7 +779,6 @@ 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;
@@ -813,11 +804,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, favorite, cb, version, current_num_known_descendents,item_name_hash)));
+ mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, cb, version, current_num_known_descendents,item_name_hash)));
}
else
{
- mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, favorite, cb, version, current_num_known_descendents)));
+ mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, cb, version, current_num_known_descendents)));
}
}
@@ -830,37 +821,25 @@ void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id)
}
LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData(
- const LLUUID& cat_id,
- const LLUUID& thumbnail_id,
- bool is_favorite,
- callback_t cb,
- S32 version,
- S32 num_descendents)
+ const LLUUID& cat_id, const LLUUID& thumbnail_id, 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,
- bool is_favorite,
- callback_t cb, S32 version,
- S32 num_descendents,
- const digest_t& name_hash)
+ const LLUUID& cat_id, const LLUUID& thumbnail_id, 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 12d6c44521..950b02d3cf 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -60,7 +60,6 @@ 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();
@@ -277,26 +276,12 @@ protected:
typedef LLUUID digest_t; // To clarify the actual usage of this "UUID"
struct LLCategoryData
{
- 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);
+ 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);
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 ffac62aae8..1795de727d 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -55,13 +55,11 @@
#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");
@@ -625,19 +623,6 @@ 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
@@ -666,16 +651,6 @@ 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);
- }
- }
-
}
//////////////////////////////
@@ -689,11 +664,9 @@ 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 = 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
- )
+ LLFolderViewFolder* new_parent = (LLFolderViewFolder*)getItemByID(model_item->getParentUUID());
+ // Item has been moved.
+ if (old_parent != new_parent)
{
if (new_parent != NULL)
{
@@ -728,21 +701,9 @@ 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
@@ -765,10 +726,6 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
updateFolderLabel(viewmodel_folder->getUUID());
}
}
- if (view_item->isFavorite())
- {
- parent->updateHasFavorites(false); // favorite was removed
- }
}
}
}
@@ -779,7 +736,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
LL_PROFILE_ZONE_SCOPED;
- if (mViewsInitialized != VIEWS_INITIALIZED) return; // todo: Store changes if building?
+ if (mViewsInitialized != VIEWS_INITIALIZED) return;
const LLInventoryModel* model = getModel();
if (!model) return;
@@ -886,23 +843,7 @@ void LLInventoryPanel::idle(void* user_data)
bool in_visible_chain = panel->isInVisibleChain();
- 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())
+ if (!panel->mBuildViewsQueue.empty())
{
const F64 max_time = in_visible_chain ? 0.006f : 0.001f; // 6 ms
F64 curent_time = LLTimer::getTotalSeconds();
@@ -942,11 +883,6 @@ 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())
@@ -989,9 +925,20 @@ void LLInventoryPanel::initializeViews(F64 max_time)
mBuildViewsEndTime = curent_time + max_time;
// init everything
- 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
+ }
- if (mBuildViewsQueue.empty() && mBuildRootQueue.empty())
+ if (mBuildViewsQueue.empty())
{
mViewsInitialized = VIEWS_INITIALIZED;
}
@@ -1022,22 +969,6 @@ 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)
{
@@ -1809,8 +1740,26 @@ bool LLInventoryPanel::beginIMSession()
void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
{
const std::string param = userdata.asString();
- const LLUUID dest = LLFolderBridge::sSelf.get()->getUUID();
- LLInventoryAction::fileUploadLocation(dest, param);
+ 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());
+ }
}
void LLInventoryPanel::setFavoriteFolder()
@@ -2263,274 +2212,6 @@ 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;
-
-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();
-}
-
-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());
- }
- view_item->destroyView();
- if (parent)
- {
- parent->getViewModelItem()->dirtyDescendantsFilter();
- LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(parent->getViewModelItem());
- if (viewmodel_folder)
- {
- updateFolderLabel(viewmodel_folder->getUUID());
- }
- if (view_item->isFavorite())
- {
- 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)
- {
- 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))
- {
- 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 b7fef98413..ab17196e5f 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -252,8 +252,7 @@ public:
bool reset_filter = false);
static void setSFViewAndOpenFolder(const LLInventoryPanel* panel, const LLUUID& folder_id);
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
- virtual void removeItemID(const LLUUID& id);
- virtual bool isInRootContent(const LLUUID& id, LLFolderViewItem* view_item) { return false; }
+ void removeItemID(const LLUUID& id);
LLFolderViewItem* getItemByID(const LLUUID& id);
LLFolderViewFolder* getFolderByID(const LLUUID& id);
void setSelectionByID(const LLUUID& obj_id, bool take_keyboard_focus);
@@ -336,8 +335,6 @@ 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;
@@ -375,7 +372,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,
@@ -398,8 +395,6 @@ protected:
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/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 5e230d95bd..e86599035e 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -78,7 +78,7 @@ 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_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{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}\\]).*");
/**
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 3bf50c8e65..5b3ac53d51 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -137,7 +137,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);
@@ -1332,15 +1333,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 +1340,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 +1415,7 @@ bool LLMaterialEditor::saveIfNeeded()
}
std::string res_desc = buildMaterialDescription();
- createInventoryItem(buffer, mMaterialName, res_desc, local_permissions, mUploadFolder);
+ createInventoryItem(buffer, mMaterialName, res_desc, local_permissions);
// We do not update floater with uploaded asset yet, so just close it.
closeFloater();
@@ -1584,12 +1585,12 @@ private:
std::string mNewName;
};
-void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions, const LLUUID& upload_folder)
+void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions)
{
// gen a new uuid for this asset
LLTransactionID tid;
tid.generate(); // timestamp-based randomization + uniquification
- LLUUID parent = upload_folder.isNull() ? gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL) : upload_folder;
+ LLUUID parent = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL);
const U8 subtype = NO_INV_SUBTYPE; // TODO maybe use AT_SETTINGS and LLSettingsType::ST_MATERIAL ?
LLPointer<LLObjectsMaterialItemCallback> cb = new LLObjectsMaterialItemCallback(permissions, buffer, name);
@@ -1903,11 +1904,7 @@ static void pack_textures(
}
}
-void LLMaterialEditor::uploadMaterialFromModel(
- const std::string& filename,
- tinygltf::Model& model_in,
- S32 index,
- const LLUUID& dest)
+void LLMaterialEditor::uploadMaterialFromModel(const std::string& filename, tinygltf::Model& model_in, S32 index)
{
if (index < 0 || !LLMaterialEditor::capabilitiesAvailable())
{
@@ -1930,13 +1927,12 @@ void LLMaterialEditor::uploadMaterialFromModel(
// 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, const LLUUID& dest_folder)
+void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 index)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
@@ -2436,17 +2432,17 @@ void LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback(const LLSD& notificati
return;
}
- createInventoryItem(str.str(), new_name, std::string(), permissions, LLUUID::null);
+ createInventoryItem(str.str(), new_name, std::string(), permissions);
}
-void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k, const LLUUID& dest);
+const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k);
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, LLUUID::null);
+ upload_bulk({ filename }, LLFilePicker::FFLOAD_MATERIAL, true);
return;
}
@@ -2689,10 +2685,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 <<
@@ -2701,28 +2695,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;
}
}
@@ -2853,10 +2836,10 @@ void LLMaterialEditor::setFromGltfMetaData(const std::string& filename, const ti
}
}
-void LLMaterialEditor::importMaterial(const LLUUID dest_folder)
+void LLMaterialEditor::importMaterial()
{
LLFilePickerReplyThread::startPicker(
- [dest_folder](const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter)
+ [](const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter)
{
if (LLAppViewer::instance()->quitRequested())
{
@@ -2866,7 +2849,7 @@ void LLMaterialEditor::importMaterial(const LLUUID dest_folder)
{
if (filenames.size() > 0)
{
- LLMaterialEditor::loadMaterialFromFile(filenames[0], -1, dest_folder);
+ LLMaterialEditor::loadMaterialFromFile(filenames[0], -1);
}
}
catch (std::bad_alloc&)
@@ -3554,7 +3537,6 @@ 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 1abdd7f84c..232467460e 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(const LLUUID dest_folder = LLUUID::null);
+ static void importMaterial();
// for live preview, apply current material to currently selected object
void applyToSelection();
@@ -105,11 +105,8 @@ 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,
- const LLUUID& dest_folder_id = LLUUID::null);
- static void loadMaterialFromFile(const std::string& filename, S32 index = -1, const LLUUID& dest_folder = LLUUID::null);
+ static void uploadMaterialFromModel(const std::string& filename, tinygltf::Model& model, S32 index);
+ static void loadMaterialFromFile(const std::string& filename, S32 index = -1);
void onSelectionChanged(); // live overrides selection changes
@@ -137,6 +134,8 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
void onClickSave();
+ void getGLTFModel(tinygltf::Model& model);
+
std::string getEncodedAsset();
bool decodeAsset(const std::vector<char>& buffer);
@@ -240,7 +239,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, const LLUUID& upload_folder);
+ static void createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions);
void setFromGLTFMaterial(LLGLTFMaterial* mat);
bool setFromSelection();
@@ -250,7 +249,6 @@ private:
friend class LLMaterialFilePicker;
LLUUID mAssetID;
- LLUUID mUploadFolder;
LLTextureCtrl* mBaseColorTextureCtrl;
LLTextureCtrl* mMetallicTextureCtrl;
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index a7476ba6c4..142a3dac39 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -816,12 +816,8 @@ public:
};
-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)
+void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
+ const char * const stage, const std::string & model_name)
{
// Add notification popup.
LLSD args;
@@ -879,20 +875,6 @@ void log_upload_error(
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
{
@@ -2413,6 +2395,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;
}
}
@@ -2560,7 +2547,7 @@ EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_
LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
- const std::string & upload_url, LLUUID destination_folder_id, bool do_upload,
+ const std::string & upload_url, bool do_upload,
LLHandle<LLWholeModelFeeObserver> fee_observer,
LLHandle<LLWholeModelUploadObserver> upload_observer)
: LLThread("mesh upload"),
@@ -2568,7 +2555,6 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
mDiscarded(false),
mDoUpload(do_upload),
mWholeModelUploadURL(upload_url),
- mDestinationFolderId(destination_folder_id),
mFeeObserverHandle(fee_observer),
mUploadObserverHandle(upload_observer)
{
@@ -2685,21 +2671,13 @@ LLSD llsd_from_file(std::string filename)
return result;
}
-void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>& texture_list_dest, bool include_textures)
+void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
{
LLSD result;
LLSD res;
- if (mDestinationFolderId.isNull())
- {
result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT);
result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
- }
- else
- {
- result["folder_id"] = mDestinationFolderId;
- result["texture_folder_id"] = mDestinationFolderId;
- }
result["asset_type"] = "mesh";
result["inventory_type"] = "object";
result["description"] = "(No Description)";
@@ -2721,10 +2699,14 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
S32 instance_num = 0;
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ // 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)
{
LLMeshUploadData data;
- data.mBaseModel = iter->first;
+ data.mBaseModel = iter.first;
if (data.mBaseModel->mSubmodelID)
{
@@ -2733,7 +2715,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
continue;
}
- LLModelInstance& first_instance = *(iter->second.begin());
+ LLModelInstance& first_instance = *(iter.second.begin());
for (S32 i = 0; i < 5; i++)
{
data.mModel[i] = first_instance.mLOD[i];
@@ -2767,7 +2749,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
mUploadSkin,
mUploadJoints,
mLockScaleIfJointPosition,
- false,
+ LLModel::WRITE_BINARY,
false,
data.mBaseModel->mSubmodelID);
@@ -2780,8 +2762,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
}
// For all instances that use this model
- for (instance_list::iterator instance_iter = iter->second.begin();
- instance_iter != iter->second.end();
+ for (instance_list::iterator instance_iter = iter.second.begin();
+ instance_iter != iter.second.end();
++instance_iter)
{
@@ -2842,7 +2824,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
LLPointer<LLImageJ2C> upload_file =
LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
- if (!upload_file.isNull() && upload_file->getDataSize() && !upload_file->isBufferInvalid())
+ if (!upload_file.isNull() && upload_file->getDataSize())
{
texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
}
@@ -2856,8 +2838,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
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++;
}
@@ -2881,10 +2861,11 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
}
}
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ // Now handle the submodels.
+ for (auto& iter : mInstance)
{
LLMeshUploadData data;
- data.mBaseModel = iter->first;
+ data.mBaseModel = iter.first;
if (!data.mBaseModel->mSubmodelID)
{
@@ -2893,7 +2874,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
continue;
}
- LLModelInstance& first_instance = *(iter->second.begin());
+ LLModelInstance& first_instance = *(iter.second.begin());
for (S32 i = 0; i < 5; i++)
{
data.mModel[i] = first_instance.mLOD[i];
@@ -2927,7 +2908,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
mUploadSkin,
mUploadJoints,
mLockScaleIfJointPosition,
- false,
+ LLModel::WRITE_BINARY,
false,
data.mBaseModel->mSubmodelID);
@@ -2940,8 +2921,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
}
// For all instances that use this model
- for (instance_list::iterator instance_iter = iter->second.begin();
- instance_iter != iter->second.end();
+ for (instance_list::iterator instance_iter = iter.second.begin();
+ instance_iter != iter.second.end();
++instance_iter)
{
@@ -3122,8 +3103,7 @@ void LLMeshUploadThread::doWholeModelUpload()
LL_DEBUGS(LOG_MESH) << "Hull generation completed." << LL_ENDL;
mModelData = LLSD::emptyMap();
- mTextureFiles.clear();
- wholeModelToLLSD(mModelData, mTextureFiles, true);
+ wholeModelToLLSD(mModelData, true);
LLSD body = mModelData["asset_resources"];
dump_llsd_to_file(body, make_dump_name("whole_model_body_", dump_num));
@@ -3176,8 +3156,7 @@ void LLMeshUploadThread::requestWholeModelFee()
generateHulls();
mModelData = LLSD::emptyMap();
- mTextureFiles.clear();
- wholeModelToLLSD(mModelData, mTextureFiles, false);
+ wholeModelToLLSD(mModelData, false);
dump_llsd_to_file(mModelData, make_dump_name("whole_model_fee_request_", dump_num));
LLCore::HttpHandle handle = LLCoreHttpUtil::requestPostWithLLSD(mHttpRequest,
mHttpPolicyClass,
@@ -3243,7 +3222,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(), mTextureFiles);
+ log_upload_error(status, body, "upload", mModelData["name"].asString());
if (observer)
{
@@ -3278,7 +3257,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(), mTextureFiles);
+ log_upload_error(status, body, "upload", mModelData["name"].asString());
if (observer)
{
@@ -3303,7 +3282,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(), mTextureFiles);
+ log_upload_error(status, body, "fee", mModelData["name"].asString());
if (observer)
{
@@ -3336,7 +3315,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(), mTextureFiles);
+ log_upload_error(status, body, "fee", mModelData["name"].asString());
if (observer)
{
@@ -5012,12 +4991,12 @@ bool LLMeshRepoThread::hasHeader(const LLUUID& mesh_id) const
void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
- std::string upload_url, const LLUUID& destination_folder_id, bool do_upload,
+ std::string upload_url, bool do_upload,
LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)
{
LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures,
upload_skin, upload_joints, lock_scale_if_joint_position,
- upload_url, destination_folder_id, do_upload, fee_observer, upload_observer);
+ upload_url, do_upload, fee_observer, upload_observer);
mUploadWaitList.push_back(thread);
}
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 0c3a3559c2..4c3901408f 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -674,7 +674,22 @@ public:
typedef std::vector<LLModelInstance> instance_list;
instance_list mInstanceList;
- typedef std::map<LLPointer<LLModel>, instance_list> instance_map;
+ // 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, LLUploadModelInstanceLess> instance_map;
instance_map mInstance;
LLMutex* mMutex;
@@ -690,13 +705,10 @@ public:
LLHost mHost;
std::string mWholeModelFeeCapability;
std::string mWholeModelUploadURL;
- LLUUID mDestinationFolderId;
LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
- const std::string & upload_url,
- const LLUUID destination_folder_id = LLUUID::null,
- bool do_upload = true,
+ const std::string & upload_url, bool do_upload = true,
LLHandle<LLWholeModelFeeObserver> fee_observer = (LLHandle<LLWholeModelFeeObserver>()),
LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
~LLMeshUploadThread();
@@ -712,7 +724,7 @@ public:
void doWholeModelUpload();
void requestWholeModelFee();
- void wholeModelToLLSD(LLSD& dest, std::vector<std::string>& texture_list_dest, bool include_textures);
+ void wholeModelToLLSD(LLSD& dest, bool include_textures);
void decomposeMeshMatrix(LLMatrix4& transformation,
LLVector3& result_pos,
@@ -733,7 +745,6 @@ private:
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;
@@ -856,9 +867,7 @@ public:
void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
- std::string upload_url,
- const LLUUID& destination_folder_id = LLUUID::null,
- bool do_upload = true,
+ std::string upload_url, bool do_upload = true,
LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()),
LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 7c33379d65..6fe192ac19 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"
@@ -163,10 +164,12 @@ 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))
+ , mImporterDebug(LLCachedControl<bool>(gSavedSettings, "ImporterDebugVerboseLogging", false))
{
mNeedsUpdate = true;
mCameraDistance = 0.f;
@@ -175,11 +178,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;
@@ -211,6 +212,7 @@ LLModelPreview::~LLModelPreview()
{
mModelLoader->shutdown();
mModelLoader = NULL;
+ mLoading = false;
}
if (mPreviewAvatar)
@@ -691,7 +693,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();
}
@@ -753,6 +755,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;
}
@@ -780,7 +786,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();
@@ -806,10 +812,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,
@@ -822,7 +832,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)
@@ -1807,7 +1819,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)
{
@@ -1884,6 +1896,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;
@@ -1893,7 +1911,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)
{
@@ -1956,6 +1974,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++;
}
}
}
@@ -1968,7 +1991,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++;
}
}
}
@@ -2068,25 +2102,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++;
}
}
@@ -2100,6 +2137,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;
@@ -2129,6 +2168,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()
@@ -2348,7 +2392,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;
@@ -3090,25 +3134,48 @@ void LLModelPreview::lookupLODModelFiles(S32 lod)
S32 next_lod = (lod - 1 >= LLModel::LOD_IMPOSTOR) ? lod - 1 : LLModel::LOD_PHYSICS;
std::string lod_filename = mLODFile[LLModel::LOD_HIGH];
- std::string ext = ".dae";
std::string lod_filename_lower(lod_filename);
LLStringUtil::toLower(lod_filename_lower);
- std::string::size_type i = lod_filename_lower.rfind(ext);
- if (i != std::string::npos)
+
+ // Check for each supported file extension
+ std::vector<std::string> supported_exts = { ".dae", ".gltf", ".glb" };
+ std::string found_ext;
+ std::string::size_type ext_pos = std::string::npos;
+
+ for (const auto& ext : supported_exts)
{
- lod_filename.replace(i, lod_filename.size() - ext.size(), getLodSuffix(next_lod) + ext);
+ std::string::size_type i = lod_filename_lower.rfind(ext);
+ if (i != std::string::npos)
+ {
+ ext_pos = i;
+ found_ext = ext;
+ break;
+ }
}
- if (gDirUtilp->fileExists(lod_filename))
+
+ if (ext_pos != std::string::npos)
{
- LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
- if (fmp)
+ // Replace extension with LOD suffix + original extension
+ std::string lod_file_to_check = lod_filename;
+ lod_file_to_check.replace(ext_pos, found_ext.size(), getLodSuffix(next_lod) + found_ext);
+
+ if (gDirUtilp->fileExists(lod_file_to_check))
+ {
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (fmp)
+ {
+ fmp->setCtrlLoadFromFile(next_lod);
+ }
+ loadModel(lod_file_to_check, next_lod);
+ }
+ else
{
- fmp->setCtrlLoadFromFile(next_lod);
+ lookupLODModelFiles(next_lod);
}
- loadModel(lod_filename, next_lod);
}
else
{
+ // No recognized extension found, continue with next LOD
lookupLODModelFiles(next_lod);
}
}
@@ -3323,6 +3390,7 @@ 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
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/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 3adee9fa16..98b7d74cd2 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -87,16 +87,9 @@ LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p)
mItemsInRow(p.items_in_row),
mRowPanWidthFactor(p.row_panel_width_factor),
mGalleryWidthFactor(p.gallery_width_factor),
- mTextureSelected(NULL),
- mSortMenu(nullptr)
+ mTextureSelected(NULL)
{
updateGalleryWidth();
-
- LLControlVariable* ctrl = gSavedSettings.getControl("InventoryFavoritesColorText");
- if (ctrl)
- {
- mSavedSettingInvFavColor = ctrl->getSignal()->connect(boost::bind(&LLOutfitGallery::handleInvFavColorChange, this));
- }
}
LLOutfitGallery::Params::Params()
@@ -427,32 +420,19 @@ void LLOutfitGallery::updateRowsIfNeeded()
bool compareGalleryItem(LLOutfitGalleryItem* item1, LLOutfitGalleryItem* item2)
{
- static LLCachedControl<S32> sort_by_name(gSavedSettings, "OutfitGallerySortOrder", 0);
- switch (sort_by_name())
+ static LLCachedControl<bool> outfit_gallery_sort_by_name(gSavedSettings, "OutfitGallerySortByName");
+ if(outfit_gallery_sort_by_name ||
+ ((item1->isDefaultImage() && item2->isDefaultImage()) || (!item1->isDefaultImage() && !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;
- }
+ std::string name1 = item1->getItemName();
+ std::string name2 = item2->getItemName();
- // Final comparison is always alphabetical by name
- std::string name1 = item1->getItemName();
- std::string name2 = item2->getItemName();
- return (LLStringUtil::compareDict(name1, name2) < 0);
+ return (LLStringUtil::compareDict(name1, name2) < 0);
+ }
+ else
+ {
+ return item2->isDefaultImage();
+ }
}
void LLOutfitGallery::reArrangeRows(S32 row_diff)
@@ -495,20 +475,6 @@ 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++;
@@ -660,7 +626,7 @@ void LLOutfitGallery::removeFromLastRow(LLOutfitGalleryItem* item)
mItemPanels.pop_back();
}
-LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID outfit_id, bool is_favorite)
+LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID outfit_id)
{
LLOutfitGalleryItem::Params giparams;
LLOutfitGalleryItem* gitem = LLUICtrlFactory::create<LLOutfitGalleryItem>(giparams);
@@ -669,7 +635,6 @@ 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;
@@ -832,7 +797,8 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
return;
}
- LLOutfitGalleryItem* item = buildGalleryItem(cat->getName(), cat_id, cat->getIsFavorite());
+ std::string name = cat->getName();
+ LLOutfitGalleryItem* item = buildGalleryItem(name, cat_id);
mOutfitMap.insert(LLOutfitGallery::outfit_map_value_t(cat_id, item));
item->setRightMouseDownCallback(boost::bind(&LLOutfitListBase::outfitRightClickCallBack, this,
_1, _2, _3, cat_id));
@@ -895,7 +861,6 @@ void LLOutfitGallery::updateChangedCategoryName(LLViewerInventoryCategory *cat,
if (item)
{
item->setOutfitName(name);
- item->setOutfitFavorite(cat->getIsFavorite());
}
}
}
@@ -976,10 +941,6 @@ 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),
@@ -991,12 +952,6 @@ 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()
@@ -1043,19 +998,6 @@ 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)
@@ -1065,28 +1007,18 @@ 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);
- mOutfitWornText->setReadOnlyColor(sDefaultTextColor.get());
- mOutfitNameText->setReadOnlyColor(sDefaultTextColor.get());
+ LLUIColor text_color = LLUIColorTable::instance().getColor("White", LLColor4::white);
+ mOutfitWornText->setReadOnlyColor(text_color);
+ mOutfitNameText->setReadOnlyColor(text_color);
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)
@@ -1238,7 +1170,6 @@ 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));
@@ -1277,12 +1208,25 @@ 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);
@@ -1399,15 +1343,6 @@ 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);
@@ -1423,84 +1358,3 @@ 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 5801a32a39..a2a5fe26eb 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -42,13 +42,11 @@ 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;
@@ -104,12 +102,10 @@ 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);
@@ -137,9 +133,8 @@ private:
void reArrangeRows(S32 row_diff = 0);
void updateRowsIfNeeded();
void updateGalleryWidth();
- void handleInvFavColorChange();
- LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id, bool is_favorite);
+ LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id);
LLOutfitGalleryItem* getSelectedItem() const;
LLOutfitGalleryItem* getItem(const LLUUID& id) const;
@@ -181,7 +176,6 @@ 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;
@@ -190,11 +184,6 @@ private:
typedef item_num_map_t::value_type item_numb_map_value_t;
item_num_map_t mItemIndexMap;
std::map<S32, LLOutfitGalleryItem*> mIndexToItemMap;
-
-
- LLInventoryCategoriesObserver* mOutfitsObserver;
-
- boost::signals2::connection mSavedSettingInvFavColor;
};
class LLOutfitGalleryContextMenu : public LLOutfitContextMenu
{
@@ -221,6 +210,8 @@ public:
protected:
/*virtual*/ void onUpdateItemsVisibility();
private:
+ /*virtual*/ void onChangeSortOrder();
+
bool hasDefaultImage();
};
@@ -249,7 +240,6 @@ 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;}
@@ -257,7 +247,6 @@ public:
std::string getItemName() {return mOutfitName;}
bool isDefaultImage() {return mDefaultImage;}
- bool isFavorite() { return mFavorite; }
bool isHidden() {return mHidden;}
void setHidden(bool hidden) {mHidden = hidden;}
@@ -275,29 +264,7 @@ 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 2b2b5ea696..df53c66ec1 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -35,7 +35,6 @@
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
-#include "llappviewer.h"
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llinspecttexture.h"
@@ -46,7 +45,6 @@
#include "lloutfitobserver.h"
#include "lltoggleablemenu.h"
#include "lltransutil.h"
-#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
@@ -55,24 +53,14 @@
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
{
- return (LLStringUtil::compareDict(tab1->getTitle(), tab2->getTitle()) < 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();
- }
+ std::string name1 = tab1->getTitle();
+ std::string name2 = tab2->getTitle();
- return (LLStringUtil::compareDict(tab1->getTitle(), tab2->getTitle()) < 0);
+ return (LLStringUtil::compareDict(name1, name2) < 0);
}
struct outfit_accordion_tab_params : public LLInitParam::Block<outfit_accordion_tab_params, LLOutfitAccordionCtrlTab::Params>
@@ -92,9 +80,6 @@ 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))
{
@@ -118,20 +103,11 @@ 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()
@@ -139,25 +115,9 @@ 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)
{
@@ -205,7 +165,6 @@ 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);
@@ -235,9 +194,8 @@ 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));
- // 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);
+ // force showing list items that don't match current filter(EXT-7158)
+ list->setForceShowingUnmatchedItems(true);
// Setting list commit callback to monitor currently selected wearable item.
list->setCommitCallback(boost::bind(&LLOutfitsList::onListSelectionChange, this, _1));
@@ -302,11 +260,13 @@ void LLOutfitsList::onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id)
{
if (mOutfitsMap[prev_id])
{
- ((LLOutfitAccordionCtrlTab*)mOutfitsMap[prev_id])->setOutfitSelected(false);
+ mOutfitsMap[prev_id]->setTitleFontStyle("NORMAL");
+ mOutfitsMap[prev_id]->setTitleColor(LLUIColorTable::instance().getColor("AccordionHeaderTextColor"));
}
if (mOutfitsMap[base_id])
{
- ((LLOutfitAccordionCtrlTab*)mOutfitsMap[base_id])->setOutfitSelected(true);
+ mOutfitsMap[base_id]->setTitleFontStyle("BOLD");
+ mOutfitsMap[base_id]->setTitleColor(LLUIColorTable::instance().getColor("SelectedOutfitTextColor"));
}
}
@@ -364,11 +324,6 @@ void LLOutfitsList::onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid)
}
}
-void LLOutfitListBase::onAction(const LLSD& userdata)
-{
- performAction(userdata.asString());
-}
-
// virtual
bool LLOutfitListBase::isActionEnabled(const LLSD& userdata)
{
@@ -481,12 +436,11 @@ void LLOutfitsList::updateChangedCategoryName(LLViewerInventoryCategory *cat, st
if (outfits_iter != mOutfitsMap.end())
{
// Update tab name with the new category name.
- LLOutfitAccordionCtrlTab* tab = (LLOutfitAccordionCtrlTab*) outfits_iter->second;
+ LLAccordionCtrlTab* tab = outfits_iter->second;
if (tab)
{
tab->setName(name);
tab->setTitle(name);
- tab->setFavorite(cat->getIsFavorite());
}
}
}
@@ -578,7 +532,7 @@ void LLOutfitsList::onFilterSubStringChanged(const std::string& new_string, cons
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
if (list)
{
- list->setFilterSubString(new_string, true);
+ list->setFilterSubString(new_string, tab->getDisplayChildren());
}
if (old_string.empty())
@@ -795,75 +749,6 @@ 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);
@@ -881,10 +766,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()
@@ -980,10 +865,6 @@ bool LLOutfitListBase::isOutfitFolder(LLViewerInventoryCategory* cat) const
void LLOutfitListBase::refreshList(const LLUUID& category_id)
{
- if (LLAppViewer::instance()->quitRequested())
- {
- return;
- }
bool wasNull = mRefreshListState.CategoryUUID.isNull();
mRefreshListState.CategoryUUID.setNull();
@@ -1042,18 +923,8 @@ void LLOutfitListBase::onIdle(void* userdata)
void LLOutfitListBase::onIdleRefreshList()
{
- 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;
F64 curent_time = LLTimer::getTotalSeconds();
@@ -1195,6 +1066,12 @@ 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;
}
@@ -1208,20 +1085,6 @@ 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.
@@ -1248,7 +1111,6 @@ 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));
@@ -1299,16 +1161,6 @@ 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;
}
@@ -1333,14 +1185,6 @@ 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())
@@ -1371,13 +1215,14 @@ 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.Favorite", boost::bind(&LLOutfitListGearMenuBase::onFavorite, this));
- registrar.add("Gear.SortByImage", boost::bind(&LLOutfitListGearMenuBase::onChangeSortOrder, this));
+ registrar.add("Gear.SortByName", 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));
@@ -1511,16 +1356,6 @@ 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;
}
@@ -1532,12 +1367,6 @@ 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()
{
@@ -1553,79 +1382,14 @@ 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())
@@ -1651,54 +1415,4 @@ 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 0bf5becb05..fad0e638fb 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -41,7 +41,6 @@
class LLAccordionCtrlTab;
class LLInventoryCategoriesObserver;
class LLOutfitListGearMenuBase;
-class LLOutfitListSortMenuBase;
class LLWearableItemsList;
class LLListContextMenu;
@@ -62,17 +61,6 @@ 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:
@@ -104,7 +92,6 @@ 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;
@@ -122,12 +109,6 @@ 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;
@@ -160,7 +141,6 @@ protected:
selection_change_signal_t mSelectionChangeSignal;
LLListContextMenu* mOutfitMenu;
LLOutfitListGearMenuBase* mGearMenu;
- boost::signals2::connection mGearMenuConnection;
};
//////////////////////////////////////////////////////////////////////////
@@ -177,6 +157,7 @@ protected:
/* virtual */ LLContextMenu* createMenu();
bool onEnable(LLSD::String param);
+
bool onVisible(LLSD::String param);
static void editOutfit();
@@ -184,7 +165,6 @@ 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:
@@ -204,7 +184,6 @@ public:
protected:
virtual void onUpdateItemsVisibility();
virtual void onThumbnail();
- virtual void onFavorite();
virtual void onChangeSortOrder();
const LLUUID& getSelectedOutfitID();
@@ -225,23 +204,6 @@ 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:
@@ -261,16 +223,8 @@ 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),
@@ -278,12 +232,7 @@ public:
{}
friend class LLUICtrlFactory;
- void updateTitleColor();
- void drawFavoriteIcon();
-
LLUUID mFolderID;
- bool mIsFavorite = false;
- bool mIsSelected = false;
};
/**
* @class LLOutfitsList
@@ -302,7 +251,6 @@ public:
virtual ~LLOutfitsList();
/*virtual*/ bool postBuild();
- void initComparator();
/*virtual*/ void onOpen(const LLSD& info);
@@ -341,10 +289,6 @@ public:
/*virtual*/ bool getHasExpandableFolders() { return true; }
- /*virtual*/ void onChangeSortOrder(const LLSD& userdata);
- virtual LLToggleableMenu* getSortMenu();
- void updateMenuItemsVisibility();
-
protected:
LLOutfitListGearMenuBase* createGearMenu();
@@ -415,8 +359,6 @@ private:
static void onOutfitRename(const LLSD& notification, const LLSD& response);
- void handleInvFavColorChange();
-
//LLInventoryCategoriesObserver* mCategoriesObserver;
LLAccordionCtrl* mAccordion;
@@ -434,15 +376,13 @@ private:
// Used to monitor COF changes for updating items worn state. See EXT-8636.
uuid_vec_t mCOFLinkedItems;
- LLOutfitListSortMenu* mSortMenu;
+ //LLOutfitListGearMenu* mGearMenu;
//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 e088c3e6f0..e4d16582de 100644
--- a/indra/newview/llpanelappearancetab.h
+++ b/indra/newview/llpanelappearancetab.h
@@ -29,8 +29,6 @@
#include "llpanel.h"
-class LLToggleableMenu;
-
class LLPanelAppearanceTab : public LLPanel
{
public:
@@ -49,11 +47,6 @@ 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/llpanelface.cpp b/indra/newview/llpanelface.cpp
index eccce1c5ef..5c66f34750 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,6 +543,10 @@ LLPanelFace::~LLPanelFace()
void LLPanelFace::onVisibilityChange(bool new_visibility)
{
+ if (new_visibility)
+ {
+ gAgent.showLatestFeatureNotification("gltf");
+ }
LLPanel::onVisibilityChange(new_visibility);
}
@@ -1394,9 +1459,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());
@@ -1444,13 +1518,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));
@@ -1590,36 +1667,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();
@@ -1627,7 +1725,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()));
@@ -1635,7 +1733,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()));
@@ -1643,6 +1741,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;
@@ -1650,14 +1765,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);
}
}
@@ -1803,6 +1918,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);
@@ -1998,6 +2114,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()
@@ -3648,18 +3765,8 @@ void LLPanelFace::onCommitRepeatsPerMeter()
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
{
@@ -3670,18 +3777,10 @@ void LLPanelFace::onCommitRepeatsPerMeter()
LLSelectMgr::getInstance()->selectionTexScaleAutofit(repeats_per_meter);
break;
case MATTYPE_NORMAL:
- mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter);
- mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter);
-
- LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter);
+ LLSelectedTEMaterial::selectionNormalScaleAutofit(this, repeats_per_meter);
break;
case MATTYPE_SPECULAR:
- mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter);
- mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter);
-
- LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter);
+ LLSelectedTEMaterial::selectionSpecularScaleAutofit(this, repeats_per_meter);
break;
default:
llassert(false);
@@ -3692,6 +3791,21 @@ void LLPanelFace::onCommitRepeatsPerMeter()
updateUI(true);
}
+// Commit the number of GLTF repeats per meter
+void LLPanelFace::onCommitGLTFRepeatsPerMeter()
+{
+ F32 repeats_per_meter = (F32)mPBRRepeat->getValue().asReal();
+
+ LLGLTFMaterial::TextureInfo material_type = getPBRTextureInfo();
+ updateGLTFTextureTransformWithScale(material_type, [&](LLGLTFMaterial::TextureTransform* new_transform, F32 scale_s, F32 scale_t)
+ {
+ new_transform->mScale.mV[VX] = scale_s * repeats_per_meter;
+ new_transform->mScale.mV[VY] = scale_t * repeats_per_meter;
+ });
+
+ updateUI(true);
+}
+
struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
{
virtual bool apply(LLViewerObject* object, S32 te)
@@ -4791,6 +4905,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();
@@ -4866,8 +5003,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]);
@@ -4877,6 +5015,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()
@@ -5370,6 +5514,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 ce3dd8bdea..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();
@@ -361,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 };
@@ -554,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();
@@ -649,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 bc7b5caddf..4a370525ff 100644
--- a/indra/newview/llpanelgroupcreate.cpp
+++ b/indra/newview/llpanelgroupcreate.cpp
@@ -85,7 +85,6 @@ 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 38ae818910..0c331b4cec 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -211,7 +211,6 @@ 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/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 3083bffdd4..44465cbc33 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -68,7 +68,6 @@ 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");
@@ -79,9 +78,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();
@@ -91,17 +90,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 };
};
///----------------------------------------------------------------------------
@@ -197,17 +214,6 @@ 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)
{
@@ -572,8 +578,7 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata)
}
else
{
- selectAllItemsPanel();
- menu_create_inventory_item(mAllItemsPanel, NULL, userdata);
+ menu_create_inventory_item(getPanel(), NULL, userdata);
}
}
@@ -747,7 +752,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();
@@ -756,9 +760,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
@@ -1158,36 +1162,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.
@@ -1203,11 +1224,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);
}
}
}
@@ -1236,29 +1257,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()
@@ -1266,80 +1286,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;
@@ -1457,65 +1477,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 23e6a9fbcf..0a3a2e753a 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -2267,21 +2267,19 @@ void LLPanelObject::onCopyParams()
if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
{
LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- if (sculpt_params)
- {
- 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();
+ 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();
}
}
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index f90d6d5b3f..ef7986603b 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -129,7 +129,6 @@ 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();
@@ -1365,23 +1364,7 @@ bool LLPanelObjectInventory::postBuild()
void LLPanelObjectInventory::doToSelected(const LLSD& userdata)
{
- 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);
- }
+ LLInventoryAction::doToSelected(&gInventory, mFolders, userdata.asString());
}
void LLPanelObjectInventory::clearContents()
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index a9e860d2ef..4cd4afaa5a 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -404,9 +404,7 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
mWearableListManager(NULL),
mPlusBtn(NULL),
mWearablesGearMenuBtn(NULL),
- mGearMenuBtn(NULL),
- mStatus(NULL),
- mCurrentOutfitName(NULL)
+ mGearMenuBtn(NULL)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(false);
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index e2e2cf1a61..47c02793a3 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -33,7 +33,6 @@
#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
-#include "llmenubutton.h"
#include "llnotificationsutil.h"
#include "lloutfitgallery.h"
#include "lloutfitobserver.h"
@@ -54,17 +53,12 @@ static const std::string SAVE_BTN("save_btn");
static LLPanelInjector<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
-LLPanelOutfitsInventory::LLPanelOutfitsInventory()
- : mMyOutfitsPanel(nullptr)
- , mCurrentOutfitPanel(nullptr)
- , mActivePanel(nullptr)
- , mAppearanceTabs(nullptr)
- , mInitialized(false)
- , mGearMenu(nullptr)
- , mSortMenu(nullptr)
- , mTrashBtn(nullptr)
- , mSortMenuPanel(nullptr)
- , mTrashMenuPanel(nullptr)
+LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
+ mMyOutfitsPanel(NULL),
+ mCurrentOutfitPanel(NULL),
+ mActivePanel(NULL),
+ mAppearanceTabs(NULL),
+ mInitialized(false)
{
gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this));
gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoading, this));
@@ -81,9 +75,6 @@ LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
{
gSavedSettings.setS32("LastAppearanceTab", mAppearanceTabs->getCurrentPanelIndex());
}
- mGearMenuConnection.disconnect();
- mSortMenuConnection.disconnect();
- mTrashMenuConnection.disconnect();
}
// virtual
@@ -267,22 +258,6 @@ 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");
@@ -309,14 +284,6 @@ void LLPanelOutfitsInventory::onTrashButtonClick()
}
}
-void LLPanelOutfitsInventory::onGearMouseDown()
-{
- if (mActivePanel)
- {
- mActivePanel->updateMenuItemsVisibility();
- }
-}
-
bool LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
{
return mActivePanel && mActivePanel->isActionEnabled(userdata);
@@ -353,28 +320,6 @@ 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 29f7eb44f7..e046681e95 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -30,13 +30,11 @@
#include "llpanel.h"
-class LLButton;
class LLOutfitGallery;
class LLOutfitsList;
class LLOutfitListGearMenuBase;
class LLPanelAppearanceTab;
class LLPanelWearing;
-class LLMenuButton;
class LLMenuGL;
class LLSidepanelAppearance;
class LLTabContainer;
@@ -65,13 +63,6 @@ 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();
@@ -101,29 +92,20 @@ 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/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 6966cb38ab..04b8af49c1 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -351,10 +351,7 @@ 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 891896076a..0ce9ef7a7a 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::onCommitSalePrice, this);
+ childSetCommitCallback("Edit Cost", LLPanelPermissions::onCommitSaleInfo, this);
childSetCommitCallback("checkbox next owner can modify",LLPanelPermissions::onCommitNextOwnerModify,this);
childSetCommitCallback("checkbox next owner can copy",LLPanelPermissions::onCommitNextOwnerCopy,this);
@@ -781,9 +781,7 @@ void LLPanelPermissions::refresh()
if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER))
{
- 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);
+ getChildView("checkbox for sale")->setEnabled(can_transfer || (!can_transfer && num_for_sale));
// 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);
@@ -1177,6 +1175,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();
@@ -1225,16 +1224,6 @@ 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 12e88361c9..77129434ed 100644
--- a/indra/newview/llpanelpermissions.h
+++ b/indra/newview/llpanelpermissions.h
@@ -77,7 +77,6 @@ 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/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 578bc5b9a7..1fa1c9587f 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -2071,7 +2071,6 @@ 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/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/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index 3aedde74c6..c1534c9abd 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -113,7 +113,6 @@ 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);
@@ -126,8 +125,6 @@ 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)
@@ -140,9 +137,6 @@ protected:
continue;
}
- LLUUID linked_id = item->getLinkedUUID();
- LLViewerInventoryItem* linked_item = gInventory.getItem(linked_id);
-
LLAssetType::EType type = item->getType();
if (type == LLAssetType::AT_CLOTHING)
{
@@ -156,8 +150,6 @@ protected:
{
attachments_selected = true;
}
- can_favorite |= !linked_item->getIsFavorite();
- can_unfavorite |= linked_item->getIsFavorite();
}
// Enable/disable some menu items depending on the selection.
@@ -174,8 +166,6 @@ 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);
}
};
@@ -242,10 +232,6 @@ LLPanelWearing::~LLPanelWearing()
{
mAttachmentsChangedConnection.disconnect();
}
- if (mGearMenuConnection.connected())
- {
- mGearMenuConnection.disconnect();
- }
}
bool LLPanelWearing::postBuild()
@@ -263,6 +249,10 @@ 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;
}
@@ -570,16 +560,6 @@ 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 aa80a3fc21..ea0787d0ef 100644
--- a/indra/newview/llpanelwearing.h
+++ b/indra/newview/llpanelwearing.h
@@ -84,11 +84,6 @@ 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);
@@ -98,7 +93,6 @@ private:
LLWearableItemsList* mCOFItemsList;
LLScrollListCtrl* mTempItemsList;
LLWearingGearMenu* mGearMenu;
- boost::signals2::connection mGearMenuConnection;
LLListContextMenu* mContextMenu;
LLListContextMenu* mAttachmentsMenu;
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..a818793550 100644
--- a/indra/newview/llreflectionmap.h
+++ b/indra/newview/llreflectionmap.h
@@ -124,7 +124,7 @@ public:
LLSpatialGroup* mGroup = nullptr;
// viewer object this probe is tracking (if any)
- LLViewerObject* mViewerObject = nullptr;
+ LLPointer<LLViewerObject> mViewerObject = nullptr;
// 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..c1815ad57e 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -1156,7 +1156,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);
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 1948bba4be..8286054787 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -252,7 +252,6 @@ LLSelectMgr::LLSelectMgr()
LLSelectMgr::~LLSelectMgr()
{
clearSelections();
- mSlectionLodModChangedConnection.disconnect();
}
void LLSelectMgr::clearSelections()
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 11aad3b806..792a37297f 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -943,7 +943,6 @@ private:
bool mForceSelection;
std::vector<LLAnimPauseRequest> mPauseRequests;
- boost::signals2::connection mSlectionLodModChangedConnection;
};
// *DEPRECATED: For callbacks or observers, use
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 1d1b31d2a6..c618483fc4 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -40,7 +40,6 @@
#include "llfloaterworldmap.h"
#include "llfolderviewmodel.h"
#include "llloadingindicator.h"
-#include "llmenubutton.h"
#include "lloutfitobserver.h"
#include "llpaneleditwearable.h"
#include "llpaneloutfitsinventory.h"
@@ -146,14 +145,6 @@ 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 3d4b4fb9c1..fccf745a74 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -56,8 +56,6 @@
#include "llviewerregion.h"
-const char* const DEFAULT_DESC = "(No Description)";
-
class PropertiesChangedCallback : public LLInventoryCallback
{
public:
@@ -130,7 +128,6 @@ 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);
@@ -161,11 +158,10 @@ 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));
- mLabelItemDesc->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
+ getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
// Thumnail edition
mChangeThumbnailBtn->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onEditThumbnail, this));
// acquired date
@@ -927,22 +923,17 @@ void LLSidepanelItemInfo::onCommitDescription()
LLViewerInventoryItem* item = findItem();
if(!item) return;
- if(!mLabelItemDesc)
- {
- return;
- }
- if (!gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))
+ LLTextEditor* labelItemDesc = getChild<LLTextEditor>("LabelItemDesc");
+ if(!labelItemDesc)
{
return;
}
- std::string old_desc = item->getDescription();
- std::string new_desc = mLabelItemDesc->getText();
- if(old_desc != new_desc)
+ if((item->getDescription() != labelItemDesc->getText()) &&
+ (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)))
{
- mLabelItemDesc->setSelectAllOnFocusReceived(false);
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- new_item->setDescription(new_desc);
+ new_item->setDescription(labelItemDesc->getText());
onCommitChanges(new_item);
}
}
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
index 0895d3360c..718edc79d6 100644
--- a/indra/newview/llsidepaneliteminfo.h
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -46,7 +46,6 @@ class LLObjectInventoryObserver;
class LLViewerObject;
class LLPermissions;
class LLTextBox;
-class LLTextEditor;
class LLSidepanelItemInfo : public LLPanel, public LLInventoryObserver
{
@@ -106,7 +105,6 @@ private:
LLIconCtrl* mItemTypeIcon;
LLTextBox* mLabelOwnerName;
LLTextBox* mLabelCreatorName;
- LLTextEditor* mLabelItemDesc;
//
// UI Elements
diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
index afa4686d52..47f58afa00 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->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;
+ 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;
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/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 9b6a87e68d..68b4ab381a 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -1068,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, LLUUID::null, !outfit_snapshot));
+ expected_upload_cost, !outfit_snapshot));
upload_new_resource(assetUploadInfo);
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 858c7b6656..834b99555e 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -217,6 +217,11 @@
#include "fsfloatersearch.h"
+#ifdef LL_DISCORD
+#define DISCORDPP_IMPLEMENTATION
+#include <discordpp.h>
+static std::shared_ptr<discordpp::Client> gDiscordClient;
+#endif
//
// exported globals
@@ -752,6 +757,17 @@ bool idle_startup()
LL_WARNS("AppInit") << "Unreliable timers detected (may be bad PCI chipset)!!" << LL_ENDL;
}
+#ifdef LL_DISCORD
+ gDiscordClient = std::make_shared<discordpp::Client>();
+ gDiscordClient->SetStatusChangedCallback([](discordpp::Client::Status status, discordpp::Client::Error, int32_t) {
+ if (status == discordpp::Client::Status::Ready) {
+ discordpp::Activity activity;
+ activity.SetType(discordpp::ActivityTypes::Playing);
+ gDiscordClient->UpdateRichPresence(activity, [](discordpp::ClientResult) {});
+ }
+ });
+#endif
+
//
// Log on to system
//
@@ -2133,9 +2149,6 @@ bool idle_startup()
do_startup_frame();
- // We're successfully logged in.
- gSavedSettings.setBOOL("FirstLoginThisInstall", false);
-
LLFloaterReg::showInitialVisibleInstances();
LLFloaterGridStatus::getInstance()->startGridStatusTimer();
@@ -2481,6 +2494,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;
}
@@ -3413,6 +3447,35 @@ bool LLStartUp::startLLProxy()
return proxy_ok;
}
+#ifdef LL_DISCORD
+
+void LLStartUp::runDiscordCallbacks()
+{
+ discordpp::RunCallbacks();
+}
+
+void LLStartUp::handleDiscordSocial()
+{
+ static const uint64_t DISCORD_APPLICATION_ID = 1393451183741599796;
+ discordpp::AuthorizationArgs discordAuthArgs{};
+ discordAuthArgs.SetClientId(DISCORD_APPLICATION_ID);
+ discordAuthArgs.SetScopes(discordpp::Client::GetDefaultPresenceScopes());
+ auto discordCodeVerifier = gDiscordClient->CreateAuthorizationCodeVerifier();
+ discordAuthArgs.SetCodeChallenge(discordCodeVerifier.Challenge());
+ gDiscordClient->Authorize(discordAuthArgs, [discordCodeVerifier](auto result, auto code, auto redirectUri) {
+ if (result.Successful()) {
+ gDiscordClient->GetToken(DISCORD_APPLICATION_ID, code, discordCodeVerifier.Verifier(), redirectUri, [](discordpp::ClientResult result, std::string accessToken, std::string, discordpp::AuthorizationTokenType, int32_t, std::string) {
+ gDiscordClient->UpdateToken(discordpp::AuthorizationTokenType::Bearer, accessToken, [](discordpp::ClientResult result) {
+ if (result.Successful())
+ gDiscordClient->Connect();
+ });
+ });
+ }
+ });
+}
+
+#endif
+
bool login_alert_done(const LLSD& notification, const LLSD& response)
{
LLPanelLogin::giveFocus();
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index a827fbc487..cf1d38bb18 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -128,6 +128,12 @@ public:
static bool startLLProxy(); // Initialize the SOCKS 5 proxy
static LLViewerStats::PhaseMap& getPhases() { return *sPhases; }
+
+#ifdef LL_DISCORD
+ static void runDiscordCallbacks();
+ static void handleDiscordSocial();
+#endif
+
private:
friend class LLStartupListener;
static LLSLURL sStartSLURL;
diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h
index 10a104730b..fc72ab7db7 100644
--- a/indra/newview/llsurface.h
+++ b/indra/newview/llsurface.h
@@ -27,7 +27,6 @@
#ifndef LL_LLSURFACE_H
#define LL_LLSURFACE_H
-//#include "vmath.h"
#include "v3math.h"
#include "v3dmath.h"
#include "v4math.h"
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index e02f76711c..dd7c6aa9e3 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -127,12 +127,6 @@ 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/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 2027e958d5..20127f5f27 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -164,6 +164,7 @@ 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,10 +186,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mSetImageAssetIDCallback(NULL),
mOnUpdateImageStatsCallback(NULL),
mBakeTextureEnabled(false),
- mLocalTextureEnabled(false),
mInventoryPickType(pick_type)
{
- setTentative(tentative);
mCanApplyImmediately = can_apply_immediately;
buildFromFile("floater_texture_ctrl.xml");
setCanMinimize(false);
@@ -200,7 +199,7 @@ LLFloaterTexturePicker::~LLFloaterTexturePicker()
void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selection /*=true*/)
{
- if( ((mImageAssetID != image_id) || getTentative()) && mActive)
+ if( ((mImageAssetID != image_id) || mTentative) && mActive)
{
mNoCopyTextureSelected = false;
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
@@ -278,7 +277,6 @@ 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 )
@@ -527,8 +525,6 @@ 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();
@@ -659,7 +655,7 @@ void LLFloaterTexturePicker::draw()
bool valid_dims = updateImageStats();
// if we're inactive, gray out "apply immediate" checkbox
- mSelectBtn->setEnabled(mActive && mCanApply && valid_dims && !getTentative());
+ mSelectBtn->setEnabled(mActive && mCanApply && valid_dims);
mPipetteBtn->setEnabled(mActive);
mPipetteBtn->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
@@ -724,9 +720,9 @@ void LLFloaterTexturePicker::draw()
mTentativeLabel->setVisible( false );
}
- mDefaultBtn->setEnabled(mImageAssetID != mDefaultImageAssetID || getTentative());
- mBlankBtn->setEnabled((mImageAssetID != mBlankImageAssetID && mBlankImageAssetID.notNull()) || getTentative());
- mNoneBtn->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || getTentative()));
+ mDefaultBtn->setEnabled(mImageAssetID != mDefaultImageAssetID || mTentative);
+ mBlankBtn->setEnabled((mImageAssetID != mBlankImageAssetID && mBlankImageAssetID.notNull()) || mTentative);
+ mNoneBtn->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || mTentative));
LLFloater::draw();
@@ -779,7 +775,7 @@ void LLFloaterTexturePicker::draw()
}
// Draw Tentative Label over the image
- if( getTentative() && !mViewModel->isDirty() )
+ if( mTentative && !mViewModel->isDirty() )
{
mTentativeLabel->setVisible( true );
drawChild(mTentativeLabel);
@@ -982,7 +978,6 @@ void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata)
if (self->mOwner)
{
self->setImageID( self->getDefaultImageAssetID() );
- self->setTentative(false);
}
self->commitIfImmediateSet();
}
@@ -993,7 +988,6 @@ void LLFloaterTexturePicker::onBtnBlank(void* userdata)
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
self->setCanApply(true, true);
self->setImageID( self->getBlankImageAssetID() );
- self->setTentative(false);
self->commitIfImmediateSet();
}
@@ -1004,10 +998,21 @@ void LLFloaterTexturePicker::onBtnNone(void* userdata)
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
self->setCanApply(true, true);
self->setImageID( LLUUID::null );
- self->setTentative(false);
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)
{
@@ -1214,7 +1219,6 @@ void LLFloaterTexturePicker::onLocalScrollCommit(LLUICtrl* ctrl, void* userdata)
if (self->mSetImageAssetIDCallback)
{
self->mSetImageAssetIDCallback(inworld_id);
- self->setTentative(false);
}
if (self->childGetValue("apply_immediate_check").asBoolean())
@@ -1293,7 +1297,6 @@ 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)
@@ -1314,7 +1317,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 && !getTentative()); // will be updated on draw
+ mSelectBtn->setEnabled(can_apply);
getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview && inworld_image);
getChildRef<LLUICtrl>("apply_immediate_check").setVisible(can_preview);
@@ -1488,13 +1491,7 @@ 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)
@@ -1621,7 +1618,6 @@ void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te )
else
{
setImageID(te.getID());
- setTentative(false);
}
mNoCopyTextureSelected = false;
@@ -1835,17 +1831,6 @@ 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;
@@ -1893,9 +1878,11 @@ 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);
}
@@ -1905,6 +1892,12 @@ 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);
@@ -2084,17 +2077,7 @@ void LLTextureCtrl::setOnTextureSelectedCallback(texture_selected_callback cb)
}
}
-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)
+void LLTextureCtrl::setImageAssetName(const std::string& name)
{
LLPointer<LLUIImage> imagep = LLUI::getUIImage(name);
if(imagep)
@@ -2119,7 +2102,6 @@ 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 79957431b7..df5e763139 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -167,8 +167,6 @@ 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;
@@ -183,7 +181,7 @@ public:
void setAllowNoTexture( bool b ) { mAllowNoTexture = b; }
bool getAllowNoTexture() const { return mAllowNoTexture; }
- void setAllowLocalTexture(bool b);
+ void setAllowLocalTexture(bool b) { mAllowLocalTexture = b; }
bool getAllowLocalTexture() const { return mAllowLocalTexture; }
const LLUUID& getImageItemID() { return mImageItemID; }
@@ -407,6 +405,7 @@ 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;
@@ -457,7 +456,6 @@ 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 cc187a1f98..087761cbd0 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -2484,7 +2484,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 +2496,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 +2538,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,15 +2596,14 @@ 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
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 851d6c11a0..8ab90896dc 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -85,9 +85,8 @@ 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/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp
index b077262f06..ae21d3e733 100644
--- a/indra/newview/llthumbnailctrl.cpp
+++ b/indra/newview/llthumbnailctrl.cpp
@@ -111,9 +111,7 @@ void LLThumbnailCtrl::draw()
gl_draw_scaled_image( draw_rect.mLeft, draw_rect.mBottom, draw_rect.getWidth(), draw_rect.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
- // 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);
+ mTexturep->setKnownDrawSize(draw_rect.getWidth(), draw_rect.getHeight());
}
else if( mImagep.notNull() )
{
@@ -240,8 +238,12 @@ void LLThumbnailCtrl::initImage()
{
// Should it support baked textures?
mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_THUMBNAIL);
+
mTexturep->forceToSaveRawImage(0);
- mTexturep->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE);
+
+ S32 desired_draw_width = MAX_IMAGE_SIZE;
+ S32 desired_draw_height = MAX_IMAGE_SIZE;
+ mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height);
}
}
else if (tvalue.isString())
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 0f871dc1bb..84854a79d4 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);
}
- LLModalDialog::setVisible(show);
+ LLFloater::setVisible(show);
if (mPanel
&& !mPanel->isDead()
&& mWrapperPanel
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 3665ff5e87..ff4fcc2b0b 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -2156,7 +2156,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
{
if(mSource == SOURCE_LIBRARY)
{
- LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0, false));
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0));
copy_inventory_item(
gAgent.getID(),
item->getPermissions().getOwner(),
@@ -2167,7 +2167,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
}
else
{
- rez_attachment(item, 0, false);
+ rez_attachment(item, 0);
}
}
return ACCEPT_YES_SINGLE;
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 8cdc2e94f4..618955c83b 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,134 @@ 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;
+ }
+
+ // Own objects
+ if((FirstClickPref & MEDIA_FIRST_CLICK_OWN) && object->permYouOwner())
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_OWN" << LL_ENDL;
+ return true;
+ }
+ // 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
+ LLPermissions* perms = LLSelectMgr::getInstance()->getHoverNode()->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;
+ }
+
+ // Check if the object is owned by a friend of the agent
+ if(FirstClickPref & MEDIA_FIRST_CLICK_FRIEND)
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_FRIEND. id: " << owner_id << LL_ENDL;
+ return LLAvatarTracker::instance().isBuddy(owner_id);
+ }
+
+ // Check for objects set to or owned by the active group
+ if(FirstClickPref & MEDIA_FIRST_CLICK_GROUP)
+ {
+ // Get our active group
+ LLUUID active_group = gAgent.getGroupID();
+ if(active_group.notNull() && (active_group == group_id || active_group == owner_id))
+ {
+ LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_GROUP.Active group: " << active_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 +1664,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 +1786,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..d9daad9515 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 = ~(3<<30), // 0b00111111111111111111111111111111
+
+ // Covers all media regardless of other rules or PRIM_MEDIA_FIRST_CLICK_INTERACT
+ MEDIA_FIRST_CLICK_BYPASS_MOAP_FLAG = 1 << 30 // 0b01000000000000000000000000000000 (1073741824)
+ };
+ 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 7d5386110d..7ef2c8d697 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -62,8 +62,7 @@ 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,
- const LLUUID& destFolderId, bool showInventory) :
+ U32 groupPerms, U32 everyonePerms, S32 expectedCost, bool showInventory) :
mTransactionId(transactId),
mAssetType(assetType),
mName(name),
@@ -76,7 +75,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId,
mEveryonePerms(everyonePerms),
mExpectedUploadCost(expectedCost),
mShowInventory(showInventory),
- mFolderId(destFolderId),
+ mFolderId(LLUUID::null),
mItemId(LLUUID::null),
mAssetId(LLAssetID::null)
{ }
@@ -85,8 +84,7 @@ 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,
- const LLUUID& destFolderId, bool showInventory) :
+ U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, S32 expectedCost, bool showInventory) :
mName(name),
mDescription(description),
mCompressionInfo(compressionInfo),
@@ -99,7 +97,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(std::string name,
mShowInventory(showInventory),
mTransactionId(),
mAssetType(LLAssetType::AT_NONE),
- mFolderId(destFolderId),
+ mFolderId(LLUUID::null),
mItemId(LLUUID::null),
mAssetId(LLAssetID::null)
{
@@ -308,10 +306,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
@@ -368,12 +366,10 @@ LLNewFileResourceUploadInfo::LLNewFileResourceUploadInfo(
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
- const LLUUID& destFolderId,
bool show_inventory) :
LLResourceUploadInfo(name, description, compressionInfo,
destinationType, inventoryType,
- nextOWnerPerms, groupPerms, everyonePerms, expectedCost,
- destFolderId, show_inventory),
+ nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory),
mFileName(fileName),
mMaxImageSize(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT)
{
@@ -584,13 +580,12 @@ 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, destFolderId, show_inventory)
+ nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory)
, mBuffer(buffer)
, mFinishFn(finish)
, mFailureFn(failure)
diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h
index c627e9dbb8..365436ede0 100644
--- a/indra/newview/llviewerassetupload.h
+++ b/indra/newview/llviewerassetupload.h
@@ -54,7 +54,6 @@ public:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
- const LLUUID &destFolderId = LLUUID::null,
bool showInventory = true);
virtual ~LLResourceUploadInfo()
@@ -105,7 +104,6 @@ protected:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
- const LLUUID& destFolderId = LLUUID::null,
bool showInventory = true);
LLResourceUploadInfo(
@@ -157,7 +155,6 @@ public:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
- const LLUUID &destFolderId = LLUUID::null,
bool show_inventory = true);
virtual LLSD prepareUpload();
@@ -196,7 +193,6 @@ public:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
- const LLUUID& destFolderId, // use null for default
bool show_inventory,
uploadFinish_f finish,
uploadFailure_f failure);
@@ -223,7 +219,6 @@ 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 9828ab1fdf..f2557e299c 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, false); // don't replace if called from an "Attach To..." menu
+ rez_attachment(item, attachmentp); // 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, false));
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, attachmentp));
copy_inventory_item(gAgent.getID(),
item->getPermissions().getOwner(),
item->getUUID(),
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index d915f11e74..9949bae8ac 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -83,16 +83,18 @@ LLViewerCamera::LLViewerCamera() : LLCamera()
}
}
-bool LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVector3 &up_direction, const LLVector3 &point_of_interest)
+void 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 true;
+ return;
}
- LLVector3 last_position = getOrigin();
- LLVector3 last_axis = getAtAxis();
+ LLVector3 last_position;
+ LLVector3 last_axis;
+ last_position = getOrigin();
+ last_axis = getAtAxis();
mLastPointOfInterest = point_of_interest;
@@ -102,49 +104,30 @@ bool LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVecto
regp = gAgent.getRegion();
}
- F32 water_height = regp ? regp->getWaterHeight() : 0.f;
+ F32 water_height = (NULL != 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 (zpos >= water_height)
+ if (origin.mV[2] > water_height)
{
- zpos = water_height + MIN_DIST_TO_WATER;
+ origin.mV[2] = llmax(origin.mV[2], water_height + 0.20f);
}
- else if (zpos > water_height - MIN_DIST_TO_WATER)
+ else
{
- zpos = water_height - MIN_DIST_TO_WATER;
+ origin.mV[2] = llmin(origin.mV[2], water_height - 0.20f);
}
}
- 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);
+ setOriginAndLookAt(origin, up_direction, point_of_interest);
mVelocityDir = origin - last_position ;
F32 dpos = mVelocityDir.normVec() ;
LLQuaternion rotation;
rotation.shortestArc(last_axis, getAtAxis());
- F32 drot, x, y, z;
+ F32 x, y, z;
+ F32 drot;
rotation.getAngleAxis(&drot, &x, &y, &z);
add(sVelocityStat, dpos);
@@ -157,8 +140,6 @@ bool LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVecto
// update pixel meter ratio using default fov, not modified one
mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f)));
// update screen pixel area
-
- return true;
mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));
}
@@ -166,6 +147,7 @@ const LLMatrix4 &LLViewerCamera::getProjection() const
{
calcProjection(getFar());
return mProjectionMatrix;
+
}
const LLMatrix4 &LLViewerCamera::getModelview() const
@@ -178,12 +160,13 @@ const LLMatrix4 &LLViewerCamera::getModelview() const
void LLViewerCamera::calcProjection(const F32 far_distance) const
{
- F32 fov_y = getView();
- F32 z_far = far_distance;
- F32 z_near = getNear();
- F32 aspect = getAspect();
+ F32 fov_y, z_far, z_near, aspect, f;
+ fov_y = getView();
+ z_far = far_distance;
+ z_near = getNear();
+ aspect = getAspect();
- F32 f = 1 / tan(fov_y * 0.5f);
+ f = 1/tan(fov_y*0.5f);
mProjectionMatrix.setZero();
mProjectionMatrix.mMatrix[0][0] = f/aspect;
@@ -289,9 +272,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();
@@ -353,7 +336,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));
@@ -366,7 +349,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));
@@ -374,7 +357,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];
@@ -390,9 +373,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);
}
@@ -406,6 +389,7 @@ 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
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index cb0994be0a..91d26f09f2 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -60,7 +60,7 @@ public:
static eCameraID sCurCameraID;
- bool updateCameraLocation(const LLVector3 &center,
+ void updateCameraLocation(const LLVector3 &center,
const LLVector3 &up_direction,
const LLVector3 &point_of_interest);
@@ -75,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);
@@ -88,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() const { return mLastPointOfInterest; }
+ const LLVector3 &getPointOfInterest() { return mLastPointOfInterest; }
F32 getPixelMeterRatio() const { return mPixelMeterRatio; }
S32 getScreenPixelArea() const { return mScreenPixelArea; }
void setZoomParameters(F32 factor, S16 subregion) { mZoomFactor = factor; mZoomSubregion = subregion; }
- F32 getZoomFactor() const { return mZoomFactor; }
- S16 getZoomSubRegion() const { return mZoomSubregion; }
+ F32 getZoomFactor() { return mZoomFactor; }
+ S16 getZoomSubRegion() { return mZoomSubregion; }
protected:
void calcProjection(const F32 far_distance) const;
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 10fa0fd3cd..6e790e4fca 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,7 +210,8 @@ 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())
{
@@ -237,7 +236,7 @@ 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");
@@ -246,7 +245,7 @@ void display_stats()
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");
@@ -256,7 +255,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");
@@ -572,8 +571,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++;
@@ -796,7 +797,7 @@ 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();
@@ -964,7 +965,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
gPipeline.mRT->deferredScreen.bindTarget();
if (gUseWireframe)
{
- F32 g = 0.5f;
+ constexpr F32 g = 0.5f;
glClearColor(g, g, g, 1.f);
}
else
@@ -983,11 +984,12 @@ 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"))
+ 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
@@ -1201,7 +1203,7 @@ void display_cube_face()
gGL.setColorMask(true, true);
- glClearColor(0, 0, 0, 0);
+ glClearColor(0.f, 0.f, 0.f, 0.f);
gPipeline.generateSunShadow(*LLViewerCamera::getInstance());
glClear(GL_DEPTH_BUFFER_BIT); // | GL_STENCIL_BUFFER_BIT);
@@ -1237,7 +1239,7 @@ void display_cube_face()
}
else
{
- glClearColor(1, 0, 1, 1);
+ glClearColor(1.f, 0.f, 1.f, 1.f);
}
gPipeline.mRT->deferredScreen.clear();
@@ -1278,11 +1280,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();
@@ -1642,10 +1645,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();
}
@@ -1707,7 +1711,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);
@@ -1729,7 +1733,7 @@ void render_ui_2d()
gPipeline.mUIScreen.bindTarget();
gGL.setColorMask(true, true);
{
- static const S32 pad = 8;
+ constexpr S32 pad = 8;
LLView::sDirtyRect.mLeft -= pad;
LLView::sDirtyRect.mRight += pad;
@@ -1782,8 +1786,6 @@ void render_ui_2d()
gViewerWindow->draw();
}
-
-
// reset current origin for font rendering, in case of tiling render
LLFontGL::sCurOrigin.set(0, 0);
}
@@ -1792,7 +1794,7 @@ 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;
@@ -1832,7 +1834,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);
}
@@ -1867,6 +1869,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 89ccf49f14..fed6cd11db 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -38,8 +38,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"
@@ -335,8 +335,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>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 5f61aeaf13..e2022cae37 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -71,9 +71,6 @@
#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&) {}
@@ -754,11 +751,13 @@ S32 LLViewerInventoryCategory::getViewerDescendentCount() const
return descendents_actual;
}
-void LLViewerInventoryCategory::exportLLSD(LLSD & cat_data) const
+LLSD LLViewerInventoryCategory::exportLLSD() const
{
- LLInventoryCategory::exportLLSD(cat_data);
+ LLSD cat_data = LLInventoryCategory::exportLLSD();
cat_data[INV_OWNER_ID] = mOwnerID;
cat_data[INV_VERSION] = mVersion;
+
+ return cat_data;
}
bool LLViewerInventoryCategory::importLLSD(const LLSD& cat_data)
@@ -967,7 +966,7 @@ void LLInventoryCallbackManager::fire(U32 callback_id, const LLUUID& item_id)
}
}
-void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp, bool replace)
+void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp)
{
if (inv_item.isNull())
return;
@@ -975,7 +974,7 @@ void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachme
LLViewerInventoryItem *item = gInventory.getItem(inv_item);
if (item)
{
- rez_attachment(item, attachmentp, replace);
+ rez_attachment(item, attachmentp);
}
}
@@ -1437,8 +1436,7 @@ void update_inventory_category(
if(obj)
{
if (LLFolderType::lookupIsProtectedType(obj->getPreferredType())
- && (updates.size() != 1
- || !(updates.has("thumbnail") || updates.has("favorite"))))
+ && (updates.size() != 1 || !updates.has("thumbnail")))
{
LLNotificationsUtil::add("CannotModifyProtectedCategories");
return;
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 5cd31353f8..21a6606253 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;
- virtual void exportLLSD(LLSD &sd) const;
- virtual bool importLLSD(const LLSD& cat_data);
+ LLSD exportLLSD() const;
+ bool importLLSD(const LLSD& cat_data);
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, bool replace);
+void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp);
void activate_gesture_cb(const LLUUID& inv_item);
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index 9d45ea24b9..7543fb3743 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -881,10 +881,6 @@ void LLViewerJoystick::moveObjects(bool reset)
{
gAgent.clearAFK();
}
- else
- {
- gAwayTriggerTimer.reset();
- }
if (sDelta[0] || sDelta[1] || sDelta[2])
{
@@ -1059,10 +1055,6 @@ void LLViewerJoystick::moveAvatar(bool reset)
{
gAgent.clearAFK();
}
- else
- {
- gAwayTriggerTimer.reset();
- }
setCameraNeedsUpdate(true);
}
@@ -1275,17 +1267,10 @@ void LLViewerJoystick::moveFlycam(bool reset)
}
// Clear AFK state if moved beyond the deadzone
- if (!is_zero)
- {
- if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
+ if (!is_zero && gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
}
- else
- {
- gAwayTriggerTimer.reset();
- }
- }
sFlycamPosition += LLVector3(sDelta) * sFlycamRotation;
@@ -1346,10 +1331,6 @@ 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..ce8ce791b9 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -397,7 +397,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;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index a6b05381bb..73fda339b5 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -90,7 +90,6 @@
#include "lltoolface.h"
#include "llhints.h"
#include "llhudeffecttrail.h"
-#include "llhudeffectresetskeleton.h"
#include "llhudmanager.h"
#include "llimview.h"
#include "llinventorybridge.h"
@@ -296,6 +295,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();
@@ -1853,6 +1853,7 @@ 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(LLStringUtil::null);
+ avatar->dumpArchetypeXML(emptyname);
}
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)
@@ -4506,7 +4516,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,38 +5657,6 @@ 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
{
@@ -6705,18 +6683,8 @@ 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;
}
};
@@ -6739,18 +6707,8 @@ 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;
}
};
@@ -6777,24 +6735,11 @@ class LLAvatarResetSelfSkeletonAndAnimations : 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);
- }
+ avatar->resetSkeleton(true);
}
else
{
- LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true);
- effectp->setSourceObject(gAgentAvatarp);
- effectp->setTargetObject(gAgentAvatarp);
- effectp->setResetAnimations(true);
+ gAgentAvatarp->resetSkeleton(true);
}
return true;
}
@@ -7765,6 +7710,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;
@@ -8640,36 +8586,6 @@ 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)
@@ -8908,6 +8824,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)
@@ -9036,6 +8957,13 @@ void handle_report_bug(const LLSD& param)
LLWeb::loadURLExternal(url);
}
+#ifdef LL_DISCORD
+void handle_discord_social(const LLSD& param)
+{
+ LLStartUp::handleDiscordSocial();
+}
+#endif
+
void handle_buy_currency_test()
{
std::string url =
@@ -9904,7 +9832,6 @@ 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");
@@ -9937,7 +9864,6 @@ 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
@@ -10016,6 +9942,9 @@ void initialize_menus()
commit.add("Advanced.WebContentTest", boost::bind(&handle_web_content_test, _2)); // this one opens the Web Content floater
commit.add("Advanced.ShowURL", boost::bind(&handle_show_url, _2));
commit.add("Advanced.ReportBug", boost::bind(&handle_report_bug, _2));
+#ifdef LL_DISCORD
+ commit.add("Advanced.DiscordSocial", boost::bind(&handle_discord_social, _2));
+#endif
view_listener_t::addMenu(new LLAdvancedBuyCurrencyTest(), "Advanced.BuyCurrencyTest");
view_listener_t::addMenu(new LLAdvancedDumpSelectMgr(), "Advanced.DumpSelectMgr");
view_listener_t::addMenu(new LLAdvancedDumpInventory(), "Advanced.DumpInventory");
@@ -10115,6 +10044,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/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 15f8a6e6f1..84195997c3 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -94,7 +94,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,19 +478,13 @@ const bool check_file_extension(const std::string& filename, LLFilePicker::ELoad
return true;
}
-void upload_single_file(
- const std::vector<std::string>& filenames,
- LLFilePicker::ELoadFilter type,
- const LLUUID& dest)
+const void upload_single_file(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type)
{
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
@@ -505,12 +499,12 @@ void upload_single_file(
}
else
{
- LLFloaterReg::showInstance("upload_sound", args);
+ LLFloaterReg::showInstance("upload_sound", LLSD(filename));
}
}
if (type == LLFilePicker::FFLOAD_IMAGE)
{
- LLFloaterReg::showInstance("upload_image", args);
+ LLFloaterReg::showInstance("upload_image", LLSD(filename));
}
if (type == LLFilePicker::FFLOAD_ANIM)
{
@@ -518,11 +512,11 @@ void upload_single_file(
LLStringUtil::toLower(filename_lc);
if (filename_lc.rfind(".anim") != std::string::npos)
{
- LLFloaterReg::showInstance("upload_anim_anim", args);
+ LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
}
else
{
- LLFloaterReg::showInstance("upload_anim_bvh", args);
+ LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
}
}
}
@@ -715,7 +709,7 @@ bool get_bulk_upload_expected_cost(
return file_count > 0;
}
-void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_2k, const LLUUID& dest)
+const void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_2k)
{
S32 expected_upload_cost;
S32 expected_upload_count;
@@ -727,7 +721,6 @@ void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_
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)
@@ -761,7 +754,7 @@ void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_
}
-void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k, const LLUUID& dest)
+const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k)
{
// TODO:
// Check user balance for entire cost
@@ -783,7 +776,7 @@ void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadF
filtered_filenames.push_back(filename);
}
}
- upload_bulk(filtered_filenames, allow_2k, dest);
+ upload_bulk(filtered_filenames, allow_2k);
}
class LLFileUploadImage : public view_listener_t
@@ -794,7 +787,7 @@ class LLFileUploadImage : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_IMAGE, false);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_IMAGE, false);
return true;
}
};
@@ -825,7 +818,7 @@ class LLFileUploadSound : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_WAV, false);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_WAV, false);
return true;
}
};
@@ -838,7 +831,7 @@ class LLFileUploadAnim : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_ANIM, false);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_ANIM, false);
return true;
}
};
@@ -851,7 +844,7 @@ class LLFileUploadBulk : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true, LLUUID::null), LLFilePicker::FFLOAD_ALL, true);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true), LLFilePicker::FFLOAD_ALL, true);
return true;
}
};
@@ -1141,7 +1134,7 @@ LLUUID upload_new_resource(
name, desc, compression_info,
destination_folder_type, inv_type,
next_owner_perms, group_perms, everyone_perms,
- expected_upload_cost, LLUUID::null, show_inventory));
+ expected_upload_cost, show_inventory));
upload_new_resource(uploadInfo, callback, userdata);
return LLUUID::null;
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 8f7df48a2e..d99f9dc4c6 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -74,17 +74,6 @@ 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 b35be7d385..47d7d42bf7 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4212,6 +4212,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)
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 9e77b40a45..d64c0aa0d5 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)
@@ -4184,11 +4185,8 @@ void LLViewerObject::boostTexturePriority(bool boost_children /* = true */)
if (isSculpted() && !isMesh())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- 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);
- }
+ 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)
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 2b52ea2076..972f8cf846 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -974,10 +974,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/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index da03d3b015..e36ad0e722 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,8 +803,8 @@ 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;
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 b9f52e11aa..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"
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 244e2b7835..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
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index ad503cbac7..cf0cf2a6a9 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -220,7 +220,20 @@ 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::EventStatHandle<LLUnit<F64, LLUnits::Meters> > AGENT_POSITION_SNAP("agentpositionsnap", "agent position corrections");
@@ -264,16 +277,105 @@ 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);
+
+ 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);
+
+ 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;
}
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 8aed1c537e..4ec7c6dfac 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -275,6 +275,17 @@ private:
LLTrace::Recording mRecording;
F64Seconds mLastTimeDiff; // used for time stat updates
+ F64Seconds mTotalFrametimeJitter;
+
+ U32 mFrameJitterEvents;
+ U32 mFrameJitterEventsLastMinute;
+ U32 mEventMinutes;
+ 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
};
static const F32 SEND_STATS_PERIOD = 300.0f;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 5ba0a86e68..4a9dd1c1b6 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1107,7 +1107,6 @@ void LLViewerFetchedTexture::init(bool firstinit)
mOrigHeight = 0;
mHasAux = false;
mNeedsAux = false;
- mLastWorkerDiscardLevel = -1;
mRequestedDiscardLevel = -1;
mRequestedDownloadPriority = 0.f;
mFullyLoaded = false;
@@ -1260,11 +1259,12 @@ void LLViewerFetchedTexture::loadFromFastCache()
if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL)
{
- if (mRawImage && (mRawImage->getWidth() > DEFAULT_THUMBNAIL_DIMENSIONS || mRawImage->getHeight() > DEFAULT_THUMBNAIL_DIMENSIONS))
+ 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))
{
- // Scale oversized thumbnail
- // thumbnails aren't supposed to go over DEFAULT_THUMBNAIL_DIMENSIONS
- mRawImage->scale(DEFAULT_THUMBNAIL_DIMENSIONS, DEFAULT_THUMBNAIL_DIMENSIONS);
+ // scale oversized icon, no need to give more work to gl
+ mRawImage->scale(expected_width, expected_height);
}
}
@@ -1957,9 +1957,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 +1994,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 +2019,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 +2035,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 +2046,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 +2062,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 +2103,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);
@@ -2121,19 +2121,18 @@ 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)
{
@@ -2147,7 +2146,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--;
@@ -2771,9 +2770,11 @@ void LLViewerFetchedTexture::saveRawImage()
}
else if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL)
{
- if (mRawImage->getWidth() > DEFAULT_THUMBNAIL_DIMENSIONS || mRawImage->getHeight() > DEFAULT_THUMBNAIL_DIMENSIONS)
+ 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)
{
- mSavedRawImage = new LLImageRaw(DEFAULT_THUMBNAIL_DIMENSIONS, DEFAULT_THUMBNAIL_DIMENSIONS, mRawImage->getComponents());
+ mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents());
mSavedRawImage->copyScaled(mRawImage);
}
else
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index f9311d85cb..e1582c74bd 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -444,7 +444,6 @@ 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 f174e16624..7e14c621ad 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)
@@ -1205,6 +1207,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 +1320,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;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index be8ef044e7..a2e77e9257 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1424,17 +1424,11 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask
mWindow->showCursorFromMouseMove();
- if (!gDisconnected)
- {
- if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME
+ && !gDisconnected)
{
gAgent.clearAFK();
}
- else
- {
- gAwayTriggerTimer.reset();
- }
- }
}
void LLViewerWindow::handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask)
@@ -1553,10 +1547,6 @@ 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
@@ -2303,13 +2293,13 @@ void LLViewerWindow::initWorldUI()
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)
+ LLMediaCtrl* avatar_welcome_pack = LLFloaterReg::getInstance("avatar_welcome_pack")->findChild<LLMediaCtrl>("avatar_picker_contents");
+ if (avatar_welcome_pack)
{
- avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- std::string url = gSavedSettings.getString("AvatarPickerURL");
+ avatar_welcome_pack->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("AvatarWelcomePack");
url = LLWeb::expandURLSubstitutions(url, LLSD());
- avatar_picker->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+ avatar_welcome_pack->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
}
}
}
@@ -3027,8 +3017,7 @@ bool LLViewerWindow::handleKey(KEY key, MASK mask)
{
if ((focusedFloaterName == "nearby_chat") || (focusedFloaterName == "im_container") || (focusedFloaterName == "impanel"))
{
- LLCachedControl<bool> key_move(gSavedSettings, "ArrowKeysAlwaysMove");
- if (key_move())
+ if (gSavedSettings.getBOOL("ArrowKeysAlwaysMove"))
{
// let Control-Up and Control-Down through for chat line history,
if (!(key == KEY_UP && mask == MASK_CONTROL)
@@ -3042,9 +3031,10 @@ bool LLViewerWindow::handleKey(KEY key, MASK mask)
case KEY_RIGHT:
case KEY_UP:
case KEY_DOWN:
- case KEY_PAGE_UP: //jump
- case KEY_PAGE_DOWN: // down
- case KEY_HOME: // toggle fly
+ case KEY_PAGE_UP:
+ case KEY_PAGE_DOWN:
+ case KEY_HOME:
+ case KEY_END:
// when chatbar is empty or ArrowKeysAlwaysMove set,
// pass arrow keys on to avatar...
return false;
@@ -3858,7 +3848,7 @@ void LLViewerWindow::updateLayout()
void LLViewerWindow::updateMouseDelta()
{
-#if LL_WINDOWS
+#if LL_WINDOWS && !LL_SDL
LLCoordCommon delta;
mWindow->getCursorDelta(&delta);
S32 dx = delta.mX;
@@ -4792,7 +4782,18 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
#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;
@@ -4801,7 +4802,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;
@@ -4818,6 +4818,8 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
LLNotificationsUtil::add("SnapshotToComputerFailed", args);
failure_cb();
+
+ // Shouldn't there be a return here?
}
// Look for an unused file name
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 14ed202b0c..7928c50807 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -576,7 +576,7 @@ private:
// joint states to be animated
//-------------------------------------------------------------------------
LLPointer<LLJointState> mPelvisState;
- LLCharacter* mCharacter;
+ LLCharacter* mCharacter;
};
/**
@@ -684,7 +684,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mPreviousFullyLoaded(false),
mFullyLoadedInitialized(false),
mLastCloudAttachmentCount(-1),
- mFullyLoadedFrameCounter(0),
mVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
mLoadedCallbacksPaused(false),
mLoadedCallbackTextures(0),
@@ -778,9 +777,11 @@ std::string LLVOAvatar::avString() const
{
return " " + getFullname() + " ";
}
-
- std::string status = LLVOAvatar::rezStatusToString(getRezzedStatus());
- return " Avatar '" + getDebugName() + "' " + status + " ";
+ else
+ {
+ std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus());
+ return " Avatar '" + getFullname() + "' " + viz_string + " ";
+ }
}
void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string comment)
@@ -803,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);
}
}
@@ -834,14 +835,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;
@@ -983,7 +984,7 @@ bool LLVOAvatar::areAllNearbyInstancesBaked(S32& grey_avatars)
++grey_avatars;
}
}
- return grey_avatars == 0;
+ return !grey_avatars;
}
// static
@@ -1190,7 +1191,7 @@ void LLVOAvatar::initClass()
LLControlAvatar::sRegionChangedSlot = gAgent.addRegionChangedCallback(&LLControlAvatar::onRegionChanged);
- sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.j2c");
+ sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.png");
}
@@ -3009,7 +3010,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
if (LLVOAvatar::sJointDebug)
{
- LL_INFOS() << getDebugName() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << LL_ENDL;
+ LL_INFOS() << getFullname() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << LL_ENDL;
}
LLJoint::sNumUpdates = 0;
@@ -3229,17 +3230,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());
@@ -3247,7 +3248,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());
@@ -4334,8 +4335,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;
@@ -4345,14 +4346,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;
}
@@ -4361,7 +4362,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;
}
@@ -6210,11 +6211,8 @@ void LLVOAvatar::resetAnimations()
flushAllMotions();
}
-//-----------------------------------------------------------------------------
-// remapMotionID()
-// Override selectively based on avatar sex and whether we're using new animations.
-//-----------------------------------------------------------------------------
-// virtual
+// Override selectively based on avatar sex and whether we're using new
+// animations.
LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
{
static LLCachedControl<bool> use_new_walk_run(gSavedSettings, "UseNewWalkRun");
@@ -6264,6 +6262,7 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
}
return result;
+
}
//-----------------------------------------------------------------------------
@@ -6271,7 +6270,6 @@ 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;
@@ -6294,7 +6292,6 @@ 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;
@@ -6334,7 +6331,6 @@ void LLVOAvatar::stopMotionFromSource(const LLUUID& source_id)
//-----------------------------------------------------------------------------
// addDebugText()
//-----------------------------------------------------------------------------
-// virtual
void LLVOAvatar::addDebugText(const std::string& text)
{
mDebugText.append(1, '\n');
@@ -6342,22 +6338,8 @@ 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;
@@ -6367,14 +6349,13 @@ const LLUUID& LLVOAvatar::getID() const
// getJoint()
//-----------------------------------------------------------------------------
// RN: avatar joints are multi-rooted to include screen-based attachments
-// virtual
-LLJoint *LLVOAvatar::getJoint( const std::string &name )
+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())
{
@@ -6391,7 +6372,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
@@ -6493,7 +6474,6 @@ 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);
@@ -6524,7 +6504,6 @@ void LLVOAvatar::clearAttachmentOverrides()
//-----------------------------------------------------------------------------
void LLVOAvatar::rebuildAttachmentOverrides()
{
-
LL_DEBUGS("AnimatedObjects") << "rebuilding" << LL_ENDL;
clearAttachmentOverrides();
@@ -6573,7 +6552,6 @@ void LLVOAvatar::rebuildAttachmentOverrides()
// -----------------------------------------------------------------------------
void LLVOAvatar::updateAttachmentOverrides()
{
-
LL_DEBUGS("AnimatedObjects") << "updating" << LL_ENDL;
std::set<LLUUID> meshes_seen;
@@ -6649,11 +6627,11 @@ void LLVOAvatar::updateAttachmentOverrides()
}
}
pelvis_fixups = mPelvisFixups;
- //dumpArchetypeXML(getDebugName() + "_paranoid_updated");
+ //dumpArchetypeXML(getFullname() + "_paranoid_updated");
// Rebuild and compare
rebuildAttachmentOverrides();
- //dumpArchetypeXML(getDebugName() + "_paranoid_rebuilt");
+ //dumpArchetypeXML(getFullname() + "_paranoid_rebuilt");
bool mismatched = false;
for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++)
{
@@ -6882,22 +6860,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() << avString() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL;
+ LL_INFOS() << getFullname() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL;
}
else
{
- LL_DEBUGS("Avatar") << avString() << " no attachment positions defined for any joints" << "\n" << LL_ENDL;
+ LL_DEBUGS("Avatar") << getFullname() << " 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() << getDebugName() << " attachment scales defined for joints: " << ss.str() << "\n" << LL_ENDL;
+ LL_INFOS() << getFullname() << " attachment scales defined for joints: " << ss.str() << "\n" << LL_ENDL;
}
else
{
- LL_INFOS() << getDebugName() << " no attachment scales defined for any joints" << "\n" << LL_ENDL;
+ LL_INFOS() << getFullname() << " no attachment scales defined for any joints" << "\n" << LL_ENDL;
}
if (!verbose)
@@ -8284,7 +8262,7 @@ bool LLVOAvatar::getIsCloud() const
void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status)
{
// State machine for rezzed status. Statuses are -1 on startup, 0
- // Statuses are -1 on startup, 0 = cloud, 1 = gray, 2 = downloading, 3 = waiting for attachments, 4 = full.
+ // = 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.
@@ -8304,7 +8282,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));
}
@@ -8312,7 +8290,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);
@@ -8553,19 +8531,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);
}
@@ -8582,12 +8560,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
+ (!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);
mPreviousFullyLoaded = mFullyLoaded;
mFullyLoadedInitialized = true;
@@ -8605,7 +8583,6 @@ bool LLVOAvatar::processFullyLoadedChange(bool loading)
mNeedsImpostorUpdate = true;
mLastImpostorUpdateReason = 6;
}
-
return changed;
}
@@ -9500,12 +9477,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)
@@ -9718,7 +9695,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 = getDebugName() + (isSelf() ? "_s_" : "_o_");
+ std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_";
if (block_avatar_appearance_messages)
{
LL_WARNS() << "Blocking AvatarAppearance message" << LL_ENDL;
@@ -10352,13 +10329,17 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara
std::string outprefix(prefix);
if (outprefix.empty())
{
- outprefix = getDebugName() + (isSelf() ? "_s" : "_o");
+ outprefix = getFullname() + (isSelf()?"_s":"_o");
}
- std::string outfilename = get_sequential_numbered_file_name(outprefix, ".xml");
+ if (outprefix.empty())
+ {
+ outprefix = std::string("new_archetype");
+ }
+ 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();
@@ -10844,7 +10825,7 @@ void LLVOAvatar::updateRiggingInfo()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
- LL_DEBUGS("RigSpammish") << getDebugName() << " updating rig tab" << LL_ENDL;
+ LL_DEBUGS("RigSpammish") << getFullname() << " updating rig tab" << LL_ENDL;
// use a local static for scratch space to avoid reallocation here
static std::vector<LLVOVolume*> volumes;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 13d42fb02f..9eb8d3f880 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -202,7 +202,7 @@ 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();
@@ -233,7 +233,6 @@ 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);
@@ -331,16 +330,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();
@@ -404,11 +403,12 @@ public:
virtual bool getIsCloud() const;
bool isFullyTextured() const;
bool hasGray() const;
- S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = waiting for attachments, 4 = full.
+ S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded.
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();
@@ -742,7 +742,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 90ff4067f2..ebba9ba291 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -697,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)
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index f9bea41b1d..f7cd974ab0 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();
diff --git a/indra/newview/llvoicecallhandler.cpp b/indra/newview/llvoicecallhandler.cpp
index d2c947fef2..25b0e69436 100644
--- a/indra/newview/llvoicecallhandler.cpp
+++ b/indra/newview/llvoicecallhandler.cpp
@@ -38,11 +38,6 @@ 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 b3ac28eb7a..cf128f381a 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -369,12 +369,6 @@ void LLVoiceChannel::resume()
{
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
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index e5eb2f8008..9b1f54437e 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);
@@ -337,7 +337,7 @@ void LLVoiceClient::updateSettings()
updateMicMuteLogic();
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->updateSettings();
#endif
LLVivoxVoiceClient::getInstance()->updateSettings();
@@ -348,7 +348,7 @@ void LLVoiceClient::updateSettings()
void LLVoiceClient::tuningStart()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->tuningStart();
#endif
LLVivoxVoiceClient::getInstance()->tuningStart();
@@ -356,7 +356,7 @@ void LLVoiceClient::tuningStart()
void LLVoiceClient::tuningStop()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
LLWebRTCVoiceClient::getInstance()->tuningStop();
#endif
LLVivoxVoiceClient::getInstance()->tuningStop();
@@ -364,7 +364,7 @@ void LLVoiceClient::tuningStop()
bool LLVoiceClient::inTuningMode()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->inTuningMode();
#else
return LLVivoxVoiceClient::getInstance()->inTuningMode();
@@ -373,7 +373,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 +382,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 +391,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 +403,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 +412,7 @@ bool LLVoiceClient::deviceSettingsAvailable()
bool LLVoiceClient::deviceSettingsUpdated()
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
return LLWebRTCVoiceClient::getInstance()->deviceSettingsUpdated();
#else
return LLVivoxVoiceClient::getInstance()->deviceSettingsUpdated();
@@ -421,7 +421,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 +431,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 +439,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 +456,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 +469,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 +477,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 +574,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 +584,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 +630,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 +638,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 +687,7 @@ bool LLVoiceClient::voiceEnabled()
void LLVoiceClient::setVoiceEnabled(bool enabled)
{
-#if !__FreeBSD__
+#if !__FreeBSD__ && !_M_ARM64
if (LLWebRTCVoiceClient::instanceExists())
{
LLWebRTCVoiceClient::getInstance()->setVoiceEnabled(enabled);
@@ -715,7 +715,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 +812,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 +826,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 +846,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 +858,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 +868,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 +885,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 +894,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 +906,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 +917,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 +928,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 +939,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 +950,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 +961,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 +1029,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/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e10a2fc8e2..78e2257e56 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -352,11 +352,8 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
if (isSculpted())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- if (sculpt_params)
- {
- sculpt_id = sculpt_params->getSculptTexture();
- sculpt_type = sculpt_params->getSculptType();
- }
+ sculpt_id = sculpt_params->getSculptTexture();
+ sculpt_type = sculpt_params->getSculptType();
LL_DEBUGS("ObjectUpdate") << "uuid " << mID << " set sculpt_id " << sculpt_id << LL_ENDL;
}
@@ -1194,15 +1191,12 @@ void LLVOVolume::updateSculptTexture()
if (isSculpted() && !isMesh())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- if (sculpt_params)
+ LLUUID id = sculpt_params->getSculptTexture();
+ if (id.notNull())
{
- 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);
- }
+ mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_SCULPTED, LLViewerTexture::LOD_TEXTURE);
+ mSculptTexture->forceToSaveRawImage(0, F32_MAX);
+ mSculptTexture->setKnownDrawSize(256, 256);
}
mSkinInfoUnavaliable = false;
@@ -1490,7 +1484,6 @@ 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
{
@@ -1501,7 +1494,6 @@ 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)
{
@@ -1566,16 +1558,11 @@ 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);
@@ -2656,6 +2643,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
@@ -3589,15 +3587,12 @@ bool LLVOVolume::isMesh() const
if (isSculpted())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- if (sculpt_params)
- {
- U8 sculpt_type = sculpt_params->getSculptType();
+ U8 sculpt_type = sculpt_params->getSculptType();
- if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
- // mesh is a mesh
- {
- return true;
- }
+ if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ // mesh is a mesh
+ {
+ return true;
}
}
@@ -3799,7 +3794,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;
}
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 5fb22184c3..c708e804b2 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -185,7 +185,6 @@ LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item
// virtual
void LLPanelWearableOutfitItem::updateItem(const std::string& name,
- bool favorite,
EItemState item_state)
{
std::string search_label = name;
@@ -216,7 +215,7 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
}
}
- LLPanelInventoryListItemBase::updateItem(search_label, favorite, item_state);
+ LLPanelInventoryListItemBase::updateItem(search_label, item_state);
}
//////////////////////////////////////////////////////////////////////////
@@ -443,7 +442,6 @@ LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryIt
}
void LLPanelAttachmentListItem::updateItem(const std::string& name,
- bool favorite,
EItemState item_state)
{
std::string title_joint = name;
@@ -461,7 +459,7 @@ void LLPanelAttachmentListItem::updateItem(const std::string& name,
title_joint = title_joint + " (" + trans_name + ")";
}
- LLPanelInventoryListItemBase::updateItem(title_joint, favorite, item_state);
+ LLPanelInventoryListItemBase::updateItem(title_joint, item_state);
}
//////////////////////////////////////////////////////////////////////////
@@ -489,7 +487,7 @@ bool LLPanelDummyClothingListItem::postBuild()
addWidgetToRightSide("btn_add_panel");
setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, false));
- updateItem(wearableTypeToString(mWearableType), false);
+ updateItem(wearableTypeToString(mWearableType));
// Make it look loke clothing item - reserve space for 'delete' button
setLeftWidgetsWidth(getChildView("item_icon")->getRect().mLeft);
@@ -923,8 +921,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));
+
// Register handlers for clothing.
registrar.add("Clothing.TakeOff",
boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op));
@@ -934,7 +932,6 @@ 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));
@@ -968,8 +965,6 @@ 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)
{
@@ -991,12 +986,6 @@ 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);
- can_favorite |= !linked_item->getIsFavorite();
- can_unfavorite |= linked_item->getIsFavorite();
-
if (is_worn)
{
++n_worn;
@@ -1020,7 +1009,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
if (can_be_worn)
{
- can_be_worn = get_can_item_be_worn(linked_id);
+ can_be_worn = get_can_item_be_worn(item->getLinkedUUID());
}
} // for
@@ -1042,8 +1031,6 @@ 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 915a557239..7a5f29020e 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -95,7 +95,6 @@ public:
* Updates item name and (worn) suffix.
*/
/*virtual*/ void updateItem(const std::string& name,
- bool favorite,
EItemState item_state = IS_DEFAULT);
void onAddWearable();
@@ -149,7 +148,6 @@ 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:
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 4ee26a312a..b01f5e700d 100755
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -152,13 +152,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) 2025, 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..649aa75d14 100644
--- a/indra/newview/rlvdefines.h
+++ b/indra/newview/rlvdefines.h
@@ -93,6 +93,14 @@ namespace Rlv
Version = 0,
VersionNew,
VersionNum,
+ GetSitID,
+ Sit,
+ SitGround,
+ Unsit,
+ Detach,
+ GetInv,
+ Attach,
+ AttachOver,
GetCommand,
Count,
diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp
index 6c4b439105..066543987f 100644
--- a/indra/newview/rlvhandler.cpp
+++ b/indra/newview/rlvhandler.cpp
@@ -28,8 +28,13 @@
#include "llviewerprecompiledheaders.h"
#include "llagent.h"
#include "llstartup.h"
+#include "llappearancemgr.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 +114,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 +230,168 @@ 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 = findDescendentCategoryIDByName(gInventory.getRootFolderID(), "#RLV");
+ if (folderID == LLUUID::null)
+ return ECmdRet::FailedNoSharedRoot;
+ 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::Attach>::onCommand(const RlvCommand& rlvCmd)
+{
+ auto rlvFolderID = findDescendentCategoryIDByName(gInventory.getRootFolderID(), "#RLV");
+ if (rlvFolderID == LLUUID::null)
+ return ECmdRet::FailedNoSharedRoot;
+ std::vector<std::string> optionList;
+ auto option = rlvCmd.getOption();
+ if (!option.empty())
+ {
+ auto folderID = findDescendentCategoryIDByName(rlvFolderID, 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);
+ }
+ }
+ LLAppearanceMgr::instance().replaceCurrentOutfit(folderID);
+ }
+ return ECmdRet::Succeeded;
+}
+
+template<> template<>
+ECmdRet ForceHandler<EBehaviour::AttachOver>::onCommand(const RlvCommand& rlvCmd)
+{
+ auto rlvFolderID = findDescendentCategoryIDByName(gInventory.getRootFolderID(), "#RLV");
+ if (rlvFolderID == LLUUID::null)
+ return ECmdRet::FailedNoSharedRoot;
+ std::vector<std::string> optionList;
+ auto option = rlvCmd.getOption();
+ if (!option.empty())
+ {
+ auto folderID = findDescendentCategoryIDByName(rlvFolderID, 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);
+ }
+ }
+ LLAppearanceMgr::instance().addCategoryToCurrentOutfit(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..4a0b394acb 100644
--- a/indra/newview/rlvhelper.cpp
+++ b/indra/newview/rlvhelper.cpp
@@ -50,10 +50,24 @@ 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::Attach>("attach"));
+ addEntry(new ForceProcessor<EBehaviour::AttachOver>("attachover"));
+
+ // 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/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/cloud-particle.png b/indra/newview/skins/contrast/textures/cloud-particle.png
new file mode 100644
index 0000000000..f2080ddb9f
--- /dev/null
+++ b/indra/newview/skins/contrast/textures/cloud-particle.png
Binary files differ
diff --git a/indra/newview/skins/contrast/textures/textures.xml b/indra/newview/skins/contrast/textures/textures.xml
index f824816183..1fe1ff333a 100644
--- a/indra/newview/skins/contrast/textures/textures.xml
+++ b/indra/newview/skins/contrast/textures/textures.xml
@@ -796,7 +796,7 @@ with the same filename but different name
<texture name="script_error.j2c" use_mips="true" />
<texture name="silhouette.j2c" use_mips="true" />
<texture name="foot_shadow.j2c" use_mips="true" />
- <texture name="cloud-particle.j2c" use_mips="true" />
+ <texture name="cloud-particle.png" use_mips="true" />
<texture name="transparent.j2c" use_mips="true" />
<!--WARNING OLD ART BELOW *do not use*-->
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 48c93f1c3e..55ec658767 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -458,9 +458,6 @@
name="InventoryBackgroundColor"
reference="DkGray2" />
<color
- name="InventoryFavoriteColor"
- reference="Yellow" />
- <color
name="InventoryFocusOutlineColor"
reference="White_25" />
<color
@@ -593,7 +590,7 @@
-->
<color
name="NameTagBackground"
- value="0 0 0 1" />
+ value="0.101 0.101 0.101 0.6" />
<color
name="NameTagChat"
reference="White" />
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
deleted file mode 100644
index 021942a8aa..0000000000
--- a/indra/newview/skins/default/textures/icons/Icon_Pointer.png
+++ /dev/null
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
deleted file mode 100644
index b71b202234..0000000000
--- a/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.png
+++ /dev/null
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
deleted file mode 100644
index 7d55fb5cfe..0000000000
--- a/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.png
+++ /dev/null
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 64e2b417fa..1fe1ff333a 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,8 +308,6 @@ 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" />
@@ -324,7 +322,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" />
@@ -379,7 +377,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" />
@@ -395,7 +393,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" />
@@ -551,7 +549,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" />
@@ -744,7 +742,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" />
@@ -760,7 +758,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" />
@@ -769,7 +767,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" />
@@ -798,7 +796,7 @@ with the same filename but different name
<texture name="script_error.j2c" use_mips="true" />
<texture name="silhouette.j2c" use_mips="true" />
<texture name="foot_shadow.j2c" use_mips="true" />
- <texture name="cloud-particle.j2c" use_mips="true" />
+ <texture name="cloud-particle.png" use_mips="true" />
<texture name="transparent.j2c" use_mips="true" />
<!--WARNING OLD ART BELOW *do not use*-->
@@ -884,7 +882,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"/>
@@ -933,5 +931,4 @@ 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"/>
</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/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/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 89c6e41a85..4e7ce2c32f 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)
+Yikes Lopez Padoria
+~ ( ^-^ ) ~ (cutie_qu)
</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,12 @@ 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
</text_editor>
</panel>
</accordion_tab>
@@ -196,7 +190,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 +199,45 @@ 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.
+
+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.
</text_editor>
</panel>
</tab_container>
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_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
new file mode 100644
index 0000000000..6c3214a76d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
@@ -0,0 +1,421 @@
+<?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 a51e7a844a..156bba6c27 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="483"
- width="483"
+ height="370"
+ width="370"
name="inventory_settings"
title="INVENTORY SETTINGS">
<icon
@@ -16,7 +16,7 @@
left="18"
mouse_opaque="true"
name="multi_folder_icon"
- top="20"
+ top="25"
width="18" />
<text
type="string"
@@ -40,10 +40,10 @@
font="SansSerifMedium"
left="60"
width="300"
- height="66"
+ height="70"
name="multi_double_click_setting">
<radio_item
- height="18"
+ height="20"
label="Expands &amp; collapses folder"
label_text.text_color="White"
follows="left|top"
@@ -51,24 +51,24 @@
name="0"
width="200"/>
<radio_item
- height="18"
+ height="20"
follows="left|top"
label="Opens a new window"
label_text.text_color="White"
layout="topleft"
left_delta="0"
name="1"
- top_pad ="3"
+ top_pad ="5"
width="200" />
<radio_item
- height="18"
+ height="20"
follows="left|top"
label="Switches view"
label_text.text_color="White"
layout="topleft"
left_delta="0"
name="2"
- top_pad ="3"
+ top_pad ="5"
width="200" />
</radio_group>
<icon
@@ -79,7 +79,7 @@
left="18"
mouse_opaque="true"
name="single_folder_icon"
- top_pad="19"
+ top_pad="30"
width="18" />
<text
type="string"
@@ -103,10 +103,10 @@
font="SansSerifMedium"
left="60"
width="300"
- height="44"
+ height="45"
name="single_double_click_setting">
<radio_item
- height="18"
+ height="20"
label="Stays in current window"
label_text.text_color="White"
follows="left|top"
@@ -114,37 +114,27 @@
name="false"
width="200"/>
<radio_item
- height="18"
+ height="20"
follows="left|top"
label="Opens a new window"
label_text.text_color="White"
layout="topleft"
left_delta="0"
name="true"
- top_pad ="3"
+ top_pad ="5"
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_pad="13"
+ left="48"
name="find_original_txt"
font="SansSerifMedium"
text_color="White"
- top_delta="1"
+ top_pad="30"
width="300">
Clicking on "Show in inventory" or "Find original"
</text>
@@ -156,10 +146,10 @@
font="SansSerifMedium"
left="60"
width="300"
- height="44"
+ height="45"
name="find_original_settings">
<radio_item
- height="18"
+ height="20"
label="Shows item in main inventory window"
label_text.text_color="White"
follows="left|top"
@@ -167,136 +157,23 @@
name="false"
width="200"/>
<radio_item
- height="18"
+ height="20"
follows="left|top"
label="Opens a new single-folder window"
label_text.text_color="White"
layout="topleft"
left_delta="0"
name="true"
- top_pad ="3"
+ top_pad ="5"
width="200" />
</radio_group>
- <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>
+ <button
+ height="20"
+ label="OK"
+ layout="topleft"
+ left="140"
+ bottom="-20"
+ name="ok_btn"
+ label_color="White"
+ width="90" />
</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..a86b9c7da2 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>
@@ -45,6 +45,7 @@
<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 +61,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"
@@ -1404,7 +1426,7 @@
word_wrap="true">
</text_editor>
<check_box
- control_name="ImporterDebug"
+ control_name="ImporterDebugVerboseLogging"
follows="top|left"
top_pad="9"
left="6"
@@ -1706,7 +1728,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_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
index 881c1f7469..a9900f05b7 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="418" >
+ width="363" >
<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 9981e5d893..57b74b360a 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,7 +17,17 @@
New inventory features
</floater.string>
<floater.string name="description_txt_inventory">
-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.
+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)]
</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 709fbdd27e..5e4b017590 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="372"
+ height="289"
help_topic="object_weights"
layout="topleft"
name="object_weights"
@@ -13,21 +13,6 @@
<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"
@@ -335,97 +320,4 @@
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_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
index 9b637d60f2..88d6ae1bc2 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
@@ -1011,7 +1011,7 @@
layout="topleft"
left="420"
name="Mirrors"
- top_delta="22"
+ top_delta="24"
width="240">
<check_box.commit_callback
function="Pref.RenderOptionUpdate" />
@@ -1113,7 +1113,7 @@
max_val="1.0"
name="RenderSharpness"
show_text="true"
- top_delta="20"
+ top_delta="24"
width="260">
</slider>
<!-- End of Sharpening Settings-->
@@ -1164,7 +1164,7 @@
max_val="1.0"
name="TonemapMix"
show_text="true"
- top_delta="20"
+ top_delta="22"
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 ebb5cd9251..f1c87c8c5a 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_trash.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_trash.xml
@@ -29,8 +29,6 @@
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_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index 6633e25099..f2309eb817 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -54,6 +54,19 @@
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="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 +87,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_voice_chat_volume.xml b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
index c0d260ef59..51809793d3 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="60"
+ label_width="50"
layout="topleft"
left="15"
top="50"
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 d8ef139d37..99f84fe808 100644
--- a/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
@@ -670,22 +670,6 @@
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="Use as default for"
layout="topleft"
@@ -741,136 +725,6 @@
<menu_item_call.on_visible
function="Inventory.CanSetFavoriteFolder" />
</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
- label="Image uploads"
- layout="topleft"
- name="Image uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_texture" />
- <menu_item_call.on_visible
- function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
- label="Sound uploads"
- layout="topleft"
- name="Sound uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_sound" />
- <menu_item_call.on_visible
- function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
- label="Animation uploads"
- layout="topleft"
- name="Animation uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_animation" />
- <menu_item_call.on_visible
- function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
- label="Model uploads"
- layout="topleft"
- name="Model uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_model" />
- <menu_item_call.on_visible
- function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
- label="PBR material uploads"
- layout="topleft"
- name="PBR uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_pbr_material" />
- </menu_item_call>
- </menu>
<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 fb68193006..99cee83f4e 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,26 +50,6 @@
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 28569c1557..d672ffbc94 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -950,7 +950,7 @@
function="Inventory.EnvironmentEnabled" />
</menu_item_call>
</menu>
- </menu>
+ </menu>
<menu_item_call
label="Create folder from selected"
layout="topleft"
@@ -967,99 +967,6 @@
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"
@@ -1070,39 +977,39 @@
name="Image uploads">
<menu_item_call.on_click
function="Inventory.FileUploadLocation"
- parameter="def_texture" />
+ parameter="texture" />
</menu_item_call>
<menu_item_call
label="Sound uploads"
layout="topleft"
name="Sound uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_sound" />
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="sound" />
</menu_item_call>
<menu_item_call
label="Animation uploads"
layout="topleft"
name="Animation uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_animation" />
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="animation" />
</menu_item_call>
<menu_item_call
label="Model uploads"
layout="topleft"
name="Model uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_model" />
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="model" />
</menu_item_call>
<menu_item_call
label="PBR material uploads"
layout="topleft"
name="PBR uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="def_pbr_material" />
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="pbr_material" />
</menu_item_call>
</menu>
<menu_item_call
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 d17fbf84b3..e249acaccd 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,15 +138,4 @@
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 97f53d3a17..33cf01493d 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,4 +100,15 @@
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_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 5fff9b7bc0..04514e8a52 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -110,6 +110,13 @@
</menu_item_call>
<menu_item_separator/>
<menu_item_call
+ label="Discord Social"
+ name="Discord Social">
+ <menu_item_call.on_click
+ function="Advanced.DiscordSocial"/>
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
label="About [APP_NAME]"
name="About Second Life">
<menu_item_call.on_click
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
deleted file mode 100644
index aa4cd1483d..0000000000
--- a/indra/newview/skins/default/xui/en/menu_outfit_gallery_sort.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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 e333b05d3e..8f36c7a00a 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -50,26 +50,6 @@
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">
@@ -109,6 +89,34 @@
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? -->
@@ -269,19 +277,4 @@
</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
deleted file mode 100644
index 0a4d1ea877..0000000000
--- a/indra/newview/skins/default/xui/en/menu_outfit_list_sort.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?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 0d45e7c95c..c6805edd63 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml
@@ -50,26 +50,6 @@
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 96cbac4478..57f4aa8655 100644
--- a/indra/newview/skins/default/xui/en/menu_settings_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_settings_gear.xml
@@ -24,9 +24,6 @@
<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_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index d27a184ac3..f83876fe7d 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,64 +1586,6 @@ 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
@@ -1876,6 +1818,13 @@ function="World.EnvPreset"
</menu_item_call>
<menu_item_separator/>
+ <menu_item_call
+ label="Discord Social"
+ name="Discord Social">
+ <menu_item_call.on_click
+ function="Advanced.DiscordSocial"/>
+ </menu_item_call>
+ <menu_item_separator/>
<menu_item_call
label="Bumps, Pushes &amp; Hits"
name="Bumps, Pushes &amp;amp; Hits">
@@ -2959,12 +2908,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 63d37edf38..ee77ef23f0 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,20 +80,6 @@
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 9a752a1643..321e8a0831 100644
--- a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
@@ -31,20 +31,6 @@
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 c2a4ffe942..6bb9f7b1dc 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3139,13 +3139,9 @@ Would you be my friend?
<input name="listname" type="text"/>
<button
default="true"
- index="1"
+ index="0"
name="SetName"
text="OK"/>
- <button
- index="0"
- name="Cancel"
- text="Cancel"/>
</form>
</notification>
@@ -3174,29 +3170,6 @@ 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.
@@ -4655,12 +4628,13 @@ You already have blocked this name.
<notification
icon="alert.tga"
- name="CantModifyContentInNoModTask"
+ name="RemoveItemWarn"
type="alert">
-You don't have permission to modify content of this object
+Though permitted, deleting contents may damage the object. Do you want to delete that item?
<tag>confirm</tag>
<usetemplate
- name="okbutton"
+ name="okcancelbuttons"
+ notext="Cancel"
yestext="OK"/>
</notification>
@@ -9479,8 +9453,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
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_inventory_gallery_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml
index f5906c17fd..73cb9b080f 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,16 +43,6 @@
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_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 6e1e6facbe..498dab1ef3 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -269,22 +269,6 @@
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 9586957694..a8a306bea9 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 marketplace_item="true"/>
+ <item allow_wear="false"/>
</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 5f64a5d47a..0c665fb07e 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 marketplace_item="true"/>
+ <item allow_wear="false"/>
</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 ab4d836ba9..0be405c5b8 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 marketplace_item="true"/>
+ <item allow_wear="false"/>
</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 303601e65b..58122db7f4 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 marketplace_item="true"/>
+ <item allow_wear="false"/>
</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 d49bf19c5d..6166268206 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="429"
+ height="400"
width="312"
layout="topleft"
left="4"
@@ -44,5 +44,49 @@
name="gallery_scroll_panel"
opaque="false"
top_pad="0">
- </scroll_container>
+ </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>
</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 cd4e5ef1f6..e8d8e8f3e2 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="428"
+ height="400"
layout="topleft"
left="3"
name="outfits_accordion"
@@ -30,4 +30,48 @@
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 10073f0461..559917ec0a 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="429"
+ height="400"
layout="topleft"
left="3"
single_expansion="true"
@@ -62,4 +62,35 @@
</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_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 1005810145..4d9a03823e 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 BAR" />
+ value="FAVORITES" />
<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..c38af9d4fa 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -206,6 +206,33 @@
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"
+ top_pad="10"
+ 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="AllowMultipleViewers"
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 fb8a4763cb..6fd6c81217 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -521,12 +521,21 @@
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_group.commit_callback
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 ec4fede090..fa692d7200 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -230,6 +230,40 @@
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"
@@ -313,41 +347,6 @@
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..."
@@ -389,7 +388,7 @@
layout="topleft"
left="10"
name="PrefSaveButton"
- top="332"
+ top="310"
width="200">
<button.commit_callback
function="Pref.PrefSave"
@@ -431,7 +430,7 @@
layout="topleft"
left="10"
name="Defaults"
- top_delta="42"
+ top_delta="65"
width="210">
<button.commit_callback
function="Pref.HardwareDefaults" />
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 395efe3169..8202bb9de3 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 while in chat"
+ label="Arrow keys always move me"
layout="topleft"
left_delta="5"
name="arrow_keys_move_avatar_check"
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..f1a38dc894 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -55,13 +55,24 @@
width="350" />
<check_box
+ control_name="ShowSelectionBeam"
+ height="16"
+ enabled="true"
+ label="Show selection particle beam when selecting or interacting with objects"
+ layout="topleft"
+ left="30"
+ name="selection_beam_visibility"
+ top_pad="15"
+ width="350" />
+
+ <check_box
height="16"
enabled="false"
label="Only friends and groups know I'm online"
layout="topleft"
left="30"
name="online_visibility"
- top_pad="30"
+ top_pad="15"
width="350" />
<check_box
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..de6132aec6 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="1073741823"/>
+ <item
+ label="All MOAP"
+ name="media_first_click_all"
+ value="2147483647"/>
+ </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_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_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_sunmoon.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml
index 34b48574d5..bd68434aab 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,13 +248,29 @@
</layout_panel>
<layout_panel
- border="true"
- bevel_style="in"
name="moon_layout"
+ border="false"
+ bevel_style="in"
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"
@@ -407,7 +423,9 @@
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 ffea470cfc..e062f1710b 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="2"
+ decimal_digits="1"
follows="left|top"
increment="0.01"
height="16"
@@ -261,7 +261,7 @@
width="150"
can_edit_text="true"/>
<slider
- decimal_digits="2"
+ decimal_digits="1"
follows="left|top"
increment="0.01"
initial_value="0.7"
@@ -274,7 +274,7 @@
width="150"
can_edit_text="true"/>
<slider
- decimal_digits="2"
+ decimal_digits="1"
follows="left|top"
increment="0.01"
initial_value="0.7"
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 b7db9dec96..1c70383bf9 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -986,6 +986,19 @@
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 3e9efb6f8b..c03fac4aad 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="13"
+ height="10"
follows="top|left|right"
layout="topleft"
left="35"
@@ -94,7 +94,7 @@ width="333">
image_overlay="Edit_Wrench"
label=""
layout="topleft"
- right="-3"
+ left="265"
name="edit_outfit_btn"
tool_tip="Edit this outfit"
top="3"
@@ -108,100 +108,17 @@ width="333">
top="6"
width="24" />
</panel>
- <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>
+ <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" />
<panel
class="panel_outfits_inventory"
filename="panel_outfits_inventory.xml"
@@ -212,7 +129,7 @@ width="333">
visible="false"
left="0"
tab_group="1"
- top_pad="4"
+ top_pad="6"
follows="all" />
<panel
class="panel_outfit_edit"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 357db4699c..76b14590f6 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2322,7 +2322,6 @@ 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="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>
@@ -2486,13 +2485,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">Favorites Bar</string>
+ <string name="InvFolder Favorite">My Favorites</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">Favorites Bar</string>
- <string name="InvFolder Favorites">Favorites Bar</string>
- <string name="InvFolder favorites">Favorites Bar</string>
+ <string name="InvFolder favorite">My Favorites</string>
+ <string name="InvFolder Favorites">My Favorites</string>
+ <string name="InvFolder favorites">My Favorites</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>
@@ -2943,13 +2942,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 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 and Nature</string>
<string name="Residential">Residential</string>
<!--<string name="Shopping">Shopping</string> -->
<string name="Stage">Stage</string>
@@ -4188,7 +4187,7 @@ Try enclosing path to the editor with double quotes.
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>
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 50c5285e04..b598bbccd8 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,8 +1,6 @@
<?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 865c145022..27ec6ded81 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,8 +1,6 @@
<?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/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/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/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/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_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml
index 844a556af1..f8837c40a7 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,6 +44,8 @@
<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>
@@ -72,6 +74,8 @@
</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/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 7f9dee2369..f807148617 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,6 +35,8 @@
<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>
@@ -57,6 +59,8 @@
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/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/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/gold/textures/Blank.png b/indra/newview/skins/gold/textures/Blank.png
new file mode 100644
index 0000000000..f38e9f9100
--- /dev/null
+++ b/indra/newview/skins/gold/textures/Blank.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/Rounded_Rect.png b/indra/newview/skins/gold/textures/Rounded_Rect.png
new file mode 100644
index 0000000000..c270c28039
--- /dev/null
+++ b/indra/newview/skins/gold/textures/Rounded_Rect.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/alpha_gradient.tga b/indra/newview/skins/gold/textures/alpha_gradient.tga
new file mode 100644
index 0000000000..6fdba25d4e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/alpha_gradient.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/alpha_gradient_2d.j2c b/indra/newview/skins/gold/textures/alpha_gradient_2d.j2c
new file mode 100644
index 0000000000..5de5a80a65
--- /dev/null
+++ b/indra/newview/skins/gold/textures/alpha_gradient_2d.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/arrow_down.tga b/indra/newview/skins/gold/textures/arrow_down.tga
new file mode 100644
index 0000000000..81dc9d3b6c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/arrow_down.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/arrow_up.tga b/indra/newview/skins/gold/textures/arrow_up.tga
new file mode 100644
index 0000000000..22195cf7fb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/arrow_up.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.png b/indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.png
new file mode 100644
index 0000000000..84cc2159c1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/badge_note.j2c b/indra/newview/skins/gold/textures/badge_note.j2c
new file mode 100644
index 0000000000..1ab5233faf
--- /dev/null
+++ b/indra/newview/skins/gold/textures/badge_note.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/badge_ok.j2c b/indra/newview/skins/gold/textures/badge_ok.j2c
new file mode 100644
index 0000000000..f85b880f1d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/badge_ok.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/badge_warn.j2c b/indra/newview/skins/gold/textures/badge_warn.j2c
new file mode 100644
index 0000000000..26437ca426
--- /dev/null
+++ b/indra/newview/skins/gold/textures/badge_warn.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.png
new file mode 100644
index 0000000000..6b725e153a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.png
new file mode 100644
index 0000000000..9f22080d13
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.png
new file mode 100644
index 0000000000..5b2a8eb339
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.png
new file mode 100644
index 0000000000..9acf7053d5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.png
new file mode 100644
index 0000000000..00158a7bc2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.png
new file mode 100644
index 0000000000..3748f5e190
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.png
new file mode 100644
index 0000000000..2b50986780
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.png
new file mode 100644
index 0000000000..c49b8f9a27
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.png
new file mode 100644
index 0000000000..bc8c4db04d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.png
new file mode 100644
index 0000000000..b919a0a152
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_On.png
new file mode 100644
index 0000000000..de9da359a0
--- /dev/null
+++ 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/gold/textures/bottomtray/Mouselook_View_Off.png b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_Off.png
new file mode 100644
index 0000000000..8d32cad95f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.png b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.png
new file mode 100644
index 0000000000..4c98e35868
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.png
new file mode 100644
index 0000000000..fade065ce7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.png
new file mode 100644
index 0000000000..e2eb38e12d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Move_Walk_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Walk_Off.png
new file mode 100644
index 0000000000..f314d4e001
--- /dev/null
+++ 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/gold/textures/bottomtray/Notices_Unread.png b/indra/newview/skins/gold/textures/bottomtray/Notices_Unread.png
new file mode 100644
index 0000000000..eb2f3dbaa4
--- /dev/null
+++ 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/gold/textures/bottomtray/PanOrbit_Off.png b/indra/newview/skins/gold/textures/bottomtray/PanOrbit_Off.png
new file mode 100644
index 0000000000..53efa3a9a9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/bottomtray/PanOrbit_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/bottomtray/Snapshot_Off.png b/indra/newview/skins/gold/textures/bottomtray/Snapshot_Off.png
new file mode 100644
index 0000000000..4ab4bbe4af
--- /dev/null
+++ 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/gold/textures/build/Object_Cone.png b/indra/newview/skins/gold/textures/build/Object_Cone.png
new file mode 100644
index 0000000000..5167f1a820
--- /dev/null
+++ 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/gold/textures/build/Object_Cube.png b/indra/newview/skins/gold/textures/build/Object_Cube.png
new file mode 100644
index 0000000000..e82af1ca82
--- /dev/null
+++ 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/gold/textures/build/Object_Cylinder.png b/indra/newview/skins/gold/textures/build/Object_Cylinder.png
new file mode 100644
index 0000000000..fe1041d4c7
--- /dev/null
+++ 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/gold/textures/build/Object_Grass.png b/indra/newview/skins/gold/textures/build/Object_Grass.png
new file mode 100644
index 0000000000..a88efd5f3e
--- /dev/null
+++ 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/gold/textures/build/Object_Hemi_Cone.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone.png
new file mode 100644
index 0000000000..595f64d480
--- /dev/null
+++ 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/gold/textures/build/Object_Hemi_Cylinder.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder.png
new file mode 100644
index 0000000000..dd41d56fb3
--- /dev/null
+++ 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/gold/textures/build/Object_Hemi_Sphere.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere.png
new file mode 100644
index 0000000000..1489630624
--- /dev/null
+++ 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/gold/textures/build/Object_Prism.png b/indra/newview/skins/gold/textures/build/Object_Prism.png
new file mode 100644
index 0000000000..51c6c161a0
--- /dev/null
+++ 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/gold/textures/build/Object_Pyramid.png b/indra/newview/skins/gold/textures/build/Object_Pyramid.png
new file mode 100644
index 0000000000..a147b59553
--- /dev/null
+++ 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/gold/textures/build/Object_Ring.png b/indra/newview/skins/gold/textures/build/Object_Ring.png
new file mode 100644
index 0000000000..a9790fd60c
--- /dev/null
+++ 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/gold/textures/build/Object_Sphere.png b/indra/newview/skins/gold/textures/build/Object_Sphere.png
new file mode 100644
index 0000000000..8e2dd92a82
--- /dev/null
+++ 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/gold/textures/build/Object_Tetrahedron.png b/indra/newview/skins/gold/textures/build/Object_Tetrahedron.png
new file mode 100644
index 0000000000..23e22b1796
--- /dev/null
+++ 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/gold/textures/build/Object_Torus.png b/indra/newview/skins/gold/textures/build/Object_Torus.png
new file mode 100644
index 0000000000..15c62423a9
--- /dev/null
+++ 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/gold/textures/build/Object_Tree.png b/indra/newview/skins/gold/textures/build/Object_Tree.png
new file mode 100644
index 0000000000..82c422419b
--- /dev/null
+++ 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/gold/textures/build/Object_Tube.png b/indra/newview/skins/gold/textures/build/Object_Tube.png
new file mode 100644
index 0000000000..e47fce7511
--- /dev/null
+++ 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/gold/textures/build/Tool_Create.png b/indra/newview/skins/gold/textures/build/Tool_Create.png
new file mode 100755
index 0000000000..1f1097def5
--- /dev/null
+++ 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/gold/textures/build/Tool_Dozer.png b/indra/newview/skins/gold/textures/build/Tool_Dozer.png
new file mode 100755
index 0000000000..61744666f4
--- /dev/null
+++ 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/gold/textures/build/Tool_Face.png b/indra/newview/skins/gold/textures/build/Tool_Face.png
new file mode 100755
index 0000000000..5ab42a4ad6
--- /dev/null
+++ 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/gold/textures/build/Tool_Grab.png b/indra/newview/skins/gold/textures/build/Tool_Grab.png
new file mode 100755
index 0000000000..5c58288d5e
--- /dev/null
+++ 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/gold/textures/build/Tool_Zoom.png b/indra/newview/skins/gold/textures/build/Tool_Zoom.png
new file mode 100755
index 0000000000..ad493b0d66
--- /dev/null
+++ 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/gold/textures/button_anim_pause.tga b/indra/newview/skins/gold/textures/button_anim_pause.tga
new file mode 100644
index 0000000000..577f9195d0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/button_anim_pause.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/button_anim_pause_selected.tga b/indra/newview/skins/gold/textures/button_anim_pause_selected.tga
new file mode 100644
index 0000000000..21384316a8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/button_anim_pause_selected.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/button_anim_play.tga b/indra/newview/skins/gold/textures/button_anim_play.tga
new file mode 100644
index 0000000000..9ed55f829d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/button_anim_play.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/button_anim_play_selected.tga b/indra/newview/skins/gold/textures/button_anim_play_selected.tga
new file mode 100644
index 0000000000..b166a4178d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/button_anim_play_selected.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/checker.png b/indra/newview/skins/gold/textures/checker.png
new file mode 100644
index 0000000000..1ab87e3f02
--- /dev/null
+++ 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/gold/textures/color_swatch_alpha.tga b/indra/newview/skins/gold/textures/color_swatch_alpha.tga
new file mode 100644
index 0000000000..814a004e62
--- /dev/null
+++ 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/gold/textures/crosshairs.tga b/indra/newview/skins/gold/textures/crosshairs.tga
new file mode 100644
index 0000000000..ac4d63dc59
--- /dev/null
+++ b/indra/newview/skins/gold/textures/crosshairs.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/default_irradiance.png b/indra/newview/skins/gold/textures/default_irradiance.png
new file mode 100644
index 0000000000..899e0ddf2a
--- /dev/null
+++ 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/gold/textures/direction_arrow.tga b/indra/newview/skins/gold/textures/direction_arrow.tga
new file mode 100644
index 0000000000..f3ef1068c4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/direction_arrow.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/down_arrow.png b/indra/newview/skins/gold/textures/down_arrow.png
new file mode 100644
index 0000000000..21a0fc5ec0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/down_arrow.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/eye_button_active.tga b/indra/newview/skins/gold/textures/eye_button_active.tga
new file mode 100644
index 0000000000..014f785a7b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/eye_button_active.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/eye_button_inactive.tga b/indra/newview/skins/gold/textures/eye_button_inactive.tga
new file mode 100644
index 0000000000..8666f0bbe6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/eye_button_inactive.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/flatnormal.tga b/indra/newview/skins/gold/textures/flatnormal.tga
new file mode 100644
index 0000000000..6d5abd1782
--- /dev/null
+++ b/indra/newview/skins/gold/textures/flatnormal.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/folder_arrow.tga b/indra/newview/skins/gold/textures/folder_arrow.tga
new file mode 100644
index 0000000000..77d470731b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/folder_arrow.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/foot_shadow.j2c b/indra/newview/skins/gold/textures/foot_shadow.j2c
new file mode 100644
index 0000000000..f9ce9da7d1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/foot_shadow.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/green_checkmark.png b/indra/newview/skins/gold/textures/green_checkmark.png
new file mode 100644
index 0000000000..d2a5b348dc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/green_checkmark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icn_media_movie.tga b/indra/newview/skins/gold/textures/icn_media_movie.tga
new file mode 100644
index 0000000000..43dd342c9d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icn_media_movie.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icn_media_web.tga b/indra/newview/skins/gold/textures/icn_media_web.tga
new file mode 100644
index 0000000000..7c9131dfff
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icn_media_web.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_auction.tga b/indra/newview/skins/gold/textures/icon_auction.tga
new file mode 100644
index 0000000000..baf7d0d000
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_auction.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_avatar_offline.tga b/indra/newview/skins/gold/textures/icon_avatar_offline.tga
new file mode 100644
index 0000000000..cfa95eb00e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_avatar_offline.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_avatar_online.tga b/indra/newview/skins/gold/textures/icon_avatar_online.tga
new file mode 100644
index 0000000000..45221213eb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_avatar_online.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_diurnal.tga b/indra/newview/skins/gold/textures/icon_diurnal.tga
new file mode 100644
index 0000000000..fc720c8269
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_diurnal.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_for_sale_adult.tga b/indra/newview/skins/gold/textures/icon_for_sale_adult.tga
new file mode 100644
index 0000000000..6a99188f87
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_for_sale_adult.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_group.tga b/indra/newview/skins/gold/textures/icon_group.tga
new file mode 100644
index 0000000000..79cd71689d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_group.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_legacy_event.tga b/indra/newview/skins/gold/textures/icon_legacy_event.tga
new file mode 100644
index 0000000000..7805dbce60
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_legacy_event.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_legacy_event_adult.tga b/indra/newview/skins/gold/textures/icon_legacy_event_adult.tga
new file mode 100644
index 0000000000..c344fb1e78
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_legacy_event_adult.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_legacy_event_mature.tga b/indra/newview/skins/gold/textures/icon_legacy_event_mature.tga
new file mode 100644
index 0000000000..61c879bc92
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_legacy_event_mature.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_place.tga b/indra/newview/skins/gold/textures/icon_place.tga
new file mode 100644
index 0000000000..e10655c6ec
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icon_place.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icon_top_pick.tga b/indra/newview/skins/gold/textures/icon_top_pick.tga
new file mode 100644
index 0000000000..0b34882d2f
--- /dev/null
+++ 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/gold/textures/icons/BackArrow_Off.png b/indra/newview/skins/gold/textures/icons/BackArrow_Off.png
new file mode 100644
index 0000000000..3775690531
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/BackArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.png
new file mode 100644
index 0000000000..c219ac4446
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.png
new file mode 100644
index 0000000000..586f577181
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.png
new file mode 100644
index 0000000000..697bee3bbd
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.png
new file mode 100644
index 0000000000..12cc1857d4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.png
new file mode 100644
index 0000000000..7b40e33e11
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.png
new file mode 100644
index 0000000000..e030c44f01
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_log_inbox.png b/indra/newview/skins/gold/textures/icons/Conv_log_inbox.png
new file mode 100644
index 0000000000..f4bbdc059d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_log_inbox.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.png
new file mode 100644
index 0000000000..acb3904e32
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.png
new file mode 100644
index 0000000000..70dec7cad1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.png
new file mode 100644
index 0000000000..13d424832b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.png
new file mode 100644
index 0000000000..1866dd965c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_close.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_close.png
new file mode 100644
index 0000000000..f4f2e2fd37
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_close.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.png
new file mode 100644
index 0000000000..3c427a3cc5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.png
new file mode 100644
index 0000000000..6e8031b42c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.png
new file mode 100644
index 0000000000..887a3b8335
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.png
new file mode 100644
index 0000000000..fc0da5a810
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.png
new file mode 100644
index 0000000000..6d45dbbff6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.png
new file mode 100644
index 0000000000..e3e5f49741
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Copy.png b/indra/newview/skins/gold/textures/icons/Copy.png
new file mode 100644
index 0000000000..8448e70385
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Copy.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/CopyBright.png b/indra/newview/skins/gold/textures/icons/CopyBright.png
new file mode 100644
index 0000000000..ac65d68e0b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/CopyBright.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.png b/indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.png
new file mode 100644
index 0000000000..1113b4effe
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/DownArrow_Off.png b/indra/newview/skins/gold/textures/icons/DownArrow_Off.png
new file mode 100644
index 0000000000..2e1e2964a0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/DownArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Edit_Wrench.png b/indra/newview/skins/gold/textures/icons/Edit_Wrench.png
new file mode 100644
index 0000000000..2b9ba9dc10
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Edit_Wrench.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.png b/indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.png
new file mode 100644
index 0000000000..dc4532b5a1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Facebook.png b/indra/newview/skins/gold/textures/icons/Facebook.png
new file mode 100644
index 0000000000..9e51e3ac7f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Facebook.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Female.png b/indra/newview/skins/gold/textures/icons/Female.png
new file mode 100644
index 0000000000..c9fef87b6e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Female.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ForSale_Badge.png b/indra/newview/skins/gold/textures/icons/ForSale_Badge.png
new file mode 100644
index 0000000000..3b3a41c7c1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ForSale_Badge.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ForwardArrow_Off.png b/indra/newview/skins/gold/textures/icons/ForwardArrow_Off.png
new file mode 100644
index 0000000000..c33320cf6e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ForwardArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ForwardArrow_Press.png b/indra/newview/skins/gold/textures/icons/ForwardArrow_Press.png
new file mode 100644
index 0000000000..86eb39c43a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ForwardArrow_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Generic_Group.png b/indra/newview/skins/gold/textures/icons/Generic_Group.png
new file mode 100644
index 0000000000..e96b7fc992
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Generic_Group.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Generic_Group_Large.png b/indra/newview/skins/gold/textures/icons/Generic_Group_Large.png
new file mode 100644
index 0000000000..9396819bfb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Generic_Group_Large.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Generic_Object_Small.png b/indra/newview/skins/gold/textures/icons/Generic_Object_Small.png
new file mode 100644
index 0000000000..142390e3f3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Generic_Object_Small.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Generic_Person.png b/indra/newview/skins/gold/textures/icons/Generic_Person.png
new file mode 100644
index 0000000000..162735d979
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Generic_Person.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Generic_Person_Large.png b/indra/newview/skins/gold/textures/icons/Generic_Person_Large.png
new file mode 100644
index 0000000000..5be82418c1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Generic_Person_Large.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Group_Notices.png b/indra/newview/skins/gold/textures/icons/Group_Notices.png
new file mode 100644
index 0000000000..601502d374
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Group_Notices.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.png b/indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.png
new file mode 100644
index 0000000000..6d8ea5fd93
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Hierarchy_View_On.png b/indra/newview/skins/gold/textures/icons/Hierarchy_View_On.png
new file mode 100644
index 0000000000..24f5210286
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Hierarchy_View_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.png b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.png
new file mode 100644
index 0000000000..fb57265dac
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.png b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.png
new file mode 100644
index 0000000000..907113cbb7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Icon_Color_Palette.png b/indra/newview/skins/gold/textures/icons/Icon_Color_Palette.png
new file mode 100644
index 0000000000..28906001ea
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Icon_Color_Palette.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Icon_Font_Size.png b/indra/newview/skins/gold/textures/icons/Icon_Font_Size.png
new file mode 100644
index 0000000000..37bdde69aa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Icon_Font_Size.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Icon_For_Sale.png b/indra/newview/skins/gold/textures/icons/Icon_For_Sale.png
new file mode 100644
index 0000000000..57a376f1bf
--- /dev/null
+++ 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/gold/textures/icons/Inv_Alpha.png b/indra/newview/skins/gold/textures/icons/Inv_Alpha.png
new file mode 100644
index 0000000000..fdad36e2d3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Alpha.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Animation.png b/indra/newview/skins/gold/textures/icons/Inv_Animation.png
new file mode 100644
index 0000000000..6715c736e7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Animation.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_BodyShape.png b/indra/newview/skins/gold/textures/icons/Inv_BodyShape.png
new file mode 100644
index 0000000000..cb908a39fb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_BodyShape.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_CallingCard.png b/indra/newview/skins/gold/textures/icons/Inv_CallingCard.png
new file mode 100644
index 0000000000..ee87f8e595
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_CallingCard.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Clothing.png b/indra/newview/skins/gold/textures/icons/Inv_Clothing.png
new file mode 100644
index 0000000000..430dca6b5e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Clothing.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Eye.png b/indra/newview/skins/gold/textures/icons/Inv_Eye.png
new file mode 100644
index 0000000000..d715f135d3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Eye.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_FolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_FolderClosed.png
new file mode 100644
index 0000000000..ec99eaee9e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_FolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_FolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_FolderOpen.png
new file mode 100644
index 0000000000..615a6ec11b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_FolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Gesture.png b/indra/newview/skins/gold/textures/icons/Inv_Gesture.png
new file mode 100644
index 0000000000..9fee34915e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Gesture.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Gloves.png b/indra/newview/skins/gold/textures/icons/Inv_Gloves.png
new file mode 100644
index 0000000000..aa151d5404
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Gloves.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Hair.png b/indra/newview/skins/gold/textures/icons/Inv_Hair.png
new file mode 100644
index 0000000000..62b3ae81c2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Hair.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Invalid.png b/indra/newview/skins/gold/textures/icons/Inv_Invalid.png
new file mode 100644
index 0000000000..6ab5ba5217
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Invalid.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Jacket.png b/indra/newview/skins/gold/textures/icons/Inv_Jacket.png
new file mode 100644
index 0000000000..26514f1c0f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Jacket.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Landmark.png b/indra/newview/skins/gold/textures/icons/Inv_Landmark.png
new file mode 100644
index 0000000000..338323fcee
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Landmark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Link.png b/indra/newview/skins/gold/textures/icons/Inv_Link.png
new file mode 100644
index 0000000000..28c5f3635a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Link.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_LinkFolder.png b/indra/newview/skins/gold/textures/icons/Inv_LinkFolder.png
new file mode 100644
index 0000000000..7c43ed3a43
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_LinkFolder.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_LinkItem.png b/indra/newview/skins/gold/textures/icons/Inv_LinkItem.png
new file mode 100644
index 0000000000..7c43ed3a43
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_LinkItem.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.png
new file mode 100644
index 0000000000..46f2038279
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.png
new file mode 100644
index 0000000000..06a1b05983
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_LostClosed.png b/indra/newview/skins/gold/textures/icons/Inv_LostClosed.png
new file mode 100644
index 0000000000..fc9a2a2156
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_LostClosed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_LostOpen.png b/indra/newview/skins/gold/textures/icons/Inv_LostOpen.png
new file mode 100644
index 0000000000..b15dc3cfa3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_LostOpen.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Material.png b/indra/newview/skins/gold/textures/icons/Inv_Material.png
new file mode 100644
index 0000000000..5cbb4fc5c9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Material.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Mesh.png b/indra/newview/skins/gold/textures/icons/Inv_Mesh.png
new file mode 100644
index 0000000000..69217d1cdc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Mesh.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Notecard.png b/indra/newview/skins/gold/textures/icons/Inv_Notecard.png
new file mode 100644
index 0000000000..96f45bc55e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Notecard.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Object.png b/indra/newview/skins/gold/textures/icons/Inv_Object.png
new file mode 100644
index 0000000000..fe6b201570
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Object.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Object_Multi.png b/indra/newview/skins/gold/textures/icons/Inv_Object_Multi.png
new file mode 100644
index 0000000000..3793594059
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Object_Multi.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Pants.png b/indra/newview/skins/gold/textures/icons/Inv_Pants.png
new file mode 100644
index 0000000000..5673bc29ed
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Pants.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Physics.png b/indra/newview/skins/gold/textures/icons/Inv_Physics.png
new file mode 100644
index 0000000000..43bd082d8a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Physics.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Script.png b/indra/newview/skins/gold/textures/icons/Inv_Script.png
new file mode 100644
index 0000000000..68d2ac425f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Script.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Settings.png b/indra/newview/skins/gold/textures/icons/Inv_Settings.png
new file mode 100644
index 0000000000..ca6cf10314
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Settings.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_SettingsDay.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsDay.png
new file mode 100644
index 0000000000..d0c4b2cdcd
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsDay.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_SettingsSky.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsSky.png
new file mode 100644
index 0000000000..5332404d37
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsSky.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_SettingsWater.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsWater.png
new file mode 100644
index 0000000000..88ff803756
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsWater.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Shape.png b/indra/newview/skins/gold/textures/icons/Inv_Shape.png
new file mode 100644
index 0000000000..e5db447b36
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Shape.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Shirt.png b/indra/newview/skins/gold/textures/icons/Inv_Shirt.png
new file mode 100644
index 0000000000..ffabff9c6c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Shirt.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Shoe.png b/indra/newview/skins/gold/textures/icons/Inv_Shoe.png
new file mode 100644
index 0000000000..784d1d23a3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Shoe.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Skin.png b/indra/newview/skins/gold/textures/icons/Inv_Skin.png
new file mode 100644
index 0000000000..a232c5ac67
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Skin.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Skirt.png b/indra/newview/skins/gold/textures/icons/Inv_Skirt.png
new file mode 100644
index 0000000000..5970f39b1b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Skirt.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Snapshot.png b/indra/newview/skins/gold/textures/icons/Inv_Snapshot.png
new file mode 100644
index 0000000000..9eaca9e7ef
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Snapshot.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Socks.png b/indra/newview/skins/gold/textures/icons/Inv_Socks.png
new file mode 100644
index 0000000000..95a3a68de6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Socks.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Sound.png b/indra/newview/skins/gold/textures/icons/Inv_Sound.png
new file mode 100644
index 0000000000..138d4c5c36
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Sound.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.png
new file mode 100644
index 0000000000..c3aae7c736
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.png
new file mode 100644
index 0000000000..15fd8225fc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_SysClosed.png b/indra/newview/skins/gold/textures/icons/Inv_SysClosed.png
new file mode 100644
index 0000000000..2550cae0d4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_SysClosed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_SysOpen.png b/indra/newview/skins/gold/textures/icons/Inv_SysOpen.png
new file mode 100644
index 0000000000..5b56d86184
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_SysOpen.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Tattoo.png b/indra/newview/skins/gold/textures/icons/Inv_Tattoo.png
new file mode 100644
index 0000000000..af5a780685
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Tattoo.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Texture.png b/indra/newview/skins/gold/textures/icons/Inv_Texture.png
new file mode 100644
index 0000000000..168a97515a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Texture.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.png b/indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.png
new file mode 100644
index 0000000000..c4b186c3de
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_TrashClosed.png b/indra/newview/skins/gold/textures/icons/Inv_TrashClosed.png
new file mode 100644
index 0000000000..89f0caa5a2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_TrashClosed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_TrashOpen.png b/indra/newview/skins/gold/textures/icons/Inv_TrashOpen.png
new file mode 100644
index 0000000000..d1f1eeaf42
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_TrashOpen.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Underpants.png b/indra/newview/skins/gold/textures/icons/Inv_Underpants.png
new file mode 100644
index 0000000000..77f8e55270
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Underpants.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Undershirt.png b/indra/newview/skins/gold/textures/icons/Inv_Undershirt.png
new file mode 100644
index 0000000000..477d76cf11
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Undershirt.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_Universal.png b/indra/newview/skins/gold/textures/icons/Inv_Universal.png
new file mode 100644
index 0000000000..65b2f88f02
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_Universal.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_UnknownObject.png b/indra/newview/skins/gold/textures/icons/Inv_UnknownObject.png
new file mode 100644
index 0000000000..603a6d7aaa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_UnknownObject.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.png
new file mode 100644
index 0000000000..cd561d24ba
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.png
new file mode 100644
index 0000000000..6dc9d451cc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/List_View_Disabled.png b/indra/newview/skins/gold/textures/icons/List_View_Disabled.png
new file mode 100644
index 0000000000..125034b0cb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/List_View_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/List_View_On.png b/indra/newview/skins/gold/textures/icons/List_View_On.png
new file mode 100644
index 0000000000..fcf77f004f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/List_View_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Lock.png b/indra/newview/skins/gold/textures/icons/Lock.png
new file mode 100644
index 0000000000..2db6ed0213
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Lock.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Locked_Icon.png b/indra/newview/skins/gold/textures/icons/Locked_Icon.png
new file mode 100644
index 0000000000..4985af1be1
--- /dev/null
+++ 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/gold/textures/icons/Male.png b/indra/newview/skins/gold/textures/icons/Male.png
new file mode 100644
index 0000000000..803171f5c6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Male.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Microphone_On.png b/indra/newview/skins/gold/textures/icons/Microphone_On.png
new file mode 100644
index 0000000000..7a7d39d982
--- /dev/null
+++ 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/gold/textures/icons/MusicNote.png b/indra/newview/skins/gold/textures/icons/MusicNote.png
new file mode 100644
index 0000000000..8d3534a94b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/MusicNote.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.png
new file mode 100644
index 0000000000..5755315e23
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OptionsMenu_Off.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Off.png
new file mode 100644
index 0000000000..2e9a5faa21
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OptionsMenu_Press.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Press.png
new file mode 100644
index 0000000000..1b08648b51
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.png
new file mode 100644
index 0000000000..1d2dbd6349
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Off.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Off.png
new file mode 100644
index 0000000000..f8f3367c42
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_On.png b/indra/newview/skins/gold/textures/icons/OutboxPush_On.png
new file mode 100644
index 0000000000..b1fd734100
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_On.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.png
new file mode 100644
index 0000000000..e234400b72
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Over.png
new file mode 100644
index 0000000000..9e1b0e2dfc
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Press.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Press.png
new file mode 100644
index 0000000000..14d9eacc52
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.png
new file mode 100644
index 0000000000..85015fc913
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.png
new file mode 100644
index 0000000000..6158242b68
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.png
new file mode 100644
index 0000000000..7105380bff
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.png
new file mode 100644
index 0000000000..0e65a60fc8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.png
new file mode 100644
index 0000000000..7acef05891
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.png
new file mode 100644
index 0000000000..4f5b34a643
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Selected.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected.png
new file mode 100644
index 0000000000..d58826da67
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.png
new file mode 100644
index 0000000000..cad9f118b1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.png
new file mode 100644
index 0000000000..65d914c6b3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.png
new file mode 100644
index 0000000000..cd50d41903
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.png
new file mode 100644
index 0000000000..dd12d94ad2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.png
new file mode 100644
index 0000000000..4739c501ad
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.png
new file mode 100644
index 0000000000..9826491efd
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.png
new file mode 100644
index 0000000000..7634e5fab0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.png
new file mode 100644
index 0000000000..7ecd645df2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.png b/indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.png
new file mode 100644
index 0000000000..a1b0faa008
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.png
new file mode 100644
index 0000000000..831c25a34b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.png
new file mode 100644
index 0000000000..be829fb5ef
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.png
new file mode 100644
index 0000000000..579bfe58f8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.png
new file mode 100644
index 0000000000..3f4ee0b482
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Health_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Health_Dark.png
new file mode 100644
index 0000000000..98618de927
--- /dev/null
+++ 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/gold/textures/icons/Parcel_PushNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Dark.png
new file mode 100644
index 0000000000..2867004014
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.png
new file mode 100644
index 0000000000..a3a51973af
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.png
new file mode 100644
index 0000000000..e8487ca092
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_R_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_R_Dark.png
new file mode 100644
index 0000000000..5c165c2fac
--- /dev/null
+++ 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/gold/textures/icons/Parcel_ScriptsNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_ScriptsNo_Dark.png
new file mode 100644
index 0000000000..bfc55fc403
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_ScriptsNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.png
new file mode 100644
index 0000000000..3477e0654c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.png
new file mode 100644
index 0000000000..eff089487e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.png
new file mode 100644
index 0000000000..68f0b14d44
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.png
new file mode 100644
index 0000000000..200e04a59f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.png
new file mode 100644
index 0000000000..14cafc5bd2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.png
new file mode 100644
index 0000000000..ec316e822e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.png
new file mode 100644
index 0000000000..de3532a70b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.png
new file mode 100644
index 0000000000..329620fa69
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.png
new file mode 100644
index 0000000000..81e0fa7bc4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.png b/indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.png
new file mode 100644
index 0000000000..d8fee0fef7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.png b/indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.png
new file mode 100644
index 0000000000..ea2ad79611
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Pause_Off.png b/indra/newview/skins/gold/textures/icons/Pause_Off.png
new file mode 100644
index 0000000000..5d44412783
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Pause_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Pause_Over.png b/indra/newview/skins/gold/textures/icons/Pause_Over.png
new file mode 100644
index 0000000000..d1609a144b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Pause_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Pause_Press.png b/indra/newview/skins/gold/textures/icons/Pause_Press.png
new file mode 100644
index 0000000000..6b918d1ae6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Pause_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Permission_Ungranted.png b/indra/newview/skins/gold/textures/icons/Permission_Ungranted.png
new file mode 100644
index 0000000000..d206af4433
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Permission_Ungranted.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Person_Check.png b/indra/newview/skins/gold/textures/icons/Person_Check.png
new file mode 100644
index 0000000000..39a63a70cf
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Person_Check.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Person_Star.png b/indra/newview/skins/gold/textures/icons/Person_Star.png
new file mode 100644
index 0000000000..c4e625b3c1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Person_Star.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Play_Off.png b/indra/newview/skins/gold/textures/icons/Play_Off.png
new file mode 100644
index 0000000000..dac2f2d6db
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Play_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Play_Over.png b/indra/newview/skins/gold/textures/icons/Play_Over.png
new file mode 100644
index 0000000000..1d261efcda
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Play_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Play_Press.png b/indra/newview/skins/gold/textures/icons/Play_Press.png
new file mode 100644
index 0000000000..f7251ce549
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Play_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Presets_Icon.png b/indra/newview/skins/gold/textures/icons/Presets_Icon.png
new file mode 100644
index 0000000000..13642e88d1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Presets_Icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.png b/indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.png
new file mode 100644
index 0000000000..96d1021f81
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.png b/indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.png
new file mode 100644
index 0000000000..55d922cda7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Profile_Friend_Online.png b/indra/newview/skins/gold/textures/icons/Profile_Friend_Online.png
new file mode 100644
index 0000000000..febe8e78fa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Profile_Friend_Online.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.png
new file mode 100644
index 0000000000..2632eb173b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.png
new file mode 100644
index 0000000000..fd8b152c12
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.png
new file mode 100644
index 0000000000..cef3ec4e5a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.png
new file mode 100644
index 0000000000..5821566703
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.png
new file mode 100644
index 0000000000..ea1b55eca0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.png
new file mode 100644
index 0000000000..eb3fc9e713
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_1.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_1.png
new file mode 100644
index 0000000000..ff277fc431
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_1.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_10.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_10.png
new file mode 100644
index 0000000000..1c94e21d89
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_10.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_11.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_11.png
new file mode 100644
index 0000000000..89bea9b474
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_11.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_12.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_12.png
new file mode 100644
index 0000000000..da38475ba4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_12.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_2.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_2.png
new file mode 100644
index 0000000000..c024275ebe
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_2.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_3.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_3.png
new file mode 100644
index 0000000000..87b931e72e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_3.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_4.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_4.png
new file mode 100644
index 0000000000..6dbef74361
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_4.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_5.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_5.png
new file mode 100644
index 0000000000..daccf9b375
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_5.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_6.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_6.png
new file mode 100644
index 0000000000..cafddcb88d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_6.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_7.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_7.png
new file mode 100644
index 0000000000..8acf6472d4
--- /dev/null
+++ 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/gold/textures/icons/ProgressLarge_9.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_9.png
new file mode 100644
index 0000000000..293a7b8f5c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_9.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_1.png b/indra/newview/skins/gold/textures/icons/Progress_1.png
new file mode 100644
index 0000000000..bc7a1e7e96
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_10.png b/indra/newview/skins/gold/textures/icons/Progress_10.png
new file mode 100644
index 0000000000..acf4d21aba
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_10.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_11.png b/indra/newview/skins/gold/textures/icons/Progress_11.png
new file mode 100644
index 0000000000..1842cd09d0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_11.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_12.png b/indra/newview/skins/gold/textures/icons/Progress_12.png
new file mode 100644
index 0000000000..0ea9dda83e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_12.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_2.png b/indra/newview/skins/gold/textures/icons/Progress_2.png
new file mode 100644
index 0000000000..29d6bbcbcb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_3.png b/indra/newview/skins/gold/textures/icons/Progress_3.png
new file mode 100644
index 0000000000..52a03125e9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_4.png b/indra/newview/skins/gold/textures/icons/Progress_4.png
new file mode 100644
index 0000000000..4b2798519f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_5.png b/indra/newview/skins/gold/textures/icons/Progress_5.png
new file mode 100644
index 0000000000..3f02b8f31a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_6.png b/indra/newview/skins/gold/textures/icons/Progress_6.png
new file mode 100644
index 0000000000..04c8f716d4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_7.png b/indra/newview/skins/gold/textures/icons/Progress_7.png
new file mode 100644
index 0000000000..c96b4c08d6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_7.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_8.png b/indra/newview/skins/gold/textures/icons/Progress_8.png
new file mode 100644
index 0000000000..9463f50707
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_8.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Progress_9.png b/indra/newview/skins/gold/textures/icons/Progress_9.png
new file mode 100644
index 0000000000..928a3e934e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Progress_9.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Refresh_Off.png b/indra/newview/skins/gold/textures/icons/Refresh_Off.png
new file mode 100644
index 0000000000..e645a8159f
--- /dev/null
+++ 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/gold/textures/icons/Search_Icon.png b/indra/newview/skins/gold/textures/icons/Search_Icon.png
new file mode 100644
index 0000000000..0ea7b14f81
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Search_Icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Shirt_Large.png b/indra/newview/skins/gold/textures/icons/Shirt_Large.png
new file mode 100644
index 0000000000..06fce6bbaa
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Shirt_Large.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Shop.png b/indra/newview/skins/gold/textures/icons/Shop.png
new file mode 100644
index 0000000000..93353cf2fe
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Shop.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/SkipBackward_Off.png b/indra/newview/skins/gold/textures/icons/SkipBackward_Off.png
new file mode 100644
index 0000000000..20fd2b8e22
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/SkipBackward_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/SkipForward_Off.png b/indra/newview/skins/gold/textures/icons/SkipForward_Off.png
new file mode 100644
index 0000000000..30e28d3d31
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/SkipForward_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/StopReload_Off.png b/indra/newview/skins/gold/textures/icons/StopReload_Off.png
new file mode 100644
index 0000000000..500a81d715
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/StopReload_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/StopReload_Over.png b/indra/newview/skins/gold/textures/icons/StopReload_Over.png
new file mode 100644
index 0000000000..a065a37d14
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/StopReload_Over.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Stop_Off.png b/indra/newview/skins/gold/textures/icons/Stop_Off.png
new file mode 100644
index 0000000000..2d00083e2e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Stop_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Sync_Disabled.png b/indra/newview/skins/gold/textures/icons/Sync_Disabled.png
new file mode 100644
index 0000000000..7b39e7cd6f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Sync_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Sync_Enabled.png b/indra/newview/skins/gold/textures/icons/Sync_Enabled.png
new file mode 100644
index 0000000000..0e7e5157cb
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Sync_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Sync_Progress_1.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_1.png
new file mode 100644
index 0000000000..218edaa986
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Sync_Progress_2.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_2.png
new file mode 100644
index 0000000000..23cb9d63c0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Sync_Progress_3.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_3.png
new file mode 100644
index 0000000000..490826011a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Sync_Progress_4.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_4.png
new file mode 100644
index 0000000000..de1c815e90
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Sync_Progress_5.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_5.png
new file mode 100644
index 0000000000..2897b37382
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Sync_Progress_6.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_6.png
new file mode 100644
index 0000000000..862410e9e4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/System_Notification_Large.png b/indra/newview/skins/gold/textures/icons/System_Notification_Large.png
new file mode 100644
index 0000000000..01c6e31f41
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/System_Notification_Large.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/System_Notification_Small.png b/indra/newview/skins/gold/textures/icons/System_Notification_Small.png
new file mode 100644
index 0000000000..69b823d852
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/System_Notification_Small.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/TrashItem_Disabled.png b/indra/newview/skins/gold/textures/icons/TrashItem_Disabled.png
new file mode 100644
index 0000000000..800d9434d2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/TrashItem_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/TrashItem_Off.png b/indra/newview/skins/gold/textures/icons/TrashItem_Off.png
new file mode 100644
index 0000000000..0cbff4f1d7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/TrashItem_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/TrashItem_Press.png b/indra/newview/skins/gold/textures/icons/TrashItem_Press.png
new file mode 100644
index 0000000000..fac13226e7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/TrashItem_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/UnZoom_Off.png b/indra/newview/skins/gold/textures/icons/UnZoom_Off.png
new file mode 100644
index 0000000000..34ec3f5de8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/UnZoom_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/UpArrow_Off.png b/indra/newview/skins/gold/textures/icons/UpArrow_Off.png
new file mode 100644
index 0000000000..d5ddc353e7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/UpArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Video_URL_Off.png b/indra/newview/skins/gold/textures/icons/Video_URL_Off.png
new file mode 100644
index 0000000000..d37a189645
--- /dev/null
+++ 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/gold/textures/icons/Web_Profile_Off.png b/indra/newview/skins/gold/textures/icons/Web_Profile_Off.png
new file mode 100644
index 0000000000..cf8f9c8f94
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/Web_Profile_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/YouAreHere_Badge.png b/indra/newview/skins/gold/textures/icons/YouAreHere_Badge.png
new file mode 100644
index 0000000000..ed1805c096
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/YouAreHere_Badge.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/Zoom_Off.png b/indra/newview/skins/gold/textures/icons/Zoom_Off.png
new file mode 100644
index 0000000000..833e608201
--- /dev/null
+++ 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/gold/textures/icons/collapse_to_one_line.png b/indra/newview/skins/gold/textures/icons/collapse_to_one_line.png
new file mode 100644
index 0000000000..3730924ad8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/collapse_to_one_line.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/copy_clipboard.png b/indra/newview/skins/gold/textures/icons/copy_clipboard.png
new file mode 100644
index 0000000000..9ce67d8547
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/copy_clipboard.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/delete_icon.png b/indra/newview/skins/gold/textures/icons/delete_icon.png
new file mode 100644
index 0000000000..5a80155d8b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/delete_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/edit_mine.png b/indra/newview/skins/gold/textures/icons/edit_mine.png
new file mode 100644
index 0000000000..2fb10deba2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/edit_mine.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/edit_theirs.png b/indra/newview/skins/gold/textures/icons/edit_theirs.png
new file mode 100644
index 0000000000..586c08c181
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/edit_theirs.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/emoji_picker_icon.png b/indra/newview/skins/gold/textures/icons/emoji_picker_icon.png
new file mode 100644
index 0000000000..6c1a1a3c62
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/emoji_picker_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/expand_one_liner.png b/indra/newview/skins/gold/textures/icons/expand_one_liner.png
new file mode 100644
index 0000000000..0d1a60547a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/expand_one_liner.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/file_upload.png b/indra/newview/skins/gold/textures/icons/file_upload.png
new file mode 100644
index 0000000000..78b75fdd72
--- /dev/null
+++ 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/gold/textures/icons/map_placeholder.png b/indra/newview/skins/gold/textures/icons/map_placeholder.png
new file mode 100644
index 0000000000..80e5deac7e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/map_placeholder.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/multi_folder_mode.png b/indra/newview/skins/gold/textures/icons/multi_folder_mode.png
new file mode 100644
index 0000000000..b363848aba
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/multi_folder_mode.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/nearby_chat_icon.png b/indra/newview/skins/gold/textures/icons/nearby_chat_icon.png
new file mode 100644
index 0000000000..c5f52f010e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/nearby_chat_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/object_icon.png b/indra/newview/skins/gold/textures/icons/object_icon.png
new file mode 100644
index 0000000000..51bf0b0649
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/object_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/paste_clipboard.png b/indra/newview/skins/gold/textures/icons/paste_clipboard.png
new file mode 100644
index 0000000000..ff8493d4ad
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/paste_clipboard.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/pop_up_caution.png b/indra/newview/skins/gold/textures/icons/pop_up_caution.png
new file mode 100644
index 0000000000..63b5cdfe83
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/pop_up_caution.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_badge_beta.png b/indra/newview/skins/gold/textures/icons/profile_badge_beta.png
new file mode 100644
index 0000000000..95e277aab0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_beta.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.png
new file mode 100644
index 0000000000..fb145901e2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_badge_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_lifetime.png
new file mode 100644
index 0000000000..3f7fd343b3
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_badge_linden.png b/indra/newview/skins/gold/textures/icons/profile_badge_linden.png
new file mode 100644
index 0000000000..6ab9fcebea
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_linden.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.png
new file mode 100644
index 0000000000..5c68ad40ce
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.png
new file mode 100644
index 0000000000..58957b7b96
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.png
new file mode 100644
index 0000000000..331553492c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.png
new file mode 100644
index 0000000000..e9e9c1b626
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.png
new file mode 100644
index 0000000000..4f5374d614
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.png
new file mode 100644
index 0000000000..e8a64541ee
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/remove_icon.png b/indra/newview/skins/gold/textures/icons/remove_icon.png
new file mode 100644
index 0000000000..d8a45cc21c
--- /dev/null
+++ 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/gold/textures/icons/single_folder_back.png b/indra/newview/skins/gold/textures/icons/single_folder_back.png
new file mode 100644
index 0000000000..b93bb2525a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/single_folder_back.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/single_folder_forward.png b/indra/newview/skins/gold/textures/icons/single_folder_forward.png
new file mode 100644
index 0000000000..12a21b2bba
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/single_folder_forward.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/single_folder_mode.png b/indra/newview/skins/gold/textures/icons/single_folder_mode.png
new file mode 100644
index 0000000000..0fc8475917
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/single_folder_mode.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/single_folder_up.png b/indra/newview/skins/gold/textures/icons/single_folder_up.png
new file mode 100644
index 0000000000..c1c8c63870
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/single_folder_up.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/snapshot_icon.png b/indra/newview/skins/gold/textures/icons/snapshot_icon.png
new file mode 100644
index 0000000000..9b6ac6eeb0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/snapshot_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/texture_icon.png b/indra/newview/skins/gold/textures/icons/texture_icon.png
new file mode 100644
index 0000000000..f5c205208c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/icons/texture_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/icons/thumbnail_fallback_icon.png b/indra/newview/skins/gold/textures/icons/thumbnail_fallback_icon.png
new file mode 100644
index 0000000000..19629aba04
--- /dev/null
+++ 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/gold/textures/jump_left_in.tga b/indra/newview/skins/gold/textures/jump_left_in.tga
new file mode 100644
index 0000000000..e0656c901d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/jump_left_in.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/jump_left_out.tga b/indra/newview/skins/gold/textures/jump_left_out.tga
new file mode 100644
index 0000000000..fb6dac0c3d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/jump_left_out.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/jump_right_in.tga b/indra/newview/skins/gold/textures/jump_right_in.tga
new file mode 100644
index 0000000000..010c748c2a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/jump_right_in.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/jump_right_out.tga b/indra/newview/skins/gold/textures/jump_right_out.tga
new file mode 100644
index 0000000000..33355262d4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/jump_right_out.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/lag_status_critical.tga b/indra/newview/skins/gold/textures/lag_status_critical.tga
new file mode 100644
index 0000000000..bbc71d9e77
--- /dev/null
+++ b/indra/newview/skins/gold/textures/lag_status_critical.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/lag_status_good.tga b/indra/newview/skins/gold/textures/lag_status_good.tga
new file mode 100644
index 0000000000..680ba90f17
--- /dev/null
+++ b/indra/newview/skins/gold/textures/lag_status_good.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/lag_status_warning.tga b/indra/newview/skins/gold/textures/lag_status_warning.tga
new file mode 100644
index 0000000000..13ce3cc396
--- /dev/null
+++ b/indra/newview/skins/gold/textures/lag_status_warning.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/legend.tga b/indra/newview/skins/gold/textures/legend.tga
new file mode 100644
index 0000000000..0dbb8fda4f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/legend.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/locked_image.j2c b/indra/newview/skins/gold/textures/locked_image.j2c
new file mode 100644
index 0000000000..9e8998d675
--- /dev/null
+++ b/indra/newview/skins/gold/textures/locked_image.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_avatar_16.tga b/indra/newview/skins/gold/textures/map_avatar_16.tga
new file mode 100644
index 0000000000..f59e9e9193
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_avatar_16.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_avatar_32.tga b/indra/newview/skins/gold/textures/map_avatar_32.tga
new file mode 100644
index 0000000000..aebeab4093
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_avatar_32.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_avatar_8.tga b/indra/newview/skins/gold/textures/map_avatar_8.tga
new file mode 100644
index 0000000000..8500eadeba
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_avatar_8.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_avatar_above_32.tga b/indra/newview/skins/gold/textures/map_avatar_above_32.tga
new file mode 100644
index 0000000000..65bd0561a7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_avatar_above_32.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_avatar_below_32.tga b/indra/newview/skins/gold/textures/map_avatar_below_32.tga
new file mode 100644
index 0000000000..496c44b369
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_avatar_below_32.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_avatar_unknown_32.tga b/indra/newview/skins/gold/textures/map_avatar_unknown_32.tga
new file mode 100644
index 0000000000..d1192478c6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_avatar_unknown_32.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_avatar_you_32.tga b/indra/newview/skins/gold/textures/map_avatar_you_32.tga
new file mode 100644
index 0000000000..84b57aceaf
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_avatar_you_32.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_event.tga b/indra/newview/skins/gold/textures/map_event.tga
new file mode 100644
index 0000000000..2c06d08fd2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_event.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_home.tga b/indra/newview/skins/gold/textures/map_home.tga
new file mode 100644
index 0000000000..acaaa3db44
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_home.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_infohub.tga b/indra/newview/skins/gold/textures/map_infohub.tga
new file mode 100644
index 0000000000..d0134fa5fe
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_infohub.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_telehub.tga b/indra/newview/skins/gold/textures/map_telehub.tga
new file mode 100644
index 0000000000..545b8e532c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_telehub.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_track_16.tga b/indra/newview/skins/gold/textures/map_track_16.tga
new file mode 100644
index 0000000000..451ce24cf0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_track_16.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_ui_collapse_icon.png b/indra/newview/skins/gold/textures/map_ui_collapse_icon.png
new file mode 100644
index 0000000000..e4de49d4af
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_ui_collapse_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/map_ui_expand_icon.png b/indra/newview/skins/gold/textures/map_ui_expand_icon.png
new file mode 100644
index 0000000000..08734b4cc0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/map_ui_expand_icon.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/materials_ui_x_24.png b/indra/newview/skins/gold/textures/materials_ui_x_24.png
new file mode 100644
index 0000000000..6d88554914
--- /dev/null
+++ 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/gold/textures/menu_separator.png b/indra/newview/skins/gold/textures/menu_separator.png
new file mode 100644
index 0000000000..7bb27c499d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/menu_separator.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/missing_asset.tga b/indra/newview/skins/gold/textures/missing_asset.tga
new file mode 100644
index 0000000000..9a43f4db5d
--- /dev/null
+++ 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/gold/textures/navbar/Arrow_Left_Off.png b/indra/newview/skins/gold/textures/navbar/Arrow_Left_Off.png
new file mode 100644
index 0000000000..19569501fe
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Arrow_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Arrow_Right_Off.png b/indra/newview/skins/gold/textures/navbar/Arrow_Right_Off.png
new file mode 100644
index 0000000000..3648c42656
--- /dev/null
+++ 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/gold/textures/navbar/Favorite_Link_Over.png b/indra/newview/skins/gold/textures/navbar/Favorite_Link_Over.png
new file mode 100644
index 0000000000..d4f126f969
--- /dev/null
+++ 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/gold/textures/navbar/FileMenu_Divider.png b/indra/newview/skins/gold/textures/navbar/FileMenu_Divider.png
new file mode 100644
index 0000000000..5ab4abc5b8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/FileMenu_Divider.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Flag.png b/indra/newview/skins/gold/textures/navbar/Flag.png
new file mode 100644
index 0000000000..df53c89224
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Flag.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Help_Press.png b/indra/newview/skins/gold/textures/navbar/Help_Press.png
new file mode 100644
index 0000000000..ed3695f9d5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Help_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Home_Off.png b/indra/newview/skins/gold/textures/navbar/Home_Off.png
new file mode 100644
index 0000000000..fe3bc63b77
--- /dev/null
+++ 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/gold/textures/navbar/Landmarks.png b/indra/newview/skins/gold/textures/navbar/Landmarks.png
new file mode 100644
index 0000000000..2b35de913b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/navbar/Landmarks.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/navbar/Lock.png b/indra/newview/skins/gold/textures/navbar/Lock.png
new file mode 100644
index 0000000000..cf569d6ad2
--- /dev/null
+++ 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/gold/textures/navbar/Search.png b/indra/newview/skins/gold/textures/navbar/Search.png
new file mode 100644
index 0000000000..4c29e57f7b
--- /dev/null
+++ 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/gold/textures/notify_caution_icon.tga b/indra/newview/skins/gold/textures/notify_caution_icon.tga
new file mode 100644
index 0000000000..abc23d1d7a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/notify_caution_icon.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/pixiesmall.j2c b/indra/newview/skins/gold/textures/pixiesmall.j2c
new file mode 100644
index 0000000000..a1ff64014b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/pixiesmall.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/red_x.png b/indra/newview/skins/gold/textures/red_x.png
new file mode 100644
index 0000000000..a61202f09b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/red_x.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/rounded_square.j2c b/indra/newview/skins/gold/textures/rounded_square.j2c
new file mode 100644
index 0000000000..c8bb572fa9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/rounded_square.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/script_error.j2c b/indra/newview/skins/gold/textures/script_error.j2c
new file mode 100644
index 0000000000..893cb642e7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/script_error.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/silhouette.j2c b/indra/newview/skins/gold/textures/silhouette.j2c
new file mode 100644
index 0000000000..3859d4cb34
--- /dev/null
+++ b/indra/newview/skins/gold/textures/silhouette.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/slim_icon_16_viewer.tga b/indra/newview/skins/gold/textures/slim_icon_16_viewer.tga
new file mode 100644
index 0000000000..552181d36a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/slim_icon_16_viewer.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/snapshot_download.png b/indra/newview/skins/gold/textures/snapshot_download.png
new file mode 100644
index 0000000000..6aa1abded5
--- /dev/null
+++ b/indra/newview/skins/gold/textures/snapshot_download.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/snapshot_email.png b/indra/newview/skins/gold/textures/snapshot_email.png
new file mode 100644
index 0000000000..dee784a9bf
--- /dev/null
+++ b/indra/newview/skins/gold/textures/snapshot_email.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/spacer24.tga b/indra/newview/skins/gold/textures/spacer24.tga
new file mode 100644
index 0000000000..c7cab6b38c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/spacer24.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/tabarea.tga b/indra/newview/skins/gold/textures/tabarea.tga
new file mode 100644
index 0000000000..5517aebfc8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/tabarea.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.png b/indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.png
new file mode 100644
index 0000000000..213acbe87b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png
new file mode 100644
index 0000000000..4e59042e33
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.png
new file mode 100644
index 0000000000..be7b298bb8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png
new file mode 100644
index 0000000000..1e234ff09b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.png
new file mode 100644
index 0000000000..48c78b453d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.png
new file mode 100644
index 0000000000..bc4e00c646
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.png
new file mode 100644
index 0000000000..293aeef5e6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.png
new file mode 100644
index 0000000000..760db9360d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.png
new file mode 100644
index 0000000000..4556602f58
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.png
new file mode 100644
index 0000000000..691b600510
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.png
new file mode 100644
index 0000000000..f5a5f7a846
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.png
new file mode 100644
index 0000000000..e56eda9802
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.png b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.png
new file mode 100644
index 0000000000..4ed7a2b183
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.png b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.png
new file mode 100644
index 0000000000..b3316386b9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/tearoff_pressed.tga b/indra/newview/skins/gold/textures/tearoff_pressed.tga
new file mode 100644
index 0000000000..620d109de0
--- /dev/null
+++ b/indra/newview/skins/gold/textures/tearoff_pressed.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/tearoffbox.tga b/indra/newview/skins/gold/textures/tearoffbox.tga
new file mode 100644
index 0000000000..0670d2e91b
--- /dev/null
+++ 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/gold/textures/toolbar_icons/360_capture.png b/indra/newview/skins/gold/textures/toolbar_icons/360_capture.png
new file mode 100644
index 0000000000..163cebe29f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/360_capture.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/appearance.png b/indra/newview/skins/gold/textures/toolbar_icons/appearance.png
new file mode 100644
index 0000000000..e6b1365388
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/appearance.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/avatars.png b/indra/newview/skins/gold/textures/toolbar_icons/avatars.png
new file mode 100644
index 0000000000..8fa0600cee
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/avatars.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/build.png b/indra/newview/skins/gold/textures/toolbar_icons/build.png
new file mode 100644
index 0000000000..e21ab3f0e4
--- /dev/null
+++ 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/gold/textures/toolbar_icons/chat.png b/indra/newview/skins/gold/textures/toolbar_icons/chat.png
new file mode 100644
index 0000000000..e0dbac495f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/chat.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/destinations.png b/indra/newview/skins/gold/textures/toolbar_icons/destinations.png
new file mode 100644
index 0000000000..e2325f083a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/destinations.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/environments.png b/indra/newview/skins/gold/textures/toolbar_icons/environments.png
new file mode 100644
index 0000000000..620db9f793
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/environments.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/facebook.png b/indra/newview/skins/gold/textures/toolbar_icons/facebook.png
new file mode 100644
index 0000000000..ae524b643f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/facebook.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.png b/indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.png
new file mode 100644
index 0000000000..811efffc0b
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/flickr.png b/indra/newview/skins/gold/textures/toolbar_icons/flickr.png
new file mode 100644
index 0000000000..7fce9f0df2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/flickr.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/gestures.png b/indra/newview/skins/gold/textures/toolbar_icons/gestures.png
new file mode 100644
index 0000000000..2404bb4e25
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/gestures.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/grid_status.png b/indra/newview/skins/gold/textures/toolbar_icons/grid_status.png
new file mode 100644
index 0000000000..b92b93cfb4
--- /dev/null
+++ 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/gold/textures/toolbar_icons/howto.png b/indra/newview/skins/gold/textures/toolbar_icons/howto.png
new file mode 100644
index 0000000000..8594d71113
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/howto.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/inventory.png b/indra/newview/skins/gold/textures/toolbar_icons/inventory.png
new file mode 100644
index 0000000000..ab3191255e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/inventory.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/land.png b/indra/newview/skins/gold/textures/toolbar_icons/land.png
new file mode 100644
index 0000000000..89ea7604a4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/land.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/map.png b/indra/newview/skins/gold/textures/toolbar_icons/map.png
new file mode 100644
index 0000000000..ed1049b7db
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/map.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/marketplace.png b/indra/newview/skins/gold/textures/toolbar_icons/marketplace.png
new file mode 100644
index 0000000000..62bad20be6
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/marketplace.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/mini_cart.png b/indra/newview/skins/gold/textures/toolbar_icons/mini_cart.png
new file mode 100644
index 0000000000..9eeb1d4e09
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/mini_cart.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/mini_map.png b/indra/newview/skins/gold/textures/toolbar_icons/mini_map.png
new file mode 100644
index 0000000000..ab0a654056
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/mini_map.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/mktlistings.png b/indra/newview/skins/gold/textures/toolbar_icons/mktlistings.png
new file mode 100644
index 0000000000..a6f90461d7
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/mktlistings.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/move.png b/indra/newview/skins/gold/textures/toolbar_icons/move.png
new file mode 100644
index 0000000000..5c2ced7375
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/move.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.png b/indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.png
new file mode 100644
index 0000000000..77a7cd5f44
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/outbox.png b/indra/newview/skins/gold/textures/toolbar_icons/outbox.png
new file mode 100644
index 0000000000..0f3db1c47c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/outbox.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/people.png b/indra/newview/skins/gold/textures/toolbar_icons/people.png
new file mode 100644
index 0000000000..7228ae8e2f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/people.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/performance.png b/indra/newview/skins/gold/textures/toolbar_icons/performance.png
new file mode 100644
index 0000000000..91baf849c8
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/performance.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/picks.png b/indra/newview/skins/gold/textures/toolbar_icons/picks.png
new file mode 100644
index 0000000000..befda04b42
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/picks.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/places.png b/indra/newview/skins/gold/textures/toolbar_icons/places.png
new file mode 100644
index 0000000000..97d9fa066c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/places.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/preferences.png b/indra/newview/skins/gold/textures/toolbar_icons/preferences.png
new file mode 100644
index 0000000000..4ccd7b8ae1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/preferences.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/profile.png b/indra/newview/skins/gold/textures/toolbar_icons/profile.png
new file mode 100644
index 0000000000..32fe2bf8ac
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/profile.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/report_abuse.png b/indra/newview/skins/gold/textures/toolbar_icons/report_abuse.png
new file mode 100644
index 0000000000..d5cb6ca259
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/report_abuse.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/resync_animations.png b/indra/newview/skins/gold/textures/toolbar_icons/resync_animations.png
new file mode 100644
index 0000000000..dc9ee9c428
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/resync_animations.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/search.png b/indra/newview/skins/gold/textures/toolbar_icons/search.png
new file mode 100644
index 0000000000..bcb11e950d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/search.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/snapshot.png b/indra/newview/skins/gold/textures/toolbar_icons/snapshot.png
new file mode 100644
index 0000000000..d26da9b1d2
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/snapshot.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/speak.png b/indra/newview/skins/gold/textures/toolbar_icons/speak.png
new file mode 100644
index 0000000000..10cd354c5c
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/speak.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/twitter.png b/indra/newview/skins/gold/textures/toolbar_icons/twitter.png
new file mode 100644
index 0000000000..0ad56f7802
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/twitter.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/toolbar_icons/view.png b/indra/newview/skins/gold/textures/toolbar_icons/view.png
new file mode 100644
index 0000000000..ddf0df7c26
--- /dev/null
+++ b/indra/newview/skins/gold/textures/toolbar_icons/view.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/transparent.j2c b/indra/newview/skins/gold/textures/transparent.j2c
new file mode 100644
index 0000000000..1068e940b9
--- /dev/null
+++ b/indra/newview/skins/gold/textures/transparent.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/up_arrow.png b/indra/newview/skins/gold/textures/up_arrow.png
new file mode 100644
index 0000000000..76f839510e
--- /dev/null
+++ b/indra/newview/skins/gold/textures/up_arrow.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/uv_test1.j2c b/indra/newview/skins/gold/textures/uv_test1.j2c
new file mode 100644
index 0000000000..3d5b541796
--- /dev/null
+++ b/indra/newview/skins/gold/textures/uv_test1.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/uv_test2.tga b/indra/newview/skins/gold/textures/uv_test2.tga
new file mode 100644
index 0000000000..a16000d1e4
--- /dev/null
+++ b/indra/newview/skins/gold/textures/uv_test2.tga
Binary files differ
diff --git a/indra/newview/skins/gold/textures/voice_meter_dot.j2c b/indra/newview/skins/gold/textures/voice_meter_dot.j2c
new file mode 100644
index 0000000000..e536c3338a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/voice_meter_dot.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/voice_meter_rings.j2c b/indra/newview/skins/gold/textures/voice_meter_rings.j2c
new file mode 100644
index 0000000000..17e7c6c6a1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/voice_meter_rings.j2c
Binary files differ
diff --git a/indra/newview/skins/gold/textures/white.tga b/indra/newview/skins/gold/textures/white.tga
new file mode 100644
index 0000000000..9fe68631cf
--- /dev/null
+++ 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/gold/textures/widgets/track_control_moon_back.png b/indra/newview/skins/gold/textures/widgets/track_control_moon_back.png
new file mode 100644
index 0000000000..03d1e805e1
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_moon_back.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_moon_front.png b/indra/newview/skins/gold/textures/widgets/track_control_moon_front.png
new file mode 100644
index 0000000000..cdc52fe08a
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_moon_front.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.png
new file mode 100644
index 0000000000..c08b54c269
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.png
new file mode 100644
index 0000000000..a2b37d1b43
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.png
new file mode 100644
index 0000000000..3439e8717f
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.png
new file mode 100644
index 0000000000..fa745175be
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.png
new file mode 100644
index 0000000000..f92fdb3d92
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.png
new file mode 100644
index 0000000000..23571d6473
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_rotate_top.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top.png
new file mode 100644
index 0000000000..ae67084a7d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_rotate_top_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top_active.png
new file mode 100644
index 0000000000..4e1d0ad096
--- /dev/null
+++ 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/gold/textures/widgets/track_control_sun_back.png b/indra/newview/skins/gold/textures/widgets/track_control_sun_back.png
new file mode 100644
index 0000000000..b3191ccc5d
--- /dev/null
+++ b/indra/newview/skins/gold/textures/widgets/track_control_sun_back.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/widgets/track_control_sun_front.png b/indra/newview/skins/gold/textures/widgets/track_control_sun_front.png
new file mode 100644
index 0000000000..1cdcbf7861
--- /dev/null
+++ 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/gold/textures/windows/add_payment_image_center.png b/indra/newview/skins/gold/textures/windows/add_payment_image_center.png
new file mode 100644
index 0000000000..0b99a72f32
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/add_payment_image_center.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/add_payment_image_left.png b/indra/newview/skins/gold/textures/windows/add_payment_image_left.png
new file mode 100644
index 0000000000..a5b28d7023
--- /dev/null
+++ b/indra/newview/skins/gold/textures/windows/add_payment_image_left.png
Binary files differ
diff --git a/indra/newview/skins/gold/textures/windows/add_payment_image_right.png b/indra/newview/skins/gold/textures/windows/add_payment_image_right.png
new file mode 100644
index 0000000000..5724d39744
--- /dev/null
+++ 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/gold/textures/world/BeaconArrow.png b/indra/newview/skins/gold/textures/world/BeaconArrow.png
new file mode 100644
index 0000000000..54934f738a
--- /dev/null
+++ 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/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" },