summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-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.h2
-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/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.cpp31
-rw-r--r--indra/llcommon/llsdjson.cpp4
-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/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/llparcel.h102
-rw-r--r--indra/llinventory/llsettingsbase.cpp6
-rw-r--r--indra/llinventory/llsettingssky.cpp7
-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/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.cpp194
-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/lllineeditor.cpp3
-rw-r--r--indra/llui/llscrolllistctrl.cpp2
-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.cpp36
-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.txt313
-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.xml79
-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.cpp2
-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.cpp25
-rw-r--r--indra/newview/llagent.h10
-rw-r--r--indra/newview/llagentcamera.cpp10
-rw-r--r--indra/newview/llagentwearables.cpp2
-rw-r--r--indra/newview/llappearancemgr.cpp2
-rw-r--r--indra/newview/llappviewer.cpp78
-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/llfilepicker.cpp6
-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.cpp4
-rw-r--r--indra/newview/llfloaterbvhpreview.h2
-rw-r--r--indra/newview/llfloatermodelpreview.cpp5
-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/llhudtext.cpp4
-rw-r--r--indra/newview/llinventoryfilter.cpp6
-rw-r--r--indra/newview/llinventoryfilter.h2
-rw-r--r--indra/newview/llinventoryfunctions.cpp4
-rw-r--r--indra/newview/lllogchat.cpp2
-rw-r--r--indra/newview/llmaterialeditor.cpp48
-rw-r--r--indra/newview/llmeshrepository.cpp34
-rw-r--r--indra/newview/llmeshrepository.h17
-rw-r--r--indra/newview/llmodelpreview.cpp111
-rw-r--r--indra/newview/llmoveview.cpp2
-rw-r--r--indra/newview/llmoveview.h1
-rw-r--r--indra/newview/llpanelface.cpp286
-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/llpanelmaininventory.cpp248
-rw-r--r--indra/newview/llpanelpermissions.cpp1
-rw-r--r--indra/newview/llpanelprofilepicks.cpp42
-rw-r--r--indra/newview/llpanelprofilepicks.h10
-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/llskinningutil.cpp9
-rw-r--r--indra/newview/llsky.h1
-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/lltoolpie.cpp141
-rw-r--r--indra/newview/lltoolpie.h16
-rw-r--r--indra/newview/llviewerdisplay.cpp63
-rw-r--r--indra/newview/llviewerfloaterreg.cpp4
-rw-r--r--indra/newview/llviewermedia.cpp2
-rw-r--r--indra/newview/llviewermenu.cpp29
-rw-r--r--indra/newview/llviewermenufile.cpp2
-rw-r--r--indra/newview/llviewermessage.cpp2
-rw-r--r--indra/newview/llviewerobject.cpp1
-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/llviewertexturelist.cpp16
-rw-r--r--indra/newview/llviewerwindow.cpp28
-rw-r--r--indra/newview/llvoavatar.cpp10
-rw-r--r--indra/newview/llvoavatar.h2
-rw-r--r--indra/newview/llvoavatarself.cpp6
-rw-r--r--indra/newview/llvoavatarself.h2
-rw-r--r--indra/newview/llvoiceclient.cpp82
-rw-r--r--indra/newview/llvovolume.cpp18
-rw-r--r--indra/newview/llwatchdog.cpp34
-rw-r--r--indra/newview/llwatchdog.h12
-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.xml2
-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/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.xml2
-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.xml113
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml25
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_preview.xml27
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml45
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml18
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml7
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml23
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml5
-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_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_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_tools_texture.xml13
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml6
-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/pl/panel_progress.xml5
-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
1046 files changed, 8312 insertions, 2325 deletions
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 6143ec8cd1..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;
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/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 9b3cdf4df5..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
}
};
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/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/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/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/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/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/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 6b4bb3a8b0..4c0f3edb62 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -334,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;
@@ -662,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)
{
@@ -941,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;
@@ -1006,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);
@@ -1561,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];
}
}
}
@@ -1578,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/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/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/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 a781e638ee..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
@@ -565,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;
@@ -579,6 +591,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
{
gDirectInput8 = di8_interface;
}
+#endif
mSwapMethod = SWAP_METHOD_UNDEFINED;
@@ -684,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)
@@ -725,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
@@ -738,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
@@ -752,7 +763,6 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
mFullscreen = false;
mFullscreenWidth = -1;
mFullscreenHeight = -1;
- mFullscreenBits = -1;
mFullscreenRefresh = -1;
std::map<std::string,std::string> args;
@@ -1174,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
@@ -1186,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
@@ -1212,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;
@@ -3506,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));
@@ -3518,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
@@ -3530,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);
@@ -3542,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;
@@ -3553,7 +3559,7 @@ bool LLWindowWin32::setFullscreenResolution()
{
if (mFullscreen)
{
- return setDisplayResolution( mFullscreenWidth, mFullscreenHeight, mFullscreenBits, mFullscreenRefresh);
+ return setDisplayResolution( mFullscreenWidth, mFullscreenHeight, mFullscreenRefresh);
}
else
{
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 80f0b60f98..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
@@ -745,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 ()
@@ -762,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
@@ -865,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
@@ -1492,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)
@@ -1750,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)
@@ -1907,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}
@@ -1953,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)
@@ -2023,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 ()
@@ -2034,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()
@@ -2045,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
@@ -2068,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
@@ -2123,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(
@@ -2163,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}
@@ -2172,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.")
@@ -2196,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}
@@ -2279,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 099f298456..0ee843cc60 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-7.1.14
+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 dee3ffa7e4..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>
@@ -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>
@@ -11631,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>
@@ -14980,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>
@@ -16683,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/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 9a381f9ba6..5dec4dd62f 100644
--- a/indra/newview/gltfscenemanager.cpp
+++ b/indra/newview/gltfscenemanager.cpp
@@ -317,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();
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 2161dbe19e..9ce14eb0ab 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -386,6 +386,10 @@ LLAgent::LLAgent() :
mbRunning(false),
mbTeleportKeepsLookAt(false),
+ mAllowedToStand(true),
+ mAllowedToSit(true),
+ mSitObjectID(LLUUID::null),
+
mAgentAccess(new LLAgentAccess(gSavedSettings)),
mGodLevelChangeSignal(),
mCanEditParcel(false),
@@ -969,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()
@@ -1343,7 +1351,7 @@ 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);
}
@@ -3469,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
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 4856eb1199..3a0d55eeba 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -1990,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
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/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index e9d455ae53..242d407219 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -4160,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/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 7580100977..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
@@ -987,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())
{
@@ -1348,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.
@@ -1544,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
@@ -2294,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:
@@ -2305,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);
@@ -2312,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()
@@ -3423,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;
@@ -3453,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 << ".";
@@ -3461,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)
@@ -5731,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);
@@ -5742,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;
}
@@ -5766,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/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/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 b94c31ec04..5ee93be061 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -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]);
diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h
index ae64521492..bb69ab65ef 100644
--- a/indra/newview/llfloaterbvhpreview.h
+++ b/indra/newview/llfloaterbvhpreview.h
@@ -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/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 8332a430e6..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
@@ -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;
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/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/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 5c0905af3c..01f2c6c525 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -959,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);
}
@@ -1025,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;
@@ -1707,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 7e64a03e73..612a161ba2 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -341,7 +341,7 @@ public:
bool checkAgainstFilterThumbnails(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 1077ce74ae..d2ed7168c5 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -2350,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;
}
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 28160177f6..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;
}
@@ -2684,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 <<
@@ -2696,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;
}
}
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index e7e95034b2..142a3dac39 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -2395,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;
}
}
@@ -2694,10 +2699,14 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
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)
{
@@ -2706,7 +2715,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
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];
@@ -2740,7 +2749,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
mUploadSkin,
mUploadJoints,
mLockScaleIfJointPosition,
- false,
+ LLModel::WRITE_BINARY,
false,
data.mBaseModel->mSubmodelID);
@@ -2753,8 +2762,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
}
// 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)
{
@@ -2852,10 +2861,11 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
}
}
- 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)
{
@@ -2864,7 +2874,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
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];
@@ -2898,7 +2908,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
mUploadSkin,
mUploadJoints,
mLockScaleIfJointPosition,
- false,
+ LLModel::WRITE_BINARY,
false,
data.mBaseModel->mSubmodelID);
@@ -2911,8 +2921,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
}
// 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)
{
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 0847c29d0d..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;
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index c73282dad3..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()
@@ -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);
}
}
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/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 5b059516cd..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(); });
@@ -1398,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());
@@ -1448,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));
@@ -1594,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();
@@ -1631,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()));
@@ -1639,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()));
@@ -1647,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;
@@ -1654,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);
}
}
@@ -1807,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);
@@ -2002,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()
@@ -3652,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
{
@@ -3674,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);
@@ -3696,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)
@@ -4795,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();
@@ -4870,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]);
@@ -4881,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()
@@ -5374,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/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index d964fa9170..44465cbc33 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -78,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();
@@ -90,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 };
};
///----------------------------------------------------------------------------
@@ -734,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();
@@ -743,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
@@ -1145,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.
@@ -1190,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);
}
}
}
@@ -1223,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()
@@ -1253,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;
@@ -1444,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/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 0ce1f0f9d3..0ce9ef7a7a 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -1175,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();
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/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/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
index cee43f3cff..47f58afa00 100644
--- a/indra/newview/llskinningutil.cpp
+++ b/indra/newview/llskinningutil.cpp
@@ -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/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/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/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/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 63527d8594..73fda339b5 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -295,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();
@@ -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);
@@ -7700,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;
@@ -8813,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)
@@ -8941,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 =
@@ -9919,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");
@@ -10018,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 9743ec0c59..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;
}
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 8d90187e91..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)
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/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 d32e3f4cbd..a2e77e9257 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2293,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);
}
}
}
@@ -3848,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;
@@ -4782,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;
@@ -4791,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;
@@ -4808,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 a6d50af025..7928c50807 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1191,7 +1191,7 @@ void LLVOAvatar::initClass()
LLControlAvatar::sRegionChangedSlot = gAgent.addRegionChangedCallback(&LLControlAvatar::onRegionChanged);
- sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.j2c");
+ sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.png");
}
@@ -6349,13 +6349,13 @@ const LLUUID& LLVOAvatar::getID() const
// getJoint()
//-----------------------------------------------------------------------------
// RN: avatar joints are multi-rooted to include screen-based attachments
-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())
{
@@ -6372,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
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index ab27c5752d..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();
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/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 6b3dccf89c..78e2257e56 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -2643,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
@@ -3783,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/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 00ca6e3bb0..55ec658767 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -590,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/navbar/Info_Off.png b/indra/newview/skins/default/textures/navbar/Info_Off.png
index 64722255a3..6399cd6715 100644
--- a/indra/newview/skins/default/textures/navbar/Info_Off.png
+++ b/indra/newview/skins/default/textures/navbar/Info_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Info_Over.png b/indra/newview/skins/default/textures/navbar/Info_Over.png
index 84f1d03129..a296d2014f 100644
--- a/indra/newview/skins/default/textures/navbar/Info_Over.png
+++ b/indra/newview/skins/default/textures/navbar/Info_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Info_Press.png b/indra/newview/skins/default/textures/navbar/Info_Press.png
index 169105829e..2afc4a9143 100644
--- a/indra/newview/skins/default/textures/navbar/Info_Press.png
+++ b/indra/newview/skins/default/textures/navbar/Info_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index f824816183..1fe1ff333a 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/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/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 09b134eac5..4e7ce2c32f 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -70,7 +70,7 @@
follows="all"
left="10"
name="megapahit_credits_panel"
- height="420"
+ height="405"
top="10">
<text
follows="top|left|right"
@@ -81,36 +81,29 @@
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="260"
+ 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
@@ -122,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"
@@ -136,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>
@@ -197,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"
@@ -206,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_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_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_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_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_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index f52e1cc952..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/>
@@ -1818,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">
@@ -2901,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/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 8a41405e4c..6bb9f7b1dc 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -9453,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_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_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_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/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index c5a59fac2a..76b14590f6 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2942,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>
@@ -4187,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/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/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/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" },