summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt37
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/app_settings/settings.xml159
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl60
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl58
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl61
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl74
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/pbrTerrainBakeF.glsl62
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/pbrTerrainBakeV.glsl42
-rw-r--r--indra/newview/featuretable.txt16
-rw-r--r--indra/newview/featuretable_mac.txt15
-rw-r--r--indra/newview/gltf/accessor.cpp4
-rw-r--r--indra/newview/gltf/accessor.h2
-rw-r--r--indra/newview/gltf/animation.cpp4
-rw-r--r--indra/newview/gltf/asset.cpp15
-rw-r--r--indra/newview/gltf/buffer_util.h20
-rw-r--r--indra/newview/gltf/common.h2
-rw-r--r--indra/newview/gltf/primitive.cpp2
-rw-r--r--indra/newview/gltfscenemanager.cpp25
-rw-r--r--indra/newview/installers/windows/installer_template.nsi1
-rw-r--r--indra/newview/llaccountingcostmanager.cpp6
-rw-r--r--indra/newview/llagent.cpp8
-rw-r--r--indra/newview/llagent.h1
-rw-r--r--indra/newview/llagentbenefits.cpp13
-rw-r--r--indra/newview/llagentbenefits.h1
-rw-r--r--indra/newview/llagentcamera.cpp6
-rw-r--r--indra/newview/llagentlistener.cpp12
-rw-r--r--indra/newview/llagentpilot.cpp6
-rw-r--r--indra/newview/llagentwearables.cpp2
-rw-r--r--indra/newview/llappearancemgr.cpp9
-rw-r--r--indra/newview/llappviewer.cpp283
-rw-r--r--indra/newview/llappviewer.h18
-rw-r--r--indra/newview/llappviewerwin32.cpp19
-rw-r--r--indra/newview/llavatarpropertiesprocessor.cpp4
-rw-r--r--indra/newview/llavatarrenderinfoaccountant.cpp17
-rw-r--r--indra/newview/llavatarrendernotifier.cpp6
-rw-r--r--indra/newview/llcallingcard.cpp6
-rw-r--r--indra/newview/llchannelmanager.cpp2
-rw-r--r--indra/newview/llchannelmanager.h1
-rw-r--r--indra/newview/llchathistory.cpp20
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp21
-rw-r--r--indra/newview/llcommandlineparser.cpp14
-rw-r--r--indra/newview/llcontrolavatar.cpp31
-rw-r--r--indra/newview/llconversationview.cpp21
-rw-r--r--indra/newview/llcurrencyuimanager.cpp137
-rw-r--r--indra/newview/lldateutil.cpp2
-rw-r--r--indra/newview/lldebugview.cpp8
-rw-r--r--indra/newview/lldrawable.cpp54
-rw-r--r--indra/newview/lldrawpoolalpha.cpp6
-rw-r--r--indra/newview/lldrawpoolavatar.cpp44
-rw-r--r--indra/newview/lldrawpoolbump.cpp388
-rw-r--r--indra/newview/lldrawpoolbump.h5
-rw-r--r--indra/newview/lldrawpoolterrain.cpp61
-rw-r--r--indra/newview/lldrawpoolterrain.h3
-rw-r--r--indra/newview/lldrawpoolwater.cpp9
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp8
-rw-r--r--indra/newview/llenvironment.cpp49
-rw-r--r--indra/newview/llexpandabletextbox.cpp10
-rw-r--r--indra/newview/llface.cpp134
-rw-r--r--indra/newview/llface.h4
-rw-r--r--indra/newview/llfasttimerview.cpp28
-rw-r--r--indra/newview/llflexibleobject.cpp4
-rw-r--r--indra/newview/llfloater360capture.cpp9
-rw-r--r--indra/newview/llfloateravatar.cpp5
-rw-r--r--indra/newview/llfloaterbanduration.cpp2
-rw-r--r--indra/newview/llfloaterbulkupload.cpp136
-rw-r--r--indra/newview/llfloaterbulkupload.h66
-rw-r--r--indra/newview/llfloaterbuyland.cpp201
-rw-r--r--indra/newview/llfloaterbvhpreview.cpp16
-rw-r--r--indra/newview/llfloaterchangeitemthumbnail.cpp22
-rw-r--r--indra/newview/llfloatercolorpicker.cpp12
-rw-r--r--indra/newview/llfloaterconversationlog.cpp5
-rw-r--r--indra/newview/llfloaterconversationlog.h2
-rw-r--r--indra/newview/llfloaterconversationpreview.cpp4
-rw-r--r--indra/newview/llfloaterdestinations.cpp5
-rw-r--r--indra/newview/llfloatereditextdaycycle.cpp22
-rw-r--r--indra/newview/llfloateremojipicker.cpp55
-rw-r--r--indra/newview/llfloaterenvironmentadjust.cpp26
-rw-r--r--indra/newview/llfloaterfonttest.cpp5
-rw-r--r--indra/newview/llfloatergltfasseteditor.cpp622
-rw-r--r--indra/newview/llfloatergltfasseteditor.h109
-rw-r--r--indra/newview/llfloaterimagepreview.cpp4
-rw-r--r--indra/newview/llfloaterimcontainer.cpp12
-rw-r--r--indra/newview/llfloaterimnearbychathandler.cpp30
-rw-r--r--indra/newview/llfloaterimsessiontab.cpp4
-rw-r--r--indra/newview/llfloaterimsessiontab.h1
-rw-r--r--indra/newview/llfloaterjoystick.cpp33
-rw-r--r--indra/newview/llfloaterjoystick.h2
-rw-r--r--indra/newview/llfloaterland.cpp272
-rw-r--r--indra/newview/llfloaterland.h18
-rw-r--r--indra/newview/llfloatermemleak.cpp13
-rw-r--r--indra/newview/llfloatermodelpreview.cpp10
-rw-r--r--indra/newview/llfloatermyenvironment.cpp2
-rw-r--r--indra/newview/llfloaterperformance.cpp27
-rw-r--r--indra/newview/llfloaterperformance.h9
-rw-r--r--indra/newview/llfloaterpreference.cpp58
-rw-r--r--indra/newview/llfloaterpreference.h7
-rw-r--r--indra/newview/llfloaterpreferencesgraphicsadvanced.cpp115
-rw-r--r--indra/newview/llfloaterprofiletexture.cpp4
-rw-r--r--indra/newview/llfloaterregioninfo.cpp75
-rw-r--r--indra/newview/llfloaterregioninfo.h4
-rw-r--r--indra/newview/llfloaterregionrestartschedule.cpp386
-rw-r--r--indra/newview/llfloaterregionrestartschedule.h74
-rw-r--r--indra/newview/llfloaterscriptedprefs.cpp2
-rw-r--r--indra/newview/llfloatersettingscolor.cpp334
-rw-r--r--indra/newview/llfloatersettingscolor.h81
-rw-r--r--indra/newview/llfloatersettingsdebug.cpp377
-rw-r--r--indra/newview/llfloatersettingsdebug.h15
-rw-r--r--indra/newview/llfloatersidepanelcontainer.cpp108
-rw-r--r--indra/newview/llfloatersidepanelcontainer.h30
-rw-r--r--indra/newview/llfloatersnapshot.cpp68
-rw-r--r--indra/newview/llfloatersnapshot.h1
-rw-r--r--indra/newview/llfloaterspellchecksettings.cpp8
-rw-r--r--indra/newview/llfloaterspellchecksettings.h2
-rw-r--r--indra/newview/llfloatertools.cpp47
-rw-r--r--indra/newview/llfloatertools.h14
-rw-r--r--indra/newview/llfloatertopobjects.cpp4
-rw-r--r--indra/newview/llfloateruipreview.cpp17
-rw-r--r--indra/newview/llfloaterwebcontent.cpp2
-rwxr-xr-xindra/newview/llfloaterworldmap.cpp255
-rw-r--r--indra/newview/llfloaterworldmap.h58
-rw-r--r--indra/newview/llgesturemgr.cpp2
-rw-r--r--indra/newview/llglsandbox.cpp6
-rw-r--r--indra/newview/llgltffolderitem.cpp164
-rw-r--r--indra/newview/llgltffolderitem.h128
-rw-r--r--indra/newview/llgltffoldermodel.cpp73
-rw-r--r--indra/newview/llgltffoldermodel.h91
-rw-r--r--indra/newview/llgltfmateriallist.cpp60
-rw-r--r--indra/newview/llgltfmateriallist.h25
-rw-r--r--indra/newview/llgltfmaterialpreviewmgr.cpp2
-rw-r--r--indra/newview/llgroupmgr.cpp296
-rw-r--r--indra/newview/llgroupmgr.h16
-rw-r--r--indra/newview/llheroprobemanager.cpp19
-rw-r--r--indra/newview/llheroprobemanager.h7
-rw-r--r--indra/newview/llhttpretrypolicy.cpp2
-rw-r--r--indra/newview/llhudeffectlookat.cpp21
-rw-r--r--indra/newview/llhudnametag.cpp13
-rw-r--r--indra/newview/llhudtext.cpp9
-rw-r--r--indra/newview/llimprocessing.cpp6
-rw-r--r--indra/newview/llimview.cpp8
-rw-r--r--indra/newview/llinspecttexture.cpp2
-rw-r--r--indra/newview/llinventorybridge.cpp6
-rw-r--r--indra/newview/llinventoryfilter.cpp6
-rw-r--r--indra/newview/llinventoryfunctions.cpp4
-rw-r--r--indra/newview/llinventorygallery.cpp10
-rw-r--r--indra/newview/llinventorygallerymenu.cpp2
-rw-r--r--indra/newview/llinventorypanel.cpp19
-rw-r--r--indra/newview/llinventorypanel.h6
-rw-r--r--indra/newview/lljoystickbutton.cpp8
-rw-r--r--indra/newview/lllocalbitmaps.cpp3
-rw-r--r--indra/newview/lllogchat.cpp12
-rw-r--r--indra/newview/lllogininstance.cpp8
-rw-r--r--indra/newview/lllogininstance.h1
-rw-r--r--indra/newview/llmachineid.cpp2
-rw-r--r--indra/newview/llmanip.cpp26
-rw-r--r--indra/newview/llmanipscale.cpp14
-rw-r--r--indra/newview/llmaterialeditor.cpp18
-rw-r--r--indra/newview/llmediadataclient.cpp5
-rw-r--r--indra/newview/llmeshrepository.cpp101
-rw-r--r--indra/newview/llmodelpreview.cpp39
-rw-r--r--indra/newview/llnavigationbar.cpp2
-rw-r--r--indra/newview/llnetmap.cpp30
-rw-r--r--indra/newview/llnotificationscripthandler.cpp2
-rw-r--r--indra/newview/llnotificationtiphandler.cpp4
-rw-r--r--indra/newview/lloutfitgallery.cpp49
-rw-r--r--indra/newview/lloutfitgallery.h1
-rw-r--r--indra/newview/llpanelblockedlist.cpp18
-rw-r--r--indra/newview/llpanelblockedlist.h7
-rw-r--r--indra/newview/llpanelclassified.cpp4
-rw-r--r--indra/newview/llpaneleditsky.cpp92
-rw-r--r--indra/newview/llpaneleditwater.cpp16
-rw-r--r--indra/newview/llpaneleditwearable.cpp98
-rw-r--r--indra/newview/llpaneleditwearable.h13
-rw-r--r--indra/newview/llpanelemojicomplete.cpp18
-rw-r--r--indra/newview/llpanelenvironment.cpp246
-rw-r--r--indra/newview/llpanelenvironment.h39
-rw-r--r--indra/newview/llpanelexperiencelog.cpp2
-rw-r--r--indra/newview/llpanelface.cpp2151
-rw-r--r--indra/newview/llpanelface.h395
-rw-r--r--indra/newview/llpanelgroup.cpp140
-rw-r--r--indra/newview/llpanelgroup.h14
-rw-r--r--indra/newview/llpanelgroupbulk.cpp213
-rw-r--r--indra/newview/llpanelgroupbulkimpl.h5
-rw-r--r--indra/newview/llpanelgrouproles.cpp260
-rw-r--r--indra/newview/llpanelland.cpp78
-rw-r--r--indra/newview/llpanelland.h21
-rw-r--r--indra/newview/llpanellogin.h1
-rw-r--r--indra/newview/llpanelmaininventory.cpp118
-rw-r--r--indra/newview/llpanelmaininventory.h12
-rw-r--r--indra/newview/llpanelmarketplaceinbox.cpp2
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.cpp4
-rw-r--r--indra/newview/llpaneloutfitedit.cpp38
-rw-r--r--indra/newview/llpaneloutfitedit.h8
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp11
-rw-r--r--indra/newview/llpaneloutfitsinventory.h1
-rw-r--r--indra/newview/llpanelpeople.cpp123
-rw-r--r--indra/newview/llpanelpeople.h21
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp7
-rw-r--r--indra/newview/llpanelpermissions.cpp10
-rw-r--r--indra/newview/llpanelplaceprofile.cpp6
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp4
-rw-r--r--indra/newview/llpanelsnapshot.cpp12
-rw-r--r--indra/newview/llpanelsnapshotinventory.cpp14
-rw-r--r--indra/newview/llpanelsnapshotoptions.cpp15
-rw-r--r--indra/newview/llpanelvolume.cpp49
-rw-r--r--indra/newview/llpathfindingcharacter.cpp6
-rw-r--r--indra/newview/llpathfindingmanager.cpp1
-rw-r--r--indra/newview/llpathfindingnavmesh.h1
-rw-r--r--indra/newview/llpathfindingnavmeshzone.cpp11
-rw-r--r--indra/newview/llpathfindingnavmeshzone.h1
-rw-r--r--indra/newview/llpathfindingobject.h1
-rw-r--r--indra/newview/llpathfindingobjectlist.h2
-rw-r--r--indra/newview/llperfstats.cpp12
-rw-r--r--indra/newview/llphysicsmotion.cpp47
-rw-r--r--indra/newview/llpreviewnotecard.cpp175
-rw-r--r--indra/newview/llpreviewnotecard.h17
-rw-r--r--indra/newview/llpreviewscript.cpp12
-rw-r--r--indra/newview/llpreviewscript.h2
-rw-r--r--indra/newview/llpreviewtexture.cpp37
-rw-r--r--indra/newview/llpreviewtexture.h5
-rw-r--r--indra/newview/llprogressview.cpp17
-rw-r--r--indra/newview/llprogressview.h4
-rw-r--r--indra/newview/llrecentpeople.cpp4
-rw-r--r--indra/newview/llreflectionmapmanager.cpp22
-rw-r--r--indra/newview/llscenemonitor.cpp7
-rw-r--r--indra/newview/llscreenchannel.cpp10
-rw-r--r--indra/newview/llscreenchannel.h1
-rw-r--r--indra/newview/llscripteditor.cpp4
-rw-r--r--indra/newview/llscrollingpanelparambase.cpp13
-rw-r--r--indra/newview/llscrollingpanelparambase.h1
-rw-r--r--indra/newview/llsecapi.h4
-rw-r--r--indra/newview/llsechandler_basic.cpp10
-rw-r--r--indra/newview/llsechandler_basic.h9
-rw-r--r--indra/newview/llselectmgr.cpp117
-rw-r--r--indra/newview/llselectmgr.h14
-rw-r--r--indra/newview/llsetkeybinddialog.cpp4
-rw-r--r--indra/newview/llsettingsvo.cpp8
-rw-r--r--indra/newview/llsidepanelappearance.cpp7
-rw-r--r--indra/newview/llsidepanelappearance.h4
-rw-r--r--indra/newview/llsidepanelinventory.cpp6
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp2
-rw-r--r--indra/newview/llsidetraypanelcontainer.cpp4
-rw-r--r--indra/newview/llsidetraypanelcontainer.h2
-rw-r--r--indra/newview/llslurl.cpp10
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp8
-rw-r--r--indra/newview/llspatialpartition.cpp27
-rw-r--r--indra/newview/llspeakers.cpp4
-rw-r--r--indra/newview/llstartup.cpp11
-rw-r--r--indra/newview/llsurface.cpp169
-rw-r--r--indra/newview/llsurface.h14
-rw-r--r--indra/newview/llsurfacepatch.cpp21
-rw-r--r--indra/newview/llsurfacepatch.h4
-rw-r--r--indra/newview/llteleporthistorystorage.cpp2
-rw-r--r--indra/newview/llterrainpaintmap.cpp285
-rw-r--r--indra/newview/llterrainpaintmap.h42
-rw-r--r--indra/newview/lltexturecache.cpp4
-rw-r--r--indra/newview/lltexturectrl.cpp14
-rw-r--r--indra/newview/lltexturectrl.h1
-rw-r--r--indra/newview/lltexturefetch.cpp79
-rw-r--r--indra/newview/lltexturefetch.h2
-rw-r--r--indra/newview/lltextureinfo.cpp2
-rw-r--r--indra/newview/lltextureview.cpp104
-rw-r--r--indra/newview/llthumbnailctrl.cpp4
-rw-r--r--indra/newview/lltinygltfhelper.cpp2
-rw-r--r--indra/newview/lltoast.cpp8
-rw-r--r--indra/newview/lltoastpanel.cpp2
-rw-r--r--indra/newview/lltoolbarview.cpp2
-rw-r--r--indra/newview/lltoolbrush.cpp2
-rw-r--r--indra/newview/lltoolfocus.cpp2
-rw-r--r--indra/newview/lltoolmorph.cpp2
-rw-r--r--indra/newview/lltoolpie.cpp3
-rw-r--r--indra/newview/lltracker.cpp2
-rw-r--r--indra/newview/lltranslate.cpp16
-rw-r--r--indra/newview/llurldispatcher.cpp12
-rw-r--r--indra/newview/llversioninfo.cpp22
-rw-r--r--indra/newview/llversioninfo.h26
-rw-r--r--indra/newview/llviewerassetstorage.cpp1
-rw-r--r--indra/newview/llviewerassetupload.cpp22
-rw-r--r--indra/newview/llviewerassetupload.h4
-rw-r--r--indra/newview/llviewercamera.cpp8
-rw-r--r--indra/newview/llviewerchat.cpp10
-rw-r--r--indra/newview/llviewerchat.h5
-rw-r--r--indra/newview/llviewercontrol.cpp7
-rw-r--r--indra/newview/llviewerdisplay.cpp27
-rw-r--r--indra/newview/llviewerfloaterreg.cpp14
-rw-r--r--indra/newview/llviewerinventory.cpp8
-rw-r--r--indra/newview/llviewerjoystick.cpp4
-rw-r--r--indra/newview/llviewerjoystick.h2
-rw-r--r--indra/newview/llviewermedia.cpp77
-rw-r--r--indra/newview/llviewermedia_streamingaudio.cpp4
-rw-r--r--indra/newview/llviewermediafocus.cpp6
-rw-r--r--indra/newview/llviewermenu.cpp174
-rw-r--r--indra/newview/llviewermenufile.cpp131
-rw-r--r--indra/newview/llviewermenufile.h16
-rw-r--r--indra/newview/llviewermessage.cpp4
-rw-r--r--indra/newview/llviewerobject.cpp17
-rw-r--r--indra/newview/llviewerobjectlist.cpp45
-rw-r--r--indra/newview/llviewerobjectlist.h2
-rwxr-xr-xindra/newview/llviewerparceloverlay.cpp45
-rw-r--r--indra/newview/llviewerparceloverlay.h9
-rw-r--r--indra/newview/llviewerprecompiledheaders.h11
-rwxr-xr-xindra/newview/llviewerregion.cpp37
-rw-r--r--indra/newview/llviewerregion.h2
-rw-r--r--indra/newview/llviewershadermgr.cpp83
-rw-r--r--indra/newview/llviewershadermgr.h11
-rw-r--r--indra/newview/llviewerstats.cpp4
-rw-r--r--indra/newview/llviewerstatsrecorder.cpp10
-rw-r--r--indra/newview/llviewerstatsrecorder.h9
-rw-r--r--indra/newview/llviewertexteditor.cpp14
-rw-r--r--indra/newview/llviewertexture.cpp543
-rw-r--r--indra/newview/llviewertexture.h73
-rw-r--r--indra/newview/llviewertextureanim.cpp2
-rw-r--r--indra/newview/llviewertexturelist.cpp309
-rw-r--r--indra/newview/llviewertexturelist.h39
-rw-r--r--indra/newview/llviewerwindow.cpp273
-rw-r--r--indra/newview/llviewerwindow.h18
-rw-r--r--indra/newview/llvlcomposition.cpp423
-rw-r--r--indra/newview/llvlcomposition.h14
-rw-r--r--indra/newview/llvoavatar.cpp394
-rw-r--r--indra/newview/llvoavatar.h4
-rw-r--r--indra/newview/llvoavatarself.cpp17
-rw-r--r--indra/newview/llvoavatarself.h2
-rw-r--r--indra/newview/llvocache.cpp10
-rw-r--r--indra/newview/llvograss.cpp3
-rw-r--r--indra/newview/llvoiceclient.h1
-rw-r--r--indra/newview/llvoicevivox.cpp2
-rw-r--r--indra/newview/llvoicewebrtc.cpp65
-rw-r--r--indra/newview/llvosky.cpp16
-rw-r--r--indra/newview/llvosky.h10
-rw-r--r--indra/newview/llvosurfacepatch.cpp84
-rw-r--r--indra/newview/llvosurfacepatch.h12
-rw-r--r--indra/newview/llvotree.cpp8
-rw-r--r--indra/newview/llvovolume.cpp81
-rw-r--r--indra/newview/llvowater.cpp23
-rw-r--r--indra/newview/llvowater.h3
-rw-r--r--indra/newview/llwearableitemslist.cpp18
-rw-r--r--indra/newview/llwearableitemslist.h2
-rw-r--r--indra/newview/llweb.cpp1
-rw-r--r--indra/newview/llwebprofile.cpp5
-rw-r--r--indra/newview/llwebprofile.h2
-rw-r--r--indra/newview/llwindebug.h3
-rw-r--r--indra/newview/llwindowlistener.cpp1
-rw-r--r--indra/newview/llworld.cpp63
-rw-r--r--indra/newview/llworld.h2
-rw-r--r--indra/newview/llworldmap.h8
-rwxr-xr-xindra/newview/llworldmapview.cpp36
-rw-r--r--indra/newview/llworldmipmap.cpp1
-rw-r--r--indra/newview/llworldmipmap.h6
-rw-r--r--indra/newview/llxmlrpclistener.cpp284
-rw-r--r--indra/newview/llxmlrpclistener.h3
-rw-r--r--indra/newview/llxmlrpctransaction.cpp390
-rw-r--r--indra/newview/llxmlrpctransaction.h92
-rw-r--r--indra/newview/noise.h2
-rw-r--r--indra/newview/pipeline.cpp347
-rw-r--r--indra/newview/pipeline.h13
-rw-r--r--indra/newview/skins/default/xui/da/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/de/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_bulk_upload.xml144
-rw-r--r--indra/newview/skins/default/xui/en/floater_fast_timers.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_gltf_asset_editor.xml284
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_region_restart_schedule.xml278
-rw-r--r--indra/newview/skins/default/xui/en/floater_settings_color.xml117
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml7
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml63
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml54
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_alpha.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_alerts.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml14
-rw-r--r--indra/newview/skins/default/xui/en/panel_scrolling_param.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/drop_down.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/emoji_complete.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/slider_bar.xml1
-rw-r--r--indra/newview/skins/default/xui/es/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/it/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about.xml1
-rw-r--r--indra/newview/tests/lldateutil_test.cpp15
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp4
-rw-r--r--indra/newview/tests/llslurl_test.cpp4
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp4
-rw-r--r--indra/newview/tests/llworldmap_test.cpp2
-rwxr-xr-xindra/newview/viewer_manifest.py44
397 files changed, 10959 insertions, 7880 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 97d9c02ce1..7a9f3a46b5 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -44,7 +44,6 @@ include(ViewerManager)
include(VisualLeakDetector)
include(VulkanGltf)
include(ZLIBNG)
-include(URIPARSER)
include(LLPrimitive)
if (NOT HAVOK_TPV)
@@ -189,6 +188,7 @@ set(viewer_SOURCE_FILES
llfloaterbigpreview.cpp
llfloaterbuildoptions.cpp
llfloaterbulkpermission.cpp
+ llfloaterbulkupload.cpp
llfloaterbump.cpp
llfloaterbuy.cpp
llfloaterbuycontents.cpp
@@ -219,6 +219,7 @@ set(viewer_SOURCE_FILES
llfloaterfonttest.cpp
llfloaterforgetuser.cpp
llfloatergesture.cpp
+ llfloatergltfasseteditor.cpp
llfloatergodtools.cpp
llfloatergotoline.cpp
llfloatergridstatus.cpp
@@ -276,6 +277,7 @@ set(viewer_SOURCE_FILES
llfloaterregioninfo.cpp
llfloaterreporter.cpp
llfloaterregionrestarting.cpp
+ llfloaterregionrestartschedule.cpp
llfloatersavecamerapreset.cpp
llfloatersaveprefpreset.cpp
llfloatersceneloadstats.cpp
@@ -284,6 +286,7 @@ set(viewer_SOURCE_FILES
llfloaterscriptlimits.cpp
llfloatersearch.cpp
llfloatersellland.cpp
+ llfloatersettingscolor.cpp
llfloatersettingsdebug.cpp
llfloatersidepanelcontainer.cpp
llfloatersnapshot.cpp
@@ -313,6 +316,8 @@ set(viewer_SOURCE_FILES
llgesturemgr.cpp
llgiveinventory.cpp
llglsandbox.cpp
+ llgltffolderitem.cpp
+ llgltffoldermodel.cpp
llgltfmateriallist.cpp
llgltfmaterialpreviewmgr.cpp
llgroupactions.cpp
@@ -574,6 +579,7 @@ set(viewer_SOURCE_FILES
llsyswellwindow.cpp
llteleporthistory.cpp
llteleporthistorystorage.cpp
+ llterrainpaintmap.cpp
lltexturecache.cpp
lltexturectrl.cpp
lltexturefetch.cpp
@@ -849,6 +855,7 @@ set(viewer_HEADER_FILES
llfloaterbigpreview.h
llfloaterbuildoptions.h
llfloaterbulkpermission.h
+ llfloaterbulkupload.h
llfloaterbump.h
llfloaterbuy.h
llfloaterbuycontents.h
@@ -879,6 +886,7 @@ set(viewer_HEADER_FILES
llfloaterfonttest.h
llfloaterforgetuser.h
llfloatergesture.h
+ llfloatergltfasseteditor.h
llfloatergodtools.h
llfloatergotoline.h
llfloatergridstatus.h
@@ -939,6 +947,7 @@ set(viewer_HEADER_FILES
llfloaterregioninfo.h
llfloaterreporter.h
llfloaterregionrestarting.h
+ llfloaterregionrestartschedule.h
llfloatersavecamerapreset.h
llfloatersaveprefpreset.h
llfloatersceneloadstats.h
@@ -947,6 +956,7 @@ set(viewer_HEADER_FILES
llfloaterscriptlimits.h
llfloatersearch.h
llfloatersellland.h
+ llfloatersettingscolor.h
llfloatersettingsdebug.h
llfloatersidepanelcontainer.h
llfloatersnapshot.h
@@ -975,6 +985,8 @@ set(viewer_HEADER_FILES
llgesturelistener.h
llgesturemgr.h
llgiveinventory.h
+ llgltffolderitem.h
+ llgltffoldermodel.h
llgltfmateriallist.h
llgltfmaterialpreviewmgr.h
llgroupactions.h
@@ -1226,6 +1238,7 @@ set(viewer_HEADER_FILES
lltable.h
llteleporthistory.h
llteleporthistorystorage.h
+ llterrainpaintmap.h
lltexturecache.h
lltexturectrl.h
lltexturefetch.h
@@ -1720,8 +1733,6 @@ if (WINDOWS)
${CMAKE_SOURCE_DIR}/../etc/message.xml
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
${SHARED_LIB_STAGING_DIR}/openjp2.dll
- ${SHARED_LIB_STAGING_DIR}/libhunspell.dll
- ${SHARED_LIB_STAGING_DIR}/uriparser.dll
${SHARED_LIB_STAGING_DIR}/llwebrtc.dll
#${SHARED_LIB_STAGING_DIR}/${LL_INTDIR}/SLVoice.exe
#${SHARED_LIB_STAGING_DIR}/${LL_INTDIR}/libsndfile-1.dll
@@ -1740,15 +1751,11 @@ if (WINDOWS)
list(APPEND COPY_INPUT_DEPENDENCIES
${SHARED_LIB_STAGING_DIR}/vivoxsdk_x64.dll
${SHARED_LIB_STAGING_DIR}/ortp_x64.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1-x64.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1-x64.dll
)
else (ADDRESS_SIZE EQUAL 64)
list(APPEND COPY_INPUT_DEPENDENCIES
${SHARED_LIB_STAGING_DIR}/vivoxsdk.dll
${SHARED_LIB_STAGING_DIR}/ortp.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1.dll
)
endif (ADDRESS_SIZE EQUAL 64)
@@ -1769,6 +1776,7 @@ if (WINDOWS)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--openal=${USE_OPENAL}"
+ "--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=$<CONFIG>
"--channel=${VIEWER_CHANNEL}"
@@ -1829,6 +1837,7 @@ if (WINDOWS)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--openal=${USE_OPENAL}"
+ "--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=$<CONFIG>
"--channel=${VIEWER_CHANNEL}"
@@ -1978,6 +1987,7 @@ if (LINUX)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--openal=${USE_OPENAL}"
+ "--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@@ -2005,6 +2015,7 @@ if (LINUX)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--openal=${USE_OPENAL}"
+ "--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@@ -2080,6 +2091,7 @@ if (DARWIN)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--openal=${USE_OPENAL}"
+ "--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=$<CONFIG>
--bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER}
@@ -2114,6 +2126,7 @@ if (DARWIN)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--openal=${USE_OPENAL}"
+ "--tracy=${USE_TRACY}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=$<CONFIG>
"--channel=${VIEWER_CHANNEL}"
@@ -2167,15 +2180,15 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE
XCODE_ATTRIBUTE_DWARF_DSYM_FOLDER_PATH "${SYMBOLS_STAGING_DIR}/dSYMs")
add_custom_command(OUTPUT "${VIEWER_APP_XCARCHIVE}"
- COMMAND "zip"
- ARGS
- "-r"
- "${VIEWER_APP_XCARCHIVE}"
+ COMMAND "zip"
+ ARGS
+ "-r"
+ "${VIEWER_APP_XCARCHIVE}"
"${VIEWER_CHANNEL}"
WORKING_DIRECTORY "${SYMBOLS_STAGING_DIR}/.."
DEPENDS "${VIEWER_BINARY_NAME}" llwebrtc
COMMENT "Generating ${VIEWER_APP_XCARCHIVE} for upload to BugSplat"
- )
+ )
add_custom_target(generate_symbols DEPENDS
"${VIEWER_APP_XCARCHIVE}"
)
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 5978ab1324..346a7e3aa1 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-7.1.9
+7.1.10
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 50632a7b07..483c8774a7 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -621,6 +621,18 @@
<key>Value</key>
<string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/avatars.html</string>
</map>
+ <!--AvatarBakedTextureUploadTimeout is in use by QA-->
+ <key>AvatarBakedTextureUploadTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifes the maximum time in seconds to wait before sending your baked textures for avatar appearance. Set to 0 to disable and wait until all baked textures are at highest resolution.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>60</integer>
+ </map>
<key>AvatarPhysics</key>
<map>
<key>Comment</key>
@@ -1094,6 +1106,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>BulkUpload2KTextures</key>
+ <map>
+ <key>Comment</key>
+ <string>Bulk upload scales textures to 2K if true, to 1K if false</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>EnableButtonFlashing</key>
<map>
<key>Comment</key>
@@ -1863,6 +1886,28 @@
<key>Value</key>
<real>64.0</real>
</map>
+ <key>AvatarExtentRefreshPeriodBatch</key>
+ <map>
+ <key>Comment</key>
+ <string>how many frames do we spread over by default when refreshing extents (default is 4)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+ <key>AvatarExtentRefreshMaxPerBatch</key>
+ <map>
+ <key>Comment</key>
+ <string>how many avatars do we want to handle in total per batch (default is 5)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>5</integer>
+ </map>
<key>DebugAvatarAppearanceMessage</key>
<map>
<key>Comment</key>
@@ -7716,6 +7761,28 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderMinFreeMainMemoryThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Minimum of available physical memory in MB before textures get scaled down</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>512</integer>
+ </map>
+ <key>RenderLowMemMinDiscardIncrement</key>
+ <map>
+ <key>Comment</key>
+ <string>Minimum increment of discard level if system memory gets low</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1</real>
+ </map>
<key>RenderMaxTextureIndex</key>
<map>
<key>Comment</key>
@@ -7738,6 +7805,17 @@
<key>Value</key>
<integer>2048</integer>
</map>
+ <key>RenderDownScaleMethod</key>
+ <map>
+ <key>Comment</key>
+ <string>Method to use to downscale images. 0 - FBO, 1 - PBO</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>RenderDebugTextureBind</key>
<map>
<key>Comment</key>
@@ -9245,7 +9323,7 @@
<key>RenderTerrainPBREnabled</key>
<map>
<key>Comment</key>
- <string>EXPERIMENTAL: Enable PBR Terrain features.</string>
+ <string>Enable PBR Terrain features.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -11267,6 +11345,19 @@
<key>Value</key>
<real>8.0</real>
</map>
+ <key>TextureBiasUnimportantFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>When biasing textures to lower resolution due to lack of vram, the importance threshold below which is considered unimportant and getting an extra bias.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.25</real>
+ <key>Backup</key>
+ <integer>0</integer>
+ </map>
<key>TextureDecodeDisabled</key>
<map>
<key>Comment</key>
@@ -12625,6 +12716,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>Use24HourClock</key>
+ <map>
+ <key>Comment</key>
+ <string>12 vs 24. At the moment only for region restart schedule floater</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>EnvironmentPersistAcrossLogin</key>
<map>
<key>Comment</key>
@@ -14151,6 +14253,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DisableLookAtAnimation</key>
+ <map>
+ <key>Comment</key>
+ <string>Avatar follows cursor with avatars eyes, when disabled, avatar will look forward</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>WebProfileFloaterRect</key>
<map>
<key>Comment</key>
@@ -14887,6 +15000,39 @@
<key>Value</key>
<real>0.0</real>
</map>
+ <key>LocalTerrainPaintEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables local paintmap if LocalTerrainAsset1, etc are set</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>TerrainPaintBitDepth</key>
+ <map>
+ <key>Comment</key>
+ <string>Bit depth for future terrain paint map operations. Min: 1. Max: 8. Takes effect when the paint map is created or modified. Modifications to an existing paintmap of different bit depth will have lower precision.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>5</integer>
+ </map>
+ <key>TerrainPaintResolution</key>
+ <map>
+ <key>Comment</key>
+ <string>Resolution of the terrain paint map in pixels. Rounded to a power of two. Min: 16. Max: RenderMaxTextureResolution. Takes effect when the paint map is created.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>2048</integer>
+ </map>
<key>PathfindingRetrieveNeighboringRegion</key>
<map>
<key>Comment</key>
@@ -15694,6 +15840,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ColorSettingsHideDefault</key>
+ <map>
+ <key>Comment</key>
+ <string>Show non-default settings only in Color Settings list</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>DebugSettingsHideDefault</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl b/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl
index 902746366d..607a8c6ef6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl
@@ -25,24 +25,53 @@
/*[EXTRA_CODE_HERE]*/
+
+
+// generate a normal map using an approximation of the old emboss bump map "brightness/darkness" technique
+// srcMap is a source color image, output should be a normal
+
out vec4 frag_color;
-uniform sampler2D alphaMap;
+uniform sampler2D srcMap;
in vec2 vary_texcoord0;
uniform float stepX;
uniform float stepY;
uniform float norm_scale;
+uniform int bump_code;
+
+#define BE_BRIGHTNESS 1
+#define BE_DARKNESS 2
+
+// get luminance or inverse luminance depending on bump_code
+float getBumpValue(vec2 texcoord)
+{
+ vec3 c = texture(srcMap, texcoord).rgb;
+
+ vec3 WEIGHT = vec3(0.2995, 0.5875, 0.1145);
+
+ float l = dot(c, WEIGHT);
+
+ if (bump_code == BE_DARKNESS)
+ {
+ l = 1.0 - l;
+ }
+
+ return l;
+}
+
void main()
{
- float c = texture(alphaMap, vary_texcoord0).r;
+ float c = getBumpValue(vary_texcoord0);
+
+ float scaler = 512.0;
- vec3 right = vec3(norm_scale, 0, (texture(alphaMap, vary_texcoord0+vec2(stepX, 0)).r-c)*255);
- vec3 left = vec3(-norm_scale, 0, (texture(alphaMap, vary_texcoord0-vec2(stepX, 0)).r-c)*255);
- vec3 up = vec3(0, -norm_scale, (texture(alphaMap, vary_texcoord0-vec2(0, stepY)).r-c)*255);
- vec3 down = vec3(0, norm_scale, (texture(alphaMap, vary_texcoord0+vec2(0, stepY)).r-c)*255);
+ vec3 right = vec3(norm_scale, 0, (getBumpValue(vary_texcoord0+vec2(stepX, 0))-c)*scaler);
+ vec3 left = vec3(-norm_scale, 0, (getBumpValue(vary_texcoord0-vec2(stepX, 0))-c)*scaler);
+ vec3 up = vec3(0, -norm_scale, (getBumpValue(vary_texcoord0-vec2(0, stepY))-c)*scaler);
+ vec3 down = vec3(0, norm_scale, (getBumpValue(vary_texcoord0+vec2(0, stepY))-c)*scaler);
vec3 norm = cross(right, down) + cross(down, left) + cross(left,up) + cross(up, right);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
index ae179d3f37..66adf50fa9 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
@@ -69,7 +69,7 @@ flat out float vary_sign;
out vec3 vary_normal;
vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);
-vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);
+vec4 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);
void main()
@@ -103,8 +103,9 @@ void main()
n = normalize(n);
- vary_tangent = normalize(tangent_space_transform(vec4(t, tangent.w), n, texture_normal_transform, texture_matrix0));
- vary_sign = tangent.w;
+ vec4 transformed_tangent = tangent_space_transform(vec4(t, tangent.w), n, texture_normal_transform, texture_matrix0);
+ vary_tangent = normalize(transformed_tangent.xyz);
+ vary_sign = transformed_tangent.w;
vary_normal = n;
vertex_color = diffuse_color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
index fd020afd57..0ad9bf5e4b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
@@ -63,7 +63,7 @@ out vec3 vary_normal;
out vec3 vary_position;
vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);
-vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);
+vec4 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);
void main()
{
@@ -97,8 +97,9 @@ void main()
n = normalize(n);
- vary_tangent = normalize(tangent_space_transform(vec4(t, tangent.w), n, texture_normal_transform, texture_matrix0));
- vary_sign = tangent.w;
+ vec4 transformed_tangent = tangent_space_transform(vec4(t, tangent.w), n, texture_normal_transform, texture_matrix0);
+ vary_tangent = normalize(transformed_tangent.xyz);
+ vary_sign = transformed_tangent.w;
vary_normal = n;
vertex_color = diffuse_color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl
index 2cb7ff196b..410c447c64 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl
@@ -30,6 +30,9 @@
#define TERRAIN_PBR_DETAIL_NORMAL -2
#define TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS -3
+#define TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE 0
+#define TERRAIN_PAINT_TYPE_PBR_PAINTMAP 1
+
#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
#define TerrainCoord vec4[3]
#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1
@@ -48,6 +51,7 @@ struct TerrainMix
};
TerrainMix get_terrain_mix_weights(float alpha1, float alpha2, float alphaFinal);
+TerrainMix get_terrain_usage_from_weight3(vec3 weight3);
struct PBRMix
{
@@ -75,6 +79,9 @@ PBRMix terrain_sample_and_multiply_pbr(
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
, sampler2D tex_vNt
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+ , float transform_sign
+#endif
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
, sampler2D tex_emissive
@@ -94,7 +101,11 @@ PBRMix mix_pbr(PBRMix mix1, PBRMix mix2, float mix2_weight);
out vec4 frag_data[4];
+#if TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
uniform sampler2D alpha_ramp;
+#elif TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_PBR_PAINTMAP
+uniform sampler2D paint_map;
+#endif
// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures
uniform sampler2D detail_0_base_color;
@@ -130,19 +141,25 @@ uniform vec3[4] emissiveColors;
#endif
uniform vec4 minimum_alphas; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff()
-#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
-in vec4[10] vary_coords;
-#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1
-in vec4[2] vary_coords;
-#endif
in vec3 vary_position;
in vec3 vary_normal;
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
in vec3 vary_tangents[4];
-flat in float vary_sign;
+flat in float vary_signs[4];
#endif
+
+// vary_texcoord* are used for terrain composition, vary_coords are used for terrain UVs
+#if TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
in vec4 vary_texcoord0;
in vec4 vary_texcoord1;
+#elif TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_PBR_PAINTMAP
+in vec2 vary_texcoord;
+#endif
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+in vec4[10] vary_coords;
+#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1
+in vec4[2] vary_coords;
+#endif
void mirrorClip(vec3 position);
@@ -150,11 +167,11 @@ float terrain_mix(TerrainMix tm, vec4 tms4);
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
// from mikktspace.com
-vec3 mikktspace(vec3 vNt, vec3 vT)
+vec3 mikktspace(vec3 vNt, vec3 vT, float sign)
{
vec3 vN = vary_normal;
- vec3 vB = vary_sign * cross(vN, vT);
+ vec3 vB = sign * cross(vN, vT);
vec3 tnorm = normalize( vNt.x * vT + vNt.y * vB + vNt.z * vN );
tnorm *= gl_FrontFacing ? 1.0 : -1.0;
@@ -168,11 +185,16 @@ void main()
// Make sure we clip the terrain if we're in a mirror.
mirrorClip(vary_position);
+ TerrainMix tm;
+#if TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
float alpha1 = texture(alpha_ramp, vary_texcoord0.zw).a;
float alpha2 = texture(alpha_ramp,vary_texcoord1.xy).a;
float alphaFinal = texture(alpha_ramp, vary_texcoord1.zw).a;
- TerrainMix tm = get_terrain_mix_weights(alpha1, alpha2, alphaFinal);
+ tm = get_terrain_mix_weights(alpha1, alpha2, alphaFinal);
+#elif TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_PBR_PAINTMAP
+ tm = get_terrain_usage_from_weight3(texture(paint_map, vary_texcoord).xyz);
+#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION)
// RGB = Occlusion, Roughness, Metal
@@ -216,6 +238,9 @@ void main()
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
, detail_0_normal
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+ , vary_signs[0]
+#endif
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
, detail_0_emissive
@@ -231,7 +256,7 @@ void main()
#endif
);
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
- mix2.vNt = mikktspace(mix2.vNt, vary_tangents[0]);
+ mix2.vNt = mikktspace(mix2.vNt, vary_tangents[0], vary_signs[0]);
#endif
pbr_mix = mix_pbr(pbr_mix, mix2, tm.weight.x);
break;
@@ -258,6 +283,9 @@ void main()
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
, detail_1_normal
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+ , vary_signs[1]
+#endif
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
, detail_1_emissive
@@ -273,7 +301,7 @@ void main()
#endif
);
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
- mix2.vNt = mikktspace(mix2.vNt, vary_tangents[1]);
+ mix2.vNt = mikktspace(mix2.vNt, vary_tangents[1], vary_signs[1]);
#endif
pbr_mix = mix_pbr(pbr_mix, mix2, tm.weight.y);
break;
@@ -300,6 +328,9 @@ void main()
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
, detail_2_normal
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+ , vary_signs[2]
+#endif
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
, detail_2_emissive
@@ -315,7 +346,7 @@ void main()
#endif
);
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
- mix2.vNt = mikktspace(mix2.vNt, vary_tangents[2]);
+ mix2.vNt = mikktspace(mix2.vNt, vary_tangents[2], vary_signs[2]);
#endif
pbr_mix = mix_pbr(pbr_mix, mix2, tm.weight.z);
break;
@@ -342,6 +373,9 @@ void main()
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
, detail_3_normal
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+ , vary_signs[3]
+#endif
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
, detail_3_emissive
@@ -357,7 +391,7 @@ void main()
#endif
);
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
- mix2.vNt = mikktspace(mix2.vNt, vary_tangents[3]);
+ mix2.vNt = mikktspace(mix2.vNt, vary_tangents[3], vary_signs[3]);
#endif
pbr_mix = mix_pbr(pbr_mix, mix2, tm.weight.w);
break;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl
index 1ae9efe544..dc43007dca 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl
@@ -51,7 +51,12 @@
#define TERRAIN_PBR_DETAIL_NORMAL -2
#define TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS -3
+#define TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE 0
+#define TERRAIN_PAINT_TYPE_PBR_PAINTMAP 1
+
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
in vec3 vary_vertex_normal;
+#endif
vec3 srgb_to_linear(vec3 c);
@@ -202,6 +207,45 @@ TerrainMix get_terrain_mix_weights(float alpha1, float alpha2, float alphaFinal)
return tm;
}
+// A paintmap weight applier for 4 swatches. The input saves a channel by not
+// storing swatch 1, and assuming the weights of the 4 swatches add to 1.
+// The components of weight3 should be between 0 and 1
+// The sum of the components of weight3 should be between 0 and 1
+TerrainMix get_terrain_usage_from_weight3(vec3 weight3)
+{
+ // These steps ensure the output weights add to between 0 and 1
+ weight3.xyz = max(vec3(0.0), weight3.xyz);
+ weight3.xyz /= max(1.0, weight3.x + weight3.y + weight3.z);
+
+ TerrainMix tm;
+
+ // Extract the first weight from the other weights
+ tm.weight.x = 1.0 - (weight3.x + weight3.y + weight3.z);
+ tm.weight.yzw = weight3.xyz;
+ ivec4 usage = max(ivec4(0), ivec4(ceil(tm.weight)));
+
+ tm.type = (usage.x * MIX_X) |
+ (usage.y * MIX_Y) |
+ (usage.z * MIX_Z) |
+ (usage.w * MIX_W);
+ return tm;
+}
+
+// Inverse of get_terrain_usage_from_weight3, excluding usage flags
+// The components of weight should be between 0 and 1
+// The sum of the components of weight should be 1
+vec3 get_weight3_from_terrain_weight(vec4 weight)
+{
+ // These steps ensure the input weights add to 1
+ weight = max(vec4(0.0), weight);
+ weight.x += 1.0 - sign(weight.x + weight.y + weight.z + weight.w);
+ weight /= weight.x + weight.y + weight.z + weight.w;
+
+ // Then return the input weights with the first weight truncated
+ return weight.yzw;
+}
+
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
TerrainTriplanar _t_triplanar()
{
float sharpness = TERRAIN_TRIPLANAR_BLEND_FACTOR;
@@ -219,6 +263,8 @@ TerrainTriplanar _t_triplanar()
((usage.z) * SAMPLE_Z);
return tw;
}
+#endif
+
// Assume weights add to 1
float terrain_mix(TerrainMix tm, vec4 tms4)
@@ -256,11 +302,12 @@ vec3 _t_normal_post_1(vec3 vNt0, float sign_or_zero)
}
// Triplanar-specific normal texture fixes
-vec3 _t_normal_post_x(vec3 vNt0)
+vec3 _t_normal_post_x(vec3 vNt0, float tangent_sign)
{
vec3 vNt_x = _t_normal_post_1(vNt0, sign(vary_vertex_normal.x));
// *HACK: Transform normals according to orientation of the UVs
vNt_x.xy = vec2(-vNt_x.y, vNt_x.x);
+ vNt_x.xy *= tangent_sign;
return vNt_x;
}
vec3 _t_normal_post_y(vec3 vNt0)
@@ -285,6 +332,7 @@ PBRMix terrain_sample_pbr(
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
, sampler2D tex_vNt
+ , float tangent_sign
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
, sampler2D tex_emissive
@@ -314,7 +362,7 @@ PBRMix terrain_sample_pbr(
);
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
// Triplanar-specific normal texture fix
- mix_x.vNt = _t_normal_post_x(mix_x.vNt);
+ mix_x.vNt = _t_normal_post_x(mix_x.vNt, tangent_sign);
#endif
mix = mix_pbr(mix, mix_x, tw.weight.x);
break;
@@ -420,6 +468,9 @@ PBRMix terrain_sample_and_multiply_pbr(
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
, sampler2D tex_vNt
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+ , float tangent_sign
+#endif
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
, sampler2D tex_emissive
@@ -446,6 +497,9 @@ PBRMix terrain_sample_and_multiply_pbr(
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
, tex_vNt
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+ , tangent_sign
+#endif
#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
, tex_emissive
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl
index f8e826bbdb..6791a22a76 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl
@@ -28,31 +28,47 @@
#define TERRAIN_PBR_DETAIL_NORMAL -2
#define TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS -3
+#define TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE 0
+#define TERRAIN_PAINT_TYPE_PBR_PAINTMAP 1
+
uniform mat3 normal_matrix;
uniform mat4 texture_matrix0;
uniform mat4 modelview_matrix;
uniform mat4 modelview_projection_matrix;
+#if TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_PBR_PAINTMAP
+uniform float region_scale;
+#endif
in vec3 position;
in vec3 normal;
in vec4 tangent;
in vec4 diffuse_color;
+#if TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
in vec2 texcoord1;
+#endif
-out vec3 vary_vertex_normal; // Used by pbrterrainUtilF.glsl
+out vec3 vary_position;
out vec3 vary_normal;
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
+out vec3 vary_vertex_normal; // Used by pbrterrainUtilF.glsl
+#endif
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
out vec3 vary_tangents[4];
-flat out float vary_sign;
+flat out float vary_signs[4];
#endif
+
+// vary_texcoord* are used for terrain composition, vary_coords are used for terrain UVs
+#if TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
out vec4 vary_texcoord0;
out vec4 vary_texcoord1;
+#elif TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_PBR_PAINTMAP
+out vec2 vary_texcoord;
+#endif
#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
out vec4[10] vary_coords;
#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1
out vec4[2] vary_coords;
#endif
-out vec3 vary_position;
// *HACK: Each material uses only one texture transform, but the KHR texture
// transform spec allows handling texture transforms separately for each
@@ -60,7 +76,7 @@ out vec3 vary_position;
uniform vec4[5] terrain_texture_transforms;
vec2 terrain_texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform);
-vec3 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform);
+vec4 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform);
void main()
{
@@ -69,43 +85,52 @@ void main()
vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz;
vec3 n = normal_matrix * normal;
+#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
vary_vertex_normal = normal;
+#endif
vec3 t = normal_matrix * tangent.xyz;
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL)
{
vec4[2] ttt;
+ vec4 transformed_tangent;
// material 1
ttt[0].xyz = terrain_texture_transforms[0].xyz;
ttt[1].x = terrain_texture_transforms[0].w;
ttt[1].y = terrain_texture_transforms[1].x;
- vary_tangents[0] = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt));
+ transformed_tangent = terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt);
+ vary_tangents[0] = normalize(transformed_tangent.xyz);
+ vary_signs[0] = transformed_tangent.w;
// material 2
ttt[0].xyz = terrain_texture_transforms[1].yzw;
ttt[1].xy = terrain_texture_transforms[2].xy;
- vary_tangents[1] = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt));
+ transformed_tangent = terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt);
+ vary_tangents[1] = normalize(transformed_tangent.xyz);
+ vary_signs[1] = transformed_tangent.w;
// material 3
ttt[0].xy = terrain_texture_transforms[2].zw;
ttt[0].z = terrain_texture_transforms[3].x;
ttt[1].xy = terrain_texture_transforms[3].yz;
- vary_tangents[2] = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt));
+ transformed_tangent = terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt);
+ vary_tangents[2] = normalize(transformed_tangent.xyz);
+ vary_signs[2] = transformed_tangent.w;
// material 4
ttt[0].x = terrain_texture_transforms[3].w;
ttt[0].yz = terrain_texture_transforms[4].xy;
ttt[1].xy = terrain_texture_transforms[4].zw;
- vary_tangents[3] = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt));
+ transformed_tangent = terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt);
+ vary_tangents[3] = normalize(transformed_tangent.xyz);
+ vary_signs[3] = transformed_tangent.w;
}
-
- vary_sign = tangent.w;
#endif
vary_normal = normalize(n);
// Transform and pass tex coords
{
vec4[2] ttt;
+#define transform_xy() terrain_texture_transform(position.xy, ttt)
#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3
// Don't care about upside-down (transform_xy_flipped())
-#define transform_xy() terrain_texture_transform(position.xy, ttt)
#define transform_yz() terrain_texture_transform(position.yz, ttt)
#define transform_negx_z() terrain_texture_transform(position.xz * vec2(-1, 1), ttt)
#define transform_yz_flipped() terrain_texture_transform(position.yz * vec2(-1, 1), ttt)
@@ -150,26 +175,30 @@ void main()
ttt[0].xyz = terrain_texture_transforms[0].xyz;
ttt[1].x = terrain_texture_transforms[0].w;
ttt[1].y = terrain_texture_transforms[1].x;
- vary_coords[0].xy = terrain_texture_transform(position.xy, ttt);
+ vary_coords[0].xy = transform_xy();
// material 2
ttt[0].xyz = terrain_texture_transforms[1].yzw;
ttt[1].xy = terrain_texture_transforms[2].xy;
- vary_coords[0].zw = terrain_texture_transform(position.xy, ttt);
+ vary_coords[0].zw = transform_xy();
// material 3
ttt[0].xy = terrain_texture_transforms[2].zw;
ttt[0].z = terrain_texture_transforms[3].x;
ttt[1].xy = terrain_texture_transforms[3].yz;
- vary_coords[1].xy = terrain_texture_transform(position.xy, ttt);
+ vary_coords[1].xy = transform_xy();
// material 4
ttt[0].x = terrain_texture_transforms[3].w;
ttt[0].yz = terrain_texture_transforms[4].xy;
ttt[1].xy = terrain_texture_transforms[4].zw;
- vary_coords[1].zw = terrain_texture_transform(position.xy, ttt);
+ vary_coords[1].zw = transform_xy();
#endif
}
- vec4 tc = vec4(texcoord1,0,1);
+#if TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
+ vec2 tc = texcoord1.xy;
vary_texcoord0.zw = tc.xy;
vary_texcoord1.xy = tc.xy-vec2(2.0, 0.0);
vary_texcoord1.zw = tc.xy-vec2(1.0, 0.0);
+#elif TERRAIN_PAINT_TYPE == TERRAIN_PAINT_TYPE_PBR_PAINTMAP
+ vary_texcoord = position.xy / region_scale;
+#endif
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl
index 767416d564..c75a0e0d5d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl
@@ -94,36 +94,48 @@ vec2 terrain_texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform)
// Take the rotation only from both transforms and apply to the tangent. This
// accounts for the change of the topology of the normal texture when a texture
// rotation is applied to it.
+// In practice, this applies the inverse of the texture transform to the tangent.
+// It is effectively an inverse of the rotation
// *HACK: Assume the imported GLTF model did not have both normal texture
// transforms and tangent vertices. The use of this function is inconsistent
// with the GLTF sample viewer when that is the case. See getNormalInfo in
// https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Viewer/47a191931461a6f2e14de48d6da0f0eb6ec2d147/source/Renderer/shaders/material_info.glsl
// We may want to account for this case during GLTF model import.
// -Cosmic,2023-06-06
-vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform, mat4 sl_animation_transform)
+vec4 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform, mat4 sl_animation_transform)
{
- vec2 weights = vec2(0, 1);
-
- // Apply texture animation first to avoid shearing and other artifacts (rotation only)
- mat2 sl_rot_scale;
- sl_rot_scale[0][0] = sl_animation_transform[0][0];
- sl_rot_scale[0][1] = sl_animation_transform[0][1];
- sl_rot_scale[1][0] = sl_animation_transform[1][0];
- sl_rot_scale[1][1] = sl_animation_transform[1][1];
- weights = sl_rot_scale * weights;
- // Remove scale
- weights = normalize(weights);
-
- // Convert to left-handed coordinate system
- weights.y = -weights.y;
+ // Immediately convert to left-handed coordinate system, but it has no
+ // effect here because y is 0 ((1,0) -> (1,0))
+ vec2 weights = vec2(1, 0);
- // Apply KHR_texture_transform (rotation only)
- float khr_rotation = khr_gltf_transform[0].z;
+ // Apply inverse KHR_texture_transform (rotation and scale sign only)
+ float khr_rotation = -khr_gltf_transform[0].z;
mat2 khr_rotation_mat = mat2(
cos(khr_rotation),-sin(khr_rotation),
sin(khr_rotation), cos(khr_rotation)
);
weights = khr_rotation_mat * weights;
+ vec2 khr_scale_sign = sign(khr_gltf_transform[0].xy);
+ weights *= khr_scale_sign.xy;
+
+ // *NOTE: Delay conversion to right-handed coordinate system here, to
+ // remove the need for computing the inverse of the SL texture animation
+ // matrix.
+
+ // Apply texture animation last to avoid shearing and other artifacts (rotation only)
+ mat2 inv_sl_rot_scale;
+ inv_sl_rot_scale[0][0] = sl_animation_transform[0][0];
+ inv_sl_rot_scale[0][1] = sl_animation_transform[0][1];
+ inv_sl_rot_scale[1][0] = sl_animation_transform[1][0];
+ inv_sl_rot_scale[1][1] = sl_animation_transform[1][1];
+ weights = inv_sl_rot_scale * weights;
+ // *NOTE: Scale to be removed later
+
+ // Set weights to default if 0 for some reason
+ weights.x += 1.0 - abs(sign(sign(weights.x) + (0.5 * sign(weights.y))));
+
+ // Remove scale from SL texture animation transform
+ weights = normalize(weights);
// Convert back to right-handed coordinate system
weights.y = -weights.y;
@@ -132,27 +144,41 @@ vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] kh
// from the normal and tangent, as seen in the fragment shader
vec3 vertex_binormal = vertex_tangent.w * cross(vertex_normal, vertex_tangent.xyz);
- return (weights.x * vertex_binormal.xyz) + (weights.y * vertex_tangent.xyz);
+ // An additional sign flip prevents the binormal from being flipped as a
+ // result of a propagation of the tangent sign during the cross product.
+ float sign_flip = khr_scale_sign.x * khr_scale_sign.y;
+ return vec4((weights.x * vertex_tangent.xyz) + (weights.y * vertex_binormal.xyz), vertex_tangent.w * sign_flip);
}
// Similar to tangent_space_transform but no texture animation support.
-vec3 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform)
+vec4 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform)
{
- // Immediately convert to left-handed coordinate system ((0,1) -> (0, -1))
- vec2 weights = vec2(0, -1);
+ // Immediately convert to left-handed coordinate system, but it has no
+ // effect here because y is 0 ((1,0) -> (1,0))
+ vec2 weights = vec2(1, 0);
- // Apply KHR_texture_transform (rotation only)
- float khr_rotation = khr_gltf_transform[0].z;
+ // Apply inverse KHR_texture_transform (rotation and scale sign only)
+ float khr_rotation = -khr_gltf_transform[0].z;
mat2 khr_rotation_mat = mat2(
cos(khr_rotation),-sin(khr_rotation),
sin(khr_rotation), cos(khr_rotation)
);
weights = khr_rotation_mat * weights;
+ vec2 khr_scale_sign = sign(khr_gltf_transform[0].xy);
+ weights *= khr_scale_sign.xy;
+
+ // Set weights to default if 0 for some reason
+ weights.x += 1.0 - abs(sign(sign(weights.x) + (0.5 * sign(weights.y))));
// Convert back to right-handed coordinate system
weights.y = -weights.y;
+ // Similar to the MikkTSpace-compatible method of extracting the binormal
+ // from the normal and tangent, as seen in the fragment shader
vec3 vertex_binormal = vertex_tangent.w * cross(vertex_normal, vertex_tangent.xyz);
- return (weights.x * vertex_binormal.xyz) + (weights.y * vertex_tangent.xyz);
+ // An additional sign flip prevents the binormal from being flipped as a
+ // result of a propagation of the tangent sign during the cross product.
+ float sign_flip = khr_scale_sign.x * khr_scale_sign.y;
+ return vec4((weights.x * vertex_tangent.xyz) + (weights.y * vertex_binormal.xyz), vertex_tangent.w * sign_flip);
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/pbrTerrainBakeF.glsl b/indra/newview/app_settings/shaders/class1/interface/pbrTerrainBakeF.glsl
new file mode 100644
index 0000000000..cf20653a0f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/pbrTerrainBakeF.glsl
@@ -0,0 +1,62 @@
+/**
+ * @file terrainBakeF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/*[EXTRA_CODE_HERE]*/
+
+out vec4 frag_color;
+
+struct TerrainMix
+{
+ vec4 weight;
+ int type;
+};
+
+TerrainMix get_terrain_mix_weights(float alpha1, float alpha2, float alphaFinal);
+
+uniform sampler2D alpha_ramp;
+
+// vary_texcoord* are used for terrain composition
+in vec4 vary_texcoord0;
+in vec4 vary_texcoord1;
+
+void main()
+{
+ TerrainMix tm;
+ float alpha1 = texture(alpha_ramp, vary_texcoord0.zw).a;
+ float alpha2 = texture(alpha_ramp,vary_texcoord1.xy).a;
+ float alphaFinal = texture(alpha_ramp, vary_texcoord1.zw).a;
+
+ tm = get_terrain_mix_weights(alpha1, alpha2, alphaFinal);
+
+ // tm.weight.x can be ignored. The paintmap saves a channel by not storing
+ // swatch 1, and assuming the weights of the 4 swatches add to 1.
+ // TERRAIN_PAINT_PRECISION emulates loss of precision at lower bit depth
+ // when a corresponding low-bit image format is not available. Because
+ // integral values at one depth cannot be precisely represented at another
+ // bit depth, rounding is required. To maximize numerical stability for
+ // future conversions, bit depth conversions should round to the nearest
+ // integer, not floor or ceil.
+ frag_color = max(vec4(round(tm.weight.yzw * TERRAIN_PAINT_PRECISION) / TERRAIN_PAINT_PRECISION, 1.0), vec4(0));
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/pbrTerrainBakeV.glsl b/indra/newview/app_settings/shaders/class1/interface/pbrTerrainBakeV.glsl
new file mode 100644
index 0000000000..fd150b54ad
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/pbrTerrainBakeV.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file pbrTerrainBakeV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+in vec3 position;
+in vec2 texcoord1;
+
+out vec4 vary_texcoord0;
+out vec4 vary_texcoord1;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vec2 tc = texcoord1.xy;
+ vary_texcoord0.zw = tc.xy;
+ vary_texcoord1.xy = tc.xy-vec2(2.0, 0.0);
+ vary_texcoord1.zw = tc.xy-vec2(1.0, 0.0);
+}
+
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index c37ea84556..213f0ab845 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -28,7 +28,6 @@ version 62
//
list all
RenderAnisotropic 1 1
-RenderAvatarCloth 0 0
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxNonImpostors 1 16
@@ -65,7 +64,6 @@ RenderShaderLightingMaxLevel 1 3
RenderReflectionProbeLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 2
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
@@ -76,6 +74,11 @@ RenderGLMultiThreadedMedia 1 1
RenderReflectionProbeResolution 1 128
RenderScreenSpaceReflections 1 1
RenderMirrors 1 1
+RenderHeroProbeResolution 1 2048
+RenderHeroProbeDistance 1 16
+RenderHeroProbeUpdateRate 1 4
+RenderHeroProbeConservativeUpdateMultiplier 1 16
+RenderDownScaleMethod 1 1
//
@@ -102,7 +105,6 @@ RenderTerrainPBRPlanarSampleCount 1 1
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.125
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 0
@@ -138,7 +140,6 @@ RenderTerrainPBRPlanarSampleCount 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.125
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 0
@@ -172,7 +173,6 @@ RenderTerrainPBRPlanarSampleCount 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.25
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 2
@@ -208,7 +208,6 @@ RenderTerrainPBRPlanarSampleCount 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.375
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 2
@@ -244,7 +243,6 @@ RenderTerrainPBRPlanarSampleCount 1 3
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.5
RenderDeferredSSAO 1 1
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 1
WLSkyDetail 1 96
RenderFSAASamples 1 2
@@ -280,7 +278,6 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.75
RenderDeferredSSAO 1 1
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 2
WLSkyDetail 1 96
RenderFSAASamples 1 2
@@ -317,7 +314,6 @@ RenderVolumeLODFactor 1 2.0
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferredSSAO 1 1
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 2
RenderFSAASamples 1 2
RenderReflectionsEnabled 1 1
@@ -336,7 +332,6 @@ RenderHeroProbeConservativeUpdateMultiplier 1 4
list Unknown
RenderShadowDetail 1 0
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderMirrors 1 0
//
@@ -366,6 +361,7 @@ RenderAnisotropic 1 0
RenderFSAASamples 1 0
RenderGLContextCoreProfile 1 0
RenderGLMultiThreadedMedia 1 0
+RenderDownScaleMethod 1 0
list AMD
RenderGLMultiThreadedTextures 1 1
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 2ecbf311ca..008e4c8882 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -28,7 +28,6 @@ version 59
//
list all
RenderAnisotropic 1 0
-RenderAvatarCloth 0 0
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxNonImpostors 1 16
@@ -62,7 +61,6 @@ RenderCompressTextures 1 1
RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 2
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
@@ -75,6 +73,10 @@ RenderReflectionProbeDetail 1 2
RenderScreenSpaceReflections 1 1
RenderReflectionProbeLevel 1 3
RenderMirrors 1 1
+RenderHeroProbeResolution 1 2048
+RenderHeroProbeDistance 1 16
+RenderHeroProbeUpdateRate 1 4
+RenderHeroProbeConservativeUpdateMultiplier 1 16
//
// Low Graphics Settings
@@ -98,7 +100,6 @@ RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.125
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 0
@@ -134,7 +135,6 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.125
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 0
@@ -170,7 +170,6 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.25
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 2
@@ -206,7 +205,6 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.375
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 2
@@ -242,7 +240,6 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.5
RenderDeferredSSAO 1 1
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 1
WLSkyDetail 1 96
RenderFSAASamples 1 2
@@ -279,7 +276,6 @@ RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.75
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
-RenderUseAdvancedAtmospherics 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 2
RenderReflectionsEnabled 1 1
@@ -315,7 +311,6 @@ RenderVolumeLODFactor 1 2.0
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferredSSAO 1 1
-RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 2
RenderFSAASamples 1 2
RenderReflectionsEnabled 1 1
@@ -334,7 +329,6 @@ RenderHeroProbeConservativeUpdateMultiplier 1 4
list Unknown
RenderShadowDetail 1 0
RenderDeferredSSAO 1 0
-RenderUseAdvancedAtmospherics 1 0
RenderMirrors 1 0
@@ -355,7 +349,6 @@ RenderLocalLightCount 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderDeferredSSAO 0 0
-RenderUseAdvancedAtmospherics 0 0
RenderShadowDetail 0 0
RenderMirrors 0 0
diff --git a/indra/newview/gltf/accessor.cpp b/indra/newview/gltf/accessor.cpp
index 2ef9237f2d..d1845605d4 100644
--- a/indra/newview/gltf/accessor.cpp
+++ b/indra/newview/gltf/accessor.cpp
@@ -104,7 +104,7 @@ namespace LL
void Buffer::erase(Asset& asset, S32 offset, S32 length)
{
- S32 idx = this - &asset.mBuffers[0];
+ S32 idx = (S32)(this - &asset.mBuffers[0]);
mData.erase(mData.begin() + offset, mData.begin() + offset + length);
@@ -197,7 +197,7 @@ bool Buffer::save(Asset& asset, const std::string& folder)
{
if (mName.empty())
{
- S32 idx = this - &asset.mBuffers[0];
+ S32 idx = (S32)(this - &asset.mBuffers[0]);
mUri = llformat("buffer_%d.bin", idx);
}
else
diff --git a/indra/newview/gltf/accessor.h b/indra/newview/gltf/accessor.h
index ec68c5f624..85ea0f2967 100644
--- a/indra/newview/gltf/accessor.h
+++ b/indra/newview/gltf/accessor.h
@@ -36,8 +36,6 @@ namespace LL
{
namespace GLTF
{
- constexpr S32 INVALID_INDEX = -1;
-
class Buffer
{
public:
diff --git a/indra/newview/gltf/animation.cpp b/indra/newview/gltf/animation.cpp
index 3dff67d746..31549986af 100644
--- a/indra/newview/gltf/animation.cpp
+++ b/indra/newview/gltf/animation.cpp
@@ -127,8 +127,8 @@ void Animation::apply(Asset& asset, float time)
bool Animation::Sampler::prep(Asset& asset)
{
Accessor& accessor = asset.mAccessors[mInput];
- mMinTime = accessor.mMin[0];
- mMaxTime = accessor.mMax[0];
+ mMinTime = (F32)accessor.mMin[0];
+ mMaxTime = (F32)accessor.mMax[0];
mFrameTimes.resize(accessor.mCount);
diff --git a/indra/newview/gltf/asset.cpp b/indra/newview/gltf/asset.cpp
index a454e68a92..c210b9c61d 100644
--- a/indra/newview/gltf/asset.cpp
+++ b/indra/newview/gltf/asset.cpp
@@ -105,7 +105,7 @@ void Node::updateTransforms(Asset& asset, const mat4& parentMatrix)
mAssetMatrixInv = glm::inverse(mAssetMatrix);
- S32 my_index = this - &asset.mNodes[0];
+ S32 my_index = (S32)(this - &asset.mNodes[0]);
for (auto& childIndex : mChildren)
{
@@ -271,11 +271,11 @@ S32 Asset::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
local_end = p;
// pointer math to get the node index
- node_hit = &node - &mNodes[0];
+ node_hit = (S32)(&node - &mNodes[0]);
llassert(&mNodes[node_hit] == &node);
//pointer math to get the primitive index
- primitive_hit = &primitive - &mesh.mPrimitives[0];
+ primitive_hit = (S32)(&primitive - &mesh.mPrimitives[0]);
llassert(&mesh.mPrimitives[primitive_hit] == &primitive);
}
}
@@ -476,6 +476,7 @@ void Asset::update()
{ // 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);
}
}
}
@@ -990,6 +991,12 @@ bool Image::prep(Asset& asset)
return false;
}
+ if (!asset.mFilename.empty())
+ { // 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);
+ }
+
return true;
}
@@ -1027,7 +1034,7 @@ bool Image::save(Asset& asset, const std::string& folder)
const std::string& delim = gDirUtilp->getDirDelimiter();
if (name.empty())
{
- S32 idx = this - asset.mImages.data();
+ S32 idx = (S32)(this - asset.mImages.data());
name = llformat("image_%d", idx);
}
diff --git a/indra/newview/gltf/buffer_util.h b/indra/newview/gltf/buffer_util.h
index 40f9448aaf..ef9bba8128 100644
--- a/indra/newview/gltf/buffer_util.h
+++ b/indra/newview/gltf/buffer_util.h
@@ -161,7 +161,7 @@ namespace LL
template<>
inline void copyVec3<U16, LLColor4U>(U16* src, LLColor4U& dst)
{
- dst.set(src[0], src[1], src[2], 255);
+ dst.set((U8)(src[0]), (U8)(src[1]), (U8)(src[2]), 255);
}
template<>
@@ -181,15 +181,25 @@ namespace LL
}
template<>
+ inline void copyVec4<U8, U64>(U8* src, U64& dst)
+ {
+ U8* data = (U8*)&dst;
+ data[0] = src[0];
+ data[1] = src[1];
+ data[2] = src[2];
+ data[3] = src[3];
+ }
+
+ template<>
inline void copyVec4<U16, LLColor4U>(U16* src, LLColor4U& dst)
{
- dst.set(src[0], src[1], src[2], src[3]);
+ dst.set((U8)(src[0]), (U8)(src[1]), (U8)(src[2]), ((U8)src[3]));
}
template<>
inline void copyVec4<F32, LLColor4U>(F32* src, LLColor4U& dst)
{
- dst.set(src[0]*255, src[1]*255, src[2]*255, src[3]*255);
+ dst.set((U8)(src[0]*255.f), (U8)(src[1]*255.f), (U8)(src[2]*255.f), (U8)(src[3]*255.f));
}
template<>
@@ -892,7 +902,7 @@ namespace LL
{
if (src.is_int64())
{
- dst = src.get_int64();
+ dst = (U32)src.get_int64();
return true;
}
return false;
@@ -947,7 +957,7 @@ namespace LL
{
if (src.is_int64())
{
- dst = src.get_int64();
+ dst = (U32)src.get_int64();
return true;
}
return false;
diff --git a/indra/newview/gltf/common.h b/indra/newview/gltf/common.h
index b9698d4017..742daff715 100644
--- a/indra/newview/gltf/common.h
+++ b/indra/newview/gltf/common.h
@@ -43,6 +43,8 @@ namespace LL
{
namespace GLTF
{
+ constexpr S32 INVALID_INDEX = -1;
+
using Value = boost::json::value;
using mat4 = glm::mat4;
diff --git a/indra/newview/gltf/primitive.cpp b/indra/newview/gltf/primitive.cpp
index e1579374d4..81caff8ab2 100644
--- a/indra/newview/gltf/primitive.cpp
+++ b/indra/newview/gltf/primitive.cpp
@@ -109,7 +109,7 @@ struct MikktMesh
for (U32 tri_idx = 0; tri_idx < U32(triangle_count); ++tri_idx)
{
- U32 idx[3];
+ U32 idx[3] = {0, 0, 0};
if (prim->mMode == Primitive::Mode::TRIANGLES)
{
diff --git a/indra/newview/gltfscenemanager.cpp b/indra/newview/gltfscenemanager.cpp
index 7b2de4d6de..086f41c1cb 100644
--- a/indra/newview/gltfscenemanager.cpp
+++ b/indra/newview/gltfscenemanager.cpp
@@ -42,6 +42,7 @@
#include "llviewertexturelist.h"
#include "llimagej2c.h"
#include "llfloaterperms.h"
+#include "llfloaterreg.h"
#include "llagentbenefits.h"
#include "llfilesystem.h"
#include "boost/json.hpp"
@@ -144,7 +145,17 @@ void GLTFSceneManager::uploadSelection()
}
else
{
- raw = image.mTexture->getCachedRawImage();
+ raw = image.mTexture->getRawImage();
+ }
+
+ if (raw.isNull())
+ {
+ raw = image.mTexture->getSavedRawImage();
+ }
+
+ if (raw.isNull())
+ {
+ image.mTexture->readbackRawImage();
}
if (raw.notNull())
@@ -314,6 +325,7 @@ void GLTFSceneManager::load(const std::string& filename)
{
mObjects.push_back(obj);
}
+ LLFloaterReg::showInstance("gltf_asset_editor");
}
}
else
@@ -339,9 +351,18 @@ void GLTFSceneManager::renderAlpha()
void GLTFSceneManager::addGLTFObject(LLViewerObject* obj, LLUUID gltf_id)
{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_GLTF;
llassert(obj->getVolume()->getParams().getSculptID() == gltf_id);
llassert(obj->getVolume()->getParams().getSculptType() == LL_SCULPT_TYPE_GLTF);
+ if (obj->mGLTFAsset)
+ { // object already has a GLTF asset, don't reload it
+
+ // TODO: below assertion fails on dupliate requests for assets -- possibly need to touch up asset loading state machine
+ // llassert(std::find(mObjects.begin(), mObjects.end(), obj) != mObjects.end());
+ return;
+ }
+
obj->ref();
gAssetStorage->getAssetData(gltf_id, LLAssetType::AT_GLTF, onGLTFLoadComplete, obj);
}
@@ -773,7 +794,7 @@ void GLTFSceneManager::bind(Asset& asset, Material& material)
bindTexture(asset, TextureType::EMISSIVE, material.mEmissiveTexture, LLViewerFetchedTexture::sWhiteImagep);
}
- shader->uniform1i(LLShaderMgr::GLTF_MATERIAL_ID, &material - &asset.mMaterials[0]);
+ shader->uniform1i(LLShaderMgr::GLTF_MATERIAL_ID, (GLint)(&material - &asset.mMaterials[0]));
}
LLMatrix4a inverse(const LLMatrix4a& mat)
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index d1dab94a76..77f24ac6a6 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -32,6 +32,7 @@ SetCompressor /solid lzma # Compress whole installer as one block
SetDatablockOptimize off # Only saves us 0.1%, not worth it
XPStyle on # Add an XP manifest to the installer
RequestExecutionLevel admin # For when we write to Program Files
+Unicode true # Enable unicode support
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Project flags
diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp
index 82124b7412..54d8ceb85a 100644
--- a/indra/newview/llaccountingcostmanager.cpp
+++ b/indra/newview/llaccountingcostmanager.cpp
@@ -150,9 +150,9 @@ void LLAccountingCostManager::accountingCostCoro(std::string url,
F32 networkCost = 0.0f;
F32 simulationCost = 0.0f;
- physicsCost = selected["physics"].asReal();
- networkCost = selected["streaming"].asReal();
- simulationCost = selected["simulation"].asReal();
+ physicsCost = (F32)selected["physics"].asReal();
+ networkCost = (F32)selected["streaming"].asReal();
+ simulationCost = (F32)selected["simulation"].asReal();
SelectionCost selectionCost( physicsCost, networkCost, simulationCost);
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 2f5b0f04e3..c4336758ac 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2662,9 +2662,9 @@ void LLAgent::setStartPositionSuccess(const LLSD &result)
(!result["HomeLocation"]["LocationPos"].has("Z")))
break;
- agent_pos.mV[VX] = result["HomeLocation"]["LocationPos"]["X"].asInteger();
- agent_pos.mV[VY] = result["HomeLocation"]["LocationPos"]["Y"].asInteger();
- agent_pos.mV[VZ] = result["HomeLocation"]["LocationPos"]["Z"].asInteger();
+ agent_pos.mV[VX] = (F32)result["HomeLocation"]["LocationPos"]["X"].asInteger();
+ agent_pos.mV[VY] = (F32)result["HomeLocation"]["LocationPos"]["Y"].asInteger();
+ agent_pos.mV[VZ] = (F32)result["HomeLocation"]["LocationPos"]["Z"].asInteger();
error = false;
@@ -2778,7 +2778,7 @@ bool LLAgent::canAccessMaturityInRegion( U64 region_handle ) const
bool LLAgent::canAccessMaturityAtGlobal( LLVector3d pos_global ) const
{
- U64 region_handle = to_region_handle_global( pos_global.mdV[0], pos_global.mdV[1] );
+ U64 region_handle = to_region_handle_global((F32)pos_global.mdV[0], (F32)pos_global.mdV[1]);
return canAccessMaturityInRegion( region_handle );
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 9cd3e80f69..8f892025c9 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -40,7 +40,6 @@
#include "llcorehttputil.h"
#include <boost/function.hpp>
-#include <boost/shared_ptr.hpp>
#include <boost/signals2.hpp>
extern const bool ANIMATE;
diff --git a/indra/newview/llagentbenefits.cpp b/indra/newview/llagentbenefits.cpp
index e9f00f6556..f651b42010 100644
--- a/indra/newview/llagentbenefits.cpp
+++ b/indra/newview/llagentbenefits.cpp
@@ -195,6 +195,19 @@ S32 LLAgentBenefits::getTextureUploadCost(const LLImageBase* tex) const
return getTextureUploadCost();
}
+S32 LLAgentBenefits::getTextureUploadCost(S32 w, S32 h) const
+{
+ if (w > 0 && h > 0)
+ {
+ S32 area = w * h;
+ if (area >= MIN_2K_TEXTURE_AREA)
+ {
+ return get2KTextureUploadCost(area);
+ }
+ }
+ return getTextureUploadCost();
+}
+
S32 LLAgentBenefits::get2KTextureUploadCost(S32 area) const
{
if (m_2k_texture_upload_cost.empty())
diff --git a/indra/newview/llagentbenefits.h b/indra/newview/llagentbenefits.h
index ff23241aa9..c0aa6edd90 100644
--- a/indra/newview/llagentbenefits.h
+++ b/indra/newview/llagentbenefits.h
@@ -54,6 +54,7 @@ public:
S32 getTextureUploadCost() const;
S32 getTextureUploadCost(const LLViewerTexture* tex) const;
S32 getTextureUploadCost(const LLImageBase* tex) const;
+ S32 getTextureUploadCost(S32 w, S32 h) const;
S32 get2KTextureUploadCost(S32 area) const;
bool findUploadCost(LLAssetType::EType& asset_type, S32& cost) const;
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 25e777191f..e7531f963b 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -1931,7 +1931,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
}
else
{
- LLCachedControl<F32> dynamic_camera_strength(gSavedSettings, "DynamicCameraStrength");
+ static LLCachedControl<F32> dynamic_camera_strength(gSavedSettings, "DynamicCameraStrength");
target_lag = vel * dynamic_camera_strength / 30.f;
}
@@ -2114,14 +2114,14 @@ void LLAgentCamera::handleScrollWheel(S32 clicks)
F32 camera_offset_initial_mag = getCameraOffsetInitial().magVec();
F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
- current_zoom_fraction *= 1.f - pow(ROOT_ROOT_TWO, clicks);
+ current_zoom_fraction *= 1.f - (F32)pow(ROOT_ROOT_TWO, clicks);
cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
}
else
{
F32 current_zoom_fraction = (F32)mCameraFocusOffsetTarget.magVec();
- cameraOrbitIn(current_zoom_fraction * (1.f - pow(ROOT_ROOT_TWO, clicks)));
+ cameraOrbitIn(current_zoom_fraction * (1.f - (F32)pow(ROOT_ROOT_TWO, clicks)));
}
}
}
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 005a518910..0c120ae01d 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -156,9 +156,9 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const
else
{
std::string url = LLSLURL(event_data["regionname"],
- LLVector3(event_data["x"].asReal(),
- event_data["y"].asReal(),
- event_data["z"].asReal())).getSLURLString();
+ LLVector3((F32)event_data["x"].asReal(),
+ (F32)event_data["y"].asReal(),
+ (F32)event_data["z"].asReal())).getSLURLString();
LLURLDispatcher::dispatch(url, LLCommandHandler::NAV_TYPE_CLICKED, NULL, false);
}
}
@@ -344,7 +344,7 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data)
F32 rotation_threshold = 0.03f;
if (event_data.has("rotation_threshold"))
{
- rotation_threshold = event_data["rotation_threshold"].asReal();
+ rotation_threshold = (F32)event_data["rotation_threshold"].asReal();
}
bool allow_flying = true;
@@ -357,7 +357,7 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data)
F32 stop_distance = 0.f;
if (event_data.has("stop_distance"))
{
- stop_distance = event_data["stop_distance"].asReal();
+ stop_distance = (F32)event_data["stop_distance"].asReal();
}
// Clear follow target, this is doing a path
@@ -446,7 +446,7 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data)
F32 stop_distance = 0.f;
if (event_data.has("stop_distance"))
{
- stop_distance = event_data["stop_distance"].asReal();
+ stop_distance = (F32)event_data["stop_distance"].asReal();
}
if (target_id.notNull())
diff --git a/indra/newview/llagentpilot.cpp b/indra/newview/llagentpilot.cpp
index 40f1679663..0b5198bbd3 100644
--- a/indra/newview/llagentpilot.cpp
+++ b/indra/newview/llagentpilot.cpp
@@ -145,7 +145,7 @@ void LLAgentPilot::loadXML(const std::string& filename)
Action action;
action.mTime = record["time"].asReal();
action.mType = (EActionType)record["type"].asInteger();
- action.mCameraView = record["camera_view"].asReal();
+ action.mCameraView = (F32)record["camera_view"].asReal();
action.mTarget = ll_vector3d_from_sd(record["target"]);
action.mCameraOrigin = ll_vector3_from_sd(record["camera_origin"]);
action.mCameraXAxis = ll_vector3_from_sd(record["camera_xaxis"]);
@@ -297,8 +297,8 @@ void LLAgentPilot::moveCamera()
S32 start_index = llmax(mCurrentAction-1,0);
S32 end_index = mCurrentAction;
F32 t = 0.0;
- F32 timedelta = mActions[end_index].mTime - mActions[start_index].mTime;
- F32 tickelapsed = mTimer.getElapsedTimeF32()-mActions[start_index].mTime;
+ F32 timedelta = (F32)(mActions[end_index].mTime - mActions[start_index].mTime);
+ F32 tickelapsed = mTimer.getElapsedTimeF32()-(F32)mActions[start_index].mTime;
if (timedelta > 0.0)
{
t = tickelapsed/timedelta;
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index faa5d801dd..cd4222dddf 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -52,8 +52,6 @@
#include "llwearablelist.h"
#include "llfloaterperms.h"
-#include <boost/scoped_ptr.hpp>
-
LLAgentWearables gAgentWearables;
bool LLAgentWearables::mInitialWearablesUpdateReceived = false;
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 6411be3d4f..946d674e8b 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -66,11 +66,6 @@
#include "llavatarpropertiesprocessor.h"
-#if LL_MSVC
-// disable boost::lexical_cast warning
-#pragma warning (disable:4702)
-#endif
-
namespace
{
const S32 BAKE_RETRY_MAX_COUNT = 5;
@@ -3934,7 +3929,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LL_WARNS("Avatar") << "Bake retry count exceeded!" << LL_ENDL;
break;
}
- F32 timeout = pow(BAKE_RETRY_TIMEOUT, static_cast<float>(retryCount)) - 1.0;
+ F32 timeout = pow(BAKE_RETRY_TIMEOUT, static_cast<float>(retryCount)) - 1.0f;
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
@@ -4329,7 +4324,7 @@ LLAppearanceMgr::LLAppearanceMgr():
outfit_observer.addCOFSavedCallback(boost::bind(
&LLAppearanceMgr::setOutfitLocked, this, false));
- mUnlockOutfitTimer.reset(new LLOutfitUnLockTimer(gSavedSettings.getS32(
+ mUnlockOutfitTimer.reset(new LLOutfitUnLockTimer((F32)gSavedSettings.getS32(
"OutfitOperationsTimeout")));
gIdleCallbacks.addFunction(&LLAttachmentsMgr::onIdle, NULL);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 85ede793e2..afa701c5f2 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -62,7 +62,6 @@
#include "llfocusmgr.h"
#include "llurlfloaterdispatchhandler.h"
#include "llviewerjoystick.h"
-#include "llallocator.h"
#include "llcalc.h"
#include "llconversationlog.h"
#if LL_WINDOWS
@@ -269,11 +268,6 @@ using namespace LL;
#include "glib.h"
#endif // (LL_LINUX) && LL_GTK
-#if LL_MSVC
-// disable boost::lexical_cast warning
-#pragma warning (disable:4702)
-#endif
-
static LLAppViewerListener sAppViewerListener(LLAppViewer::instance);
////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
@@ -340,24 +334,23 @@ F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME;
S32 gPendingMetricsUploads = 0;
-bool gDisconnected = false;
+bool gDisconnected = false;
-// used to restore texture state after a mode switch
-LLFrameTimer gRestoreGLTimer;
-bool gRestoreGL = false;
-bool gUseWireframe = false;
+// Used to restore texture state after a mode switch
+LLFrameTimer gRestoreGLTimer;
+bool gRestoreGL = false;
+bool gUseWireframe = false;
-LLMemoryInfo gSysMemory;
U64Bytes gMemoryAllocated(0); // updated in display_stats() in llviewerdisplay.cpp
std::string gLastVersionChannel;
-LLVector3 gWindVec(3.0, 3.0, 0.0);
-LLVector3 gRelativeWindVec(0.0, 0.0, 0.0);
+LLVector3 gWindVec(3.0, 3.0, 0.0);
+LLVector3 gRelativeWindVec(0.0, 0.0, 0.0);
-U32 gPacketsIn = 0;
+U32 gPacketsIn = 0;
-bool gPrintMessagesThisFrame = false;
+bool gPrintMessagesThisFrame = false;
bool gRandomizeFramerate = false;
bool gPeriodicSlowFrame = false;
@@ -456,7 +449,7 @@ void idle_afk_check()
{
// check idle timers
F32 current_idle = gAwayTriggerTimer.getElapsedTimeF32();
- F32 afk_timeout = gSavedSettings.getS32("AFKTimeout");
+ F32 afk_timeout = (F32)gSavedSettings.getS32("AFKTimeout");
if (afk_timeout && (current_idle > afk_timeout) && ! gAgent.getAFK())
{
LL_INFOS("IdleAway") << "Idle more than " << afk_timeout << " seconds: automatically changing to Away status" << LL_ENDL;
@@ -647,6 +640,7 @@ LLAppViewer::LLAppViewer()
mSavedFinalSnapshot(false),
mSavePerAccountSettings(false), // don't save settings on logout unless login succeeded.
mQuitRequested(false),
+ mClosingFloaters(false),
mLogoutRequestSent(false),
mLastAgentControlFlags(0),
mLastAgentForceUpdate(0),
@@ -752,7 +746,9 @@ bool LLAppViewer::init()
// inits from settings.xml and from strings.xml
if (!initConfiguration())
- return false;
+ {
+ LL_ERRS("InitInfo") << "initConfiguration() failed." << LL_ENDL;
+ }
LL_INFOS("InitInfo") << "Configuration initialized." << LL_ENDL ;
@@ -760,7 +756,6 @@ bool LLAppViewer::init()
initMaxHeapSize() ;
LLCoros::instance().setStackSize(gSavedSettings.getS32("CoroutineStackSize"));
-
// Although initLoggingAndGetLastDuration() is the right place to mess with
// setFatalFunction(), we can't query gSavedSettings until after
// initConfiguration().
@@ -773,8 +768,6 @@ bool LLAppViewer::init()
LLError::setFatalFunction([rc](const std::string&){ _exit(rc); });
}
- mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling"));
-
// Initialize the non-LLCurl libcurl library. Should be called
// before consumers (LLTextureFetch).
mAppCoreHttp.init();
@@ -783,14 +776,12 @@ bool LLAppViewer::init()
LLMachineID::init();
+ if (gSavedSettings.getBOOL("QAModeMetrics"))
{
- if (gSavedSettings.getBOOL("QAModeMetrics"))
- {
- app_metrics_qa_mode = true;
- app_metrics_interval = METRICS_INTERVAL_QA;
- }
- LLViewerAssetStatsFF::init();
+ app_metrics_qa_mode = true;
+ app_metrics_interval = METRICS_INTERVAL_QA;
}
+ LLViewerAssetStatsFF::init();
initThreads();
LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ;
@@ -803,10 +794,24 @@ bool LLAppViewer::init()
settings_map["floater"] = &gSavedSettings; // *TODO: New settings file
settings_map["account"] = &gSavedPerAccountSettings;
- LLUI::initParamSingleton(settings_map,
+ LLUI::createInstance(settings_map,
LLUIImageList::getInstance(),
ui_audio_callback,
deferred_ui_audio_callback);
+
+ if (gSavedSettings.getBOOL("SpellCheck"))
+ {
+ std::list<std::string> dict_list;
+ std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary");
+ boost::split(dict_list, dict_setting, boost::is_any_of(std::string(",")));
+ if (!dict_list.empty())
+ {
+ LLSpellChecker::setUseSpellCheck(dict_list.front());
+ dict_list.pop_front();
+ LLSpellChecker::instance().setSecondaryDictionaries(dict_list);
+ }
+ }
+
LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ;
// NOW LLUI::getLanguage() should work. gDirUtilp must know the language
@@ -906,10 +911,10 @@ bool LLAppViewer::init()
// do any necessary set-up for accepting incoming SLURLs from apps
initSLURLHandler();
- if(false == initHardwareTest())
+ if (!initHardwareTest())
{
// Early out from user choice.
- return false;
+ LL_ERRS("InitInfo") << "initHardwareTest() failed." << LL_ENDL;
}
LL_INFOS("InitInfo") << "Hardware test initialization done." << LL_ENDL ;
@@ -923,11 +928,9 @@ bool LLAppViewer::init()
if (!initCache())
{
- LL_WARNS("InitInfo") << "Failed to init cache" << LL_ENDL;
- std::ostringstream msg;
- msg << LLTrans::getString("MBUnableToAccessFile");
- OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
- return 0;
+ std::string msg = LLTrans::getString("MBUnableToAccessFile");
+ OSMessageBox(msg.c_str(), LLStringUtil::null, OSMB_OK);
+ LL_ERRS("InitInfo") << "Failed to init cache" << LL_ENDL;
}
LL_INFOS("InitInfo") << "Cache initialization is done." << LL_ENDL ;
@@ -956,10 +959,11 @@ bool LLAppViewer::init()
gGLManager.printGLInfoString();
// If we don't have the right GL requirements, exit.
+ // ? AG: It seems we never set mHasRequirements to false
if (!gGLManager.mHasRequirements)
{
- // already handled with a MBVideoDrvErr
- return 0;
+ // Already handled with a MBVideoDrvErr
+ LL_ERRS("InitInfo") << "gGLManager.mHasRequirements is false." << LL_ENDL;
}
// Without SSE2 support we will crash almost immediately, warn here.
@@ -967,15 +971,13 @@ bool LLAppViewer::init()
{
// can't use an alert here since we're exiting and
// all hell breaks lose.
- OSMessageBox(
- LLNotifications::instance().getGlobalString("UnsupportedCPUSSE2"),
- LLStringUtil::null,
- OSMB_OK);
- return 0;
+ std::string msg = LLNotifications::instance().getGlobalString("UnsupportedCPUSSE2");
+ OSMessageBox(msg.c_str(), LLStringUtil::null, OSMB_OK);
+ LL_ERRS("InitInfo") << "SSE2 is not supported" << LL_ENDL;
}
// alert the user if they are using unsupported hardware
- if(!gSavedSettings.getBOOL("AlertedUnsupportedHardware"))
+ if (!gSavedSettings.getBOOL("AlertedUnsupportedHardware"))
{
bool unsupported = false;
LLSD args;
@@ -991,19 +993,21 @@ bool LLAppViewer::init()
U64Bytes minRAM;
minRAMString >> minRAM;
- if(!LLFeatureManager::getInstance()->isGPUSupported() && LLFeatureManager::getInstance()->getGPUClass() != GPU_CLASS_UNKNOWN)
+ if (!LLFeatureManager::getInstance()->isGPUSupported() && LLFeatureManager::getInstance()->getGPUClass() != GPU_CLASS_UNKNOWN)
{
minSpecs += LLNotifications::instance().getGlobalString("UnsupportedGPU");
minSpecs += "\n";
unsupported = true;
}
- if(gSysCPU.getMHz() < minCPU)
+
+ if (gSysCPU.getMHz() < minCPU)
{
minSpecs += LLNotifications::instance().getGlobalString("UnsupportedCPU");
minSpecs += "\n";
unsupported = true;
}
- if(gSysMemory.getPhysicalMemoryKB() < minRAM)
+
+ if (gSysMemory.getPhysicalMemoryKB() < minRAM)
{
minSpecs += LLNotifications::instance().getGlobalString("UnsupportedRAM");
minSpecs += "\n";
@@ -1015,15 +1019,14 @@ bool LLAppViewer::init()
LLNotificationsUtil::add("UnknownGPU");
}
- if(unsupported)
+ if (unsupported)
{
- if(!gSavedSettings.controlExists("WarnUnsupportedHardware")
+ if (!gSavedSettings.controlExists("WarnUnsupportedHardware")
|| gSavedSettings.getBOOL("WarnUnsupportedHardware"))
{
args["MINSPECS"] = minSpecs;
LLNotificationsUtil::add("UnsupportedHardware", args );
}
-
}
}
@@ -1115,12 +1118,13 @@ bool LLAppViewer::init()
LLViewerJoystick::getInstance()->init(false);
}
- try {
+ try
+ {
initializeSecHandler();
}
catch (LLProtectedDataException&)
{
- LLNotificationsUtil::add("CorruptedProtectedDataStore");
+ LLNotificationsUtil::add("CorruptedProtectedDataStore");
}
gGLActive = false;
@@ -1227,7 +1231,7 @@ bool LLAppViewer::init()
//datetime formatting functions didn't support some parameters such as "weekday".
//Names for days and months localized in xml are also useful for Polish locale(STORM-107).
std::string language = gSavedSettings.getString("Language");
- if(language == "ja" || language == "pl")
+ if (language == "ja" || language == "pl")
{
LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
LLStringOps::setupWeekDaysShortNames(LLTrans::getString("dateTimeWeekdaysShortNames"));
@@ -1272,6 +1276,7 @@ bool LLAppViewer::init()
//LLSimpleton creations
LLEnvironment::createInstance();
LLWorld::createInstance();
+ LLViewerStatsRecorder::createInstance();
LLSelectMgr::createInstance();
LLViewerCamera::createInstance();
LL::GLTFSceneManager::createInstance();
@@ -1431,13 +1436,13 @@ bool LLAppViewer::doFrame()
}
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df mainloop")
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df mainloop");
// canonical per-frame event
mainloop.post(newFrame);
}
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df suspend")
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df suspend");
// give listeners a chance to run
llcoro::suspend();
// if one of our coroutines threw an uncaught exception, rethrow it now
@@ -1447,7 +1452,7 @@ bool LLAppViewer::doFrame()
if (!LLApp::isExiting())
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df JoystickKeyboard" )
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df JoystickKeyboard");
pingMainloopTimeout("Main:JoystickKeyboard");
// Scan keyboard for movement keys. Command keys and typing
@@ -1470,7 +1475,7 @@ bool LLAppViewer::doFrame()
// Update state based on messages, user input, object idle.
{
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df pauseMainloopTimeout" )
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df pauseMainloopTimeout");
pauseMainloopTimeout(); // *TODO: Remove. Messages shouldn't be stalling for 20+ seconds!
}
@@ -1481,7 +1486,7 @@ bool LLAppViewer::doFrame()
}
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df resumeMainloopTimeout" )
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df resumeMainloopTimeout");
resumeMainloopTimeout();
}
}
@@ -1528,7 +1533,7 @@ bool LLAppViewer::doFrame()
}
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df pauseMainloopTimeout" )
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df pauseMainloopTimeout");
pingMainloopTimeout("Main:Sleep");
pauseMainloopTimeout();
@@ -1537,14 +1542,14 @@ bool LLAppViewer::doFrame()
// Sleep and run background threads
{
//LL_RECORD_BLOCK_TIME(SLEEP2);
- LL_PROFILE_ZONE_WARN( "Sleep2" )
+ LL_PROFILE_ZONE_WARN("Sleep2");
// yield some time to the os based on command line option
static LLCachedControl<S32> yield_time(gSavedSettings, "YieldTime", -1);
if(yield_time >= 0)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_APP("Yield");
- LL_PROFILE_ZONE_NUM( yield_time )
+ LL_PROFILE_ZONE_NUM(yield_time);
ms_sleep(yield_time);
}
@@ -1612,24 +1617,24 @@ bool LLAppViewer::doFrame()
}
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df gMeshRepo" )
- gMeshRepo.update() ;
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df gMeshRepo");
+ gMeshRepo.update() ;
}
if(!total_work_pending) //pause texture fetching threads if nothing to process.
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df getTextureCache" )
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df getTextureCache");
LLAppViewer::getTextureCache()->pause();
LLAppViewer::getTextureFetch()->pause();
}
if(!total_io_pending) //pause file threads if nothing to process.
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df LLVFSThread" )
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df LLVFSThread");
LLLFSThread::sLocal->pause();
}
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df resumeMainloopTimeout" )
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df resumeMainloopTimeout");
resumeMainloopTimeout();
}
pingMainloopTimeout("Main:End");
@@ -1657,7 +1662,7 @@ bool LLAppViewer::doFrame()
LL_INFOS() << "Exiting main_loop" << LL_ENDL;
}
}LLPerfStats::StatsRecorder::endFrame();
- LL_PROFILER_FRAME_END
+ LL_PROFILER_FRAME_END;
return ! LLApp::isRunning();
}
@@ -1942,7 +1947,7 @@ bool LLAppViewer::cleanup()
LL_INFOS() << "Saving Data" << LL_ENDL;
// Store the time of our current logoff
- gSavedPerAccountSettings.setU32("LastLogoff", time_corrected());
+ gSavedPerAccountSettings.setU32("LastLogoff", (U32)time_corrected());
if (LLEnvironment::instanceExists())
{
@@ -2154,9 +2159,11 @@ bool LLAppViewer::cleanup()
LL::GLTFSceneManager::deleteSingleton();
LLEnvironment::deleteSingleton();
LLSelectMgr::deleteSingleton();
+ LLViewerStatsRecorder::deleteSingleton();
LLViewerEventRecorder::deleteSingleton();
LLWorld::deleteSingleton();
LLVoiceClient::deleteSingleton();
+ LLUI::deleteSingleton();
// It's not at first obvious where, in this long sequence, a generic cleanup
// call OUGHT to go. So let's say this: as we migrate cleanup from
@@ -2210,10 +2217,10 @@ bool LLAppViewer::initThreads()
cores = llmin(cores, (S32) max_cores);
}
- // The only configurable thread count right now is ImageDecode
- // The viewer typically starts around 8 threads not including image decode,
- // so try to leave at least one core free
- S32 image_decode_count = llclamp(cores - 9, 1, 8);
+ // always use at least 2 threads for image decoding to prevent
+ // a single texture blocking all other textures from decoding
+ S32 image_decode_count = llclamp(cores - 6, 2, 16);
+
threadCounts["ImageDecode"] = image_decode_count;
gSavedSettings.setLLSD("ThreadPoolSizes", threadCounts);
@@ -2251,7 +2258,9 @@ void errorCallback(LLError::ELevel level, const std::string &error_string)
if (level == LLError::LEVEL_ERROR)
{
#ifndef LL_RELEASE_FOR_DOWNLOAD
- OSMessageBox(error_string, LLTrans::getString("MBFatalError"), OSMB_OK);
+ std::string message = error_string +
+ "\n\n\nThis is a developer-only notification!\nThis notification won't be present in Release for download build";
+ OSMessageBox(message, LLTrans::getString("MBFatalError"), OSMB_OK);
#endif
gDebugInfo["FatalMessage"] = error_string;
@@ -2315,7 +2324,7 @@ void LLAppViewer::initLoggingAndGetLastDuration()
int log_stat_result = LLFile::stat(log_file, &log_file_stat);
if (0 == start_stat_result && 0 == log_stat_result)
{
- int elapsed_seconds = log_file_stat.st_ctime - start_marker_stat.st_ctime;
+ int elapsed_seconds = (int)(log_file_stat.st_ctime - start_marker_stat.st_ctime);
// only report a last run time if the last viewer was the same version
// because this stat will be counted against this version
if (markerIsSameVersion(start_marker_file_name))
@@ -2393,7 +2402,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
std::string full_settings_path;
if (file.file_name_setting.isProvided()
- && gSavedSettings.controlExists(file.file_name_setting))
+ && gSavedSettings.controlExists(file.file_name_setting()))
{
// try to find filename stored in file_name_setting control
full_settings_path = gSavedSettings.getString(file.file_name_setting());
@@ -2513,7 +2522,7 @@ bool tempSetControl(const std::string& name, const std::string& value)
bool LLAppViewer::initConfiguration()
{
- //Load settings files list
+ // Load settings files list
std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml");
LLXMLNodePtr root;
bool success = LLXMLNode::parseFile(settings_file_list, root, NULL);
@@ -2560,7 +2569,7 @@ bool LLAppViewer::initConfiguration()
// - load defaults
bool set_defaults = true;
- if(!loadSettingsFromDirectory("Default", set_defaults))
+ if (!loadSettingsFromDirectory("Default", set_defaults))
{
OSMessageBox(
"Unable to load default settings file. The installation may be corrupted.",
@@ -2577,13 +2586,12 @@ bool LLAppViewer::initConfiguration()
#ifndef LL_RELEASE_FOR_DOWNLOAD
// provide developer build only overrides for these control variables that are not
// persisted to settings.xml
- LLControlVariable* c = gSavedSettings.getControl("AllowMultipleViewers");
- if (c)
+ if (LLControlVariable* c = gSavedSettings.getControl("AllowMultipleViewers"))
{
c->setValue(true, false);
}
- gSavedSettings.setBOOL("QAMode", true );
+ gSavedSettings.setBOOL("QAMode", true);
gSavedSettings.setS32("WatchdogEnabled", 0);
#endif
@@ -2616,7 +2624,7 @@ bool LLAppViewer::initConfiguration()
clp.configure(cmd_line_config, &gSavedSettings);
- if(!initParseCommandLine(clp))
+ if (!initParseCommandLine(clp))
{
handleCommandLineError(clp);
return false;
@@ -2626,7 +2634,7 @@ bool LLAppViewer::initConfiguration()
// If the user has specified a alternate settings file name.
// Load it now before loading the user_settings/settings.xml
- if(clp.hasOption("settings"))
+ if (clp.hasOption("settings"))
{
std::string user_settings_filename =
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
@@ -2668,7 +2676,7 @@ bool LLAppViewer::initConfiguration()
loadSettingsFromDirectory("UserSession");
// - apply command line settings
- if (! clp.notify())
+ if (!clp.notify())
{
handleCommandLineError(clp);
return false;
@@ -2677,7 +2685,7 @@ bool LLAppViewer::initConfiguration()
// Register the core crash option as soon as we can
// if we want gdb post-mortem on cores we need to be up and running
// ASAP or we might miss init issue etc.
- if(gSavedSettings.getBOOL("DisableCrashLogger"))
+ if (gSavedSettings.getBOOL("DisableCrashLogger"))
{
LL_WARNS() << "Crashes will be handled by system, stack trace logs and crash logger are both disabled" << LL_ENDL;
disableCrashlogger();
@@ -2691,7 +2699,7 @@ bool LLAppViewer::initConfiguration()
initConsole();
}
- if(clp.hasOption("help"))
+ if (clp.hasOption("help"))
{
std::ostringstream msg;
msg << LLTrans::getString("MBCmdLineUsg") << "\n" << clp;
@@ -2705,17 +2713,17 @@ bool LLAppViewer::initConfiguration()
return false;
}
- if(clp.hasOption("set"))
+ if (clp.hasOption("set"))
{
const LLCommandLineParser::token_vector_t& set_values = clp.getOption("set");
- if(0x1 & set_values.size())
+ if (0x1 & set_values.size())
{
LL_WARNS() << "Invalid '--set' parameter count." << LL_ENDL;
}
else
{
LLCommandLineParser::token_vector_t::const_iterator itr = set_values.begin();
- for(; itr != set_values.end(); ++itr)
+ for (; itr != set_values.end(); ++itr)
{
const std::string& name = *itr;
const std::string& value = *(++itr);
@@ -2727,12 +2735,13 @@ bool LLAppViewer::initConfiguration()
}
}
- if (clp.hasOption("logevents")) {
+ if (clp.hasOption("logevents"))
+ {
LLViewerEventRecorder::instance().setEventLoggingOn();
}
std::string CmdLineChannel(gSavedSettings.getString("CmdLineChannel"));
- if(! CmdLineChannel.empty())
+ if (!CmdLineChannel.empty())
{
LLVersionInfo::instance().resetChannel(CmdLineChannel);
}
@@ -2747,7 +2756,7 @@ bool LLAppViewer::initConfiguration()
}
std::string test_name(gSavedSettings.getString("LogMetrics"));
- if (! test_name.empty())
+ if (!test_name.empty())
{
LLTrace::BlockTimer::sMetricLog = true;
// '--logmetrics' is specified with a named test metric argument so the data gathering is done only on that test
@@ -2789,7 +2798,7 @@ bool LLAppViewer::initConfiguration()
}
const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");
- if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
+ if (skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
{
// Examining "Language" may not suffice -- see LLUI::getLanguage()
// logic. Unfortunately LLUI::getLanguage() doesn't yet do us much
@@ -2798,19 +2807,6 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.getString("Language"));
}
- if (gSavedSettings.getBOOL("SpellCheck"))
- {
- std::list<std::string> dict_list;
- std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary");
- boost::split(dict_list, dict_setting, boost::is_any_of(std::string(",")));
- if (!dict_list.empty())
- {
- LLSpellChecker::setUseSpellCheck(dict_list.front());
- dict_list.pop_front();
- LLSpellChecker::instance().setSecondaryDictionaries(dict_list);
- }
- }
-
if (gNonInteractive)
{
tempSetControl("AllowMultipleViewers", "true");
@@ -2823,7 +2819,6 @@ bool LLAppViewer::initConfiguration()
llassert_always(!gSavedSettings.getBOOL("SLURLPassToOtherInstance"));
}
-
// Handle slurl use. NOTE: Don't let SL-55321 reappear.
// This initial-SLURL logic, up through the call to
// sendURLToOtherInstance(), must precede LLSplashScreen::show() --
@@ -2849,21 +2844,21 @@ bool LLAppViewer::initConfiguration()
std::string starting_location;
std::string cmd_line_login_location(gSavedSettings.getString("CmdLineLoginLocation"));
- if(! cmd_line_login_location.empty())
+ if (!cmd_line_login_location.empty())
{
starting_location = cmd_line_login_location;
}
else
{
std::string default_login_location(gSavedSettings.getString("DefaultLoginLocation"));
- if (! default_login_location.empty())
+ if (!default_login_location.empty())
{
starting_location = default_login_location;
}
}
LLSLURL start_slurl;
- if (! starting_location.empty())
+ if (!starting_location.empty())
{
start_slurl = starting_location;
LLStartUp::setStartSLURL(start_slurl);
@@ -2875,12 +2870,12 @@ bool LLAppViewer::initConfiguration()
// NextLoginLocation is set as a side effect of LLStartUp::setStartSLURL()
std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
- if ( !nextLoginLocation.empty() )
+ if (!nextLoginLocation.empty())
{
LL_DEBUGS("AppInit")<<"set start from NextLoginLocation: "<<nextLoginLocation<<LL_ENDL;
LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation));
}
- else if ( ( clp.hasOption("login") || clp.hasOption("autologin"))
+ else if ((clp.hasOption("login") || clp.hasOption("autologin"))
&& gSavedSettings.getString("CmdLineLoginLocation").empty())
{
// If automatic login from command line with --login switch
@@ -2936,7 +2931,7 @@ bool LLAppViewer::initConfiguration()
#endif
if (!gArgs.empty())
{
- gWindowTitle += std::string(" ") + gArgs;
+ gWindowTitle += std::string(" ") + gArgs;
}
LLStringUtil::truncate(gWindowTitle, 255);
@@ -2960,7 +2955,7 @@ bool LLAppViewer::initConfiguration()
// but make sure the setting is *not* persisted.
// Also see LLVivoxVoiceClient::voiceEnabled()
LLControlVariable* enable_voice = gSavedSettings.getControl("EnableVoiceChat");
- if(enable_voice)
+ if (enable_voice)
{
const bool DO_NOT_PERSIST = false;
enable_voice->setValue(LLSD(false), DO_NOT_PERSIST);
@@ -3071,6 +3066,13 @@ bool LLAppViewer::meetsRequirementsForMaximizedStart()
return maximizedOk;
}
+// virtual
+void LLAppViewer::sendOutOfDiskSpaceNotification()
+{
+ LL_WARNS() << "Out of disk space notification requested" << LL_ENDL;
+ LLNotificationsUtil::add("OutOfDiskSpace");
+}
+
bool LLAppViewer::initWindow()
{
LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL;
@@ -3164,8 +3166,8 @@ bool LLAppViewer::initWindow()
gSavedSettings.setBOOL("RenderInitError", false);
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), true );
- //If we have a startup crash, it's usually near GL initialization, so simulate that.
- if(gCrashOnStartup)
+ // If we have a startup crash, it's usually near GL initialization, so simulate that.
+ if (gCrashOnStartup)
{
LLAppViewer::instance()->forceErrorLLError();
}
@@ -3418,7 +3420,7 @@ LLSD LLAppViewer::getViewerInfo() const
info["LIBVLC_VERSION"] = "Undefined";
#endif
- S32 packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN);
+ S32 packets_in = (S32)LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN);
if (packets_in > 0)
{
info["PACKETS_LOST"] = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_LOST);
@@ -3990,11 +3992,11 @@ void LLAppViewer::requestQuit()
LLViewerRegion* region = gAgent.getRegion();
- if( (LLStartUp::getStartupState() < STATE_STARTED) || !region )
+ if ((LLStartUp::getStartupState() < STATE_STARTED) || !region)
{
// If we have a region, make some attempt to send a logout request first.
// This prevents the halfway-logged-in avatar from hanging around inworld for a couple minutes.
- if(region)
+ if (region)
{
sendLogoutRequest();
}
@@ -4025,6 +4027,7 @@ void LLAppViewer::requestQuit()
{
// application is quitting
gFloaterView->closeAllChildren(true);
+ mClosingFloaters = true;
}
// Send preferences once, when exiting
@@ -4088,6 +4091,7 @@ void LLAppViewer::abortQuit()
{
LL_INFOS() << "abortQuit()" << LL_ENDL;
mQuitRequested = false;
+ mClosingFloaters = false;
}
void LLAppViewer::migrateCacheDirectory()
@@ -4609,6 +4613,10 @@ void LLAppViewer::idle()
LLGLTFMaterialList::flushUpdates();
+ static LLCachedControl<U32> downscale_method(gSavedSettings, "RenderDownScaleMethod");
+ gGLManager.mDownScaleMethod = downscale_method;
+ LLImageGL::updateClass();
+
// Service the WorkQueue we use for replies from worker threads.
// Use function statics for the timeslice setting so we only have to fetch
// and convert MainWorkTime once.
@@ -5033,15 +5041,21 @@ void LLAppViewer::idleShutdown()
}
// Wait for all floaters to get resolved
- if (gFloaterView
- && !gFloaterView->allChildrenClosed())
+ if (gFloaterView)
{
- return;
+ if (!mClosingFloaters)
+ {
+ // application is quitting
+ gFloaterView->closeAllChildren(true);
+ mClosingFloaters = true;
+ return;
+ }
+ if (!gFloaterView->allChildrenClosed())
+ {
+ return;
+ }
}
-
-
-
// ProductEngine: Try moving this code to where we shut down sTextureCache in cleanup()
// *TODO: ugly
static bool saved_teleport_history = false;
@@ -5090,7 +5104,7 @@ void LLAppViewer::idleShutdown()
}
// All floaters are closed. Tell server we want to quit.
- if( !logoutRequestSent() )
+ if (!logoutRequestSent())
{
sendLogoutRequest();
@@ -5102,8 +5116,8 @@ void LLAppViewer::idleShutdown()
}
// Make sure that we quit if we haven't received a reply from the server.
- if( logoutRequestSent()
- && gLogoutTimer.getElapsedTimeF32() > gLogoutMaxTime )
+ if (logoutRequestSent()
+ && gLogoutTimer.getElapsedTimeF32() > gLogoutMaxTime)
{
forceQuit();
return;
@@ -5200,6 +5214,23 @@ void LLAppViewer::postToMainCoro(const LL::WorkQueue::Work& work)
gMainloopWork.post(work);
}
+void LLAppViewer::outOfMemorySoftQuit()
+{
+ if (!mQuitRequested)
+ {
+ // Todo:
+ // Find a way to free at least some memory to make it safer
+ // Pause decoding and mesh repositorie
+ getTextureCache()->pause();
+ getTextureFetch()->pause();
+ LLLFSThread::sLocal->pause();
+ gLogoutTimer.reset();
+ mQuitRequested = true;
+
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ }
+}
+
void LLAppViewer::idleNameCache()
{
// Neither old nor new name cache can function before agent has a region
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 08fbbaa390..7b456cc542 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -44,7 +44,6 @@
#define LL_LLAPPVIEWER_H
#include "llapp.h"
-#include "llallocator.h"
#include "llapr.h"
#include "llcontrol.h"
#include "llsys.h" // for LLOSInfo
@@ -194,8 +193,6 @@ public:
// *NOTE:Mani Fix this for login abstraction!!
void handleLoginComplete();
- LLAllocator & getAllocator() { return mAlloc; }
-
// On LoginCompleted callback
typedef boost::signals2::signal<void (void)> login_completed_signal_t;
login_completed_signal_t mOnLoginCompleted;
@@ -230,6 +227,12 @@ public:
// post given work to the "mainloop" work queue for handling on the main thread
void postToMainCoro(const LL::WorkQueue::Work& work);
+ // Attempt a 'soft' quit with disconnect and saving of settings/cache.
+ // Intended to be thread safe.
+ // Good chance of viewer crashing either way, but better than alternatives.
+ // Note: mQuitRequested can be aborted by user.
+ void outOfMemorySoftQuit();
+
protected:
virtual bool initWindow(); // Initialize the viewer's window.
virtual void initLoggingAndGetLastDuration(); // Initialize log files, logging system
@@ -245,6 +248,8 @@ protected:
virtual bool meetsRequirementsForMaximizedStart(); // Used on first login to decide to launch maximized
+ virtual void sendOutOfDiskSpaceNotification();
+
private:
bool doFrame();
@@ -315,6 +320,7 @@ private:
boost::optional<U32> mForceGraphicsLevel;
bool mQuitRequested; // User wants to quit, may have modified documents open.
+ bool mClosingFloaters;
bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
U32 mLastAgentControlFlags;
F32 mLastAgentForceUpdate;
@@ -329,8 +335,6 @@ private:
bool mAgentRegionLastAlive;
LLUUID mAgentRegionLastID;
- LLAllocator mAlloc;
-
// llcorehttp library init/shutdown helper
LLAppCoreHttp mAppCoreHttp;
@@ -338,7 +342,7 @@ private:
};
// consts from viewer.h
-const S32 AGENT_UPDATES_PER_SECOND = 10;
+const S32 AGENT_UPDATES_PER_SECOND = 125; // Value derived experimentally to avoid Input Delays with latest PBR-Capable Viewers when viewer FPS is highly volatile.
const S32 AGENT_FORCE_UPDATES_PER_SECOND = 1;
// Globals with external linkage. From viewer.h
@@ -404,8 +408,6 @@ extern LLVector3 gRelativeWindVec;
extern U32 gPacketsIn;
extern bool gPrintMessagesThisFrame;
-extern LLUUID gBlackSquareID;
-
extern bool gRandomizeFramerate;
extern bool gPeriodicSlowFrame;
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 3cdae041fc..c5686f160a 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -197,19 +197,6 @@ LONG WINAPI catchallCrashHandler(EXCEPTION_POINTERS * /*ExceptionInfo*/)
return 0;
}
-// *FIX:Mani - This hack is to fix a linker issue with libndofdev.lib
-// The lib was compiled under VS2005 - in VS2003 we need to remap assert
-#ifdef LL_DEBUG
-#ifdef LL_MSVC7
-extern "C" {
- void _wassert(const wchar_t * _Message, const wchar_t *_File, unsigned _Line)
- {
- LL_ERRS() << _Message << LL_ENDL;
- }
-}
-#endif
-#endif
-
const std::string LLAppViewerWin32::sWindowClass = "Second Life";
/*
@@ -240,7 +227,7 @@ bool create_app_mutex()
LPCWSTR unique_mutex_name = L"SecondLifeAppMutex";
HANDLE hMutex;
hMutex = CreateMutex(NULL, TRUE, unique_mutex_name);
- if(GetLastError() == ERROR_ALREADY_EXISTS)
+ if (GetLastError() == ERROR_ALREADY_EXISTS)
{
result = false;
}
@@ -464,7 +451,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
gDebugInfo["FoundOtherInstanceAtStartup"] = LLSD::Boolean(found_other_instance);
bool ok = viewer_app_ptr->init();
- if(!ok)
+ if (!ok)
{
LL_WARNS() << "Application init failed." << LL_ENDL;
return -1;
@@ -724,7 +711,7 @@ bool LLAppViewerWin32::init()
}
else
{
- boost::json::error_code ec;
+ boost::system::error_code ec;
boost::json::value build_data = boost::json::parse(inf, ec);
if(ec.failed())
{
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 65e32610c3..299cc5ed64 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -695,7 +695,7 @@ bool LLAvatarPropertiesProcessor::isPendingRequest(const LLUUID& avatar_id, EAva
if (it == mRequestTimestamps.end()) return false;
// We found a request, check if it has timed out
- U32 now = time(nullptr);
+ U32 now = (U32)time(nullptr);
const U32 REQUEST_EXPIRE_SECS = 5;
U32 expires = it->second + REQUEST_EXPIRE_SECS;
@@ -709,7 +709,7 @@ bool LLAvatarPropertiesProcessor::isPendingRequest(const LLUUID& avatar_id, EAva
void LLAvatarPropertiesProcessor::addPendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type)
{
timestamp_map_t::key_type key = std::make_pair(avatar_id, type);
- U32 now = time(nullptr);
+ U32 now = (U32)time(nullptr);
// Add or update existing (expired) request
mRequestTimestamps[ key ] = now;
}
diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp
index b0befa62e6..44f35981b0 100644
--- a/indra/newview/llavatarrenderinfoaccountant.cpp
+++ b/indra/newview/llavatarrenderinfoaccountant.cpp
@@ -84,7 +84,7 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro(std::string url, U64
// Going to request each 15 seconds either way, so don't wait
// too long and don't repeat
httpOpts->setRetries(0);
- httpOpts->setTimeout(SECS_BETWEEN_REGION_REQUEST);
+ httpOpts->setTimeout((unsigned int)SECS_BETWEEN_REGION_REQUEST);
LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts);
@@ -226,14 +226,12 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro(std::string url, U
// Build the render info to POST to the region
LLSD agents = LLSD::emptyMap();
- std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- while( iter != LLCharacter::sInstances.end() )
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter);
- if (avatar &&
- avatar->getRezzedStatus() >= 2 && // Mostly rezzed (maybe without baked textures downloaded)
- !avatar->isDead() && // Not dead yet
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead() && // Not dead yet
!avatar->isControlAvatar() && // Not part of an animated object
+ avatar->getRezzedStatus() >= 2 && // Mostly rezzed (maybe without baked textures downloaded)
avatar->getObjectHost() == regionp->getHost()) // Ensure it's on the same region
{
LLSD info = LLSD::emptyMap();
@@ -243,15 +241,14 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro(std::string url, U
// the weight/complexity is unsigned, but LLSD only stores signed integers,
// so if it's over that (which would be ridiculously high), just store the maximum signed int value
info[KEY_WEIGHT] = (S32)(avatar_complexity < S32_MAX ? avatar_complexity : S32_MAX);
- info[KEY_TOO_COMPLEX] = LLSD::Boolean(avatar->isTooComplex());
+ info[KEY_TOO_COMPLEX] = LLSD::Boolean(avatar->isTooComplex());
agents[avatar->getID().asString()] = info;
LL_DEBUGS("AvatarRenderInfo") << "Sending avatar render info for " << avatar->getID()
- << ": " << info << LL_ENDL;
+ << ": " << info << LL_ENDL;
num_avs++;
}
}
- iter++;
}
// Reset this regions timer, moving to longer intervals if there are lots of avatars around
diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp
index 07a5c871ae..b40bcadabf 100644
--- a/indra/newview/llavatarrendernotifier.cpp
+++ b/indra/newview/llavatarrendernotifier.cpp
@@ -172,7 +172,7 @@ void LLAvatarRenderNotifier::updateNotificationRegion(U32 agentcount, U32 overLi
// save current values for later use
mLatestAgentsCount = agentcount > overLimit ? agentcount - 1 : agentcount; // subtract self
mLatestOverLimitAgents = overLimit;
- mLatestOverLimitPct = mLatestAgentsCount != 0 ? ((F32)overLimit / (F32)mLatestAgentsCount) * 100.0 : 0;
+ mLatestOverLimitPct = mLatestAgentsCount != 0 ? ((F32)overLimit / (F32)mLatestAgentsCount) * 100.0f : 0.f;
if (mAgentsCount == mLatestAgentsCount
&& mOverLimitAgents == mLatestOverLimitAgents)
@@ -191,7 +191,7 @@ void LLAvatarRenderNotifier::updateNotificationRegion(U32 agentcount, U32 overLi
// default timeout before next notification
static LLCachedControl<U32> pop_up_delay(gSavedSettings, "ComplexityChangesPopUpDelay", 300);
- mPopUpDelayTimer.resetWithExpiry(pop_up_delay);
+ mPopUpDelayTimer.resetWithExpiry((F32)pop_up_delay);
}
}
@@ -500,6 +500,6 @@ void LLHUDRenderNotifier::displayHUDNotification(EWarnLevel warn_type, LLUUID ob
.name("HUDComplexityWarning")
.expiry(expire_date)
.substitutions(msg_args));
- mHUDPopUpDelayTimer.resetWithExpiry(pop_up_delay);
+ mHUDPopUpDelayTimer.resetWithExpiry((F32)pop_up_delay);
}
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 039164cd6e..8e9ab8f87f 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -451,7 +451,7 @@ void LLAvatarTracker::findAgent()
msg->nextBlockFast(_PREHASH_AgentBlock);
msg->addUUIDFast(_PREHASH_Hunter, gAgentID);
msg->addUUIDFast(_PREHASH_Prey, mTrackingData->mAvatarID);
- msg->addU32Fast(_PREHASH_SpaceIP, 0); // will get filled in by simulator
+ msg->addIPAddrFast(_PREHASH_SpaceIP, 0); // will get filled in by simulator
msg->nextBlockFast(_PREHASH_LocationBlock);
const F64 NO_LOCATION = 0.0;
msg->addF64Fast(_PREHASH_GlobalX, NO_LOCATION);
@@ -491,7 +491,7 @@ void LLAvatarTracker::notifyObservers()
// new masks and ids will be processed later from idle.
return;
}
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
mIsNotifyObservers = true;
observer_list_t observers(mObservers);
@@ -678,7 +678,7 @@ void LLAvatarTracker::processChangeUserRights(LLMessageSystem* msg, void**)
void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
S32 count = msg->getNumberOfBlocksFast(_PREHASH_AgentBlock);
bool chat_notify = gSavedSettings.getBOOL("ChatOnlineNotification");
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 060430862b..454991ab83 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -148,7 +148,7 @@ void LLChannelManager::onLoginCompleted()
mStartUpChannel->setMouseDownCallback(boost::bind(&LLFloaterNotificationsTabbed::onStartUpToastClick, LLFloaterNotificationsTabbed::getInstance(), _2, _3, _4));
mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
- mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
+ mStartUpChannel->createStartUpToast(away_notifications, (F32)gSavedSettings.getS32("StartUpToastLifeTime"));
}
}
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index 7a4899f1f3..4db7f32b10 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -33,7 +33,6 @@
#include "lluuid.h"
#include <map>
-#include <boost/shared_ptr.hpp>
namespace LLNotificationsUI
{
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index fc50691ece..a48e22bc73 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -423,7 +423,7 @@ public:
if (mTime > 0) // have frame time
{
time_t current_time = time_corrected();
- time_t message_time = current_time - LLFrameTimer::getElapsedSeconds() + mTime;
+ time_t message_time = (time_t)(current_time - LLFrameTimer::getElapsedSeconds() + mTime);
time_string = "[" + LLTrans::getString("TimeMonth") + "]/["
+ LLTrans::getString("TimeDay") + "]/["
@@ -693,7 +693,7 @@ public:
mNeedsTimeBox = false;
user_name->setValue(mFrom);
updateMinUserNameWidth();
- LLColor4 sep_color = LLUIColorTable::instance().getColor("ChatTeleportSeparatorColor");
+ LLUIColor sep_color = LLUIColorTable::instance().getColor("ChatTeleportSeparatorColor");
setTransparentColor(sep_color);
mTimeBoxTextBox->setVisible(false);
}
@@ -739,7 +739,7 @@ public:
std::string username = chat.mFromName.substr(username_start + 2);
username = username.substr(0, username.length() - 1);
LLStyle::Params style_params_name;
- LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
+ LLUIColor userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
style_params_name.color(userNameColor);
style_params_name.font.name("SansSerifSmall");
style_params_name.font.style("NORMAL");
@@ -1037,7 +1037,7 @@ private:
!av_name.isDisplayNameDefault())
{
LLStyle::Params style_params_name;
- LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
+ LLUIColor userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
style_params_name.color(userNameColor);
style_params_name.font.name("SansSerifSmall");
style_params_name.font.style("NORMAL");
@@ -1239,10 +1239,11 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
mMoreChatPanel->reshape(mMoreChatPanel->getRect().getWidth(), height);
}
- LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
- LLColor4 name_color(txt_color);
+ F32 alpha = 1.f;
+ LLUIColor txt_color = LLUIColorTable::instance().getColor("White");
+ LLUIColor name_color(txt_color);
+ LLViewerChat::getChatColor(chat, txt_color, alpha);
- LLViewerChat::getChatColor(chat,txt_color);
LLFontGL* fontp = LLViewerChat::getChatFont();
std::string font_name = LLFontGL::nameFromFont(fontp);
std::string font_size = LLFontGL::sizeFromFont(fontp);
@@ -1250,6 +1251,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
LLStyle::Params body_message_params;
body_message_params.color(txt_color);
body_message_params.readonly_color(txt_color);
+ body_message_params.alpha(alpha);
body_message_params.font.name(font_name);
body_message_params.font.size(font_size);
body_message_params.font.style(input_append_params.font.style);
@@ -1317,7 +1319,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
{
if (!message_from_log)
{
- LLColor4 timestamp_color = LLUIColorTable::instance().getColor("ChatTimestampColor");
+ LLUIColor timestamp_color = LLUIColorTable::instance().getColor("ChatTimestampColor");
timestamp_style.color(timestamp_color);
timestamp_style.readonly_color(timestamp_color);
}
@@ -1344,7 +1346,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
// set the link for the object name to be the objectim SLapp
// (don't let object names with hyperlinks override our objectim Url)
LLStyle::Params link_params(body_message_params);
- LLColor4 link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ LLUIColor link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
link_params.color = link_color;
link_params.readonly_color = link_color;
link_params.is_link = true;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index d517f5a19d..550dfeb802 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -134,8 +134,8 @@ void LLFloaterIMNearbyChatToastPanel::addMessage(LLSD& notification)
std::string color_name = notification["text_color"].asString();
- LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
- textColor.mV[VALPHA] =notification["color_alpha"].asReal();
+ LLUIColor textColor = LLUIColorTable::instance().getColor(color_name);
+ F32 textAlpha = (F32)notification["color_alpha"].asReal();
S32 font_size = notification["font_size"].asInteger();
@@ -152,6 +152,7 @@ void LLFloaterIMNearbyChatToastPanel::addMessage(LLSD& notification)
{
LLStyle::Params style_params;
style_params.color(textColor);
+ style_params.alpha(textAlpha);
std::string font_name = LLFontGL::nameFromFont(messageFont);
std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
style_params.font.name(font_name);
@@ -190,8 +191,8 @@ void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification)
std::string color_name = notification["text_color"].asString();
- LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
- textColor.mV[VALPHA] =notification["color_alpha"].asReal();
+ LLUIColor textColor = LLUIColorTable::instance().getColor(color_name);
+ F32 textAlpha = (F32)notification["color_alpha"].asReal();
S32 font_size = notification["font_size"].asInteger();
@@ -222,14 +223,9 @@ void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification)
if (mSourceType == CHAT_SOURCE_AGENT || mSourceType == CHAT_SOURCE_OBJECT)
{
LLStyle::Params style_params_name;
-
- LLColor4 user_name_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
- style_params_name.color(user_name_color);
-
- std::string font_name = LLFontGL::nameFromFont(messageFont);
- std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
- style_params_name.font.name(font_name);
- style_params_name.font.size(font_style_size);
+ style_params_name.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ style_params_name.font.name = LLFontGL::nameFromFont(messageFont);
+ style_params_name.font.size = LLFontGL::sizeFromFont(messageFont);
style_params_name.link_href = notification["sender_slurl"].asString();
style_params_name.is_link = true;
@@ -274,6 +270,7 @@ void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification)
{
LLStyle::Params style_params;
style_params.color(textColor);
+ style_params.alpha(textAlpha);
std::string font_name = LLFontGL::nameFromFont(messageFont);
std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
style_params.font.name(font_name);
diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp
index f301af9511..f21bae9805 100644
--- a/indra/newview/llcommandlineparser.cpp
+++ b/indra/newview/llcommandlineparser.cpp
@@ -28,26 +28,12 @@
#include "llcommandlineparser.h"
#include "llexception.h"
-// *NOTE: The boost::lexical_cast generates
-// the warning C4701(local used with out assignment) in VC7.1.
-// Disable the warning for the boost includes.
-#if _MSC_VER
-# pragma warning(push)
-# pragma warning( disable : 4701 )
-#else
-// NOTE: For the other platforms?
-#endif
-
#include <boost/program_options.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/bind.hpp>
#include <boost/tokenizer.hpp>
#include <boost/assign/list_of.hpp>
-#if _MSC_VER
-# pragma warning(pop)
-#endif
-
#include "llsdserialize.h"
#include "llerror.h"
#include "stringize.h"
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 716333b217..9201241856 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -99,19 +99,11 @@ LLVOAvatar *LLControlAvatar::getAttachedAvatar()
void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_scale_fixup) const
{
- F32 max_legal_offset = MAX_LEGAL_OFFSET;
- if (gSavedSettings.getControl("AnimatedObjectsMaxLegalOffset"))
- {
- max_legal_offset = gSavedSettings.getF32("AnimatedObjectsMaxLegalOffset");
- }
- max_legal_offset = llmax(max_legal_offset,0.f);
+ static LLCachedControl<F32> anim_max_legal_offset(gSavedSettings, "AnimatedObjectsMaxLegalOffset", MAX_LEGAL_OFFSET);
+ F32 max_legal_offset = llmax(anim_max_legal_offset(), 0.f);
- F32 max_legal_size = MAX_LEGAL_SIZE;
- if (gSavedSettings.getControl("AnimatedObjectsMaxLegalSize"))
- {
- max_legal_size = gSavedSettings.getF32("AnimatedObjectsMaxLegalSize");
- }
- max_legal_size = llmax(max_legal_size, 1.f);
+ static LLCachedControl<F32> anim_max_legal_size(gSavedSettings, "AnimatedObjectsMaxLegalSize", MAX_LEGAL_SIZE);
+ F32 max_legal_size = llmax(anim_max_legal_size(), 1.f);
new_pos_fixup = LLVector3();
new_scale_fixup = 1.0f;
@@ -419,7 +411,8 @@ bool LLControlAvatar::updateCharacter(LLAgent &agent)
//virtual
void LLControlAvatar::updateDebugText()
{
- if (gSavedSettings.getBOOL("DebugAnimatedObjects"))
+ static LLCachedControl<bool> debug_animated_objects(gSavedSettings, "DebugAnimatedObjects");
+ if (debug_animated_objects)
{
S32 total_linkset_count = 0;
if (mRootVolp)
@@ -706,14 +699,14 @@ bool LLControlAvatar::isImpostor()
return LLVOAvatar::isImpostor();
}
-//static
+// static
void LLControlAvatar::onRegionChanged()
{
- std::vector<LLCharacter*>::iterator it = LLCharacter::sInstances.begin();
- for ( ; it != LLCharacter::sInstances.end(); ++it)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLControlAvatar* cav = dynamic_cast<LLControlAvatar*>(*it);
- if (!cav) continue;
- cav->mRegionChanged = true;
+ if (LLControlAvatar* cav = dynamic_cast<LLControlAvatar*>(character))
+ {
+ cav->mRegionChanged = true;
+ }
}
}
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index ec55768673..b19b6f8dec 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -257,12 +257,12 @@ bool LLConversationViewSession::postBuild()
mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true);
mIsInActiveVoiceChannel = true;
- if (mVoiceClientObserver)
- {
+ if (mVoiceClientObserver)
+ {
LLVoiceClient::removeObserver(mVoiceClientObserver);
- delete mVoiceClientObserver;
- }
- mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
+ delete mVoiceClientObserver;
+ }
+ mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
LLVoiceClient::addObserver(mVoiceClientObserver);
break;
@@ -648,6 +648,7 @@ void LLConversationViewParticipant::draw()
static LLUIColor sFlashBgColor = LLUIColorTable::instance().getColor("MenuItemFlashBgColor", DEFAULT_WHITE);
static LLUIColor sFocusOutlineColor = LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);
+ static LLUIColor sFriendColor = LLUIColorTable::instance().getColor("ConversationFriendColor");
const bool show_context = (getRoot() ? getRoot()->getShowSelectionContext() : false);
@@ -657,23 +658,23 @@ void LLConversationViewParticipant::draw()
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad;
F32 text_left = (F32)getLabelXPos();
- LLColor4 color;
+ LLUIColor* color;
LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance();
if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID))
{
- color = sFgDisabledColor;
+ color = &sFgDisabledColor;
}
else
{
if (LLAvatarActions::isFriend(mUUID))
{
- color = LLUIColorTable::instance().getColor("ConversationFriendColor");
+ color = &sFriendColor;
}
else
{
- color = mIsSelected ? sHighlightFgColor : sFgColor;
+ color = mIsSelected ? &sHighlightFgColor : &sFgColor;
}
}
@@ -684,7 +685,7 @@ void LLConversationViewParticipant::draw()
}
drawHighlight(show_context, mIsSelected, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
- drawLabel(font, text_left, y, color, right_x);
+ drawLabel(font, text_left, y, color->get(), right_x);
LLView::draw();
}
diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index 06c87343e2..8a4ab091a3 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -111,16 +111,17 @@ public:
bool hasEstimate() const;
std::string getLocalEstimate() const;
- void startTransaction(TransactionType type,
- const char* method, LLXMLRPCValue params);
+ void startTransaction(TransactionType type, const char* method, const LLSD& params);
+
+ // return true if update needed
bool checkTransaction();
- // return true if update needed
void setError(const std::string& message, const std::string& uri);
void clearError();
+ // return true if update needed
bool considerUpdateCurrency();
- // return true if update needed
+
void currencyKey(S32);
static void onCurrencyKey(LLLineEditor* caller, void* data);
@@ -160,32 +161,29 @@ void LLCurrencyUIManager::Impl::updateCurrencyInfo()
return;
}
- LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
- keywordArgs.appendString("agentId", gAgent.getID().asString());
- keywordArgs.appendString(
- "secureSessionId",
- gAgent.getSecureSessionID().asString());
- keywordArgs.appendString("language", LLUI::getLanguage());
- keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy);
- keywordArgs.appendString("viewerChannel", LLVersionInfo::instance().getChannel());
- keywordArgs.appendInt("viewerMajorVersion", LLVersionInfo::instance().getMajor());
- keywordArgs.appendInt("viewerMinorVersion", LLVersionInfo::instance().getMinor());
- keywordArgs.appendInt("viewerPatchVersion", LLVersionInfo::instance().getPatch());
+ const LLVersionInfo& vi(LLVersionInfo::instance());
+
+ LLSD params = LLSD::emptyMap();
+ params["agentId"] = gAgent.getID().asString();
+ params["secureSessionId"] = gAgent.getSecureSessionID().asString();
+ params["language"] = LLUI::getLanguage();
+ params["currencyBuy"] = mUserCurrencyBuy;
+ params["viewerChannel"] = vi.getChannel();
+ params["viewerMajorVersion"] = vi.getMajor();
+ params["viewerMinorVersion"] = vi.getMinor();
+ params["viewerPatchVersion"] = vi.getPatch();
// With GitHub builds, the build number is too big to fit in a 32-bit int,
- // and XMLRPC_VALUE doesn't deal with integers wider than int. Use string.
- keywordArgs.appendString("viewerBuildVersion", stringize(LLVersionInfo::instance().getBuild()));
-
- LLXMLRPCValue params = LLXMLRPCValue::createArray();
- params.append(keywordArgs);
+ // and XMLRPC value doesn't deal with integers wider than int. Use string.
+ params["viewerBuildVersion"] = std::to_string(vi.getBuild());
startTransaction(TransactionCurrency, "getCurrencyQuote", params);
}
void LLCurrencyUIManager::Impl::finishCurrencyInfo()
{
- LLXMLRPCValue result = mTransaction->responseValue();
+ const LLSD& result = mTransaction->response();
- bool success = result["success"].asBool();
+ bool success = result["success"].asBoolean();
if (!success)
{
setError(
@@ -195,24 +193,24 @@ void LLCurrencyUIManager::Impl::finishCurrencyInfo()
return;
}
- LLXMLRPCValue currency = result["currency"];
+ const LLSD& currency = result["currency"];
// old XML-RPC server: estimatedCost = value in US cents
- mUSDCurrencyEstimated = currency["estimatedCost"].isValid();
+ mUSDCurrencyEstimated = currency.has("estimatedCost");
if (mUSDCurrencyEstimated)
{
- mUSDCurrencyEstimatedCost = currency["estimatedCost"].asInt();
+ mUSDCurrencyEstimatedCost = currency["estimatedCost"].asInteger();
}
// newer XML-RPC server: estimatedLocalCost = local currency string
- mLocalCurrencyEstimated = currency["estimatedLocalCost"].isValid();
+ mLocalCurrencyEstimated = currency.has("estimatedLocalCost");
if (mLocalCurrencyEstimated)
{
mLocalCurrencyEstimatedCost = currency["estimatedLocalCost"].asString();
mSupportsInternationalBilling = true;
}
- S32 newCurrencyBuy = currency["currencyBuy"].asInt();
+ S32 newCurrencyBuy = currency["currencyBuy"].asInteger();
if (newCurrencyBuy != mUserCurrencyBuy)
{
mUserCurrencyBuy = newCurrencyBuy;
@@ -224,36 +222,36 @@ void LLCurrencyUIManager::Impl::finishCurrencyInfo()
void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password)
{
- LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
- keywordArgs.appendString("agentId", gAgent.getID().asString());
- keywordArgs.appendString(
- "secureSessionId",
- gAgent.getSecureSessionID().asString());
- keywordArgs.appendString("language", LLUI::getLanguage());
- keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy);
+ const LLVersionInfo& vi(LLVersionInfo::instance());
+
+ LLSD params = LLSD::emptyMap();
+ params["agentId"] = gAgent.getID().asString();
+ params["secureSessionId"] = gAgent.getSecureSessionID().asString();
+ params["language"] = LLUI::getLanguage();
+ params["currencyBuy"] = mUserCurrencyBuy;
+ params["confirm"] = mSiteConfirm;
+ params["viewerChannel"] = vi.getChannel();
+ params["viewerMajorVersion"] = vi.getMajor();
+ params["viewerMinorVersion"] = vi.getMinor();
+ params["viewerPatchVersion"] = vi.getPatch();
+ // With GitHub builds, the build number is too big to fit in a 32-bit int,
+ // and XMLRPC value doesn't deal with integers wider than int. Use string.
+ params["viewerBuildVersion"] = std::to_string(vi.getBuild());
+
if (mUSDCurrencyEstimated)
{
- keywordArgs.appendInt("estimatedCost", mUSDCurrencyEstimatedCost);
+ params["estimatedCost"] = mUSDCurrencyEstimatedCost;
}
+
if (mLocalCurrencyEstimated)
{
- keywordArgs.appendString("estimatedLocalCost", mLocalCurrencyEstimatedCost);
+ params["estimatedLocalCost"] = mLocalCurrencyEstimatedCost;
}
- keywordArgs.appendString("confirm", mSiteConfirm);
+
if (!password.empty())
{
- keywordArgs.appendString("password", password);
+ params["password"] = password;
}
- keywordArgs.appendString("viewerChannel", LLVersionInfo::instance().getChannel());
- keywordArgs.appendInt("viewerMajorVersion", LLVersionInfo::instance().getMajor());
- keywordArgs.appendInt("viewerMinorVersion", LLVersionInfo::instance().getMinor());
- keywordArgs.appendInt("viewerPatchVersion", LLVersionInfo::instance().getPatch());
- // With GitHub builds, the build number is too big to fit in a 32-bit int,
- // and XMLRPC_VALUE doesn't deal with integers wider than int. Use string.
- keywordArgs.appendString("viewerBuildVersion", stringize(LLVersionInfo::instance().getBuild()));
-
- LLXMLRPCValue params = LLXMLRPCValue::createArray();
- params.append(keywordArgs);
startTransaction(TransactionBuy, "buyCurrency", params);
@@ -263,9 +261,9 @@ void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password)
void LLCurrencyUIManager::Impl::finishCurrencyBuy()
{
- LLXMLRPCValue result = mTransaction->responseValue();
+ const LLSD& result = mTransaction->response();
- bool success = result["success"].asBool();
+ bool success = result["success"].asBoolean();
if (!success)
{
setError(
@@ -282,7 +280,7 @@ void LLCurrencyUIManager::Impl::finishCurrencyBuy()
}
void LLCurrencyUIManager::Impl::startTransaction(TransactionType type,
- const char* method, LLXMLRPCValue params)
+ const char* method, const LLSD& params)
{
static std::string transactionURI;
if (transactionURI.empty())
@@ -293,12 +291,7 @@ void LLCurrencyUIManager::Impl::startTransaction(TransactionType type,
delete mTransaction;
mTransactionType = type;
- mTransaction = new LLXMLRPCTransaction(
- transactionURI,
- method,
- params,
- false /* don't use gzip */
- );
+ mTransaction = new LLXMLRPCTransaction(transactionURI, method, params);
clearError();
}
@@ -352,12 +345,17 @@ bool LLCurrencyUIManager::Impl::checkTransaction()
{
setError(mTransaction->statusMessage(), mTransaction->statusURI());
}
- else {
+ else
+ {
switch (mTransactionType)
{
- case TransactionCurrency: finishCurrencyInfo(); break;
- case TransactionBuy: finishCurrencyBuy(); break;
- default: ;
+ case TransactionCurrency:
+ finishCurrencyInfo();
+ break;
+ case TransactionBuy:
+ finishCurrencyBuy();
+ break;
+ default:;
}
}
@@ -385,9 +383,8 @@ void LLCurrencyUIManager::Impl::clearError()
bool LLCurrencyUIManager::Impl::considerUpdateCurrency()
{
- if (mCurrencyChanged
- && !mTransaction
- && mCurrencyKeyTimer.getElapsedTimeF32() >= CURRENCY_ESTIMATE_FREQUENCY)
+ if (mCurrencyChanged && !mTransaction &&
+ mCurrencyKeyTimer.getElapsedTimeF32() >= CURRENCY_ESTIMATE_FREQUENCY)
{
updateCurrencyInfo();
return true;
@@ -408,7 +405,8 @@ void LLCurrencyUIManager::Impl::currencyKey(S32 value)
mUserCurrencyBuy = value;
- if (hasEstimate()) {
+ if (hasEstimate())
+ {
clearEstimate();
//cannot just simply refresh the whole UI, as the edit field will
// get reset and the cursor will change...
@@ -421,8 +419,7 @@ void LLCurrencyUIManager::Impl::currencyKey(S32 value)
}
// static
-void LLCurrencyUIManager::Impl::onCurrencyKey(
- LLLineEditor* caller, void* data)
+void LLCurrencyUIManager::Impl::onCurrencyKey(LLLineEditor* caller, void* data)
{
S32 value = atoi(caller->getText().c_str());
LLCurrencyUIManager::Impl* self = (LLCurrencyUIManager::Impl*)data;
@@ -589,14 +586,12 @@ bool LLCurrencyUIManager::inProcess()
bool LLCurrencyUIManager::canCancel()
{
- return impl.mTransactionType != Impl::TransactionBuy;
+ return !buying();
}
bool LLCurrencyUIManager::canBuy()
{
- return impl.mTransactionType == Impl::TransactionNone
- && impl.hasEstimate()
- && impl.mUserCurrencyBuy > 0;
+ return !inProcess() && impl.hasEstimate() && impl.mUserCurrencyBuy > 0;
}
bool LLCurrencyUIManager::buying()
diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index 246e2099f9..a0fbebb4cb 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -211,5 +211,5 @@ S32 LLDateUtil::secondsSinceEpochFromString(const std::string& format, const std
// is calculated with no time zone corrections.
time_duration diff = time_t_date - time_t_epoch;
- return diff.total_seconds();
+ return (S32)diff.total_seconds();
}
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index b88d11886a..53da9826ed 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -105,10 +105,7 @@ void LLDebugView::init()
addChild(gSceneMonitorView);
gSceneMonitorView->setRect(rect);
- r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),
- (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
-
- r.set(150, rect.getHeight() - 50, 820, 100);
+ r.set(150, rect.getHeight() - 60, 820, 110);
LLTextureView::Params tvp;
tvp.name("gTextureView");
tvp.rect(r);
@@ -116,14 +113,13 @@ void LLDebugView::init()
tvp.visible(false);
gTextureView = LLUICtrlFactory::create<LLTextureView>(tvp);
addChild(gTextureView);
- //gTextureView->reshape(r.getWidth(), r.getHeight(), true);
}
void LLDebugView::draw()
{
if (mFloaterSnapRegion == NULL)
{
- mFloaterSnapRegion = getRootView()->getChildView("floater_snap_region");
+ mFloaterSnapRegion = gViewerWindow->getFloaterSnapRegion();
}
LLRect debug_rect;
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 26fdf51485..ae48db24bc 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -98,7 +98,7 @@ LLDrawable::LLDrawable(LLViewerObject *vobj, bool new_entry)
void LLDrawable::init(bool new_entry)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
// mXform
mParent = NULL;
@@ -305,7 +305,7 @@ S32 LLDrawable::findReferences(LLDrawable *drawablep)
LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
LLFace *face;
{
@@ -333,7 +333,7 @@ LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)
LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
LLFace *face;
@@ -356,7 +356,7 @@ LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep)
LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
LLFace *face;
face = new LLFace(this, mVObjp);
@@ -379,7 +379,7 @@ LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep,
LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp, LLViewerTexture *specularp)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
LLFace *face;
face = new LLFace(this, mVObjp);
@@ -403,7 +403,7 @@ LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep,
void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
if (newFaces == (S32)mFaces.size())
{
@@ -428,7 +428,7 @@ void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerText
void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
if (newFaces <= (S32)mFaces.size() && newFaces >= (S32)mFaces.size()/2)
{
@@ -453,7 +453,7 @@ void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewer
void LLDrawable::mergeFaces(LLDrawable* src)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
auto face_count = mFaces.size() + src->mFaces.size();
@@ -488,7 +488,7 @@ void LLDrawable::updateMaterial()
void LLDrawable::makeActive()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
#if !LL_RELEASE_FOR_DOWNLOAD
if (mVObjp.notNull())
@@ -552,7 +552,7 @@ void LLDrawable::makeActive()
void LLDrawable::makeStatic(bool warning_enabled)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
if (isState(ACTIVE) &&
!isState(ACTIVE_CHILD) &&
@@ -600,7 +600,7 @@ void LLDrawable::makeStatic(bool warning_enabled)
// Returns "distance" between target destination and resulting xfrom
F32 LLDrawable::updateXform(bool undamped)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
bool damped = !undamped;
@@ -754,7 +754,7 @@ void LLDrawable::moveUpdatePipeline(bool moved)
void LLDrawable::movePartition()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
LLSpatialPartition* part = getSpatialPartition();
if (part)
@@ -800,7 +800,7 @@ bool LLDrawable::updateMoveUndamped()
void LLDrawable::updatePartition()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
if (!getVOVolume())
{
@@ -819,7 +819,7 @@ void LLDrawable::updatePartition()
bool LLDrawable::updateMoveDamped()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
F32 dist_squared = updateXform(false);
@@ -844,7 +844,7 @@ bool LLDrawable::updateMoveDamped()
void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
@@ -944,7 +944,7 @@ void LLDrawable::updateTexture()
bool LLDrawable::updateGeometry()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
llassert(mVObjp.notNull());
bool res = mVObjp && mVObjp->updateGeometry(this);
@@ -1022,7 +1022,7 @@ const LLVector3& LLDrawable::getBounds(LLVector3& min, LLVector3& max) const
void LLDrawable::updateSpatialExtents()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
if (mVObjp)
{
@@ -1158,7 +1158,7 @@ void LLDrawable::setGroup(LLViewerOctreeGroup *groupp)
*/
LLSpatialPartition* LLDrawable::getSpatialPartition()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
LLSpatialPartition* retval = NULL;
@@ -1295,7 +1295,7 @@ void LLSpatialBridge::destroyTree()
void LLSpatialBridge::updateSpatialExtents()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
LLSpatialGroup* root = (LLSpatialGroup*) mOctree->getListener(0);
@@ -1468,7 +1468,7 @@ public:
void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results, bool for_select)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
if (!gPipeline.hasRenderType(mDrawableType))
{
@@ -1567,7 +1567,7 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>*
void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
if (mDrawable == NULL)
{
@@ -1600,18 +1600,10 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
mDrawable->updateDistance(camera, force_update);
- LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
- for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
- iter != child_list.end(); iter++)
+ for (LLViewerObject* child : mDrawable->getVObj()->getChildren())
{
- LLViewerObject* child = *iter;
LLDrawable* drawable = child->mDrawable;
- if (!drawable)
- {
- continue;
- }
-
- if (!drawable->isAvatar())
+ if (drawable && !drawable->isDead() && !drawable->isAvatar())
{
drawable->updateDistance(camera, force_update);
}
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 34da5b29d4..cb1439b403 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -81,10 +81,6 @@ LLDrawPoolAlpha::~LLDrawPoolAlpha()
void LLDrawPoolAlpha::prerender()
{
mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
-
- // TODO: is this even necessay? These are probably set to never discard
- LLViewerFetchedTexture::sFlatNormalImagep->addTextureStats(1024.f*1024.f);
- LLViewerFetchedTexture::sWhiteImagep->addTextureStats(1024.f * 1024.f);
}
S32 LLDrawPoolAlpha::getNumPostDeferredPasses()
@@ -212,7 +208,7 @@ void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
forwardRender();
// final pass, render to depth for depth of field effects
- if (!LLPipeline::sImpostorRender && gSavedSettings.getBOOL("RenderDepthOfField") && !gCubeSnapshot && !LLPipeline::sRenderingHUDs && getType() == LLDrawPool::POOL_ALPHA_POST_WATER)
+ if (!LLPipeline::sImpostorRender && LLPipeline::RenderDepthOfField && !gCubeSnapshot && !LLPipeline::sRenderingHUDs && getType() == LLDrawPool::POOL_ALPHA_POST_WATER)
{
//update depth buffer sampler
simple_shader = fullbright_shader = &gDeferredFullbrightAlphaMaskProgram;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 9afc705d3e..95f96e85d6 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -62,8 +62,6 @@ S32 LLDrawPoolAvatar::sShadowPass = -1;
S32 LLDrawPoolAvatar::sDiffuseChannel = 0;
F32 LLDrawPoolAvatar::sMinimumAlpha = 0.2f;
-LLUUID gBlackSquareID;
-
static bool is_deferred_render = false;
static bool is_post_deferred_render = false;
@@ -117,7 +115,7 @@ LLDrawPoolAvatar::~LLDrawPoolAvatar()
// virtual
bool LLDrawPoolAvatar::isDead()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
if (!LLFacePool::isDead())
{
@@ -129,14 +127,14 @@ bool LLDrawPoolAvatar::isDead()
S32 LLDrawPoolAvatar::getShaderLevel() const
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
return (S32) LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
}
void LLDrawPoolAvatar::prerender()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
@@ -145,7 +143,7 @@ void LLDrawPoolAvatar::prerender()
LLMatrix4& LLDrawPoolAvatar::getModelView()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
static LLMatrix4 ret;
@@ -217,7 +215,7 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
void LLDrawPoolAvatar::renderDeferred(S32 pass)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
render(pass);
}
@@ -229,7 +227,7 @@ S32 LLDrawPoolAvatar::getNumPostDeferredPasses()
void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
sSkipOpaque = true;
sShaderLevel = mShaderLevel;
@@ -245,7 +243,7 @@ void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
sRenderingSkinned = false;
sSkipOpaque = false;
@@ -257,7 +255,7 @@ void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
void LLDrawPoolAvatar::renderPostDeferred(S32 pass)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
is_post_deferred_render = true;
if (LLPipeline::sImpostorRender)
@@ -489,7 +487,7 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
void LLDrawPoolAvatar::beginImpostor()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
if (!LLPipeline::sReflectionRender)
{
@@ -506,7 +504,7 @@ void LLDrawPoolAvatar::beginImpostor()
void LLDrawPoolAvatar::endImpostor()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
gImpostorProgram.unbind();
gPipeline.enableLightsDynamic();
@@ -514,7 +512,7 @@ void LLDrawPoolAvatar::endImpostor()
void LLDrawPoolAvatar::beginRigid()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
if (gPipeline.shadersLoaded())
{
@@ -534,7 +532,7 @@ void LLDrawPoolAvatar::beginRigid()
void LLDrawPoolAvatar::endRigid()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
sShaderLevel = mShaderLevel;
if (sVertexProgram != NULL)
@@ -545,7 +543,7 @@ void LLDrawPoolAvatar::endRigid()
void LLDrawPoolAvatar::beginDeferredImpostor()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
if (!LLPipeline::sReflectionRender)
{
@@ -563,7 +561,7 @@ void LLDrawPoolAvatar::beginDeferredImpostor()
void LLDrawPoolAvatar::endDeferredImpostor()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
sShaderLevel = mShaderLevel;
sVertexProgram->disableTexture(LLViewerShaderMgr::NORMAL_MAP);
@@ -576,7 +574,7 @@ void LLDrawPoolAvatar::endDeferredImpostor()
void LLDrawPoolAvatar::beginDeferredRigid()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
@@ -586,7 +584,7 @@ void LLDrawPoolAvatar::beginDeferredRigid()
void LLDrawPoolAvatar::endDeferredRigid()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
sShaderLevel = mShaderLevel;
sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
@@ -597,7 +595,7 @@ void LLDrawPoolAvatar::endDeferredRigid()
void LLDrawPoolAvatar::beginSkinned()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
// used for preview only
@@ -611,7 +609,7 @@ void LLDrawPoolAvatar::beginSkinned()
void LLDrawPoolAvatar::endSkinned()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
if (sShaderLevel > 0)
@@ -637,7 +635,7 @@ void LLDrawPoolAvatar::endSkinned()
void LLDrawPoolAvatar::beginDeferredSkinned()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
sShaderLevel = mShaderLevel;
sVertexProgram = &gDeferredAvatarProgram;
@@ -651,7 +649,7 @@ void LLDrawPoolAvatar::beginDeferredSkinned()
void LLDrawPoolAvatar::endDeferredSkinned()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
sRenderingSkinned = false;
@@ -836,7 +834,7 @@ static LLTrace::BlockTimerStatHandle FTM_RIGGED_VBO("Rigged VBO");
//-----------------------------------------------------------------------------
LLViewerTexture *LLDrawPoolAvatar::getDebugTexture()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
if (mReferences.empty())
{
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 055f99d764..7289e95b6e 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -79,11 +79,6 @@ static S32 diffuse_channel = -1;
static S32 bump_channel = -1;
static bool shiny = false;
-// Enabled after changing LLViewerTexture::mNeedsCreateTexture to an
-// LLAtomicBool; this should work just fine, now. HB
-#define LL_BUMPLIST_MULTITHREADED 1
-
-
// static
void LLStandardBumpmap::shutdown()
{
@@ -764,24 +759,21 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
llassert( (bump_code == BE_BRIGHTNESS) || (bump_code == BE_DARKNESS) );
- LLViewerTexture* bump = NULL;
+ LLViewerTexture* bump = nullptr;
- bump_image_map_t* entries_list = NULL;
- void (*callback_func)( bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata ) = NULL;
+ bump_image_map_t* entries_list = nullptr;
switch( bump_code )
{
case BE_BRIGHTNESS:
entries_list = &mBrightnessEntries;
- callback_func = LLBumpImageList::onSourceBrightnessLoaded;
break;
case BE_DARKNESS:
entries_list = &mDarknessEntries;
- callback_func = LLBumpImageList::onSourceDarknessLoaded;
break;
default:
llassert(0);
- return NULL;
+ return nullptr;
}
bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
@@ -789,51 +781,18 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
{
bump = iter->second;
}
- else
- {
- (*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( true );
- bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
- }
-
- if (!src_image->hasCallbacks())
- { //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again
- if (src_image->getWidth() != bump->getWidth() ||
- src_image->getHeight() != bump->getHeight())// ||
- //(LLPipeline::sRenderDeferred && bump->getComponents() != 4))
- {
- src_image->setBoostLevel(LLGLTexture::BOOST_BUMP) ;
- src_image->setLoadedCallback( callback_func, 0, true, false, new LLUUID(src_image->getID()), NULL );
- src_image->forceToSaveRawImage(0) ;
- }
- }
-
- return bump;
-}
-
-// static
-void LLBumpImageList::onSourceBrightnessLoaded( bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata )
-{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
- LLUUID* source_asset_id = (LLUUID*)userdata;
- LLBumpImageList::onSourceLoaded( success, src_vi, src, *source_asset_id, BE_BRIGHTNESS );
- if( final )
+ if (bump == nullptr ||
+ src_image->getWidth() != bump->getWidth() ||
+ src_image->getHeight() != bump->getHeight())
{
- delete source_asset_id;
+ onSourceUpdated(src_image, (EBumpEffect) bump_code);
}
-}
-// static
-void LLBumpImageList::onSourceDarknessLoaded( bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata )
-{
- LLUUID* source_asset_id = (LLUUID*)userdata;
- LLBumpImageList::onSourceLoaded( success, src_vi, src, *source_asset_id, BE_DARKNESS );
- if( final )
- {
- delete source_asset_id;
- }
+ return (*entries_list)[src_image->getID()];
}
+
void LLBumpImageList::onSourceStandardLoaded( bool success, LLViewerFetchedTexture* src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata)
{
if (success && LLPipeline::sRenderDeferred)
@@ -909,289 +868,108 @@ void LLBumpImageList::generateNormalMapFromAlpha(LLImageRaw* src, LLImageRaw* nr
}
// static
-void LLBumpImageList::onSourceLoaded( bool success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump_code )
+void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_code)
{
- LL_PROFILE_ZONE_SCOPED;
-
- if( success )
- {
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
-
- LLImageDataSharedLock lock(src);
-
- bump_image_map_t& entries_list(bump_code == BE_BRIGHTNESS ? gBumpImageList.mBrightnessEntries : gBumpImageList.mDarknessEntries );
- bump_image_map_t::iterator iter = entries_list.find(source_asset_id);
-
- {
- if (iter == entries_list.end() ||
- iter->second.isNull() ||
- iter->second->getWidth() != src->getWidth() ||
- iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
- { //make sure an entry exists for this image
- entries_list[src_vi->getID()] = LLViewerTextureManager::getLocalTexture(true);
- iter = entries_list.find(src_vi->getID());
- }
- }
-
- if (iter->second->getWidth() != src->getWidth() ||
- iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
- {
- LLPointer<LLImageRaw> dst_image = new LLImageRaw(src->getWidth(), src->getHeight(), 1);
- U8* dst_data = dst_image->getData();
- S32 dst_data_size = dst_image->getDataSize();
-
- const U8* src_data = src->getData();
- S32 src_data_size = src->getDataSize();
-
- S32 src_components = src->getComponents();
-
- // Convert to luminance and then scale and bias that to get ready for
- // embossed bump mapping. (0-255 maps to 127-255)
-
- // Convert to fixed point so we don't have to worry about precision/clamping.
- const S32 FIXED_PT = 8;
- const S32 R_WEIGHT = S32(0.2995f * (1<<FIXED_PT));
- const S32 G_WEIGHT = S32(0.5875f * (1<<FIXED_PT));
- const S32 B_WEIGHT = S32(0.1145f * (1<<FIXED_PT));
-
- S32 minimum = 255;
- S32 maximum = 0;
-
- switch( src_components )
- {
- case 1:
- case 2:
- {
- if( src_data_size == dst_data_size * src_components )
- {
- for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
- {
- dst_data[i] = src_data[j];
- if( dst_data[i] < minimum )
- {
- minimum = dst_data[i];
- }
- if( dst_data[i] > maximum )
- {
- maximum = dst_data[i];
- }
- }
- }
- else
- {
- llassert(0);
- dst_image->clear();
- }
- }
- break;
- case 3:
- case 4:
- {
- if( src_data_size == dst_data_size * src_components )
- {
- for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
- {
- // RGB to luminance
- dst_data[i] = (R_WEIGHT * src_data[j] + G_WEIGHT * src_data[j+1] + B_WEIGHT * src_data[j+2]) >> FIXED_PT;
- //llassert( dst_data[i] <= 255 );true because it's 8bit
- if( dst_data[i] < minimum )
- {
- minimum = dst_data[i];
- }
- if( dst_data[i] > maximum )
- {
- maximum = dst_data[i];
- }
- }
- }
- else
- {
- llassert(0);
- dst_image->clear();
- }
- }
- break;
- default:
- llassert(0);
- dst_image->clear();
- break;
- }
-
- if( maximum > minimum )
- {
- U8 bias_and_scale_lut[256];
- F32 twice_one_over_range = 2.f / (maximum - minimum);
- S32 i;
-
- const F32 ARTIFICIAL_SCALE = 2.f; // Advantage: exaggerates the effect in midrange. Disadvantage: clamps at the extremes.
- if (BE_DARKNESS == bump_code)
- {
- for( i = minimum; i <= maximum; i++ )
- {
- F32 minus_one_to_one = F32(maximum - i) * twice_one_over_range - 1.f;
- bias_and_scale_lut[i] = llclampb(ll_round(127 * minus_one_to_one * ARTIFICIAL_SCALE + 128));
- }
- }
- else
- {
- for( i = minimum; i <= maximum; i++ )
- {
- F32 minus_one_to_one = F32(i - minimum) * twice_one_over_range - 1.f;
- bias_and_scale_lut[i] = llclampb(ll_round(127 * minus_one_to_one * ARTIFICIAL_SCALE + 128));
- }
- }
-
- for( i = 0; i < dst_data_size; i++ )
- {
- dst_data[i] = bias_and_scale_lut[dst_data[i]];
- }
- }
-
- //---------------------------------------------------
- // immediately assign bump to a smart pointer in case some local smart pointer
- // accidentally releases it.
- LLPointer<LLViewerTexture> bump = iter->second;
-
- if (!LLPipeline::sRenderDeferred)
- {
- bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
-
-#if LL_BUMPLIST_MULTITHREADED
- auto tex_queue = LLImageGLThread::sEnabledTextures ? sTexUpdateQueue.lock() : nullptr;
-
- if (tex_queue)
- { //dispatch creation to background thread
- LLImageRaw* dst_ptr = dst_image;
- LLViewerTexture* bump_ptr = bump;
- dst_ptr->ref();
- bump_ptr->ref();
- tex_queue->post(
- [=]()
- {
- LL_PROFILE_ZONE_NAMED("bil - create texture");
- bump_ptr->createGLTexture(0, dst_ptr);
- bump_ptr->unref();
- dst_ptr->unref();
- });
-
- }
- else
-#endif
- {
- bump->createGLTexture(0, dst_image);
- }
- }
- else
- { //convert to normal map
- LL_PROFILE_ZONE_NAMED("bil - create normal map");
- LLImageGL* img = bump->getGLTexture();
- LLImageRaw* dst_ptr = dst_image.get();
- LLGLTexture* bump_ptr = bump.get();
-
- dst_ptr->ref();
- img->ref();
- bump_ptr->ref();
- auto create_func = [=]()
- {
- img->setUseMipMaps(true);
- // upload dst_image to GPU (greyscale in red channel)
- img->setExplicitFormat(GL_RED, GL_RED);
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
- bump_ptr->createGLTexture(0, dst_ptr);
- dst_ptr->unref();
- };
+ const LLUUID& src_id = src->getID();
- auto generate_func = [=]()
- {
- // Allocate an empty RGBA texture at "tex_name" the same size as bump
- // Note: bump will still point at GPU copy of dst_image
- bump_ptr->setExplicitFormat(GL_RGBA, GL_RGBA);
- LLGLuint tex_name;
- img->createGLTexture(0, nullptr, false, 0, true, &tex_name);
+ bump_image_map_t& entries_list(bump_code == BE_BRIGHTNESS ? gBumpImageList.mBrightnessEntries : gBumpImageList.mDarknessEntries);
+ bump_image_map_t::iterator iter = entries_list.find(src_id);
- // point render target at empty buffer
- sRenderTarget.setColorAttachment(img, tex_name);
+ if (iter == entries_list.end())
+ { //make sure an entry exists for this image
+ entries_list[src_id] = LLViewerTextureManager::getLocalTexture(true);
+ iter = entries_list.find(src_id);
+ }
- // generate normal map in empty texture
- {
- sRenderTarget.bindTarget();
+ //---------------------------------------------------
+ // immediately assign bump to a smart pointer in case some local smart pointer
+ // accidentally releases it.
+ LLPointer<LLViewerTexture> bump = iter->second;
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable cull(GL_CULL_FACE);
- LLGLDisable blend(GL_BLEND);
- gGL.setColorMask(true, true);
+ if (bump->getWidth() != src->getWidth() ||
+ bump->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
+ {
+ //convert to normal map
+ LL_PROFILE_ZONE_NAMED("bil - create normal map");
- gNormalMapGenProgram.bind();
+ bump->setExplicitFormat(GL_RGBA, GL_RGBA);
- static LLStaticHashedString sNormScale("norm_scale");
- static LLStaticHashedString sStepX("stepX");
- static LLStaticHashedString sStepY("stepY");
+ LLImageGL* src_img = src->getGLTexture();
+ LLImageGL* dst_img = bump->getGLTexture();
+ dst_img->setSize(src->getWidth(), src->getHeight(), 4, 0);
+ dst_img->setUseMipMaps(true);
+ dst_img->setDiscardLevel(0);
+ dst_img->createGLTexture();
- gNormalMapGenProgram.uniform1f(sNormScale, gSavedSettings.getF32("RenderNormalMapScale"));
- gNormalMapGenProgram.uniform1f(sStepX, 1.f / bump_ptr->getWidth());
- gNormalMapGenProgram.uniform1f(sStepY, 1.f / bump_ptr->getHeight());
+ gGL.getTexUnit(0)->bind(bump);
- gGL.getTexUnit(0)->bind(bump_ptr);
+ LLImageGL::setManualImage(GL_TEXTURE_2D, 0, dst_img->getPrimaryFormat(), dst_img->getWidth(), dst_img->getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, nullptr, false);
- gGL.begin(LLRender::TRIANGLE_STRIP);
- gGL.texCoord2f(0, 0);
- gGL.vertex2f(0, 0);
+ LLGLuint tex_name = dst_img->getTexName();
+ // point render target at empty buffer
+ sRenderTarget.setColorAttachment(bump->getGLTexture(), tex_name);
- gGL.texCoord2f(0, 1);
- gGL.vertex2f(0, 1);
+ // generate normal map in empty texture
+ {
+ sRenderTarget.bindTarget();
- gGL.texCoord2f(1, 0);
- gGL.vertex2f(1, 0);
+ LLGLDepthTest depth(GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+ gGL.setColorMask(true, true);
- gGL.texCoord2f(1, 1);
- gGL.vertex2f(1, 1);
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ gNormalMapGenProgram.bind();
- gGL.end();
+ static LLStaticHashedString sNormScale("norm_scale");
+ static LLStaticHashedString sStepX("stepX");
+ static LLStaticHashedString sStepY("stepY");
+ static LLStaticHashedString sBumpCode("bump_code");
- gGL.flush();
+ gNormalMapGenProgram.uniform1f(sNormScale, gSavedSettings.getF32("RenderNormalMapScale"));
+ gNormalMapGenProgram.uniform1f(sStepX, 1.f / bump->getWidth());
+ gNormalMapGenProgram.uniform1f(sStepY, 1.f / bump->getHeight());
+ gNormalMapGenProgram.uniform1i(sBumpCode, bump_code);
- gNormalMapGenProgram.unbind();
+ gGL.getTexUnit(0)->bind(src);
- sRenderTarget.flush();
- sRenderTarget.releaseColorAttachment();
- }
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(0, 0);
+ gGL.vertex2f(0, 0);
- // point bump at normal map and free gpu copy of dst_image
- img->syncTexName(tex_name);
+ gGL.texCoord2f(0, 1);
+ gGL.vertex2f(0, 1);
- // generate mipmap
- gGL.getTexUnit(0)->bind(img);
- glGenerateMipmap(GL_TEXTURE_2D);
- gGL.getTexUnit(0)->disable();
+ gGL.texCoord2f(1, 0);
+ gGL.vertex2f(1, 0);
- bump_ptr->unref();
- img->unref();
- };
+ gGL.texCoord2f(1, 1);
+ gGL.vertex2f(1, 1);
-#if LL_BUMPLIST_MULTITHREADED
- auto main_queue = LLImageGLThread::sEnabledTextures ? sMainQueue.lock() : nullptr;
+ gGL.end();
- if (main_queue)
- { //dispatch texture upload to background thread, issue GPU commands to generate normal map on main thread
- main_queue->postTo(
- sTexUpdateQueue,
- create_func,
- generate_func);
- }
- else
-#endif
- { // immediate upload texture and generate normal map
- create_func();
- generate_func();
- }
+ gGL.flush();
+ sRenderTarget.flush();
+ sRenderTarget.releaseColorAttachment();
+ if (shader)
+ {
+ shader->bind();
}
-
- iter->second = bump; // derefs (and deletes) old image
- //---------------------------------------------------
}
+
+ // generate mipmap
+ gGL.getTexUnit(0)->bind(bump);
+ glGenerateMipmap(GL_TEXTURE_2D);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
+
+ iter->second = bump; // derefs (and deletes) old image
+ //---------------------------------------------------
+
}
void LLDrawPoolBump::pushBumpBatches(U32 type)
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index 65cb9af015..15976884ca 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -140,14 +140,13 @@ public:
LLViewerTexture* getBrightnessDarknessImage(LLViewerFetchedTexture* src_image, U8 bump_code);
void addTextureStats(U8 bump, const LLUUID& base_image_id, F32 virtual_size);
- static void onSourceBrightnessLoaded( bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata );
- static void onSourceDarknessLoaded( bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata );
static void onSourceStandardLoaded( bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata );
static void generateNormalMapFromAlpha(LLImageRaw* src, LLImageRaw* nrm_image);
private:
- static void onSourceLoaded( bool success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump );
+ // should be called whenever resolution of src_vi changes compared to the current entry
+ static void onSourceUpdated( LLViewerTexture *src_vi, EBumpEffect bump );
private:
typedef std::unordered_map<LLUUID, LLPointer<LLViewerTexture> > bump_image_map_t;
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index afc5cc9d4e..5e676bc5b3 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -107,7 +107,8 @@ U32 LLDrawPoolTerrain::getVertexDataMask()
void LLDrawPoolTerrain::prerender()
{
- sPBRDetailMode = gSavedSettings.getS32("RenderTerrainPBRDetail");
+ static LLCachedControl<S32> render_terrain_pbr_detail(gSavedSettings, "RenderTerrainPBRDetail");
+ sPBRDetailMode = render_terrain_pbr_detail;
}
void LLDrawPoolTerrain::boostTerrainDetailTextures()
@@ -218,7 +219,9 @@ void LLDrawPoolTerrain::renderFullShader()
else
{
// Use materials
- sShader = &gDeferredPBRTerrainProgram;
+ U32 paint_type = use_local_materials ? gLocalTerrainMaterials.getPaintType() : compp->getPaintType();
+ paint_type = llclamp(paint_type, 0, TERRAIN_PAINT_TYPE_COUNT);
+ sShader = &gDeferredPBRTerrainProgram[paint_type];
sShader->bind();
renderFullShaderPBR(use_local_materials);
}
@@ -325,7 +328,7 @@ void LLDrawPoolTerrain::renderFullShaderTextures()
}
// *TODO: Investigate use of bindFast for PBR terrain textures
-void LLDrawPoolTerrain::renderFullShaderPBR(bool local_materials)
+void LLDrawPoolTerrain::renderFullShaderPBR(bool use_local_materials)
{
// Hack! Get the region that this draw pool is rendering from!
LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
@@ -338,7 +341,7 @@ void LLDrawPoolTerrain::renderFullShaderPBR(bool local_materials)
llassert(shader_material_count == terrain_material_count);
#endif
- if (local_materials)
+ if (use_local_materials)
{
// Override region terrain with the global local override terrain
fetched_materials = &gLocalTerrainMaterials.mDetailRenderMaterials;
@@ -350,6 +353,9 @@ void LLDrawPoolTerrain::renderFullShaderPBR(bool local_materials)
if (!materials[i]) { materials[i] = &LLGLTFMaterial::sDefault; }
}
+ U32 paint_type = use_local_materials ? gLocalTerrainMaterials.getPaintType() : compp->getPaintType();
+ paint_type = llclamp(paint_type, 0, TERRAIN_PAINT_TYPE_COUNT);
+
S32 detail_basecolor[terrain_material_count];
S32 detail_normal[terrain_material_count];
S32 detail_metalrough[terrain_material_count];
@@ -480,11 +486,31 @@ void LLDrawPoolTerrain::renderFullShaderPBR(bool local_materials)
LLSettingsWater::ptr_t pwater = LLEnvironment::instance().getCurrentWater();
//
- // Alpha Ramp
+ // Alpha Ramp or paint map
//
- S32 alpha_ramp = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
- gGL.getTexUnit(alpha_ramp)->bind(m2DAlphaRampImagep);
- gGL.getTexUnit(alpha_ramp)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ S32 alpha_ramp = -1;
+ S32 paint_map = -1;
+ if (paint_type == TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE)
+ {
+ alpha_ramp = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
+ gGL.getTexUnit(alpha_ramp)->bind(m2DAlphaRampImagep);
+ gGL.getTexUnit(alpha_ramp)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ }
+ else if (paint_type == TERRAIN_PAINT_TYPE_PBR_PAINTMAP)
+ {
+ paint_map = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_PAINTMAP);
+ LLViewerTexture* tex_paint_map = use_local_materials ? gLocalTerrainMaterials.getPaintMap() : compp->getPaintMap();
+ // If no paintmap is available, fall back to rendering just material slot 1 (by binding the appropriate image)
+ if (!tex_paint_map) { tex_paint_map = LLViewerTexture::sBlackImagep.get(); }
+ // This is a paint map for four materials, but we save a channel by
+ // storing the paintmap as the "difference" between slot 1 and the
+ // other 3 slots.
+ llassert(tex_paint_map->getComponents() == 3);
+ gGL.getTexUnit(paint_map)->bind(tex_paint_map);
+ gGL.getTexUnit(paint_map)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+
+ shader->uniform1f(LLShaderMgr::REGION_SCALE, regionp->getWidth());
+ }
//
// GLTF uniforms
@@ -533,11 +559,22 @@ void LLDrawPoolTerrain::renderFullShaderPBR(bool local_materials)
// Disable multitexture
- sShader->disableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
+ if (paint_type == TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE)
+ {
+ sShader->disableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
- gGL.getTexUnit(alpha_ramp)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(alpha_ramp)->disable();
- gGL.getTexUnit(alpha_ramp)->activate();
+ gGL.getTexUnit(alpha_ramp)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(alpha_ramp)->disable();
+ gGL.getTexUnit(alpha_ramp)->activate();
+ }
+ else if (paint_type == TERRAIN_PAINT_TYPE_PBR_PAINTMAP)
+ {
+ sShader->disableTexture(LLViewerShaderMgr::TERRAIN_PAINTMAP);
+
+ gGL.getTexUnit(paint_map)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(paint_map)->disable();
+ gGL.getTexUnit(paint_map)->activate();
+ }
for (U32 i = 0; i < terrain_material_count; ++i)
{
diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h
index a8097fb58b..5380463d01 100644
--- a/indra/newview/lldrawpoolterrain.h
+++ b/indra/newview/lldrawpoolterrain.h
@@ -38,7 +38,6 @@ public:
VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_NORMAL |
LLVertexBuffer::MAP_TANGENT | // Only PBR terrain uses this currently
- LLVertexBuffer::MAP_TEXCOORD0 |
LLVertexBuffer::MAP_TEXCOORD1
};
@@ -80,7 +79,7 @@ protected:
void renderFull4TU();
void renderFullShader();
void renderFullShaderTextures();
- void renderFullShaderPBR(bool local_materials = false);
+ void renderFullShaderPBR(bool use_local_materials = false);
void drawLoop();
private:
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 71b82b77eb..53d6e528b6 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -215,7 +215,7 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
LLViewerTexture* tex_a = mWaterNormp[0];
LLViewerTexture* tex_b = mWaterNormp[1];
- F32 blend_factor = pwater->getBlendFactor();
+ F32 blend_factor = (F32)pwater->getBlendFactor();
gGL.getTexUnit(bumpTex)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(bumpTex2)->unbind(LLTexUnit::TT_TEXTURE);
@@ -241,8 +241,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
F32 screenRes[] = { 1.f / gGLViewport[2], 1.f / gGLViewport[3] };
- S32 diffTex = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP);
-
shader->uniform2fv(LLShaderMgr::DEFERRED_SCREEN_RES, 1, screenRes);
shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
@@ -256,7 +254,7 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
if (mShaderLevel == 1)
{
- fog_color.mV[VALPHA] = log(fog_density) / log(2);
+ fog_color.mV[VALPHA] = (F32)(log(fog_density) / log(2));
}
F32 water_height = environment.getWaterHeight();
@@ -316,8 +314,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
water = static_cast<LLVOWater*>(face->getViewerObject());
if (!water) continue;
- gGL.getTexUnit(diffTex)->bind(face->getTexture());
-
if ((bool)edge == (bool)water->getIsEdgePatch())
{
face->renderIndexed();
@@ -334,7 +330,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
shader->disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
shader->disableTexture(LLShaderMgr::WATER_SCREENTEX);
shader->disableTexture(LLShaderMgr::BUMP_MAP);
- shader->disableTexture(LLShaderMgr::DIFFUSE_MAP);
shader->disableTexture(LLShaderMgr::WATER_REFTEX);
// clean up
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 047e9a8112..305215f541 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -242,7 +242,7 @@ void LLDrawPoolWLSky::renderStarsDeferred(const LLVector3& camPosLocal) const
LLViewerTexture* tex_a = gSky.mVOSkyp->getBloomTex();
LLViewerTexture* tex_b = gSky.mVOSkyp->getBloomTexNext();
- F32 blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor();
+ F32 blend_factor = (F32)LLEnvironment::instance().getCurrentSky()->getBlendFactor();
if (tex_a && (!tex_b || (tex_a == tex_b)))
{
@@ -309,8 +309,8 @@ void LLDrawPoolWLSky::renderSkyCloudsDeferred(const LLVector3& camPosLocal, F32
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
- F32 cloud_variance = psky ? psky->getCloudVariance() : 0.0f;
- F32 blend_factor = psky ? psky->getBlendFactor() : 0.0f;
+ F32 cloud_variance = psky ? (F32)psky->getCloudVariance() : 0.0f;
+ F32 blend_factor = psky ? (F32)psky->getBlendFactor() : 0.0f;
if (psky->getCloudScrollRate().isExactlyZero())
{
@@ -364,7 +364,7 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
LLFace * face = gSky.mVOSkyp->mFace[LLVOSky::FACE_SUN];
- F32 blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor();
+ F32 blend_factor = (F32)LLEnvironment::instance().getCurrentSky()->getBlendFactor();
bool can_use_vertex_shaders = gPipeline.shadersLoaded();
bool can_use_windlight_shaders = gPipeline.canUseWindLightShaders();
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 79011b2f97..6e31760e9e 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -207,7 +207,7 @@ namespace
mInitial = (*initial.first).second;
mFinal = (*initial.second).second;
- mBlendSpan = getSpanTime(initial);
+ mBlendSpan = (LLSettingsBase::TrackPosition)getSpanTime(initial);
initializeTarget(now);
setOnFinished([this](const LLSettingsBlender::ptr_t &){ onFinishedSpan(); });
@@ -235,7 +235,7 @@ namespace
LLSettingsBase::BlendFactor blendf = calculateBlend(targetpos, targetspan);
pendsetting->blend((*bounds.second).second, blendf);
- reset(pstartsetting, pendsetting, LLEnvironment::TRANSITION_ALTITUDE);
+ reset(pstartsetting, pendsetting, (LLSettingsBase::TrackPosition)LLEnvironment::TRANSITION_ALTITUDE);
}
protected:
@@ -302,7 +302,7 @@ namespace
LLSettingsDay::TrackBound_t next = getBoundingEntries(adjusted_now);
LLSettingsBase::Seconds nextspan = getSpanTime(next);
- reset((*next.first).second, (*next.second).second, nextspan);
+ reset((*next.first).second, (*next.second).second, (LLSettingsBase::TrackPosition)nextspan);
// Recalculate (reinitialize) position. Because:
// - 'delta' from applyTimeDelta accumulates errors (probably should be fixed/changed to absolute time)
@@ -693,7 +693,7 @@ namespace
// Ideally we need to check for texture in injection, but
// in this case user is setting value explicitly, potentially
// with different transitions, don't ignore it
- F64 result = lerp(value, injection->mValue.asReal(), mix);
+ F64 result = lerp((F32)value, (F32)injection->mValue.asReal(), (F32)mix);
injection->mLastValue = LLSD::Real(result);
this->mSettings[injection->mKeyName] = injection->mLastValue;
}
@@ -896,7 +896,7 @@ void LLEnvironment::initSingleton()
gSavedSettings.getControl("RenderSkyAutoAdjustProbeAmbiance")->getSignal()->connect(
[](LLControlVariable*, const LLSD& new_val, const LLSD& old_val)
{
- LLSettingsSky::sAutoAdjustProbeAmbiance = new_val.asReal();
+ LLSettingsSky::sAutoAdjustProbeAmbiance = (F32)new_val.asReal();
}
);
LLSettingsSky::sAutoAdjustProbeAmbiance = gSavedSettings.getF32("RenderSkyAutoAdjustProbeAmbiance");
@@ -965,11 +965,11 @@ LLSettingsWater::ptr_t LLEnvironment::getCurrentWater() const
void LayerConfigToDensityLayer(const LLSD& layerConfig, DensityLayer& layerOut)
{
- layerOut.constant_term = layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM].asReal();
- layerOut.exp_scale = layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal();
- layerOut.exp_term = layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
- layerOut.linear_term = layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal();
- layerOut.width = layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal();
+ layerOut.constant_term = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM].asReal();
+ layerOut.exp_scale = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal();
+ layerOut.exp_term = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
+ layerOut.linear_term = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal();
+ layerOut.width = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal();
}
void LLEnvironment::getAtmosphericModelSettings(AtmosphericModelSettings& settingsOut, const LLSettingsSky::ptr_t &psky)
@@ -1756,7 +1756,7 @@ void LLEnvironment::updateGLVariablesForSettings(LLShaderUniforms* uniforms, con
//_WARNS("RIDER") << "pushing '" << (*it).first << "' as " << value << LL_ENDL;
break;
case LLSD::TypeReal:
- shader->uniform1f(it.second.getShaderKey(), value.asReal());
+ shader->uniform1f(it.second.getShaderKey(), (F32)value.asReal());
//_WARNS("RIDER") << "pushing '" << (*it).first << "' as " << value << LL_ENDL;
break;
@@ -1926,8 +1926,8 @@ void LLEnvironment::adjustRegionOffset(F32 adjust)
if (mEnvironments[ENV_REGION])
{
- F32 day_length = mEnvironments[ENV_REGION]->getDayLength();
- F32 day_offset = mEnvironments[ENV_REGION]->getDayOffset();
+ F32 day_length = (F32)mEnvironments[ENV_REGION]->getDayLength();
+ F32 day_offset = (F32)mEnvironments[ENV_REGION]->getDayOffset();
F32 day_adjustment = adjust * day_length;
@@ -2123,8 +2123,11 @@ void LLEnvironment::coroRequestEnvironment(S32 parcel_id, LLEnvironment::environ
LLSD environment = result[KEY_ENVIRONMENT];
if (environment.isDefined() && apply)
{
- EnvironmentInfo::ptr_t envinfo = LLEnvironment::EnvironmentInfo::extract(environment);
- apply(parcel_id, envinfo);
+ LLAppViewer::instance()->postToMainCoro([=]()
+ {
+ EnvironmentInfo::ptr_t envinfo = LLEnvironment::EnvironmentInfo::extract(environment);
+ apply(parcel_id, envinfo);
+ });
}
}
@@ -2343,7 +2346,7 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extract(LL
{
for (int idx = 0; idx < 3; idx++)
{
- pinfo->mAltitudes[idx+1] = environment[KEY_TRACKALTS][idx].asReal();
+ pinfo->mAltitudes[idx+1] = (F32)environment[KEY_TRACKALTS][idx].asReal();
}
pinfo->mAltitudes[0] = 0;
}
@@ -2567,7 +2570,7 @@ void LLEnvironment::handleEnvironmentPush(LLSD &message)
std::string action = message[KEY_ACTION].asString();
LLUUID experience_id = message[KEY_EXPERIENCEID].asUUID();
LLSD action_data = message[KEY_ACTIONDATA];
- F32 transition_time = action_data[KEY_TRANSITIONTIME].asReal();
+ F32 transition_time = (F32)action_data[KEY_TRANSITIONTIME].asReal();
//TODO: Check here that the viewer thinks the experience is still valid.
@@ -2599,7 +2602,7 @@ void LLEnvironment::handleEnvironmentPushFull(LLUUID experience_id, LLSD &messag
{
LLUUID asset_id(message[KEY_ASSETID].asUUID());
- setExperienceEnvironment(experience_id, asset_id, LLSettingsBase::Seconds(transition));
+ setExperienceEnvironment(experience_id, asset_id, (F32)LLSettingsBase::Seconds(transition));
}
void LLEnvironment::handleEnvironmentPushPartial(LLUUID experience_id, LLSD &message, F32 transition)
@@ -2609,7 +2612,7 @@ void LLEnvironment::handleEnvironmentPushPartial(LLUUID experience_id, LLSD &mes
if (settings.isUndefined())
return;
- setExperienceEnvironment(experience_id, settings, LLSettingsBase::Seconds(transition));
+ setExperienceEnvironment(experience_id, settings, (F32)LLSettingsBase::Seconds(transition));
}
void LLEnvironment::clearExperienceEnvironment(LLUUID experience_id, LLSettingsBase::Seconds transition_time)
@@ -2966,7 +2969,7 @@ void LLEnvironment::DayTransition::animate()
// pause probe updates and reset reflection maps on sky change
- gPipeline.mReflectionMapManager.pause(mTransitionTime);
+ gPipeline.mReflectionMapManager.pause((F32)mTransitionTime);
gPipeline.mReflectionMapManager.reset();
mSky = mStartSky->buildClone();
@@ -3284,7 +3287,7 @@ void LLTrackBlenderLoopingManual::switchTrack(S32 trackno, const LLSettingsBase:
{
mTrackNo = trackno;
- LLSettingsBase::TrackPosition useposition = (position < 0.0) ? mPosition : position;
+ LLSettingsBase::TrackPosition useposition = (position < 0.0) ? (LLSettingsBase::TrackPosition)mPosition : position;
setPosition(useposition);
}
@@ -3295,7 +3298,7 @@ LLSettingsDay::TrackBound_t LLTrackBlenderLoopingManual::getBoundingEntries(F64
mEndMarker = wtrack.end();
- LLSettingsDay::TrackBound_t bounds = get_bounding_entries(wtrack, position);
+ LLSettingsDay::TrackBound_t bounds = get_bounding_entries(wtrack, (LLSettingsBase::TrackPosition)position);
return bounds;
}
@@ -3569,7 +3572,7 @@ namespace
mInjectedSky->setSource(target_sky);
// clear reflection probes and pause updates during sky change
- gPipeline.mReflectionMapManager.pause(transition);
+ gPipeline.mReflectionMapManager.pause((F32)transition);
gPipeline.mReflectionMapManager.reset();
mBlenderSky = std::make_shared<LLSettingsBlenderTimeDelta>(target_sky, start_sky, psky, transition);
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 4c105176b6..748e10160c 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -41,7 +41,7 @@ public:
: LLTextSegment(start, end),
mEditor(editor),
mStyle(style),
- mExpanderLabel(more_text)
+ mExpanderLabel(utf8str_to_wstring(more_text))
{}
/*virtual*/ bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const
@@ -54,7 +54,7 @@ public:
}
else
{
- width = mEditor.getDocumentView()->getRect().getWidth() - mEditor.getHPad();
+ width = (F32)(mEditor.getDocumentView()->getRect().getWidth() - mEditor.getHPad());
height = mStyle->getFont()->getLineHeight();
}
return true;
@@ -80,13 +80,13 @@ public:
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect)
{
F32 right_x;
- mStyle->getFont()->renderUTF8(mExpanderLabel, start,
+ mStyle->getFont()->render(mExpanderLabel, start,
draw_rect.mRight, draw_rect.mTop,
mStyle->getColor(),
LLFontGL::RIGHT, LLFontGL::TOP,
0,
mStyle->getShadowType(),
- end - start, draw_rect.getWidth(),
+ end - start, (S32)draw_rect.getWidth(),
&right_x,
mEditor.getUseEllipses(), mEditor.getUseColor());
return right_x;
@@ -103,7 +103,7 @@ public:
private:
LLTextBase& mEditor;
LLStyleSP mStyle;
- std::string mExpanderLabel;
+ LLWString mExpanderLabel;
};
LLExpandableTextBox::LLTextBoxEx::Params::Params()
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 0e8e64af69..4dec4d5641 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -169,6 +169,8 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mImportanceToCamera = 0.f ;
mBoundingSphereRadius = 0.0f ;
+ mTexExtents[0].set(0, 0);
+ mTexExtents[1].set(1, 1);
mHasMedia = false ;
mIsMediaAllowed = true;
}
@@ -234,7 +236,7 @@ void LLFace::setPool(LLFacePool* pool)
void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
if (!new_pool)
{
@@ -315,7 +317,7 @@ void LLFace::setSpecularMap(LLViewerTexture* tex)
void LLFace::dirtyTexture()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
LLDrawable* drawablep = getDrawable();
@@ -355,8 +357,6 @@ void LLFace::switchTexture(U32 ch, LLViewerTexture* new_texture)
return;
}
- llassert(mTexture[ch].notNull());
-
if (ch == LLRender::DIFFUSE_MAP)
{
getViewerObject()->changeTEImage(mTEOffset, new_texture) ;
@@ -502,7 +502,7 @@ void LLFace::updateCenterAgent()
void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
if (mDrawablep == NULL || mDrawablep->getSpatialGroup() == NULL)
{
@@ -512,7 +512,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
mDrawablep->getSpatialGroup()->rebuildGeom();
mDrawablep->getSpatialGroup()->rebuildMesh();
- if(mVertexBuffer.isNull())
+ if (mVertexBuffer.isNull())
{
return;
}
@@ -565,8 +565,20 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
{
// cheaters sometimes prosper...
//
- mVertexBuffer->setBuffer();
- mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
+ LLVertexBuffer* vertex_buffer = mVertexBuffer.get();
+ // To display selection markers (white squares with the rounded cross at the center)
+ // on faces with GLTF textures we use a spectal vertex buffer with other transforms
+ if (const LLTextureEntry* te = getTextureEntry())
+ {
+ if (LLGLTFMaterial* gltf_mat = te->getGLTFRenderMaterial())
+ {
+ vertex_buffer = mVertexBufferGLTF.get();
+ vertex_buffer->unmapBuffer();
+ }
+ }
+ // Draw the selection marker using the correctly chosen vertex buffer
+ vertex_buffer->setBuffer();
+ vertex_buffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
}
gGL.popMatrix();
@@ -576,7 +588,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
void renderFace(LLDrawable* drawable, LLFace *face)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
LLVOVolume* vobj = drawable->getVOVolume();
if (vobj)
@@ -803,7 +815,7 @@ bool less_than_max_mag(const LLVector4a& vec)
bool LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
const LLMatrix4& mat_vert_in, bool global_volume)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
//get bounding box
if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))
@@ -1142,7 +1154,8 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
const LLMatrix3& mat_norm_in,
U16 index_offset,
bool force_rebuild,
- bool no_debug_assert)
+ bool no_debug_assert,
+ bool rebuild_for_gltf)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
llassert(verify());
@@ -1200,6 +1213,58 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
}
}
+ const LLTextureEntry* tep = mVObjp->getTE(face_index);
+ llassert(tep);
+ if (!tep)
+ return false;
+
+ LLGLTFMaterial* gltf_mat = tep->getGLTFRenderMaterial();
+ // To display selection markers (white squares with the rounded cross at the center)
+ // on faces with GLTF textures we use a special vertex buffer with other transforms
+ if (gltf_mat && !rebuild_for_gltf && tep->isSelected() && mVertexBuffer.notNull())
+ {
+ // Create a temporary vertex buffer to provide transforms for GLTF textures
+ if (mVertexBufferGLTF.isNull())
+ {
+ mVertexBufferGLTF = new LLVertexBuffer(mVertexBuffer->getTypeMask());
+ }
+
+ // Clone the existing vertex buffer into the temporary one
+ mVertexBuffer->clone(*mVertexBufferGLTF);
+
+ // Recursive call the same function with the argument rebuild_for_gltf set to true
+ // This call will make geometry in mVertexBuffer but in fact for mVertexBufferGLTF
+ mVertexBufferGLTF.swap(mVertexBufferGLTF, mVertexBuffer);
+ getGeometryVolume(volume, face_index, mat_vert_in, mat_norm_in, index_offset, force_rebuild, no_debug_assert, true);
+ mVertexBufferGLTF.swap(mVertexBufferGLTF, mVertexBuffer);
+ }
+ else if (!tep->isSelected() && mVertexBufferGLTF.notNull())
+ {
+ // Free the temporary vertex buffer when it is not needed anymore
+ mVertexBufferGLTF = nullptr;
+ }
+
+ LLGLTFMaterial::TextureInfo gltf_info_index = (LLGLTFMaterial::TextureInfo)0;
+ if (gltf_mat && rebuild_for_gltf)
+ {
+ switch (LLPipeline::sRenderHighlightTextureChannel)
+ {
+ case LLRender::BASECOLOR_MAP:
+ gltf_info_index = LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR;
+ break;
+ case LLRender::METALLIC_ROUGHNESS_MAP:
+ gltf_info_index = LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS;
+ break;
+ case LLRender::GLTF_NORMAL_MAP:
+ gltf_info_index = LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL;
+ break;
+ case LLRender::EMISSIVE_MAP:
+ gltf_info_index = LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE;
+ break;
+ default:; // just to make clang happy
+ }
+ }
+
LLStrider<LLVector3> vert;
LLStrider<LLVector2> tex_coords0;
LLStrider<LLVector2> tex_coords1;
@@ -1216,7 +1281,7 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
LLVector3 scale;
if (global_volume)
{
- scale.setVec(1,1,1);
+ scale.setVec(1, 1, 1);
}
else
{
@@ -1231,7 +1296,6 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
bool rebuild_tangent = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TANGENT);
bool rebuild_weights = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_WEIGHT4);
- const LLTextureEntry *tep = mVObjp->getTE(face_index);
const U8 bump_code = tep ? tep->getBumpmap() : 0;
bool is_static = mDrawablep->isStatic();
@@ -1321,7 +1385,6 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
LLMaterial* mat = tep->getMaterialParams().get();
- LLGLTFMaterial* gltf_mat = tep->getGLTFRenderMaterial();
F32 r = 0, os = 0, ot = 0, ms = 0, mt = 0, cos_ang = 0, sin_ang = 0;
@@ -1332,13 +1395,27 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
S32 xforms = XFORM_NONE;
// For GLTF, transforms will be applied later
- if (rebuild_tcoord && tep && !gltf_mat)
+ if (rebuild_tcoord && tep && (!gltf_mat || rebuild_for_gltf))
{
- r = tep->getRotation();
- os = tep->mOffsetS;
- ot = tep->mOffsetT;
- ms = tep->mScaleS;
- mt = tep->mScaleT;
+ if (gltf_mat && rebuild_for_gltf)
+ {
+ // Apply special transformations for mVertexBufferGLTF
+ // They are used only to display a face selection marker
+ // (white square with a rounded cross at the center)
+ const auto& tt = gltf_mat->mTextureTransform[gltf_info_index];
+ r = -tt.mRotation * 2;
+ ms = tt.mScale[VX];
+ mt = tt.mScale[VY];
+ os += tt.mOffset[VX] + (ms - 1) / 2;
+ ot -= tt.mOffset[VY] + (mt - 1) / 2;
+ }
+ else
+ {
+ r = tep->getRotation();
+ tep->getOffset(&os, &ot);
+ tep->getScale(&ms, &mt);
+ }
+
cos_ang = cos(r);
sin_ang = sin(r);
@@ -1479,12 +1556,9 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
break;
}
- F32 s_scale = 1.f;
- F32 t_scale = 1.f;
- if( tep )
- {
- tep->getScale( &s_scale, &t_scale );
- }
+ F32 s_scale = tep->getScaleS();
+ F32 t_scale = tep->getScaleT();
+
// Use the nudged south when coming from above sun angle, such
// that emboss mapping always shows up on the upward faces of cubes when
// it's noon (since a lot of builders build with the sun forced to noon).
@@ -1506,8 +1580,8 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
bool tex_anim = false;
- LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp;
- tex_mode = vobj->mTexAnimMode;
+ LLVOVolume* vobj = (LLVOVolume*)mVObjp.get();
+ tex_mode = vobj->mTexAnimMode;
if (vobj->mTextureAnimp)
{ //texture animation is in play, override specular and normal map tex coords with diffuse texcoords
@@ -2047,10 +2121,12 @@ void LLFace::resetVirtualSize()
F32 LLFace::getTextureVirtualSize()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
+
F32 radius;
F32 cos_angle_to_view_dir;
bool in_frustum = calcPixelArea(cos_angle_to_view_dir, radius);
+
if (mPixelArea < F_ALMOST_ZERO || !in_frustum)
{
setVirtualSize(0.f) ;
@@ -2271,7 +2347,7 @@ F32 LLFace::adjustPixelArea(F32 importance, F32 pixel_area)
{
if(importance < LEAST_IMPORTANCE_FOR_LARGE_IMAGE)//if the face is not important, do not load hi-res.
{
- pixel_area = LLViewerTexture::sMinLargeImageSize ;
+ pixel_area = (F32)LLViewerTexture::sMinLargeImageSize ;
}
}
}
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 917f3aa0b2..7cf256f731 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -161,7 +161,8 @@ public:
const LLMatrix3& mat_normal,
U16 index_offset,
bool force_rebuild = false,
- bool no_debug_assert = false);
+ bool no_debug_assert = false,
+ bool rebuild_for_gltf = false);
// For avatar
U16 getGeometryAvatar(
@@ -266,6 +267,7 @@ public:
private:
LLPointer<LLVertexBuffer> mVertexBuffer;
+ LLPointer<LLVertexBuffer> mVertexBufferGLTF;
U32 mState;
LLFacePool* mDrawPoolp;
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 67d55c53e4..8056983c7c 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -279,9 +279,9 @@ bool LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
// so we can create a new tooltip
LLToolTipMgr::instance().unblockToolTips();
mHoverTimer = mHoverID;
- mToolTipRect.set(mBarRect.mLeft + (hover_bar->mSelfStart / mTotalTimeDisplay) * mBarRect.getWidth(),
+ mToolTipRect.set((S32)(mBarRect.mLeft + (hover_bar->mSelfStart / mTotalTimeDisplay) * mBarRect.getWidth()),
row.mTop,
- mBarRect.mLeft + (hover_bar->mSelfEnd / mTotalTimeDisplay) * mBarRect.getWidth(),
+ (S32)(mBarRect.mLeft + (hover_bar->mSelfEnd / mTotalTimeDisplay) * mBarRect.getWidth()),
row.mBottom);
}
}
@@ -626,7 +626,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.vertex3fv(last_p.mV);
gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
- last_p.set((F32)i/(F32) base_times.size(), base_times[i]/max_time, 0.f);
+ last_p.set((F32)i/(F32) base_times.size(), (F32)(base_times[i]/max_time), 0.f);
gGL.vertex3fv(last_p.mV);
gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
gGL.end();
@@ -645,7 +645,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
gGL.vertex3fv(last_p.mV);
- last_p.set((F32) i / (F32) cur_times.size(), cur_times[i]/max_time, 0.f);
+ last_p.set((F32) i / (F32) cur_times.size(), (F32)(cur_times[i]/max_time), 0.f);
gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
gGL.vertex3fv(last_p.mV);
gGL.end();
@@ -715,7 +715,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.vertex3fv(last_p.mV);
gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
- last_p.set((F32)count/(F32)total_count, *iter/max_execution, 0.f);
+ last_p.set((F32)count/(F32)total_count, (F32)(*iter/max_execution), 0.f);
gGL.vertex3fv(last_p.mV);
gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
gGL.end();
@@ -735,7 +735,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
gGL.vertex3fv(last_p.mV);
- last_p.set((F32)count/(F32)total_count, *iter/max_execution, 0.f);
+ last_p.set((F32)count/(F32)total_count, (F32)(*iter/max_execution), 0.f);
gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
gGL.vertex3fv(last_p.mV);
gGL.end();
@@ -787,8 +787,8 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
{
LLSD::Integer samples = iter->second["Calls"].asInteger();
- time_stats[label].push(time);
- sample_stats[label].push(samples);
+ time_stats[label].push((F32)time);
+ sample_stats[label].push((F32)samples);
}
}
total_frames++;
@@ -1112,7 +1112,7 @@ void LLFastTimerView::drawLineGraph()
break;
}
gGL.vertex2f(x,y);
- gGL.vertex2f(x,mGraphRect.mBottom);
+ gGL.vertex2f(x,(GLfloat)mGraphRect.mBottom);
}
gGL.end();
@@ -1432,7 +1432,7 @@ void LLFastTimerView::updateTotalTime()
break;
}
- mTotalTimeDisplay = LLUnits::Milliseconds::fromValue(llceil(mTotalTimeDisplay.valueInUnits<LLUnits::Milliseconds>() / 20.f) * 20.f);
+ mTotalTimeDisplay = LLUnits::Milliseconds::fromValue(llceil((F32)mTotalTimeDisplay.valueInUnits<LLUnits::Milliseconds>() / 20.f) * 20.f);
}
void LLFastTimerView::drawBars()
@@ -1491,7 +1491,7 @@ void LLFastTimerView::drawBars()
LLRect frame_bar_rect;
frame_bar_rect.setLeftTopAndSize(mBarRect.mLeft,
bars_top,
- ll_round((mAverageTimerRow.mBars[0].mTotalTime / mTotalTimeDisplay) * mBarRect.getWidth()),
+ (S32)ll_round((mAverageTimerRow.mBars[0].mTotalTime / mTotalTimeDisplay) * mBarRect.getWidth()),
bar_height);
mAverageTimerRow.mTop = frame_bar_rect.mTop;
mAverageTimerRow.mBottom = frame_bar_rect.mBottom;
@@ -1505,7 +1505,7 @@ void LLFastTimerView::drawBars()
row.mTop = frame_bar_rect.mTop;
row.mBottom = frame_bar_rect.mBottom;
frame_bar_rect.mRight = frame_bar_rect.mLeft
- + ll_round((row.mBars[0].mTotalTime / mTotalTimeDisplay) * mBarRect.getWidth());
+ + (S32)ll_round((row.mBars[0].mTotalTime / mTotalTimeDisplay) * mBarRect.getWidth());
drawBar(frame_bar_rect, row, image_width, image_height);
frame_bar_rect.translate(0, -(bar_height + vpad));
@@ -1633,8 +1633,8 @@ S32 LLFastTimerView::drawBar(LLRect bar_rect, TimerBarRow& row, S32 image_width,
}
LLRect children_rect;
- children_rect.mLeft = ll_round(timer_bar.mChildrenStart / mTotalTimeDisplay * (F32)mBarRect.getWidth()) + mBarRect.mLeft;
- children_rect.mRight = ll_round(timer_bar.mChildrenEnd / mTotalTimeDisplay * (F32)mBarRect.getWidth()) + mBarRect.mLeft;
+ children_rect.mLeft = (S32)ll_round(timer_bar.mChildrenStart / mTotalTimeDisplay * (F32)mBarRect.getWidth()) + mBarRect.mLeft;
+ children_rect.mRight = (S32)ll_round(timer_bar.mChildrenEnd / mTotalTimeDisplay * (F32)mBarRect.getWidth()) + mBarRect.mLeft;
if (bar_rect.getHeight() > MIN_BAR_HEIGHT)
{
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index 806d51a5fd..7d098b2676 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -94,7 +94,7 @@ void LLVolumeImplFlexible::updateClass()
{
LL_PROFILE_ZONE_SCOPED;
- U64 virtual_frame_num = LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME;
+ U64 virtual_frame_num = (U64)(LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME);
for (std::vector<LLVolumeImplFlexible*>::iterator iter = sInstanceList.begin();
iter != sInstanceList.end();
++iter)
@@ -362,7 +362,7 @@ void LLVolumeImplFlexible::doIdleUpdate()
update_period = llclamp(update_period, 1U, 32U);
// We control how fast flexies update, buy splitting updates among frames
- U64 virtual_frame_num = LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME;
+ U64 virtual_frame_num = (U64)(LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME);
if (visible)
{
diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp
index 66796276a9..ff30c83f51 100644
--- a/indra/newview/llfloater360capture.cpp
+++ b/indra/newview/llfloater360capture.cpp
@@ -488,7 +488,7 @@ void LLFloater360Capture::capture360Images()
// 'GPano:InitialViewHeadingDegrees' field.
// We need to convert from the angle getYaw() gives us into something
// the XMP data field wants (N=0, E=90, S=180, W= 270 etc.)
- mInitialHeadingDeg = (360 + 90 - (int)(camera->getYaw() * RAD_TO_DEG)) % 360;
+ mInitialHeadingDeg = (float)((360 + 90 - (int)(camera->getYaw() * RAD_TO_DEG)) % 360);
LL_INFOS("360Capture") << "Recording a heading of " << (int)(mInitialHeadingDeg)
<< " Image size: " << (S32)mSourceImageSize << LL_ENDL;
@@ -793,12 +793,9 @@ void LLFloater360Capture::freezeWorld(bool enable)
LLEnvironment::instance().pauseCloudScroll();
// freeze all avatars
- LLCharacter* avatarp;
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- avatarp = *iter;
- mAvatarPauseHandles.push_back(avatarp->requestPause());
+ mAvatarPauseHandles.push_back(character->requestPause());
}
// freeze everything else
diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatar.cpp
index 6a38d7549c..404316275d 100644
--- a/indra/newview/llfloateravatar.cpp
+++ b/indra/newview/llfloateravatar.cpp
@@ -25,11 +25,6 @@
* $/LicenseInfo$
*/
-/**
- * Floater that appears when buying an object, giving a preview
- * of its contents and their permissions.
- */
-
#include "llviewerprecompiledheaders.h"
#include "llfloateravatar.h"
diff --git a/indra/newview/llfloaterbanduration.cpp b/indra/newview/llfloaterbanduration.cpp
index c9141322e3..eb32e50901 100644
--- a/indra/newview/llfloaterbanduration.cpp
+++ b/indra/newview/llfloaterbanduration.cpp
@@ -82,7 +82,7 @@ void LLFloaterBanDuration::onClickBan()
LLSpinCtrl* hours_spin = getChild<LLSpinCtrl>("ban_hours");
if (hours_spin)
{
- time = LLDate::now().secondsSinceEpoch() + (hours_spin->getValue().asInteger() * 3600);
+ time = (S32)(LLDate::now().secondsSinceEpoch() + (hours_spin->getValue().asInteger() * 3600));
}
}
mSelectionCallback(mAvatar_ids, time);
diff --git a/indra/newview/llfloaterbulkupload.cpp b/indra/newview/llfloaterbulkupload.cpp
new file mode 100644
index 0000000000..b898cb28b6
--- /dev/null
+++ b/indra/newview/llfloaterbulkupload.cpp
@@ -0,0 +1,136 @@
+/**
+ * @file llfloaterbulkupload.cpp
+ * @author Andrey Kleshchev
+ * @brief LLFloaterBulkUpload class implementation
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterbulkupload.h"
+
+#include "lltextbox.h"
+#include "llviewercontrol.h"
+#include "llviewermenufile.h"
+
+constexpr S32 MAX_HEIGH = 211;
+
+LLFloaterBulkUpload::LLFloaterBulkUpload(const LLSD& key)
+: LLModalDialog(key, true)
+{
+ mUploadCost = key["upload_cost"].asInteger();
+ mUploadCount = key["upload_count"].asInteger();
+ mHas2kTextures = key["has_2k_textures"].asBoolean();
+ if (key["files"].isArray())
+ {
+ const LLSD& files = key["files"];
+ for (LLSD::array_const_iterator it = files.beginArray();
+ it != files.endArray();
+ ++it)
+ {
+ mFiles.push_back(it->asString());
+ }
+ }
+}
+
+LLFloaterBulkUpload::~LLFloaterBulkUpload()
+{
+}
+
+bool LLFloaterBulkUpload::postBuild()
+{
+ childSetAction("upload_btn", [this](void*) { onClickUpload(); }, this);
+ childSetAction("cancel_btn", [this](void*) { onClickCancel(); }, this);
+
+ mCountLabel = getChild<LLTextBox>("number_of_items", true);
+ mCostLabel = getChild<LLTextBox>("upload_cost", true);
+
+ mCheckboxPanel = getChild<LLPanel>("checkbox_panel", true);
+ mLinkPanel = getChild<LLPanel>("link_panel", true);
+ mWarningPanel = getChild<LLPanel>("warning_panel", true);
+
+ mCheckboxUpload2K = getChild<LLUICtrl>("upload_2k");
+ mCheckboxUpload2K->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& data) { onUpload2KCheckBox(); });
+
+ mAllow2kTextures = gSavedSettings.getBOOL("BulkUpload2KTextures");
+ mCheckboxUpload2K->setValue(!mAllow2kTextures);
+
+ if (!mAllow2kTextures && mHas2kTextures)
+ {
+ // provided cost is for 2K textures, recalculate cost
+ S32 bvh_count;
+ S32 textures_2k_count;
+ get_bulk_upload_expected_cost(mFiles, mAllow2kTextures, mUploadCost, mUploadCount, bvh_count, textures_2k_count);
+
+ update();
+ }
+
+
+ update();
+
+ return LLModalDialog::postBuild();
+}
+
+void LLFloaterBulkUpload::update()
+{
+ mCountLabel->setTextArg("[COUNT]", llformat("%d", mUploadCount));
+ mCostLabel->setTextArg("[COST]", llformat("%d", mUploadCost));
+
+ mCheckboxPanel->setVisible(mHas2kTextures);
+ mLinkPanel->setVisible(mHas2kTextures);
+ mWarningPanel->setVisible(mHas2kTextures);
+
+ S32 new_height = MAX_HEIGH;
+ if (!mHas2kTextures)
+ {
+ new_height -= mCheckboxPanel->getRect().getHeight();
+ new_height -= mLinkPanel->getRect().getHeight();
+ new_height -= mWarningPanel->getRect().getHeight();
+ }
+ reshape(getRect().getWidth(), new_height, false);
+}
+
+void LLFloaterBulkUpload::onUpload2KCheckBox()
+{
+ mAllow2kTextures = !mCheckboxUpload2K->getValue().asBoolean();
+ gSavedSettings.setBOOL("BulkUpload2KTextures", mAllow2kTextures);
+
+ S32 bvh_count;
+ S32 textures_2k_count;
+ get_bulk_upload_expected_cost(mFiles, mAllow2kTextures, mUploadCost, mUploadCount, bvh_count, textures_2k_count);
+ // keep old value of mHas2kTextures to show checkbox
+
+ update();
+}
+
+void LLFloaterBulkUpload::onClickUpload()
+{
+ do_bulk_upload(mFiles, mAllow2kTextures);
+ closeFloater();
+}
+
+
+void LLFloaterBulkUpload::onClickCancel()
+{
+ closeFloater();
+}
diff --git a/indra/newview/llfloaterbulkupload.h b/indra/newview/llfloaterbulkupload.h
new file mode 100644
index 0000000000..d07dc8eabe
--- /dev/null
+++ b/indra/newview/llfloaterbulkupload.h
@@ -0,0 +1,66 @@
+/**
+ * @file llfloaterbulkupload.h
+ * @author Andrey Kleshchev
+ * @brief LLFloaterBulkUpload class definition
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERBULKUPLOAD_H
+#define LL_LLFLOATERBULKUPLOAD_H
+
+#include "llmodaldialog.h"
+
+class LLTextBox;
+
+class LLFloaterBulkUpload : public LLModalDialog
+{
+public:
+ LLFloaterBulkUpload(const LLSD& key);
+ ~LLFloaterBulkUpload();
+
+ bool postBuild() override;
+
+ void update();
+
+protected:
+ void onUpload2KCheckBox();
+
+ void onClickUpload();
+ void onClickCancel();
+
+private:
+ LLUICtrl* mCheckboxUpload2K = nullptr;
+ LLTextBox* mCountLabel = nullptr;
+ LLTextBox* mCostLabel = nullptr;
+ LLPanel* mCheckboxPanel = nullptr;
+ LLPanel* mLinkPanel = nullptr;
+ LLPanel* mWarningPanel = nullptr;
+
+ std::vector<std::string> mFiles;
+ bool mAllow2kTextures = true;
+ bool mHas2kTextures = false;
+ S32 mUploadCost = 0;
+ S32 mUploadCount = 0;
+};
+
+#endif
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 570a223908..11505e3047 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -182,7 +182,7 @@ public:
void refreshUI();
- void startTransaction(TransactionType type, const LLXMLRPCValue& params);
+ void startTransaction(TransactionType type, const LLSD& params);
bool checkTransaction();
void tellUserError(const std::string& message, const std::string& uri);
@@ -396,11 +396,10 @@ void LLFloaterBuyLandUI::updateParcelInfo()
// Can't have more than region max tasks, regardless of parcel
// object bonus factor.
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- if(region)
+ if (region)
{
S32 max_tasks_per_region = (S32)region->getMaxTasks();
- mParcelSupportedObjects = llmin(
- mParcelSupportedObjects, max_tasks_per_region);
+ mParcelSupportedObjects = llmin(mParcelSupportedObjects, max_tasks_per_region);
}
mParcelSoldWithObjects = parcel->getSellWithObjects();
@@ -423,7 +422,7 @@ void LLFloaterBuyLandUI::updateParcelInfo()
// checks that we can buy the land
- if(mIsForGroup && !gAgent.hasPowerInActiveGroup(GP_LAND_DEED))
+ if (mIsForGroup && !gAgent.hasPowerInActiveGroup(GP_LAND_DEED))
{
mCannotBuyReason = getString("cant_buy_for_group");
return;
@@ -492,85 +491,56 @@ void LLFloaterBuyLandUI::updateParcelInfo()
void LLFloaterBuyLandUI::updateCovenantInfo()
{
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- if(!region) return;
+ if (!region)
+ return;
U8 sim_access = region->getSimAccess();
std::string rating = LLViewerRegion::accessToString(sim_access);
LLTextBox* region_name = getChild<LLTextBox>("region_name_text");
- if (region_name)
- {
- std::string region_name_txt = region->getName() + " ("+rating +")";
- region_name->setText(region_name_txt);
+ std::string region_name_txt = region->getName() + " ("+rating +")";
+ region_name->setText(region_name_txt);
- LLIconCtrl* rating_icon = getChild<LLIconCtrl>("rating_icon");
- LLRect rect = rating_icon->getRect();
- S32 region_name_width = llmin(region_name->getRect().getWidth(), region_name->getTextBoundingRect().getWidth());
- S32 icon_left_pad = region_name->getRect().mLeft + region_name_width + ICON_PAD;
- region_name->setToolTip(region_name->getText());
- rating_icon->setRect(rect.setOriginAndSize(icon_left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
+ LLIconCtrl* rating_icon = getChild<LLIconCtrl>("rating_icon");
+ LLRect rect = rating_icon->getRect();
+ S32 region_name_width = llmin(region_name->getRect().getWidth(), region_name->getTextBoundingRect().getWidth());
+ S32 icon_left_pad = region_name->getRect().mLeft + region_name_width + ICON_PAD;
+ region_name->setToolTip(region_name->getText());
+ rating_icon->setRect(rect.setOriginAndSize(icon_left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
- switch(sim_access)
- {
- case SIM_ACCESS_PG:
- rating_icon->setValue(getString("icon_PG"));
- break;
+ switch (sim_access)
+ {
+ case SIM_ACCESS_PG:
+ rating_icon->setValue(getString("icon_PG"));
+ break;
- case SIM_ACCESS_ADULT:
- rating_icon->setValue(getString("icon_R"));
- break;
+ case SIM_ACCESS_ADULT:
+ rating_icon->setValue(getString("icon_R"));
+ break;
- default:
- rating_icon->setValue(getString("icon_M"));
- }
+ default:
+ rating_icon->setValue(getString("icon_M"));
}
LLTextBox* region_type = getChild<LLTextBox>("region_type_text");
- if (region_type)
- {
- region_type->setText(region->getLocalizedSimProductName());
- region_type->setToolTip(region->getLocalizedSimProductName());
- }
+ region_type->setText(region->getLocalizedSimProductName());
+ region_type->setToolTip(region->getLocalizedSimProductName());
LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");
- if (resellable_clause)
- {
- if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))
- {
- resellable_clause->setText(getString("can_not_resell"));
- }
- else
- {
- resellable_clause->setText(getString("can_resell"));
- }
- }
+ const char* can_resell = region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL) ? "can_not_resell" : "can_resell";
+ resellable_clause->setText(getString(can_resell));
LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");
- if (changeable_clause)
- {
- if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))
- {
- changeable_clause->setText(getString("can_change"));
- }
- else
- {
- changeable_clause->setText(getString("can_not_change"));
- }
- }
+ const char* can_change = region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES) ? "can_change" : "can_not_change";
+ changeable_clause->setText(getString(can_change));
LLCheckBoxCtrl* check = getChild<LLCheckBoxCtrl>("agree_covenant");
- if(check)
- {
- check->set(false);
- check->setEnabled(true);
- check->setCommitCallback(onChangeAgreeCovenant, this);
- }
+ check->set(false);
+ check->setEnabled(true);
+ check->setCommitCallback(onChangeAgreeCovenant, this);
LLTextBox* box = getChild<LLTextBox>("covenant_text");
- if(box)
- {
- box->setVisible(false);
- }
+ box->setVisible(false);
// send EstateCovenantInfo message
LLMessageSystem *msg = gMessageSystem;
@@ -584,10 +554,9 @@ void LLFloaterBuyLandUI::updateCovenantInfo()
// static
void LLFloaterBuyLandUI::onChangeAgreeCovenant(LLUICtrl* ctrl, void* user_data)
{
- LLFloaterBuyLandUI* self = (LLFloaterBuyLandUI*)user_data;
- if(self)
+ if (user_data)
{
- self->refreshUI();
+ ((LLFloaterBuyLandUI*)user_data)->refreshUI();
}
}
@@ -626,13 +595,13 @@ void LLFloaterBuyLandUI::updateFloaterEstateName(const std::string& name)
void LLFloaterBuyLandUI::updateFloaterLastModified(const std::string& text)
{
LLTextBox* editor = getChild<LLTextBox>("covenant_timestamp_text");
- if (editor) editor->setText(text);
+ editor->setText(text);
}
void LLFloaterBuyLandUI::updateFloaterEstateOwnerName(const std::string& name)
{
LLTextBox* box = getChild<LLTextBox>("estate_owner_text");
- if (box) box->setText(name);
+ box->setText(name);
}
void LLFloaterBuyLandUI::updateWebSiteInfo()
@@ -640,9 +609,10 @@ void LLFloaterBuyLandUI::updateWebSiteInfo()
S32 askBillableArea = mIsForGroup ? 0 : mParcelBillableArea;
S32 askCurrencyBuy = mCurrency.getAmount();
- if (mTransaction && mTransactionType == TransactionPreflight
- && mPreflightAskBillableArea == askBillableArea
- && mPreflightAskCurrencyBuy == askCurrencyBuy)
+ if (mTransaction &&
+ mTransactionType == TransactionPreflight &&
+ mPreflightAskBillableArea == askBillableArea &&
+ mPreflightAskCurrencyBuy == askCurrencyBuy)
{
return;
}
@@ -664,27 +634,21 @@ void LLFloaterBuyLandUI::updateWebSiteInfo()
mSiteCurrencyEstimatedCost = 0;
#endif
- LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
- keywordArgs.appendString("agentId", gAgent.getID().asString());
- keywordArgs.appendString(
- "secureSessionId",
- gAgent.getSecureSessionID().asString());
- keywordArgs.appendString("language", LLUI::getLanguage());
- keywordArgs.appendInt("billableArea", mPreflightAskBillableArea);
- keywordArgs.appendInt("currencyBuy", mPreflightAskCurrencyBuy);
-
- LLXMLRPCValue params = LLXMLRPCValue::createArray();
- params.append(keywordArgs);
+ LLSD params = LLSD::emptyMap();
+ params["agentId"] = gAgent.getID().asString();
+ params["secureSessionId"] = gAgent.getSecureSessionID().asString();
+ params["language"] = LLUI::getLanguage();
+ params["billableArea"] = mPreflightAskBillableArea;
+ params["currencyBuy"] = mPreflightAskCurrencyBuy;
startTransaction(TransactionPreflight, params);
}
void LLFloaterBuyLandUI::finishWebSiteInfo()
{
+ const LLSD& result = mTransaction->response();
- LLXMLRPCValue result = mTransaction->responseValue();
-
- mSiteValid = result["success"].asBool();
+ mSiteValid = result["success"].asBoolean();
if (!mSiteValid)
{
tellUserError(
@@ -694,31 +658,30 @@ void LLFloaterBuyLandUI::finishWebSiteInfo()
return;
}
- LLXMLRPCValue membership = result["membership"];
- mSiteMembershipUpgrade = membership["upgrade"].asBool();
+ const LLSD& membership = result["membership"];
+ mSiteMembershipUpgrade = membership["upgrade"].asBoolean();
mSiteMembershipAction = membership["action"].asString();
mSiteMembershipPlanIDs.clear();
mSiteMembershipPlanNames.clear();
- LLXMLRPCValue levels = membership["levels"];
- for (LLXMLRPCValue level = levels.rewind();
- level.isValid();
- level = levels.next())
+ const LLSD& levels = membership["levels"];
+ for (auto it = levels.beginArray(); it != levels.endArray(); ++it)
{
+ const LLSD& level = *it;
mSiteMembershipPlanIDs.push_back(level["id"].asString());
mSiteMembershipPlanNames.push_back(level["description"].asString());
}
mUserPlanChoice = 0;
- LLXMLRPCValue landUse = result["landUse"];
- mSiteLandUseUpgrade = landUse["upgrade"].asBool();
+ const LLSD& landUse = result["landUse"];
+ mSiteLandUseUpgrade = landUse["upgrade"].asBoolean();
mSiteLandUseAction = landUse["action"].asString();
- LLXMLRPCValue currency = result["currency"];
- if (currency["estimatedCost"].isValid())
+ const LLSD& currency = result["currency"];
+ if (currency.has("estimatedCost"))
{
- mCurrency.setUSDEstimate(currency["estimatedCost"].asInt());
+ mCurrency.setUSDEstimate(currency["estimatedCost"].asInteger());
}
- if (currency["estimatedLocalCost"].isValid())
+ if (currency.has("estimatedLocalCost"))
{
mCurrency.setLocalEstimate(currency["estimatedLocalCost"].asString());
}
@@ -760,35 +723,30 @@ void LLFloaterBuyLandUI::runWebSitePrep(const std::string& password)
}
}
- LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
- keywordArgs.appendString("agentId", gAgent.getID().asString());
- keywordArgs.appendString(
- "secureSessionId",
- gAgent.getSecureSessionID().asString());
- keywordArgs.appendString("language", LLUI::getLanguage());
- keywordArgs.appendString("levelId", newLevel);
- keywordArgs.appendInt("billableArea",
- mIsForGroup ? 0 : mParcelBillableArea);
- keywordArgs.appendInt("currencyBuy", mCurrency.getAmount());
- keywordArgs.appendInt("estimatedCost", mCurrency.getUSDEstimate());
- keywordArgs.appendString("estimatedLocalCost", mCurrency.getLocalEstimate());
- keywordArgs.appendString("confirm", mSiteConfirm);
+ LLSD params = LLSD::emptyMap();
+ params["agentId"] = gAgent.getID().asString();
+ params["secureSessionId"] = gAgent.getSecureSessionID().asString();
+ params["language"] = LLUI::getLanguage();
+ params["levelId"] = newLevel;
+ params["billableArea"] = mIsForGroup ? 0 : mParcelBillableArea;
+ params["currencyBuy"] = mCurrency.getAmount();
+ params["estimatedCost"] = mCurrency.getUSDEstimate();
+ params["estimatedLocalCost"] = mCurrency.getLocalEstimate();
+ params["confirm"] = mSiteConfirm;
+
if (!password.empty())
{
- keywordArgs.appendString("password", password);
+ params["password"] = password;
}
- LLXMLRPCValue params = LLXMLRPCValue::createArray();
- params.append(keywordArgs);
-
startTransaction(TransactionBuy, params);
}
void LLFloaterBuyLandUI::finishWebSitePrep()
{
- LLXMLRPCValue result = mTransaction->responseValue();
+ const LLSD& result = mTransaction->response();
- bool success = result["success"].asBool();
+ bool success = result["success"].asBoolean();
if (!success)
{
tellUserError(
@@ -850,7 +808,7 @@ void LLFloaterBuyLandUI::updateGroupName(const LLUUID& id,
}
}
-void LLFloaterBuyLandUI::startTransaction(TransactionType type, const LLXMLRPCValue& params)
+void LLFloaterBuyLandUI::startTransaction(TransactionType type, const LLSD& params)
{
delete mTransaction;
mTransaction = NULL;
@@ -878,12 +836,7 @@ void LLFloaterBuyLandUI::startTransaction(TransactionType type, const LLXMLRPCVa
return;
}
- mTransaction = new LLXMLRPCTransaction(
- transaction_uri,
- method,
- params,
- false /* don't use gzip */
- );
+ mTransaction = new LLXMLRPCTransaction(transaction_uri, method, params);
}
bool LLFloaterBuyLandUI::checkTransaction()
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index 5330518ba5..3d81d01e16 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -285,7 +285,12 @@ bool LLFloaterBvhPreview::postBuild()
// create data buffer for keyframe initialization
S32 buffer_size = loaderp->getOutputSize();
- U8* buffer = new U8[buffer_size];
+ U8* buffer = new(std::nothrow) U8[buffer_size];
+ if (!buffer)
+ {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS() << "Bad memory allocation for buffer, size: " << buffer_size << LL_ENDL;
+ }
LLDataPackerBinaryBuffer dp(buffer, buffer_size);
@@ -992,7 +997,12 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
LLKeyframeMotion* motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID);
S32 file_size = motionp->getFileSize();
- U8* buffer = new U8[file_size];
+ U8* buffer = new(std::nothrow) U8[file_size];
+ if (!buffer)
+ {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS() << "Bad memory allocation for buffer, size: " << file_size << LL_ENDL;
+ }
LLDataPackerBinaryBuffer dp(buffer, file_size);
if (motionp->serialize(dp))
@@ -1086,7 +1096,7 @@ bool LLPreviewAnimation::render()
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.loadIdentity();
- gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.ortho(0.0f, (F32)mFullWidth, 0.0f, (F32)mFullHeight, -1.0f, 1.0f);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
diff --git a/indra/newview/llfloaterchangeitemthumbnail.cpp b/indra/newview/llfloaterchangeitemthumbnail.cpp
index 3e2e7cb7a3..fb31361fd9 100644
--- a/indra/newview/llfloaterchangeitemthumbnail.cpp
+++ b/indra/newview/llfloaterchangeitemthumbnail.cpp
@@ -951,8 +951,8 @@ void LLFloaterChangeItemThumbnail::onTexturePickerCommit()
|| texturep->getFullWidth() == 0)
{
if (texturep->isFullyLoaded()
- && (texturep->getCachedRawImageLevel() == 0 || texturep->getRawImageLevel() == 0)
- && (texturep->isCachedRawImageReady() || texturep->isRawImageValid()))
+ && (texturep->getRawImageLevel() == 0)
+ && (texturep->isRawImageValid()))
{
LLUUID task_id = mTaskId;
uuid_set_t inventory_ids = mItemList;
@@ -962,20 +962,10 @@ void LLFloaterChangeItemThumbnail::onTexturePickerCommit()
{
onUploadComplete(asset_id, task_id, inventory_ids, handle);
};
- if (texturep->isRawImageValid())
- {
- LLFloaterSimpleSnapshot::uploadThumbnail(texturep->getRawImage(),
- *mItemList.begin(),
- mTaskId,
- callback);
- }
- else
- {
- LLFloaterSimpleSnapshot::uploadThumbnail(texturep->getCachedRawImage(),
- *mItemList.begin(),
- mTaskId,
- callback);
- }
+ LLFloaterSimpleSnapshot::uploadThumbnail(texturep->getRawImage(),
+ *mItemList.begin(),
+ mTaskId,
+ callback);
}
else
{
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 603f54fb49..cd45093856 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -110,12 +110,6 @@ LLFloaterColorPicker::LLFloaterColorPicker (LLColorSwatchCtrl* swatch, bool show
// create user interface for this picker
createUI ();
-
- if (!mCanApplyImmediately)
- {
- mApplyImmediateCheck->setEnabled(false);
- mApplyImmediateCheck->set(false);
- }
}
LLFloaterColorPicker::~LLFloaterColorPicker()
@@ -226,6 +220,12 @@ bool LLFloaterColorPicker::postBuild()
mApplyImmediateCheck->set(gSavedSettings.getBOOL("ApplyColorImmediately"));
mApplyImmediateCheck->setCommitCallback(onImmediateCheck, this);
+ if (!mCanApplyImmediately)
+ {
+ mApplyImmediateCheck->setEnabled(false);
+ mApplyImmediateCheck->set(false);
+ }
+
childSetCommitCallback("rspin", onTextCommit, (void*)this );
childSetCommitCallback("gspin", onTextCommit, (void*)this );
childSetCommitCallback("bspin", onTextCommit, (void*)this );
diff --git a/indra/newview/llfloaterconversationlog.cpp b/indra/newview/llfloaterconversationlog.cpp
index 648d3af5a5..97399c9cf7 100644
--- a/indra/newview/llfloaterconversationlog.cpp
+++ b/indra/newview/llfloaterconversationlog.cpp
@@ -55,10 +55,11 @@ bool LLFloaterConversationLog::postBuild()
}
// Use the context menu of the Conversation list for the Conversation tab gear menu.
+ mConversationsGearBtn = getChild<LLMenuButton>("conversations_gear_btn");
LLToggleableMenu* conversations_gear_menu = mConversationLogList->getContextMenu();
if (conversations_gear_menu)
{
- getChild<LLMenuButton>("conversations_gear_btn")->setMenu(conversations_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
+ mConversationsGearBtn->setMenu(conversations_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
}
getChild<LLFilterEditor>("people_filter_input")->setCommitCallback(boost::bind(&LLFloaterConversationLog::onFilterEdit, this, _2));
@@ -68,7 +69,7 @@ bool LLFloaterConversationLog::postBuild()
void LLFloaterConversationLog::draw()
{
- getChild<LLMenuButton>("conversations_gear_btn")->setEnabled(mConversationLogList->getSelectedItem() != NULL);
+ mConversationsGearBtn->setEnabled(mConversationLogList->getSelectedItem() != NULL);
LLFloater::draw();
}
diff --git a/indra/newview/llfloaterconversationlog.h b/indra/newview/llfloaterconversationlog.h
index 85ca37c530..c82237c108 100644
--- a/indra/newview/llfloaterconversationlog.h
+++ b/indra/newview/llfloaterconversationlog.h
@@ -29,6 +29,7 @@
#include "llfloater.h"
class LLConversationLogList;
+class LLMenuButton;
class LLFloaterConversationLog : public LLFloater
{
@@ -50,6 +51,7 @@ private:
bool isActionChecked(const LLSD& userdata);
LLConversationLogList* mConversationLogList;
+ LLMenuButton* mConversationsGearBtn = nullptr;
};
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index 837aa858f5..6f5d81eda3 100644
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -111,8 +111,8 @@ void LLFloaterConversationPreview::setPages(std::list<LLSD>* messages, const std
mCurrentPage = (mMessages->size() ? (static_cast<int>(mMessages->size()) - 1) / mPageSize : 0);
mPageSpinner->setEnabled(true);
- mPageSpinner->setMaxValue(mCurrentPage+1);
- mPageSpinner->set(mCurrentPage+1);
+ mPageSpinner->setMaxValue((F32)(mCurrentPage+1));
+ mPageSpinner->set((F32)(mCurrentPage+1));
std::string total_page_num = llformat("/ %d", mCurrentPage+1);
getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
diff --git a/indra/newview/llfloaterdestinations.cpp b/indra/newview/llfloaterdestinations.cpp
index 93cf02e835..fad9693e8f 100644
--- a/indra/newview/llfloaterdestinations.cpp
+++ b/indra/newview/llfloaterdestinations.cpp
@@ -25,11 +25,6 @@
* $/LicenseInfo$
*/
-/**
- * Floater that appears when buying an object, giving a preview
- * of its contents and their permissions.
- */
-
#include "llviewerprecompiledheaders.h"
#include "llfloaterdestinations.h"
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index ebccb2214c..60343a4e2a 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -313,7 +313,7 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
mDayLength.value(0);
if (key.has(KEY_DAY_LENGTH))
{
- mDayLength.value(key[KEY_DAY_LENGTH].asReal());
+ mDayLength.value(key[KEY_DAY_LENGTH].asInteger());
}
// Time&Percentage labels
@@ -352,7 +352,7 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
// Adjust Time&Percentage labels' location according to length
LLRect label_rect = getChild<LLTextBox>("p0", true)->getRect();
- F32 slider_width = mFramesSlider->getRect().getWidth();
+ F32 slider_width = (F32)mFramesSlider->getRect().getWidth();
for (int i = 1; i < max_elm; i++)
{
LLTextBox *pcnt_label = getChild<LLTextBox>("p" + llformat("%d", i), true);
@@ -705,7 +705,7 @@ void LLFloaterEditExtDayCycle::onAddFrame()
LL_WARNS("ENVDAYEDIT") << "Attempt to add new frame while waiting for day(asset) to load." << LL_ENDL;
return;
}
- if ((mEditDay->getSettingsNearKeyframe(frame, mCurrentTrack, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)).second)
+ if ((mEditDay->getSettingsNearKeyframe((LLSettingsBase::TrackPosition)frame, mCurrentTrack, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)).second)
{
LL_WARNS("ENVDAYEDIT") << "Attempt to add new frame too close to existing frame." << LL_ENDL;
return;
@@ -722,17 +722,17 @@ void LLFloaterEditExtDayCycle::onAddFrame()
// scratch water should always have the current water settings.
LLSettingsWater::ptr_t water(mScratchWater->buildClone());
setting = water;
- mEditDay->setWaterAtKeyframe( std::static_pointer_cast<LLSettingsWater>(setting), frame);
+ mEditDay->setWaterAtKeyframe( std::static_pointer_cast<LLSettingsWater>(setting), (LLSettingsBase::TrackPosition)frame);
}
else
{
// scratch sky should always have the current sky settings.
LLSettingsSky::ptr_t sky(mScratchSky->buildClone());
setting = sky;
- mEditDay->setSkyAtKeyframe(sky, frame, mCurrentTrack);
+ mEditDay->setSkyAtKeyframe(sky, (LLSettingsBase::TrackPosition)frame, mCurrentTrack);
}
setDirtyFlag();
- addSliderFrame(frame, setting);
+ addSliderFrame((F32)frame, setting);
updateTabs();
}
@@ -1316,7 +1316,7 @@ void LLFloaterEditExtDayCycle::removeCurrentSliderFrame()
{
LL_DEBUGS("ENVDAYEDIT") << "Removing frame from " << iter->second.mFrame << LL_ENDL;
LLSettingsBase::Seconds seconds(iter->second.mFrame);
- mEditDay->removeTrackKeyframe(mCurrentTrack, seconds);
+ mEditDay->removeTrackKeyframe(mCurrentTrack, (LLSettingsBase::TrackPosition)seconds);
mSliderKeyMap.erase(iter);
}
@@ -1474,17 +1474,17 @@ void LLFloaterEditExtDayCycle::reblendSettings()
{
if ((mSkyBlender->getTrack() != mCurrentTrack) && (mCurrentTrack != LLSettingsDay::TRACK_WATER))
{
- mSkyBlender->switchTrack(mCurrentTrack, position);
+ mSkyBlender->switchTrack(mCurrentTrack, (LLSettingsBase::TrackPosition)position);
}
else
{
- mSkyBlender->setPosition(position);
+ mSkyBlender->setPosition((LLSettingsBase::TrackPosition)position);
}
}
if (mWaterBlender)
{
- mWaterBlender->setPosition(position);
+ mWaterBlender->setPosition((LLSettingsBase::TrackPosition)position);
}
}
@@ -1517,7 +1517,7 @@ bool LLFloaterEditExtDayCycle::isAddingFrameAllowed()
if (!mFramesSlider->getCurSlider().empty() || !mEditDay) return false;
LLSettingsBase::Seconds frame(mTimeSlider->getCurSliderValue());
- if ((mEditDay->getSettingsNearKeyframe(frame, mCurrentTrack, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)).second)
+ if ((mEditDay->getSettingsNearKeyframe((LLSettingsBase::TrackPosition)frame, mCurrentTrack, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)).second)
{
return false;
}
diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp
index d38f53eed6..cc13e5d059 100644
--- a/indra/newview/llfloateremojipicker.cpp
+++ b/indra/newview/llfloateremojipicker.cpp
@@ -101,7 +101,7 @@ public:
LLScrollingPanel::draw();
F32 x = 4; // padding-left
- F32 y = getRect().getHeight() / 2;
+ F32 y = (F32)(getRect().getHeight() / 2);
LLFontGL::getFontSansSerif()->render(
mText, // wstr
0, // begin_offset
@@ -137,8 +137,8 @@ public:
{
LLScrollingPanel::draw();
- F32 x = getRect().getWidth() / 2;
- F32 y = getRect().getHeight() / 2;
+ F32 x = (F32)(getRect().getWidth() / 2);
+ F32 y = (F32)(getRect().getHeight() / 2);
LLFontGL::getFontEmojiLarge()->render(
mChar, // wstr
0, // begin_offset
@@ -186,7 +186,7 @@ public:
{
mWStr = LLWString(1, emoji);
mEmoji = emoji;
- mTitle = title;
+ mTitle = utf8str_to_wstring(title);
mBegin = begin;
mEnd = end;
}
@@ -203,10 +203,9 @@ public:
F32 centerY = 0.5f * clientHeight;
drawIcon(centerX, centerY - 1, iconWidth);
- static LLColor4 defaultColor(0.75f, 0.75f, 0.75f, 1.0f);
- LLColor4 textColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", defaultColor);
+ static LLUIColor textColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", LLColor4(0.75f, 0.75f, 0.75f, 1.0f));
S32 max_pixels = clientWidth - iconWidth;
- drawName(iconWidth, centerY, max_pixels, textColor);
+ drawName((F32)iconWidth, centerY, max_pixels, textColor.get());
}
protected:
@@ -226,16 +225,16 @@ protected:
max_pixels); // max_pixels
}
- void drawName(F32 x, F32 y, S32 max_pixels, LLColor4& color)
+ void drawName(F32 x, F32 y, S32 max_pixels, const LLColor4& color)
{
F32 x0 = x;
- F32 x1 = max_pixels;
+ F32 x1 = (F32)max_pixels;
LLFontGL* font = LLFontGL::getFontEmojiLarge();
if (mBegin)
{
- std::string text = mTitle.substr(0, mBegin);
- font->renderUTF8(
- text, // text
+ LLWString text = mTitle.substr(0, mBegin);
+ font->render(
+ text.c_str(), // text
0, // begin_offset
x0, // x
y, // y
@@ -245,15 +244,15 @@ protected:
LLFontGL::NORMAL, // style
LLFontGL::DROP_SHADOW_SOFT, // shadow
static_cast<S32>(text.size()), // max_chars
- x1); // max_pixels
- F32 dx = font->getWidthF32(text);
+ (S32)x1); // max_pixels
+ F32 dx = font->getWidthF32(text.c_str());
x0 += dx;
x1 -= dx;
}
if (x1 > 0 && mEnd > mBegin)
{
- std::string text = mTitle.substr(mBegin, mEnd - mBegin);
- font->renderUTF8(
+ LLWString text = mTitle.substr(mBegin, mEnd - mBegin);
+ font->render(
text, // text
0, // begin_offset
x0, // x
@@ -264,15 +263,15 @@ protected:
LLFontGL::NORMAL, // style
LLFontGL::DROP_SHADOW_SOFT, // shadow
static_cast<S32>(text.size()), // max_chars
- x1); // max_pixels
- F32 dx = font->getWidthF32(text);
+ (S32)x1); // max_pixels
+ F32 dx = font->getWidthF32(text.c_str());
x0 += dx;
x1 -= dx;
}
if (x1 > 0 && mEnd < mTitle.size())
{
- std::string text = mEnd ? mTitle.substr(mEnd) : mTitle;
- font->renderUTF8(
+ LLWString text = mEnd ? mTitle.substr(mEnd) : mTitle;
+ font->render(
text, // text
0, // begin_offset
x0, // x
@@ -283,14 +282,14 @@ protected:
LLFontGL::NORMAL, // style
LLFontGL::DROP_SHADOW_SOFT, // shadow
static_cast<S32>(text.size()), // max_chars
- x1); // max_pixels
+ (S32)x1); // max_pixels
}
}
private:
llwchar mEmoji;
LLWString mWStr;
- std::string mTitle;
+ LLWString mTitle;
size_t mBegin;
size_t mEnd;
};
@@ -429,6 +428,7 @@ void LLFloaterEmojiPicker::fillGroups()
for (LLButton* button : mGroupButtons)
{
mGroups->removeChild(button);
+ button->die();
}
mFilteredEmojiGroups.clear();
mFilteredEmojis.clear();
@@ -442,6 +442,7 @@ void LLFloaterEmojiPicker::fillGroups()
rect.mBottom = mBadge->getRect().getHeight();
// Create button for "All categories"
+ params.name = "all_categories";
createGroupButton(params, rect, ALL_EMOJIS_IMAGE_INDEX);
// Create group and button for "Recently used" and/or "Frequently used"
@@ -455,6 +456,7 @@ void LLFloaterEmojiPicker::fillGroups()
{
mFilteredEmojiGroups.push_back(USED_EMOJIS_GROUP_INDEX);
mFilteredEmojis.emplace_back(cats);
+ params.name = "used_categories";
createGroupButton(params, rect, USED_EMOJIS_IMAGE_INDEX);
}
}
@@ -472,6 +474,7 @@ void LLFloaterEmojiPicker::fillGroups()
{
mFilteredEmojiGroups.push_back(i);
mFilteredEmojis.emplace_back(cats);
+ params.name = "group_" + std::to_string(i);
createGroupButton(params, rect, groups[i].Character);
}
}
@@ -700,8 +703,7 @@ void LLFloaterEmojiPicker::fillEmojis(bool fromResize)
LLPanel::Params icon_params;
LLRect icon_rect(0, icon_size, icon_size, 0);
- static LLColor4 default_color(0.75f, 0.75f, 0.75f, 1.0f);
- LLColor4 bg_color = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", default_color);
+ static LLUIColor bg_color = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", LLColor4(0.75f, 0.75f, 0.75f, 1.0f));
if (!mSelectedGroupIndex)
{
@@ -849,8 +851,7 @@ void LLFloaterEmojiPicker::createEmojiIcon(const LLEmojiSearchResult& emoji,
void LLFloaterEmojiPicker::showPreview(bool show)
{
- //mPreview->setIcon(nullptr);
- mDummy->setVisible(show);
+ mDummy->setVisible(!show);
mPreview->setVisible(show);
}
@@ -865,7 +866,7 @@ void LLFloaterEmojiPicker::onGroupButtonClick(LLUICtrl* ctrl)
if (it == mGroupButtons.end())
return;
- selectEmojiGroup(it - mGroupButtons.begin());
+ selectEmojiGroup((U32)(it - mGroupButtons.begin()));
}
}
diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp
index 32c4f6205d..3b8a25b3a6 100644
--- a/indra/newview/llfloaterenvironmentadjust.cpp
+++ b/indra/newview/llfloaterenvironmentadjust.cpp
@@ -292,7 +292,7 @@ void LLFloaterEnvironmentAdjust::onHazeHorizonChanged()
{
if (!mLiveSky)
return;
- mLiveSky->setHazeHorizon(getChild<LLUICtrl>(FIELD_SKY_HAZE_HORIZON)->getValue().asReal());
+ mLiveSky->setHazeHorizon((F32)getChild<LLUICtrl>(FIELD_SKY_HAZE_HORIZON)->getValue().asReal());
mLiveSky->update();
}
@@ -300,7 +300,7 @@ void LLFloaterEnvironmentAdjust::onHazeDensityChanged()
{
if (!mLiveSky)
return;
- mLiveSky->setHazeDensity(getChild<LLUICtrl>(FIELD_SKY_HAZE_DENSITY)->getValue().asReal());
+ mLiveSky->setHazeDensity((F32)getChild<LLUICtrl>(FIELD_SKY_HAZE_DENSITY)->getValue().asReal());
mLiveSky->update();
}
@@ -308,7 +308,7 @@ void LLFloaterEnvironmentAdjust::onSceneGammaChanged()
{
if (!mLiveSky)
return;
- mLiveSky->setGamma(getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->getValue().asReal());
+ mLiveSky->setGamma((F32)getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->getValue().asReal());
mLiveSky->update();
}
@@ -324,7 +324,7 @@ void LLFloaterEnvironmentAdjust::onCloudCoverageChanged()
{
if (!mLiveSky)
return;
- mLiveSky->setCloudShadow(getChild<LLUICtrl>(FIELD_SKY_CLOUD_COVERAGE)->getValue().asReal());
+ mLiveSky->setCloudShadow((F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_COVERAGE)->getValue().asReal());
mLiveSky->update();
}
@@ -332,7 +332,7 @@ void LLFloaterEnvironmentAdjust::onCloudScaleChanged()
{
if (!mLiveSky)
return;
- mLiveSky->setCloudScale(getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCALE)->getValue().asReal());
+ mLiveSky->setCloudScale((F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCALE)->getValue().asReal());
mLiveSky->update();
}
@@ -340,7 +340,7 @@ void LLFloaterEnvironmentAdjust::onGlowChanged()
{
if (!mLiveSky)
return;
- LLColor3 glow(getChild<LLUICtrl>(FIELD_SKY_GLOW_SIZE)->getValue().asReal(), 0.0f, getChild<LLUICtrl>(FIELD_SKY_GLOW_FOCUS)->getValue().asReal());
+ LLColor3 glow((F32)getChild<LLUICtrl>(FIELD_SKY_GLOW_SIZE)->getValue().asReal(), 0.0f, (F32)getChild<LLUICtrl>(FIELD_SKY_GLOW_FOCUS)->getValue().asReal());
// takes 0 - 1.99 UI range -> 40 -> 0.2 range
glow.mV[0] = (2.0f - glow.mV[0]) * SLIDER_SCALE_GLOW_R;
@@ -354,7 +354,7 @@ void LLFloaterEnvironmentAdjust::onStarBrightnessChanged()
{
if (!mLiveSky)
return;
- mLiveSky->setStarBrightness(getChild<LLUICtrl>(FIELD_SKY_STAR_BRIGHTNESS)->getValue().asReal());
+ mLiveSky->setStarBrightness((F32)getChild<LLUICtrl>(FIELD_SKY_STAR_BRIGHTNESS)->getValue().asReal());
mLiveSky->update();
}
@@ -375,8 +375,8 @@ void LLFloaterEnvironmentAdjust::onSunRotationChanged()
void LLFloaterEnvironmentAdjust::onSunAzimElevChanged()
{
- F32 azimuth = getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->getValue().asReal();
- F32 elevation = getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->getValue().asReal();
+ F32 azimuth = (F32)getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->getValue().asReal();
+ F32 elevation = (F32)getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->getValue().asReal();
LLQuaternion quat;
azimuth *= DEG_TO_RAD;
@@ -405,7 +405,7 @@ void LLFloaterEnvironmentAdjust::onSunScaleChanged()
{
if (!mLiveSky)
return;
- mLiveSky->setSunScale((getChild<LLUICtrl>(FIELD_SKY_SUN_SCALE)->getValue().asReal()));
+ mLiveSky->setSunScale((F32)(getChild<LLUICtrl>(FIELD_SKY_SUN_SCALE)->getValue().asReal()));
mLiveSky->update();
}
@@ -426,8 +426,8 @@ void LLFloaterEnvironmentAdjust::onMoonRotationChanged()
void LLFloaterEnvironmentAdjust::onMoonAzimElevChanged()
{
- F32 azimuth = getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->getValue().asReal();
- F32 elevation = getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->getValue().asReal();
+ F32 azimuth = (F32)getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->getValue().asReal();
+ F32 elevation = (F32)getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->getValue().asReal();
LLQuaternion quat;
azimuth *= DEG_TO_RAD;
@@ -483,7 +483,7 @@ void LLFloaterEnvironmentAdjust::onSunColorChanged()
void LLFloaterEnvironmentAdjust::onReflectionProbeAmbianceChanged()
{
if (!mLiveSky) return;
- F32 ambiance = getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->getValue().asReal();
+ F32 ambiance = (F32)getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->getValue().asReal();
mLiveSky->setReflectionProbeAmbiance(ambiance);
updateGammaLabel();
diff --git a/indra/newview/llfloaterfonttest.cpp b/indra/newview/llfloaterfonttest.cpp
index 95d08cb9ce..d39b061d40 100644
--- a/indra/newview/llfloaterfonttest.cpp
+++ b/indra/newview/llfloaterfonttest.cpp
@@ -25,11 +25,6 @@
* $/LicenseInfo$
*/
-/**
- * Floater that appears when buying an object, giving a preview
- * of its contents and their permissions.
- */
-
#include "llviewerprecompiledheaders.h"
#include "llfloaterfonttest.h"
diff --git a/indra/newview/llfloatergltfasseteditor.cpp b/indra/newview/llfloatergltfasseteditor.cpp
new file mode 100644
index 0000000000..d2cf24f1dd
--- /dev/null
+++ b/indra/newview/llfloatergltfasseteditor.cpp
@@ -0,0 +1,622 @@
+/**
+ * @file llfloatergltfasseteditor.cpp
+ * @author Andrii Kleshchev
+ * @brief LLFloaterGltfAssetEditor class implementation
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatergltfasseteditor.h"
+
+#include "gltf/asset.h"
+#include "llcallbacklist.h"
+#include "llmenubutton.h"
+#include "llselectmgr.h"
+#include "llspinctrl.h"
+#include "llviewerobject.h"
+
+const LLColor4U DEFAULT_WHITE(255, 255, 255);
+
+/// LLFloaterGLTFAssetEditor
+
+LLFloaterGLTFAssetEditor::LLFloaterGLTFAssetEditor(const LLSD& key)
+ : LLFloater(key)
+ , mUIColor(LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE))
+{
+ setTitle("GLTF Asset Editor (WIP)");
+
+ mCommitCallbackRegistrar.add("PanelObject.menuDoToSelected", [this](LLUICtrl* ctrl, const LLSD& data) { onMenuDoToSelected(data); });
+ mEnableCallbackRegistrar.add("PanelObject.menuEnable", [this](LLUICtrl* ctrl, const LLSD& data) { return onMenuEnableItem(data); });
+}
+
+LLFloaterGLTFAssetEditor::~LLFloaterGLTFAssetEditor()
+{
+ if (mScroller)
+ {
+ mItemListPanel->removeChild(mScroller);
+ delete mScroller;
+ mScroller = NULL;
+ }
+}
+
+bool LLFloaterGLTFAssetEditor::postBuild()
+{
+ // Position
+ mMenuClipboardPos = getChild<LLMenuButton>("clipboard_pos_btn");
+ mCtrlPosX = getChild<LLSpinCtrl>("Pos X", true);
+ mCtrlPosX->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+ mCtrlPosY = getChild<LLSpinCtrl>("Pos Y", true);
+ mCtrlPosY->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+ mCtrlPosZ = getChild<LLSpinCtrl>("Pos Z", true);
+ mCtrlPosZ->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+
+ // Scale
+ mMenuClipboardScale = getChild<LLMenuButton>("clipboard_size_btn");
+ mCtrlScaleX = getChild<LLSpinCtrl>("Scale X", true);
+ mCtrlScaleX->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+ mCtrlScaleY = getChild<LLSpinCtrl>("Scale Y", true);
+ mCtrlScaleY->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+ mCtrlScaleZ = getChild<LLSpinCtrl>("Scale Z", true);
+ mCtrlScaleZ->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+
+ // Rotation
+ mMenuClipboardRot = getChild<LLMenuButton>("clipboard_rot_btn");
+ mCtrlRotX = getChild<LLSpinCtrl>("Rot X", true);
+ mCtrlRotX->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+ mCtrlRotY = getChild<LLSpinCtrl>("Rot Y", true);
+ mCtrlRotY->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+ mCtrlRotZ = getChild<LLSpinCtrl>("Rot Z", true);
+ mCtrlPosZ->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTransform(); });
+ setTransformsEnabled(false);
+ // todo: do multiple panels based on selected element.
+ mTransformsPanel = getChild<LLPanel>("transform_panel", true);
+ mTransformsPanel->setVisible(false);
+
+ mItemListPanel = getChild<LLPanel>("item_list_panel", true);
+ initFolderRoot();
+
+ return true;
+}
+
+void LLFloaterGLTFAssetEditor::initFolderRoot()
+{
+ if (mScroller || mFolderRoot)
+ {
+ LL_ERRS() << "Folder root already initialized" << LL_ENDL;
+ return;
+ }
+
+ LLRect scroller_view_rect = mItemListPanel->getRect();
+ scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ LLScrollContainer::Params scroller_params(LLUICtrlFactory::getDefaultParams<LLFolderViewScrollContainer>());
+ scroller_params.rect(scroller_view_rect);
+ scroller_params.name("folder_scroller");
+ mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
+ mScroller->setFollowsAll();
+
+ // Insert that scroller into the panel widgets hierarchy
+ mItemListPanel->addChild(mScroller);
+
+ // Create the root model
+ LLGLTFFolderItem* base_item = new LLGLTFFolderItem(mGLTFViewModel);
+
+ LLFolderView::Params p(LLUICtrlFactory::getDefaultParams<LLFolderView>());
+ p.name = "Root";
+ p.title = "Root";
+ p.rect = LLRect(0, 0, getRect().getWidth(), 0);
+ p.parent_panel = mItemListPanel;
+ p.tool_tip = p.name;
+ p.listener = base_item;
+ p.view_model = &mGLTFViewModel;
+ p.root = NULL;
+ p.use_ellipses = true;
+ p.options_menu = "menu_gltf.xml"; // *TODO : create this or fix to be optional
+ mFolderRoot = LLUICtrlFactory::create<LLFolderView>(p);
+ mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
+ mFolderRoot->setEnableRegistrar(&mEnableCallbackRegistrar);
+ // Attach root to the scroller
+ mScroller->addChild(mFolderRoot);
+ mFolderRoot->setScrollContainer(mScroller);
+ mFolderRoot->setFollowsAll();
+ mFolderRoot->setOpen(true);
+ mFolderRoot->setSelectCallback([this](const std::deque<LLFolderViewItem*>& items, bool user_action) { onFolderSelectionChanged(items, user_action); });
+ mScroller->setVisible(true);
+}
+
+void LLFloaterGLTFAssetEditor::onOpen(const LLSD& key)
+{
+ gIdleCallbacks.addFunction(idle, this);
+ loadFromSelection();
+}
+
+void LLFloaterGLTFAssetEditor::onClose(bool app_quitting)
+{
+ gIdleCallbacks.deleteFunction(idle, this);
+ mAsset = nullptr;
+ mObject = nullptr;
+}
+
+void LLFloaterGLTFAssetEditor::clearRoot()
+{
+ LLFolderViewFolder::folders_t::iterator folders_it = mFolderRoot->getFoldersBegin();
+ while (folders_it != mFolderRoot->getFoldersEnd())
+ {
+ (*folders_it)->destroyView();
+ folders_it = mFolderRoot->getFoldersBegin();
+ }
+ mNodeToItemMap.clear();
+}
+
+void LLFloaterGLTFAssetEditor::idle(void* user_data)
+{
+ LLFloaterGLTFAssetEditor* floater = (LLFloaterGLTFAssetEditor*)user_data;
+
+ if (floater->mFolderRoot)
+ {
+ floater->mFolderRoot->update();
+ }
+}
+
+void LLFloaterGLTFAssetEditor::loadItem(S32 id, const std::string& name, LLGLTFFolderItem::EType type, LLFolderViewFolder* parent)
+{
+ LLGLTFFolderItem* listener = new LLGLTFFolderItem(id, name, type, mGLTFViewModel);
+
+ LLFolderViewItem::Params params;
+ params.name(name);
+ params.creation_date(0);
+ params.root(mFolderRoot);
+ params.listener(listener);
+ params.rect(LLRect());
+ params.tool_tip = params.name;
+ params.font_color = mUIColor;
+ params.font_highlight_color = mUIColor;
+ LLFolderViewItem* view = LLUICtrlFactory::create<LLFolderViewItem>(params);
+
+ view->addToFolder(parent);
+ view->setVisible(true);
+}
+
+void LLFloaterGLTFAssetEditor::loadFromNode(S32 node_id, LLFolderViewFolder* parent)
+{
+ if (mAsset->mNodes.size() <= node_id)
+ {
+ return;
+ }
+
+ LL::GLTF::Node& node = mAsset->mNodes[node_id];
+
+ std::string name = node.mName;
+ if (node.mName.empty())
+ {
+ name = getString("node_tittle");
+ }
+ else
+ {
+ name = node.mName;
+ }
+
+ LLGLTFFolderItem* listener = new LLGLTFFolderItem(node_id, name, LLGLTFFolderItem::TYPE_NODE, mGLTFViewModel);
+
+ LLFolderViewFolder::Params p;
+ p.root = mFolderRoot;
+ p.listener = listener;
+ p.name = name;
+ p.tool_tip = name;
+ p.font_color = mUIColor;
+ p.font_highlight_color = mUIColor;
+ LLFolderViewFolder* view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+
+ view->addToFolder(parent);
+ view->setVisible(true);
+ view->setOpen(true);
+
+ mNodeToItemMap[node_id] = view;
+
+ for (S32& node_id : node.mChildren)
+ {
+ loadFromNode(node_id, view);
+ }
+
+ if (node.mMesh != LL::GLTF::INVALID_INDEX && mAsset->mMeshes.size() > node.mMesh)
+ {
+ std::string name = mAsset->mMeshes[node.mMesh].mName;
+ if (name.empty())
+ {
+ name = getString("mesh_tittle");
+ }
+ loadItem(node.mMesh, name, LLGLTFFolderItem::TYPE_MESH, view);
+ }
+
+ if (node.mSkin != LL::GLTF::INVALID_INDEX && mAsset->mSkins.size() > node.mSkin)
+ {
+ std::string name = mAsset->mSkins[node.mSkin].mName;
+ if (name.empty())
+ {
+ name = getString("skin_tittle");
+ }
+ loadItem(node.mSkin, name, LLGLTFFolderItem::TYPE_SKIN, view);
+ }
+
+ view->setChildrenInited(true);
+}
+
+void LLFloaterGLTFAssetEditor::loadFromSelection()
+{
+ clearRoot();
+
+ if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() != 1)
+ {
+ mAsset = nullptr;
+ mObject = nullptr;
+ return;
+ }
+
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(NULL);
+ LLViewerObject* objectp = node->getObject();
+ if (!objectp)
+ {
+ mAsset = nullptr;
+ mObject = nullptr;
+ return;
+ }
+
+ if (!objectp->mGLTFAsset)
+ {
+ mAsset = nullptr;
+ mObject = nullptr;
+ return;
+ }
+ mAsset = objectp->mGLTFAsset;
+ mObject = objectp;
+
+ if (node->mName.empty())
+ {
+ setTitle(getString("floater_title"));
+ }
+ else
+ {
+ setTitle(node->mName);
+ }
+
+ LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+ for (S32 i = 0; i < mAsset->mScenes.size(); i++)
+ {
+ LL::GLTF::Scene& scene = mAsset->mScenes[i];
+ std::string name = scene.mName;
+ if (scene.mName.empty())
+ {
+ name = getString("scene_tittle");
+ }
+ else
+ {
+ name = scene.mName;
+ }
+
+ LLGLTFFolderItem* listener = new LLGLTFFolderItem(i, name, LLGLTFFolderItem::TYPE_SCENE, mGLTFViewModel);
+
+ LLFolderViewFolder::Params p;
+ p.name = name;
+ p.root = mFolderRoot;
+ p.listener = listener;
+ p.tool_tip = name;
+ p.font_color = mUIColor;
+ p.font_highlight_color = mUIColor;
+ LLFolderViewFolder* view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+
+ view->addToFolder(mFolderRoot);
+ view->setVisible(true);
+ view->setOpen(true);
+
+ for (S32& node_id : scene.mNodes)
+ {
+ loadFromNode(node_id, view);
+ }
+ view->setChildrenInited(true);
+ }
+
+ mGLTFViewModel.requestSortAll();
+ mFolderRoot->setChildrenInited(true);
+ mFolderRoot->arrangeAll();
+ mFolderRoot->update();
+}
+
+void LLFloaterGLTFAssetEditor::dirty()
+{
+ if (!mObject || !mAsset || !mFolderRoot)
+ {
+ return;
+ }
+
+ if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 1)
+ {
+ if (getVisible())
+ {
+ closeFloater();
+ }
+ return;
+ }
+
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(NULL);
+ if (!node)
+ {
+ // not yet updated?
+ // Todo: Subscribe to deletion in some way
+ return;
+ }
+
+ LLViewerObject* objectp = node->getObject();
+ if (mObject != objectp || !objectp->mGLTFAsset)
+ {
+ if (getVisible())
+ {
+ closeFloater();
+ }
+ return;
+ }
+
+ if (mAsset != objectp->mGLTFAsset)
+ {
+ loadFromSelection();
+ return;
+ }
+
+ auto found = mNodeToItemMap.find(node->mSelectedGLTFNode);
+ if (found != mNodeToItemMap.end())
+ {
+ LLFolderViewItem* itemp = found->second;
+ itemp->arrangeAndSet(true, false);
+ loadNodeTransforms(node->mSelectedGLTFNode);
+ }
+}
+
+void LLFloaterGLTFAssetEditor::onFolderSelectionChanged(const std::deque<LLFolderViewItem*>& items, bool user_action)
+{
+ if (items.empty())
+ {
+ setTransformsEnabled(false);
+ return;
+ }
+
+ LLFolderViewItem* item = items.front();
+ LLGLTFFolderItem* vmi = static_cast<LLGLTFFolderItem*>(item->getViewModelItem());
+
+ switch (vmi->getType())
+ {
+ case LLGLTFFolderItem::TYPE_SCENE:
+ {
+ setTransformsEnabled(false);
+ LLSelectMgr::getInstance()->selectObjectOnly(mObject, SELECT_ALL_TES, -1, -1);
+ break;
+ }
+ case LLGLTFFolderItem::TYPE_NODE:
+ {
+ setTransformsEnabled(true);
+ loadNodeTransforms(vmi->getItemId());
+ LLSelectMgr::getInstance()->selectObjectOnly(mObject, SELECT_ALL_TES, vmi->getItemId(), 0);
+ break;
+ }
+ case LLGLTFFolderItem::TYPE_MESH:
+ case LLGLTFFolderItem::TYPE_SKIN:
+ {
+ if (item->getParent()) // should be a node
+ {
+ LLFolderViewFolder* parent = item->getParentFolder();
+ LLGLTFFolderItem* parent_vmi = static_cast<LLGLTFFolderItem*>(parent->getViewModelItem());
+ LLSelectMgr::getInstance()->selectObjectOnly(mObject, SELECT_ALL_TES, parent_vmi->getItemId(), 0);
+ }
+
+ setTransformsEnabled(false);
+ break;
+ }
+ default:
+ {
+ setTransformsEnabled(false);
+ break;
+ }
+ }
+}
+
+void LLFloaterGLTFAssetEditor::setTransformsEnabled(bool val)
+{
+ mMenuClipboardPos->setEnabled(val);
+ mCtrlPosX->setEnabled(val);
+ mCtrlPosY->setEnabled(val);
+ mCtrlPosZ->setEnabled(val);
+ mMenuClipboardScale->setEnabled(val);
+ mCtrlScaleX->setEnabled(val);
+ mCtrlScaleY->setEnabled(val);
+ mCtrlScaleZ->setEnabled(val);
+ mMenuClipboardRot->setEnabled(val);
+ mCtrlRotX->setEnabled(val);
+ mCtrlRotY->setEnabled(val);
+ mCtrlRotZ->setEnabled(val);
+}
+
+void LLFloaterGLTFAssetEditor::loadNodeTransforms(S32 node_id)
+{
+ if (node_id < 0 || node_id >= mAsset->mNodes.size())
+ {
+ LL_ERRS() << "Node id out of range: " << node_id << LL_ENDL;
+ return;
+ }
+
+ LL::GLTF::Node& node = mAsset->mNodes[node_id];
+ node.makeTRSValid();
+
+ mCtrlPosX->set(node.mTranslation[0]);
+ mCtrlPosY->set(node.mTranslation[1]);
+ mCtrlPosZ->set(node.mTranslation[2]);
+
+ mCtrlScaleX->set(node.mScale[0]);
+ mCtrlScaleY->set(node.mScale[1]);
+ mCtrlScaleZ->set(node.mScale[2]);
+
+ LLQuaternion object_rot = LLQuaternion(node.mRotation[0], node.mRotation[1], node.mRotation[2], node.mRotation[3]);
+ object_rot.getEulerAngles(&(mLastEulerDegrees.mV[VX]), &(mLastEulerDegrees.mV[VY]), &(mLastEulerDegrees.mV[VZ]));
+ mLastEulerDegrees *= RAD_TO_DEG;
+ mLastEulerDegrees.mV[VX] = fmod(ll_round(mLastEulerDegrees.mV[VX], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+ mLastEulerDegrees.mV[VY] = fmod(ll_round(mLastEulerDegrees.mV[VY], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+ mLastEulerDegrees.mV[VZ] = fmod(ll_round(mLastEulerDegrees.mV[VZ], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+
+ mCtrlRotX->set(mLastEulerDegrees.mV[VX]);
+ mCtrlRotY->set(mLastEulerDegrees.mV[VY]);
+ mCtrlRotZ->set(mLastEulerDegrees.mV[VZ]);
+}
+
+void LLFloaterGLTFAssetEditor::onCommitTransform()
+{
+ if (!mFolderRoot)
+ {
+ LL_ERRS() << "Folder root not initialized" << LL_ENDL;
+ return;
+ }
+
+ LLFolderViewItem* item = mFolderRoot->getCurSelectedItem();
+ if (!item)
+ {
+ LL_ERRS() << "Nothing selected" << LL_ENDL;
+ return;
+ }
+
+ LLGLTFFolderItem* vmi = static_cast<LLGLTFFolderItem*>(item->getViewModelItem());
+
+ if (!vmi || vmi->getType() != LLGLTFFolderItem::TYPE_NODE)
+ {
+ LL_ERRS() << "Only nodes implemented" << LL_ENDL;
+ return;
+ }
+ S32 node_id = vmi->getItemId();
+ LL::GLTF::Node& node = mAsset->mNodes[node_id];
+
+ LL::GLTF::vec3 tr(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
+ node.setTranslation(tr);
+
+ LL::GLTF::vec3 scale(mCtrlScaleX->get(), mCtrlScaleY->get(), mCtrlScaleZ->get());
+ node.setScale(scale);
+
+ LLVector3 new_rot(mCtrlRotX->get(), mCtrlRotY->get(), mCtrlRotZ->get());
+ new_rot.mV[VX] = ll_round(new_rot.mV[VX], OBJECT_ROTATION_PRECISION);
+ new_rot.mV[VY] = ll_round(new_rot.mV[VY], OBJECT_ROTATION_PRECISION);
+ new_rot.mV[VZ] = ll_round(new_rot.mV[VZ], OBJECT_ROTATION_PRECISION);
+
+ // Note: must compare before conversion to radians, some value can go 'around' 360
+ LLVector3 delta = new_rot - mLastEulerDegrees;
+
+ if (delta.magVec() >= 0.0005f)
+ {
+ mLastEulerDegrees = new_rot;
+ new_rot *= DEG_TO_RAD;
+
+ LLQuaternion rotation;
+ rotation.setQuat(new_rot.mV[VX], new_rot.mV[VY], new_rot.mV[VZ]);
+ LL::GLTF::quat q;
+ q[0] = rotation.mQ[VX];
+ q[1] = rotation.mQ[VY];
+ q[2] = rotation.mQ[VZ];
+ q[3] = rotation.mQ[VW];
+
+ node.setRotation(q);
+ }
+
+ mAsset->updateTransforms();
+}
+
+void LLFloaterGLTFAssetEditor::onMenuDoToSelected(const LLSD& userdata)
+{
+ std::string command = userdata.asString();
+
+ if (command == "psr_paste")
+ {
+ // todo: implement
+ // onPastePos();
+ // onPasteSize();
+ // onPasteRot();
+ }
+ else if (command == "pos_paste")
+ {
+ // todo: implement
+ }
+ else if (command == "size_paste")
+ {
+ // todo: implement
+ }
+ else if (command == "rot_paste")
+ {
+ // todo: implement
+ }
+ else if (command == "psr_copy")
+ {
+ // onCopyPos();
+ // onCopySize();
+ // onCopyRot();
+ }
+ else if (command == "pos_copy")
+ {
+ // todo: implement
+ }
+ else if (command == "size_copy")
+ {
+ // todo: implement
+ }
+ else if (command == "rot_copy")
+ {
+ // todo: implement
+ }
+}
+
+bool LLFloaterGLTFAssetEditor::onMenuEnableItem(const LLSD& userdata)
+{
+ if (!mFolderRoot)
+ {
+ return false;
+ }
+
+ LLFolderViewItem* item = mFolderRoot->getCurSelectedItem();
+ if (!item)
+ {
+ return false;
+ }
+
+ LLGLTFFolderItem* vmi = static_cast<LLGLTFFolderItem*>(item->getViewModelItem());
+
+ if (!vmi || vmi->getType() != LLGLTFFolderItem::TYPE_NODE)
+ {
+ return false;
+ }
+
+ std::string command = userdata.asString();
+ if (command == "pos_paste" || command == "size_paste" || command == "rot_paste")
+ {
+ // todo: implement
+ return true;
+ }
+ if (command == "psr_copy")
+ {
+ // todo: implement
+ return true;
+ }
+
+ return false;
+}
+
diff --git a/indra/newview/llfloatergltfasseteditor.h b/indra/newview/llfloatergltfasseteditor.h
new file mode 100644
index 0000000000..b0ba8941b9
--- /dev/null
+++ b/indra/newview/llfloatergltfasseteditor.h
@@ -0,0 +1,109 @@
+/**
+ * @file llfloatergltfasseteditor.h
+ * @author Andrii Kleshchev
+ * @brief LLFloaterGltfAssetEditor header file
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERGLTFASSETEDITOR_H
+#define LL_LLFLOATERGLTFASSETEDITOR_H
+
+#include "llfloater.h"
+
+#include "llgltffoldermodel.h"
+
+namespace LL
+{
+ namespace GLTF
+ {
+ class Asset;
+ }
+}
+
+class LLSpinCtrl;
+class LLMenuButton;
+class LLViewerObject;
+
+class LLFloaterGLTFAssetEditor : public LLFloater
+{
+public:
+ LLFloaterGLTFAssetEditor(const LLSD& key);
+ ~LLFloaterGLTFAssetEditor();
+
+ bool postBuild() override;
+ void onOpen(const LLSD& key) override;
+ void onClose(bool app_quitting) override;
+ void initFolderRoot();
+
+ LLGLTFViewModel& getRootViewModel() { return mGLTFViewModel; }
+
+ static void idle(void* user_data);
+ void loadItem(S32 id, const std::string& name, LLGLTFFolderItem::EType type, LLFolderViewFolder* parent);
+ void loadFromNode(S32 node, LLFolderViewFolder* parent);
+ void loadFromSelection();
+
+ void dirty();
+
+protected:
+ void onFolderSelectionChanged(const std::deque<LLFolderViewItem*>& items, bool user_action);
+ void onCommitTransform();
+ void onMenuDoToSelected(const LLSD& userdata);
+ bool onMenuEnableItem(const LLSD& userdata);
+
+ void setTransformsEnabled(bool val);
+ void loadNodeTransforms(S32 id);
+
+ void clearRoot();
+
+private:
+
+ LLPointer<LLViewerObject> mObject;
+ std::shared_ptr<LL::GLTF::Asset> mAsset;
+
+ // Folder view related
+ LLUIColor mUIColor;
+ LLGLTFViewModel mGLTFViewModel;
+ LLPanel* mItemListPanel = nullptr;
+ LLFolderView* mFolderRoot = nullptr;
+ LLScrollContainer* mScroller = nullptr;
+ std::map<S32, LLFolderViewItem*> mNodeToItemMap;
+
+ // Transforms panel
+ LLVector3 mLastEulerDegrees;
+
+ LLPanel* mTransformsPanel = nullptr;
+ LLMenuButton* mMenuClipboardPos = nullptr;
+ LLSpinCtrl* mCtrlPosX = nullptr;
+ LLSpinCtrl* mCtrlPosY = nullptr;
+ LLSpinCtrl* mCtrlPosZ = nullptr;
+ LLMenuButton* mMenuClipboardScale = nullptr;
+ LLSpinCtrl* mCtrlScaleX = nullptr;
+ LLSpinCtrl* mCtrlScaleY = nullptr;
+ LLSpinCtrl* mCtrlScaleZ = nullptr;
+ LLMenuButton* mMenuClipboardRot = nullptr;
+ LLSpinCtrl* mCtrlRotX = nullptr;
+ LLSpinCtrl* mCtrlRotY = nullptr;
+ LLSpinCtrl* mCtrlRotZ = nullptr;
+};
+
+#endif
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index ea49c88755..a900e04707 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -671,7 +671,7 @@ bool LLImagePreviewAvatar::render()
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.loadIdentity();
- gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.ortho(0.0f, (F32)mFullWidth, 0.0f, (F32)mFullHeight, -1.0f, 1.0f);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
@@ -875,7 +875,7 @@ bool LLImagePreviewSculpted::render()
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.loadIdentity();
- gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.ortho(0.0f, (F32)mFullWidth, 0.0f, (F32)mFullHeight, -1.0f, 1.0f);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index cf66507a66..abf15ea9cf 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -112,6 +112,18 @@ LLFloaterIMContainer::~LLFloaterIMContainer()
{
LLIMMgr::getInstance()->removeSessionObserver(this);
}
+
+ for (auto& session : mConversationsItems)
+ {
+ LLConversationItemSession* session_model = dynamic_cast<LLConversationItemSession*>(session.second.get());
+ if (session_model)
+ {
+ // Models have overcomplicated double ownership, clear
+ // and resolve '0 references' ownership now, before owned
+ // part of the models gets deleted by their owners
+ session_model->clearAndDeparentModels();
+ }
+ }
}
void LLFloaterIMContainer::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, bool has_offline_msg)
diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp
index ef7ec9e950..c920a3c898 100644
--- a/indra/newview/llfloaterimnearbychathandler.cpp
+++ b/indra/newview/llfloaterimnearbychathandler.cpp
@@ -152,7 +152,6 @@ protected:
toast_list_t m_toast_pool;
bool mStopProcessing;
- bool mChannelRect;
};
@@ -263,8 +262,8 @@ bool LLFloaterIMNearbyChatScreenChannel::createPoolToast()
LLToast::Params p;
p.panel = panel;
- p.lifetime_secs = gSavedSettings.getS32("NearbyToastLifeTime");
- p.fading_time_secs = gSavedSettings.getS32("NearbyToastFadingTime");
+ p.lifetime_secs = (F32)gSavedSettings.getS32("NearbyToastLifeTime");
+ p.fading_time_secs = (F32)gSavedSettings.getS32("NearbyToastFadingTime");
LLToast* toast = new LLFloaterIMNearbyChatToast(p, this);
@@ -287,7 +286,7 @@ void LLFloaterIMNearbyChatScreenChannel::addChat(LLSD& chat)
if (mFloaterSnapRegion == NULL)
{
- mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ mFloaterSnapRegion = gViewerWindow->getFloaterSnapRegion();
}
LLRect channel_rect;
mFloaterSnapRegion->localRectToOtherView(mFloaterSnapRegion->getLocalRect(), &channel_rect, gFloaterView);
@@ -377,7 +376,7 @@ void LLFloaterIMNearbyChatScreenChannel::arrangeToasts()
if (mFloaterSnapRegion == NULL)
{
- mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ mFloaterSnapRegion = gViewerWindow->getFloaterSnapRegion();
}
if (!getParent())
@@ -535,14 +534,13 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
if (gSavedSettings.getS32("ShowScriptErrorsLocation") == 1)// show error in window //("ScriptErrorsAsChat"))
{
-
- LLColor4 txt_color;
-
- LLViewerChat::getChatColor(chat_msg,txt_color);
+ LLUIColor txt_color;
+ F32 alpha = 1.f;
+ LLViewerChat::getChatColor(chat_msg, txt_color, alpha);
LLFloaterScriptDebug::addScriptLine(chat_msg.mText,
chat_msg.mFromName,
- txt_color,
+ txt_color % alpha,
chat_msg.mFromID);
return;
}
@@ -643,8 +641,18 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
}
}
+ std::string user_preferences;
+ if (chat_msg.mSourceType == CHAT_SOURCE_OBJECT)
+ {
+ user_preferences = gSavedSettings.getString("NotificationObjectIMOptions");
+ }
+ else
+ {
+ user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions");
+ }
+
//Will show toast when chat preference is set
- if((gSavedSettings.getString("NotificationNearbyChatOptions") == "toast") || !nearby_chat->isMessagePaneExpanded())
+ if((user_preferences == "toast") || !nearby_chat->isMessagePaneExpanded())
{
// Add a nearby chat toast.
LLUUID id;
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index a74622faec..2621ce576c 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -262,6 +262,7 @@ bool LLFloaterIMSessionTab::postBuild()
{
bool result;
+ mContentsView = getChild<LLView>("contents_view");
mBodyStack = getChild<LLLayoutStack>("main_stack");
mParticipantListAndHistoryStack = getChild<LLLayoutStack>("im_panels");
@@ -867,7 +868,6 @@ void LLFloaterIMSessionTab::hideOrShowTitle()
{
const LLFloater::Params& default_params = LLFloater::getDefaultParams();
S32 floater_header_size = default_params.header_height;
- LLView* floater_contents = getChild<LLView>("contents_view");
LLRect floater_rect = getLocalRect();
S32 top_border_of_contents = floater_rect.mTop - (isTornOff()? floater_header_size : 0);
@@ -875,7 +875,7 @@ void LLFloaterIMSessionTab::hideOrShowTitle()
LLRect contents_rect (0, top_border_of_contents, floater_rect.mRight, floater_rect.mBottom);
mDragHandle->setShape(handle_rect);
mDragHandle->setVisible(isTornOff());
- floater_contents->setShape(contents_rect);
+ mContentsView->setShape(contents_rect);
}
void LLFloaterIMSessionTab::updateSessionName(const std::string& name)
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
index 9ca9b8444d..6dd8e62482 100644
--- a/indra/newview/llfloaterimsessiontab.h
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -165,6 +165,7 @@ protected:
LLConversationViewParticipant* createConversationViewParticipant(LLConversationItem* item);
LLUUID mSessionID;
+ LLView* mContentsView;
LLLayoutStack* mBodyStack;
LLLayoutStack* mParticipantListAndHistoryStack;
LLLayoutPanel* mParticipantListPanel; // add the widgets to that see mConversationsListPanel
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp
index 7db3621a4b..68b11ec92b 100644
--- a/indra/newview/llfloaterjoystick.cpp
+++ b/indra/newview/llfloaterjoystick.cpp
@@ -93,8 +93,9 @@ BOOL CALLBACK di8_list_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr,
#endif
LLFloaterJoystick::LLFloaterJoystick(const LLSD& data)
- : LLFloater(data),
- mHasDeviceList(false)
+ : LLFloater(data)
+ , mHasDeviceList(false)
+ , mJoystickInitialized(false)
{
if (!LLViewerJoystick::getInstance()->isJoystickInitialized())
{
@@ -108,7 +109,10 @@ void LLFloaterJoystick::draw()
{
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
bool joystick_inited = joystick->isJoystickInitialized();
- if (joystick_inited != mHasDeviceList)
+ if (!mHasDeviceList
+ || mJoystickInitialized != joystick_inited
+ || (joystick->isDeviceUUIDSet() && joystick->getDeviceUUID().asUUID() != mCurrentDeviceId)
+ || (!joystick->isDeviceUUIDSet() && mCurrentDeviceId.notNull()))
{
refreshListOfDevices();
}
@@ -290,15 +294,16 @@ void LLFloaterJoystick::refreshListOfDevices()
mHasDeviceList = true;
}
- bool is_device_id_set = LLViewerJoystick::getInstance()->isDeviceUUIDSet();
+ LLViewerJoystick* joystick = LLViewerJoystick::getInstance();
+ bool is_device_id_set = joystick->isDeviceUUIDSet();
- if (LLViewerJoystick::getInstance()->isJoystickInitialized() &&
+ if (joystick->isJoystickInitialized() &&
(!mHasDeviceList || !is_device_id_set))
{
#if LL_WINDOWS && !LL_MESA_HEADLESS
LL_WARNS() << "NDOF connected to device without using SL provided handle" << LL_ENDL;
#endif
- std::string desc = LLViewerJoystick::getInstance()->getDescription();
+ std::string desc = joystick->getDescription();
if (!desc.empty())
{
LLSD value = LLSD::Integer(1); // value for selection
@@ -311,11 +316,13 @@ void LLFloaterJoystick::refreshListOfDevices()
{
if (is_device_id_set)
{
- LLSD guid = LLViewerJoystick::getInstance()->getDeviceUUID();
+ LLSD guid = joystick->getDeviceUUID();
+ mCurrentDeviceId = guid.asUUID();
mJoysticksCombo->selectByValue(guid);
}
else
{
+ mCurrentDeviceId.setNull();
mJoysticksCombo->selectByValue(LLSD::Integer(1));
}
}
@@ -323,6 +330,18 @@ void LLFloaterJoystick::refreshListOfDevices()
{
mJoysticksCombo->selectByValue(LLSD::Integer(0));
}
+
+ // Update tracking
+ if (is_device_id_set)
+ {
+ LLSD guid = joystick->getDeviceUUID();
+ mCurrentDeviceId = guid.asUUID();
+ }
+ else
+ {
+ mCurrentDeviceId.setNull();
+ }
+ mJoystickInitialized = joystick->isJoystickInitialized();
}
void LLFloaterJoystick::cancel()
diff --git a/indra/newview/llfloaterjoystick.h b/indra/newview/llfloaterjoystick.h
index b94223a738..c7e727635d 100644
--- a/indra/newview/llfloaterjoystick.h
+++ b/indra/newview/llfloaterjoystick.h
@@ -95,6 +95,8 @@ private:
LLComboBox *mJoysticksCombo;
bool mHasDeviceList;
+ bool mJoystickInitialized;
+ LLUUID mCurrentDeviceId;
// stats view
LLStatBar* mAxisStatsBar[6];
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 9a794d1775..bec76fe5e4 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1706,7 +1706,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
object_count_str = llformat("%d", object_count);
item_params.columns.add().value(object_count_str).font(FONT).column("count");
- item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");
+ item_params.columns.add().value(LLDate((double)most_recent_time)).font(FONT).column("mostrecent").type("date");
self->mOwnerList->addNameItemRow(item_params);
LL_DEBUGS() << "object owner " << owner_id << " (" << (is_group_owned ? "group" : "agent")
@@ -2443,19 +2443,34 @@ LLPanelLandAccess::LLPanelLandAccess(LLParcelSelectionHandle& parcel)
bool LLPanelLandAccess::postBuild()
{
- childSetCommitCallback("public_access", onCommitPublicAccess, this);
- childSetCommitCallback("limit_payment", onCommitAny, this);
- childSetCommitCallback("limit_age_verified", onCommitAny, this);
- childSetCommitCallback("GroupCheck", onCommitGroupCheck, this);
- childSetCommitCallback("PassCheck", onCommitAny, this);
- childSetCommitCallback("pass_combo", onCommitAny, this);
- childSetCommitCallback("PriceSpin", onCommitAny, this);
- childSetCommitCallback("HoursSpin", onCommitAny, this);
-
- childSetAction("add_allowed", boost::bind(&LLPanelLandAccess::onClickAddAccess, this));
- childSetAction("remove_allowed", onClickRemoveAccess, this);
- childSetAction("add_banned", boost::bind(&LLPanelLandAccess::onClickAddBanned, this));
- childSetAction("remove_banned", onClickRemoveBanned, this);
+ mPaymentInfoCheck = getChild<LLUICtrl>("limit_payment");
+ mPaymentInfoCheck->setCommitCallback(onCommitAny, this);
+ mAgeVerifiedCheck = getChild<LLUICtrl>("limit_age_verified");
+ mAgeVerifiedCheck->setCommitCallback(onCommitAny, this);
+ mTemporaryPassCheck = getChild<LLUICtrl>("PassCheck");
+ mTemporaryPassCheck->setCommitCallback(onCommitAny, this);
+ mPublicAccessCheck = getChild<LLUICtrl>("public_access");
+ mPublicAccessCheck->setCommitCallback(onCommitPublicAccess, this);
+ mGroupAccessCheck = getChild<LLUICtrl>("GroupCheck");
+ mGroupAccessCheck->setCommitCallback(onCommitGroupCheck, this);
+ mTemporaryPassCombo = getChild<LLComboBox>("pass_combo");
+ mGroupAccessCheck->setCommitCallback(onCommitAny, this);
+ mTemporaryPassPriceSpin = getChild<LLUICtrl>("PriceSpin");
+ mGroupAccessCheck->setCommitCallback(onCommitAny, this);
+ mTemporaryPassHourSpin = getChild<LLUICtrl>("HoursSpin");
+ mGroupAccessCheck->setCommitCallback(onCommitAny, this);
+
+ mAllowText = getChild<LLUICtrl>("AllowedText");
+ mBanText = getChild<LLUICtrl>("BanCheck");
+
+ mBtnAddAllowed = getChild<LLButton>("add_allowed");
+ mBtnAddAllowed->setCommitCallback(boost::bind(&LLPanelLandAccess::onClickAddAccess, this));
+ mBtnRemoveAllowed = getChild<LLButton>("remove_allowed");
+ mBtnRemoveAllowed->setCommitCallback(boost::bind(&LLPanelLandAccess::onClickRemoveAccess, this));
+ mBtnAddBanned = getChild<LLButton>("add_banned");
+ mBtnAddBanned->setCommitCallback(boost::bind(&LLPanelLandAccess::onClickAddBanned, this));
+ mBtnRemoveBanned = getChild<LLButton>("remove_banned");
+ mBtnRemoveBanned->setCommitCallback(boost::bind(&LLPanelLandAccess::onClickRemoveBanned, this));
mListAccess = getChild<LLNameListCtrl>("AccessList");
if (mListAccess)
@@ -2494,17 +2509,17 @@ void LLPanelLandAccess::refresh()
if (parcel->getRegionAllowAccessOverride())
{
- getChild<LLUICtrl>("public_access")->setValue(public_access);
- getChild<LLUICtrl>("GroupCheck")->setValue(use_group);
+ mPublicAccessCheck->setValue(public_access);
+ mGroupAccessCheck->setValue(use_group);
}
else
{
- getChild<LLUICtrl>("public_access")->setValue(true);
- getChild<LLUICtrl>("GroupCheck")->setValue(false);
+ mPublicAccessCheck->setValue(true);
+ mGroupAccessCheck->setValue(false);
}
std::string group_name;
gCacheName->getGroupName(parcel->getGroupID(), group_name);
- getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", group_name );
+ mGroupAccessCheck->setLabelArg("[GROUP]", group_name );
// Allow list
if (mListAccess)
@@ -2513,11 +2528,11 @@ void LLPanelLandAccess::refresh()
mListAccess->clearSortOrder();
mListAccess->deleteAllItems();
auto count = parcel->mAccessList.size();
- getChild<LLUICtrl>("AllowedText")->setTextArg("[COUNT]", llformat("%d",count));
- getChild<LLUICtrl>("AllowedText")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
+ mAllowText->setTextArg("[COUNT]", llformat("%d", count));
+ mAllowText->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
- getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
- getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
+ mListAccess->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
+ mListAccess->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
for (LLAccessEntry::map::const_iterator cit = parcel->mAccessList.begin();
cit != parcel->mAccessList.end(); ++cit)
@@ -2527,7 +2542,7 @@ void LLPanelLandAccess::refresh()
if (entry.mTime != 0)
{
LLStringUtil::format_map_t args;
- S32 now = time(NULL);
+ S32 now = (S32)time(NULL);
S32 seconds = entry.mTime - now;
if (seconds < 0) seconds = 0;
prefix.assign(" (");
@@ -2561,11 +2576,11 @@ void LLPanelLandAccess::refresh()
mListBanned->clearSortOrder();
mListBanned->deleteAllItems();
auto count = parcel->mBanList.size();
- getChild<LLUICtrl>("BanCheck")->setTextArg("[COUNT]", llformat("%d",count));
- getChild<LLUICtrl>("BanCheck")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
+ mBanText->setTextArg("[COUNT]", llformat("%d",count));
+ mBanText->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
- getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
- getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
+ mListBanned->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
+ mListBanned->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
for (LLAccessEntry::map::const_iterator cit = parcel->mBanList.begin();
cit != parcel->mBanList.end(); ++cit)
@@ -2576,7 +2591,7 @@ void LLPanelLandAccess::refresh()
if (entry.mTime != 0)
{
LLStringUtil::format_map_t args;
- S32 now = time(NULL);
+ S32 now = (S32)time(NULL);
seconds = entry.mTime - now;
if (seconds < 0) seconds = 0;
@@ -2622,75 +2637,74 @@ void LLPanelLandAccess::refresh()
if(parcel->getRegionDenyAnonymousOverride())
{
- getChild<LLUICtrl>("limit_payment")->setValue(true);
- getChild<LLUICtrl>("limit_payment")->setLabelArg("[ESTATE_PAYMENT_LIMIT]", getString("access_estate_defined") );
+ mPaymentInfoCheck->setValue(true);
+ mPaymentInfoCheck->setLabelArg("[ESTATE_PAYMENT_LIMIT]", getString("access_estate_defined") );
}
else
{
- getChild<LLUICtrl>("limit_payment")->setValue((parcel->getParcelFlag(PF_DENY_ANONYMOUS)));
- getChild<LLUICtrl>("limit_payment")->setLabelArg("[ESTATE_PAYMENT_LIMIT]", std::string() );
+ mPaymentInfoCheck->setValue((parcel->getParcelFlag(PF_DENY_ANONYMOUS)));
+ mPaymentInfoCheck->setLabelArg("[ESTATE_PAYMENT_LIMIT]", std::string() );
}
if(parcel->getRegionDenyAgeUnverifiedOverride())
{
- getChild<LLUICtrl>("limit_age_verified")->setValue(true);
- getChild<LLUICtrl>("limit_age_verified")->setLabelArg("[ESTATE_AGE_LIMIT]", getString("access_estate_defined") );
+ mAgeVerifiedCheck->setValue(true);
+ mAgeVerifiedCheck->setLabelArg("[ESTATE_AGE_LIMIT]", getString("access_estate_defined") );
}
else
{
- getChild<LLUICtrl>("limit_age_verified")->setValue((parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED)));
- getChild<LLUICtrl>("limit_age_verified")->setLabelArg("[ESTATE_AGE_LIMIT]", std::string() );
+ mAgeVerifiedCheck->setValue((parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED)));
+ mAgeVerifiedCheck->setLabelArg("[ESTATE_AGE_LIMIT]", std::string() );
}
bool use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
- getChild<LLUICtrl>("PassCheck")->setValue(use_pass);
- LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");
- if (passcombo)
+ mTemporaryPassCheck->setValue(use_pass);
+ if (mTemporaryPassCombo)
{
if (public_access || !use_pass)
{
- passcombo->selectByValue("anyone");
+ mTemporaryPassCombo->selectByValue("anyone");
}
}
S32 pass_price = parcel->getPassPrice();
- getChild<LLUICtrl>("PriceSpin")->setValue((F32)pass_price );
+ mTemporaryPassPriceSpin->setValue((F32)pass_price);
F32 pass_hours = parcel->getPassHours();
- getChild<LLUICtrl>("HoursSpin")->setValue(pass_hours );
+ mTemporaryPassHourSpin->setValue(pass_hours);
}
else
{
- getChild<LLUICtrl>("public_access")->setValue(false);
- getChild<LLUICtrl>("limit_payment")->setValue(false);
- getChild<LLUICtrl>("limit_age_verified")->setValue(false);
- getChild<LLUICtrl>("GroupCheck")->setValue(false);
- getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", LLStringUtil::null );
- getChild<LLUICtrl>("PassCheck")->setValue(false);
- getChild<LLUICtrl>("PriceSpin")->setValue((F32)PARCEL_PASS_PRICE_DEFAULT);
- getChild<LLUICtrl>("HoursSpin")->setValue(PARCEL_PASS_HOURS_DEFAULT );
- getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",0));
- getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",0));
- getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",0));
- getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",0));
+ mPublicAccessCheck->setValue(false);
+ mPaymentInfoCheck->setValue(false);
+ mAgeVerifiedCheck->setValue(false);
+ mGroupAccessCheck->setValue(false);
+ mGroupAccessCheck->setLabelArg("[GROUP]", LLStringUtil::null );
+ mTemporaryPassCheck->setValue(false);
+ mTemporaryPassPriceSpin->setValue((F32)PARCEL_PASS_PRICE_DEFAULT);
+ mTemporaryPassHourSpin->setValue(PARCEL_PASS_HOURS_DEFAULT );
+ mListAccess->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",0));
+ mListAccess->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",0));
+ mListBanned->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",0));
+ mListBanned->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",0));
}
}
void LLPanelLandAccess::refresh_ui()
{
- getChildView("public_access")->setEnabled(false);
- getChildView("limit_payment")->setEnabled(false);
- getChildView("limit_age_verified")->setEnabled(false);
- getChildView("GroupCheck")->setEnabled(false);
- getChildView("PassCheck")->setEnabled(false);
- getChildView("pass_combo")->setEnabled(false);
- getChildView("PriceSpin")->setEnabled(false);
- getChildView("HoursSpin")->setEnabled(false);
- getChildView("AccessList")->setEnabled(false);
- getChildView("BannedList")->setEnabled(false);
- getChildView("add_allowed")->setEnabled(false);
- getChildView("remove_allowed")->setEnabled(false);
- getChildView("add_banned")->setEnabled(false);
- getChildView("remove_banned")->setEnabled(false);
+ mPublicAccessCheck->setEnabled(false);
+ mPaymentInfoCheck->setEnabled(false);
+ mAgeVerifiedCheck->setEnabled(false);
+ mGroupAccessCheck->setEnabled(false);
+ mTemporaryPassCheck->setEnabled(false);
+ mTemporaryPassCombo->setEnabled(false);
+ mTemporaryPassPriceSpin->setEnabled(false);
+ mTemporaryPassHourSpin->setEnabled(false);
+ mListAccess->setEnabled(false);
+ mListBanned->setEnabled(false);
+ mBtnAddAllowed->setEnabled(false);
+ mBtnRemoveAllowed->setEnabled(false);
+ mBtnAddBanned->setEnabled(false);
+ mBtnRemoveBanned->setEnabled(false);
LLParcel *parcel = mParcel->getParcel();
if (parcel && !gDisconnected)
@@ -2703,73 +2717,64 @@ void LLPanelLandAccess::refresh_ui()
can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED);
}
- getChildView("public_access")->setEnabled(can_manage_allowed);
- bool public_access = getChild<LLUICtrl>("public_access")->getValue().asBoolean();
+ mPublicAccessCheck->setEnabled(can_manage_allowed);
+ bool public_access = mPublicAccessCheck->getValue().asBoolean();
if (public_access)
{
bool override = false;
if(parcel->getRegionDenyAnonymousOverride())
{
override = true;
- getChildView("limit_payment")->setEnabled(false);
+ mPaymentInfoCheck->setEnabled(false);
}
else
{
- getChildView("limit_payment")->setEnabled(can_manage_allowed);
+ mPaymentInfoCheck->setEnabled(can_manage_allowed);
}
if(parcel->getRegionDenyAgeUnverifiedOverride())
{
override = true;
- getChildView("limit_age_verified")->setEnabled(false);
+ mAgeVerifiedCheck->setEnabled(false);
}
else
{
- getChildView("limit_age_verified")->setEnabled(can_manage_allowed);
- }
- if (override)
- {
- getChildView("Only Allow")->setToolTip(getString("estate_override"));
+ mAgeVerifiedCheck->setEnabled(can_manage_allowed);
}
- else
- {
- getChildView("Only Allow")->setToolTip(std::string());
- }
- getChildView("PassCheck")->setEnabled(false);
- getChildView("pass_combo")->setEnabled(false);
- getChildView("AccessList")->setEnabled(false);
+ mTemporaryPassCheck->setEnabled(false);
+ mTemporaryPassCombo->setEnabled(false);
+ mListAccess->setEnabled(false);
}
else
{
- getChildView("limit_payment")->setEnabled(false);
- getChildView("limit_age_verified")->setEnabled(false);
-
+ mPaymentInfoCheck->setEnabled(false);
+ mAgeVerifiedCheck->setEnabled(false);
- bool sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
- getChildView("PassCheck")->setEnabled(can_manage_allowed);
+ bool sell_passes = mTemporaryPassCheck->getValue().asBoolean();
+ mTemporaryPassCheck->setEnabled(can_manage_allowed);
if (sell_passes)
{
- getChildView("pass_combo")->setEnabled(can_manage_allowed);
- getChildView("PriceSpin")->setEnabled(can_manage_allowed);
- getChildView("HoursSpin")->setEnabled(can_manage_allowed);
+ mTemporaryPassCombo->setEnabled(can_manage_allowed);
+ mTemporaryPassPriceSpin->setEnabled(can_manage_allowed);
+ mTemporaryPassHourSpin->setEnabled(can_manage_allowed);
}
}
std::string group_name;
if (gCacheName->getGroupName(parcel->getGroupID(), group_name))
{
- bool can_allow_groups = !public_access || (public_access && (getChild<LLUICtrl>("limit_payment")->getValue().asBoolean() ^ getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()));
- getChildView("GroupCheck")->setEnabled(can_manage_allowed && can_allow_groups);
+ bool can_allow_groups = !public_access || (public_access && (mPaymentInfoCheck->getValue().asBoolean() ^ mAgeVerifiedCheck->getValue().asBoolean()));
+ mGroupAccessCheck->setEnabled(can_manage_allowed && can_allow_groups);
}
- getChildView("AccessList")->setEnabled(can_manage_allowed);
+ mListAccess->setEnabled(can_manage_allowed);
auto allowed_list_count = parcel->mAccessList.size();
- getChildView("add_allowed")->setEnabled(can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST);
+ mBtnAddAllowed->setEnabled(can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST);
bool has_selected = (mListAccess && mListAccess->getSelectionInterface()->getFirstSelectedIndex() >= 0);
- getChildView("remove_allowed")->setEnabled(can_manage_allowed && has_selected);
+ mBtnRemoveAllowed->setEnabled(can_manage_allowed && has_selected);
- getChildView("BannedList")->setEnabled(can_manage_banned);
+ mListBanned->setEnabled(can_manage_banned);
auto banned_list_count = parcel->mBanList.size();
- getChildView("add_banned")->setEnabled(can_manage_banned && banned_list_count < PARCEL_MAX_ACCESS_LIST);
+ mBtnAddBanned->setEnabled(can_manage_banned && banned_list_count < PARCEL_MAX_ACCESS_LIST);
has_selected = (mListBanned && mListBanned->getSelectionInterface()->getFirstSelectedIndex() >= 0);
- getChildView("remove_banned")->setEnabled(can_manage_banned && has_selected);
+ mBtnRemoveBanned->setEnabled(can_manage_banned && has_selected);
}
}
@@ -2783,7 +2788,7 @@ void LLPanelLandAccess::refreshNames()
{
gCacheName->getGroupName(parcel->getGroupID(), group_name);
}
- getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", group_name);
+ mGroupAccessCheck->setLabelArg("[GROUP]", group_name);
}
@@ -2817,9 +2822,9 @@ void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata)
return;
}
- bool use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean();
- bool use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
- LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+ bool use_pass_list = !self->mPublicAccessCheck->getValue().asBoolean();
+ bool use_access_group = self->mGroupAccessCheck->getValue().asBoolean();
+ LLCtrlSelectionInterface* passcombo = self->mTemporaryPassCombo;
if (passcombo)
{
if (use_access_group && use_pass_list)
@@ -2846,8 +2851,8 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
}
// Extract data from UI
- bool public_access = self->getChild<LLUICtrl>("public_access")->getValue().asBoolean();
- bool use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
+ bool public_access = self->mPublicAccessCheck->getValue().asBoolean();
+ bool use_access_group = self->mGroupAccessCheck->getValue().asBoolean();
if (use_access_group)
{
std::string group_name;
@@ -2864,14 +2869,14 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
if (public_access)
{
use_access_list = false;
- limit_payment = self->getChild<LLUICtrl>("limit_payment")->getValue().asBoolean();
- limit_age_verified = self->getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean();
+ limit_payment = self->mPaymentInfoCheck->getValue().asBoolean();
+ limit_age_verified = self->mAgeVerifiedCheck->getValue().asBoolean();
}
else
{
use_access_list = true;
- use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
- LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+ use_pass_list = self->mTemporaryPassCheck->getValue().asBoolean();
+ LLCtrlSelectionInterface* passcombo = self->mTemporaryPassCombo;
if (passcombo)
{
if (use_access_group && use_pass_list)
@@ -2884,8 +2889,8 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
}
}
- S32 pass_price = llfloor((F32)self->getChild<LLUICtrl>("PriceSpin")->getValue().asReal());
- F32 pass_hours = (F32)self->getChild<LLUICtrl>("HoursSpin")->getValue().asReal();
+ S32 pass_price = llfloor((F32)self->mTemporaryPassPriceSpin->getValue().asReal());
+ F32 pass_hours = (F32)self->mTemporaryPassHourSpin->getValue().asReal();
// Push data into current parcel
parcel->setParcelFlag(PF_USE_ACCESS_GROUP, use_access_group);
@@ -2907,10 +2912,9 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
void LLPanelLandAccess::onClickAddAccess()
{
- LLView * button = findChild<LLButton>("add_allowed");
LLFloater * root_floater = gFloaterView->getParentFloater(this);
LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
- boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1), false, false, false, root_floater->getName(), button);
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1), false, false, false, root_floater->getName(), mBtnAddAllowed);
if (picker)
{
root_floater->addDependentFloater(picker);
@@ -2938,16 +2942,14 @@ void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids)
}
}
-// static
-void LLPanelLandAccess::onClickRemoveAccess(void* data)
+void LLPanelLandAccess::onClickRemoveAccess()
{
- LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
- if (panelp && panelp->mListAccess)
+ if (mListAccess)
{
- LLParcel* parcel = panelp->mParcel->getParcel();
+ LLParcel* parcel = mParcel->getParcel();
if (parcel)
{
- std::vector<LLScrollListItem*> names = panelp->mListAccess->getAllSelected();
+ std::vector<LLScrollListItem*> names = mListAccess->getAllSelected();
for (std::vector<LLScrollListItem*>::iterator iter = names.begin();
iter != names.end(); )
{
@@ -2956,18 +2958,16 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data)
parcel->removeFromAccessList(agent_id);
}
LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_ACCESS);
- panelp->refresh();
+ refresh();
}
}
}
-// static
void LLPanelLandAccess::onClickAddBanned()
{
- LLView * button = findChild<LLButton>("add_banned");
LLFloater * root_floater = gFloaterView->getParentFloater(this);
LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
- boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), true, false, false, root_floater->getName(), button);
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), true, false, false, root_floater->getName(), mBtnAddBanned);
if (picker)
{
root_floater->addDependentFloater(picker);
@@ -3014,16 +3014,14 @@ void LLPanelLandAccess::callbackAvatarCBBanned2(const uuid_vec_t& ids, S32 durat
}
}
-// static
-void LLPanelLandAccess::onClickRemoveBanned(void* data)
+void LLPanelLandAccess::onClickRemoveBanned()
{
- LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
- if (panelp && panelp->mListBanned)
+ if (mListBanned)
{
- LLParcel* parcel = panelp->mParcel->getParcel();
+ LLParcel* parcel = mParcel->getParcel();
if (parcel)
{
- std::vector<LLScrollListItem*> names = panelp->mListBanned->getAllSelected();
+ std::vector<LLScrollListItem*> names = mListBanned->getAllSelected();
for (std::vector<LLScrollListItem*>::iterator iter = names.begin();
iter != names.end(); )
{
@@ -3032,7 +3030,7 @@ void LLPanelLandAccess::onClickRemoveBanned(void* data)
parcel->removeFromBanList(agent_id);
}
LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_BAN);
- panelp->refresh();
+ refresh();
}
}
}
@@ -3331,10 +3329,10 @@ bool LLPanelLandEnvironment::postBuild()
if (!LLPanelEnvironmentInfo::postBuild())
return false;
- getChild<LLUICtrl>(BTN_USEDEFAULT)->setLabelArg("[USEDEFAULT]", getString(STR_LABEL_USEREGION));
- getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setVisible(false);
- getChild<LLUICtrl>(PNL_REGION_MSG)->setVisible(false);
- getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(true);
+ mBtnUseDefault->setLabelArg("[USEDEFAULT]", getString(STR_LABEL_USEREGION));
+ mCheckAllowOverride->setVisible(false);
+ mPanelEnvRegionMsg->setVisible(false);
+ mPanelEnvAltitudes->setVisible(true);
return true;
}
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 3560304566..95f6a44a94 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -375,13 +375,13 @@ public:
static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
static void onCommitGroupCheck(LLUICtrl* ctrl, void *userdata);
- static void onClickRemoveAccess(void*);
- static void onClickRemoveBanned(void*);
virtual bool postBuild();
void onClickAddAccess();
void onClickAddBanned();
+ void onClickRemoveAccess();
+ void onClickRemoveBanned();
void callbackAvatarCBBanned(const uuid_vec_t& ids);
void callbackAvatarCBBanned2(const uuid_vec_t& ids, S32 duration);
void callbackAvatarCBAccess(const uuid_vec_t& ids);
@@ -389,6 +389,20 @@ public:
protected:
LLNameListCtrl* mListAccess;
LLNameListCtrl* mListBanned;
+ LLUICtrl* mAllowText = nullptr;
+ LLUICtrl* mBanText = nullptr;
+ LLUICtrl* mPublicAccessCheck = nullptr;
+ LLUICtrl* mGroupAccessCheck = nullptr;
+ LLUICtrl* mPaymentInfoCheck = nullptr;
+ LLUICtrl* mAgeVerifiedCheck = nullptr;
+ LLUICtrl* mTemporaryPassCheck = nullptr;
+ LLComboBox* mTemporaryPassCombo = nullptr;
+ LLUICtrl* mTemporaryPassPriceSpin = nullptr;
+ LLUICtrl* mTemporaryPassHourSpin = nullptr;
+ LLButton* mBtnAddAllowed = nullptr;
+ LLButton* mBtnRemoveAllowed = nullptr;
+ LLButton* mBtnAddBanned = nullptr;
+ LLButton* mBtnRemoveBanned = nullptr;
LLSafeHandle<LLParcelSelection>& mParcel;
};
diff --git a/indra/newview/llfloatermemleak.cpp b/indra/newview/llfloatermemleak.cpp
index cd5bea1be4..b4bb45c864 100644
--- a/indra/newview/llfloatermemleak.cpp
+++ b/indra/newview/llfloatermemleak.cpp
@@ -60,7 +60,7 @@ LLFloaterMemLeak::LLFloaterMemLeak(const LLSD& key)
bool LLFloaterMemLeak::postBuild(void)
{
F32 a, b ;
- a = getChild<LLUICtrl>("leak_speed")->getValue().asReal();
+ a = (F32)getChild<LLUICtrl>("leak_speed")->getValue().asReal();
if(a > (F32)(0xFFFFFFFF))
{
sMemLeakingSpeed = 0xFFFFFFFF ;
@@ -69,7 +69,7 @@ bool LLFloaterMemLeak::postBuild(void)
{
sMemLeakingSpeed = (U32)a ;
}
- b = getChild<LLUICtrl>("max_leak")->getValue().asReal();
+ b = (F32)getChild<LLUICtrl>("max_leak")->getValue().asReal();
if(b > (F32)0xFFF)
{
sMaxLeakedMem = 0xFFFFFFFF ;
@@ -150,8 +150,7 @@ void LLFloaterMemLeak::idle()
//----------------------
void LLFloaterMemLeak::onChangeLeakingSpeed()
{
- F32 tmp ;
- tmp =getChild<LLUICtrl>("leak_speed")->getValue().asReal();
+ F32 tmp = (F32)getChild<LLUICtrl>("leak_speed")->getValue().asReal();
if(tmp > (F32)0xFFFFFFFF)
{
@@ -161,14 +160,11 @@ void LLFloaterMemLeak::onChangeLeakingSpeed()
{
sMemLeakingSpeed = (U32)tmp ;
}
-
}
void LLFloaterMemLeak::onChangeMaxMemLeaking()
{
-
- F32 tmp ;
- tmp =getChild<LLUICtrl>("max_leak")->getValue().asReal();
+ F32 tmp = (F32)getChild<LLUICtrl>("max_leak")->getValue().asReal();
if(tmp > (F32)0xFFF)
{
sMaxLeakedMem = 0xFFFFFFFF ;
@@ -177,7 +173,6 @@ void LLFloaterMemLeak::onChangeMaxMemLeaking()
{
sMaxLeakedMem = ((U32)tmp) << 20 ;
}
-
}
void LLFloaterMemLeak::onClickStart()
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index a91cdba5c0..5ca727cf66 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -1198,7 +1198,7 @@ void LLFloaterModelPreview::initDecompControls()
else if (LLSpinCtrl* spinner = dynamic_cast<LLSpinCtrl*>(ctrl))
{
bool is_retain_ctrl = "Retain%" == name;
- double coefficient = is_retain_ctrl ? RETAIN_COEFFICIENT : 1.f;
+ float coefficient = is_retain_ctrl ? (F32)RETAIN_COEFFICIENT : 1.f;
spinner->setMinValue(param[i].mDetails.mRange.mLow.mFloat * coefficient);
spinner->setMaxValue(param[i].mDetails.mRange.mHigh.mFloat * coefficient);
@@ -1238,10 +1238,10 @@ void LLFloaterModelPreview::initDecompControls()
LLUICtrl* ctrl = getChild<LLUICtrl>(name);
if (LLSliderCtrl* slider = dynamic_cast<LLSliderCtrl*>(ctrl))
{
- slider->setMinValue(param[i].mDetails.mRange.mLow.mIntOrEnumValue);
- slider->setMaxValue(param[i].mDetails.mRange.mHigh.mIntOrEnumValue);
- slider->setIncrement(param[i].mDetails.mRange.mDelta.mIntOrEnumValue);
- slider->setValue(param[i].mDefault.mIntOrEnumValue);
+ slider->setMinValue((F32)param[i].mDetails.mRange.mLow.mIntOrEnumValue);
+ slider->setMaxValue((F32)param[i].mDetails.mRange.mHigh.mIntOrEnumValue);
+ slider->setIncrement((F32)param[i].mDetails.mRange.mDelta.mIntOrEnumValue);
+ slider->setValue((F32)param[i].mDefault.mIntOrEnumValue);
slider->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
}
else if (LLComboBox* combo_box = dynamic_cast<LLComboBox*>(ctrl))
diff --git a/indra/newview/llfloatermyenvironment.cpp b/indra/newview/llfloatermyenvironment.cpp
index df4526e69d..891e16a8ef 100644
--- a/indra/newview/llfloatermyenvironment.cpp
+++ b/indra/newview/llfloatermyenvironment.cpp
@@ -335,6 +335,8 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context)
{
if (!LLClipboard::instance().hasContents())
return false;
+ if (gInventory.isObjectDescendentOf(selected.front(), gInventory.getLibraryRootFolderID()))
+ return false;
std::vector<LLUUID> ids;
LLClipboard::instance().pasteFromClipboard(ids);
diff --git a/indra/newview/llfloaterperformance.cpp b/indra/newview/llfloaterperformance.cpp
index 3a633a7ff8..315508f22b 100644
--- a/indra/newview/llfloaterperformance.cpp
+++ b/indra/newview/llfloaterperformance.cpp
@@ -152,6 +152,13 @@ bool LLFloaterPerformance::postBuild()
mStartAutotuneBtn->setCommitCallback(boost::bind(&LLFloaterPerformance::startAutotune, this));
mStopAutotuneBtn->setCommitCallback(boost::bind(&LLFloaterPerformance::stopAutotune, this));
+ mCheckTuneContinous = mAutoadjustmentsPanel->getChild<LLCheckBoxCtrl>("AutoTuneContinuous");
+ mTextWIPDesc = mAutoadjustmentsPanel->getChild<LLTextBox>("wip_desc");
+ mTextDisplayDesc = mAutoadjustmentsPanel->getChild<LLTextBox>("display_desc");
+
+ mTextFPSLabel = getChild<LLTextBox>("fps_lbl");
+ mTextFPSValue = getChild<LLTextBox>("fps_value");
+
gSavedPerAccountSettings.declareBOOL("HadEnabledAutoFPS", false, "User had enabled AutoFPS at least once", LLControlVariable::PERSIST_ALWAYS);
return true;
@@ -428,15 +435,12 @@ void LLFloaterPerformance::populateNearbyList()
mNearbyList->updateColumns(true);
static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0);
- std::vector<LLCharacter*> valid_nearby_avs;
+ std::vector<LLVOAvatar*> valid_nearby_avs;
mNearbyMaxGPUTime = LLWorld::getInstance()->getNearbyAvatarsAndMaxGPUTime(valid_nearby_avs);
- std::vector<LLCharacter*>::iterator char_iter = valid_nearby_avs.begin();
-
- while (char_iter != valid_nearby_avs.end())
+ for (LLVOAvatar* avatar : valid_nearby_avs)
{
- LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*char_iter);
- if (avatar && (LLVOAvatar::AOA_INVISIBLE != avatar->getOverallAppearance()))
+ if (LLVOAvatar::AOA_INVISIBLE != avatar->getOverallAppearance())
{
F32 render_av_gpu_ms = avatar->getGPURenderTime();
@@ -501,7 +505,6 @@ void LLFloaterPerformance::populateNearbyList()
}
}
}
- char_iter++;
}
mNearbyList->sortByColumnIndex(1, false);
mNearbyList->setScrollPos(prev_pos);
@@ -512,7 +515,7 @@ void LLFloaterPerformance::setFPSText()
{
const S32 NUM_PERIODS = 50;
S32 current_fps = (S32)llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, NUM_PERIODS));
- getChild<LLTextBox>("fps_value")->setValue(current_fps);
+ mTextFPSValue->setValue(current_fps);
std::string fps_text = getString("fps_text");
static LLCachedControl<bool> vsync_enabled(gSavedSettings, "RenderVSyncEnable", true);
@@ -521,7 +524,7 @@ void LLFloaterPerformance::setFPSText()
{
fps_text += getString("max_text");
}
- getChild<LLTextBox>("fps_lbl")->setValue(fps_text);
+ mTextFPSLabel->setValue(fps_text);
}
void LLFloaterPerformance::detachItem(const LLUUID& item_id)
@@ -722,10 +725,10 @@ void LLFloaterPerformance::updateAutotuneCtrls(bool autotune_enabled)
static LLCachedControl<bool> auto_tune_locked(gSavedSettings, "AutoTuneLock");
mStartAutotuneBtn->setEnabled(!autotune_enabled && !auto_tune_locked);
mStopAutotuneBtn->setEnabled(autotune_enabled && !auto_tune_locked);
- getChild<LLCheckBoxCtrl>("AutoTuneContinuous")->setEnabled(!autotune_enabled || (autotune_enabled && auto_tune_locked));
+ mCheckTuneContinous->setEnabled(!autotune_enabled || (autotune_enabled && auto_tune_locked));
- getChild<LLTextBox>("wip_desc")->setVisible(autotune_enabled && !auto_tune_locked);
- getChild<LLTextBox>("display_desc")->setVisible(LLPerfStats::tunables.vsyncEnabled);
+ mTextWIPDesc->setVisible(autotune_enabled && !auto_tune_locked);
+ mTextDisplayDesc->setVisible(LLPerfStats::tunables.vsyncEnabled);
}
void LLFloaterPerformance::enableAutotuneWarning()
diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h
index 089a508455..a7100eb350 100644
--- a/indra/newview/llfloaterperformance.h
+++ b/indra/newview/llfloaterperformance.h
@@ -30,7 +30,9 @@
#include "lllistcontextmenu.h"
class LLCharacter;
+class LLCheckBoxCtrl;
class LLNameListCtrl;
+class LLTextBox;
class LLFloaterPerformance : public LLFloater
{
@@ -90,6 +92,13 @@ private:
LLButton* mStartAutotuneBtn;
LLButton* mStopAutotuneBtn;
+ LLTextBox* mTextWIPDesc = nullptr;
+ LLTextBox* mTextDisplayDesc = nullptr;
+ LLTextBox* mTextFPSLabel = nullptr;
+ LLTextBox* mTextFPSValue = nullptr;
+
+ LLCheckBoxCtrl* mCheckTuneContinous = nullptr;
+
LLListContextMenu* mContextMenu;
LLTimer* mUpdateTimer;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 85a07f23a4..e673752986 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -430,6 +430,13 @@ void LLFloaterPreference::saveAvatarPropertiesCoro(const std::string cap_url, bo
bool LLFloaterPreference::postBuild()
{
+ mDeleteTranscriptsBtn = getChild<LLButton>("delete_transcripts");
+
+ mEnabledPopups = getChild<LLScrollListCtrl>("enabled_popups");
+ mDisabledPopups = getChild<LLScrollListCtrl>("disabled_popups");
+ mEnablePopupBtn = getChild<LLButton>("enable_this_popup");
+ mDisablePopupBtn = getChild<LLButton>("disable_this_popup");
+
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLFloaterIMSessionTab::processChatHistoryStyleUpdate, false));
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged));
@@ -519,7 +526,7 @@ bool LLFloaterPreference::postBuild()
void LLFloaterPreference::updateDeleteTranscriptsButton()
{
- getChild<LLButton>("delete_transcripts")->setEnabled(LLLogChat::transcriptFilesExist());
+ mDeleteTranscriptsBtn->setEnabled(LLLogChat::transcriptFilesExist());
}
void LLFloaterPreference::onDoNotDisturbResponseChanged()
@@ -540,11 +547,11 @@ LLFloaterPreference::~LLFloaterPreference()
void LLFloaterPreference::draw()
{
- bool has_first_selected = (getChildRef<LLScrollListCtrl>("disabled_popups").getFirstSelected()!=NULL);
- gSavedSettings.setBOOL("FirstSelectedDisabledPopups", has_first_selected);
+ bool has_first_selected = (mDisabledPopups->getFirstSelected()!=NULL);
+ mEnablePopupBtn->setEnabled(has_first_selected);
- has_first_selected = (getChildRef<LLScrollListCtrl>("enabled_popups").getFirstSelected()!=NULL);
- gSavedSettings.setBOOL("FirstSelectedEnabledPopups", has_first_selected);
+ has_first_selected = (mEnabledPopups->getFirstSelected()!=NULL);
+ mDisablePopupBtn->setEnabled(has_first_selected);
LLFloater::draw();
}
@@ -1101,7 +1108,7 @@ void LLFloaterPreference::onNameTagOpacityChange(const LLSD& newvalue)
if (color_swatch)
{
LLColor4 new_color = color_swatch->get();
- color_swatch->set( new_color.setAlpha(newvalue.asReal()) );
+ color_swatch->set(new_color.setAlpha((F32)newvalue.asReal()));
}
}
@@ -1171,13 +1178,8 @@ void LLFloaterPreference::refreshSkin(void* data)
void LLFloaterPreference::buildPopupLists()
{
- LLScrollListCtrl& disabled_popups =
- getChildRef<LLScrollListCtrl>("disabled_popups");
- LLScrollListCtrl& enabled_popups =
- getChildRef<LLScrollListCtrl>("enabled_popups");
-
- disabled_popups.deleteAllItems();
- enabled_popups.deleteAllItems();
+ mDisabledPopups->deleteAllItems();
+ mEnabledPopups->deleteAllItems();
for (LLNotifications::TemplateMap::const_iterator iter = LLNotifications::instance().templatesBegin();
iter != LLNotifications::instance().templatesEnd();
@@ -1219,11 +1221,11 @@ void LLFloaterPreference::buildPopupLists()
}
}
}
- item = disabled_popups.addElement(row);
+ item = mDisabledPopups->addElement(row);
}
else
{
- item = enabled_popups.addElement(row);
+ item = mEnabledPopups->addElement(row);
}
if (item)
@@ -1235,11 +1237,6 @@ void LLFloaterPreference::buildPopupLists()
void LLFloaterPreference::refreshEnabledState()
{
- LLCheckBoxCtrl* ctrl_pbr = getChild<LLCheckBoxCtrl>("UsePBRShaders");
-
- //PBR
- ctrl_pbr->setEnabled(true);
-
// Cannot have floater active until caps have been received
getChild<LLButton>("default_creation_permissions")->setEnabled(LLStartUp::getStartupState() >= STATE_STARTED);
@@ -1324,9 +1321,7 @@ void LLFloaterPreference::onClickSetSounds()
void LLFloaterPreference::onClickEnablePopup()
{
- LLScrollListCtrl& disabled_popups = getChildRef<LLScrollListCtrl>("disabled_popups");
-
- std::vector<LLScrollListItem*> items = disabled_popups.getAllSelected();
+ std::vector<LLScrollListItem*> items = mDisabledPopups->getAllSelected();
std::vector<LLScrollListItem*>::iterator itor;
for (itor = items.begin(); itor != items.end(); ++itor)
{
@@ -1345,9 +1340,7 @@ void LLFloaterPreference::onClickEnablePopup()
void LLFloaterPreference::onClickDisablePopup()
{
- LLScrollListCtrl& enabled_popups = getChildRef<LLScrollListCtrl>("enabled_popups");
-
- std::vector<LLScrollListItem*> items = enabled_popups.getAllSelected();
+ std::vector<LLScrollListItem*> items = mEnabledPopups->getAllSelected();
std::vector<LLScrollListItem*>::iterator itor;
for (itor = items.begin(); itor != items.end(); ++itor)
{
@@ -1796,11 +1789,9 @@ void LLFloaterPreference::onDeleteTranscriptsResponse(const LLSD& notification,
void LLFloaterPreference::onLogChatHistorySaved()
{
- LLButton * delete_transcripts_buttonp = getChild<LLButton>("delete_transcripts");
-
- if (!delete_transcripts_buttonp->getEnabled())
+ if (!mDeleteTranscriptsBtn->getEnabled())
{
- delete_transcripts_buttonp->setEnabled(true);
+ mDeleteTranscriptsBtn->setEnabled(true);
}
}
@@ -1910,7 +1901,7 @@ void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location)
void LLFloaterPreference::selectPanel(const LLSD& name)
{
LLTabContainer * tab_containerp = getChild<LLTabContainer>("pref core");
- LLPanel * panel = tab_containerp->getPanelByName(name);
+ LLPanel * panel = tab_containerp->getPanelByName(name.asStringRef());
if (NULL != panel)
{
tab_containerp->selectTabPanel(panel);
@@ -2334,7 +2325,6 @@ bool LLPanelPreferenceGraphics::postBuild()
void LLPanelPreferenceGraphics::draw()
{
- setPresetText();
LLPanelPreference::draw();
}
@@ -3315,8 +3305,8 @@ void LLFloaterPreference::onUpdateFilterTerm(bool force)
void LLFloaterPreference::filterIgnorableNotifications()
{
- bool visible = getChildRef<LLScrollListCtrl>("enabled_popups").highlightMatchingItems(mFilterEdit->getValue());
- visible |= getChildRef<LLScrollListCtrl>("disabled_popups").highlightMatchingItems(mFilterEdit->getValue());
+ bool visible = mEnabledPopups->highlightMatchingItems(mFilterEdit->getValue());
+ visible |= mDisabledPopups->highlightMatchingItems(mFilterEdit->getValue());
if (visible)
{
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index c8b98d8e1b..51ed3d8179 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -225,7 +225,12 @@ private:
std::string mSavedGraphicsPreset;
LOG_CLASS(LLFloaterPreference);
- LLSearchEditor *mFilterEdit;
+ LLSearchEditor* mFilterEdit = nullptr;
+ LLScrollListCtrl* mEnabledPopups = nullptr;
+ LLScrollListCtrl* mDisabledPopups = nullptr;
+ LLButton* mDeleteTranscriptsBtn = nullptr;
+ LLButton* mEnablePopupBtn = nullptr;
+ LLButton* mDisablePopupBtn = nullptr;
std::unique_ptr< ll::prefs::SearchData > mSearchData;
bool mSearchDataDirty;
diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
index 082a77d741..55293aa7f0 100644
--- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
+++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
@@ -153,7 +153,6 @@ void LLFloaterPreferenceGraphicsAdvanced::refresh()
updateSliderText(getChild<LLSliderCtrl>("TerrainMeshDetail", true), getChild<LLTextBox>("TerrainMeshDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("RenderPostProcess", true), getChild<LLTextBox>("PostProcessText", true));
updateSliderText(getChild<LLSliderCtrl>("SkyMeshDetail", true), getChild<LLTextBox>("SkyMeshDetailText", true));
- updateSliderText(getChild<LLSliderCtrl>("TerrainDetail", true), getChild<LLTextBox>("TerrainDetailText", true));
LLAvatarComplexityControls::setIndirectControls();
setMaxNonImpostorsText(
gSavedSettings.getU32("RenderAvatarMaxNonImpostors"),
@@ -268,12 +267,6 @@ void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTe
void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
- LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
- LLTextBox* reflections_text = getChild<LLTextBox>("ReflectionsText");
- LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram");
- LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth");
- LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
- LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText");
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
@@ -284,9 +277,6 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
// disabled windlight
if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
{
- ctrl_wind_light->setEnabled(false);
- ctrl_wind_light->setValue(false);
-
sky->setEnabled(false);
sky_text->setEnabled(false);
@@ -300,9 +290,6 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
ctrl_dof->setEnabled(false);
ctrl_dof->setValue(false);
-
- ctrl_deferred->setEnabled(false);
- ctrl_deferred->setValue(false);
}
// disabled deferred
@@ -317,9 +304,6 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
ctrl_dof->setEnabled(false);
ctrl_dof->setValue(false);
-
- ctrl_deferred->setEnabled(false);
- ctrl_deferred->setValue(false);
}
// disabled deferred SSAO
@@ -336,111 +320,17 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
ctrl_shadows->setValue(0);
shadows_text->setEnabled(false);
}
-
- // disabled reflections
- if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))
- {
- ctrl_reflections->setEnabled(false);
- ctrl_reflections->setValue(false);
- reflections_text->setEnabled(false);
- }
-
- // disabled av
- if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"))
- {
- ctrl_avatar_vp->setEnabled(false);
- ctrl_avatar_vp->setValue(false);
-
- ctrl_avatar_cloth->setEnabled(false);
- ctrl_avatar_cloth->setValue(false);
-
- //deferred needs AvatarVP, disable deferred
- ctrl_shadows->setEnabled(false);
- ctrl_shadows->setValue(0);
- shadows_text->setEnabled(false);
-
- ctrl_ssao->setEnabled(false);
- ctrl_ssao->setValue(false);
-
- ctrl_dof->setEnabled(false);
- ctrl_dof->setValue(false);
-
- ctrl_deferred->setEnabled(false);
- ctrl_deferred->setValue(false);
- }
-
- // disabled cloth
- if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth"))
- {
- ctrl_avatar_cloth->setEnabled(false);
- ctrl_avatar_cloth->setValue(false);
- }
}
void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
{
- LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
- LLTextBox* reflections_text = getChild<LLTextBox>("ReflectionsText");
-
- // Reflections
- bool reflections = LLCubeMap::sUseCubeMaps;
- ctrl_reflections->setEnabled(reflections);
- reflections_text->setEnabled(reflections);
-
- // Bump & Shiny
- LLCheckBoxCtrl* bumpshiny_ctrl = getChild<LLCheckBoxCtrl>("BumpShiny");
- bool bumpshiny = LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump");
- bumpshiny_ctrl->setEnabled(bumpshiny);
-
- // Avatar Mode
- // Enable Avatar Shaders
- LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram");
- // Avatar Render Mode
- LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth");
-
- bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP");
- if (LLViewerShaderMgr::sInitialized)
- {
- S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
- avatar_vp_enabled = max_avatar_shader > 0;
- }
-
- ctrl_avatar_vp->setEnabled(avatar_vp_enabled);
-
- ctrl_avatar_cloth->setEnabled(gSavedSettings.getBOOL("RenderAvatarVP"));
-
- // Vertex Shaders, Global Shader Enable
- // SL-12594 Basic shaders are always enabled. DJH TODO clean up now-orphaned state handling code
- LLSliderCtrl* terrain_detail = getChild<LLSliderCtrl>("TerrainDetail"); // can be linked with control var
- LLTextBox* terrain_text = getChild<LLTextBox>("TerrainDetailText");
-
- terrain_detail->setEnabled(false);
- terrain_text->setEnabled(false);
-
// WindLight
- //LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
- //ctrl_wind_light->setEnabled(true);
LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText");
sky->setEnabled(true);
sky_text->setEnabled(true);
bool enabled = true;
-#if 0 // deferred always on now
- //Deferred/SSAO/Shadows
- LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
-
- enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
- bumpshiny_ctrl && bumpshiny_ctrl->get() &&
- ctrl_wind_light->get();
-
- ctrl_deferred->setEnabled(enabled);
-#endif
-
- LLCheckBoxCtrl* ctrl_pbr = getChild<LLCheckBoxCtrl>("UsePBRShaders");
-
- //PBR
- ctrl_pbr->setEnabled(true);
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
@@ -472,11 +362,6 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
getChildView("texture compression")->setEnabled(false);
}
- // if no windlight shaders, turn off nighttime brightness, gamma, and fog distance
- LLUICtrl* gamma_ctrl = getChild<LLUICtrl>("gamma");
- gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders());
- getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders());
- getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("antialiasing restart")->setVisible(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred"));
// now turn off any features that are unavailable
diff --git a/indra/newview/llfloaterprofiletexture.cpp b/indra/newview/llfloaterprofiletexture.cpp
index 47b3aa015b..8cb941cb12 100644
--- a/indra/newview/llfloaterprofiletexture.cpp
+++ b/indra/newview/llfloaterprofiletexture.cpp
@@ -244,8 +244,8 @@ void LLFloaterProfileTexture::updateDimensions()
if (biggest_dim > MAX_DIMENTIONS)
{
F32 scale_down = MAX_DIMENTIONS / (F32)biggest_dim;
- width *= scale_down;
- height *= scale_down;
+ width = (S32)(width * scale_down);
+ height = (S32)(height * scale_down);
}
//reshape floater
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 3ef44bf74a..7869abf66d 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -61,6 +61,7 @@
#include "llfloatergroups.h"
#include "llfloaterreg.h"
#include "llfloaterregiondebugconsole.h"
+#include "llfloaterregionrestartschedule.h"
#include "llfloatertelehub.h"
#include "llgltfmateriallist.h"
#include "llinventorymodel.h"
@@ -259,6 +260,7 @@ bool LLFloaterRegionInfo::postBuild()
panel = new LLPanelRegionGeneralInfo;
mInfoPanels.push_back(panel);
panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
+ panel->getCommitCallbackRegistrar().add("RegionInfo.ManageRestart", boost::bind(&LLPanelRegionInfo::onClickManageRestartSchedule, panel));
panel->buildFromFile("panel_region_general.xml");
mTab->addTabPanel(panel);
@@ -519,7 +521,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
panel->getChild<LLUICtrl>("object_bonus_spin")->setValue(LLSD(object_bonus_factor));
panel->getChild<LLUICtrl>("access_combo")->setValue(LLSD(sim_access));
- panel->getChild<LLSpinCtrl>("agent_limit_spin")->setMaxValue(hard_agent_limit);
+ panel->getChild<LLSpinCtrl>("agent_limit_spin")->setMaxValue((F32)hard_agent_limit);
LLPanelRegionGeneralInfo* panel_general = LLFloaterRegionInfo::getPanelGeneral();
if (panel)
@@ -863,6 +865,25 @@ void LLPanelRegionInfo::onClickManageTelehub()
LLFloaterReg::showInstance("telehubs");
}
+void LLPanelRegionInfo::onClickManageRestartSchedule()
+{
+ LLFloater* floaterp = mFloaterRestartScheduleHandle.get();
+ // Show the dialog
+ if (!floaterp)
+ {
+ floaterp = new LLFloaterRegionRestartSchedule(this);
+ }
+
+ if (floaterp->getVisible())
+ {
+ floaterp->closeFloater();
+ }
+ else
+ {
+ floaterp->openFloater();
+ }
+}
+
/////////////////////////////////////////////////////////////////////////////
// LLPanelRegionGeneralInfo
//
@@ -878,6 +899,8 @@ bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region)
getChildView("kick_all_btn")->setEnabled(allow_modify);
getChildView("im_btn")->setEnabled(allow_modify);
getChildView("manage_telehub_btn")->setEnabled(allow_modify);
+ getChildView("manage_restart_btn")->setEnabled(allow_modify);
+ getChildView("manage_restart_btn")->setVisible(LLFloaterRegionRestartSchedule::canUse());
// Data gets filled in by processRegionInfo
@@ -1562,7 +1585,7 @@ bool LLPanelRegionTerrainInfo::postBuild()
{
mTextureDetailCtrl[i]->setBakeTextureEnabled(false);
}
- initAndSetCtrl(mMaterialDetailCtrl[i], llformat("material_detail_%d", i));
+ initMaterialCtrl(mMaterialDetailCtrl[i], llformat("material_detail_%d", i), i);
initAndSetCtrl(mMaterialScaleUCtrl[i], llformat("terrain%dScaleU", i));
initAndSetCtrl(mMaterialScaleVCtrl[i], llformat("terrain%dScaleV", i));
@@ -1932,11 +1955,11 @@ bool LLPanelRegionTerrainInfo::sendUpdate()
for (U32 tt = 0; tt < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++tt)
{
LLGLTFMaterial::TextureTransform& transform = mat_override->mTextureTransform[tt];
- transform.mScale.mV[VX] = mMaterialScaleUCtrl[i]->getValue().asReal();
- transform.mScale.mV[VY] = mMaterialScaleVCtrl[i]->getValue().asReal();
- transform.mRotation = mMaterialRotationCtrl[i]->getValue().asReal() * DEG_TO_RAD;
- transform.mOffset.mV[VX] = mMaterialOffsetUCtrl[i]->getValue().asReal();
- transform.mOffset.mV[VY] = mMaterialOffsetVCtrl[i]->getValue().asReal();
+ transform.mScale.mV[VX] = (F32)mMaterialScaleUCtrl[i]->getValue().asReal();
+ transform.mScale.mV[VY] = (F32)mMaterialScaleVCtrl[i]->getValue().asReal();
+ transform.mRotation = (F32)mMaterialRotationCtrl[i]->getValue().asReal() * DEG_TO_RAD;
+ transform.mOffset.mV[VX] = (F32)mMaterialOffsetUCtrl[i]->getValue().asReal();
+ transform.mOffset.mV[VY] = (F32)mMaterialOffsetVCtrl[i]->getValue().asReal();
}
}
@@ -1959,6 +1982,31 @@ bool LLPanelRegionTerrainInfo::sendUpdate()
return true;
}
+void LLPanelRegionTerrainInfo::initMaterialCtrl(LLTextureCtrl*& ctrl, const std::string& name, S32 index)
+{
+ ctrl = findChild<LLTextureCtrl>(name, true);
+ if (!ctrl) return;
+
+ // consume cancel events, otherwise they will trigger commit callbacks
+ ctrl->setOnCancelCallback([](LLUICtrl* ctrl, const LLSD& param) {});
+ ctrl->setCommitCallback(
+ [this, index](LLUICtrl* ctrl, const LLSD& param)
+ {
+ if (!mMaterialScaleUCtrl[index]
+ || !mMaterialScaleVCtrl[index]
+ || !mMaterialRotationCtrl[index]
+ || !mMaterialOffsetUCtrl[index]
+ || !mMaterialOffsetVCtrl[index]) return;
+
+ mMaterialScaleUCtrl[index]->setValue(1.f);
+ mMaterialScaleVCtrl[index]->setValue(1.f);
+ mMaterialRotationCtrl[index]->setValue(0.f);
+ mMaterialOffsetUCtrl[index]->setValue(0.f);
+ mMaterialOffsetVCtrl[index]->setValue(0.f);
+ onChangeAnything();
+ });
+}
+
bool LLPanelRegionTerrainInfo::callbackTextureHeights(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -2307,7 +2355,6 @@ void LLPanelEstateInfo::refresh()
// Disable access restriction controls if they make no sense.
bool public_access = ("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString());
- getChildView("Only Allow")->setEnabled(public_access);
getChildView("limit_payment")->setEnabled(public_access);
getChildView("limit_age_verified")->setEnabled(public_access);
getChildView("limit_bots")->setEnabled(public_access);
@@ -4177,11 +4224,11 @@ bool LLPanelRegionEnvironment::postBuild()
if (!LLPanelEnvironmentInfo::postBuild())
return false;
- getChild<LLUICtrl>(BTN_USEDEFAULT)->setLabelArg("[USEDEFAULT]", getString(STR_LABEL_USEDEFAULT));
- getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setVisible(true);
- getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(true);
+ mBtnUseDefault->setLabelArg("[USEDEFAULT]", getString(STR_LABEL_USEDEFAULT));
+ mCheckAllowOverride->setVisible(true);
+ mPanelEnvAltitudes->setVisible(true);
- getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setCommitCallback([this](LLUICtrl *, const LLSD &value){ onChkAllowOverride(value.asBoolean()); });
+ mCheckAllowOverride->setCommitCallback([this](LLUICtrl *, const LLSD &value){ onChkAllowOverride(value.asBoolean()); });
mCommitConnect = estate_info.setCommitCallback(boost::bind(&LLPanelRegionEnvironment::refreshFromEstate, this));
return true;
@@ -4203,7 +4250,7 @@ void LLPanelRegionEnvironment::refresh()
LLPanelEnvironmentInfo::refresh();
- getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setValue(mAllowOverride);
+ mCheckAllowOverride->setValue(mAllowOverride);
}
bool LLPanelRegionEnvironment::refreshFromRegion(LLViewerRegion* region)
@@ -4269,7 +4316,7 @@ bool LLPanelRegionEnvironment::confirmUpdateEstateEnvironment(const LLSD& notifi
case 1:
mAllowOverride = mAllowOverrideRestore;
- getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setValue(mAllowOverride);
+ mCheckAllowOverride->setValue(mAllowOverride);
break;
default:
break;
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 5623bc20cb..b604a28fc3 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -154,6 +154,7 @@ public:
void disableButton(const std::string& btn_name);
void onClickManageTelehub();
+ void onClickManageRestartSchedule();
protected:
void initCtrl(const std::string& name);
@@ -174,6 +175,7 @@ protected:
// member data
LLHost mHost;
+ LLHandle<LLFloater> mFloaterRestartScheduleHandle;
};
/////////////////////////////////////////////////////////////////////////////
@@ -273,6 +275,8 @@ public:
protected:
bool sendUpdate() override;
+ void initMaterialCtrl(LLTextureCtrl*& ctrl, const std::string& name, S32 index);
+
private:
bool mConfirmedTextureHeights;
bool mAskedTextureHeights;
diff --git a/indra/newview/llfloaterregionrestartschedule.cpp b/indra/newview/llfloaterregionrestartschedule.cpp
new file mode 100644
index 0000000000..59bcb22dce
--- /dev/null
+++ b/indra/newview/llfloaterregionrestartschedule.cpp
@@ -0,0 +1,386 @@
+/**
+ * @file llfloaterregionrestartschedule.cpp
+ * @author Andrii Kleshchev
+ * @brief LLFloaterRegionRestartSchedule class
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterregionrestartschedule.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "lllineeditor.h"
+#include "llviewercontrol.h"
+
+
+// match with values used by capability
+constexpr char CHECKBOX_PREFIXES[] =
+{
+ 's',
+ 'm',
+ 't',
+ 'w',
+ 'r',
+ 'f',
+ 'a',
+};
+
+const std::string CHECKBOX_NAME = "_chk";
+
+LLFloaterRegionRestartSchedule::LLFloaterRegionRestartSchedule(
+ LLView* owner)
+ : LLFloater(LLSD())
+ , mOwnerHandle(owner->getHandle())
+{
+ buildFromFile("floater_region_restart_schedule.xml");
+}
+
+LLFloaterRegionRestartSchedule::~LLFloaterRegionRestartSchedule()
+{
+
+}
+
+bool LLFloaterRegionRestartSchedule::postBuild()
+{
+ mPMAMButton = getChild<LLButton>("am_pm_btn");
+ mPMAMButton->setClickedCallback([this](LLUICtrl*, const LLSD&) { onPMAMButtonClicked(); });
+
+ // By default mPMAMButton is supposed to be visible.
+ // If localized xml set mPMAMButton to be invisible, assume
+ // 24h format and prealligned "UTC" label
+ if (mPMAMButton->getVisible())
+ {
+ bool use_24h_format = gSavedSettings.getBOOL("Use24HourClock");
+ if (use_24h_format)
+ {
+ mPMAMButton->setVisible(false);
+ LLUICtrl* lbl = getChild<LLUICtrl>("utc_label");
+ lbl->translate(-mPMAMButton->getRect().getWidth(), 0);
+ }
+ }
+
+ mSaveButton = getChild<LLButton>("save_btn");
+ mSaveButton->setClickedCallback([this](LLUICtrl*, const LLSD&) { onSaveButtonClicked(); });
+
+ mCancelButton = getChild<LLButton>("cancel_btn");
+ mCancelButton->setClickedCallback([this](LLUICtrl*, const LLSD&) { closeFloater(false); });
+
+
+ mHoursLineEditor = getChild<LLLineEditor>("hours_edt");
+ mHoursLineEditor->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+ mHoursLineEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& value) { onCommitHours(value); });
+
+ mMinutesLineEditor = getChild<LLLineEditor>("minutes_edt");
+ mMinutesLineEditor->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+ mMinutesLineEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& value) { onCommitMinutes(value); });
+
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl* chk = getChild<LLCheckBoxCtrl>(name);
+ chk->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& value) { mSaveButton->setEnabled(true); });
+ }
+
+ resetUI(false);
+
+ return true;
+}
+
+void LLFloaterRegionRestartSchedule::onOpen(const LLSD& key)
+{
+ std::string url = gAgent.getRegionCapability("RegionSchedule");
+ if (!url.empty())
+ {
+ LLCoros::instance().launch("LLFloaterRegionRestartSchedule::requestRegionShcheduleCoro",
+ boost::bind(&LLFloaterRegionRestartSchedule::requestRegionShcheduleCoro, url, getHandle()));
+
+ mSaveButton->setEnabled(false);
+ }
+ else
+ {
+ LL_WARNS("Region") << "Started region schedule floater, but RegionSchedule capability is not available" << LL_ENDL;
+ }
+}
+
+void LLFloaterRegionRestartSchedule::draw()
+{
+ LLView* owner = mOwnerHandle.get();
+ if (owner)
+ {
+ static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+ drawConeToOwner(mContextConeOpacity, max_opacity, owner);
+ }
+
+ LLFloater::draw();
+}
+
+void LLFloaterRegionRestartSchedule::onPMAMButtonClicked()
+{
+ mSaveButton->setEnabled(true);
+ mTimeAM = !mTimeAM;
+ updateAMPM();
+}
+
+void LLFloaterRegionRestartSchedule::onSaveButtonClicked()
+{
+ std::string url = gAgent.getRegionCapability("RegionSchedule");
+ if (!url.empty())
+ {
+ std::string days;
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl* chk = getChild<LLCheckBoxCtrl>(name);
+ if (chk->getValue())
+ {
+ days += c;
+ }
+ }
+ LLSD restart;
+ if (days.size() < 7)
+ {
+ LLStringUtil::toUpper(days);
+ restart["type"] = "W";
+ // if days are empty, will reset schedule
+ restart["days"] = days;
+ }
+ else
+ {
+ restart["type"] = "D";
+ }
+ S32 hours = mHoursLineEditor->getValue().asInteger();
+ if (mPMAMButton->getVisible())
+ {
+ if (hours == 12)
+ {
+ hours = 0; // 12:00 AM equals 0:00, while 12:00 PM equals 12:00
+ }
+ if (!mTimeAM)
+ {
+ hours += 12;
+ }
+ }
+ restart["time"] = hours * 3600 + mMinutesLineEditor->getValue().asInteger() * 60;
+
+ LLSD body;
+ body["restart"] = restart; // event name, at the moment only "restart" is supported
+ LLCoros::instance().launch("LLFloaterRegionRestartSchedule::setRegionShcheduleCoro",
+ boost::bind(&LLFloaterRegionRestartSchedule::setRegionShcheduleCoro, url, body, getHandle()));
+
+ mSaveButton->setEnabled(false);
+ }
+ else
+ {
+ LL_WARNS("Region") << "Saving region schedule, but RegionSchedule capability is not available" << LL_ENDL;
+ }
+}
+
+void LLFloaterRegionRestartSchedule::onCommitHours(const LLSD& value)
+{
+ S32 hours = value.asInteger();
+ if (mPMAMButton->getVisible())
+ {
+ // 0:00 equals 12:00 AM 1:00 equals 1:00 AM, 12am < 1am < 2am < 3am...
+ if (hours == 0) hours = 12;
+ llclamp(hours, 1, 12);
+ }
+ else
+ {
+ llclamp(hours, 0, 23);
+ }
+ mHoursLineEditor->setText(llformat("%02d", hours));
+ mSaveButton->setEnabled(true);
+}
+
+void LLFloaterRegionRestartSchedule::onCommitMinutes(const LLSD& value)
+{
+ S32 minutes = value.asInteger();
+ llclamp(minutes, 0, 59);
+ mMinutesLineEditor->setText(llformat("%02d", minutes));
+ mSaveButton->setEnabled(true);
+}
+
+void LLFloaterRegionRestartSchedule::resetUI(bool enable_ui)
+{
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl* chk = getChild<LLCheckBoxCtrl>(name);
+ chk->setValue(false);
+ chk->setEnabled(enable_ui);
+ }
+ if (mPMAMButton->getVisible())
+ {
+ mHoursLineEditor->setValue("12");
+ mPMAMButton->setEnabled(enable_ui);
+ }
+ else
+ {
+ mHoursLineEditor->setValue("00");
+ }
+ mMinutesLineEditor->setValue("00");
+ mMinutesLineEditor->setEnabled(enable_ui);
+ mHoursLineEditor->setEnabled(enable_ui);
+ mTimeAM = true;
+ updateAMPM();
+}
+
+void LLFloaterRegionRestartSchedule::updateAMPM()
+{
+ std::string value;
+ if (mTimeAM)
+ {
+ value = getString("am_string");
+ }
+ else
+ {
+ value = getString("pm_string");
+ }
+ mPMAMButton->setLabel(value);
+}
+
+bool LLFloaterRegionRestartSchedule::canUse()
+{
+ std::string url = gAgent.getRegionCapability("RegionSchedule");
+ return !url.empty();
+}
+
+void LLFloaterRegionRestartSchedule::requestRegionShcheduleCoro(std::string url, LLHandle<LLFloater> handle)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("RegionShcheduleRequest", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+
+ httpOpts->setWantHeaders(true);
+
+ LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ LLFloaterRegionRestartSchedule* floater = dynamic_cast<LLFloaterRegionRestartSchedule*>(handle.get());
+ if (!floater)
+ {
+ LL_DEBUGS("Region") << "Region Restart Schedule floater is already dead" << LL_ENDL;
+ }
+ else if (!status)
+ {
+ LL_WARNS("Region") << "Failed to get region schedule: " << status.toString() << LL_ENDL;
+ floater->resetUI(false);
+ }
+ else if (!result.has("restart"))
+ {
+ floater->resetUI(true); // no restart schedule yet
+ }
+ else
+ {
+ // example: 'restart':{'days':'TR','time':i7200,'type':'W'}
+ LLSD &restart = result["restart"];
+ std::string type = restart["type"];
+ std::string days = restart["days"];
+ if (type == "W") // weekly || restart.has("days")
+ {
+ LLStringUtil::toLower(days);
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ bool enabled = days.find(c) != std::string::npos;
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl *chk = floater->getChild<LLCheckBoxCtrl>(name);
+ chk->setValue(enabled);
+ chk->setEnabled(true);
+ }
+ }
+ else // dayly
+ {
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl* chk = floater->getChild<LLCheckBoxCtrl>(name);
+ chk->setValue(true);
+ chk->setEnabled(true);
+ }
+ }
+
+ S32 seconds_after_midnight = restart["time"].asInteger();
+ S32 hours = seconds_after_midnight / 3600;
+ S32 minutes = (seconds_after_midnight % 3600) / 60;
+
+ if (floater->mPMAMButton->getVisible())
+ {
+ if (hours >= 12)
+ {
+ hours -= 12;
+ floater->mTimeAM = false;
+ }
+ else
+ {
+ floater->mTimeAM = true;
+ }
+ if (hours == 0)
+ {
+ hours = 12; // 0:00 equals 12:00 AM , 1:00 equals 1:00 AM
+ }
+ floater->mPMAMButton->setEnabled(true);
+ }
+ else
+ {
+ floater->mTimeAM = true;
+ }
+ floater->updateAMPM();
+ floater->mHoursLineEditor->setText(llformat("%02d", hours));
+ floater->mHoursLineEditor->setEnabled(true);
+ floater->mMinutesLineEditor->setText(llformat("%02d", minutes));
+ floater->mMinutesLineEditor->setEnabled(true);
+
+ LL_DEBUGS("Region") << "Region restart schedule type: " << type
+ << " Days: " << days
+ << " Time:" << hours << ":" << minutes << LL_ENDL;
+ }
+}
+
+void LLFloaterRegionRestartSchedule::setRegionShcheduleCoro(std::string url, LLSD body, LLHandle<LLFloater> handle)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("RegionShcheduleSetter", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+
+ httpOpts->setWantHeaders(true);
+
+ LLSD result = httpAdapter->postAndSuspend(httpRequest, url, body, httpOpts);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ LLFloaterRegionRestartSchedule* floater = dynamic_cast<LLFloaterRegionRestartSchedule*>(handle.get());
+ if (floater)
+ {
+ floater->closeFloater();
+ }
+}
diff --git a/indra/newview/llfloaterregionrestartschedule.h b/indra/newview/llfloaterregionrestartschedule.h
new file mode 100644
index 0000000000..465ed538a5
--- /dev/null
+++ b/indra/newview/llfloaterregionrestartschedule.h
@@ -0,0 +1,74 @@
+/**
+ * @file llfloaterregionrestartschedule.h
+ * @author Andrii Kleshchev
+ * @brief LLFloaterRegionRestartSchedule class header file
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERREGIONRESTARTSCHEDULE_H
+#define LL_LLFLOATERREGIONRESTARTSCHEDULE_H
+
+#include "llfloater.h"
+
+class LLLineEditor;
+class LLButton;
+
+class LLFloaterRegionRestartSchedule : public LLFloater
+{
+public:
+ LLFloaterRegionRestartSchedule(LLView* owner);
+
+ virtual ~LLFloaterRegionRestartSchedule();
+
+ bool postBuild() override;
+ void onOpen(const LLSD& key) override;
+ void draw() override;
+
+ void onPMAMButtonClicked();
+ void onSaveButtonClicked();
+
+ void onCommitHours(const LLSD& value);
+ void onCommitMinutes(const LLSD& value);
+
+ void resetUI(bool enable_ui);
+ void updateAMPM();
+
+ static bool canUse();
+
+protected:
+ static void requestRegionShcheduleCoro(std::string url, LLHandle<LLFloater> handle);
+ static void setRegionShcheduleCoro(std::string url, LLSD body, LLHandle<LLFloater> handle);
+
+ LLHandle<LLView> mOwnerHandle;
+ F32 mContextConeOpacity{ 0.f };
+
+ LLLineEditor* mHoursLineEditor{nullptr};
+ LLLineEditor* mMinutesLineEditor{ nullptr };
+ LLButton* mPMAMButton{ nullptr };
+ LLButton* mSaveButton{ nullptr };
+ LLButton* mCancelButton{ nullptr };
+
+ bool mTimeAM{ true };
+};
+
+#endif // LL_LLFLOATERREGIONRESTARTSCHEDULE_H
diff --git a/indra/newview/llfloaterscriptedprefs.cpp b/indra/newview/llfloaterscriptedprefs.cpp
index a38c4b51f2..fa31cd72c1 100644
--- a/indra/newview/llfloaterscriptedprefs.cpp
+++ b/indra/newview/llfloaterscriptedprefs.cpp
@@ -54,8 +54,6 @@ bool LLFloaterScriptEdPrefs::postBuild()
void LLFloaterScriptEdPrefs::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
{
LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue()));
- mEditor->initKeywords();
- mEditor->loadKeywords();
}
void LLFloaterScriptEdPrefs::getUIColor(LLUICtrl* ctrl, const LLSD& param)
diff --git a/indra/newview/llfloatersettingscolor.cpp b/indra/newview/llfloatersettingscolor.cpp
new file mode 100644
index 0000000000..d9c382a1dc
--- /dev/null
+++ b/indra/newview/llfloatersettingscolor.cpp
@@ -0,0 +1,334 @@
+/**
+* @file llfloatersettingscolor.cpp
+* @brief Implementation of LLFloaterSettingsColor
+* @author Rye Cogtail<rye@alchemyviewer.org>
+*
+* $LicenseInfo:firstyear=2024&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2024, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatersettingscolor.h"
+
+#include "llfloater.h"
+#include "llfiltereditor.h"
+#include "lluictrlfactory.h"
+#include "llcombobox.h"
+#include "llspinctrl.h"
+#include "llcolorswatch.h"
+#include "llviewercontrol.h"
+#include "lltexteditor.h"
+
+
+LLFloaterSettingsColor::LLFloaterSettingsColor(const LLSD& key)
+: LLFloater(key),
+ mSettingList(NULL)
+{
+ mCommitCallbackRegistrar.add("CommitSettings", boost::bind(&LLFloaterSettingsColor::onCommitSettings, this));
+ mCommitCallbackRegistrar.add("ClickDefault", boost::bind(&LLFloaterSettingsColor::onClickDefault, this));
+}
+
+LLFloaterSettingsColor::~LLFloaterSettingsColor()
+{}
+
+bool LLFloaterSettingsColor::postBuild()
+{
+ enableResizeCtrls(true, false, true);
+
+ mAlphaSpinner = getChild<LLSpinCtrl>("alpha_spinner");
+ mColorSwatch = getChild<LLColorSwatchCtrl>("color_swatch");
+
+ mDefaultButton = getChild<LLUICtrl>("default_btn");
+ mSettingNameText = getChild<LLTextBox>("color_name_txt");
+
+ getChild<LLFilterEditor>("filter_input")->setCommitCallback(boost::bind(&LLFloaterSettingsColor::setSearchFilter, this, _2));
+
+ mSettingList = getChild<LLScrollListCtrl>("setting_list");
+ mSettingList->setCommitOnSelectionChange(true);
+ mSettingList->setCommitCallback(boost::bind(&LLFloaterSettingsColor::onSettingSelect, this));
+
+ updateList();
+
+ gSavedSettings.getControl("ColorSettingsHideDefault")->getCommitSignal()->connect(boost::bind(&LLFloaterSettingsColor::updateList, this, false));
+
+ return LLFloater::postBuild();
+}
+
+void LLFloaterSettingsColor::draw()
+{
+ LLScrollListItem* first_selected = mSettingList->getFirstSelected();
+ if (first_selected)
+ {
+ if(auto cell = first_selected->getColumn(1))
+ {
+ updateControl(cell->getValue().asString());
+ }
+ }
+
+ LLFloater::draw();
+}
+
+void LLFloaterSettingsColor::onCommitSettings()
+{
+ LLScrollListItem* first_selected = mSettingList->getFirstSelected();
+ if (!first_selected)
+ {
+ return;
+ }
+ auto cell = first_selected->getColumn(1);
+
+ if (!cell)
+ {
+ return;
+ }
+
+ auto color_name = cell->getValue().asString();
+ if (color_name.empty())
+ {
+ return;
+ }
+
+ LLColor4 col4;
+ LLColor3 col3;
+ col3.setValue(mColorSwatch->getValue());
+ col4 = LLColor4(col3, (F32)mAlphaSpinner->getValue().asReal());
+ LLUIColorTable::instance().setColor(color_name, col4);
+
+ updateDefaultColumn(color_name);
+}
+
+// static
+void LLFloaterSettingsColor::onClickDefault()
+{
+ LLScrollListItem* first_selected = mSettingList->getFirstSelected();
+ if (first_selected)
+ {
+ auto cell = first_selected->getColumn(1);
+ if (cell)
+ {
+ auto name = cell->getValue().asString();
+ LLUIColorTable::instance().resetToDefault(name);
+ updateDefaultColumn(name);
+ updateControl(name);
+ }
+ }
+}
+
+// we've switched controls, or doing per-frame update, so update spinners, etc.
+void LLFloaterSettingsColor::updateControl(const std::string& color_name)
+{
+ hideUIControls();
+
+ if (!isSettingHidden(color_name))
+ {
+ mDefaultButton->setVisible(true);
+ mSettingNameText->setVisible(true);
+ mSettingNameText->setText(color_name);
+ mSettingNameText->setToolTip(color_name);
+
+ LLColor4 clr = LLUIColorTable::instance().getColor(color_name);
+ mColorSwatch->setVisible(true);
+ // only set if changed so color picker doesn't update
+ if (clr != LLColor4(mColorSwatch->getValue()))
+ {
+ mColorSwatch->setOriginal(clr);
+ }
+ mAlphaSpinner->setVisible(true);
+ mAlphaSpinner->setLabel(std::string("Alpha"));
+ if (!mAlphaSpinner->hasFocus())
+ {
+ mAlphaSpinner->setPrecision(3);
+ mAlphaSpinner->setMinValue(0.0);
+ mAlphaSpinner->setMaxValue(1.f);
+ mAlphaSpinner->setValue(clr.mV[VALPHA]);
+ }
+ }
+
+}
+
+void LLFloaterSettingsColor::updateList(bool skip_selection)
+{
+ std::string last_selected;
+ LLScrollListItem* item = mSettingList->getFirstSelected();
+ if (item)
+ {
+ LLScrollListCell* cell = item->getColumn(1);
+ if (cell)
+ {
+ last_selected = cell->getValue().asString();
+ }
+ }
+
+ mSettingList->deleteAllItems();
+
+ const auto& base_colors = LLUIColorTable::instance().getLoadedColors();
+ for (const auto& pair : base_colors)
+ {
+ const auto& name = pair.first;
+ if (matchesSearchFilter(name) && !isSettingHidden(name))
+ {
+ LLSD row;
+
+ row["columns"][0]["column"] = "changed_color";
+ row["columns"][0]["value"] = LLUIColorTable::instance().isDefault(name) ? "" : "*";
+
+ row["columns"][1]["column"] = "color";
+ row["columns"][1]["value"] = name;
+
+ LLScrollListItem* item = mSettingList->addElement(row, ADD_BOTTOM, nullptr);
+ if (!mSearchFilter.empty() && (last_selected == name) && !skip_selection)
+ {
+ std::string lower_name(name);
+ LLStringUtil::toLower(lower_name);
+ if (LLStringUtil::startsWith(lower_name, mSearchFilter))
+ {
+ item->setSelected(true);
+ }
+ }
+ }
+ }
+
+ for (const auto& pair : LLUIColorTable::instance().getUserColors())
+ {
+ const auto& name = pair.first;
+ if (base_colors.find(name) == base_colors.end() && matchesSearchFilter(name) && !isSettingHidden(name))
+ {
+ LLSD row;
+
+ row["columns"][0]["column"] = "changed_color";
+ row["columns"][0]["value"] = LLUIColorTable::instance().isDefault(name) ? "" : "*";
+
+ row["columns"][1]["column"] = "color";
+ row["columns"][1]["value"] = name;
+
+ LLScrollListItem* item = mSettingList->addElement(row, ADD_BOTTOM, nullptr);
+ if (!mSearchFilter.empty() && (last_selected == name) && !skip_selection)
+ {
+ std::string lower_name(name);
+ LLStringUtil::toLower(lower_name);
+ if (LLStringUtil::startsWith(lower_name, mSearchFilter))
+ {
+ item->setSelected(true);
+ }
+ }
+ }
+ }
+
+ mSettingList->updateSort();
+
+ if (!mSettingList->isEmpty())
+ {
+ if (mSettingList->hasSelectedItem())
+ {
+ mSettingList->scrollToShowSelected();
+ }
+ else if (!mSettingList->hasSelectedItem() && !mSearchFilter.empty() && !skip_selection)
+ {
+ if (!mSettingList->selectItemByPrefix(mSearchFilter, false, 1))
+ {
+ mSettingList->selectFirstItem();
+ }
+ mSettingList->scrollToShowSelected();
+ }
+ }
+ else
+ {
+ LLSD row;
+
+ row["columns"][0]["column"] = "changed_color";
+ row["columns"][0]["value"] = "";
+ row["columns"][1]["column"] = "color";
+ row["columns"][1]["value"] = "No matching colors.";
+
+ mSettingList->addElement(row);
+ hideUIControls();
+ }
+}
+
+void LLFloaterSettingsColor::onSettingSelect()
+{
+ LLScrollListItem* first_selected = mSettingList->getFirstSelected();
+ if (first_selected)
+ {
+ auto cell = first_selected->getColumn(1);
+ if (cell)
+ {
+ updateControl(cell->getValue().asString());
+ }
+ }
+}
+
+void LLFloaterSettingsColor::setSearchFilter(const std::string& filter)
+{
+ if(mSearchFilter == filter)
+ return;
+ mSearchFilter = filter;
+ LLStringUtil::toLower(mSearchFilter);
+ updateList();
+}
+
+bool LLFloaterSettingsColor::matchesSearchFilter(std::string setting_name)
+{
+ // If the search filter is empty, everything passes.
+ if (mSearchFilter.empty()) return true;
+
+ LLStringUtil::toLower(setting_name);
+ std::string::size_type match_name = setting_name.find(mSearchFilter);
+
+ return (std::string::npos != match_name);
+}
+
+bool LLFloaterSettingsColor::isSettingHidden(const std::string& color_name)
+{
+ static LLCachedControl<bool> hide_default(gSavedSettings, "ColorSettingsHideDefault", false);
+ return hide_default && LLUIColorTable::instance().isDefault(color_name);
+}
+
+void LLFloaterSettingsColor::updateDefaultColumn(const std::string& color_name)
+{
+ if (isSettingHidden(color_name))
+ {
+ hideUIControls();
+ updateList(true);
+ return;
+ }
+
+ LLScrollListItem* item = mSettingList->getFirstSelected();
+ if (item)
+ {
+ LLScrollListCell* cell = item->getColumn(0);
+ if (cell)
+ {
+ std::string is_default = LLUIColorTable::instance().isDefault(color_name) ? "" : "*";
+ cell->setValue(is_default);
+ }
+ }
+}
+
+void LLFloaterSettingsColor::hideUIControls()
+{
+ mColorSwatch->setVisible(false);
+ mAlphaSpinner->setVisible(false);
+ mDefaultButton->setVisible(false);
+ mSettingNameText->setVisible(false);
+}
+
diff --git a/indra/newview/llfloatersettingscolor.h b/indra/newview/llfloatersettingscolor.h
new file mode 100644
index 0000000000..42eb85cd60
--- /dev/null
+++ b/indra/newview/llfloatersettingscolor.h
@@ -0,0 +1,81 @@
+/**
+* @file llfloatersettingscolor.h
+* @brief Header file for LLFloaterSettingsColor
+* @author Rye Cogtail<rye@alchemyviewer.org>
+*
+* $LicenseInfo:firstyear=2024&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2024, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LLFLOATERCOLORSETTINGS_H
+#define LLFLOATERCOLORSETTINGS_H
+
+#include "llcontrol.h"
+#include "llfloater.h"
+
+class LLColorSwatchCtrl;
+class LLScrollListCtrl;
+class LLSpinCtrl;
+class LLTextBox;
+
+class LLFloaterSettingsColor final
+: public LLFloater
+{
+ friend class LLFloaterReg;
+
+public:
+
+ bool postBuild() override;
+ void draw() override;
+
+ void updateControl(const std::string& color_name);
+
+ void onCommitSettings();
+ void onClickDefault();
+
+ bool matchesSearchFilter(std::string setting_name);
+ bool isSettingHidden(const std::string& color_name);
+
+private:
+ LLFloaterSettingsColor(const LLSD& key);
+ virtual ~LLFloaterSettingsColor();
+
+ void updateList(bool skip_selection = false);
+ void onSettingSelect();
+ void setSearchFilter(const std::string& filter);
+
+ void updateDefaultColumn(const std::string& color_name);
+ void hideUIControls();
+
+ LLScrollListCtrl* mSettingList;
+
+protected:
+ LLUICtrl* mDefaultButton = nullptr;
+ LLTextBox* mSettingNameText = nullptr;
+
+ LLSpinCtrl* mAlphaSpinner = nullptr;
+ LLColorSwatchCtrl* mColorSwatch = nullptr;
+
+ std::string mSearchFilter;
+};
+
+#endif //LLFLOATERCOLORSETTINGS_H
+
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index 17707e808e..8cc01f6dc6 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -51,6 +51,18 @@ bool LLFloaterSettingsDebug::postBuild()
{
enableResizeCtrls(true, false, true);
+ mValSpinner1 = getChild<LLSpinCtrl>("val_spinner_1");
+ mValSpinner2 = getChild<LLSpinCtrl>("val_spinner_2");
+ mValSpinner3 = getChild<LLSpinCtrl>("val_spinner_3");
+ mValSpinner4 = getChild<LLSpinCtrl>("val_spinner_4");
+ mBooleanCombo = getChild<LLUICtrl>("boolean_combo");
+ mValText = getChild<LLUICtrl>("val_text");
+
+ mColorSwatch = getChild<LLColorSwatchCtrl>("val_color_swatch");
+
+ mDefaultButton = getChild<LLUICtrl>("default_btn");
+ mSettingNameText = getChild<LLTextBox>("setting_name_txt");
+
mComment = getChild<LLTextEditor>("comment_text");
getChild<LLFilterEditor>("filter_input")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::setSearchFilter, this, _2));
@@ -104,56 +116,56 @@ void LLFloaterSettingsDebug::onCommitSettings()
switch(controlp->type())
{
case TYPE_U32:
- controlp->set(getChild<LLUICtrl>("val_spinner_1")->getValue());
+ controlp->set(mValSpinner1->getValue());
break;
case TYPE_S32:
- controlp->set(getChild<LLUICtrl>("val_spinner_1")->getValue());
+ controlp->set(mValSpinner1->getValue());
break;
case TYPE_F32:
- controlp->set(LLSD(getChild<LLUICtrl>("val_spinner_1")->getValue().asReal()));
+ controlp->set(LLSD(mValSpinner1->getValue().asReal()));
break;
case TYPE_BOOLEAN:
- controlp->set(getChild<LLUICtrl>("boolean_combo")->getValue());
+ controlp->set(mBooleanCombo->getValue());
break;
case TYPE_STRING:
- controlp->set(LLSD(getChild<LLUICtrl>("val_text")->getValue().asString()));
+ controlp->set(LLSD(mValText->getValue().asString()));
break;
case TYPE_VEC3:
- vector.mV[VX] = (F32)getChild<LLUICtrl>("val_spinner_1")->getValue().asReal();
- vector.mV[VY] = (F32)getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
- vector.mV[VZ] = (F32)getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
+ vector.mV[VX] = (F32)mValSpinner1->getValue().asReal();
+ vector.mV[VY] = (F32)mValSpinner2->getValue().asReal();
+ vector.mV[VZ] = (F32)mValSpinner3->getValue().asReal();
controlp->set(vector.getValue());
break;
case TYPE_VEC3D:
- vectord.mdV[VX] = getChild<LLUICtrl>("val_spinner_1")->getValue().asReal();
- vectord.mdV[VY] = getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
- vectord.mdV[VZ] = getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
+ vectord.mdV[VX] = mValSpinner1->getValue().asReal();
+ vectord.mdV[VY] = mValSpinner2->getValue().asReal();
+ vectord.mdV[VZ] = mValSpinner3->getValue().asReal();
controlp->set(vectord.getValue());
break;
case TYPE_QUAT:
- quat.mQ[VX] = getChild<LLUICtrl>("val_spinner_1")->getValue().asReal();
- quat.mQ[VY] = getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
- quat.mQ[VZ] = getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
- quat.mQ[VS] = getChild<LLUICtrl>("val_spinner_4")->getValue().asReal();;
+ quat.mQ[VX] = mValSpinner1->getValueF32();
+ quat.mQ[VY] = mValSpinner2->getValueF32();
+ quat.mQ[VZ] = mValSpinner3->getValueF32();
+ quat.mQ[VS] = mValSpinner4->getValueF32();
controlp->set(quat.getValue());
break;
case TYPE_RECT:
- rect.mLeft = getChild<LLUICtrl>("val_spinner_1")->getValue().asInteger();
- rect.mRight = getChild<LLUICtrl>("val_spinner_2")->getValue().asInteger();
- rect.mBottom = getChild<LLUICtrl>("val_spinner_3")->getValue().asInteger();
- rect.mTop = getChild<LLUICtrl>("val_spinner_4")->getValue().asInteger();
+ rect.mLeft = mValSpinner1->getValue().asInteger();
+ rect.mRight = mValSpinner2->getValue().asInteger();
+ rect.mBottom = mValSpinner3->getValue().asInteger();
+ rect.mTop = mValSpinner4->getValue().asInteger();
controlp->set(rect.getValue());
break;
case TYPE_COL4:
- col3.setValue(getChild<LLUICtrl>("val_color_swatch")->getValue());
- col4 = LLColor4(col3, (F32)getChild<LLUICtrl>("val_spinner_4")->getValue().asReal());
+ col3.setValue(mColorSwatch->getValue());
+ col4 = LLColor4(col3, (F32)mValSpinner4->getValue().asReal());
controlp->set(col4.getValue());
break;
case TYPE_COL3:
- controlp->set(getChild<LLUICtrl>("val_color_swatch")->getValue());
- //col3.mV[VRED] = (F32)floaterp->getChild<LLUICtrl>("val_spinner_1")->getValue().asC();
- //col3.mV[VGREEN] = (F32)floaterp->getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
- //col3.mV[VBLUE] = (F32)floaterp->getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
+ controlp->set(mColorSwatch->getValue());
+ //col3.mV[VRED] = (F32)floaterp->mValSpinner1->getValue().asC();
+ //col3.mV[VGREEN] = (F32)floaterp->mValSpinner2->getValue().asReal();
+ //col3.mV[VBLUE] = (F32)floaterp->mValSpinner3->getValue().asReal();
//controlp->set(col3.getValue());
break;
default:
@@ -181,19 +193,6 @@ void LLFloaterSettingsDebug::onClickDefault()
// we've switched controls, or doing per-frame update, so update spinners, etc.
void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
{
- LLSpinCtrl* spinner1 = getChild<LLSpinCtrl>("val_spinner_1");
- LLSpinCtrl* spinner2 = getChild<LLSpinCtrl>("val_spinner_2");
- LLSpinCtrl* spinner3 = getChild<LLSpinCtrl>("val_spinner_3");
- LLSpinCtrl* spinner4 = getChild<LLSpinCtrl>("val_spinner_4");
- LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("val_color_swatch");
-
- if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch)
- {
- LL_WARNS() << "Could not find all desired controls by name"
- << LL_ENDL;
- return;
- }
-
hideUIControls();
if (controlp && !isSettingHidden(controlp))
@@ -201,11 +200,11 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
eControlType type = controlp->type();
//hide combo box only for non booleans, otherwise this will result in the combo box closing every frame
- getChildView("boolean_combo")->setVisible( type == TYPE_BOOLEAN);
- getChildView("default_btn")->setVisible(true);
- getChildView("setting_name_txt")->setVisible(true);
- getChild<LLTextBox>("setting_name_txt")->setText(controlp->getName());
- getChild<LLTextBox>("setting_name_txt")->setToolTip(controlp->getName());
+ mBooleanCombo->setVisible( type == TYPE_BOOLEAN);
+ mDefaultButton->setVisible(true);
+ mSettingNameText->setVisible(true);
+ mSettingNameText->setText(controlp->getName());
+ mSettingNameText->setToolTip(controlp->getName());
mComment->setVisible(true);
std::string old_text = mComment->getText();
@@ -218,111 +217,111 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
mComment->setText(controlp->getComment());
}
- spinner1->setMaxValue(F32_MAX);
- spinner2->setMaxValue(F32_MAX);
- spinner3->setMaxValue(F32_MAX);
- spinner4->setMaxValue(F32_MAX);
- spinner1->setMinValue(-F32_MAX);
- spinner2->setMinValue(-F32_MAX);
- spinner3->setMinValue(-F32_MAX);
- spinner4->setMinValue(-F32_MAX);
- if (!spinner1->hasFocus())
+ mValSpinner1->setMaxValue(F32_MAX);
+ mValSpinner2->setMaxValue(F32_MAX);
+ mValSpinner3->setMaxValue(F32_MAX);
+ mValSpinner4->setMaxValue(F32_MAX);
+ mValSpinner1->setMinValue(-F32_MAX);
+ mValSpinner2->setMinValue(-F32_MAX);
+ mValSpinner3->setMinValue(-F32_MAX);
+ mValSpinner4->setMinValue(-F32_MAX);
+ if (!mValSpinner1->hasFocus())
{
- spinner1->setIncrement(0.1f);
+ mValSpinner1->setIncrement(0.1f);
}
- if (!spinner2->hasFocus())
+ if (!mValSpinner2->hasFocus())
{
- spinner2->setIncrement(0.1f);
+ mValSpinner2->setIncrement(0.1f);
}
- if (!spinner3->hasFocus())
+ if (!mValSpinner3->hasFocus())
{
- spinner3->setIncrement(0.1f);
+ mValSpinner3->setIncrement(0.1f);
}
- if (!spinner4->hasFocus())
+ if (!mValSpinner4->hasFocus())
{
- spinner4->setIncrement(0.1f);
+ mValSpinner4->setIncrement(0.1f);
}
LLSD sd = controlp->get();
switch(type)
{
case TYPE_U32:
- spinner1->setVisible(true);
- spinner1->setLabel(std::string("value")); // Debug, don't translate
- if (!spinner1->hasFocus())
+ mValSpinner1->setVisible(true);
+ mValSpinner1->setLabel(std::string("value")); // Debug, don't translate
+ if (!mValSpinner1->hasFocus())
{
- spinner1->setValue(sd);
- spinner1->setMinValue((F32)U32_MIN);
- spinner1->setMaxValue((F32)U32_MAX);
- spinner1->setIncrement(1.f);
- spinner1->setPrecision(0);
+ mValSpinner1->setValue(sd);
+ mValSpinner1->setMinValue((F32)U32_MIN);
+ mValSpinner1->setMaxValue((F32)U32_MAX);
+ mValSpinner1->setIncrement(1.f);
+ mValSpinner1->setPrecision(0);
}
break;
case TYPE_S32:
- spinner1->setVisible(true);
- spinner1->setLabel(std::string("value")); // Debug, don't translate
- if (!spinner1->hasFocus())
+ mValSpinner1->setVisible(true);
+ mValSpinner1->setLabel(std::string("value")); // Debug, don't translate
+ if (!mValSpinner1->hasFocus())
{
- spinner1->setValue(sd);
- spinner1->setMinValue((F32)S32_MIN);
- spinner1->setMaxValue((F32)S32_MAX);
- spinner1->setIncrement(1.f);
- spinner1->setPrecision(0);
+ mValSpinner1->setValue(sd);
+ mValSpinner1->setMinValue((F32)S32_MIN);
+ mValSpinner1->setMaxValue((F32)S32_MAX);
+ mValSpinner1->setIncrement(1.f);
+ mValSpinner1->setPrecision(0);
}
break;
case TYPE_F32:
- spinner1->setVisible(true);
- spinner1->setLabel(std::string("value")); // Debug, don't translate
- if (!spinner1->hasFocus())
+ mValSpinner1->setVisible(true);
+ mValSpinner1->setLabel(std::string("value")); // Debug, don't translate
+ if (!mValSpinner1->hasFocus())
{
- spinner1->setPrecision(3);
- spinner1->setValue(sd);
+ mValSpinner1->setPrecision(3);
+ mValSpinner1->setValue(sd);
}
break;
case TYPE_BOOLEAN:
- if (!getChild<LLUICtrl>("boolean_combo")->hasFocus())
+ if (!mBooleanCombo->hasFocus())
{
if (sd.asBoolean())
{
- getChild<LLUICtrl>("boolean_combo")->setValue(LLSD("true"));
+ mBooleanCombo->setValue(LLSD("true"));
}
else
{
- getChild<LLUICtrl>("boolean_combo")->setValue(LLSD(""));
+ mBooleanCombo->setValue(LLSD(""));
}
}
break;
case TYPE_STRING:
- getChildView("val_text")->setVisible( true);
- if (!getChild<LLUICtrl>("val_text")->hasFocus())
+ mValText->setVisible( true);
+ if (!mValText->hasFocus())
{
- getChild<LLUICtrl>("val_text")->setValue(sd);
+ mValText->setValue(sd);
}
break;
case TYPE_VEC3:
{
LLVector3 v;
v.setValue(sd);
- spinner1->setVisible(true);
- spinner1->setLabel(std::string("X"));
- spinner2->setVisible(true);
- spinner2->setLabel(std::string("Y"));
- spinner3->setVisible(true);
- spinner3->setLabel(std::string("Z"));
- if (!spinner1->hasFocus())
+ mValSpinner1->setVisible(true);
+ mValSpinner1->setLabel(std::string("X"));
+ mValSpinner2->setVisible(true);
+ mValSpinner2->setLabel(std::string("Y"));
+ mValSpinner3->setVisible(true);
+ mValSpinner3->setLabel(std::string("Z"));
+ if (!mValSpinner1->hasFocus())
{
- spinner1->setPrecision(3);
- spinner1->setValue(v[VX]);
+ mValSpinner1->setPrecision(3);
+ mValSpinner1->setValue(v[VX]);
}
- if (!spinner2->hasFocus())
+ if (!mValSpinner2->hasFocus())
{
- spinner2->setPrecision(3);
- spinner2->setValue(v[VY]);
+ mValSpinner2->setPrecision(3);
+ mValSpinner2->setValue(v[VY]);
}
- if (!spinner3->hasFocus())
+ if (!mValSpinner3->hasFocus())
{
- spinner3->setPrecision(3);
- spinner3->setValue(v[VZ]);
+ mValSpinner3->setPrecision(3);
+ mValSpinner3->setValue(v[VZ]);
}
break;
}
@@ -330,26 +329,26 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
{
LLVector3d v;
v.setValue(sd);
- spinner1->setVisible(true);
- spinner1->setLabel(std::string("X"));
- spinner2->setVisible(true);
- spinner2->setLabel(std::string("Y"));
- spinner3->setVisible(true);
- spinner3->setLabel(std::string("Z"));
- if (!spinner1->hasFocus())
+ mValSpinner1->setVisible(true);
+ mValSpinner1->setLabel(std::string("X"));
+ mValSpinner2->setVisible(true);
+ mValSpinner2->setLabel(std::string("Y"));
+ mValSpinner3->setVisible(true);
+ mValSpinner3->setLabel(std::string("Z"));
+ if (!mValSpinner1->hasFocus())
{
- spinner1->setPrecision(3);
- spinner1->setValue(v[VX]);
+ mValSpinner1->setPrecision(3);
+ mValSpinner1->setValue(v[VX]);
}
- if (!spinner2->hasFocus())
+ if (!mValSpinner2->hasFocus())
{
- spinner2->setPrecision(3);
- spinner2->setValue(v[VY]);
+ mValSpinner2->setPrecision(3);
+ mValSpinner2->setValue(v[VY]);
}
- if (!spinner3->hasFocus())
+ if (!mValSpinner3->hasFocus())
{
- spinner3->setPrecision(3);
- spinner3->setValue(v[VZ]);
+ mValSpinner3->setPrecision(3);
+ mValSpinner3->setValue(v[VZ]);
}
break;
}
@@ -357,33 +356,33 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
{
LLQuaternion q;
q.setValue(sd);
- spinner1->setVisible(true);
- spinner1->setLabel(std::string("X"));
- spinner2->setVisible(true);
- spinner2->setLabel(std::string("Y"));
- spinner3->setVisible(true);
- spinner3->setLabel(std::string("Z"));
- spinner4->setVisible(true);
- spinner4->setLabel(std::string("S"));
- if (!spinner1->hasFocus())
+ mValSpinner1->setVisible(true);
+ mValSpinner1->setLabel(std::string("X"));
+ mValSpinner2->setVisible(true);
+ mValSpinner2->setLabel(std::string("Y"));
+ mValSpinner3->setVisible(true);
+ mValSpinner3->setLabel(std::string("Z"));
+ mValSpinner4->setVisible(true);
+ mValSpinner4->setLabel(std::string("S"));
+ if (!mValSpinner1->hasFocus())
{
- spinner1->setPrecision(4);
- spinner1->setValue(q.mQ[VX]);
+ mValSpinner1->setPrecision(4);
+ mValSpinner1->setValue(q.mQ[VX]);
}
- if (!spinner2->hasFocus())
+ if (!mValSpinner2->hasFocus())
{
- spinner2->setPrecision(4);
- spinner2->setValue(q.mQ[VY]);
+ mValSpinner2->setPrecision(4);
+ mValSpinner2->setValue(q.mQ[VY]);
}
- if (!spinner3->hasFocus())
+ if (!mValSpinner3->hasFocus())
{
- spinner3->setPrecision(4);
- spinner3->setValue(q.mQ[VZ]);
+ mValSpinner3->setPrecision(4);
+ mValSpinner3->setValue(q.mQ[VZ]);
}
- if (!spinner4->hasFocus())
+ if (!mValSpinner4->hasFocus())
{
- spinner4->setPrecision(4);
- spinner4->setValue(q.mQ[VS]);
+ mValSpinner4->setPrecision(4);
+ mValSpinner4->setValue(q.mQ[VS]);
}
break;
}
@@ -391,70 +390,70 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
{
LLRect r;
r.setValue(sd);
- spinner1->setVisible(true);
- spinner1->setLabel(std::string("Left"));
- spinner2->setVisible(true);
- spinner2->setLabel(std::string("Right"));
- spinner3->setVisible(true);
- spinner3->setLabel(std::string("Bottom"));
- spinner4->setVisible(true);
- spinner4->setLabel(std::string("Top"));
- if (!spinner1->hasFocus())
+ mValSpinner1->setVisible(true);
+ mValSpinner1->setLabel(std::string("Left"));
+ mValSpinner2->setVisible(true);
+ mValSpinner2->setLabel(std::string("Right"));
+ mValSpinner3->setVisible(true);
+ mValSpinner3->setLabel(std::string("Bottom"));
+ mValSpinner4->setVisible(true);
+ mValSpinner4->setLabel(std::string("Top"));
+ if (!mValSpinner1->hasFocus())
{
- spinner1->setPrecision(0);
- spinner1->setValue(r.mLeft);
+ mValSpinner1->setPrecision(0);
+ mValSpinner1->setValue(r.mLeft);
}
- if (!spinner2->hasFocus())
+ if (!mValSpinner2->hasFocus())
{
- spinner2->setPrecision(0);
- spinner2->setValue(r.mRight);
+ mValSpinner2->setPrecision(0);
+ mValSpinner2->setValue(r.mRight);
}
- if (!spinner3->hasFocus())
+ if (!mValSpinner3->hasFocus())
{
- spinner3->setPrecision(0);
- spinner3->setValue(r.mBottom);
+ mValSpinner3->setPrecision(0);
+ mValSpinner3->setValue(r.mBottom);
}
- if (!spinner4->hasFocus())
+ if (!mValSpinner4->hasFocus())
{
- spinner4->setPrecision(0);
- spinner4->setValue(r.mTop);
+ mValSpinner4->setPrecision(0);
+ mValSpinner4->setValue(r.mTop);
}
- spinner1->setMinValue((F32)S32_MIN);
- spinner1->setMaxValue((F32)S32_MAX);
- spinner1->setIncrement(1.f);
+ mValSpinner1->setMinValue((F32)S32_MIN);
+ mValSpinner1->setMaxValue((F32)S32_MAX);
+ mValSpinner1->setIncrement(1.f);
- spinner2->setMinValue((F32)S32_MIN);
- spinner2->setMaxValue((F32)S32_MAX);
- spinner2->setIncrement(1.f);
+ mValSpinner2->setMinValue((F32)S32_MIN);
+ mValSpinner2->setMaxValue((F32)S32_MAX);
+ mValSpinner2->setIncrement(1.f);
- spinner3->setMinValue((F32)S32_MIN);
- spinner3->setMaxValue((F32)S32_MAX);
- spinner3->setIncrement(1.f);
+ mValSpinner3->setMinValue((F32)S32_MIN);
+ mValSpinner3->setMaxValue((F32)S32_MAX);
+ mValSpinner3->setIncrement(1.f);
- spinner4->setMinValue((F32)S32_MIN);
- spinner4->setMaxValue((F32)S32_MAX);
- spinner4->setIncrement(1.f);
+ mValSpinner4->setMinValue((F32)S32_MIN);
+ mValSpinner4->setMaxValue((F32)S32_MAX);
+ mValSpinner4->setIncrement(1.f);
break;
}
case TYPE_COL4:
{
LLColor4 clr;
clr.setValue(sd);
- color_swatch->setVisible(true);
+ mColorSwatch->setVisible(true);
// only set if changed so color picker doesn't update
- if(clr != LLColor4(color_swatch->getValue()))
+ if(clr != LLColor4(mColorSwatch->getValue()))
{
- color_swatch->set(LLColor4(sd), true, false);
+ mColorSwatch->set(LLColor4(sd), true, false);
}
- spinner4->setVisible(true);
- spinner4->setLabel(std::string("Alpha"));
- if (!spinner4->hasFocus())
+ mValSpinner4->setVisible(true);
+ mValSpinner4->setLabel(std::string("Alpha"));
+ if (!mValSpinner4->hasFocus())
{
- spinner4->setPrecision(3);
- spinner4->setMinValue(0.0);
- spinner4->setMaxValue(1.f);
- spinner4->setValue(clr.mV[VALPHA]);
+ mValSpinner4->setPrecision(3);
+ mValSpinner4->setMinValue(0.0);
+ mValSpinner4->setMaxValue(1.f);
+ mValSpinner4->setValue(clr.mV[VALPHA]);
}
break;
}
@@ -462,8 +461,8 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
{
LLColor3 clr;
clr.setValue(sd);
- color_swatch->setVisible(true);
- color_swatch->setValue(sd);
+ mColorSwatch->setVisible(true);
+ mColorSwatch->setValue(sd);
break;
}
default:
@@ -624,15 +623,15 @@ void LLFloaterSettingsDebug::updateDefaultColumn(LLControlVariable* control)
void LLFloaterSettingsDebug::hideUIControls()
{
- getChildView("val_spinner_1")->setVisible(false);
- getChildView("val_spinner_2")->setVisible(false);
- getChildView("val_spinner_3")->setVisible(false);
- getChildView("val_spinner_4")->setVisible(false);
- getChildView("val_color_swatch")->setVisible(false);
- getChildView("val_text")->setVisible(false);
- getChildView("default_btn")->setVisible(false);
- getChildView("boolean_combo")->setVisible(false);
- getChildView("setting_name_txt")->setVisible(false);
+ mValSpinner1->setVisible(false);
+ mValSpinner2->setVisible(false);
+ mValSpinner3->setVisible(false);
+ mValSpinner4->setVisible(false);
+ mColorSwatch->setVisible(false);
+ mValText->setVisible(false);
+ mDefaultButton->setVisible(false);
+ mBooleanCombo->setVisible(false);
+ mSettingNameText->setVisible(false);
mComment->setVisible(false);
}
diff --git a/indra/newview/llfloatersettingsdebug.h b/indra/newview/llfloatersettingsdebug.h
index 4df0dc8dd2..b813cf4a74 100644
--- a/indra/newview/llfloatersettingsdebug.h
+++ b/indra/newview/llfloatersettingsdebug.h
@@ -30,9 +30,12 @@
#include "llcontrol.h"
#include "llfloater.h"
+class LLColorSwatchCtrl;
class LLScrollListCtrl;
+class LLSpinCtrl;
+class LLTextBox;
-class LLFloaterSettingsDebug
+class LLFloaterSettingsDebug final
: public LLFloater
{
friend class LLFloaterReg;
@@ -67,6 +70,16 @@ private:
protected:
class LLTextEditor* mComment;
+ LLSpinCtrl* mValSpinner1 = nullptr;
+ LLSpinCtrl* mValSpinner2 = nullptr;
+ LLSpinCtrl* mValSpinner3 = nullptr;
+ LLSpinCtrl* mValSpinner4 = nullptr;
+ LLUICtrl* mBooleanCombo = nullptr;
+ LLUICtrl* mValText = nullptr;
+ LLUICtrl* mDefaultButton = nullptr;
+ LLTextBox* mSettingNameText = nullptr;
+
+ LLColorSwatchCtrl* mColorSwatch = nullptr;
std::string mSearchFilter;
};
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
index 2f6d14d6b5..78550b6520 100644
--- a/indra/newview/llfloatersidepanelcontainer.cpp
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -28,6 +28,7 @@
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
+#include "llnotificationsutil.h"
#include "llpaneleditwearable.h"
// newview includes
@@ -52,31 +53,39 @@ LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer()
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
}
+bool LLFloaterSidePanelContainer::postBuild()
+{
+ mMainPanel = getChild<LLPanel>(sMainPanelName);
+ return true;
+}
+
void LLFloaterSidePanelContainer::onOpen(const LLSD& key)
{
- getChild<LLPanel>(sMainPanelName)->onOpen(key);
+ mMainPanel->onOpen(key);
}
void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)
{
- LLPanelOutfitEdit* panel_outfit_edit =
- dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::findPanel("appearance", "panel_outfit_edit"));
- if (panel_outfit_edit)
+ if(getInstanceName() == "appearance")
{
- LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit);
- if (parent == this )
+ LLPanelOutfitEdit* panel_outfit_edit = findChild<LLPanelOutfitEdit>("panel_outfit_edit");
+ if (panel_outfit_edit)
{
- LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance"));
- if (panel_appearance)
+ LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit);
+ if (parent == this)
{
- LLPanelEditWearable *edit_wearable_ptr = panel_appearance->getWearable();
- if (edit_wearable_ptr)
- {
- edit_wearable_ptr->onClose();
- }
- if (!app_quitting)
+ LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(mMainPanel);
+ if (panel_appearance)
{
- panel_appearance->showOutfitsInventoryPanel();
+ LLPanelEditWearable *edit_wearable_ptr = panel_appearance->getWearable();
+ if (edit_wearable_ptr)
+ {
+ edit_wearable_ptr->onClose();
+ }
+ if(!app_quitting)
+ {
+ panel_appearance->showOutfitsInventoryPanel();
+ }
}
}
}
@@ -90,6 +99,45 @@ void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)
}
}
+void LLFloaterSidePanelContainer::onClickCloseBtn(bool app_quitting)
+{
+ if (!app_quitting && getInstanceName() == "appearance")
+ {
+ LLPanelOutfitEdit* panel_outfit_edit = findChild<LLPanelOutfitEdit>("panel_outfit_edit");
+ if (panel_outfit_edit)
+ {
+ LLFloater* parent = gFloaterView->getParentFloater(panel_outfit_edit);
+ if (parent == this)
+ {
+ LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance"));
+ if (panel_appearance)
+ {
+ LLPanelEditWearable* edit_wearable_ptr = panel_appearance->getWearable();
+ if (edit_wearable_ptr && edit_wearable_ptr->getVisible() && edit_wearable_ptr->isDirty())
+ {
+ LLNotificationsUtil::add("UsavedWearableChanges", LLSD(), LLSD(), [this](const LLSD& notification, const LLSD& response)
+ {
+ onCloseMsgCallback(notification, response);
+ });
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ closeFloater();
+}
+
+void LLFloaterSidePanelContainer::onCloseMsgCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option)
+ {
+ closeFloater();
+ }
+}
+
LLFloater* LLFloaterSidePanelContainer::getTopmostInventoryFloater()
{
LLFloater* topmost_floater = NULL;
@@ -113,7 +161,7 @@ LLFloater* LLFloaterSidePanelContainer::getTopmostInventoryFloater()
return topmost_floater;
}
-LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params)
+LLPanel* LLFloaterSidePanelContainer::openChildPanel(std::string_view panel_name, const LLSD& params)
{
LLView* view = findChildView(panel_name, true);
if (!view)
@@ -144,7 +192,7 @@ LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_na
return panel;
}
-void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const LLSD& key)
+void LLFloaterSidePanelContainer::showPanel(std::string_view floater_name, const LLSD& key)
{
LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
if (floaterp)
@@ -153,7 +201,7 @@ void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, con
}
}
-void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key)
+void LLFloaterSidePanelContainer::showPanel(std::string_view floater_name, std::string_view panel_name, const LLSD& key)
{
LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
if (floaterp)
@@ -162,25 +210,37 @@ void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, con
}
}
-LLPanel* LLFloaterSidePanelContainer::getPanel(const std::string& floater_name, const std::string& panel_name)
+LLPanel* LLFloaterSidePanelContainer::getPanel(std::string_view floater_name, std::string_view panel_name)
{
LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
-
if (floaterp)
{
- return floaterp->findChild<LLPanel>(panel_name, true);
+ if (panel_name == sMainPanelName)
+ {
+ return floaterp->mMainPanel;
+ }
+ else
+ {
+ return floaterp->findChild<LLPanel>(panel_name, true);
+ }
}
return NULL;
}
-LLPanel* LLFloaterSidePanelContainer::findPanel(const std::string& floater_name, const std::string& panel_name)
+LLPanel* LLFloaterSidePanelContainer::findPanel(std::string_view floater_name, std::string_view panel_name)
{
LLFloaterSidePanelContainer* floaterp = LLFloaterReg::findTypedInstance<LLFloaterSidePanelContainer>(floater_name);
-
if (floaterp)
{
- return floaterp->findChild<LLPanel>(panel_name, true);
+ if (panel_name == sMainPanelName)
+ {
+ return floaterp->mMainPanel;
+ }
+ else
+ {
+ return floaterp->findChild<LLPanel>(panel_name, true);
+ }
}
return NULL;
diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h
index d5d0c43cae..4b9d0e34a7 100644
--- a/indra/newview/llfloatersidepanelcontainer.h
+++ b/indra/newview/llfloatersidepanelcontainer.h
@@ -49,23 +49,27 @@ public:
LLFloaterSidePanelContainer(const LLSD& key, const Params& params = getDefaultParams());
~LLFloaterSidePanelContainer();
- /*virtual*/ void onOpen(const LLSD& key);
+ bool postBuild() override;
- /*virtual*/ void closeFloater(bool app_quitting = false);
+ void onOpen(const LLSD& key) override;
+
+ void closeFloater(bool app_quitting = false) override;
+
+ void onClickCloseBtn(bool app_qutting) override;
void cleanup() { destroy(); }
- LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params);
+ LLPanel* openChildPanel(std::string_view panel_name, const LLSD& params);
static LLFloater* getTopmostInventoryFloater();
- static void showPanel(const std::string& floater_name, const LLSD& key);
+ static void showPanel(std::string_view floater_name, const LLSD& key);
- static void showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key);
+ static void showPanel(std::string_view floater_name, std::string_view panel_name, const LLSD& key);
- static LLPanel* getPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName);
+ static LLPanel* getPanel(std::string_view floater_name, std::string_view panel_name = sMainPanelName);
- static LLPanel* findPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName);
+ static LLPanel* findPanel(std::string_view floater_name, std::string_view panel_name = sMainPanelName);
/**
* Gets the panel of given type T (doesn't show it or do anything else with it).
@@ -75,7 +79,12 @@ public:
* @returns a pointer to the panel of given type T.
*/
template <typename T>
- static T* getPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName)
+ static T* findPanel(std::string_view floater_name, std::string_view panel_name = sMainPanelName)
+ {
+ return dynamic_cast<T*>(findPanel(floater_name, panel_name));
+ }
+ template <typename T>
+ static T* getPanel(std::string_view floater_name, std::string_view panel_name = sMainPanelName)
{
T* panel = dynamic_cast<T*>(getPanel(floater_name, panel_name));
if (!panel)
@@ -84,6 +93,11 @@ public:
}
return panel;
}
+
+protected:
+ void onCloseMsgCallback(const LLSD& notification, const LLSD& response);
+
+ LLPanel* mMainPanel = nullptr;
};
#endif // LL_LLFLOATERSIDEPANELCONTAINER_H
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 2bac7d6360..f7c82621fb 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -46,12 +46,12 @@
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
-LLSnapshotFloaterView* gSnapshotFloaterView = NULL;
+LLSnapshotFloaterView* gSnapshotFloaterView = nullptr;
-const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f;
+constexpr F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f;
-const S32 MAX_POSTCARD_DATASIZE = 1572864; // 1.5 megabyte, similar to simulator limit
-const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512
+constexpr S32 MAX_POSTCARD_DATASIZE = 1572864; // 1.5 megabyte, similar to simulator limit
+constexpr S32 MAX_TEXTURE_SIZE = 2048 ; //max upload texture size 2048 * 2048
static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_floater_view");
@@ -168,10 +168,10 @@ void LLFloaterSnapshotBase::ImplBase::updateLayout(LLFloaterSnapshotBase* floate
panel_width = 700.f;
}
- S32 floater_width = 224.f;
+ S32 floater_width{ 224 };
if(mAdvanced)
{
- floater_width = floater_width + panel_width;
+ floater_width = floater_width + (S32)panel_width;
}
LLUICtrl* thumbnail_placeholder = floaterp->getChild<LLUICtrl>("thumbnail_placeholder");
@@ -185,14 +185,14 @@ void LLFloaterSnapshotBase::ImplBase::updateLayout(LLFloaterSnapshotBase* floate
}
if (!mSkipReshaping)
{
- thumbnail_placeholder->reshape(panel_width, thumbnail_placeholder->getRect().getHeight());
+ thumbnail_placeholder->reshape((S32)panel_width, thumbnail_placeholder->getRect().getHeight());
if (!floaterp->isMinimized())
{
floaterp->reshape(floater_width, floaterp->getRect().getHeight());
}
}
- bool use_freeze_frame = floaterp->getChild<LLUICtrl>("freeze_frame_check")->getValue().asBoolean();
+ bool use_freeze_frame = floaterp->mFreezeFrameCheck && floaterp->mFreezeFrameCheck->getValue().asBoolean();
if (use_freeze_frame)
{
@@ -210,13 +210,10 @@ void LLFloaterSnapshotBase::ImplBase::updateLayout(LLFloaterSnapshotBase* floate
previewp->setEnabled(true);
}
- //RN: freeze all avatars
- LLCharacter* avatarp;
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ // RN: freeze all avatars
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- avatarp = *iter;
- floaterp->impl->mAvatarPauseHandles.push_back(avatarp->requestPause());
+ floaterp->impl->mAvatarPauseHandles.push_back(character->requestPause());
}
// freeze everything else
@@ -283,7 +280,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)
width_ctrl->setValue(w);
if (getActiveSnapshotType(floater) == LLSnapshotModel::SNAPSHOT_TEXTURE)
{
- width_ctrl->setIncrement(w >> 1);
+ width_ctrl->setIncrement((F32)(w >> 1));
}
}
if (height_ctrl->getValue().asInteger() == 0)
@@ -293,7 +290,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)
height_ctrl->setValue(h);
if (getActiveSnapshotType(floater) == LLSnapshotModel::SNAPSHOT_TEXTURE)
{
- height_ctrl->setIncrement(h >> 1);
+ height_ctrl->setIncrement((F32)(h >> 1));
}
}
@@ -303,9 +300,9 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)
S32 width = gViewerWindow->getWindowWidthRaw();
S32 height = gViewerWindow->getWindowHeightRaw();
- width_ctrl->setMaxValue(width);
+ width_ctrl->setMaxValue((F32)width);
- height_ctrl->setMaxValue(height);
+ height_ctrl->setMaxValue((F32)height);
if (width_ctrl->getValue().asInteger() > width)
{
@@ -347,10 +344,22 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)
}
floater->getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : floater->getString("unknown"));
- floater->getChild<LLUICtrl>("file_size_label")->setColor(
- shot_type == LLSnapshotModel::SNAPSHOT_POSTCARD
- && got_bytes
- && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" ));
+
+ LLUIColor color = LLUIColorTable::instance().getColor( "LabelTextColor" );
+ if (shot_type == LLSnapshotModel::SNAPSHOT_POSTCARD
+ && got_bytes
+ && previewp->getDataSize() > MAX_POSTCARD_DATASIZE)
+ {
+ color = LLUIColor(LLColor4::red);
+ }
+ if (shot_type == LLSnapshotModel::SNAPSHOT_WEB
+ && got_bytes
+ && previewp->getDataSize() > LLWebProfile::MAX_WEB_DATASIZE)
+ {
+ color = LLUIColor(LLColor4::red);
+ }
+
+ floater->getChild<LLUICtrl>("file_size_label")->setColor(color);
// Update the width and height spinners based on the corresponding resolution combos. (?)
switch(shot_type)
@@ -720,7 +729,7 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, bool
new_width = spanel->getTypedPreviewWidth();
new_height = spanel->getTypedPreviewHeight();
- // Limit custom size for inventory snapshots to 512x512 px.
+ // Limit custom size for inventory snapshots to 2048x2048 px.
if (getActiveSnapshotType(view) == LLSnapshotModel::SNAPSHOT_TEXTURE)
{
new_width = llmin(new_width, MAX_TEXTURE_SIZE);
@@ -761,8 +770,8 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, bool
getHeightSpinner(view)->setValue(height);
if (getActiveSnapshotType(view) == LLSnapshotModel::SNAPSHOT_TEXTURE)
{
- getWidthSpinner(view)->setIncrement(width >> 1);
- getHeightSpinner(view)->setIncrement(height >> 1);
+ getWidthSpinner(view)->setIncrement((F32)(width >> 1));
+ getHeightSpinner(view)->setIncrement((F32)(height >> 1));
}
}
@@ -882,8 +891,8 @@ void LLFloaterSnapshot::Impl::setImageSizeSpinnersValues(LLFloaterSnapshotBase*
getHeightSpinner(view)->forceSetValue(height);
if (getActiveSnapshotType(view) == LLSnapshotModel::SNAPSHOT_TEXTURE)
{
- getWidthSpinner(view)->setIncrement(width >> 1);
- getHeightSpinner(view)->setIncrement(height >> 1);
+ getWidthSpinner(view)->setIncrement((F32)(width >> 1));
+ getHeightSpinner(view)->setIncrement((F32)(height >> 1));
}
}
@@ -1002,8 +1011,9 @@ bool LLFloaterSnapshot::postBuild()
getChild<LLUICtrl>("layer_types")->setValue("colors");
getChildView("layer_types")->setEnabled(false);
- getChild<LLUICtrl>("freeze_frame_check")->setValue(gSavedSettings.getBOOL("UseFreezeFrame"));
- childSetCommitCallback("freeze_frame_check", ImplBase::onCommitFreezeFrame, this);
+ mFreezeFrameCheck = getChild<LLUICtrl>("freeze_frame_check");
+ mFreezeFrameCheck->setValue(gSavedSettings.getBOOL("UseFreezeFrame"));
+ mFreezeFrameCheck->setCommitCallback(&ImplBase::onCommitFreezeFrame, this);
getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot"));
childSetCommitCallback("auto_snapshot_check", ImplBase::onClickAutoSnap, this);
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index ac5a472b03..6df851b839 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -72,6 +72,7 @@ protected:
LLUICtrl* mThumbnailPlaceholder;
LLUICtrl *mRefreshBtn, *mRefreshLabel;
LLUICtrl *mSucceessLblPanel, *mFailureLblPanel;
+ LLUICtrl* mFreezeFrameCheck = nullptr;
};
class LLFloaterSnapshotBase::ImplBase
diff --git a/indra/newview/llfloaterspellchecksettings.cpp b/indra/newview/llfloaterspellchecksettings.cpp
index 735776f7e5..e58e819345 100644
--- a/indra/newview/llfloaterspellchecksettings.cpp
+++ b/indra/newview/llfloaterspellchecksettings.cpp
@@ -67,7 +67,11 @@ bool LLFloaterSpellCheckerSettings::postBuild(void)
LLSpellChecker::setSettingsChangeCallback(boost::bind(&LLFloaterSpellCheckerSettings::onSpellCheckSettingsChange, this));
getChild<LLUICtrl>("spellcheck_remove_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnRemove, this));
getChild<LLUICtrl>("spellcheck_import_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnImport, this));
- getChild<LLUICtrl>("spellcheck_main_combo")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::refreshDictionaries, this, false));
+ getChild<LLUICtrl>("spellcheck_main_combo")->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& data)
+ {
+ mMainSelectionChanged = true;
+ refreshDictionaries(false);
+ });
getChild<LLUICtrl>("spellcheck_moveleft_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnMove, this, "spellcheck_active_list", "spellcheck_available_list"));
getChild<LLUICtrl>("spellcheck_moveright_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnMove, this, "spellcheck_available_list", "spellcheck_active_list"));
center();
@@ -146,7 +150,7 @@ void LLFloaterSpellCheckerSettings::onBtnRemove()
void LLFloaterSpellCheckerSettings::onSpellCheckSettingsChange()
{
- refreshDictionaries(true);
+ refreshDictionaries(!mMainSelectionChanged);
}
void LLFloaterSpellCheckerSettings::refreshDictionaries(bool from_settings)
diff --git a/indra/newview/llfloaterspellchecksettings.h b/indra/newview/llfloaterspellchecksettings.h
index f05bf68040..ff76ff6ba5 100644
--- a/indra/newview/llfloaterspellchecksettings.h
+++ b/indra/newview/llfloaterspellchecksettings.h
@@ -45,6 +45,8 @@ protected:
void onBtnRemove();
void onSpellCheckSettingsChange();
void refreshDictionaries(bool from_settings);
+
+ bool mMainSelectionChanged{ false };
};
class LLFloaterSpellCheckerImport : public LLFloater
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index aadc5b9580..f6d8fcab36 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -284,6 +284,15 @@ bool LLFloaterTools::postBuild()
// the setting stores the actual force multiplier, but the slider is logarithmic, so we convert here
getChild<LLUICtrl>("slider force")->setValue(log10(gSavedSettings.getF32("LandBrushForce")));
+ mTextBulldozer = getChild<LLTextBox>("Bulldozer:");
+ mTextDozerSize = getChild<LLTextBox>("Dozer Size:");
+ mTextDozerStrength = getChild<LLTextBox>("Strength:");
+ mSliderZoom = getChild<LLSlider>("slider zoom");
+
+ mTextSelectionCount = getChild<LLTextBox>("selection_count");
+ mTextSelectionEmpty = getChild<LLTextBox>("selection_empty");
+ mTextSelectionFaces = getChild<LLTextBox>("selection_faces");
+
mCostTextBorder = getChild<LLViewBorder>("cost_text_border");
mTab = getChild<LLTabContainer>("Object Info Tabs");
@@ -450,10 +459,10 @@ void LLFloaterTools::refresh()
{
std::string obj_count_string;
LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
- getChild<LLUICtrl>("selection_count")->setTextArg("[OBJ_COUNT]", obj_count_string);
+ mTextSelectionCount->setTextArg("[OBJ_COUNT]", obj_count_string);
std::string prim_count_string;
LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
- getChild<LLUICtrl>("selection_count")->setTextArg("[PRIM_COUNT]", prim_count_string);
+ mTextSelectionCount->setTextArg("[PRIM_COUNT]", prim_count_string);
// calculate selection rendering cost
if (sShowObjectCost)
@@ -521,23 +530,18 @@ void LLFloaterTools::refresh()
}
}
}
-
- childSetTextArg("selection_faces", "[FACES_STRING]", faces_str);
+ mTextSelectionFaces->setTextArg("[FACES_STRING]", faces_str);
}
bool show_faces = (object_count == 1)
&& LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool();
- getChildView("selection_faces")->setVisible(show_faces);
+ mTextSelectionFaces->setVisible(show_faces);
LLStringUtil::format_map_t selection_args;
selection_args["OBJ_COUNT"] = llformat("%.1d", link_count);
selection_args["LAND_IMPACT"] = llformat("%.1d", (S32)link_cost);
- std::ostringstream selection_info;
-
- selection_info << getString("status_selectcount", selection_args);
-
- getChild<LLTextBox>("selection_count")->setText(selection_info.str());
+ mTextSelectionCount->setText(getString("status_selectcount", selection_args));
}
@@ -618,8 +622,9 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
mBtnFocus ->setToggleState( focus_visible );
mRadioGroupFocus->setVisible( focus_visible );
- getChildView("slider zoom")->setVisible( focus_visible);
- getChildView("slider zoom")->setEnabled(gCameraBtnZoom);
+
+ mSliderZoom->setVisible( focus_visible);
+ mSliderZoom->setEnabled(gCameraBtnZoom);
if (!gCameraBtnOrbit &&
!gCameraBtnPan &&
@@ -644,7 +649,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
}
// multiply by correction factor because volume sliders go [0, 0.5]
- getChild<LLUICtrl>("slider zoom")->setValue(gAgentCamera.getCameraZoomFraction() * 0.5f);
+ mSliderZoom->setValue(gAgentCamera.getCameraZoomFraction() * 0.5f);
// Move buttons
bool move_visible = (tool == LLToolGrab::getInstance());
@@ -832,22 +837,22 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
}
if (mSliderDozerSize)
{
- mSliderDozerSize ->setVisible( land_visible );
- getChildView("Bulldozer:")->setVisible( land_visible);
- getChildView("Dozer Size:")->setVisible( land_visible);
+ mSliderDozerSize->setVisible( land_visible );
+ mTextBulldozer->setVisible( land_visible);
+ mTextDozerSize->setVisible( land_visible);
}
if (mSliderDozerForce)
{
- mSliderDozerForce ->setVisible( land_visible );
- getChildView("Strength:")->setVisible( land_visible);
+ mSliderDozerForce->setVisible( land_visible );
+ mTextDozerStrength->setVisible( land_visible);
}
bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty();
- getChildView("selection_count")->setVisible(!land_visible && have_selection);
- getChildView("selection_faces")->setVisible(LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()
+ mTextSelectionCount->setVisible(!land_visible && have_selection);
+ mTextSelectionFaces->setVisible(LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()
&& LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1);
- getChildView("selection_empty")->setVisible(!land_visible && !have_selection);
+ mTextSelectionEmpty->setVisible(!land_visible && !have_selection);
mTab->setVisible(!land_visible);
mPanelLandInfo->setVisible(land_visible);
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index f9c3b401bb..0f7a61b733 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -148,6 +148,11 @@ public:
LLButton *mBtnDuplicate;
LLButton *mBtnDuplicateInPlace;
+ LLTextBox* mTextSelectionCount = nullptr;
+ LLTextBox* mTextSelectionEmpty = nullptr;
+ LLTextBox* mTextSelectionFaces = nullptr;
+ LLSlider* mSliderZoom = nullptr;
+
// Create buttons
LLCheckBoxCtrl *mCheckSticky;
LLCheckBoxCtrl *mCheckCopySelection;
@@ -155,9 +160,12 @@ public:
LLCheckBoxCtrl *mCheckCopyRotates;
// Land buttons
- LLRadioGroup* mRadioGroupLand;
- LLSlider *mSliderDozerSize;
- LLSlider *mSliderDozerForce;
+ LLRadioGroup* mRadioGroupLand = nullptr;
+ LLSlider *mSliderDozerSize = nullptr;
+ LLSlider *mSliderDozerForce = nullptr;
+ LLTextBox* mTextBulldozer = nullptr;
+ LLTextBox* mTextDozerSize = nullptr;
+ LLTextBox* mTextDozerStrength = nullptr;
LLButton *mBtnApplyToSelection;
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 64b22c4bb1..9bc8c63fa0 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -195,7 +195,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
{
parcel_buf = parcel_name;
script_memory = script_size;
- total_memory += script_size;
+ total_memory += (U64)script_size;
}
}
@@ -233,7 +233,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
columns[column_num]["column"] = "time";
columns[column_num]["type"] = "date";
- columns[column_num]["value"] = LLDate((time_t)time_stamp);
+ columns[column_num]["value"] = LLDate((double)time_stamp);
columns[column_num++]["font"] = "SANSSERIF";
if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 6f526e1905..990a299c50 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -64,7 +64,6 @@
// Boost (for linux/unix command-line execv)
#include <boost/tokenizer.hpp>
-#include <boost/shared_ptr.hpp>
// External utility
#include <string>
@@ -1598,7 +1597,7 @@ void LLOverlapPanel::draw()
if(!LLView::sPreviewClickedElement)
{
- LLUI::translate(5,getRect().getHeight()-20); // translate to top-5,left-5
+ LLUI::translate(5.f, (F32)getRect().getHeight() - 20.f); // translate to top-5,left-5
LLView::sDrawPreviewHighlights = false;
LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text, 0, 0, 0, text_color,
LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW);
@@ -1614,7 +1613,7 @@ void LLOverlapPanel::draw()
std::list<LLView*> overlappers = mOverlapMap[LLView::sPreviewClickedElement];
if(overlappers.size() == 0)
{
- LLUI::translate(5,getRect().getHeight()-20); // translate to top-5,left-5
+ LLUI::translate(5.f, (F32)getRect().getHeight() - 20.f); // translate to top-5,left-5
LLView::sDrawPreviewHighlights = false;
std::string current_selection = std::string(current_selection_text + LLView::sPreviewClickedElement->getName() + " (no elements overlap)");
S32 text_width = LLFontGL::getFontSansSerifSmall()->getWidth(current_selection) + 10;
@@ -1679,14 +1678,14 @@ void LLOverlapPanel::draw()
setRect(LLRect(rect.mLeft,rect.mTop,rect.mRight,rect.mTop-height_sum));
}
- LLUI::translate(5,getRect().getHeight()-10); // translate to top left
+ LLUI::translate(5.f, (F32)getRect().getHeight() - 10.f); // translate to top left
LLView::sDrawPreviewHighlights = false;
// draw currently-selected element at top of overlappers
- LLUI::translate(0,-mSpacing);
+ LLUI::translate(0.f, -(F32)mSpacing);
LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text + LLView::sPreviewClickedElement->getName(), 0, 0, 0, text_color,
LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW);
- LLUI::translate(0,-mSpacing-LLView::sPreviewClickedElement->getRect().getHeight()); // skip spacing distance + height
+ LLUI::translate(0.f, -(F32)mSpacing - (F32)LLView::sPreviewClickedElement->getRect().getHeight()); // skip spacing distance + height
LLView::sPreviewClickedElement->draw();
for(std::list<LLView*>::iterator overlap_it = overlappers.begin(); overlap_it != overlappers.end(); ++overlap_it)
@@ -1694,16 +1693,16 @@ void LLOverlapPanel::draw()
LLView* viewp = *overlap_it;
// draw separating line
- LLUI::translate(0,-mSpacing);
+ LLUI::translate(0.f, -(F32)mSpacing);
gl_line_2d(0,0,getRect().getWidth()-10,0,LLColor4(192.0f/255.0f,192.0f/255.0f,192.0f/255.0f));
// draw name
- LLUI::translate(0,-mSpacing);
+ LLUI::translate(0.f, -(F32)mSpacing);
LLFontGL::getFontSansSerifSmall()->renderUTF8(overlapper_text + viewp->getName(), 0, 0, 0, text_color,
LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW);
// draw element
- LLUI::translate(0,-mSpacing-viewp->getRect().getHeight()); // skip spacing distance + height
+ LLUI::translate(0.f, -(F32)mSpacing - (F32)viewp->getRect().getHeight()); // skip spacing distance + height
viewp->draw();
}
mLastClickedElement = LLView::sPreviewClickedElement;
diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp
index f5b5b8293f..e1b6df6072 100644
--- a/indra/newview/llfloaterwebcontent.cpp
+++ b/indra/newview/llfloaterwebcontent.cpp
@@ -220,7 +220,7 @@ void LLFloaterWebContent::preCreate(LLFloaterWebContent::Params& p)
// showInstance will open a new window. Figure out how many web browsers are already open,
// and close the least recently opened one if this will put us over the limit.
- LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList(p.window_class);
+ LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList(p.window_class());
if(instances.size() >= (size_t)browser_window_limit)
{
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 2a72a361d6..fc2cfbcf2b 100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -39,6 +39,8 @@
#include "llbutton.h"
#include "llcallingcard.h"
#include "llcombobox.h"
+#include "llcheckboxctrl.h"
+#include "llsliderctrl.h"
#include "llviewercontrol.h"
#include "llcommandhandler.h"
#include "lldraghandle.h"
@@ -259,6 +261,48 @@ void LLMapFriendObserver::changed(U32 mask)
}
}
+LLWorldMapParcelInfoObserver::LLWorldMapParcelInfoObserver(const LLVector3d& pos_global)
+ : LLRemoteParcelInfoObserver(),
+ mPosGlobal(pos_global),
+ mParcelID(LLUUID::null)
+{ }
+
+LLWorldMapParcelInfoObserver::~LLWorldMapParcelInfoObserver()
+{
+ if (mParcelID.notNull())
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelID, this);
+ }
+}
+
+void LLWorldMapParcelInfoObserver::processParcelInfo(const LLParcelData& parcel_data)
+{
+ if (parcel_data.parcel_id == mParcelID)
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelID, this);
+
+ if (gFloaterWorldMap)
+ {
+ gFloaterWorldMap->processParcelInfo(parcel_data, mPosGlobal);
+ }
+ }
+}
+
+// virtual
+void LLWorldMapParcelInfoObserver::setParcelID(const LLUUID& parcel_id)
+{
+ mParcelID = parcel_id;
+ auto instance = LLRemoteParcelInfoProcessor::getInstance();
+ instance->addObserver(mParcelID, this);
+ instance->sendParcelInfoRequest(mParcelID);
+}
+
+// virtual
+void LLWorldMapParcelInfoObserver::setErrorStatus(S32 status, const std::string& reason)
+{
+ LL_WARNS("LLWorldMapParcelInfoObserver") << "Can't handle remote parcel request." << " Http Status: " << status << ". Reason : " << reason << LL_ENDL;
+}
+
//---------------------------------------------------------------------------
// Statics
//---------------------------------------------------------------------------
@@ -273,23 +317,25 @@ const LLUUID LLFloaterWorldMap::sHomeID( "10000000-0000-0000-0000-000000000001"
LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
: LLFloater(key),
- mInventory(NULL),
- mInventoryObserver(NULL),
- mFriendObserver(NULL),
+ mInventory(nullptr),
+ mInventoryObserver(nullptr),
+ mFriendObserver(nullptr),
mCompletingRegionName(),
mCompletingRegionPos(),
mWaitingForTracker(false),
mIsClosing(false),
mSetToUserPosition(true),
- mTrackedLocation(0,0,0),
+ mTrackedLocation(0.0,0.0,0.0),
mTrackedStatus(LLTracker::TRACKING_NOTHING),
- mListFriendCombo(NULL),
- mListLandmarkCombo(NULL),
- mListSearchResults(NULL)
+ mListFriendCombo(nullptr),
+ mListLandmarkCombo(nullptr),
+ mListSearchResults(nullptr),
+ mParcelInfoObserver(nullptr),
+ mShowParcelInfo(false)
{
gFloaterWorldMap = this;
- mFactoryMap["objects_mapview"] = LLCallbackMap(createWorldMapView, NULL);
+ mFactoryMap["objects_mapview"] = LLCallbackMap(createWorldMapView, nullptr);
mCommitCallbackRegistrar.add("WMap.Coordinates", boost::bind(&LLFloaterWorldMap::onCoordinatesCommit, this));
mCommitCallbackRegistrar.add("WMap.Location", boost::bind(&LLFloaterWorldMap::onLocationCommit, this));
@@ -317,15 +363,35 @@ bool LLFloaterWorldMap::postBuild()
mMapView = dynamic_cast<LLWorldMapView*>(getChild<LLPanel>("objects_mapview"));
mMapView->setPan(0, 0, true);
+ mTeleportButton = getChild<LLButton>("Teleport");
+ mShowDestinationButton = getChild<LLButton>("Show Destination");
+ mCopySlurlButton = getChild<LLButton>("copy_slurl");
+ mGoHomeButton = getChild<LLButton>("Go Home");
+
+ mPeopleCheck = getChild<LLCheckBoxCtrl>("people_chk");
+ mInfohubCheck = getChild<LLCheckBoxCtrl>("infohub_chk");
+ mLandSaleCheck = getChild<LLCheckBoxCtrl>("land_for_sale_chk");
+ mEventsCheck = getChild<LLCheckBoxCtrl>("event_chk");
+ mEventsMatureCheck = getChild<LLCheckBoxCtrl>("events_mature_chk");
+ mEventsAdultCheck = getChild<LLCheckBoxCtrl>("events_adult_chk");
+
+ mAvatarIcon = getChild<LLUICtrl>("avatar_icon");
+ mLandmarkIcon = getChild<LLUICtrl>("landmark_icon");
+ mLocationIcon = getChild<LLUICtrl>("location_icon");
+
+ mTeleportCoordSpinX = getChild<LLUICtrl>("teleport_coordinate_x");
+ 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);
- LLSearchEditor *location_editor = getChild<LLSearchEditor>("location");
- location_editor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1));
- location_editor->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
+ mLocationEditor = getChild<LLSearchEditor>("location");
+ mLocationEditor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1));
+ mLocationEditor->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
mListSearchResults = childGetListInterface("search_results");
@@ -336,8 +402,9 @@ bool LLFloaterWorldMap::postBuild()
landmark_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo);
+ mZoomSlider = getChild<LLSliderCtrl>("zoom slider");
F32 slider_zoom = mMapView->getZoom();
- getChild<LLUICtrl>("zoom slider")->setValue(slider_zoom);
+ mZoomSlider->setValue(slider_zoom);
getChild<LLPanel>("expand_btn_panel")->setMouseDownCallback(boost::bind(&LLFloaterWorldMap::onExpandCollapseBtn, this));
@@ -351,6 +418,11 @@ bool LLFloaterWorldMap::postBuild()
// virtual
LLFloaterWorldMap::~LLFloaterWorldMap()
{
+ if (mParcelInfoObserver)
+ {
+ delete mParcelInfoObserver;
+ }
+
// All cleaned up by LLView destructor
mMapView = NULL;
@@ -414,7 +486,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id);
- getChild<LLUICtrl>("location")->setFocus( true);
+ mLocationEditor->setFocus( true);
gFocusMgr.triggerFocusFlash();
buildAvatarIDList();
@@ -452,9 +524,9 @@ bool LLFloaterWorldMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
S32 map_y = y - mMapView->getRect().mBottom;
if (mMapView->pointInView(map_x, map_y))
{
- F32 old_slider_zoom = (F32) getChild<LLUICtrl>("zoom slider")->getValue().asReal();
+ F32 old_slider_zoom = (F32) mZoomSlider->getValue().asReal();
F32 slider_zoom = old_slider_zoom + ((F32) clicks * -0.3333f);
- getChild<LLUICtrl>("zoom slider")->setValue(LLSD(slider_zoom));
+ mZoomSlider->setValue(LLSD(slider_zoom));
mMapView->zoomWithPivot(slider_zoom, map_x, map_y);
return true;
}
@@ -483,32 +555,32 @@ void LLFloaterWorldMap::draw()
LLViewerRegion* regionp = gAgent.getRegion();
bool agent_on_prelude = (regionp && regionp->isPrelude());
bool enable_go_home = gAgent.isGodlike() || !agent_on_prelude;
- getChildView("Go Home")->setEnabled(enable_go_home);
+ mGoHomeButton->setEnabled(enable_go_home);
updateLocation();
LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus();
if (LLTracker::TRACKING_AVATAR == tracking_status)
{
- getChild<LLUICtrl>("avatar_icon")->setColor( map_track_color);
+ mAvatarIcon->setColor( map_track_color);
}
else
{
- getChild<LLUICtrl>("avatar_icon")->setColor( map_track_disabled_color);
+ mAvatarIcon->setColor( map_track_disabled_color);
}
if (LLTracker::TRACKING_LANDMARK == tracking_status)
{
- getChild<LLUICtrl>("landmark_icon")->setColor( map_track_color);
+ mLandmarkIcon->setColor( map_track_color);
}
else
{
- getChild<LLUICtrl>("landmark_icon")->setColor( map_track_disabled_color);
+ mLandmarkIcon->setColor( map_track_disabled_color);
}
if (LLTracker::TRACKING_LOCATION == tracking_status)
{
- getChild<LLUICtrl>("location_icon")->setColor( map_track_color);
+ mLocationIcon->setColor( map_track_color);
}
else
{
@@ -518,11 +590,11 @@ void LLFloaterWorldMap::draw()
double value = fmod(seconds, 2);
value = 0.5 + 0.5*cos(value * F_PI);
LLColor4 loading_color(0.0, F32(value/2), F32(value), 1.0);
- getChild<LLUICtrl>("location_icon")->setColor( loading_color);
+ mLocationIcon->setColor( loading_color);
}
else
{
- getChild<LLUICtrl>("location_icon")->setColor( map_track_disabled_color);
+ mLocationIcon->setColor( map_track_disabled_color);
}
}
@@ -532,27 +604,26 @@ void LLFloaterWorldMap::draw()
centerOnTarget(true);
}
- getChildView("Teleport")->setEnabled((bool)tracking_status);
+ mTeleportButton->setEnabled((bool)tracking_status);
// getChildView("Clear")->setEnabled((bool)tracking_status);
- getChildView("Show Destination")->setEnabled((bool)tracking_status || LLWorldMap::getInstance()->isTracking());
- getChildView("copy_slurl")->setEnabled((mSLURL.isValid()) );
+ mShowDestinationButton->setEnabled((bool)tracking_status || LLWorldMap::getInstance()->isTracking());
+ mCopySlurlButton->setEnabled((mSLURL.isValid()) );
setMouseOpaque(true);
getDragHandle()->setMouseOpaque(true);
- mMapView->zoom((F32)getChild<LLUICtrl>("zoom slider")->getValue().asReal());
+ mMapView->zoom((F32)mZoomSlider->getValue().asReal());
// Enable/disable checkboxes depending on the zoom level
// If above threshold level (i.e. low res) -> Disable all checkboxes
// If under threshold level (i.e. high res) -> Enable all checkboxes
bool enable = mMapView->showRegionInfo();
- getChildView("people_chk")->setEnabled(enable);
- getChildView("infohub_chk")->setEnabled(enable);
- getChildView("telehub_chk")->setEnabled(enable);
- getChildView("land_for_sale_chk")->setEnabled(enable);
- getChildView("event_chk")->setEnabled(enable);
- getChildView("events_mature_chk")->setEnabled(enable);
- getChildView("events_adult_chk")->setEnabled(enable);
+ mPeopleCheck->setEnabled(enable);
+ mInfohubCheck->setEnabled(enable);
+ mLandSaleCheck->setEnabled(enable);
+ mEventsCheck->setEnabled(enable);
+ mEventsMatureCheck->setEnabled(enable);
+ mEventsAdultCheck->setEnabled(enable);
LLFloater::draw();
}
@@ -562,9 +633,73 @@ void LLFloaterWorldMap::draw()
// Internal utility functions
//-------------------------------------------------------------------------
+void LLFloaterWorldMap::processParcelInfo(const LLParcelData& parcel_data, const LLVector3d& pos_global) const
+{
+ LLVector3d tracker_pos = LLTracker::getTrackedPositionGlobal();
+ if (!mShowParcelInfo ||
+ (tracker_pos.mdV[VX] != pos_global.mdV[VX] && tracker_pos.mdV[VY] != pos_global.mdV[VY]) ||
+ LLTracker::getTrackedLocationType() != LLTracker::LOCATION_NOTHING ||
+ LLTracker::getTrackingStatus() != LLTracker::TRACKING_LOCATION)
+ {
+ return;
+ }
+
+ LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
+ if (!sim_info)
+ {
+ return;
+ }
+
+ std::string sim_name = sim_info->getName();
+ U32 locX, locY;
+ from_region_handle(sim_info->getHandle(), &locX, &locY);
+ F32 region_x = (F32)(pos_global.mdV[VX] - locX);
+ F32 region_y = (F32)(pos_global.mdV[VY] - locY);
+ std::string full_name = llformat("%s (%d, %d, %d)",
+ sim_name.c_str(),
+ ll_round(region_x),
+ ll_round(region_y),
+ ll_round((F32)pos_global.mdV[VZ]));
+
+ LLTracker::trackLocation(pos_global, parcel_data.name.empty() ? getString("UnnamedParcel") : parcel_data.name, full_name);
+}
+
+void LLFloaterWorldMap::requestParcelInfo(const LLVector3d& pos_global, const LLVector3d& region_origin)
+{
+ if (pos_global == mRequestedGlobalPos)
+ {
+ return;
+ }
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ {
+ return;
+ }
+
+ if (std::string url = region->getCapability("RemoteParcelRequest"); !url.empty())
+ {
+ mRequestedGlobalPos = pos_global;
+ if (mParcelInfoObserver)
+ {
+ delete mParcelInfoObserver;
+ }
+ mParcelInfoObserver = new LLWorldMapParcelInfoObserver(pos_global);
+
+ auto pos_region = LLVector3(pos_global - region_origin);
+ LLRemoteParcelInfoProcessor::instance().requestRegionParcelInfo(url,
+ region->getRegionID(), pos_region, pos_global,
+ mParcelInfoObserver->getObserverHandle());
+ }
+ else
+ {
+ LL_WARNS() << "Cannot request parcel details: Cap not found" << LL_ENDL;
+ }
+}
void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string& name )
{
+ mShowParcelInfo = false;
LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo");
if (!iface) return;
@@ -576,7 +711,7 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&
// convenience.
if(gAgent.isGodlike())
{
- getChild<LLUICtrl>("teleport_coordinate_z")->setValue(LLSD(200.f));
+ 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)
@@ -595,6 +730,7 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&
void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
{
+ mShowParcelInfo = false;
LLCtrlSelectionInterface *iface = childGetSelectionInterface("landmark combo");
if (!iface) return;
@@ -640,6 +776,7 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
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");
@@ -647,6 +784,7 @@ void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info)
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");
@@ -699,6 +837,9 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking
LLTracker::trackLocation(pos_global, full_name, tooltip);
+ mShowParcelInfo = true;
+ requestParcelInfo(pos_global, sim_info->getGlobalOrigin());
+
LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal();
updateTeleportCoordsDisplay( coord_pos );
@@ -711,9 +852,9 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
// enable/disable teleport destination coordinates
void LLFloaterWorldMap::enableTeleportCoordsDisplay( bool enabled )
{
- childSetEnabled("teleport_coordinate_x", enabled );
- childSetEnabled("teleport_coordinate_y", enabled );
- childSetEnabled("teleport_coordinate_z", enabled );
+ mTeleportCoordSpinX->setEnabled(enabled);
+ mTeleportCoordSpinY->setEnabled(enabled);
+ mTeleportCoordSpinZ->setEnabled(enabled);
}
// update display of teleport destination coordinates - pos is in global coordinates
@@ -728,9 +869,9 @@ void LLFloaterWorldMap::updateTeleportCoordsDisplay( const LLVector3d& pos )
F32 region_local_z = (F32)llclamp( pos.mdV[VZ], 0.0, (F64)REGION_HEIGHT_METERS );
// write in the values
- childSetValue("teleport_coordinate_x", region_local_x );
- childSetValue("teleport_coordinate_y", region_local_y );
- childSetValue("teleport_coordinate_z", region_local_z );
+ mTeleportCoordSpinX->setValue(region_local_x);
+ mTeleportCoordSpinY->setValue(region_local_y);
+ mTeleportCoordSpinZ->setValue(region_local_z);
}
void LLFloaterWorldMap::updateLocation()
@@ -757,7 +898,7 @@ void LLFloaterWorldMap::updateLocation()
mSetToUserPosition = false;
// Fill out the location field
- getChild<LLUICtrl>("location")->setValue(agent_sim_name);
+ mLocationEditor->setValue(agent_sim_name);
// update the coordinate display with location of avatar in region
updateTeleportCoordsDisplay( agentPos );
@@ -790,7 +931,7 @@ void LLFloaterWorldMap::updateLocation()
}
}
- getChild<LLUICtrl>("location")->setValue(sim_name);
+ mLocationEditor->setValue(sim_name);
// refresh coordinate display to reflect where user clicked.
LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal();
@@ -825,17 +966,17 @@ void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S3
else
{
// fill in UI based on URL
- gFloaterWorldMap->getChild<LLUICtrl>("location")->setValue(region_name);
+ mLocationEditor->setValue(region_name);
// Save local coords to highlight position after region global
// position is returned.
- gFloaterWorldMap->mCompletingRegionPos.set(
+ mCompletingRegionPos.set(
(F32)x_coord, (F32)y_coord, (F32)z_coord);
// pass sim name to combo box
- gFloaterWorldMap->mCompletingRegionName = region_name;
+ mCompletingRegionName = region_name;
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name);
- LLStringUtil::toLower(gFloaterWorldMap->mCompletingRegionName);
+ LLStringUtil::toLower(mCompletingRegionName);
LLWorldMap::getInstance()->setTrackingCommit();
}
}
@@ -1067,7 +1208,7 @@ void LLFloaterWorldMap::adjustZoomSliderBounds()
F32 min_power = log(pixels_per_region/256.f)/log(2.f);
- getChild<LLSliderCtrl>("zoom slider")->setMinValue(min_power);
+ mZoomSlider->setMinValue(min_power);
}
@@ -1229,7 +1370,7 @@ void LLFloaterWorldMap::onLocationFocusChanged( LLFocusableElement* focus )
void LLFloaterWorldMap::updateSearchEnabled()
{
if (childHasKeyboardFocus("location") &&
- getChild<LLUICtrl>("location")->getValue().asString().length() > 0)
+ mLocationEditor->getValue().asString().length() > 0)
{
setDefaultBtn("DoSearch");
}
@@ -1250,14 +1391,14 @@ void LLFloaterWorldMap::onLocationCommit()
mCompletingRegionName = "";
mLastRegionName = "";
- std::string str = getChild<LLUICtrl>("location")->getValue().asString();
+ std::string str = mLocationEditor->getValue().asString();
// Trim any leading and trailing spaces in the search target
std::string saved_str = str;
LLStringUtil::trim( str );
if ( str != saved_str )
{ // Set the value in the UI if any spaces were removed
- getChild<LLUICtrl>("location")->setValue(str);
+ mLocationEditor->setValue(str);
}
// Don't try completing empty name (STORM-1427).
@@ -1287,11 +1428,11 @@ void LLFloaterWorldMap::onCoordinatesCommit()
return;
}
- S32 x_coord = (S32)childGetValue("teleport_coordinate_x").asReal();
- S32 y_coord = (S32)childGetValue("teleport_coordinate_y").asReal();
- S32 z_coord = (S32)childGetValue("teleport_coordinate_z").asReal();
+ S32 x_coord = (S32)mTeleportCoordSpinX->getValue().asReal();
+ S32 y_coord = (S32)mTeleportCoordSpinY->getValue().asReal();
+ S32 z_coord = (S32)mTeleportCoordSpinZ->getValue().asReal();
- const std::string region_name = childGetValue("location").asString();
+ const std::string region_name = mLocationEditor->getValue().asString();
trackURL( region_name, x_coord, y_coord, z_coord );
}
@@ -1420,7 +1561,7 @@ void LLFloaterWorldMap::teleport()
&& av_tracker.haveTrackingInfo() )
{
pos_global = av_tracker.getGlobalPos();
- pos_global.mdV[VZ] = getChild<LLUICtrl>("teleport_coordinate_z")->getValue();
+ pos_global.mdV[VZ] = mTeleportCoordSpinZ->getValue();
}
else if ( LLTracker::TRACKING_LANDMARK == tracking_status)
{
@@ -1654,7 +1795,7 @@ void LLFloaterWorldMap::onCommitSearchResult()
pos_global.mdV[VY] += (F64)pos_local.mV[VY];
pos_global.mdV[VZ] = (F64)pos_local.mV[VZ];
- getChild<LLUICtrl>("location")->setValue(sim_name);
+ mLocationEditor->setValue(sim_name);
trackLocation(pos_global);
setDefaultBtn("Teleport");
break;
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index 6765157e55..2f2b2b7a0d 100644
--- a/indra/newview/llfloaterworldmap.h
+++ b/indra/newview/llfloaterworldmap.h
@@ -34,8 +34,9 @@
#include "llfloater.h"
#include "llmapimagetype.h"
-#include "lltracker.h"
+#include "llremoteparcelrequest.h"
#include "llslurl.h"
+#include "lltracker.h"
class LLCtrlListInterface;
class LLFriendObserver;
@@ -45,6 +46,26 @@ class LLItemInfo;
class LLLineEditor;
class LLTabContainer;
class LLWorldMapView;
+class LLButton;
+class LLCheckBoxCtrl;
+class LLSliderCtrl;
+class LLSpinCtrl;
+class LLSearchEditor;
+
+class LLWorldMapParcelInfoObserver : public LLRemoteParcelInfoObserver
+{
+public:
+ LLWorldMapParcelInfoObserver(const LLVector3d& pos_global);
+ ~LLWorldMapParcelInfoObserver();
+
+ void processParcelInfo(const LLParcelData& parcel_data);
+ void setParcelID(const LLUUID& parcel_id);
+ void setErrorStatus(S32 status, const std::string& reason);
+
+protected:
+ LLVector3d mPosGlobal;
+ LLUUID mParcelID;
+};
class LLFloaterWorldMap : public LLFloater
{
@@ -114,6 +135,8 @@ public:
//Slapp instigated avatar tracking
void avatarTrackFromSlapp( const LLUUID& id );
+ void processParcelInfo(const LLParcelData& parcel_data, const LLVector3d& pos_global) const;
+
protected:
void onGoHome();
@@ -142,7 +165,6 @@ protected:
void buildLandmarkIDLists();
void flyToLandmark();
void teleportToLandmark();
- void setLandmarkVisited();
void buildAvatarIDList();
void flyToAvatar();
@@ -165,8 +187,13 @@ private:
// enable/disable teleport destination coordinates
void enableTeleportCoordsDisplay( bool enabled );
- std::vector<LLUUID> mLandmarkAssetIDList;
- std::vector<LLUUID> mLandmarkItemIDList;
+ void requestParcelInfo(const LLVector3d& pos_global, const LLVector3d& region_origin);
+ LLVector3d mRequestedGlobalPos;
+ bool mShowParcelInfo;
+ LLWorldMapParcelInfoObserver* mParcelInfoObserver;
+
+ uuid_vec_t mLandmarkAssetIDList;
+ uuid_vec_t mLandmarkItemIDList;
static const LLUUID sHomeID;
@@ -195,6 +222,29 @@ private:
LLCtrlListInterface * mListLandmarkCombo;
LLCtrlListInterface * mListSearchResults;
+ LLButton* mTeleportButton = nullptr;
+ LLButton* mShowDestinationButton = nullptr;
+ LLButton* mCopySlurlButton = nullptr;
+ LLButton* mGoHomeButton = nullptr;
+
+ LLCheckBoxCtrl* mPeopleCheck = nullptr;
+ LLCheckBoxCtrl* mInfohubCheck = nullptr;
+ LLCheckBoxCtrl* mLandSaleCheck = nullptr;
+ LLCheckBoxCtrl* mEventsCheck = nullptr;
+ LLCheckBoxCtrl* mEventsMatureCheck = nullptr;
+ LLCheckBoxCtrl* mEventsAdultCheck = nullptr;
+
+ LLUICtrl* mAvatarIcon = nullptr;
+ LLUICtrl* mLandmarkIcon = nullptr;
+ LLUICtrl* mLocationIcon = nullptr;
+
+ LLSearchEditor* mLocationEditor = nullptr;
+ LLUICtrl* mTeleportCoordSpinX = nullptr;
+ LLUICtrl* mTeleportCoordSpinY = nullptr;
+ LLUICtrl* mTeleportCoordSpinZ = nullptr;
+
+ LLSliderCtrl* mZoomSlider = nullptr;
+
boost::signals2::connection mTeleportFinishConnection;
};
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 8ee11cdbd2..1bbeba43ec 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -536,7 +536,7 @@ void LLGestureMgr::playGesture(LLMultiGesture* gesture, bool fromKeyPress)
if (!gesture) return;
// Reset gesture to first step
- gesture->mCurrentStep = 0;
+ gesture->reset();
gesture->mTriggeredByKey = fromKeyPress;
// Add to list of playing
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 08f8918e5d..19cb4d04e2 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -893,7 +893,7 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di
{
pos_end.mV[i] = pos_agent.mV[i] + (50 * direction.mV[i]);
}
- glLineWidth(LLPipeline::DebugBeaconLineWidth);
+ glLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth);
gGL.begin(LLRender::LINES);
color.mV[3] *= 0.5f;
gGL.color4fv(color.mV);
@@ -1190,8 +1190,8 @@ F32 gpu_benchmark()
F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f;
F32 seconds = ms/1000.f;
- F64 samples_drawn = gBenchmarkProgram.mSamplesDrawn;
- F32 samples_sec = (samples_drawn/1000000000.0)/seconds;
+ F64 samples_drawn = (F64)gBenchmarkProgram.mSamplesDrawn;
+ F32 samples_sec = (F32)((samples_drawn/1000000000.0)/seconds);
gbps = samples_sec*4; // 4 bytes per sample
LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << " GB/sec according to ARB_timer_query, total time " << seconds << " seconds" << LL_ENDL;
diff --git a/indra/newview/llgltffolderitem.cpp b/indra/newview/llgltffolderitem.cpp
new file mode 100644
index 0000000000..77a19c060d
--- /dev/null
+++ b/indra/newview/llgltffolderitem.cpp
@@ -0,0 +1,164 @@
+/**
+ * @file llgltffolderitem.cpp
+ * @author Andrey Kleshchev
+ * @brief LLGLTFFolderItem class implementation
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llgltffolderitem.h"
+
+#include "llinventoryicon.h"
+
+/// LLGLTFItem
+
+LLGLTFFolderItem::LLGLTFFolderItem(S32 id, const std::string &display_name, EType type, LLFolderViewModelInterface& root_view_model)
+ : LLFolderViewModelItemCommon(root_view_model)
+ , mName(display_name)
+ , mItemType(type)
+ , mItemId(id)
+{
+ init();
+}
+
+LLGLTFFolderItem::LLGLTFFolderItem(LLFolderViewModelInterface& root_view_model)
+ : LLFolderViewModelItemCommon(root_view_model)
+{
+ init();
+}
+
+LLGLTFFolderItem::~LLGLTFFolderItem()
+{
+
+}
+
+void LLGLTFFolderItem::init()
+{
+ // using inventory icons as a placeholder.
+ // Todo: GLTF needs to have own icons
+ switch (mItemType)
+ {
+ case TYPE_SCENE:
+ pIcon = LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_OBJECT_MULTI);
+ break;
+ case TYPE_NODE:
+ pIcon = LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_OBJECT);
+ break;
+ case TYPE_MESH:
+ pIcon = LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_MESH);
+ break;
+ case TYPE_SKIN:
+ pIcon = LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_BODYPART_SKIN);
+ break;
+ default:
+ pIcon = LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_OBJECT);
+ break;
+ }
+}
+
+
+bool LLGLTFFolderItem::filterChildItem(LLFolderViewModelItem* item, LLFolderViewFilter& filter)
+{
+ S32 filter_generation = filter.getCurrentGeneration();
+
+ bool continue_filtering = true;
+ if (item)
+ {
+ if (item->getLastFilterGeneration() < filter_generation)
+ {
+ // Recursive application of the filter for child items (CHUI-849)
+ continue_filtering = item->filter(filter);
+ }
+
+ // Update latest generation to pass filter in parent and propagate up to root
+ if (item->passedFilter())
+ {
+ LLGLTFFolderItem* view_model = this;
+
+ while (view_model && view_model->mMostFilteredDescendantGeneration < filter_generation)
+ {
+ view_model->mMostFilteredDescendantGeneration = filter_generation;
+ view_model = static_cast<LLGLTFFolderItem*>(view_model->mParent);
+ }
+ }
+ }
+ return continue_filtering;
+}
+
+bool LLGLTFFolderItem::filter(LLFolderViewFilter& filter)
+{
+ const S32 filter_generation = filter.getCurrentGeneration();
+ const S32 must_pass_generation = filter.getFirstRequiredGeneration();
+
+ if (getLastFilterGeneration() >= must_pass_generation
+ && getLastFolderFilterGeneration() >= must_pass_generation
+ && !passedFilter(must_pass_generation))
+ {
+ // failed to pass an earlier filter that was a subset of the current one
+ // go ahead and flag this item as not pass
+ setPassedFilter(false, filter_generation);
+ setPassedFolderFilter(false, filter_generation);
+ return true;
+ }
+
+ bool is_folder = true;
+ const bool passed_filter_folder = is_folder ? filter.checkFolder(this) : true;
+ setPassedFolderFilter(passed_filter_folder, filter_generation);
+
+ bool continue_filtering = true;
+
+ if (!mChildren.empty()
+ && (getLastFilterGeneration() < must_pass_generation // haven't checked descendants against minimum required generation to pass
+ || descendantsPassedFilter(must_pass_generation))) // or at least one descendant has passed the minimum requirement
+ {
+ // now query children
+ for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end(); iter != end_iter; ++iter)
+ {
+ continue_filtering = filterChildItem((*iter), filter);
+ if (!continue_filtering)
+ {
+ break;
+ }
+ }
+ }
+
+ // If we didn't use all the filter time that means we filtered all of our descendants so we can filter ourselves now
+ if (continue_filtering)
+ {
+ // This is where filter check on the item done (CHUI-849)
+ const bool passed_filter = filter.check(this);
+ if (passed_filter && mChildren.empty() && is_folder) // Update the latest filter generation for empty folders
+ {
+ LLGLTFFolderItem* view_model = this;
+ while (view_model && view_model->mMostFilteredDescendantGeneration < filter_generation)
+ {
+ view_model->mMostFilteredDescendantGeneration = filter_generation;
+ view_model = static_cast<LLGLTFFolderItem*>(view_model->mParent);
+ }
+ }
+ setPassedFilter(passed_filter, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());
+ continue_filtering = !filter.isTimedOut();
+ }
+ return continue_filtering;
+}
diff --git a/indra/newview/llgltffolderitem.h b/indra/newview/llgltffolderitem.h
new file mode 100644
index 0000000000..89d90c81cc
--- /dev/null
+++ b/indra/newview/llgltffolderitem.h
@@ -0,0 +1,128 @@
+/**
+ * @file llgltffolderitem.h
+ * @author Andrey Kleshchev
+ * @brief LLGLTFFolderItem header file
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLGLTFFOLDERITEM_H
+#define LL_LLGLTFFOLDERITEM_H
+
+#include "llfloater.h"
+
+#include "llfolderviewmodel.h"
+
+class LLGLTFFolderItem : public LLFolderViewModelItemCommon
+{
+public:
+ enum EType
+ {
+ TYPE_ROOT,
+ TYPE_SCENE,
+ TYPE_NODE,
+ TYPE_MESH,
+ TYPE_SKIN,
+ };
+
+ LLGLTFFolderItem(S32 id, const std::string &display_name, EType type, LLFolderViewModelInterface& root_view_model);
+ LLGLTFFolderItem(LLFolderViewModelInterface& root_view_model);
+ virtual ~LLGLTFFolderItem();
+
+ void init();
+
+ const std::string& getName() const override { return mName; }
+ const std::string& getDisplayName() const override { return mName; }
+ const std::string& getSearchableName() const override { return mName; }
+
+ std::string getSearchableDescription() const override { return std::string(); }
+ std::string getSearchableCreatorName()const override { return std::string(); }
+ std::string getSearchableUUIDString() const override { return std::string(); }
+
+ LLPointer<LLUIImage> getIcon() const override { return pIcon; }
+ LLPointer<LLUIImage> getIconOpen() const override { return getIcon(); }
+ LLPointer<LLUIImage> getIconOverlay() const override { return NULL; }
+
+ LLFontGL::StyleFlags getLabelStyle() const override { return LLFontGL::NORMAL; }
+ std::string getLabelSuffix() const override { return std::string(); }
+
+ void openItem(void) override {}
+ void closeItem(void) override {}
+ void selectItem(void) override {}
+
+ void navigateToFolder(bool new_window = false, bool change_mode = false) override {}
+
+ bool isItemWearable() const override { return false; }
+
+ bool isItemRenameable() const override { return false; }
+ bool renameItem(const std::string& new_name) override { return false; }
+
+ bool isItemMovable(void) const override { return false; } // Can be moved to another folder
+ void move(LLFolderViewModelItem* parent_listener) override {}
+
+ bool isItemRemovable(bool check_worn = true) const override { return false; }
+ bool removeItem() override { return false; }
+ void removeBatch(std::vector<LLFolderViewModelItem*>& batch) override {}
+
+ bool isItemCopyable(bool can_copy_as_link = true) const override { return false; }
+ bool copyToClipboard() const override { return false; }
+ bool cutToClipboard() override { return false; }
+ bool isCutToClipboard() override { return false; }
+
+ bool isClipboardPasteable() const override { return false; }
+ void pasteFromClipboard() override {}
+ void pasteLinkFromClipboard() override {}
+
+ void buildContextMenu(LLMenuGL& menu, U32 flags) override {};
+
+ bool potentiallyVisible() override { return true; }; // is the item definitely visible or we haven't made up our minds yet?
+
+ bool hasChildren() const override { return mChildren.size() > 0; }
+
+ bool dragOrDrop(
+ MASK mask,
+ bool drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ std::string& tooltip_msg) override
+ {
+ return false;
+ }
+
+ bool filterChildItem(LLFolderViewModelItem* item, LLFolderViewFilter& filter);
+ bool filter(LLFolderViewFilter& filter) override;
+
+ EType getType() const { return mItemType; }
+ S32 getItemId() const { return mItemId; }
+
+private:
+ LLUIImagePtr pIcon;
+ std::string mName;
+ EType mItemType = TYPE_ROOT;
+
+ // mItemId can be an id in a mesh vector, node vector or any other vector.
+ // mItemId is not nessesarily unique, ex: some nodes can reuse the same
+ // mesh or skin, so mesh-items can have the same id.
+ S32 mItemId = -1;
+};
+
+#endif
diff --git a/indra/newview/llgltffoldermodel.cpp b/indra/newview/llgltffoldermodel.cpp
new file mode 100644
index 0000000000..de2510dc4a
--- /dev/null
+++ b/indra/newview/llgltffoldermodel.cpp
@@ -0,0 +1,73 @@
+/**
+ * @file llgltffoldermodel.cpp
+ * @author Andrey Kleshchev
+ * @brief gltf model's folder structure related classes
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llgltffoldermodel.h"
+
+#include "llfolderviewitem.h"
+
+bool LLGLTFSort::operator()(const LLGLTFFolderItem* const& a, const LLGLTFFolderItem* const& b) const
+{
+ // Comparison operator: returns "true" is a comes before b, "false" otherwise
+ S32 compare = LLStringUtil::compareDict(a->getName(), b->getName());
+ return (compare < 0);
+}
+
+/// LLGLTFViewModel
+
+LLGLTFViewModel::LLGLTFViewModel()
+ : base_t(new LLGLTFSort(), new LLGLTFFilter())
+{}
+
+void LLGLTFViewModel::sort(LLFolderViewFolder* folder)
+{
+ base_t::sort(folder);
+}
+
+ /// LLGLTFNode
+// LLUICtrlFactory::create<LLGLTFNode>(params);
+class LLGLTFNode : public LLFolderViewItem
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFolderViewItem::Params>
+ {
+ Params();
+ };
+ ~LLGLTFNode();
+protected:
+ LLGLTFNode(const Params& p);
+};
+
+LLGLTFNode::LLGLTFNode(const LLGLTFNode::Params& p)
+ : LLFolderViewItem(p)
+{
+}
+
+LLGLTFNode::~LLGLTFNode()
+{
+}
diff --git a/indra/newview/llgltffoldermodel.h b/indra/newview/llgltffoldermodel.h
new file mode 100644
index 0000000000..69b284aa31
--- /dev/null
+++ b/indra/newview/llgltffoldermodel.h
@@ -0,0 +1,91 @@
+/**
+ * @file llfloatergltfasseteditor.h
+ * @author Andrey Kleshchev
+ * @brief gltf model's folder structure related classes
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLGLTFFOLDERMODEL_H
+#define LL_LLGLTFFOLDERMODEL_H
+
+#include "llfolderviewmodel.h"
+#include "llgltffolderitem.h"
+
+class LLGLTFSort
+{
+public:
+ LLGLTFSort() { }
+ bool operator()(const LLGLTFFolderItem* const& a, const LLGLTFFolderItem* const& b) const;
+private:
+};
+
+class LLGLTFFilter : public LLFolderViewFilter
+{
+public:
+ LLGLTFFilter() { mEmpty = ""; }
+ ~LLGLTFFilter() {}
+
+ bool check(const LLFolderViewModelItem* item) { return true; }
+ bool checkFolder(const LLFolderViewModelItem* folder) const { return true; }
+ void setEmptyLookupMessage(const std::string& message) { }
+ std::string getEmptyLookupMessage(bool is_empty_folder = false) const { return mEmpty; }
+ bool showAllResults() const { return true; }
+ std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const { return std::string::npos; }
+ std::string::size_type getFilterStringSize() const { return 0; }
+
+ bool isActive() const { return false; }
+ bool isModified() const { return false; }
+ void clearModified() { }
+ const std::string& getName() const { return mEmpty; }
+ const std::string& getFilterText() { return mEmpty; }
+ void setModified(EFilterModified behavior = FILTER_RESTART) { }
+
+ void resetTime(S32 timeout) { }
+ bool isTimedOut() { return false; }
+
+ bool isDefault() const { return true; }
+ bool isNotDefault() const { return false; }
+ void markDefault() { }
+ void resetDefault() { }
+
+ S32 getCurrentGeneration() const { return 0; }
+ S32 getFirstSuccessGeneration() const { return 0; }
+ S32 getFirstRequiredGeneration() const { return 0; }
+private:
+ std::string mEmpty;
+};
+
+class LLGLTFViewModel
+ : public LLFolderViewModel<LLGLTFSort, LLGLTFFolderItem, LLGLTFFolderItem, LLGLTFFilter>
+{
+public:
+ typedef LLFolderViewModel< LLGLTFSort, LLGLTFFolderItem, LLGLTFFolderItem, LLGLTFFilter> base_t;
+ LLGLTFViewModel();
+
+ void sort(LLFolderViewFolder* folder);
+ bool startDrag(std::vector<LLFolderViewModelItem*>& items) { return false; }
+
+private:
+};
+
+#endif
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp
index 215f3dd3a7..25438eae5e 100644
--- a/indra/newview/llgltfmateriallist.cpp
+++ b/indra/newview/llgltfmateriallist.cpp
@@ -55,6 +55,8 @@ LLGLTFMaterialList::modify_queue_t LLGLTFMaterialList::sModifyQueue;
LLGLTFMaterialList::apply_queue_t LLGLTFMaterialList::sApplyQueue;
LLSD LLGLTFMaterialList::sUpdates;
+const size_t MAX_TASK_UPDATES = 255;
+
#ifdef SHOW_ASSERT
// return true if given data is (probably) valid update message for ModifyMaterialParams capability
static bool is_valid_update(const LLSD& data)
@@ -362,6 +364,17 @@ void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const L
LLGLTFMaterial* material = new LLGLTFMaterial(*material_override);
sApplyQueue.push_back({ obj->getID(), side, asset_id, material });
}
+
+ if (sUpdates.size() >= MAX_TASK_UPDATES)
+ {
+ LLCoros::instance().launch("modifyMaterialCoro",
+ std::bind(&LLGLTFMaterialList::modifyMaterialCoro,
+ gAgent.getRegionCapability("ModifyMaterialParams"),
+ sUpdates,
+ std::shared_ptr<CallbackHolder>(nullptr)));
+
+ sUpdates = LLSD::emptyArray();
+ }
}
void LLGLTFMaterialList::queueUpdate(const LLSD& data)
@@ -374,16 +387,41 @@ void LLGLTFMaterialList::queueUpdate(const LLSD& data)
}
sUpdates[sUpdates.size()] = data;
+
+ if (sUpdates.size() >= MAX_TASK_UPDATES)
+ {
+ LLCoros::instance().launch("modifyMaterialCoro",
+ std::bind(&LLGLTFMaterialList::modifyMaterialCoro,
+ gAgent.getRegionCapability("ModifyMaterialParams"),
+ sUpdates,
+ std::shared_ptr<CallbackHolder>(nullptr)));
+
+ sUpdates = LLSD::emptyArray();
+ }
}
void LLGLTFMaterialList::flushUpdates(void(*done_callback)(bool))
{
+ std::shared_ptr<CallbackHolder> callback_holder;
+ if (done_callback)
+ {
+ callback_holder = std::make_shared<CallbackHolder>(done_callback);
+ }
+ while (!sModifyQueue.empty() || !sApplyQueue.empty())
+ {
+ flushUpdatesOnce(callback_holder);
+ }
+}
+
+void LLGLTFMaterialList::flushUpdatesOnce(std::shared_ptr<CallbackHolder> callback_holder)
+{
LLSD& data = sUpdates;
- auto i = data.size();
+ size_t i = data.size();
- for (ModifyMaterialData& e : sModifyQueue)
+ while (!sModifyQueue.empty() && i < MAX_TASK_UPDATES)
{
+ ModifyMaterialData& e = sModifyQueue.front();
#ifdef SHOW_ASSERT
// validate object has a material id
LLViewerObject* obj = gObjectList.findObject(e.object_id);
@@ -405,11 +443,12 @@ void LLGLTFMaterialList::flushUpdates(void(*done_callback)(bool))
llassert(is_valid_update(data[i]));
++i;
+ sModifyQueue.pop_front();
}
- sModifyQueue.clear();
- for (ApplyMaterialAssetData& e : sApplyQueue)
+ while (!sApplyQueue.empty() && i < MAX_TASK_UPDATES)
{
+ ApplyMaterialAssetData& e = sApplyQueue.front();
data[i]["object_id"] = e.object_id;
data[i]["side"] = e.side;
data[i]["asset_id"] = e.asset_id;
@@ -425,8 +464,8 @@ void LLGLTFMaterialList::flushUpdates(void(*done_callback)(bool))
llassert(is_valid_update(data[i]));
++i;
+ sApplyQueue.pop_front();
}
- sApplyQueue.clear();
#if 0 // debug output of data being sent to capability
std::stringstream str;
@@ -440,7 +479,7 @@ void LLGLTFMaterialList::flushUpdates(void(*done_callback)(bool))
std::bind(&LLGLTFMaterialList::modifyMaterialCoro,
gAgent.getRegionCapability("ModifyMaterialParams"),
sUpdates,
- done_callback));
+ callback_holder));
sUpdates = LLSD::emptyArray();
}
@@ -661,7 +700,7 @@ void LLGLTFMaterialList::flushMaterials()
}
// static
-void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides, void(*done_callback)(bool) )
+void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides, std::shared_ptr<CallbackHolder> callback_holder)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
@@ -691,9 +730,12 @@ void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides,
success = false;
}
- if (done_callback)
+ if (callback_holder)
{
- done_callback(success);
+ // Set to false even if something went through
+ // since at the moment it get used to refresh UI
+ // if update failed
+ callback_holder->mSuccess &= success;
}
}
diff --git a/indra/newview/llgltfmateriallist.h b/indra/newview/llgltfmateriallist.h
index 982538f106..e79da3592a 100644
--- a/indra/newview/llgltfmateriallist.h
+++ b/indra/newview/llgltfmateriallist.h
@@ -58,7 +58,9 @@ public:
// NOTE: do not use to revert to asset when applying a new asset id, use queueApply below
static void queueModify(const LLViewerObject* obj, S32 side, const LLGLTFMaterial* mat);
- // Queue an application of a material asset we want to send to the simulator. Call "flushUpdates" to flush pending updates.
+ // Queue an application of a material asset we want to send to the simulator.
+ // Call "flushUpdates" to flush pending updates immediately.
+ // Will be flushed automatically if queue is full.
// object_id - ID of object to apply material asset to
// side - TextureEntry index to apply material to, or -1 for all sides
// asset_id - ID of material asset to apply, or LLUUID::null to disassociate current material asset
@@ -66,7 +68,9 @@ public:
// NOTE: Implicitly clears most override data if present
static void queueApply(const LLViewerObject* obj, S32 side, const LLUUID& asset_id);
- // Queue an application of a material asset we want to send to the simulator. Call "flushUpdates" to flush pending updates.
+ // Queue an application of a material asset we want to send to the simulator.
+ // Call "flushUpdates" to flush pending updates immediately.
+ // Will be flushed automatically if queue is full.
// object_id - ID of object to apply material asset to
// side - TextureEntry index to apply material to, or -1 for all sides
// asset_id - ID of material asset to apply, or LLUUID::null to disassociate current material asset
@@ -104,7 +108,22 @@ private:
// NOTE: this is NOT for applying overrides from the UI, see queueModifyMaterial above
void queueOverrideUpdate(const LLUUID& id, S32 side, LLGLTFMaterial* override_data);
- static void modifyMaterialCoro(std::string cap_url, LLSD overrides, void(*done_callback)(bool));
+
+ class CallbackHolder
+ {
+ public:
+ CallbackHolder(void(*done_callback)(bool))
+ : mCallback(done_callback)
+ {}
+ ~CallbackHolder()
+ {
+ if (mCallback) mCallback(mSuccess);
+ }
+ std::function<void(bool)> mCallback = nullptr;
+ bool mSuccess = true;
+ };
+ static void flushUpdatesOnce(std::shared_ptr<CallbackHolder> callback_holder);
+ static void modifyMaterialCoro(std::string cap_url, LLSD overrides, std::shared_ptr<CallbackHolder> callback_holder);
protected:
static void onAssetLoadComplete(
diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp
index a198d1bdf4..06920734fe 100644
--- a/indra/newview/llgltfmaterialpreviewmgr.cpp
+++ b/indra/newview/llgltfmaterialpreviewmgr.cpp
@@ -462,7 +462,7 @@ bool LLGLTFPreviewTexture::render()
// Set up camera and viewport
const LLVector3 origin(0.0, 0.0, 0.0);
camera.lookAt(origin, object_position);
- camera.setAspect(mFullHeight / mFullWidth);
+ camera.setAspect((F32)(mFullHeight / mFullWidth));
const LLRect texture_rect(0, mFullHeight, mFullWidth, 0);
camera.setPerspective(NOT_FOR_SELECTION, texture_rect.mLeft, texture_rect.mBottom, texture_rect.getWidth(), texture_rect.getHeight(), false, camera.getNear(), MAX_FAR_CLIP*2.f);
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 100aacb8ac..d53b36e59f 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -55,19 +55,8 @@
#include "llcorehttputil.h"
#include "lluiusage.h"
-
-#if LL_MSVC
-#pragma warning(push)
-// disable boost::lexical_cast warning
-#pragma warning (disable:4702)
-#endif
-
#include <boost/lexical_cast.hpp>
-#if LL_MSVC
-#pragma warning(pop) // Restore all warnings to the previous state
-#endif
-
const U32 MAX_CACHED_GROUPS = 20;
//
@@ -190,7 +179,7 @@ S32 LLGroupRoleData::getMembersInRole(uuid_vec_t members,
in_role_end = std::set_intersection(mMemberIDs.begin(), mMemberIDs.end(),
members.begin(), members.end(),
in_role.begin());
- return in_role_end - in_role.begin();
+ return (S32)(in_role_end - in_role.begin());
}
void LLGroupRoleData::addMember(const LLUUID& member)
@@ -806,7 +795,7 @@ void LLGroupMgrGroupData::banMemberById(const LLUUID& participant_uuid)
mPendingBanRequest = false;
- LLGroupMemberData* member_data = (*mi).second;
+ LLGroupMemberData* member_data = mi->second;
if (member_data && member_data->isInRole(mOwnerRole))
{
return; // can't ban group owner
@@ -832,8 +821,7 @@ void LLGroupMgrGroupData::banMemberById(const LLUUID& participant_uuid)
// LLGroupMgr
//
-LLGroupMgr::LLGroupMgr():
- mMemberRequestInFlight(false)
+LLGroupMgr::LLGroupMgr()
{
}
@@ -968,11 +956,11 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
if (!group_datap || (group_datap->mMemberRequestID != request_id))
{
- LL_WARNS() << "processGroupMembersReply: Received incorrect (stale?) group or request id" << LL_ENDL;
+ LL_WARNS() << "Received incorrect (stale?) group or request id" << LL_ENDL;
return;
}
- msg->getS32(_PREHASH_GroupData, "MemberCount", group_datap->mMemberCount );
+ msg->getS32Fast(_PREHASH_GroupData, _PREHASH_MemberCount, group_datap->mMemberCount);
if (group_datap->mMemberCount > 0)
{
@@ -987,12 +975,12 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
{
LLUUID member_id;
- msg->getUUIDFast(_PREHASH_MemberData, _PREHASH_AgentID, member_id, i );
- msg->getS32(_PREHASH_MemberData, _PREHASH_Contribution, contribution, i);
- msg->getU64(_PREHASH_MemberData, "AgentPowers", agent_powers, i);
+ msg->getUUIDFast(_PREHASH_MemberData, _PREHASH_AgentID, member_id, i);
+ msg->getS32Fast(_PREHASH_MemberData, _PREHASH_Contribution, contribution, i);
+ msg->getU64Fast(_PREHASH_MemberData, _PREHASH_AgentPowers, agent_powers, i);
msg->getStringFast(_PREHASH_MemberData, _PREHASH_OnlineStatus, online_status, i);
- msg->getString(_PREHASH_MemberData, "Title", title, i);
- msg->getBOOL(_PREHASH_MemberData,"IsOwner",is_owner,i);
+ msg->getStringFast(_PREHASH_MemberData, _PREHASH_Title, title, i);
+ msg->getBOOLFast(_PREHASH_MemberData, _PREHASH_IsOwner, is_owner, i);
if (member_id.notNull())
{
@@ -1037,7 +1025,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
group_datap->mMemberVersion.generate();
- if (group_datap->mMembers.size() == (U32)group_datap->mMemberCount)
+ if (group_datap->mMembers.size() == (U32)group_datap->mMemberCount)
{
group_datap->mMemberDataComplete = true;
group_datap->mMemberRequestID.setNull();
@@ -1569,7 +1557,7 @@ void LLGroupMgr::addGroup(LLGroupMgrGroupData* group_datap)
{
// LRU: Remove the oldest un-observed group from cache until group size is small enough
- F32 oldest_access = LLFrameTimer::getTotalSeconds();
+ F32 oldest_access = (F32)LLFrameTimer::getTotalSeconds();
group_map_t::iterator oldest_gi = mGroups.end();
for (group_map_t::iterator gi = mGroups.begin(); gi != mGroups.end(); ++gi )
@@ -1678,13 +1666,12 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
if (group_datap->mRoleMembersRequestID.isNull())
{
// Don't send the request if we don't have all the member or role data
- if (!group_datap->isMemberDataComplete()
- || !group_datap->isRoleDataComplete())
+ if (!group_datap->isMemberDataComplete() || !group_datap->isRoleDataComplete())
{
// *TODO: KLW FIXME: Should we start a member or role data request?
LL_INFOS("GrpMgr") << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N")
- << " MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N")
- << " RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << LL_ENDL;
+ << ", MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N")
+ << ", RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << LL_ENDL;
group_datap->mPendingRoleMemberRequest = true;
return;
}
@@ -1984,14 +1971,14 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
group_datap->mMemberVersion.generate();
}
-void LLGroupMgr::getGroupBanRequestCoro(std::string url, LLUUID groupId)
+void LLGroupMgr::getGroupBanRequestCoro(std::string url, LLUUID group_id)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy));
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
- std::string finalUrl = url + "?group_id=" + groupId.asString();
+ std::string finalUrl = url + "?group_id=" + group_id.asString();
LLSD result = httpAdapter->getAndSuspend(httpRequest, finalUrl);
@@ -2012,8 +1999,8 @@ void LLGroupMgr::getGroupBanRequestCoro(std::string url, LLUUID groupId)
}
}
-void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID groupId,
- U32 action, uuid_vec_t banList, bool update)
+void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID group_id,
+ U32 action, uuid_vec_t ban_list, bool update)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
@@ -2026,20 +2013,16 @@ void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID groupId,
httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_LLSD_XML);
-
- std::string finalUrl = url + "?group_id=" + groupId.asString();
+ std::string finalUrl = url + "?group_id=" + group_id.asString();
LLSD postData = LLSD::emptyMap();
postData["ban_action"] = (LLSD::Integer)action;
// Add our list of potential banned residents to the list
postData["ban_ids"] = LLSD::emptyArray();
- LLSD banEntry;
- uuid_vec_t::const_iterator it = banList.begin();
- for (; it != banList.end(); ++it)
+ for (const LLUUID& ban_id : ban_list)
{
- banEntry = (*it);
- postData["ban_ids"].append(banEntry);
+ postData["ban_ids"].append(ban_id);
}
LL_WARNS() << "post: " << ll_pretty_print_sd(postData) << LL_ENDL;
@@ -2064,7 +2047,7 @@ void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID groupId,
if (update)
{
- getGroupBanRequestCoro(url, groupId);
+ getGroupBanRequestCoro(url, group_id);
}
}
@@ -2151,55 +2134,80 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)
LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST);
}
-void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID groupId)
+void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID group_id, U32 page_size, U32 page_start, U32 sort_column, bool sort_descending)
{
+ LL_INFOS("GrpMgr") << "group_id: '" << group_id << "'"
+ << ", page_size: " << page_size << ", page_start: " << page_start
+ << ", sort_column: " << sort_column << ", sort_descending: " << sort_descending << LL_ENDL;
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy));
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
- LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions);
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+
+ LLSD postData = LLSD::emptyMap();
+ postData["group_id"] = group_id;
+
+ if (page_size)
+ {
+ postData["page_size"] = LLSD::Integer(page_size);
+ if (page_start)
+ {
+ postData["page_start"] = LLSD::Integer(page_start);
+ }
+ }
+
+ if (sort_column)
+ {
+ postData["sort_column"] = LLSD::Integer(sort_column);
+ if (sort_descending)
+ {
+ postData["sort_descending"] = 1;
+ }
+ }
mMemberRequestInFlight = true;
- LLSD postData = LLSD::emptyMap();
- postData["group_id"] = groupId;
+ LLSD response = httpAdapter->postAndSuspend(httpRequest, url, postData, httpOpts);
- LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData, httpOpts);
+ mMemberRequestInFlight = false;
- LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLSD httpResults = response.get(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
if (!status)
{
LL_WARNS("GrpMgr") << "Error receiving group member data " << LL_ENDL;
- mMemberRequestInFlight = false;
return;
}
- result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
- LLGroupMgr::processCapGroupMembersRequest(result);
- mMemberRequestInFlight = false;
+ response.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
+ processCapGroupMembersResponse(response, url, page_size, page_start, sort_column, sort_descending);
}
-void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id)
+void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id, U32 page_size, U32 page_start, const std::string& sort_column_name, bool sort_descending)
{
static U32 lastGroupMemberRequestFrame = 0;
// Have we requested the information already this frame?
// Todo: make this per group, we can invite to one group and simultaneously be checking another one
- if ((lastGroupMemberRequestFrame == gFrameCount) || (mMemberRequestInFlight))
+ if ((lastGroupMemberRequestFrame == gFrameCount) || mMemberRequestInFlight)
return;
+ LL_INFOS("GrpMgr") << "group_id: '" << group_id << "'"
+ << ", page_size: " << page_size << ", page_start: " << page_start
+ << ", sort_column_name: '" << sort_column_name << "', sort_descending: " << sort_descending << LL_ENDL;
+
LLViewerRegion* currentRegion = gAgent.getRegion();
// Thank you FS:Ansariel!
- if(!currentRegion)
+ if (!currentRegion)
{
LL_WARNS("GrpMgr") << "Agent does not have a current region. Uh-oh!" << LL_ENDL;
return;
}
// Check to make sure we have our capabilities
- if(!currentRegion->capabilitiesReceived())
+ if (!currentRegion->capabilitiesReceived())
{
LL_WARNS("GrpMgr") << " Capabilities not received!" << LL_ENDL;
return;
@@ -2209,9 +2217,9 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id)
std::string cap_url = currentRegion->getCapability("GroupMemberData");
// Thank you FS:Ansariel!
- if(cap_url.empty())
+ if (cap_url.empty())
{
- LL_INFOS("GrpMgr") << "Region has no GroupMemberData capability. Falling back to UDP fetch." << LL_ENDL;
+ LL_INFOS("GrpMgr") << "Region has no GroupMemberData capability. Falling back to UDP fetch." << LL_ENDL;
sendGroupMembersRequest(group_id);
return;
}
@@ -2221,120 +2229,139 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id)
lastGroupMemberRequestFrame = gFrameCount;
- LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro",
- boost::bind(&LLGroupMgr::groupMembersRequestCoro, this, cap_url, group_id));
-}
+ U32 sort_column = 0; // No sorting by default
+ if (!sort_column_name.empty())
+ {
+ static const std::vector<std::string> column_names = { "name", "donated", "online", "title" };
+ auto it = std::find(column_names.begin(), column_names.end(), sort_column_name);
+ if (it == column_names.end())
+ {
+ LL_WARNS("GrpMgr") << "Invalid column name: '" << sort_column_name << "'" << LL_ENDL;
+ }
+ else
+ {
+ // Use offset (1) because 0 means "no sorting"
+ sort_column = 1 + (U32)std::distance(column_names.begin(), it);
+ }
+ }
+ LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro", [&]()
+ {
+ groupMembersRequestCoro(cap_url, group_id, page_size, page_start, sort_column, sort_descending);
+ });
+}
-void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
+void LLGroupMgr::processCapGroupMembersResponse(const LLSD& response, const std::string& url, U32 page_size, U32 page_start, U32 sort_column, bool sort_descending)
{
+ LLUUID group_id = response["group_id"].asUUID();
+ LL_INFOS("GrpMgr") << "group_id: '" << group_id << "'"
+ << ", page_size: " << page_size << ", page_start: " << page_start
+ << ", sort_column: " << sort_column << ", sort_descending: " << sort_descending << LL_ENDL;
+
// Did we get anything in content?
- if(!content.size())
+ if (!response.size())
{
- LL_DEBUGS("GrpMgr") << "No group member data received." << LL_ENDL;
+ LL_INFOS("GrpMgr") << "No group member data received." << LL_ENDL;
return;
}
- LLUUID group_id = content["group_id"].asUUID();
-
LLGroupMgrGroupData* group_datap = getGroupData(group_id);
- if(!group_datap)
+ if (!group_datap)
{
LL_WARNS("GrpMgr") << "Received incorrect, possibly stale, group or request id" << LL_ENDL;
return;
}
- // If we have no members, there's no reason to do anything else
- S32 num_members = content["member_count"];
- if (num_members < 1)
- {
- LL_INFOS("GrpMgr") << "Received empty group members list for group id: " << group_id.asString() << LL_ENDL;
- // Set mMemberDataComplete for correct handling of empty responses. See MAINT-5237
- group_datap->mMemberDataComplete = true;
- group_datap->mChanged = true;
- LLGroupMgr::getInstance()->notifyObservers(GC_MEMBER_DATA);
- return;
- }
+ LLSD members = response["members"];
+ LLSD titles = response["titles"];
+ LLSD defaults = response["defaults"];
- group_datap->mMemberCount = num_members;
-
- LLSD member_list = content["members"];
- LLSD titles = content["titles"];
- LLSD defaults = content["defaults"];
-
- std::string online_status;
- std::string title;
- S32 contribution;
- U64 member_powers;
- // If this is changed to a bool, make sure to change the LLGroupMemberData constructor
- bool is_owner;
+ size_t members_before = group_datap->mMembers.size();
+ size_t members_loaded = members.size();
// Compute this once, rather than every time.
- U64 default_powers = llstrtou64(defaults["default_powers"].asString().c_str(), NULL, 16);
+ std::string default_title = titles.size() ? titles[0].asString() : LLStringUtil::null;
+ U64 default_powers = llstrtou64(defaults["default_powers"].asString().c_str(), NULL, 16);
- LLSD::map_const_iterator member_iter_start = member_list.beginMap();
- LLSD::map_const_iterator member_iter_end = member_list.endMap();
- for( ; member_iter_start != member_iter_end; ++member_iter_start)
+ auto members_end = members.endMap();
+ for (auto it = members.beginMap(); it != members_end; ++it)
{
// Reset defaults
- online_status = "unknown";
- title = titles[0].asString();
- contribution = 0;
- member_powers = default_powers;
- is_owner = false;
+ std::string online_status = "unknown";
+ std::string title = default_title;
+ U64 member_powers = default_powers;
+ S32 donated_square_meters = 0;
+ bool is_owner = false;
- const LLUUID member_id(member_iter_start->first);
- LLSD member_info = member_iter_start->second;
+ const LLUUID member_id(it->first);
+ LLSD member_info = it->second;
- if(member_info.has("last_login"))
+ if (member_info.has("last_login"))
{
online_status = member_info["last_login"].asString();
- if(online_status == "Online")
+ if (online_status == "Online")
+ {
online_status = LLTrans::getString("group_member_status_online");
+ }
else
+ {
formatDateString(online_status);
+ }
}
- if(member_info.has("title"))
+ if (member_info.has("title"))
+ {
title = titles[member_info["title"].asInteger()].asString();
+ }
- if(member_info.has("powers"))
+ if (member_info.has("powers"))
+ {
member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16);
+ }
- if(member_info.has("donated_square_meters"))
- contribution = member_info["donated_square_meters"];
+ if (member_info.has("donated_square_meters"))
+ {
+ donated_square_meters = member_info["donated_square_meters"];
+ }
- if(member_info.has("owner"))
+ if (member_info.has("owner"))
+ {
is_owner = true;
+ }
LLGroupMemberData* data = new LLGroupMemberData(member_id,
- contribution,
- member_powers,
- title,
- online_status,
- is_owner);
-
- LLGroupMemberData* member_old = group_datap->mMembers[member_id];
- if (member_old && group_datap->mRoleMemberDataComplete)
- {
- LLGroupMemberData::role_list_t::iterator rit = member_old->roleBegin();
- LLGroupMemberData::role_list_t::iterator end = member_old->roleEnd();
+ donated_square_meters, member_powers, title, online_status, is_owner);
- for ( ; rit != end; ++rit)
+ if (group_datap->mRoleMemberDataComplete)
+ {
+ if (LLGroupMemberData* member_old = group_datap->mMembers[member_id])
{
- data->addRole((*rit).first,(*rit).second);
+ auto role_end = member_old->roleEnd();
+ for (auto role_it = member_old->roleBegin(); role_it != role_end; ++role_it)
+ {
+ data->addRole(role_it->first, role_it->second);
+ }
+ }
+ else
+ {
+ group_datap->mRoleMemberDataComplete = false;
}
- }
- else
- {
- group_datap->mRoleMemberDataComplete = false;
}
group_datap->mMembers[member_id] = data;
}
+ U32 member_count = (U32)group_datap->mMembers.size();
+
+ group_datap->mMemberCount = (S32)member_count;
+ group_datap->mMemberDataComplete = true;
+ group_datap->mMemberRequestID.setNull();
group_datap->mMemberVersion.generate();
+ LL_INFOS("GrpMgr") << "members before: " << members_before
+ << ", members loaded: " << members_loaded
+ << ", members now: " << member_count << LL_ENDL;
+
// Technically, we have this data, but to prevent completely overhauling
// this entire system (it would be nice, but I don't have the time),
// I'm going to be dumb and just call services I most likely don't need
@@ -2342,12 +2369,19 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
//
// TODO:
// Refactor to reduce multiple calls for data we already have.
- if(group_datap->mTitles.size() < 1)
+ if (group_datap->mTitles.size() < 1)
+ {
sendGroupTitlesRequest(group_id);
+ }
+ if (page_size && members_loaded >= page_size && member_count > members_before)
+ {
+ LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro", [&]()
+ {
+ groupMembersRequestCoro(url, group_id, page_size, page_start, sort_column, sort_descending);
+ });
+ }
- group_datap->mMemberDataComplete = true;
- group_datap->mMemberRequestID.setNull();
// Make the role-member data request
if (group_datap->mPendingRoleMemberRequest || !group_datap->mRoleMemberDataComplete)
{
@@ -2357,10 +2391,8 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
group_datap->mChanged = true;
notifyObservers(GC_MEMBER_DATA);
-
}
-
void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
{
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL;
@@ -2379,9 +2411,11 @@ void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
void LLGroupMgr::cancelGroupRoleChanges(const LLUUID& group_id)
{
LL_DEBUGS("GrpMgr") << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL;
- LLGroupMgrGroupData* group_datap = getGroupData(group_id);
- if (group_datap) group_datap->cancelRoleChanges();
+ if (LLGroupMgrGroupData* group_datap = getGroupData(group_id))
+ {
+ group_datap->cancelRoleChanges();
+ }
}
//static
@@ -2503,5 +2537,3 @@ void LLGroupMgr::debugClearAllGroups(void*)
LLGroupMgr::getInstance()->clearGroups();
LLGroupMgr::parseRoleActions("role_actions.xml");
}
-
-
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 18efae7654..21cf4a62b6 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -403,7 +403,7 @@ public:
bool mature_publish);
static void sendGroupMemberJoin(const LLUUID& group_id);
- static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID,LLUUID>& role_member_pairs);
+ static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID, LLUUID>& role_member_pairs);
static void sendGroupMemberEjects(const LLUUID& group_id,
uuid_vec_t& member_ids);
@@ -413,7 +413,8 @@ public:
const uuid_vec_t &ban_list = uuid_vec_t());
- void sendCapGroupMembersRequest(const LLUUID& group_id);
+ void sendCapGroupMembersRequest(const LLUUID& group_id,
+ U32 page_size = 0, U32 page_start = 0, const std::string& sort_column_name = LLStringUtil::null, bool sort_descending = false);
void cancelGroupRoleChanges(const LLUUID& group_id);
@@ -436,16 +437,15 @@ public:
void clearGroupData(const LLUUID& group_id);
private:
- void groupMembersRequestCoro(std::string url, LLUUID groupId);
- void processCapGroupMembersRequest(const LLSD& content);
+ void groupMembersRequestCoro(std::string url, LLUUID group_id, U32 page_size, U32 page_start, U32 sort_column, bool sort_descending);
+ void processCapGroupMembersResponse(const LLSD& response, const std::string& url, U32 page_size, U32 page_start, U32 sort_column, bool sort_descending);
- void getGroupBanRequestCoro(std::string url, LLUUID groupId);
- void postGroupBanRequestCoro(std::string url, LLUUID groupId, U32 action, uuid_vec_t banList, bool update);
+ void getGroupBanRequestCoro(std::string url, LLUUID group_id);
+ void postGroupBanRequestCoro(std::string url, LLUUID group_id, U32 action, uuid_vec_t ban_list, bool update);
static void processGroupBanRequest(const LLSD& content);
void notifyObservers(LLGroupChange gc);
- void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
void addGroup(LLGroupMgrGroupData* group_datap);
LLGroupMgrGroupData* createGroupData(const LLUUID &id);
bool hasPendingPropertyRequest(const LLUUID& id);
@@ -465,7 +465,7 @@ private:
typedef std::map<LLUUID,observer_set_t> observer_map_t;
observer_map_t mParticularObservers;
- bool mMemberRequestInFlight;
+ bool mMemberRequestInFlight { false };
};
diff --git a/indra/newview/llheroprobemanager.cpp b/indra/newview/llheroprobemanager.cpp
index 66ccdd2b32..ce419498cf 100644
--- a/indra/newview/llheroprobemanager.cpp
+++ b/indra/newview/llheroprobemanager.cpp
@@ -98,7 +98,7 @@ void LLHeroProbeManager::update()
if (mMipChain.empty())
{
U32 res = mProbeResolution;
- U32 count = log2((F32)res) + 0.5f;
+ U32 count = (U32)(log2((F32)res) + 0.5f);
mMipChain.resize(count);
for (U32 i = 0; i < count; ++i)
@@ -121,6 +121,7 @@ void LLHeroProbeManager::update()
// Find our nearest hero candidate.
float last_distance = 99999.f;
float camera_center_distance = 99999.f;
+ mNearestHero = nullptr;
for (auto vo : mHeroVOList)
{
if (vo && !vo->isDead() && vo->mDrawable.notNull() && vo->isReflectionProbe() && vo->getReflectionProbeIsBox())
@@ -194,11 +195,17 @@ void LLHeroProbeManager::update()
else
{
mNearestHero = nullptr;
+ mDefaultProbe->mViewerObject = nullptr;
}
mHeroProbeStrength = 1;
}
+ else
+ {
+ mNearestHero = nullptr;
+ mDefaultProbe->mViewerObject = nullptr;
}
+}
void LLHeroProbeManager::renderProbes()
{
@@ -334,7 +341,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool
gGaussianProgram.unbind();
}
- S32 mips = log2((F32)mProbeResolution) + 0.5f;
+ S32 mips = (S32)(log2((F32)mProbeResolution) + 0.5f);
gReflectionMipProgram.bind();
S32 diffuseChannel = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE);
@@ -424,7 +431,7 @@ void LLHeroProbeManager::generateRadiance(LLReflectionMap* probe)
static LLStaticHashedString sStrength("probe_strength");
gHeroRadianceGenProgram.uniform1f(sRoughness, (F32) i / (F32) (mMipChain.size() - 1));
- gHeroRadianceGenProgram.uniform1f(sMipLevel, i);
+ gHeroRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i);
gHeroRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
gHeroRadianceGenProgram.uniform1f(sStrength, 1);
@@ -526,7 +533,7 @@ void LLHeroProbeManager::initReflectionMaps()
mReset = false;
mReflectionProbeCount = count;
mProbeResolution = gSavedSettings.getS32("RenderHeroProbeResolution");
- mMaxProbeLOD = log2f(mProbeResolution) - 1.f; // number of mips - 1
+ mMaxProbeLOD = log2f((F32)mProbeResolution) - 1.f; // number of mips - 1
mTexture = new LLCubeMapArray();
@@ -579,7 +586,6 @@ void LLHeroProbeManager::cleanup()
{
mVertexBuffer = nullptr;
mRenderTarget.release();
- mHeroRenderTarget.release();
mMipChain.clear();
@@ -587,10 +593,7 @@ void LLHeroProbeManager::cleanup()
mProbes.clear();
- mReflectionMaps.clear();
-
mDefaultProbe = nullptr;
- mUpdatingProbe = nullptr;
}
void LLHeroProbeManager::doOcclusion()
diff --git a/indra/newview/llheroprobemanager.h b/indra/newview/llheroprobemanager.h
index 28852770c3..58a94a3de8 100644
--- a/indra/newview/llheroprobemanager.h
+++ b/indra/newview/llheroprobemanager.h
@@ -104,8 +104,6 @@ private:
// used to generate mipmaps without doing a copy-to-texture
LLRenderTarget mRenderTarget;
- LLRenderTarget mHeroRenderTarget;
-
std::vector<LLRenderTarget> mMipChain;
// storage for reflection probe radiance maps (plus two scratch space cubemaps)
@@ -124,11 +122,6 @@ private:
// list of active reflection maps
std::vector<LLPointer<LLReflectionMap>> mProbes;
- // list of maps being used for rendering
- std::vector<LLReflectionMap*> mReflectionMaps;
-
- LLReflectionMap* mUpdatingProbe = nullptr;
-
LLPointer<LLReflectionMap> mDefaultProbe; // default reflection probe to fall back to for pixels with no probe influences (should always be at cube index 0)
// number of reflection probes to use for rendering
diff --git a/indra/newview/llhttpretrypolicy.cpp b/indra/newview/llhttpretrypolicy.cpp
index 44d33eec93..3e55030610 100644
--- a/indra/newview/llhttpretrypolicy.cpp
+++ b/indra/newview/llhttpretrypolicy.cpp
@@ -180,7 +180,7 @@ bool LLAdaptiveRetryPolicy::getSecondsUntilRetryAfter(const std::string& retry_a
time_t date = curl_getdate(retry_after.c_str(), NULL);
if (-1 == date) return false;
- seconds_to_wait = (F64)date - LLTimer::getTotalSeconds();
+ seconds_to_wait = (F32)((F64)date - LLTimer::getTotalSeconds());
return true;
}
diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index c8b7e00776..d0d2ee191a 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -36,6 +36,7 @@
#include "llvoavatar.h"
#include "lldrawable.h"
#include "llviewerobjectlist.h"
+#include "llviewercontrol.h"
#include "llrendersphere.h"
#include "llselectmgr.h"
#include "llglheaders.h"
@@ -561,8 +562,16 @@ void LLHUDEffectLookAt::update()
{
if (calcTargetPosition())
{
+ static LLCachedControl<bool> disable_look_at(gSavedSettings, "DisableLookAtAnimation", true);
LLMotion* head_motion = ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->findMotion(ANIM_AGENT_HEAD_ROT);
- if (!head_motion || head_motion->isStopped())
+ if (disable_look_at())
+ {
+ if (head_motion)
+ {
+ ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->stopMotion(ANIM_AGENT_HEAD_ROT);
+ }
+ }
+ else if (!head_motion || head_motion->isStopped())
{
((LLVOAvatar*)(LLViewerObject*)mSourceObject)->startMotion(ANIM_AGENT_HEAD_ROT);
}
@@ -665,7 +674,15 @@ bool LLHUDEffectLookAt::calcTargetPosition()
if (!mTargetPos.isFinite())
return false;
- source_avatar->setAnimationData("LookAtPoint", (void *)&mTargetPos);
+ static LLCachedControl<bool> disable_look_at(gSavedSettings, "DisableLookAtAnimation", true);
+ if (disable_look_at())
+ {
+ source_avatar->removeAnimationData("LookAtPoint");
+ }
+ else
+ {
+ source_avatar->setAnimationData("LookAtPoint", (void*)&mTargetPos);
+ }
return true;
}
diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index e1bf6c2077..205089c662 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -279,8 +279,10 @@ void LLHUDNameTag::renderText(bool for_select)
mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
// *TODO: make this a per-text setting
- LLColor4 bg_color = LLUIColorTable::instance().getColor("NameTagBackground");
- bg_color.setAlpha(gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor);
+ static LLCachedControl<F32> bubble_opacity(gSavedSettings, "ChatBubbleOpacity");
+ static LLUIColor nametag_bg_color = LLUIColorTable::instance().getColor("NameTagBackground");
+ LLColor4 bg_color = nametag_bg_color;
+ bg_color.setAlpha(bubble_opacity * alpha_factor);
// scale screen size of borders down
//RN: for now, text on hud objects is never occluded
@@ -340,8 +342,7 @@ void LLHUDNameTag::renderText(bool for_select)
x_offset = -0.5f * mWidth + (HORIZONTAL_PADDING / 2.f);
}
- LLColor4 label_color(0.f, 0.f, 0.f, 1.f);
- label_color.mV[VALPHA] = alpha_factor;
+ LLColor4 label_color(0.f, 0.f, 0.f, alpha_factor);
hud_render_text(segment_iter->getText(), render_position, *fontp, segment_iter->mStyle, LLFontGL::NO_SHADOW, x_offset, y_offset, label_color, false);
}
}
@@ -449,7 +450,7 @@ void LLHUDNameTag::addLine(const std::string &text_utf8,
// token does does not fit into signle line, need to draw "...".
// Use four dots for ellipsis width to generate padding
const LLWString dots_pad(utf8str_to_wstring(std::string("....")));
- S32 elipses_width = font->getWidthF32(dots_pad.c_str());
+ S32 elipses_width = (S32)font->getWidthF32(dots_pad.c_str());
// truncated string length
segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels - elipses_width, static_cast<S32>(wline.length()), LLFontGL::ANYWHERE);
const LLWString dots(utf8str_to_wstring(std::string("...")));
@@ -780,7 +781,7 @@ void LLHUDNameTag::updateAll()
}
LLTrace::CountStatHandle<>* camera_vel_stat = LLViewerCamera::getVelocityStat();
- F32 camera_vel = LLTrace::get_frame_recording().getLastRecording().getPerSec(*camera_vel_stat);
+ F32 camera_vel = (F32)LLTrace::get_frame_recording().getLastRecording().getPerSec(*camera_vel_stat);
if (camera_vel > MAX_STABLE_CAMERA_VELOCITY)
{
return;
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index 5ee0ab437d..fd0d8b696f 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -138,8 +138,10 @@ void LLHUDText::renderText()
mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
// *TODO: make this a per-text setting
- LLColor4 bg_color = LLUIColorTable::instance().getColor("ObjectBubbleColor");
- bg_color.setAlpha(gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor);
+ static LLCachedControl<F32> bubble_opacity(gSavedSettings, "ChatBubbleOpacity");
+ static LLUIColor nametag_bg_color = LLUIColorTable::instance().getColor("ObjectBubbleColor");
+ LLColor4 bg_color = nametag_bg_color;
+ bg_color.setAlpha(bubble_opacity * alpha_factor);
const S32 border_height = 16;
const S32 border_width = 16;
@@ -392,7 +394,8 @@ void LLHUDText::updateVisibility()
LLVector3 pos_agent_center = gAgent.getPosAgentFromGlobal(mPositionGlobal) - dir_from_camera;
F32 last_distance_center = (pos_agent_center - LLViewerCamera::getInstance()->getOrigin()).magVec();
- F32 max_draw_distance = gSavedSettings.getF32("PrimTextMaxDrawDistance");
+ static LLCachedControl<F32> prim_text_max_dist(gSavedSettings, "PrimTextMaxDrawDistance");
+ F32 max_draw_distance = prim_text_max_dist;
if(max_draw_distance < 0)
{
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index e2e83ef42b..c1e68e0288 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -58,10 +58,6 @@
#include "llworld.h"
#include "boost/lexical_cast.hpp"
-#if LL_MSVC
-// disable boost::lexical_cast warning
-#pragma warning (disable:4702)
-#endif
extern void on_new_message(const LLSD& msg);
@@ -1607,7 +1603,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
}
else
{
- position.set(message_data["local_x"].asReal(), message_data["local_y"].asReal(), message_data["local_z"].asReal());
+ position.set((F32)message_data["local_x"].asReal(), (F32)message_data["local_y"].asReal(), (F32)message_data["local_z"].asReal());
}
std::vector<U8> bin_bucket;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index cab71a4a37..136b59f3a6 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -372,8 +372,10 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
// 4. Toast
if ((("toast" == user_preferences) &&
(ON_TOP_AND_ITEM_IS_SELECTED != conversations_floater_status) &&
- (!session_floater->isTornOff() || !LLFloater::isVisible(session_floater)))
- || !session_floater->isMessagePaneExpanded())
+ (!session_floater->isTornOff()
+ || session_floater->isMinimized()
+ || !LLFloater::isVisible(session_floater)))
+ || !session_floater->isMessagePaneExpanded())
{
//Show IM toasts (upper right toasts)
@@ -4253,7 +4255,7 @@ public:
message_params["region_id"].asUUID(),
ll_vector3_from_sd(message_params["position"]),
false, // is_region_message
- timestamp);
+ (U32)timestamp);
if (LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat))
{
diff --git a/indra/newview/llinspecttexture.cpp b/indra/newview/llinspecttexture.cpp
index 75366c4831..24dbe61bad 100644
--- a/indra/newview/llinspecttexture.cpp
+++ b/indra/newview/llinspecttexture.cpp
@@ -152,7 +152,7 @@ void LLTexturePreviewView::draw()
bool isLoading = (!m_Image->isFullyLoaded()) && (m_Image->getDiscardLevel() > 0);
if (isLoading)
- LLFontGL::getFontSansSerif()->renderUTF8(mLoadingText, 0, llfloor(rctClient.mLeft + 3), llfloor(rctClient.mTop - 25), LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
+ LLFontGL::getFontSansSerif()->renderUTF8(mLoadingText, 0, rctClient.mLeft + 3, rctClient.mTop - 25, LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
m_Image->addTextureStats((isLoading) ? MAX_IMAGE_AREA : (F32)(rctClient.getWidth() * rctClient.getHeight()));
}
}
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index bfa8e39b70..c86492f005 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -85,8 +85,6 @@
#include "llenvironment.h"
-#include <boost/shared_ptr.hpp>
-
void copy_slurl_to_clipboard_callback_inv(const std::string& slurl);
const F32 SOUND_GAIN = 1.0f;
@@ -1190,6 +1188,7 @@ void LLInvFVBridge::addMarketplaceContextMenuOptions(U32 flags,
|| (U32)depth > (max_depth + 1))
{
disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("New Listing Folder"));
}
}
@@ -4268,6 +4267,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
if (LLMarketplaceData::instance().isUpdating(mUUID))
{
disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("New Listing Folder"));
disabled_items.push_back(std::string("Rename"));
disabled_items.push_back(std::string("Cut"));
disabled_items.push_back(std::string("Copy"));
@@ -4278,12 +4278,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
if (getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
{
disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("New Listing Folder"));
disabled_items.push_back(std::string("upload_def"));
disabled_items.push_back(std::string("create_new"));
}
if (marketplace_listings_id == mUUID)
{
disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("New Listing Folder"));
disabled_items.push_back(std::string("Rename"));
disabled_items.push_back(std::string("Cut"));
disabled_items.push_back(std::string("Delete"));
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 114ccfdd3f..e3d4645701 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -1519,7 +1519,7 @@ LLInventoryFilter& LLInventoryFilter::operator=( const LLInventoryFilter& othe
void LLInventoryFilter::toParams(Params& params) const
{
- params.filter_ops.types = getFilterObjectTypes();
+ params.filter_ops.types = (U32)getFilterObjectTypes();
params.filter_ops.category_types = getFilterCategoryTypes();
if (getFilterObjectTypes() & FILTERTYPE_WEARABLE)
{
@@ -1532,7 +1532,7 @@ void LLInventoryFilter::toParams(Params& params) const
params.filter_ops.show_folder_state = getShowFolderState();
params.filter_ops.creator_type = getFilterCreatorType();
params.filter_ops.permissions = getFilterPermissions();
- params.filter_ops.search_visibility = getSearchVisibilityTypes();
+ params.filter_ops.search_visibility = (U32)getSearchVisibilityTypes();
params.substring = getFilterSubString();
params.since_logoff = isSinceLogoff();
}
@@ -1646,7 +1646,7 @@ bool LLInventoryFilter::isTimedOut()
void LLInventoryFilter::resetTime(S32 timeout)
{
mFilterTime.reset();
- F32 time_in_sec = (F32)(timeout)/1000.0;
+ F32 time_in_sec = (F32)(timeout)/1000.0f;
mFilterTime.setTimerExpirySec(time_in_sec);
}
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 8471b2cea1..57c0d57190 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -3637,11 +3637,11 @@ void LLInventoryAction::onItemsRemovalConfirmation(const LLSD& notification, con
{
for (const LLUUID& id : item_deletion_list)
{
- remove_inventory_item(id, NULL);
+ gInventory.removeItem(id);
}
for (const LLUUID& id : cat_deletion_list)
{
- remove_inventory_category(id, NULL);
+ gInventory.removeCategory(id);
}
});
}
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp
index b99dbd9eb7..46d1e822de 100644
--- a/indra/newview/llinventorygallery.cpp
+++ b/indra/newview/llinventorygallery.cpp
@@ -147,8 +147,6 @@ const LLInventoryGallery::Params& LLInventoryGallery::getDefaultParams()
bool LLInventoryGallery::postBuild()
{
mScrollPanel = getChild<LLScrollContainer>("gallery_scroll_panel");
- LLPanel::Params params = LLPanel::getDefaultParams();
- mGalleryPanel = LLUICtrlFactory::create<LLPanel>(params);
mMessageTextBox = getChild<LLTextBox>("empty_txt");
mInventoryGalleryMenu = new LLInventoryGalleryContextMenu(this);
mRootGalleryMenu = new LLInventoryGalleryContextMenu(this);
@@ -2659,7 +2657,7 @@ bool LLInventoryGallery::checkAgainstFilterType(const LLUUID& object_id)
{
object_type = inv_item->getInventoryType();
}
- const U32 filterTypes = mFilter->getFilterTypes();
+ const U32 filterTypes = (U32)mFilter->getFilterTypes();
if ((filterTypes & LLInventoryFilter::FILTERTYPE_OBJECT) && inv_item)
{
@@ -2881,11 +2879,13 @@ void LLInventoryGalleryItem::draw()
LLPanel::draw();
// Draw border
- LLUIColor border_color = LLUIColorTable::instance().getColor(mSelected ? "MenuItemHighlightBgColor" : "TextFgTentativeColor", LLColor4::white);
+ static LLUIColor menu_highlighted_color = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", LLColor4::white);;
+ static LLUIColor text_fg_tentative_color = LLUIColorTable::instance().getColor("TextFgTentativeColor", LLColor4::white);;
+ const LLColor4& border_color = mSelected ? menu_highlighted_color : text_fg_tentative_color;
LLRect border = mThumbnailCtrl->getRect();
border.mRight = border.mRight + 1;
border.mTop = border.mTop + 1;
- gl_rect_2d(border, border_color.get(), false);
+ gl_rect_2d(border, border_color, false);
}
}
diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp
index 8e56ccc01d..dbf4821ca1 100644
--- a/indra/newview/llinventorygallerymenu.cpp
+++ b/indra/newview/llinventorygallerymenu.cpp
@@ -810,7 +810,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
items.push_back(std::string("Copy Asset UUID"));
items.push_back(std::string("Copy Separator"));
- bool is_asset_knowable = is_asset_knowable = LLAssetType::lookupIsAssetIDKnowable(obj->getType());
+ bool is_asset_knowable = LLAssetType::lookupIsAssetIDKnowable(obj->getType());
if ( !is_asset_knowable // disable menu item for Inventory items with unknown asset. EXT-5308
|| (! ( is_full_perm_item || gAgent.isGodlike())))
{
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 442da455ef..9e4f4c0adc 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -425,7 +425,7 @@ void LLInventoryPanel::setFilterWorn()
U32 LLInventoryPanel::getFilterObjectTypes() const
{
- return getFilter().getFilterObjectTypes();
+ return (U32)getFilter().getFilterObjectTypes();
}
U32 LLInventoryPanel::getFilterPermMask() const
@@ -2334,14 +2334,14 @@ void LLInventorySingleFolderPanel::clearNavigationHistory()
mBackwardFolders.clear();
}
-bool LLInventorySingleFolderPanel::isBackwardAvailable()
+bool LLInventorySingleFolderPanel::isBackwardAvailable() const
{
- return (!mBackwardFolders.empty() && (mFolderID != mBackwardFolders.back()));
+ return !mBackwardFolders.empty() && (mFolderID != mBackwardFolders.back());
}
-bool LLInventorySingleFolderPanel::isForwardAvailable()
+bool LLInventorySingleFolderPanel::isForwardAvailable() const
{
- return (!mForwardFolders.empty() && (mFolderID != mForwardFolders.back()));
+ return !mForwardFolders.empty() && (mFolderID != mForwardFolders.back());
}
boost::signals2::connection LLInventorySingleFolderPanel::setRootChangedCallback(root_changed_callback_t cb)
@@ -2406,9 +2406,14 @@ void LLInventorySingleFolderPanel::updateSingleFolderRoot()
}
}
-bool LLInventorySingleFolderPanel::hasVisibleItems()
+bool LLInventorySingleFolderPanel::hasVisibleItems() const
{
- return mFolderRoot.get()->hasVisibleChildren();
+ if (const LLFolderView* root = mFolderRoot.get())
+ {
+ return root->hasVisibleChildren();
+ }
+
+ return false;
}
void LLInventorySingleFolderPanel::doCreate(const LLSD& userdata)
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 6dead2cf6d..56909c8d98 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -420,10 +420,10 @@ public:
void doToSelected(const LLSD& userdata);
void doShare();
- bool isBackwardAvailable();
- bool isForwardAvailable();
+ bool isBackwardAvailable() const;
+ bool isForwardAvailable() const;
- bool hasVisibleItems();
+ bool hasVisibleItems() const;
void setNavBackwardList(std::list<LLUUID> backward_list) { mBackwardFolders = backward_list; }
void setNavForwardList(std::list<LLUUID> forward_list) { mForwardFolders = forward_list; }
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index 00dbf9a9f8..4eaf69c39d 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -732,8 +732,8 @@ LLJoystickQuaternion::LLJoystickQuaternion(const LLJoystickQuaternion::Params &p
{
for (int i = 0; i < 3; ++i)
{
- mLfRtAxis.mV[i] = (mXAxisIndex == i) ? 1.0 : 0.0;
- mUpDnAxis.mV[i] = (mYAxisIndex == i) ? 1.0 : 0.0;
+ mLfRtAxis.mV[i] = (mXAxisIndex == i) ? 1.0f : 0.0f;
+ mUpDnAxis.mV[i] = (mYAxisIndex == i) ? 1.0f : 0.0f;
}
}
@@ -864,8 +864,8 @@ void LLJoystickQuaternion::draw()
LLVector3 draw_point = mVectorZero * mRotation;
S32 halfwidth = getRect().getWidth() / 2;
S32 halfheight = getRect().getHeight() / 2;
- draw_point.mV[mXAxisIndex] = (draw_point.mV[mXAxisIndex] + 1.0) * halfwidth;
- draw_point.mV[mYAxisIndex] = (draw_point.mV[mYAxisIndex] + 1.0) * halfheight;
+ draw_point.mV[mXAxisIndex] = (draw_point.mV[mXAxisIndex] + 1.0f) * halfwidth;
+ draw_point.mV[mYAxisIndex] = (draw_point.mV[mYAxisIndex] + 1.0f) * halfheight;
gl_circle_2d(draw_point.mV[mXAxisIndex], draw_point.mV[mYAxisIndex], 4, 8,
draw_point.mV[mZAxisIndex] >= 0.f);
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index ce0c460f5b..31c9eb8966 100644
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -215,7 +215,6 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
("file://"+mFilename, FTT_LOCAL_FILE, mWorldID, LL_LOCAL_USE_MIPMAPS);
texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image);
- texture->setCachedRawImage(LL_LOCAL_DISCARD_LEVEL, raw_image);
texture->ref();
gTextureList.addImage(texture, TEX_LIST_STANDARD);
@@ -674,7 +673,7 @@ void LLLocalBitmap::updateGLTFMaterials(LLUUID old_id, LLUUID new_id)
LLFetchedGLTFMaterial* render_mat = dynamic_cast<LLFetchedGLTFMaterial*>(entry->getGLTFRenderMaterial());
if (render_mat)
{
- *render_mat = *fetched_mat;
+ *render_mat = *fetched_mat;
render_mat->applyOverride(*override_mat);
}
else
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 329fb881e3..bf49f33049 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -42,19 +42,7 @@
#include <boost/algorithm/string/trim.hpp>
#include <boost/algorithm/string/replace.hpp>
#include <boost/regex.hpp>
-
-#if LL_MSVC
-#pragma warning(push)
-// disable warning about boost::lexical_cast unreachable code
-// when it fails to parse the string
-#pragma warning (disable:4702)
-#endif
-
#include <boost/date_time/gregorian/gregorian.hpp>
-#if LL_MSVC
-#pragma warning(pop) // Restore all warnings to the previous state
-#endif
-
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/local_time_adjustor.hpp>
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 282a273be6..c54d2c080f 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -33,9 +33,6 @@
#include "stringize.h"
#include "llsdserialize.h"
-// llmessage (!)
-#include "llfiltersd2xmlrpc.h" // for xml_escape_string()
-
// login
#include "lllogin.h"
@@ -60,7 +57,6 @@
#include "llsdserialize.h"
#include "lltrans.h"
-#include <boost/scoped_ptr.hpp>
#include <boost/regex.hpp>
#include <sstream>
@@ -450,7 +446,7 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
gViewerWindow->setShowProgress(false);
}
- showMFAChallange(LLTrans::getString(response["message_id"]));
+ showMFAChallange(LLTrans::getString(response["message_id"].asString()));
}
else if( reason_response == "key"
|| reason_response == "presence"
@@ -612,7 +608,7 @@ std::string construct_start_string()
<< position[VX] << "&"
<< position[VY] << "&"
<< position[VZ]);
- start = xml_escape_string(unescaped_start);
+ start = LLStringFn::xml_encode(unescaped_start, true);
break;
}
case LLSLURL::HOME_LOCATION:
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index 0ec7b3bb24..624408d46d 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -29,7 +29,6 @@
#include "lleventdispatcher.h"
#include "lleventapi.h"
-#include <boost/scoped_ptr.hpp>
#include <boost/function.hpp>
#include <memory> // std::shared_ptr
#include "llsecapi.h"
diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp
index d572605635..aa03001389 100644
--- a/indra/newview/llmachineid.cpp
+++ b/indra/newview/llmachineid.cpp
@@ -293,7 +293,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var
if (validate_as_uuid)
{
std::wstring ws(serialNumber, serial_size);
- std::string str(ws.begin(), ws.end());
+ std::string str = ll_convert_wide_to_string(ws);
if (!LLUUID::validate(str))
{
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index 2adb506c0f..0d617753c8 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -450,10 +450,10 @@ void LLManip::renderXYZ(const LLVector3 &vec)
gGL.color4f(0.f, 0.f, 0.f, 0.7f);
imagep->draw(
- (window_center_x - 115) * display_scale.mV[VX],
- (window_center_y + vertical_offset - PAD) * display_scale.mV[VY],
- 235 * display_scale.mV[VX],
- (PAD * 2 + 10) * display_scale.mV[VY],
+ (S32)((window_center_x - 115) * display_scale.mV[VX]),
+ (S32)((window_center_y + vertical_offset - PAD) * display_scale.mV[VY]),
+ (S32)(235 * display_scale.mV[VX]),
+ (S32)((PAD * 2 + 10) * display_scale.mV[VY]),
LLColor4(0.f, 0.f, 0.f, 0.7f) );
LLFontGL* font = LLFontGL::getFontSansSerif();
@@ -463,33 +463,33 @@ void LLManip::renderXYZ(const LLVector3 &vec)
// render drop shadowed text (manually because of bigger 'distance')
F32 right_x;
feedback_string = llformat("X: %.3f", vec.mV[VX]);
- font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black,
+ font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f + 1.f, (F32)(window_center_y + vertical_offset) - 2.f, LLColor4::black,
LLFontGL::LEFT, LLFontGL::BASELINE,
LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
feedback_string = llformat("Y: %.3f", vec.mV[VY]);
- font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black,
+ font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f + 1.f, (F32)(window_center_y + vertical_offset) - 2.f, LLColor4::black,
LLFontGL::LEFT, LLFontGL::BASELINE,
LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
feedback_string = llformat("Z: %.3f", vec.mV[VZ]);
- font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black,
+ font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f + 1.f, (F32)(window_center_y + vertical_offset) - 2.f, LLColor4::black,
LLFontGL::LEFT, LLFontGL::BASELINE,
LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
// render text on top
feedback_string = llformat("X: %.3f", vec.mV[VX]);
- font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f, window_center_y + vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f),
+ font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f, (F32)(window_center_y + vertical_offset), LLColor4(1.f, 0.5f, 0.5f, 1.f),
LLFontGL::LEFT, LLFontGL::BASELINE,
LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
feedback_string = llformat("Y: %.3f", vec.mV[VY]);
- font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f, window_center_y + vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f),
+ font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f, (F32)(window_center_y + vertical_offset), LLColor4(0.5f, 1.f, 0.5f, 1.f),
LLFontGL::LEFT, LLFontGL::BASELINE,
LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
feedback_string = llformat("Z: %.3f", vec.mV[VZ]);
- font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f, window_center_y + vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f),
+ font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f, (F32)(window_center_y + vertical_offset), LLColor4(0.5f, 0.5f, 1.f, 1.f),
LLFontGL::LEFT, LLFontGL::BASELINE,
LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
}
@@ -594,9 +594,9 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string
LLColor4 LLManip::setupSnapGuideRenderPass(S32 pass)
{
- static LLColor4 grid_color_fg = LLUIColorTable::instance().getColor("GridlineColor");
- static LLColor4 grid_color_bg = LLUIColorTable::instance().getColor("GridlineBGColor");
- static LLColor4 grid_color_shadow = LLUIColorTable::instance().getColor("GridlineShadowColor");
+ static LLUIColor grid_color_fg = LLUIColorTable::instance().getColor("GridlineColor");
+ static LLUIColor grid_color_bg = LLUIColorTable::instance().getColor("GridlineBGColor");
+ static LLUIColor grid_color_shadow = LLUIColorTable::instance().getColor("GridlineShadowColor");
LLColor4 line_color;
F32 line_alpha = gSavedSettings.getF32("GridOpacity");
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index c4f3f01ea1..ffb66dc6cc 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -884,7 +884,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
F32 drag_dist = mScaleDir * projected_drag_pos1; // Projecting the drag position allows for negative results, vs using the length which will result in a "reverse scaling" bug.
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos1, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos1, mScaleDir, mScaleSnapUnit1, (S32)mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions);
F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);
@@ -902,7 +902,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
F32 drag_dist = mScaleDir * projected_drag_pos2; // Projecting the drag position allows for negative results, vs using the length which will result in a "reverse scaling" bug.
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos2, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos2, mScaleDir, mScaleSnapUnit2, (S32)mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
F32 snap_dist = mScaleSnapUnit2 / (2.f * cur_subdivisions);
F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit2 / cur_subdivisions);
@@ -1113,7 +1113,7 @@ void LLManipScale::dragFace( S32 x, S32 y )
else
{
F32 drag_dist = scale_center_to_mouse * mScaleDir;
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + mScaleDir * drag_dist, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + mScaleDir * drag_dist, mScaleDir, mScaleSnapUnit1, (S32)mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions);
F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);
relative_snap_dist -= snap_dist;
@@ -1542,8 +1542,8 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
mScaleSnapUnit1 = mScaleSnapUnit1 / (mSnapDir1 * mScaleDir);
mScaleSnapUnit2 = mScaleSnapUnit2 / (mSnapDir2 * mScaleDir);
- mTickPixelSpacing1 = ll_round((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir1).length());
- mTickPixelSpacing2 = ll_round((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir2).length());
+ mTickPixelSpacing1 = (F32)ll_round((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir1).length());
+ mTickPixelSpacing2 = (F32)ll_round((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir2).length());
if (uniform)
{
@@ -1608,8 +1608,8 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
F32 dist_scale_units_2 = dist_grid_axis / smallest_subdivision2;
// find distance to nearest smallest grid unit
- F32 grid_multiple1 = llfloor(dist_scale_units_1);
- F32 grid_multiple2 = llfloor(dist_scale_units_2);
+ F32 grid_multiple1 = (F32)llfloor(dist_scale_units_1);
+ F32 grid_multiple2 = (F32)llfloor(dist_scale_units_2);
F32 grid_offset1 = fmodf(dist_grid_axis, smallest_subdivision1);
F32 grid_offset2 = fmodf(dist_grid_axis, smallest_subdivision2);
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 92f8ed949e..dde238eddb 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -648,7 +648,7 @@ void LLMaterialEditor::setBaseColor(const LLColor4& color)
F32 LLMaterialEditor::getTransparency()
{
- return childGetValue("transparency").asReal();
+ return (F32)childGetValue("transparency").asReal();
}
void LLMaterialEditor::setTransparency(F32 transparency)
@@ -668,7 +668,7 @@ void LLMaterialEditor::setAlphaMode(const std::string& alpha_mode)
F32 LLMaterialEditor::getAlphaCutoff()
{
- return childGetValue("alpha cutoff").asReal();
+ return (F32)childGetValue("alpha cutoff").asReal();
}
void LLMaterialEditor::setAlphaCutoff(F32 alpha_cutoff)
@@ -708,7 +708,7 @@ void LLMaterialEditor::setMetallicRoughnessUploadId(const LLUUID& id)
F32 LLMaterialEditor::getMetalnessFactor()
{
- return childGetValue("metalness factor").asReal();
+ return (F32)childGetValue("metalness factor").asReal();
}
void LLMaterialEditor::setMetalnessFactor(F32 factor)
@@ -718,7 +718,7 @@ void LLMaterialEditor::setMetalnessFactor(F32 factor)
F32 LLMaterialEditor::getRoughnessFactor()
{
- return childGetValue("roughness factor").asReal();
+ return (F32)childGetValue("roughness factor").asReal();
}
void LLMaterialEditor::setRoughnessFactor(F32 factor)
@@ -2430,14 +2430,14 @@ void LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback(const LLSD& notificati
createInventoryItem(str.str(), new_name, std::string(), permissions);
}
-const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type);
+const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k);
void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::string &filename, S32 index, bool open_floater)
{
if (index == model_in.materials.size())
{
// bulk upload all the things
- upload_bulk({ filename }, LLFilePicker::FFLOAD_MATERIAL);
+ upload_bulk({ filename }, LLFilePicker::FFLOAD_MATERIAL, true);
return;
}
@@ -2618,13 +2618,13 @@ bool LLMaterialEditor::setFromGltfModel(const tinygltf::Model& model, S32 index,
}
setAlphaMode(material_in.alphaMode);
- setAlphaCutoff(material_in.alphaCutoff);
+ setAlphaCutoff((F32)material_in.alphaCutoff);
setBaseColor(LLTinyGLTFHelper::getColor(material_in.pbrMetallicRoughness.baseColorFactor));
setEmissiveColor(LLTinyGLTFHelper::getColor(material_in.emissiveFactor));
- setMetalnessFactor(material_in.pbrMetallicRoughness.metallicFactor);
- setRoughnessFactor(material_in.pbrMetallicRoughness.roughnessFactor);
+ setMetalnessFactor((F32)material_in.pbrMetallicRoughness.metallicFactor);
+ setRoughnessFactor((F32)material_in.pbrMetallicRoughness.roughnessFactor);
setDoubleSided(material_in.doubleSided);
}
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 0f3e0306af..83a6e66019 100644
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -29,11 +29,6 @@
#include "llmediadataclient.h"
#include "llviewercontrol.h"
-#if LL_MSVC
-// disable boost::lexical_cast warning
-#pragma warning (disable:4702)
-#endif
-
#include <algorithm>
#include <boost/lexical_cast.hpp>
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 01c922df16..26e2d8f319 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1361,7 +1361,17 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry)
if (!buffer)
{
LL_WARNS(LOG_MESH) << "Failed to allocate memory for skin info, size: " << size << LL_ENDL;
- return false;
+
+ // Not sure what size is reasonable for skin info,
+ // but if 20MB allocation failed, we definetely have issues
+ const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB
+ if (size < MAX_SIZE)
+ {
+ LLAppViewer::instance()->outOfMemorySoftQuit();
+ } // else ignore failures for anomalously large data
+ LLMutexLock locker(mMutex);
+ mSkinUnavailableQ.emplace_back(mesh_id);
+ return true;
}
LLMeshRepository::sCacheBytesRead += size;
++LLMeshRepository::sCacheReads;
@@ -1474,7 +1484,15 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
if (!buffer)
{
LL_WARNS(LOG_MESH) << "Failed to allocate memory for mesh decomposition, size: " << size << LL_ENDL;
- return false;
+
+ // Not sure what size is reasonable for decomposition
+ // but if 20MB allocation failed, we definetely have issues
+ const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB
+ if (size < MAX_SIZE)
+ {
+ LLAppViewer::instance()->outOfMemorySoftQuit();
+ } // else ignore failures for anomalously large decompositiions
+ return true;
}
LLMeshRepository::sCacheBytesRead += size;
++LLMeshRepository::sCacheReads;
@@ -1575,8 +1593,16 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
U8* buffer = new(std::nothrow) U8[size];
if (!buffer)
{
- LL_WARNS(LOG_MESH) << "Failed to allocate memory for physics shape, size: " << size << LL_ENDL;
- return false;
+ LL_WARNS(LOG_MESH) << "Failed to allocate memory for mesh decomposition, size: " << size << LL_ENDL;
+
+ // Not sure what size is reasonable for physcis
+ // but if 20MB allocation failed, we definetely have issues
+ const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB
+ if (size < MAX_SIZE)
+ {
+ LLAppViewer::instance()->outOfMemorySoftQuit();
+ } // else ignore failures for anomalously large data
+ return true;
}
file.read(buffer, size);
@@ -1685,9 +1711,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c
file.read(buffer, bytes);
if (headerReceived(mesh_params, buffer, bytes) == MESH_OK)
{
- std::string mid;
- mesh_params.getSculptID().toString(mid);
- LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh header for ID " << mid << " - was retrieved from the cache." << LL_ENDL;
+ LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh header for ID " << mesh_params.getSculptID() << " - was retrieved from the cache." << LL_ENDL;
// Found mesh in cache
return true;
@@ -1703,9 +1727,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c
if (!http_url.empty())
{
- std::string mid;
- mesh_params.getSculptID().toString(mid);
- LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh header for ID " << mid << " - was retrieved from the simulator." << LL_ENDL;
+ LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh header for ID " << mesh_params.getSculptID() << " - was retrieved from the simulator." << LL_ENDL;
//grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
//within the first 4KB
@@ -1771,9 +1793,17 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
if (!buffer)
{
LL_WARNS(LOG_MESH) << "Can't allocate memory for mesh " << mesh_id << " LOD " << lod << ", size: " << size << LL_ENDL;
- // todo: for now it will result in indefinite constant retries, should result in timeout
- // or in retry-count and disabling mesh. (but usually viewer is beyond saving at this point)
- return false;
+
+ // Not sure what size is reasonable for a mesh,
+ // but if 20MB allocation failed, we definetely have issues
+ const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB
+ if (size < MAX_SIZE)
+ {
+ LLAppViewer::instance()->outOfMemorySoftQuit();
+ } // else ignore failures for anomalously large data
+ LLMutexLock lock(mMutex);
+ mUnavailableQ.push_back(LODRequest(mesh_params, lod));
+ return true;
}
LLMeshRepository::sCacheBytesRead += size;
++LLMeshRepository::sCacheReads;
@@ -1793,9 +1823,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
{
delete[] buffer;
- std::string mid;
- mesh_id.toString(mid);
- LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mid << " - was retrieved from the cache." << LL_ENDL;
+ LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mesh_id << " - was retrieved from the cache." << LL_ENDL;
return true;
}
@@ -1810,9 +1838,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
if (!http_url.empty())
{
- std::string mid;
- mesh_id.toString(mid);
- LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mid << " - was retrieved from the simulator." << LL_ENDL;
+ LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mesh_id << " - was retrieved from the simulator." << LL_ENDL;
LLMeshHandlerBase::ptr_t handler(new LLMeshLODHandler(mesh_params, lod, offset, size));
LLCore::HttpHandle handle = getByteRange(http_url, offset, size, handler);
@@ -1869,7 +1895,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes
llssize dsize = data_size;
char* result_ptr = strip_deprecated_header((char*)data, dsize, &header_size);
- data_size = dsize;
+ data_size = (S32)dsize;
boost::iostreams::stream<boost::iostreams::array_source> stream(result_ptr, data_size);
@@ -1910,8 +1936,8 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes
{
LLMutexLock lock(mHeaderMutex);
- mMeshHeader[mesh_id] = { header_size, header };
- LLMeshRepository::sCacheBytesHeaders += header_size;
+ mMeshHeader[mesh_id] = { (U32)header_size, header };
+ LLMeshRepository::sCacheBytesHeaders += (U32)header_size;
}
LLMutexLock lock(mMutex); // make sure only one thread access mPendingLOD at the same time.
@@ -2337,10 +2363,11 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
// We want to be able to allow more than 8 materials...
//
- S32 end = llmin((S32)instance.mMaterial.size(), instance.mModel->getNumVolumeFaces()) ;
+ S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), instance.mModel->getNumVolumeFaces()) ;
for (S32 face_num = 0; face_num < end; face_num++)
{
+ // multiple faces can reuse the same material
LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
LLSD face_entry = LLSD::emptyMap();
@@ -3265,8 +3292,6 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
// only allocate as much space in the cache as is needed for the local cache
data_size = llmin(data_size, bytes);
- // <FS:Ansariel> Fix asset caching
- //LLFileSystem file(mesh_id, LLAssetType::AT_MESH, LLFileSystem::WRITE);
LLFileSystem file(mesh_id, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE);
if (file.getMaxSize() >= bytes)
{
@@ -3275,7 +3300,6 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
file.write(data, data_size);
- // <FS:Ansariel> Fix asset caching
S32 remaining = bytes - file.tell();
if (remaining > 0)
{
@@ -3287,7 +3311,6 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
delete[] block;
}
}
- // </FS:Ansariel>
}
}
else
@@ -3340,8 +3363,6 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body
if (result == MESH_OK)
{
// good fetch from sim, write to cache
- // <FS:Ansariel> Fix asset caching
- //LLFileSystem file(mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLFileSystem::WRITE);
LLFileSystem file(mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLFileSystem::READ_WRITE);
S32 offset = mOffset;
@@ -3405,8 +3426,6 @@ void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /*
&& gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
{
// good fetch from sim, write to cache
- // <FS:Ansariel> Fix asset caching
- //LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::WRITE);
LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE);
S32 offset = mOffset;
@@ -3456,8 +3475,6 @@ void LLMeshDecompositionHandler::processData(LLCore::BufferArray * /* body */, S
&& gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size))
{
// good fetch from sim, write to cache
- // <FS:Ansariel> Fix asset caching
- //LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::WRITE);
LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE);
S32 offset = mOffset;
@@ -3505,8 +3522,6 @@ void LLMeshPhysicsShapeHandler::processData(LLCore::BufferArray * /* body */, S3
&& gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size) == MESH_OK)
{
// good fetch from sim, write to cache for caching
- // <FS:Ansariel> Fix asset caching
- //LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::WRITE);
LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE);
S32 offset = mOffset;
@@ -3751,7 +3766,8 @@ void LLMeshRepository::notifyLoadedMeshes()
? (2 * LLAppCoreHttp::PIPELINING_DEPTH)
: 5);
- LLMeshRepoThread::sMaxConcurrentRequests = gSavedSettings.getU32("Mesh2MaxConcurrentRequests");
+ static LLCachedControl<U32> mesh2_max_req(gSavedSettings, "Mesh2MaxConcurrentRequests");
+ LLMeshRepoThread::sMaxConcurrentRequests = mesh2_max_req;
LLMeshRepoThread::sRequestHighWater = llclamp(scale * S32(LLMeshRepoThread::sMaxConcurrentRequests),
REQUEST2_HIGH_WATER_MIN,
REQUEST2_HIGH_WATER_MAX);
@@ -4607,7 +4623,8 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLMeshHeader& header, F32 radius, S
*unscaled_value = weighted_avg;
}
- return weighted_avg/gSavedSettings.getU32("MeshTriangleBudget")*15000.f;
+ static LLCachedControl<U32> mesh_triangle_budget(gSavedSettings, "MeshTriangleBudget");
+ return weighted_avg / mesh_triangle_budget * 15000.f;
}
LLMeshCostData::LLMeshCostData()
@@ -4758,12 +4775,13 @@ F32 LLMeshCostData::getEstTrisForStreamingCost()
F32 LLMeshCostData::getRadiusBasedStreamingCost(F32 radius)
{
- return getRadiusWeightedTris(radius)/gSavedSettings.getU32("MeshTriangleBudget")*15000.f;
+ static LLCachedControl<U32> mesh_triangle_budget(gSavedSettings, "MeshTriangleBudget");
+ return getRadiusWeightedTris(radius)/mesh_triangle_budget*15000.f;
}
F32 LLMeshCostData::getTriangleBasedStreamingCost()
{
- F32 result = ANIMATED_OBJECT_COST_PER_KTRI * 0.001 * getEstTrisForStreamingCost();
+ F32 result = ANIMATED_OBJECT_COST_PER_KTRI * 0.001f * getEstTrisForStreamingCost();
return result;
}
@@ -5334,8 +5352,9 @@ bool LLMeshRepository::meshUploadEnabled()
bool LLMeshRepository::meshRezEnabled()
{
+ static LLCachedControl<bool> mesh_enabled(gSavedSettings, "MeshEnabled");
LLViewerRegion *region = gAgent.getRegion();
- if(gSavedSettings.getBOOL("MeshEnabled") &&
+ if(mesh_enabled &&
region)
{
return region->meshRezEnabled();
@@ -5473,7 +5492,7 @@ void on_new_single_inventory_upload_complete(
LL_INFOS() << "inventory_item_flags " << inventory_item_flags << LL_ENDL;
}
}
- S32 creation_date_now = time_corrected();
+ S32 creation_date_now = (S32)time_corrected();
LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem(
server_response["new_inventory_item"].asUUID(),
item_folder_id,
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index b1a48db0ee..df573bd785 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -242,7 +242,7 @@ void LLModelPreview::updateDimentionsAndOffsets()
std::set<LLModel*> accounted;
- mPelvisZOffset = mFMP ? mFMP->childGetValue("pelvis_offset").asReal() : 3.0f;
+ mPelvisZOffset = mFMP ? (F32)mFMP->childGetValue("pelvis_offset").asReal() : 3.0f;
if (mFMP && mFMP->childGetValue("upload_joints").asBoolean())
{
@@ -272,7 +272,7 @@ void LLModelPreview::updateDimentionsAndOffsets()
}
}
- F32 scale = mFMP ? mFMP->childGetValue("import_scale").asReal()*2.f : 2.f;
+ F32 scale = mFMP ? (F32)mFMP->childGetValue("import_scale").asReal()*2.f : 2.f;
mDetailsSignal((F32)(mPreviewScale[0] * scale), (F32)(mPreviewScale[1] * scale), (F32)(mPreviewScale[2] * scale));
@@ -293,7 +293,7 @@ void LLModelPreview::rebuildUploadData()
LLSpinCtrl* scale_spinner = mFMP->getChild<LLSpinCtrl>("import_scale");
- F32 scale = scale_spinner->getValue().asReal();
+ F32 scale = (F32)scale_spinner->getValue().asReal();
LLMatrix4 scale_mat;
scale_mat.initScale(LLVector3(scale, scale, scale));
@@ -1290,7 +1290,7 @@ void LLModelPreview::generateNormals()
return;
}
- F32 angle_cutoff = mFMP->childGetValue("crease_angle").asReal();
+ F32 angle_cutoff = (F32)mFMP->childGetValue("crease_angle").asReal();
mRequestedCreaseAngle[which_lod] = angle_cutoff;
@@ -1489,7 +1489,7 @@ F32 LLModelPreview::genMeshOptimizerPerModel(LLModel *base_model, LLModel *targe
target_indices = 3;
}
- size_new_indices = LLMeshOptimizer::simplifyU32(
+ size_new_indices = (S32)LLMeshOptimizer::simplifyU32(
output_indices,
source_indices,
size_indices,
@@ -1730,7 +1730,7 @@ F32 LLModelPreview::genMeshOptimizerPerFace(LLModel *base_model, LLModel *target
target_indices = 3;
}
- size_new_indices = LLMeshOptimizer::simplify(
+ size_new_indices = (S32)LLMeshOptimizer::simplify(
output_indices,
source_indices,
size_indices,
@@ -1851,7 +1851,7 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
{
if (!enforce_tri_limit)
{
- triangle_limit = base_triangle_count;
+ triangle_limit = (F32)base_triangle_count;
// reset to default value for this lod
F32 pw = pow((F32)decimation, (F32)(LLModel::LOD_HIGH - which_lod));
@@ -1861,7 +1861,7 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
{
// UI spacifies limit for all models of single lod
- triangle_limit = mFMP->childGetValue("lod_triangle_limit_" + lod_name[which_lod]).asInteger();
+ triangle_limit = (F32)mFMP->childGetValue("lod_triangle_limit_" + lod_name[which_lod]).asReal();
}
// meshoptimizer doesn't use triangle limit, it uses indices limit, so convert it to aproximate ratio
@@ -1871,14 +1871,14 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
else
{
// UI shows 0 to 100%, but meshoptimizer works with 0 to 1
- lod_error_threshold = mFMP->childGetValue("lod_error_threshold_" + lod_name[which_lod]).asReal() / 100.f;
+ lod_error_threshold = (F32)mFMP->childGetValue("lod_error_threshold_" + lod_name[which_lod]).asReal() / 100.f;
}
}
else
{
// we are genrating all lods and each lod will get own indices_decimator
indices_decimator = 1;
- triangle_limit = base_triangle_count;
+ triangle_limit = (F32)base_triangle_count;
}
mMaxTriangleLimit = base_triangle_count;
@@ -1906,7 +1906,7 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
}
}
- mRequestedTriangleCount[lod] = triangle_limit;
+ mRequestedTriangleCount[lod] = (S32)triangle_limit;
mRequestedErrorThreshold[lod] = lod_error_threshold * 100;
mRequestedLoDMode[lod] = lod_mode;
@@ -2748,7 +2748,7 @@ void LLModelPreview::updateLodControls(S32 lod)
LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold_" + lod_name[lod]);
LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit_" + lod_name[lod]);
- limit->setMaxValue(mMaxTriangleLimit);
+ limit->setMaxValue((F32)mMaxTriangleLimit);
limit->forceSetValue(mRequestedTriangleCount[lod]);
threshold->forceSetValue(mRequestedErrorThreshold[lod]);
@@ -2760,8 +2760,8 @@ void LLModelPreview::updateLodControls(S32 lod)
limit->setVisible(true);
threshold->setVisible(false);
- limit->setMaxValue(mMaxTriangleLimit);
- limit->setIncrement(llmax((U32)1, mMaxTriangleLimit / 32));
+ limit->setMaxValue((F32)mMaxTriangleLimit);
+ limit->setIncrement((F32)llmax((U32)1, mMaxTriangleLimit / 32));
}
else
{
@@ -3134,6 +3134,13 @@ U32 LLModelPreview::loadTextures(LLImportMaterial& material, void* opaque)
LLPointer< LLViewerFetchedTexture >& tex = (*reinterpret_cast< LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData));
tex = LLViewerTextureManager::getFetchedTextureFromUrl("file://" + LLURI::unescape(material.mDiffuseMapFilename), FTT_LOCAL_FILE, true, LLGLTexture::BOOST_PREVIEW);
+ if (tex->getDiscardLevel() < tex->getMaxDiscardLevel())
+ {
+ // file was loaded previosly, reload image to get potential changes
+ tex->clearFetchedResults();
+ }
+ // Todo: might cause a crash if preview gets closed before we get the callback.
+ // Use a callback list or guard callback in some way
tex->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, true, false, opaque, NULL, false);
tex->forceToSaveRawImage(0, F32_MAX);
material.setDiffuseMap(tex->getID()); // record tex ID
@@ -3215,7 +3222,7 @@ bool LLModelPreview::render()
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.loadIdentity();
- gGL.ortho(0.0f, width, 0.0f, height, -1.0f, 1.0f);
+ gGL.ortho(0.0f, (F32)width, 0.0f, (F32)height, -1.0f, 1.0f);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
@@ -3353,7 +3360,7 @@ bool LLModelPreview::render()
mFMP->childSetEnabled("upload_joints", upload_skin);
}
- F32 explode = mFMP->childGetValue("physics_explode").asReal();
+ F32 explode = (F32)mFMP->childGetValue("physics_explode").asReal();
LLGLDepthTest gls_depth(GL_TRUE); // SL-12781 re-enable z-buffer for 3D model preview
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index da5bc4b05d..dfead5ee8a 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -705,7 +705,7 @@ void LLNavigationBar::resizeLayoutPanel()
{
LLRect nav_bar_rect = mNavigationPanel->getRect();
- S32 nav_panel_width = (nav_bar_rect.getWidth() + mFavoritePanel->getRect().getWidth()) * gSavedPerAccountSettings.getF32("NavigationBarRatio");
+ S32 nav_panel_width = (S32)((nav_bar_rect.getWidth() + mFavoritePanel->getRect().getWidth()) * gSavedPerAccountSettings.getF32("NavigationBarRatio"));
nav_bar_rect.setLeftTopAndSize(nav_bar_rect.mLeft, nav_bar_rect.mTop, nav_panel_width, nav_bar_rect.getHeight());
mNavigationPanel->handleReshape(nav_bar_rect,true);
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 1410232a0f..3f370b1ab5 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -296,8 +296,6 @@ void LLNetMap::draw()
gGL.color4f(1.f, 0.5f, 0.5f, 1.f);
}
-
-
// Draw using texture.
gGL.getTexUnit(0)->bind(regionp->getLand().getSTexture());
gGL.begin(LLRender::QUADS);
@@ -311,24 +309,6 @@ void LLNetMap::draw()
gGL.vertex2f(right, top);
gGL.end();
- // Draw water
- gGL.flush();
- {
- if (regionp->getLand().getWaterTexture())
- {
- gGL.getTexUnit(0)->bind(regionp->getLand().getWaterTexture());
- gGL.begin(LLRender::QUADS);
- gGL.texCoord2f(0.f, 1.f);
- gGL.vertex2f(left, top);
- gGL.texCoord2f(0.f, 0.f);
- gGL.vertex2f(left, bottom);
- gGL.texCoord2f(1.f, 0.f);
- gGL.vertex2f(right, bottom);
- gGL.texCoord2f(1.f, 1.f);
- gGL.vertex2f(right, top);
- gGL.end();
- }
- }
gGL.flush();
}
@@ -455,7 +435,7 @@ void LLNetMap::draw()
}
F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
- LLVector2(local_mouse_x,local_mouse_y));
+ LLVector2((F32)local_mouse_x, (F32)local_mouse_y));
if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
{
closest_dist_squared = dist_to_cursor_squared;
@@ -495,7 +475,7 @@ void LLNetMap::draw()
dot_width);
F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
- LLVector2(local_mouse_x,local_mouse_y));
+ LLVector2((F32)local_mouse_x, (F32)local_mouse_y));
if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
{
mClosestAgentToCursor = gAgent.getID();
@@ -691,7 +671,7 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )
bool LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
// note that clicks are reversed from what you'd think: i.e. > 0 means zoom out, < 0 means zoom in
- F32 new_scale = mScale * pow(MAP_SCALE_ZOOM_FACTOR, -clicks);
+ F32 new_scale = mScale * (F32)pow(MAP_SCALE_ZOOM_FACTOR, -clicks);
F32 old_scale = mScale;
setScale(new_scale);
@@ -701,8 +681,8 @@ bool LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
// Adjust pan to center the zoom on the mouse pointer
LLVector2 zoom_offset;
- zoom_offset.mV[VX] = x - getRect().getWidth() / 2;
- zoom_offset.mV[VY] = y - getRect().getHeight() / 2;
+ zoom_offset.mV[VX] = (F32)(x - getRect().getWidth() / 2);
+ zoom_offset.mV[VY] = (F32)(y - getRect().getHeight() / 2);
mCurPan -= zoom_offset * mScale / old_scale - zoom_offset;
}
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 842c24db8a..f0bbaddfb2 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -68,7 +68,7 @@ void LLScriptHandler::initChannel()
//--------------------------------------------------------------------------
void LLScriptHandler::addToastWithNotification(const LLNotificationPtr& notification)
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification);
LLToast::Params p;
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index c7fa96edca..0c4ef6f943 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -121,12 +121,12 @@ bool LLTipHandler::processNotification(const LLNotificationPtr& notification, bo
if (exp_time > cur_time)
{
// we have non-default expiration time - keep visible until expires
- p.lifetime_secs = exp_time.secondsSinceEpoch() - cur_time.secondsSinceEpoch();
+ p.lifetime_secs = (F32)(exp_time.secondsSinceEpoch() - cur_time.secondsSinceEpoch());
}
else
{
// use default time
- p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
+ p.lifetime_secs = (F32)gSavedSettings.getS32("NotificationTipToastLifeTime");
}
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 22420e8896..72fb9464d8 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -109,8 +109,6 @@ bool LLOutfitGallery::postBuild()
{
bool rv = LLOutfitListBase::postBuild();
mScrollPanel = getChild<LLScrollContainer>("gallery_scroll_panel");
- LLPanel::Params params = LLPanel::getDefaultParams(); // Don't parse XML when creating dummy LLPanel
- mGalleryPanel = LLUICtrlFactory::create<LLPanel>(params);
mMessageTextBox = getChild<LLTextBox>("no_outfits_txt");
mOutfitGalleryMenu = new LLOutfitGalleryContextMenu(this);
return rv;
@@ -416,7 +414,8 @@ void LLOutfitGallery::updateRowsIfNeeded()
bool compareGalleryItem(LLOutfitGalleryItem* item1, LLOutfitGalleryItem* item2)
{
- if(gSavedSettings.getBOOL("OutfitGallerySortByName") ||
+ static LLCachedControl<bool> outfit_gallery_sort_by_name(gSavedSettings, "OutfitGallerySortByName");
+ if(outfit_gallery_sort_by_name ||
((item1->isDefaultImage() && item2->isDefaultImage()) || (!item1->isDefaultImage() && !item2->isDefaultImage())))
{
std::string name1 = item1->getItemName();
@@ -752,13 +751,16 @@ void LLOutfitGallery::onFilterSubStringChanged(const std::string& new_string, co
void LLOutfitGallery::onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id)
{
- if (mOutfitMap[base_id])
+ auto base_it = mOutfitMap.find(base_id);
+ if (base_it != mOutfitMap.end())
{
- mOutfitMap[base_id]->setOutfitWorn(true);
+ base_it->second->setOutfitWorn(true);
}
- if (mOutfitMap[prev_id])
+
+ auto prev_it = mOutfitMap.find(prev_id);
+ if (prev_it != mOutfitMap.end())
{
- mOutfitMap[prev_id]->setOutfitWorn(false);
+ prev_it->second->setOutfitWorn(false);
}
}
@@ -872,13 +874,16 @@ void LLOutfitGallery::onChangeOutfitSelection(LLWearableItemsList* list, const L
{
if (mSelectedOutfitUUID == category_id)
return;
- if (mOutfitMap[mSelectedOutfitUUID])
+
+ auto selected_it = mOutfitMap.find(mSelectedOutfitUUID);
+ if (selected_it != mOutfitMap.end())
{
- mOutfitMap[mSelectedOutfitUUID]->setSelected(false);
+ selected_it->second->setSelected(false);
}
- if (mOutfitMap[category_id])
+ auto category_it = mOutfitMap.find(category_id);
+ if (category_it != mOutfitMap.end())
{
- mOutfitMap[category_id]->setSelected(true);
+ category_it->second->setSelected(true);
}
// mSelectedOutfitUUID will be set in LLOutfitListBase::ChangeOutfitSelection
}
@@ -900,9 +905,10 @@ bool LLOutfitGallery::canWearSelected()
bool LLOutfitGallery::hasDefaultImage(const LLUUID& outfit_cat_id)
{
- if (mOutfitMap[outfit_cat_id])
+ auto outfit_it = mOutfitMap.find(outfit_cat_id);
+ if (outfit_it != mOutfitMap.end())
{
- return mOutfitMap[outfit_cat_id]->isDefaultImage();
+ return outfit_it->second->isDefaultImage();
}
return false;
}
@@ -950,6 +956,7 @@ LLOutfitGalleryItem::~LLOutfitGalleryItem()
bool LLOutfitGalleryItem::postBuild()
{
+ mPreviewIcon = getChild<LLIconCtrl>("preview_outfit");
setDefaultImage();
mOutfitNameText = getChild<LLTextBox>("outfit_name");
@@ -965,10 +972,12 @@ void LLOutfitGalleryItem::draw()
LLPanel::draw();
// Draw border
- LLUIColor border_color = LLUIColorTable::instance().getColor(mSelected ? "OutfitGalleryItemSelected" : "OutfitGalleryItemUnselected", LLColor4::white);
- LLRect border = getChildView("preview_outfit")->getRect();
+ static LLUIColor selected_color = LLUIColorTable::instance().getColor("OutfitGalleryItemSelected", LLColor4::white);
+ static LLUIColor unselected_color = LLUIColorTable::instance().getColor("OutfitGalleryItemUnselected", LLColor4::white);
+ const LLColor4& border_color = mSelected ? selected_color : unselected_color;
+ LLRect border = mPreviewIcon->getRect();
border.mRight = border.mRight + 1;
- gl_rect_2d(border, border_color.get(), false);
+ gl_rect_2d(border, border_color, false);
// If the floater is focused, don't apply its alpha to the texture (STORM-677).
const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
@@ -1009,8 +1018,8 @@ void LLOutfitGalleryItem::setOutfitWorn(bool value)
LLStringUtil::format_map_t worn_string_args;
std::string worn_string = getString("worn_string", worn_string_args);
LLUIColor text_color = LLUIColorTable::instance().getColor("White", LLColor4::white);
- mOutfitWornText->setReadOnlyColor(text_color.get());
- mOutfitNameText->setReadOnlyColor(text_color.get());
+ mOutfitWornText->setReadOnlyColor(text_color);
+ mOutfitNameText->setReadOnlyColor(text_color);
mOutfitWornText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall());
mOutfitNameText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall());
mOutfitWornText->setValue(value ? worn_string : "");
@@ -1124,7 +1133,7 @@ bool LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
{
mImageAssetId = image_asset_id;
mTexturep = texture;
- getChildView("preview_outfit")->setVisible(false);
+ mPreviewIcon->setVisible(false);
mDefaultImage = false;
mImageUpdatePending = (texture->getDiscardLevel() == -1);
return true;
@@ -1141,7 +1150,7 @@ void LLOutfitGalleryItem::setDefaultImage()
{
mTexturep = NULL;
mImageAssetId.setNull();
- getChildView("preview_outfit")->setVisible(true);
+ mPreviewIcon->setVisible(true);
mDefaultImage = true;
mImageUpdatePending = false;
}
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 819d09dcf5..fa441ff209 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -262,6 +262,7 @@ private:
LLTextBox* mOutfitNameText;
LLTextBox* mOutfitWornText;
LLPanel* mTextBgPanel;
+ LLIconCtrl* mPreviewIcon = nullptr;
bool mSelected;
bool mWorn;
bool mDefaultImage;
diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp
index 0de22fce25..7d55ba3265 100644
--- a/indra/newview/llpanelblockedlist.cpp
+++ b/indra/newview/llpanelblockedlist.cpp
@@ -94,16 +94,21 @@ bool LLPanelBlockedList::postBuild()
break;
}
+ mBlockedGearBtn = getChild<LLMenuButton>("blocked_gear_btn");
+
// Use the context menu of the Block list for the Block tab gear menu.
LLToggleableMenu* blocked_gear_menu = mBlockedList->getContextMenu();
if (blocked_gear_menu)
{
- getChild<LLMenuButton>("blocked_gear_btn")->setMenu(blocked_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
+ mBlockedGearBtn->setMenu(blocked_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
}
+ mUnblockBtn = getChild<LLButton>("unblock_btn");
+ mUnblockBtn->setCommitCallback(boost::bind(&LLPanelBlockedList::unblockItem, this));
- getChild<LLButton>("unblock_btn")->setCommitCallback(boost::bind(&LLPanelBlockedList::unblockItem, this));
getChild<LLFilterEditor>("blocked_filter_input")->setCommitCallback(boost::bind(&LLPanelBlockedList::onFilterEdit, this, _2));
+ mBlockLimitText = getChild<LLUICtrl>("block_limit");
+
return LLPanel::postBuild();
}
@@ -140,11 +145,12 @@ void LLPanelBlockedList::showPanelAndSelect(const LLUUID& idToSelect)
void LLPanelBlockedList::updateButtons()
{
bool hasSelected = NULL != mBlockedList->getSelectedItem();
- getChildView("unblock_btn")->setEnabled(hasSelected);
- getChildView("blocked_gear_btn")->setEnabled(hasSelected);
+ mUnblockBtn->setEnabled(hasSelected);
+ mBlockedGearBtn->setEnabled(hasSelected);
- getChild<LLUICtrl>("block_limit")->setTextArg("[COUNT]", llformat("%d", mBlockedList->getMuteListSize()));
- getChild<LLUICtrl>("block_limit")->setTextArg("[LIMIT]", llformat("%d", gSavedSettings.getS32("MuteListLimit")));
+ static LLCachedControl<S32> mute_list_limit(gSavedSettings, "MuteListLimit");
+ mBlockLimitText->setTextArg("[COUNT]", llformat("%d", mBlockedList->getMuteListSize()));
+ mBlockLimitText->setTextArg("[LIMIT]", llformat("%d", mute_list_limit()));
}
void LLPanelBlockedList::unblockItem()
diff --git a/indra/newview/llpanelblockedlist.h b/indra/newview/llpanelblockedlist.h
index 446f3d4bad..1f470199ce 100644
--- a/indra/newview/llpanelblockedlist.h
+++ b/indra/newview/llpanelblockedlist.h
@@ -33,6 +33,8 @@
class LLAvatarName;
class LLBlockList;
+class LLMenuButton;
+class LLButton;
class LLPanelBlockedList : public LLPanel
{
@@ -78,7 +80,10 @@ private:
static void callbackBlockByName(const std::string& text);
private:
- LLBlockList* mBlockedList;
+ LLBlockList* mBlockedList = nullptr;
+ LLUICtrl* mBlockLimitText = nullptr;
+ LLMenuButton* mBlockedGearBtn = nullptr;
+ LLButton* mUnblockBtn = nullptr;
LLHandle<LLFloater> mPicker;
};
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 9fe8f39bd6..1faf241aaa 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -479,8 +479,8 @@ void LLPanelClassifiedInfo::stretchSnapshot()
// Lets increase texture height to force texture look as expected.
rc.mBottom -= BTN_HEIGHT_SMALL;
- F32 t_width = texture->getFullWidth();
- F32 t_height = texture->getFullHeight();
+ F32 t_width = (F32)texture->getFullWidth();
+ F32 t_height = (F32)texture->getFullHeight();
F32 ratio = llmin<F32>( (rc.getWidth() / t_width), (rc.getHeight() / t_height) );
diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp
index 5255b3763c..ea2b2ba944 100644
--- a/indra/newview/llpaneleditsky.cpp
+++ b/indra/newview/llpaneleditsky.cpp
@@ -248,7 +248,7 @@ void LLPanelSettingsSkyAtmosTab::onBlueDensityChanged()
void LLPanelSettingsSkyAtmosTab::onHazeHorizonChanged()
{
if (!mSkySettings) return;
- mSkySettings->setHazeHorizon(getChild<LLUICtrl>(FIELD_SKY_HAZE_HORIZON)->getValue().asReal());
+ mSkySettings->setHazeHorizon((F32)getChild<LLUICtrl>(FIELD_SKY_HAZE_HORIZON)->getValue().asReal());
mSkySettings->update();
setIsDirty();
}
@@ -256,7 +256,7 @@ void LLPanelSettingsSkyAtmosTab::onHazeHorizonChanged()
void LLPanelSettingsSkyAtmosTab::onHazeDensityChanged()
{
if (!mSkySettings) return;
- mSkySettings->setHazeDensity(getChild<LLUICtrl>(FIELD_SKY_HAZE_DENSITY)->getValue().asReal());
+ mSkySettings->setHazeDensity((F32)getChild<LLUICtrl>(FIELD_SKY_HAZE_DENSITY)->getValue().asReal());
mSkySettings->update();
setIsDirty();
}
@@ -264,7 +264,7 @@ void LLPanelSettingsSkyAtmosTab::onHazeDensityChanged()
void LLPanelSettingsSkyAtmosTab::onSceneGammaChanged()
{
if (!mSkySettings) return;
- mSkySettings->setGamma(getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->getValue().asReal());
+ mSkySettings->setGamma((F32)getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->getValue().asReal());
mSkySettings->update();
setIsDirty();
}
@@ -272,7 +272,7 @@ void LLPanelSettingsSkyAtmosTab::onSceneGammaChanged()
void LLPanelSettingsSkyAtmosTab::onDensityMultipChanged()
{
if (!mSkySettings) return;
- F32 density_mult = getChild<LLUICtrl>(FIELD_SKY_DENSITY_MULTIP)->getValue().asReal();
+ F32 density_mult = (F32)getChild<LLUICtrl>(FIELD_SKY_DENSITY_MULTIP)->getValue().asReal();
density_mult *= SLIDER_SCALE_DENSITY_MULTIPLIER;
mSkySettings->setDensityMultiplier(density_mult);
mSkySettings->update();
@@ -282,7 +282,7 @@ void LLPanelSettingsSkyAtmosTab::onDensityMultipChanged()
void LLPanelSettingsSkyAtmosTab::onDistanceMultipChanged()
{
if (!mSkySettings) return;
- mSkySettings->setDistanceMultiplier(getChild<LLUICtrl>(FIELD_SKY_DISTANCE_MULTIP)->getValue().asReal());
+ mSkySettings->setDistanceMultiplier((F32)getChild<LLUICtrl>(FIELD_SKY_DISTANCE_MULTIP)->getValue().asReal());
mSkySettings->update();
setIsDirty();
}
@@ -290,7 +290,7 @@ void LLPanelSettingsSkyAtmosTab::onDistanceMultipChanged()
void LLPanelSettingsSkyAtmosTab::onMaxAltChanged()
{
if (!mSkySettings) return;
- mSkySettings->setMaxY(getChild<LLUICtrl>(FIELD_SKY_MAX_ALT)->getValue().asReal());
+ mSkySettings->setMaxY((F32)getChild<LLUICtrl>(FIELD_SKY_MAX_ALT)->getValue().asReal());
mSkySettings->update();
setIsDirty();
}
@@ -298,7 +298,7 @@ void LLPanelSettingsSkyAtmosTab::onMaxAltChanged()
void LLPanelSettingsSkyAtmosTab::onMoistureLevelChanged()
{
if (!mSkySettings) return;
- F32 moisture_level = getChild<LLUICtrl>(FIELD_SKY_DENSITY_MOISTURE_LEVEL)->getValue().asReal();
+ F32 moisture_level = (F32)getChild<LLUICtrl>(FIELD_SKY_DENSITY_MOISTURE_LEVEL)->getValue().asReal();
mSkySettings->setSkyMoistureLevel(moisture_level);
mSkySettings->update();
setIsDirty();
@@ -307,7 +307,7 @@ void LLPanelSettingsSkyAtmosTab::onMoistureLevelChanged()
void LLPanelSettingsSkyAtmosTab::onDropletRadiusChanged()
{
if (!mSkySettings) return;
- F32 droplet_radius = getChild<LLUICtrl>(FIELD_SKY_DENSITY_DROPLET_RADIUS)->getValue().asReal();
+ F32 droplet_radius = (F32)getChild<LLUICtrl>(FIELD_SKY_DENSITY_DROPLET_RADIUS)->getValue().asReal();
mSkySettings->setSkyDropletRadius(droplet_radius);
mSkySettings->update();
setIsDirty();
@@ -316,7 +316,7 @@ void LLPanelSettingsSkyAtmosTab::onDropletRadiusChanged()
void LLPanelSettingsSkyAtmosTab::onIceLevelChanged()
{
if (!mSkySettings) return;
- F32 ice_level = getChild<LLUICtrl>(FIELD_SKY_DENSITY_ICE_LEVEL)->getValue().asReal();
+ F32 ice_level = (F32)getChild<LLUICtrl>(FIELD_SKY_DENSITY_ICE_LEVEL)->getValue().asReal();
mSkySettings->setSkyIceLevel(ice_level);
mSkySettings->update();
setIsDirty();
@@ -325,7 +325,7 @@ void LLPanelSettingsSkyAtmosTab::onIceLevelChanged()
void LLPanelSettingsSkyAtmosTab::onReflectionProbeAmbianceChanged()
{
if (!mSkySettings) return;
- F32 ambiance = getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->getValue().asReal();
+ F32 ambiance = (F32)getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->getValue().asReal();
mSkySettings->setReflectionProbeAmbiance(ambiance);
mSkySettings->update();
@@ -446,7 +446,7 @@ void LLPanelSettingsSkyCloudTab::onCloudColorChanged()
void LLPanelSettingsSkyCloudTab::onCloudCoverageChanged()
{
if (!mSkySettings) return;
- mSkySettings->setCloudShadow(getChild<LLUICtrl>(FIELD_SKY_CLOUD_COVERAGE)->getValue().asReal());
+ mSkySettings->setCloudShadow((F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_COVERAGE)->getValue().asReal());
mSkySettings->update();
setIsDirty();
}
@@ -454,14 +454,14 @@ void LLPanelSettingsSkyCloudTab::onCloudCoverageChanged()
void LLPanelSettingsSkyCloudTab::onCloudScaleChanged()
{
if (!mSkySettings) return;
- mSkySettings->setCloudScale(getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCALE)->getValue().asReal());
+ mSkySettings->setCloudScale((F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCALE)->getValue().asReal());
setIsDirty();
}
void LLPanelSettingsSkyCloudTab::onCloudVarianceChanged()
{
if (!mSkySettings) return;
- mSkySettings->setCloudVariance(getChild<LLUICtrl>(FIELD_SKY_CLOUD_VARIANCE)->getValue().asReal());
+ mSkySettings->setCloudVariance((F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_VARIANCE)->getValue().asReal());
setIsDirty();
}
@@ -484,9 +484,9 @@ void LLPanelSettingsSkyCloudTab::onCloudMapChanged()
void LLPanelSettingsSkyCloudTab::onCloudDensityChanged()
{
if (!mSkySettings) return;
- LLColor3 density(getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_X)->getValue().asReal(),
- getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_Y)->getValue().asReal(),
- getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_D)->getValue().asReal());
+ LLColor3 density((F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_X)->getValue().asReal(),
+ (F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_Y)->getValue().asReal(),
+ (F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_D)->getValue().asReal());
mSkySettings->setCloudPosDensity1(density);
setIsDirty();
@@ -495,9 +495,9 @@ void LLPanelSettingsSkyCloudTab::onCloudDensityChanged()
void LLPanelSettingsSkyCloudTab::onCloudDetailChanged()
{
if (!mSkySettings) return;
- LLColor3 detail(getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_X)->getValue().asReal(),
- getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_Y)->getValue().asReal(),
- getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_D)->getValue().asReal());
+ LLColor3 detail((F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_X)->getValue().asReal(),
+ (F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_Y)->getValue().asReal(),
+ (F32)getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_D)->getValue().asReal());
mSkySettings->setCloudPosDensity2(detail);
setIsDirty();
@@ -626,7 +626,7 @@ void LLPanelSettingsSkySunMoonTab::onSunMoonColorChanged()
void LLPanelSettingsSkySunMoonTab::onGlowChanged()
{
if (!mSkySettings) return;
- LLColor3 glow(getChild<LLUICtrl>(FIELD_SKY_GLOW_SIZE)->getValue().asReal(), 0.0f, getChild<LLUICtrl>(FIELD_SKY_GLOW_FOCUS)->getValue().asReal());
+ LLColor3 glow((F32)getChild<LLUICtrl>(FIELD_SKY_GLOW_SIZE)->getValue().asReal(), 0.0f, (F32)getChild<LLUICtrl>(FIELD_SKY_GLOW_FOCUS)->getValue().asReal());
// takes 0 - 1.99 UI range -> 40 -> 0.2 range
glow.mV[0] = (2.0f - glow.mV[0]) * SLIDER_SCALE_GLOW_R;
@@ -640,7 +640,7 @@ void LLPanelSettingsSkySunMoonTab::onGlowChanged()
void LLPanelSettingsSkySunMoonTab::onStarBrightnessChanged()
{
if (!mSkySettings) return;
- mSkySettings->setStarBrightness(getChild<LLUICtrl>(FIELD_SKY_STAR_BRIGHTNESS)->getValue().asReal());
+ mSkySettings->setStarBrightness((F32)getChild<LLUICtrl>(FIELD_SKY_STAR_BRIGHTNESS)->getValue().asReal());
mSkySettings->update();
setIsDirty();
}
@@ -663,8 +663,8 @@ void LLPanelSettingsSkySunMoonTab::onSunRotationChanged()
void LLPanelSettingsSkySunMoonTab::onSunAzimElevChanged()
{
- F32 azimuth = getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->getValue().asReal();
- F32 elevation = getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->getValue().asReal();
+ F32 azimuth = (F32)getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->getValue().asReal();
+ F32 elevation = (F32)getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->getValue().asReal();
LLQuaternion quat;
azimuth *= DEG_TO_RAD;
@@ -693,7 +693,7 @@ void LLPanelSettingsSkySunMoonTab::onSunAzimElevChanged()
void LLPanelSettingsSkySunMoonTab::onSunScaleChanged()
{
if (!mSkySettings) return;
- mSkySettings->setSunScale((getChild<LLUICtrl>(FIELD_SKY_SUN_SCALE)->getValue().asReal()));
+ mSkySettings->setSunScale((F32)(getChild<LLUICtrl>(FIELD_SKY_SUN_SCALE)->getValue().asReal()));
mSkySettings->update();
setIsDirty();
}
@@ -725,8 +725,8 @@ void LLPanelSettingsSkySunMoonTab::onMoonRotationChanged()
void LLPanelSettingsSkySunMoonTab::onMoonAzimElevChanged()
{
- F32 azimuth = getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->getValue().asReal();
- F32 elevation = getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->getValue().asReal();
+ F32 azimuth = (F32)getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->getValue().asReal();
+ F32 elevation = (F32)getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->getValue().asReal();
LLQuaternion quat;
azimuth *= DEG_TO_RAD;
@@ -763,7 +763,7 @@ void LLPanelSettingsSkySunMoonTab::onMoonImageChanged()
void LLPanelSettingsSkySunMoonTab::onMoonScaleChanged()
{
if (!mSkySettings) return;
- mSkySettings->setMoonScale((getChild<LLUICtrl>(FIELD_SKY_MOON_SCALE)->getValue().asReal()));
+ mSkySettings->setMoonScale((F32)(getChild<LLUICtrl>(FIELD_SKY_MOON_SCALE)->getValue().asReal()));
mSkySettings->update();
setIsDirty();
}
@@ -771,7 +771,7 @@ void LLPanelSettingsSkySunMoonTab::onMoonScaleChanged()
void LLPanelSettingsSkySunMoonTab::onMoonBrightnessChanged()
{
if (!mSkySettings) return;
- mSkySettings->setMoonBrightness((getChild<LLUICtrl>(FIELD_SKY_MOON_BRIGHTNESS)->getValue().asReal()));
+ mSkySettings->setMoonBrightness((F32)(getChild<LLUICtrl>(FIELD_SKY_MOON_BRIGHTNESS)->getValue().asReal()));
mSkySettings->update();
setIsDirty();
}
@@ -851,24 +851,24 @@ void LLPanelSettingsSkyDensityTab::refresh()
LLSD mie_config = mSkySettings->getMieConfig();
LLSD absorption_config = mSkySettings->getAbsorptionConfig();
- F32 rayleigh_exponential_term = rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
- F32 rayleigh_exponential_scale = rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal();
- F32 rayleigh_linear_term = rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal();
- F32 rayleigh_constant_term = rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM].asReal();
- F32 rayleigh_max_alt = rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal();
-
- F32 mie_exponential_term = mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
- F32 mie_exponential_scale = mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal();
- F32 mie_linear_term = mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal();
- F32 mie_constant_term = mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM].asReal();
- F32 mie_aniso_factor = mie_config[LLSettingsSky::SETTING_MIE_ANISOTROPY_FACTOR].asReal();
- F32 mie_max_alt = mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal();
-
- F32 absorption_exponential_term = absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
- F32 absorption_exponential_scale = absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal();
- F32 absorption_linear_term = absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal();
- F32 absorption_constant_term = absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
- F32 absorption_max_alt = absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal();
+ F32 rayleigh_exponential_term = (F32)rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
+ F32 rayleigh_exponential_scale = (F32)rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal();
+ F32 rayleigh_linear_term = (F32)rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal();
+ F32 rayleigh_constant_term = (F32)rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM].asReal();
+ F32 rayleigh_max_alt = (F32)rayleigh_config[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal();
+
+ F32 mie_exponential_term = (F32)mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
+ F32 mie_exponential_scale = (F32)mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal();
+ F32 mie_linear_term = (F32)mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal();
+ F32 mie_constant_term = (F32)mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM].asReal();
+ F32 mie_aniso_factor = (F32)mie_config[LLSettingsSky::SETTING_MIE_ANISOTROPY_FACTOR].asReal();
+ F32 mie_max_alt = (F32)mie_config[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal();
+
+ F32 absorption_exponential_term = (F32)absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
+ F32 absorption_exponential_scale = (F32)absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal();
+ F32 absorption_linear_term = (F32)absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal();
+ F32 absorption_constant_term = (F32)absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal();
+ F32 absorption_max_alt = (F32)absorption_config[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal();
getChild<LLUICtrl>(FIELD_SKY_DENSITY_RAYLEIGH_EXPONENTIAL)->setValue(rayleigh_exponential_term);
getChild<LLUICtrl>(FIELD_SKY_DENSITY_RAYLEIGH_EXPONENTIAL_SCALE)->setValue(rayleigh_exponential_scale);
diff --git a/indra/newview/llpaneleditwater.cpp b/indra/newview/llpaneleditwater.cpp
index 236cb6b97c..174a416fb4 100644
--- a/indra/newview/llpaneleditwater.cpp
+++ b/indra/newview/llpaneleditwater.cpp
@@ -170,14 +170,14 @@ void LLPanelSettingsWaterMainTab::onFogColorChanged()
void LLPanelSettingsWaterMainTab::onFogDensityChanged()
{
if (!mWaterSettings) return;
- mWaterSettings->setWaterFogDensity(getChild<LLUICtrl>(FIELD_WATER_FOG_DENSITY)->getValue().asReal());
+ mWaterSettings->setWaterFogDensity((F32)getChild<LLUICtrl>(FIELD_WATER_FOG_DENSITY)->getValue().asReal());
setIsDirty();
}
void LLPanelSettingsWaterMainTab::onFogUnderWaterChanged()
{
if (!mWaterSettings) return;
- mWaterSettings->setFogMod(getChild<LLUICtrl>(FIELD_WATER_UNDERWATER_MOD)->getValue().asReal());
+ mWaterSettings->setFogMod((F32)getChild<LLUICtrl>(FIELD_WATER_UNDERWATER_MOD)->getValue().asReal());
setIsDirty();
}
@@ -210,7 +210,7 @@ void LLPanelSettingsWaterMainTab::onSmallWaveChanged()
void LLPanelSettingsWaterMainTab::onNormalScaleChanged()
{
if (!mWaterSettings) return;
- LLVector3 vect(getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_X)->getValue().asReal(), getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_Y)->getValue().asReal(), getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_Z)->getValue().asReal());
+ LLVector3 vect((F32)getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_X)->getValue().asReal(), (F32)getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_Y)->getValue().asReal(), (F32)getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_Z)->getValue().asReal());
mWaterSettings->setNormalScale(vect);
setIsDirty();
}
@@ -218,34 +218,34 @@ void LLPanelSettingsWaterMainTab::onNormalScaleChanged()
void LLPanelSettingsWaterMainTab::onFresnelScaleChanged()
{
if (!mWaterSettings) return;
- mWaterSettings->setFresnelScale(getChild<LLUICtrl>(FIELD_WATER_FRESNEL_SCALE)->getValue().asReal());
+ mWaterSettings->setFresnelScale((F32)getChild<LLUICtrl>(FIELD_WATER_FRESNEL_SCALE)->getValue().asReal());
setIsDirty();
}
void LLPanelSettingsWaterMainTab::onFresnelOffsetChanged()
{
if (!mWaterSettings) return;
- mWaterSettings->setFresnelOffset(getChild<LLUICtrl>(FIELD_WATER_FRESNEL_OFFSET)->getValue().asReal());
+ mWaterSettings->setFresnelOffset((F32)getChild<LLUICtrl>(FIELD_WATER_FRESNEL_OFFSET)->getValue().asReal());
setIsDirty();
}
void LLPanelSettingsWaterMainTab::onScaleAboveChanged()
{
if (!mWaterSettings) return;
- mWaterSettings->setScaleAbove(getChild<LLUICtrl>(FIELD_WATER_SCALE_ABOVE)->getValue().asReal());
+ mWaterSettings->setScaleAbove((F32)getChild<LLUICtrl>(FIELD_WATER_SCALE_ABOVE)->getValue().asReal());
setIsDirty();
}
void LLPanelSettingsWaterMainTab::onScaleBelowChanged()
{
if (!mWaterSettings) return;
- mWaterSettings->setScaleBelow(getChild<LLUICtrl>(FIELD_WATER_SCALE_BELOW)->getValue().asReal());
+ mWaterSettings->setScaleBelow((F32)getChild<LLUICtrl>(FIELD_WATER_SCALE_BELOW)->getValue().asReal());
setIsDirty();
}
void LLPanelSettingsWaterMainTab::onBlurMultipChanged()
{
if (!mWaterSettings) return;
- mWaterSettings->setBlurMultiplier(getChild<LLUICtrl>(FIELD_WATER_BLUR_MULTIP)->getValue().asReal());
+ mWaterSettings->setBlurMultiplier((F32)getChild<LLUICtrl>(FIELD_WATER_BLUR_MULTIP)->getValue().asReal());
setIsDirty();
}
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index a14f1d54a2..282b6d4a0a 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -48,6 +48,7 @@
#include "llscrollingpanelparam.h"
#include "llradiogroup.h"
#include "llnotificationsutil.h"
+#include "lliconctrl.h"
#include "llcolorswatch.h"
#include "lltexturectrl.h"
@@ -299,16 +300,16 @@ LLEditWearableDictionary::Subparts::Subparts()
addEntry(SUBPART_UNDERSHIRT, new SubpartEntry(SUBPART_UNDERSHIRT, "mTorso", "undershirt", "undershirt_main_param_list", "undershirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
addEntry(SUBPART_SKIRT, new SubpartEntry(SUBPART_SKIRT, "mPelvis", "skirt", "skirt_main_param_list", "skirt_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
- addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
- addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
- addEntry(SUBPART_UNIVERSAL, new SubpartEntry(SUBPART_UNIVERSAL, "mPelvis", "universal", "universal_main_param_list", "universal_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f), SEX_BOTH));
+ addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "", "", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+ addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "", "", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+ addEntry(SUBPART_UNIVERSAL, new SubpartEntry(SUBPART_UNIVERSAL, "mPelvis", "universal", "", "", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f), SEX_BOTH));
// WT_PHYSICS
addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f), SEX_FEMALE));
addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
addEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, "mTorso", "physics_breasts_leftright", "physics_breasts_leftright_param_list", "physics_breasts_leftright_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
- addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
- addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
+ addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
+ addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
addEntry(SUBPART_PHYSICS_ADVANCED, new SubpartEntry(SUBPART_PHYSICS_ADVANCED, "mTorso", "physics_advanced", "physics_advanced_param_list", "physics_advanced_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
}
@@ -727,8 +728,14 @@ bool LLPanelEditWearable::postBuild()
mPanelTitle = getChild<LLTextBox>("edit_wearable_title");
mDescTitle = getChild<LLTextBox>("description_text");
- getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this));
- getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));
+ mSexRadio = getChild<LLRadioGroup>("sex_radio");
+ mSexRadio->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this));
+
+ mMaleIcon = getChild<LLIconCtrl>("male_icon");
+ mFemaleIcon = getChild<LLIconCtrl>("female_icon");
+
+ mBtnSaveAs = getChild<LLButton>("save_as_button");
+ mBtnSaveAs->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));
// The following panels will be shown/hidden based on what wearable we're editing
// body parts
@@ -794,16 +801,32 @@ bool LLPanelEditWearable::postBuild()
continue;
}
- const std::string accordion_tab = subpart_entry->mAccordionTab;
- LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+ const std::string& accordion_tab = subpart_entry->mAccordionTab;
+ if (accordion_tab.empty())
+ {
+ continue;
+ }
+ LLAccordionCtrlTab *tab = findChild<LLAccordionCtrlTab>(accordion_tab);
if (!tab)
{
LL_WARNS() << "could not get llaccordionctrltab from UI with name: " << accordion_tab << LL_ENDL;
continue;
}
+ mAccordionTabs.emplace(accordion_tab, tab);
+
// initialize callback to ensure camera view changes appropriately.
tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index));
+
+ const std::string& scrolling_panel = subpart_entry->mParamList;
+ if (!scrolling_panel.empty())
+ {
+ LLScrollingPanelList* panel_list = tab->findChild<LLScrollingPanelList>(scrolling_panel);
+ if (panel_list)
+ {
+ mParamPanels.emplace(scrolling_panel, panel_list);
+ }
+ }
}
// initialize texture and color picker controls
@@ -1199,23 +1222,29 @@ void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, bool show, bo
continue;
}
- const std::string scrolling_panel = subpart_entry->mParamList;
- const std::string accordion_tab = subpart_entry->mAccordionTab;
+ const std::string& scrolling_panel = subpart_entry->mParamList;
+ const std::string& accordion_tab = subpart_entry->mAccordionTab;
- LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
- LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+ if (scrolling_panel.empty() || accordion_tab.empty())
+ {
+ continue;
+ }
- if (!panel_list)
+ auto accord_it = mAccordionTabs.find(accordion_tab);
+ if (accord_it == mAccordionTabs.end())
{
- LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;
- continue;
+ LL_WARNS() << "could not get llaccordionctrltab from UI with name: " << accordion_tab << LL_ENDL;
+ continue;
}
+ LLAccordionCtrlTab* tab = accord_it->second;
- if (!tab)
+ auto panel_it = mParamPanels.find(scrolling_panel);
+ if (panel_it == mParamPanels.end())
{
- LL_WARNS() << "could not get llaccordionctrltab from UI with name: " << accordion_tab << LL_ENDL;
- continue;
+ LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;
+ continue;
}
+ LLScrollingPanelList *panel_list = panel_it->second;
// Don't show female subparts if you're not female, etc.
if (!(gAgentAvatarp->getSex() & subpart_entry->mSex))
@@ -1229,7 +1258,7 @@ void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, bool show, bo
}
// what edit group do we want to extract params for?
- const std::string edit_group = subpart_entry->mEditGroup;
+ const std::string& edit_group = subpart_entry->mEditGroup;
// storage for ordered list of visual params
value_map_t sorted_params;
@@ -1329,9 +1358,9 @@ void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type)
// Toggle controls specific to shape editing panel.
{
bool is_shape = (type == LLWearableType::WT_SHAPE);
- getChildView("sex_radio")->setVisible( is_shape);
- getChildView("female_icon")->setVisible( is_shape);
- getChildView("male_icon")->setVisible( is_shape);
+ mSexRadio->setVisible(is_shape);
+ mFemaleIcon->setVisible(is_shape);
+ mMaleIcon->setVisible(is_shape);
}
}
@@ -1392,15 +1421,15 @@ void LLPanelEditWearable::updateScrollingPanelUI()
ESubpart subpart_e = wearable_entry->mSubparts[index];
const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
- const std::string scrolling_panel = subpart_entry->mParamList;
+ const std::string& scrolling_panel = subpart_entry->mParamList;
- LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
-
- if (!panel_list)
+ auto panel_it = mParamPanels.find(scrolling_panel);
+ if (panel_it == mParamPanels.end())
{
- LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;
- continue;
+ LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;
+ continue;
}
+ LLScrollingPanelList* panel_list = panel_it->second;
panel_list->updatePanels(true);
}
@@ -1534,7 +1563,7 @@ void LLPanelEditWearable::updateVerbs()
bool is_dirty = isDirty();
mBtnRevert->setEnabled(is_dirty);
- getChildView("save_as_button")->setEnabled(is_dirty && can_copy);
+ mBtnSaveAs->setEnabled(is_dirty && can_copy);
if (isAgentAvatarValid())
{
@@ -1572,7 +1601,7 @@ void LLPanelEditWearable::configureAlphaCheckbox(LLAvatarAppearanceDefines::ETex
LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name);
checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te));
- mAlphaCheckbox2Index[name] = te;
+ mAlphaCheckbox2Index.push_back(std::make_pair(checkbox,te));
}
void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLAvatarAppearanceDefines::ETextureIndex te)
@@ -1629,11 +1658,10 @@ void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LL
void LLPanelEditWearable::updateAlphaCheckboxes()
{
- for (string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin();
- iter != mAlphaCheckbox2Index.end(); ++iter )
+ for (const auto& check_pair : mAlphaCheckbox2Index)
{
- LLAvatarAppearanceDefines::ETextureIndex te = (LLAvatarAppearanceDefines::ETextureIndex)iter->second;
- LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first);
+ LLAvatarAppearanceDefines::ETextureIndex te = (LLAvatarAppearanceDefines::ETextureIndex)check_pair.second;
+ LLCheckBoxCtrl* ctrl = check_pair.first;
if (ctrl)
{
ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr));
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index aa4ac915c7..443b52b8fc 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -44,6 +44,8 @@ class LLViewerJointMesh;
class LLAccordionCtrlTab;
class LLJoint;
class LLLineEditor;
+class LLRadioGroup;
+class LLIconCtrl;
class LLPanelEditWearable : public LLPanel
{
@@ -123,6 +125,7 @@ private:
LLViewerInventoryItem* mWearableItem;
// these are constant no matter what wearable we're editing
+ LLButton* mBtnSaveAs;
LLButton *mBtnRevert;
LLButton *mBtnBack;
std::string mBackBtnLabel;
@@ -131,6 +134,9 @@ private:
LLTextBox *mDescTitle;
LLTextBox *mTxtAvatarHeight;
+ LLRadioGroup* mSexRadio = nullptr;
+ LLIconCtrl* mMaleIcon = nullptr;
+ LLIconCtrl* mFemaleIcon = nullptr;
// localized and parameterized strings that used to build avatar_height_label
std::string mMeters;
@@ -170,8 +176,11 @@ private:
LLPanel *mPanelUniversal;
LLPanel *mPanelPhysics;
- typedef std::map<std::string, LLAvatarAppearanceDefines::ETextureIndex> string_texture_index_map_t;
- string_texture_index_map_t mAlphaCheckbox2Index;
+ std::unordered_map<std::string, LLAccordionCtrlTab*> mAccordionTabs;
+ std::unordered_map<std::string, LLScrollingPanelList*> mParamPanels;
+
+ typedef std::vector<std::pair<LLCheckBoxCtrl*, LLAvatarAppearanceDefines::ETextureIndex>> checkbox_texture_index_vec_t;
+ checkbox_texture_index_vec_t mAlphaCheckbox2Index;
typedef std::map<LLAvatarAppearanceDefines::ETextureIndex, LLUUID> s32_uuid_map_t;
s32_uuid_map_t mPreviousAlphaTexture;
diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp
index 3faa01ae0c..cb89a5910e 100644
--- a/indra/newview/llpanelemojicomplete.cpp
+++ b/indra/newview/llpanelemojicomplete.cpp
@@ -110,8 +110,8 @@ void LLPanelEmojiComplete::draw()
F32 iconCenterX = mRenderRect.mLeft + (F32)mEmojiWidth / 2;
F32 iconCenterY = mRenderRect.mTop - (F32)mEmojiHeight / 2;
- F32 textLeft = mVertical ? mRenderRect.mLeft + mEmojiWidth + mPadding : 0;
- F32 textWidth = mVertical ? getRect().getWidth() - textLeft - mPadding : 0;
+ F32 textLeft = mVertical ? (F32)(mRenderRect.mLeft + mEmojiWidth + mPadding) : 0.f;
+ F32 textWidth = mVertical ? (F32)(getRect().getWidth() - textLeft - mPadding) : 0.f;
for (size_t curIdx = firstVisibleIdx; curIdx < lastVisibleIdx; curIdx++)
{
@@ -129,7 +129,7 @@ void LLPanelEmojiComplete::draw()
std::string text = shortCode.substr(0, mEmojis[curIdx].Begin);
mTextFont->renderUTF8(text, 0, x0, iconCenterY, LLColor4::white,
LLFontGL::LEFT, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- static_cast<S32>(text.size()), x1);
+ static_cast<S32>(text.size()), (S32)x1);
x0 += mTextFont->getWidthF32(text);
x1 = textLeft + textWidth - x0;
}
@@ -138,7 +138,7 @@ void LLPanelEmojiComplete::draw()
std::string text = shortCode.substr(mEmojis[curIdx].Begin, mEmojis[curIdx].End - mEmojis[curIdx].Begin);
mTextFont->renderUTF8(text, 0, x0, iconCenterY, LLColor4::yellow6,
LLFontGL::LEFT, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- static_cast<S32>(text.size()), x1);
+ static_cast<S32>(text.size()), (S32)x1);
x0 += mTextFont->getWidthF32(text);
x1 = textLeft + textWidth - x0;
}
@@ -147,7 +147,7 @@ void LLPanelEmojiComplete::draw()
std::string text = shortCode.substr(mEmojis[curIdx].End);
mTextFont->renderUTF8(text, 0, x0, iconCenterY, LLColor4::white,
LLFontGL::LEFT, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- static_cast<S32>(text.size()), x1);
+ static_cast<S32>(text.size()), (S32)x1);
}
iconCenterY -= mEmojiHeight;
}
@@ -163,7 +163,7 @@ bool LLPanelEmojiComplete::handleHover(S32 x, S32 y, MASK mask)
if (mScrollbar && mScrollbar->getVisible() && childrenHandleHover(x, y, mask))
return true;
- LLVector2 curHover(x, y);
+ LLVector2 curHover((F32)x, (F32)y);
if ((mLastHover - curHover).lengthSquared() > MIN_MOUSE_MOVE_DELTA)
{
size_t index = posToIndex(x, y);
@@ -235,7 +235,7 @@ bool LLPanelEmojiComplete::handleMouseDown(S32 x, S32 y, MASK mask)
return true;
mCurSelected = posToIndex(x, y);
- mLastHover = LLVector2(x, y);
+ mLastHover = LLVector2((F32)x, (F32)y);
return true;
}
@@ -438,7 +438,7 @@ void LLPanelEmojiComplete::updateConstraints()
{
mRenderRect = getLocalRect();
- mEmojiWidth = mIconFont->getWidthF32(u8"\U0001F431") + mPadding * 2;
+ mEmojiWidth = (U16)(mIconFont->getWidthF32(u8"\U0001F431") + mPadding * 2);
if (mVertical)
{
mEmojiHeight = mIconFont->getLineHeight() + mPadding * 2;
@@ -481,7 +481,7 @@ void LLPanelEmojiComplete::updateScrollPos()
}
else
{
- mScrollPos = mCurSelected - ((float)mCurSelected / (mTotalEmojis - 2) * (mVisibleEmojis - 2));
+ mScrollPos = (size_t)(mCurSelected - ((float)mCurSelected / (mTotalEmojis - 2) * (mVisibleEmojis - 2)));
}
if (mScrollbar && mScrollbar->getVisible())
diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp
index 43612865fc..51e2c05070 100644
--- a/indra/newview/llpanelenvironment.cpp
+++ b/indra/newview/llpanelenvironment.cpp
@@ -41,6 +41,7 @@
#include "llfloater.h"
#include "llfloaterreg.h"
#include "llfloatereditextdaycycle.h"
+#include "lliconctrl.h"
#include "llmultisliderctrl.h"
#include "llnotificationsutil.h"
#include "llsettingsvo.h"
@@ -109,10 +110,7 @@ const U32 LLPanelEnvironmentInfo::DIRTY_FLAG_MASK(
LLPanelEnvironmentInfo::DIRTY_FLAG_DAYOFFSET |
LLPanelEnvironmentInfo::DIRTY_FLAG_ALTITUDES);
-const U32 ALTITUDE_SLIDER_COUNT = 3;
const F32 ALTITUDE_DEFAULT_HEIGHT_STEP = 1000;
-const U32 ALTITUDE_MARKERS_COUNT = 3;
-const U32 ALTITUDE_PREFIXERS_COUNT = 5;
const std::string slider_marker_base = "mark";
@@ -167,24 +165,61 @@ LLPanelEnvironmentInfo::~LLPanelEnvironmentInfo()
bool LLPanelEnvironmentInfo::postBuild()
{
+ mIconGround = getChild<LLIconCtrl>(ICN_GROUND);
+ mIconWater = getChild<LLIconCtrl>(ICN_WATER);
- getChild<LLUICtrl>(BTN_USEDEFAULT)->setCommitCallback([this](LLUICtrl *, const LLSD &){ onBtnDefault(); });
- getChild<LLUICtrl>(BTN_SELECTINV)->setCommitCallback([this](LLUICtrl *, const LLSD &){ onBtnSelect(); });
- getChild<LLUICtrl>(BTN_EDIT)->setCommitCallback([this](LLUICtrl *, const LLSD &){ onBtnEdit(); });
- getChild<LLUICtrl>(BTN_RST_ALTITUDES)->setCommitCallback([this](LLUICtrl *, const LLSD &){ onBtnRstAltitudes(); });
+ mPanelEnvAltitudes = getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES);
+ mPanelEnvConfig = getChild<LLUICtrl>(PNL_SETTINGS);
+ mPanelEnvButtons = getChild <LLUICtrl>(PNL_BUTTONS);
+ mPanelEnvDisabled = getChild<LLUICtrl>(PNL_DISABLED);
+ mPanelEnvRegionMsg = getChild<LLUICtrl>(PNL_REGION_MSG);
- getChild<LLUICtrl>(SLD_DAYLENGTH)->setCommitCallback([this](LLUICtrl *, const LLSD &value) { onSldDayLengthChanged(value.asReal()); });
- getChild<LLSliderCtrl>(SLD_DAYLENGTH)->setSliderMouseUpCallback([this](LLUICtrl *, const LLSD &) { onDayLenOffsetMouseUp(); });
- getChild<LLSliderCtrl>(SLD_DAYLENGTH)->setSliderEditorCommitCallback([this](LLUICtrl *, const LLSD &) { onDayLenOffsetMouseUp(); });
- getChild<LLUICtrl>(SLD_DAYOFFSET)->setCommitCallback([this](LLUICtrl *, const LLSD &value) { onSldDayOffsetChanged(value.asReal()); });
- getChild<LLSliderCtrl>(SLD_DAYOFFSET)->setSliderMouseUpCallback([this](LLUICtrl *, const LLSD &) { onDayLenOffsetMouseUp(); });
- getChild<LLSliderCtrl>(SLD_DAYOFFSET)->setSliderEditorCommitCallback([this](LLUICtrl *, const LLSD &) { onDayLenOffsetMouseUp(); });
+ mEnvironmentDisabledText = getChild<LLTextBox>(TXT_DISABLED);
+ mLabelApparentTime = getChild<LLTextBox>(LBL_TIMEOFDAY);
- getChild<LLMultiSliderCtrl>(SLD_ALTITUDES)->setCommitCallback([this](LLUICtrl *cntrl, const LLSD &value) { onAltSliderCallback(cntrl, value); });
- getChild<LLMultiSliderCtrl>(SLD_ALTITUDES)->setSliderMouseUpCallback([this](LLUICtrl *, const LLSD &) { onAltSliderMouseUp(); });
+ mBtnUseDefault = getChild<LLButton>(BTN_USEDEFAULT);
+ mBtnUseDefault->setCommitCallback([this](LLUICtrl *, const LLSD &){ onBtnDefault(); });
+
+ mBtnSelectInv = getChild<LLButton>(BTN_SELECTINV);
+ mBtnSelectInv->setCommitCallback([this](LLUICtrl *, const LLSD &){ onBtnSelect(); });
+
+ mBtnEdit = getChild<LLButton>(BTN_EDIT);
+ mBtnEdit->setCommitCallback([this](LLUICtrl *, const LLSD &){ onBtnEdit(); });
+
+ mBtnResetAltitudes = getChild<LLButton>(BTN_RST_ALTITUDES);
+ mBtnResetAltitudes->setCommitCallback([this](LLUICtrl *, const LLSD &){ onBtnRstAltitudes(); });
+
+ mCheckAllowOverride = getChild<LLCheckBoxCtrl>(CHK_ALLOWOVERRIDE);
+
+ mSliderDayLength = getChild<LLSliderCtrl>(SLD_DAYLENGTH);
+ mSliderDayLength->setCommitCallback([this](LLUICtrl *, const LLSD &value) { onSldDayLengthChanged((F32)value.asReal()); });
+ mSliderDayLength->setSliderMouseUpCallback([this](LLUICtrl *, const LLSD &) { onDayLenOffsetMouseUp(); });
+ mSliderDayLength->setSliderEditorCommitCallback([this](LLUICtrl *, const LLSD &) { onDayLenOffsetMouseUp(); });
+
+ mSliderDayOffset = getChild<LLSliderCtrl>(SLD_DAYOFFSET);
+ mSliderDayOffset->setCommitCallback([this](LLUICtrl *, const LLSD &value) { onSldDayOffsetChanged((F32)value.asReal()); });
+ mSliderDayOffset->setSliderMouseUpCallback([this](LLUICtrl *, const LLSD &) { onDayLenOffsetMouseUp(); });
+ mSliderDayOffset->setSliderEditorCommitCallback([this](LLUICtrl *, const LLSD &) { onDayLenOffsetMouseUp(); });
+
+ mMultiSliderAltitudes = getChild<LLMultiSliderCtrl>(SLD_ALTITUDES);
+ mMultiSliderAltitudes->setCommitCallback([this](LLUICtrl *cntrl, const LLSD &value) { onAltSliderCallback(cntrl, value); });
+ mMultiSliderAltitudes->setSliderMouseUpCallback([this](LLUICtrl *, const LLSD &) { onAltSliderMouseUp(); });
mChangeMonitor = LLEnvironment::instance().setEnvironmentChanged([this](LLEnvironment::EnvSelection_t env, S32 version) { onEnvironmentChanged(env, version); });
+ for (U32 idx = 0; idx < ALTITUDE_MARKERS_COUNT; idx++)
+ {
+ mAltitudeMarkers[idx] = findChild<LLUICtrl>(slider_marker_base + llformat("%u", idx));
+ }
+
+ for (U32 idx = 0; idx < ALTITUDE_PREFIXERS_COUNT; idx++)
+ {
+ mAltitudeDropTarget[idx] = findChild<LLSettingsDropTarget>("sdt_" + alt_prefixes[idx]);
+ mAltitudeLabels[idx] = findChild<LLTextBox>("txt_" + alt_prefixes[idx]);
+ mAltitudeEditor[idx] = findChild<LLLineEditor>("edt_invname_" + alt_prefixes[idx]);
+ mAltitudePanels[idx] = findChild<LLView>("pnl_" + alt_prefixes[idx]);
+ }
+
for (U32 idx = 0; idx < ALTITUDE_SLIDER_COUNT; idx++)
{
LLSettingsDropTarget* drop_target = findChild<LLSettingsDropTarget>("sdt_" + alt_prefixes[idx]);
@@ -192,11 +227,12 @@ bool LLPanelEnvironmentInfo::postBuild()
{
drop_target->setPanel(this, alt_sliders[idx]);
}
+
// set initial values to prevent [ALTITUDE] from displaying
- updateAltLabel(alt_prefixes[idx], idx + 2, idx * 1000);
+ updateAltLabel(idx, idx + 2, (F32)(idx * 1000));
}
- getChild<LLSettingsDropTarget>("sdt_" + alt_prefixes[3])->setPanel(this, alt_prefixes[3]);
- getChild<LLSettingsDropTarget>("sdt_" + alt_prefixes[4])->setPanel(this, alt_prefixes[4]);
+ mAltitudeDropTarget[3]->setPanel(this, alt_prefixes[3]);
+ mAltitudeDropTarget[4]->setPanel(this, alt_prefixes[4]);
return true;
}
@@ -262,8 +298,8 @@ void LLPanelEnvironmentInfo::refresh()
if (dayoffset.value() > 12.0f)
dayoffset -= F32Hours(24.0);
- getChild<LLSliderCtrl>(SLD_DAYLENGTH)->setValue(daylength.value());
- getChild<LLSliderCtrl>(SLD_DAYOFFSET)->setValue(dayoffset.value());
+ mSliderDayLength->setValue(daylength.value());
+ mSliderDayOffset->setValue(dayoffset.value());
udpateApparentTimeOfDay();
@@ -273,59 +309,58 @@ void LLPanelEnvironmentInfo::refresh()
if (altitudes.size() > 0)
{
- LLMultiSliderCtrl *sld = getChild<LLMultiSliderCtrl>(SLD_ALTITUDES);
- sld->clear();
+ mMultiSliderAltitudes->clear();
for (S32 idx = 0; idx < ALTITUDE_SLIDER_COUNT; ++idx)
{
// make sure values are in range, server is supposed to validate them,
// but issues happen, try to fix values in such case
- F32 altitude = llclamp(altitudes[idx + 1], sld->getMinValue(), sld->getMaxValue());
- bool res = sld->addSlider(altitude, alt_sliders[idx]);
+ F32 altitude = llclamp(altitudes[idx + 1], mMultiSliderAltitudes->getMinValue(), mMultiSliderAltitudes->getMaxValue());
+ bool res = mMultiSliderAltitudes->addSlider(altitude, alt_sliders[idx]);
if (!res)
{
LL_WARNS_ONCE("ENVPANEL") << "Failed to validate altitude from server for parcel id" << getParcelId() << LL_ENDL;
// Find a spot to insert altitude.
// Assuming everything alright with slider, we should find new place in 11 steps top (step 25m, no overlap 100m)
- F32 alt_step = (altitude > (sld->getMaxValue() / 2)) ? -sld->getIncrement() : sld->getIncrement();
+ F32 alt_step = (altitude > (mMultiSliderAltitudes->getMaxValue() / 2)) ? -mMultiSliderAltitudes->getIncrement() : mMultiSliderAltitudes->getIncrement();
for (U32 i = 0; i < 30; i++)
{
altitude += alt_step;
- if (altitude > sld->getMaxValue())
+ if (altitude > mMultiSliderAltitudes->getMaxValue())
{
- altitude = sld->getMinValue();
+ altitude = mMultiSliderAltitudes->getMinValue();
}
- else if (altitude < sld->getMinValue())
+ else if (altitude < mMultiSliderAltitudes->getMinValue())
{
- altitude = sld->getMaxValue();
+ altitude = mMultiSliderAltitudes->getMaxValue();
}
- res = sld->addSlider(altitude, alt_sliders[idx]);
+ res = mMultiSliderAltitudes->addSlider(altitude, alt_sliders[idx]);
if (res) break;
}
}
if (res)
{
// slider has some auto correction that might have kicked in
- altitude = sld->getSliderValue(alt_sliders[idx]);
+ altitude = mMultiSliderAltitudes->getSliderValue(alt_sliders[idx]);
}
else
{
// Something is very very wrong
LL_WARNS_ONCE("ENVPANEL") << "Failed to set up altitudes for parcel id " << getParcelId() << LL_ENDL;
}
- updateAltLabel(alt_prefixes[idx], idx + 2, altitude);
+ updateAltLabel(idx, idx + 2, altitude);
mAltitudes[alt_sliders[idx]] = AltitudeData(idx + 2, idx, altitude);
}
- if (sld->getCurNumSliders() != ALTITUDE_SLIDER_COUNT)
+ if (mMultiSliderAltitudes->getCurNumSliders() != ALTITUDE_SLIDER_COUNT)
{
LL_WARNS("ENVPANEL") << "Failed to add altitude sliders!" << LL_ENDL;
}
readjustAltLabels();
- sld->resetCurSlider();
+ mMultiSliderAltitudes->resetCurSlider();
}
- updateAltLabel(alt_prefixes[3], 1, 0); // ground
- updateAltLabel(alt_prefixes[4], 0, 0); // water
+ updateAltLabel(3, 1, 0); // ground
+ updateAltLabel(4, 0, 0); // water
}
@@ -455,77 +490,75 @@ bool LLPanelEnvironmentInfo::setControlsEnabled(bool enabled)
if (mNoEnvironment || (!LLEnvironment::instance().isExtendedEnvironmentEnabled() && !isRegion()))
{
is_unavailable = true;
- getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_LEGACY));
+ mEnvironmentDisabledText->setText(getString(STR_LEGACY));
}
else if (mNoSelection)
{
is_unavailable = true;
- getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_NO_PARCEL));
+ mEnvironmentDisabledText->setText(getString(STR_NO_PARCEL));
}
else if (mCrossRegion)
{
is_unavailable = true;
- getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_CROSS_REGION));
+ mEnvironmentDisabledText->setText(getString(STR_CROSS_REGION));
}
else if (!isRegion() && !mAllowOverride)
{
is_unavailable = true;
- getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_DISALLOWED));
+ mEnvironmentDisabledText->setText(getString(STR_DISALLOWED));
}
else if (!is_bigenough)
{
is_unavailable = true;
- getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_TOO_SMALL));
+ mEnvironmentDisabledText->setText(getString(STR_TOO_SMALL));
}
if (is_unavailable)
{
- getChild<LLUICtrl>(PNL_SETTINGS)->setVisible(false);
- getChild<LLUICtrl>(PNL_BUTTONS)->setVisible(false);
- getChild<LLUICtrl>(PNL_DISABLED)->setVisible(true);
- getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(false);
- getChild<LLUICtrl>(PNL_REGION_MSG)->setVisible(false);
+ mPanelEnvConfig->setVisible(false);
+ mPanelEnvButtons->setVisible(false);
+ mPanelEnvDisabled->setVisible(true);
+ mPanelEnvAltitudes->setVisible(false);
+ mPanelEnvRegionMsg->setVisible(false);
updateEditFloater(mCurrentEnvironment, false);
return false;
}
- getChild<LLUICtrl>(PNL_SETTINGS)->setVisible(true);
- getChild<LLUICtrl>(PNL_BUTTONS)->setVisible(true);
- getChild<LLUICtrl>(PNL_DISABLED)->setVisible(false);
- getChild<LLUICtrl>(PNL_REGION_MSG)->setVisible(isRegion());
+ mPanelEnvConfig->setVisible(true);
+ mPanelEnvButtons->setVisible(true);
+ mPanelEnvDisabled->setVisible(false);
+ mPanelEnvRegionMsg->setVisible(isRegion());
- getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(LLEnvironment::instance().isExtendedEnvironmentEnabled());
- getChild<LLUICtrl>(BTN_RST_ALTITUDES)->setVisible(isRegion());
+ mPanelEnvAltitudes->setVisible(LLEnvironment::instance().isExtendedEnvironmentEnabled());
+ mBtnResetAltitudes->setVisible(isRegion());
bool can_enable = enabled && !is_legacy && mCurrentEnvironment && (mCurEnvVersion != INVALID_PARCEL_ENVIRONMENT_VERSION);
- getChild<LLUICtrl>(BTN_SELECTINV)->setEnabled(can_enable);
- getChild<LLUICtrl>(BTN_USEDEFAULT)->setEnabled(can_enable);
- getChild<LLUICtrl>(BTN_EDIT)->setEnabled(can_enable);
- getChild<LLUICtrl>(SLD_DAYLENGTH)->setEnabled(can_enable);
- getChild<LLUICtrl>(SLD_DAYOFFSET)->setEnabled(can_enable);
- getChild<LLUICtrl>(SLD_ALTITUDES)->setEnabled(can_enable && isRegion());
- getChild<LLUICtrl>(ICN_GROUND)->setColor((can_enable && isRegion()) ? LLColor4::white : LLColor4::grey % 0.8f);
- getChild<LLUICtrl>(ICN_WATER)->setColor((can_enable && isRegion()) ? LLColor4::white : LLColor4::grey % 0.8f);
- getChild<LLUICtrl>(BTN_RST_ALTITUDES)->setEnabled(can_enable && isRegion());
- getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setEnabled(can_enable);
- getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setEnabled(can_enable && isRegion());
+ mBtnSelectInv->setEnabled(can_enable);
+ mBtnUseDefault->setEnabled(can_enable);
+ mBtnEdit->setEnabled(can_enable);
+ mSliderDayLength->setEnabled(can_enable);
+ mSliderDayOffset->setEnabled(can_enable);
+ mMultiSliderAltitudes->setEnabled(can_enable && isRegion());
+ mIconGround->setColor((can_enable && isRegion()) ? LLColor4::white : LLColor4::grey % 0.8f);
+ mIconWater->setColor((can_enable && isRegion()) ? LLColor4::white : LLColor4::grey % 0.8f);
+ mBtnResetAltitudes->setEnabled(can_enable && isRegion());
+ mPanelEnvAltitudes->setEnabled(can_enable);
+ mCheckAllowOverride->setEnabled(can_enable && isRegion());
for (U32 idx = 0; idx < ALTITUDE_MARKERS_COUNT; idx++)
{
- LLUICtrl* marker = findChild<LLUICtrl>(slider_marker_base + llformat("%u", idx));
- if (marker)
+ if (mAltitudeMarkers[idx])
{
static LLColor4 marker_color(0.75f, 0.75f, 0.75f, 1.f);
- marker->setColor((can_enable && isRegion()) ? marker_color : marker_color % 0.3f);
+ mAltitudeMarkers[idx]->setColor((can_enable && isRegion()) ? marker_color : marker_color % 0.3f);
}
}
for (U32 idx = 0; idx < ALTITUDE_PREFIXERS_COUNT; idx++)
{
- LLSettingsDropTarget* drop_target = findChild<LLSettingsDropTarget>("sdt_" + alt_prefixes[idx]);
- if (drop_target)
+ if (mAltitudeDropTarget[idx])
{
- drop_target->setDndEnabled(can_enable);
+ mAltitudeDropTarget[idx]->setDndEnabled(can_enable);
}
}
@@ -542,24 +575,18 @@ void LLPanelEnvironmentInfo::clearDirtyFlag(U32 flag)
mDirtyFlag &= ~flag;
}
-void LLPanelEnvironmentInfo::updateAltLabel(const std::string &alt_prefix, U32 sky_index, F32 alt_value)
+void LLPanelEnvironmentInfo::updateAltLabel(U32 alt_index, U32 sky_index, F32 alt_value)
{
- LLMultiSliderCtrl *sld = findChild<LLMultiSliderCtrl>(SLD_ALTITUDES);
- if (!sld)
- {
- LL_WARNS() << "Failed to find slider " << SLD_ALTITUDES << LL_ENDL;
- return;
- }
- LLRect sld_rect = sld->getRect();
+ LLRect sld_rect = mMultiSliderAltitudes->getRect();
S32 sld_range = sld_rect.getHeight();
S32 sld_bottom = sld_rect.mBottom;
S32 sld_offset = sld_rect.getWidth(); // Roughly identical to thumb's width in slider.
- S32 pos = (sld_range - sld_offset) * ((alt_value - 100) / (4000 - 100));
+ S32 pos = (S32)((sld_range - sld_offset) * ((alt_value - 100) / (4000 - 100)));
// get related views
- LLTextBox* text = findChild<LLTextBox>("txt_" + alt_prefix);
- LLLineEditor *field = findChild<LLLineEditor>("edt_invname_" + alt_prefix);
- LLView *alt_panel = findChild<LLView>("pnl_" + alt_prefix);
+ LLTextBox* text = mAltitudeLabels[alt_index];
+ LLLineEditor* field = mAltitudeEditor[alt_index];
+ LLView* alt_panel = mAltitudePanels[alt_index];
if (text && (sky_index > 1))
{
@@ -596,19 +623,16 @@ void LLPanelEnvironmentInfo::readjustAltLabels()
// Very simple "adjust after the fact" method
// Note: labels can be in any order
- LLMultiSliderCtrl *sld = findChild<LLMultiSliderCtrl>(SLD_ALTITUDES);
- if (!sld) return;
-
LLView* view_midle = NULL;
U32 midle_ind = 0;
S32 shift_up = 0;
S32 shift_down = 0;
- LLRect sld_rect = sld->getRect();
+ LLRect sld_rect = mMultiSliderAltitudes->getRect();
// Find the middle one
for (U32 i = 0; i < ALTITUDE_SLIDER_COUNT; i++)
{
- LLView* cmp_view = findChild<LLView>(alt_panels[i], true);
+ LLView* cmp_view = mAltitudePanels[i];
if (!cmp_view) return;
LLRect cmp_rect = cmp_view->getRect();
S32 pos = 0;
@@ -619,7 +643,7 @@ void LLPanelEnvironmentInfo::readjustAltLabels()
{
if (i != j)
{
- LLView* intr_view = findChild<LLView>(alt_panels[j], true);
+ LLView* intr_view = mAltitudePanels[j];
if (!intr_view) return;
LLRect intr_rect = intr_view->getRect();
if (cmp_rect.mBottom >= intr_rect.mBottom)
@@ -647,15 +671,15 @@ void LLPanelEnvironmentInfo::readjustAltLabels()
// Account for edges
LLRect midle_rect = view_midle->getRect();
F32 factor = 0.5f;
- S32 edge_zone_height = midle_rect.getHeight() * 1.5f;
+ S32 edge_zone_height = (S32)(midle_rect.getHeight() * 1.5f);
if (midle_rect.mBottom - sld_rect.mBottom < edge_zone_height)
{
- factor = 1 - ((midle_rect.mBottom - sld_rect.mBottom) / (edge_zone_height * 2));
+ factor = 1.f - (F32)((midle_rect.mBottom - sld_rect.mBottom) / (edge_zone_height * 2));
}
else if (sld_rect.mTop - midle_rect.mTop < edge_zone_height )
{
- factor = ((sld_rect.mTop - midle_rect.mTop) / (edge_zone_height * 2));
+ factor = (F32)((sld_rect.mTop - midle_rect.mTop) / (edge_zone_height * 2));
}
S32 shift_middle = (S32)(((F32)shift_down * factor) + ((F32)shift_up * (1.f - factor)));
@@ -667,7 +691,7 @@ void LLPanelEnvironmentInfo::readjustAltLabels()
{
if (i != midle_ind)
{
- LLView* trn_view = findChild<LLView>(alt_panels[i], true);
+ LLView* trn_view = mAltitudePanels[i];
LLRect trn_rect = trn_view->getRect();
if (trn_rect.mBottom <= midle_rect.mTop && trn_rect.mBottom >= midle_rect.mBottom)
@@ -739,8 +763,8 @@ void LLPanelEnvironmentInfo::commitDayLenOffsetChanges(bool need_callback)
{
LLEnvironment::instance().updateParcel(getParcelId(),
LLSettingsDay::ptr_t(),
- mCurrentEnvironment->mDayLength.value(),
- mCurrentEnvironment->mDayOffset.value(),
+ (S32)mCurrentEnvironment->mDayLength.value(),
+ (S32)mCurrentEnvironment->mDayOffset.value(),
LLEnvironment::altitudes_vect_t(),
[that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); });
}
@@ -748,8 +772,8 @@ void LLPanelEnvironmentInfo::commitDayLenOffsetChanges(bool need_callback)
{
LLEnvironment::instance().updateParcel(getParcelId(),
LLSettingsDay::ptr_t(),
- mCurrentEnvironment->mDayLength.value(),
- mCurrentEnvironment->mDayOffset.value(),
+ (S32)mCurrentEnvironment->mDayLength.value(),
+ (S32)mCurrentEnvironment->mDayOffset.value(),
LLEnvironment::altitudes_vect_t());
}
@@ -787,7 +811,7 @@ void LLPanelEnvironmentInfo::onAltSliderCallback(LLUICtrl *cntrl, const LLSD &da
}
iter->second.mTrackIndex = new_index;
- updateAltLabel(alt_prefixes[iter->second.mLabelIndex], iter->second.mTrackIndex, iter->second.mAltitude);
+ updateAltLabel(iter->second.mLabelIndex, iter->second.mTrackIndex, iter->second.mAltitude);
iter++;
}
@@ -813,8 +837,8 @@ void LLPanelEnvironmentInfo::onAltSliderMouseUp()
setControlsEnabled(false);
LLEnvironment::instance().updateParcel(getParcelId(),
LLSettingsDay::ptr_t(),
- mCurrentEnvironment ? mCurrentEnvironment->mDayLength.value() : -1,
- mCurrentEnvironment ? mCurrentEnvironment->mDayOffset.value() : -1,
+ mCurrentEnvironment ? (S32)mCurrentEnvironment->mDayLength.value() : -1,
+ mCurrentEnvironment ? (S32)mCurrentEnvironment->mDayOffset.value() : -1,
alts);
}
}
@@ -894,8 +918,8 @@ void LLPanelEnvironmentInfo::onBtnRstAltitudes()
LLEnvironment::instance().updateParcel(getParcelId(),
LLSettingsDay::ptr_t(),
- mCurrentEnvironment ? mCurrentEnvironment->mDayLength.value() : -1,
- mCurrentEnvironment ? mCurrentEnvironment->mDayOffset.value() : -1,
+ mCurrentEnvironment ? (S32)mCurrentEnvironment->mDayLength.value() : -1,
+ mCurrentEnvironment ? (S32)mCurrentEnvironment->mDayOffset.value() : -1,
alts,
[that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); });
}
@@ -907,12 +931,12 @@ void LLPanelEnvironmentInfo::udpateApparentTimeOfDay()
if ((!mCurrentEnvironment) || (mCurrentEnvironment->mDayLength.value() < 1.0) || (mCurrentEnvironment->mDayOffset.value() < 1.0))
{
- getChild<LLUICtrl>(LBL_TIMEOFDAY)->setVisible(false);
+ mLabelApparentTime->setVisible(false);
return;
}
- getChild<LLUICtrl>(LBL_TIMEOFDAY)->setVisible(true);
+ mLabelApparentTime->setVisible(true);
- S32Seconds now(LLDate::now().secondsSinceEpoch());
+ S32Seconds now((S32)LLDate::now().secondsSinceEpoch());
now += mCurrentEnvironment->mDayOffset;
@@ -932,10 +956,10 @@ void LLPanelEnvironmentInfo::udpateApparentTimeOfDay()
std::string lblminute(((minutesofhour.value() < 10) ? "0" : "") + LLSD(minutesofhour.value()).asString());
- getChild<LLUICtrl>(LBL_TIMEOFDAY)->setTextArg("[HH]", LLSD(hourofday.value()).asString());
- getChild<LLUICtrl>(LBL_TIMEOFDAY)->setTextArg("[MM]", lblminute);
- getChild<LLUICtrl>(LBL_TIMEOFDAY)->setTextArg("[AP]", std::string(am_pm ? "PM" : "AM"));
- getChild<LLUICtrl>(LBL_TIMEOFDAY)->setTextArg("[PRC]", LLSD((S32)(100 * perc)).asString());
+ mLabelApparentTime->setTextArg("[HH]", LLSD(hourofday.value()).asString());
+ mLabelApparentTime->setTextArg("[MM]", lblminute);
+ mLabelApparentTime->setTextArg("[AP]", std::string(am_pm ? "PM" : "AM"));
+ mLabelApparentTime->setTextArg("[PRC]", LLSD((S32)(100 * perc)).asString());
}
@@ -984,8 +1008,8 @@ void LLPanelEnvironmentInfo::onPickerCommitted(LLUUID item_id, S32 track_num)
itemp->getAssetUUID(),
itemp->getName(),
track_num,
- mCurrentEnvironment ? mCurrentEnvironment->mDayLength.value() : -1,
- mCurrentEnvironment ? mCurrentEnvironment->mDayOffset.value() : -1,
+ mCurrentEnvironment ? (S32)mCurrentEnvironment->mDayLength.value() : -1,
+ mCurrentEnvironment ? (S32)mCurrentEnvironment->mDayOffset.value() : -1,
flags,
LLEnvironment::altitudes_vect_t(),
[that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); });
@@ -1018,8 +1042,8 @@ void LLPanelEnvironmentInfo::onEditCommitted(LLSettingsDay::ptr_t newday)
LLEnvironment::instance().updateParcel(getParcelId(),
newday,
- mCurrentEnvironment ? mCurrentEnvironment->mDayLength.value() : -1,
- mCurrentEnvironment ? mCurrentEnvironment->mDayOffset.value() : -1,
+ mCurrentEnvironment ? (S32)mCurrentEnvironment->mDayLength.value() : -1,
+ mCurrentEnvironment ? (S32)mCurrentEnvironment->mDayOffset.value() : -1,
LLEnvironment::altitudes_vect_t(),
[that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); });
}
diff --git a/indra/newview/llpanelenvironment.h b/indra/newview/llpanelenvironment.h
index b478142987..c9b95cc348 100644
--- a/indra/newview/llpanelenvironment.h
+++ b/indra/newview/llpanelenvironment.h
@@ -39,6 +39,8 @@
#include "llestateinfomodel.h"
class LLViewerRegion;
+class LLIconCtrl;
+class LLSettingsDropTarget;
class LLPanelEnvironmentInfo : public LLPanel
{
@@ -63,6 +65,10 @@ public:
protected:
LOG_CLASS(LLPanelEnvironmentInfo);
+ static constexpr U32 ALTITUDE_SLIDER_COUNT = 3;
+ static constexpr U32 ALTITUDE_MARKERS_COUNT = 3;
+ static constexpr U32 ALTITUDE_PREFIXERS_COUNT = 5;
+
static const std::string BTN_SELECTINV;
static const std::string BTN_EDIT;
static const std::string BTN_USEDEFAULT;
@@ -108,7 +114,7 @@ protected:
bool getIsDirty() const { return (mDirtyFlag != 0); }
bool getIsDirtyFlag(U32 flag) const { return ((mDirtyFlag & flag) != 0); }
U32 getDirtyFlag() const { return mDirtyFlag; }
- void updateAltLabel(const std::string &alt_prefix, U32 sky_index, F32 alt_value);
+ void updateAltLabel(U32 alt_index, U32 sky_index, F32 alt_value);
void readjustAltLabels();
void onSldDayLengthChanged(F32 value);
@@ -168,6 +174,37 @@ protected:
altitudes_data_t mAltitudes;
S32 mCurEnvVersion; // used to filter duplicate callbacks/refreshes
+ LLUICtrl* mPanelEnvAltitudes = nullptr;
+ LLUICtrl* mPanelEnvConfig = nullptr;
+ LLUICtrl* mPanelEnvButtons = nullptr;
+ LLUICtrl* mPanelEnvDisabled = nullptr;
+ LLUICtrl* mPanelEnvRegionMsg = nullptr;
+
+ LLButton* mBtnSelectInv = nullptr;
+ LLButton* mBtnEdit = nullptr;
+ LLButton* mBtnUseDefault = nullptr;
+ LLButton* mBtnResetAltitudes = nullptr;
+
+ LLMultiSliderCtrl* mMultiSliderAltitudes = nullptr;
+
+ LLSliderCtrl* mSliderDayLength = nullptr;
+ LLSliderCtrl* mSliderDayOffset = nullptr;
+
+ LLTextBox* mEnvironmentDisabledText = nullptr;
+ LLTextBox* mLabelApparentTime = nullptr;
+
+ LLCheckBoxCtrl* mCheckAllowOverride = nullptr;
+
+ LLIconCtrl* mIconGround = nullptr;
+ LLIconCtrl* mIconWater = nullptr;
+
+ std::array<LLUICtrl*, ALTITUDE_MARKERS_COUNT> mAltitudeMarkers;
+ std::array<LLSettingsDropTarget*, ALTITUDE_PREFIXERS_COUNT> mAltitudeDropTarget;
+
+ std::array<LLTextBox*, ALTITUDE_PREFIXERS_COUNT> mAltitudeLabels;
+ std::array<LLLineEditor*, ALTITUDE_PREFIXERS_COUNT> mAltitudeEditor;
+ std::array<LLView*, ALTITUDE_PREFIXERS_COUNT> mAltitudePanels;
+
protected:
typedef boost::signals2::connection connection_t;
diff --git a/indra/newview/llpanelexperiencelog.cpp b/indra/newview/llpanelexperiencelog.cpp
index 24c9d7dced..5380565ace 100644
--- a/indra/newview/llpanelexperiencelog.cpp
+++ b/indra/newview/llpanelexperiencelog.cpp
@@ -76,7 +76,7 @@ bool LLPanelExperienceLog::postBuild()
LLSpinCtrl* spin = getChild<LLSpinCtrl>("logsizespinner");
- spin->set(log->getMaxDays());
+ spin->set((F32)log->getMaxDays());
spin->setCommitCallback(boost::bind(&LLPanelExperienceLog::logSizeChanged, this));
mPageSize = log->getPageSize();
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 89af765bb7..544b6fbc9c 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -117,26 +117,23 @@ const S32 PBRTYPE_METALLIC_ROUGHNESS = 2; // PBR Metallic
const S32 PBRTYPE_EMISSIVE = 3; // PBR Emissive
const S32 PBRTYPE_NORMAL = 4; // PBR Normal
-LLGLTFMaterial::TextureInfo texture_info_from_pbrtype(S32 pbr_type)
+LLGLTFMaterial::TextureInfo LLPanelFace::getPBRTextureInfo()
{
- switch (pbr_type)
+ // Radiogroup [ "Complete material", "Base color", "Metallic/roughness", "Emissive", "Normal" ]
+ S32 radio_group_index = mRadioPbrType->getSelectedIndex();
+ switch (radio_group_index)
{
case PBRTYPE_BASE_COLOR:
return LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR;
- break;
case PBRTYPE_NORMAL:
return LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL;
- break;
case PBRTYPE_METALLIC_ROUGHNESS:
return LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS;
- break;
case PBRTYPE_EMISSIVE:
return LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE;
- break;
- default:
- return LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT;
- break;
}
+ // The default value is used as a fallback
+ return LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT;
}
void LLPanelFace::updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*)> func)
@@ -195,284 +192,250 @@ std::string USE_TEXTURE;
LLRender::eTexIndex LLPanelFace::getTextureChannelToEdit()
{
- LLRender::eTexIndex channel_to_edit = LLRender::DIFFUSE_MAP;
- if (mComboMatMedia)
+ S32 matmedia_selection = mComboMatMedia->getCurrentIndex();
+ switch (matmedia_selection)
{
- U32 matmedia_selection = mComboMatMedia->getCurrentIndex();
- if (matmedia_selection == MATMEDIA_MATERIAL)
- {
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
- channel_to_edit = (LLRender::eTexIndex)radio_mat_type->getSelectedIndex();
- }
- if (matmedia_selection == MATMEDIA_PBR)
- {
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_pbr_type");
- channel_to_edit = (LLRender::eTexIndex)radio_mat_type->getSelectedIndex();
- }
+ case MATMEDIA_MATERIAL:
+ return getMatTextureChannel();
+ case MATMEDIA_PBR:
+ return getPBRTextureChannel();
}
+ return (LLRender::eTexIndex)0;
+}
- channel_to_edit = (channel_to_edit == LLRender::NORMAL_MAP) ? (getCurrentNormalMap().isNull() ? LLRender::DIFFUSE_MAP : channel_to_edit) : channel_to_edit;
- channel_to_edit = (channel_to_edit == LLRender::SPECULAR_MAP) ? (getCurrentSpecularMap().isNull() ? LLRender::DIFFUSE_MAP : channel_to_edit) : channel_to_edit;
- return channel_to_edit;
+LLRender::eTexIndex LLPanelFace::getMatTextureChannel()
+{
+ // Radiogroup [ "Texture (diffuse)", "Bumpiness (normal)", "Shininess (specular)" ]
+ S32 radio_group_index = mRadioMaterialType->getSelectedIndex();
+ switch (radio_group_index)
+ {
+ case MATTYPE_DIFFUSE: // "Texture (diffuse)"
+ return LLRender::DIFFUSE_MAP;
+ case MATTYPE_NORMAL: // "Bumpiness (normal)"
+ if (getCurrentNormalMap().notNull())
+ return LLRender::NORMAL_MAP;
+ break;
+ case MATTYPE_SPECULAR: // "Shininess (specular)"
+ if (getCurrentNormalMap().notNull())
+ return LLRender::SPECULAR_MAP;
+ break;
+ }
+ // The default value is used as a fallback if no required texture is chosen
+ return (LLRender::eTexIndex)0;
+}
+
+LLRender::eTexIndex LLPanelFace::getPBRTextureChannel()
+{
+ // Radiogroup [ "Complete material", "Base color", "Metallic/roughness", "Emissive", "Normal" ]
+ S32 radio_group_index = mRadioPbrType->getSelectedIndex();
+ switch (radio_group_index)
+ {
+ case PBRTYPE_RENDER_MATERIAL_ID: // "Complete material"
+ return LLRender::NUM_TEXTURE_CHANNELS;
+ case PBRTYPE_BASE_COLOR: // "Base color"
+ return LLRender::BASECOLOR_MAP;
+ case PBRTYPE_METALLIC_ROUGHNESS: // "Metallic/roughness"
+ return LLRender::METALLIC_ROUGHNESS_MAP;
+ case PBRTYPE_EMISSIVE: // "Emissive"
+ return LLRender::EMISSIVE_MAP;
+ case PBRTYPE_NORMAL: // "Normal"
+ return LLRender::GLTF_NORMAL_MAP;
+ }
+ // The default value is used as a fallback
+ return LLRender::NUM_TEXTURE_CHANNELS;
}
LLRender::eTexIndex LLPanelFace::getTextureDropChannel()
{
- if (mComboMatMedia && mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL)
+ if (mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL)
{
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
- return LLRender::eTexIndex(radio_mat_type->getSelectedIndex());
+ return getMatTextureChannel();
}
- return LLRender::eTexIndex(MATTYPE_DIFFUSE);
+ return (LLRender::eTexIndex)0;
}
LLGLTFMaterial::TextureInfo LLPanelFace::getPBRDropChannel()
{
- if (mComboMatMedia && mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
+ if (mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
{
- LLRadioGroup* radio_pbr_type = getChild<LLRadioGroup>("radio_pbr_type");
- return texture_info_from_pbrtype(radio_pbr_type->getSelectedIndex());
+ return getPBRTextureInfo();
}
- return texture_info_from_pbrtype(PBRTYPE_BASE_COLOR);
+ return (LLGLTFMaterial::TextureInfo)0;
}
// Things the UI provides...
//
-LLUUID LLPanelFace::getCurrentNormalMap() { return getChild<LLTextureCtrl>("bumpytexture control")->getImageAssetID(); }
-LLUUID LLPanelFace::getCurrentSpecularMap() { return getChild<LLTextureCtrl>("shinytexture control")->getImageAssetID(); }
-U32 LLPanelFace::getCurrentShininess() { return getChild<LLComboBox>("combobox shininess")->getCurrentIndex(); }
-U32 LLPanelFace::getCurrentBumpiness() { return getChild<LLComboBox>("combobox bumpiness")->getCurrentIndex(); }
-U8 LLPanelFace::getCurrentDiffuseAlphaMode() { return (U8)getChild<LLComboBox>("combobox alphamode")->getCurrentIndex(); }
-U8 LLPanelFace::getCurrentAlphaMaskCutoff() { return (U8)getChild<LLUICtrl>("maskcutoff")->getValue().asInteger(); }
-U8 LLPanelFace::getCurrentEnvIntensity() { return (U8)getChild<LLUICtrl>("environment")->getValue().asInteger(); }
-U8 LLPanelFace::getCurrentGlossiness() { return (U8)getChild<LLUICtrl>("glossiness")->getValue().asInteger(); }
-F32 LLPanelFace::getCurrentBumpyRot() { return getChild<LLUICtrl>("bumpyRot")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentBumpyScaleU() { return getChild<LLUICtrl>("bumpyScaleU")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentBumpyScaleV() { return getChild<LLUICtrl>("bumpyScaleV")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentBumpyOffsetU() { return getChild<LLUICtrl>("bumpyOffsetU")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentBumpyOffsetV() { return getChild<LLUICtrl>("bumpyOffsetV")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentShinyRot() { return getChild<LLUICtrl>("shinyRot")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentShinyScaleU() { return getChild<LLUICtrl>("shinyScaleU")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentShinyScaleV() { return getChild<LLUICtrl>("shinyScaleV")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentShinyOffsetU() { return getChild<LLUICtrl>("shinyOffsetU")->getValue().asReal(); }
-F32 LLPanelFace::getCurrentShinyOffsetV() { return getChild<LLUICtrl>("shinyOffsetV")->getValue().asReal(); }
+LLUUID LLPanelFace::getCurrentNormalMap() { return mBumpyTextureCtrl->getImageAssetID(); }
+LLUUID LLPanelFace::getCurrentSpecularMap() { return mShinyTextureCtrl->getImageAssetID(); }
+U32 LLPanelFace::getCurrentShininess() { return mComboShininess->getCurrentIndex(); }
+U32 LLPanelFace::getCurrentBumpiness() { return mComboBumpiness->getCurrentIndex(); }
+U8 LLPanelFace::getCurrentDiffuseAlphaMode() { return (U8)mComboAlphaMode->getCurrentIndex(); }
+U8 LLPanelFace::getCurrentAlphaMaskCutoff() { return (U8)mMaskCutoff->getValue().asInteger(); }
+U8 LLPanelFace::getCurrentEnvIntensity() { return (U8)mEnvironment->getValue().asInteger(); }
+U8 LLPanelFace::getCurrentGlossiness() { return (U8)mGlossiness->getValue().asInteger(); }
+F32 LLPanelFace::getCurrentBumpyRot() { return (F32)mBumpyRotate->getValue().asReal(); }
+F32 LLPanelFace::getCurrentBumpyScaleU() { return (F32)mBumpyScaleU->getValue().asReal(); }
+F32 LLPanelFace::getCurrentBumpyScaleV() { return (F32)mBumpyScaleV->getValue().asReal(); }
+F32 LLPanelFace::getCurrentBumpyOffsetU() { return (F32)mBumpyOffsetU->getValue().asReal(); }
+F32 LLPanelFace::getCurrentBumpyOffsetV() { return (F32)mBumpyOffsetV->getValue().asReal(); }
+F32 LLPanelFace::getCurrentShinyRot() { return (F32)mShinyRotate->getValue().asReal(); }
+F32 LLPanelFace::getCurrentShinyScaleU() { return (F32)mShinyScaleU->getValue().asReal(); }
+F32 LLPanelFace::getCurrentShinyScaleV() { return (F32)mShinyScaleV->getValue().asReal(); }
+F32 LLPanelFace::getCurrentShinyOffsetU() { return (F32)mShinyOffsetU->getValue().asReal(); }
+F32 LLPanelFace::getCurrentShinyOffsetV() { return (F32)mShinyOffsetV->getValue().asReal(); }
//
// Methods
//
-bool LLPanelFace::postBuild()
-{
- childSetCommitCallback("combobox shininess",&LLPanelFace::onCommitShiny,this);
- childSetCommitCallback("combobox bumpiness",&LLPanelFace::onCommitBump,this);
- childSetCommitCallback("combobox alphamode",&LLPanelFace::onCommitAlphaMode,this);
- childSetCommitCallback("TexScaleU",&LLPanelFace::onCommitTextureScaleX, this);
- childSetCommitCallback("TexScaleV",&LLPanelFace::onCommitTextureScaleY, this);
- childSetCommitCallback("TexRot",&LLPanelFace::onCommitTextureRot, this);
- childSetCommitCallback("rptctrl",&LLPanelFace::onCommitRepeatsPerMeter, this);
- childSetCommitCallback("checkbox planar align",&LLPanelFace::onCommitPlanarAlign, this);
- childSetCommitCallback("TexOffsetU",LLPanelFace::onCommitTextureOffsetX, this);
- childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureOffsetY, this);
-
- childSetCommitCallback("bumpyScaleU",&LLPanelFace::onCommitMaterialBumpyScaleX, this);
- childSetCommitCallback("bumpyScaleV",&LLPanelFace::onCommitMaterialBumpyScaleY, this);
- childSetCommitCallback("bumpyRot",&LLPanelFace::onCommitMaterialBumpyRot, this);
- childSetCommitCallback("bumpyOffsetU",&LLPanelFace::onCommitMaterialBumpyOffsetX, this);
- childSetCommitCallback("bumpyOffsetV",&LLPanelFace::onCommitMaterialBumpyOffsetY, this);
- childSetCommitCallback("shinyScaleU",&LLPanelFace::onCommitMaterialShinyScaleX, this);
- childSetCommitCallback("shinyScaleV",&LLPanelFace::onCommitMaterialShinyScaleY, this);
- childSetCommitCallback("shinyRot",&LLPanelFace::onCommitMaterialShinyRot, this);
- childSetCommitCallback("shinyOffsetU",&LLPanelFace::onCommitMaterialShinyOffsetX, this);
- childSetCommitCallback("shinyOffsetV",&LLPanelFace::onCommitMaterialShinyOffsetY, this);
- childSetCommitCallback("glossiness",&LLPanelFace::onCommitMaterialGloss, this);
- childSetCommitCallback("environment",&LLPanelFace::onCommitMaterialEnv, this);
- childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterialMaskCutoff, this);
- childSetCommitCallback("add_media", &LLPanelFace::onClickBtnAddMedia, this);
- childSetCommitCallback("delete_media", &LLPanelFace::onClickBtnDeleteMedia, this);
-
- getChild<LLUICtrl>("gltfTextureScaleU")->setCommitCallback(boost::bind(&LLPanelFace::onCommitGLTFTextureScaleU, this, _1), nullptr);
- getChild<LLUICtrl>("gltfTextureScaleV")->setCommitCallback(boost::bind(&LLPanelFace::onCommitGLTFTextureScaleV, this, _1), nullptr);
- getChild<LLUICtrl>("gltfTextureRotation")->setCommitCallback(boost::bind(&LLPanelFace::onCommitGLTFRotation, this, _1), nullptr);
- getChild<LLUICtrl>("gltfTextureOffsetU")->setCommitCallback(boost::bind(&LLPanelFace::onCommitGLTFTextureOffsetU, this, _1), nullptr);
- getChild<LLUICtrl>("gltfTextureOffsetV")->setCommitCallback(boost::bind(&LLPanelFace::onCommitGLTFTextureOffsetV, this, _1), nullptr);
+bool LLPanelFace::postBuild()
+{
+ getChildSetCommitCallback(mComboShininess, "combobox shininess", [&](LLUICtrl*, const LLSD&) { onCommitShiny(); });
+ getChildSetCommitCallback(mComboBumpiness, "combobox bumpiness", [&](LLUICtrl*, const LLSD&) { onCommitBump(); });
+ getChildSetCommitCallback(mComboAlphaMode, "combobox alphamode", [&](LLUICtrl*, const LLSD&) { onCommitAlphaMode(); });
+ getChildSetCommitCallback(mTexScaleU, "TexScaleU", [&](LLUICtrl*, const LLSD&) { onCommitTextureScaleX(); });
+ getChildSetCommitCallback(mTexScaleV, "TexScaleV", [&](LLUICtrl*, const LLSD&) { onCommitTextureScaleY(); });
+ getChildSetCommitCallback(mTexRotate, "TexRot", [&](LLUICtrl*, const LLSD&) { onCommitTextureRot(); });
+ getChildSetCommitCallback(mTexRepeat, "rptctrl", [&](LLUICtrl*, const LLSD&) { onCommitRepeatsPerMeter(); });
+ getChildSetCommitCallback(mPlanarAlign, "checkbox planar align", [&](LLUICtrl*, const LLSD&) { onCommitPlanarAlign(); });
+ getChildSetCommitCallback(mTexOffsetU, "TexOffsetU", [&](LLUICtrl*, const LLSD&) { onCommitTextureOffsetX(); });
+ getChildSetCommitCallback(mTexOffsetV, "TexOffsetV", [&](LLUICtrl*, const LLSD&) { onCommitTextureOffsetY(); });
+
+ getChildSetCommitCallback(mBumpyScaleU, "bumpyScaleU", [&](LLUICtrl*, const LLSD&) { onCommitMaterialBumpyScaleX(); });
+ getChildSetCommitCallback(mBumpyScaleV, "bumpyScaleV", [&](LLUICtrl*, const LLSD&) { onCommitMaterialBumpyScaleY(); });
+ getChildSetCommitCallback(mBumpyRotate, "bumpyRot", [&](LLUICtrl*, const LLSD&) { onCommitMaterialBumpyRot(); });
+ getChildSetCommitCallback(mBumpyOffsetU, "bumpyOffsetU", [&](LLUICtrl*, const LLSD&) { onCommitMaterialBumpyOffsetX(); });
+ getChildSetCommitCallback(mBumpyOffsetV, "bumpyOffsetV", [&](LLUICtrl*, const LLSD&) { onCommitMaterialBumpyOffsetY(); });
+ getChildSetCommitCallback(mShinyScaleU, "shinyScaleU", [&](LLUICtrl*, const LLSD&) { onCommitMaterialShinyScaleX(); });
+ getChildSetCommitCallback(mShinyScaleV, "shinyScaleV", [&](LLUICtrl*, const LLSD&) { onCommitMaterialShinyScaleY(); });
+ getChildSetCommitCallback(mShinyRotate, "shinyRot", [&](LLUICtrl*, const LLSD&) { onCommitMaterialShinyRot(); });
+ getChildSetCommitCallback(mShinyOffsetU, "shinyOffsetU", [&](LLUICtrl*, const LLSD&) { onCommitMaterialShinyOffsetX(); });
+ getChildSetCommitCallback(mShinyOffsetV, "shinyOffsetV", [&](LLUICtrl*, const LLSD&) { onCommitMaterialShinyOffsetY(); });
+
+ getChildSetCommitCallback(mGlossiness, "glossiness", [&](LLUICtrl*, const LLSD&) { onCommitMaterialGloss(); });
+ getChildSetCommitCallback(mEnvironment, "environment", [&](LLUICtrl*, const LLSD&) { onCommitMaterialEnv(); });
+ getChildSetCommitCallback(mMaskCutoff, "maskcutoff", [&](LLUICtrl*, const LLSD&) { onCommitMaterialMaskCutoff(); });
+ getChildSetCommitCallback(mAddMedia, "add_media", [&](LLUICtrl*, const LLSD&) { onClickBtnAddMedia(); });
+ getChildSetCommitCallback(mDelMedia, "delete_media", [&](LLUICtrl*, const LLSD&) { onClickBtnDeleteMedia(); });
+
+ getChildSetCommitCallback(mPBRScaleU, "gltfTextureScaleU", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureScaleU(); });
+ getChildSetCommitCallback(mPBRScaleV, "gltfTextureScaleV", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureScaleV(); });
+ getChildSetCommitCallback(mPBRRotate, "gltfTextureRotation", [&](LLUICtrl*, const LLSD&) { onCommitGLTFRotation(); });
+ getChildSetCommitCallback(mPBROffsetU, "gltfTextureOffsetU", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureOffsetU(); });
+ getChildSetCommitCallback(mPBROffsetV, "gltfTextureOffsetV", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureOffsetV(); });
LLGLTFMaterialList::addSelectionUpdateCallback(&LLPanelFace::onMaterialOverrideReceived);
sMaterialOverrideSelection.connect();
- childSetAction("button align",&LLPanelFace::onClickAutoFix,this);
- childSetAction("button align textures", &LLPanelFace::onAlignTexture, this);
- childSetAction("pbr_from_inventory", &LLPanelFace::onClickBtnLoadInvPBR, this);
- childSetAction("edit_selected_pbr", &LLPanelFace::onClickBtnEditPBR, this);
- childSetAction("save_selected_pbr", &LLPanelFace::onClickBtnSavePBR, this);
-
- LLTextureCtrl* mTextureCtrl;
- LLTextureCtrl* mShinyTextureCtrl;
- LLTextureCtrl* mBumpyTextureCtrl;
- LLColorSwatchCtrl* mColorSwatch;
- LLColorSwatchCtrl* mShinyColorSwatch;
-
- LLComboBox* mComboTexGen;
-
- LLCheckBoxCtrl *mCheckFullbright;
-
- LLTextBox* mLabelColorTransp;
- LLSpinCtrl* mCtrlColorTransp; // transparency = 1 - alpha
-
- LLSpinCtrl* mCtrlGlow;
+ getChildSetClickedCallback(mBtnAlign, "button align", [&](LLUICtrl*, const LLSD&) { onClickAutoFix(); });
+ getChildSetClickedCallback(mBtnAlignTex, "button align textures", [&](LLUICtrl*, const LLSD&) { onAlignTexture(); });
+ getChildSetClickedCallback(mBtnPbrFromInv, "pbr_from_inventory", [&](LLUICtrl*, const LLSD&) { onClickBtnLoadInvPBR(); });
+ getChildSetClickedCallback(mBtnEditBbr, "edit_selected_pbr", [&](LLUICtrl*, const LLSD&) { onClickBtnEditPBR(); });
+ getChildSetClickedCallback(mBtnSaveBbr, "save_selected_pbr", [&](LLUICtrl*, const LLSD&) { onClickBtnSavePBR(); });
setMouseOpaque(false);
- LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
- if (pbr_ctrl)
- {
- pbr_ctrl->setDefaultImageAssetID(LLUUID::null);
- pbr_ctrl->setBlankImageAssetID(BLANK_MATERIAL_ASSET_ID);
- pbr_ctrl->setCommitCallback(boost::bind(&LLPanelFace::onCommitPbr, this, _2));
- pbr_ctrl->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelPbr, this, _2));
- pbr_ctrl->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectPbr, this, _2));
- pbr_ctrl->setDragCallback(boost::bind(&LLPanelFace::onDragPbr, this, _2));
- pbr_ctrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onPbrSelectionChanged, this, _1));
- pbr_ctrl->setOnCloseCallback(boost::bind(&LLPanelFace::onCloseTexturePicker, this, _2));
-
- pbr_ctrl->setFollowsTop();
- pbr_ctrl->setFollowsLeft();
- pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
- pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
- pbr_ctrl->setBakeTextureEnabled(false);
- pbr_ctrl->setInventoryPickType(PICK_MATERIAL);
- }
+ mPBRTextureCtrl = getChild<LLTextureCtrl>("pbr_control");
+ mPBRTextureCtrl->setDefaultImageAssetID(LLUUID::null);
+ mPBRTextureCtrl->setBlankImageAssetID(BLANK_MATERIAL_ASSET_ID);
+ mPBRTextureCtrl->setCommitCallback([&](LLUICtrl*, const LLSD&) { onCommitPbr(); });
+ mPBRTextureCtrl->setOnCancelCallback([&](LLUICtrl*, const LLSD&) { onCancelPbr(); });
+ mPBRTextureCtrl->setOnSelectCallback([&](LLUICtrl*, const LLSD&) { onSelectPbr(); });
+ mPBRTextureCtrl->setDragCallback([&](LLUICtrl*, LLInventoryItem* item) { return onDragPbr(item); });
+ mPBRTextureCtrl->setOnTextureSelectedCallback([&](LLInventoryItem* item) { onPbrSelectionChanged(item); });
+ mPBRTextureCtrl->setOnCloseCallback([&](LLUICtrl*, const LLSD& data) { onCloseTexturePicker(data); });
+ mPBRTextureCtrl->setFollowsTop();
+ mPBRTextureCtrl->setFollowsLeft();
+ mPBRTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
+ mPBRTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ mPBRTextureCtrl->setBakeTextureEnabled(false);
+ mPBRTextureCtrl->setInventoryPickType(PICK_MATERIAL);
mTextureCtrl = getChild<LLTextureCtrl>("texture control");
- if(mTextureCtrl)
- {
- mTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_TEXTURE);
- mTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitTexture, this, _2) );
- mTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelTexture, this, _2) );
- mTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectTexture, this, _2) );
- mTextureCtrl->setDragCallback(boost::bind(&LLPanelFace::onDragTexture, this, _2));
- mTextureCtrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onTextureSelectionChanged, this, _1));
- mTextureCtrl->setOnCloseCallback( boost::bind(&LLPanelFace::onCloseTexturePicker, this, _2) );
-
- mTextureCtrl->setFollowsTop();
- mTextureCtrl->setFollowsLeft();
- mTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
- mTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
- }
+ mTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_TEXTURE);
+ mTextureCtrl->setCommitCallback([&](LLUICtrl*, const LLSD&) { onCommitTexture(); });
+ mTextureCtrl->setOnCancelCallback([&](LLUICtrl*, const LLSD&) { onCancelTexture(); });
+ mTextureCtrl->setOnSelectCallback([&](LLUICtrl*, const LLSD&) { onSelectTexture(); });
+ mTextureCtrl->setDragCallback([&](LLUICtrl*, LLInventoryItem* item) { return onDragTexture(item); });
+ mTextureCtrl->setOnTextureSelectedCallback([&](LLInventoryItem* item) { onTextureSelectionChanged(item); });
+ mTextureCtrl->setOnCloseCallback([&](LLUICtrl*, const LLSD& data) { onCloseTexturePicker(data); });
+ mTextureCtrl->setFollowsTop();
+ mTextureCtrl->setFollowsLeft();
+ mTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
+ mTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
mShinyTextureCtrl = getChild<LLTextureCtrl>("shinytexture control");
- if(mShinyTextureCtrl)
- {
- mShinyTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_SPECULAR);
- mShinyTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitSpecularTexture, this, _2) );
- mShinyTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelSpecularTexture, this, _2) );
- mShinyTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectSpecularTexture, this, _2) );
- mShinyTextureCtrl->setOnCloseCallback( boost::bind(&LLPanelFace::onCloseTexturePicker, this, _2) );
-
- mShinyTextureCtrl->setDragCallback(boost::bind(&LLPanelFace::onDragTexture, this, _2));
- mShinyTextureCtrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onTextureSelectionChanged, this, _1));
- mShinyTextureCtrl->setFollowsTop();
- mShinyTextureCtrl->setFollowsLeft();
- mShinyTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
- mShinyTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
- }
+ mShinyTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_SPECULAR);
+ mShinyTextureCtrl->setCommitCallback([&](LLUICtrl*, const LLSD& data) { onCommitSpecularTexture(data); });
+ mShinyTextureCtrl->setOnCancelCallback([&](LLUICtrl*, const LLSD& data) { onCancelSpecularTexture(data); });
+ mShinyTextureCtrl->setOnSelectCallback([&](LLUICtrl*, const LLSD& data) { onSelectSpecularTexture(data); });
+ mShinyTextureCtrl->setDragCallback([&](LLUICtrl*, LLInventoryItem* item) { return onDragTexture(item); });
+ mShinyTextureCtrl->setOnTextureSelectedCallback([&](LLInventoryItem* item) { onTextureSelectionChanged(item); });
+ mShinyTextureCtrl->setOnCloseCallback([&](LLUICtrl*, const LLSD& data) { onCloseTexturePicker(data); });
+ mShinyTextureCtrl->setFollowsTop();
+ mShinyTextureCtrl->setFollowsLeft();
+ mShinyTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
+ mShinyTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
mBumpyTextureCtrl = getChild<LLTextureCtrl>("bumpytexture control");
- if(mBumpyTextureCtrl)
- {
- mBumpyTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_NORMAL);
- mBumpyTextureCtrl->setBlankImageAssetID(BLANK_OBJECT_NORMAL);
- mBumpyTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitNormalTexture, this, _2) );
- mBumpyTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelNormalTexture, this, _2) );
- mBumpyTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectNormalTexture, this, _2) );
- mBumpyTextureCtrl->setOnCloseCallback( boost::bind(&LLPanelFace::onCloseTexturePicker, this, _2) );
-
- mBumpyTextureCtrl->setDragCallback(boost::bind(&LLPanelFace::onDragTexture, this, _2));
- mBumpyTextureCtrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onTextureSelectionChanged, this, _1));
- mBumpyTextureCtrl->setFollowsTop();
- mBumpyTextureCtrl->setFollowsLeft();
- mBumpyTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
- mBumpyTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
- }
+ mBumpyTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_NORMAL);
+ mBumpyTextureCtrl->setBlankImageAssetID(BLANK_OBJECT_NORMAL);
+ mBumpyTextureCtrl->setCommitCallback([&](LLUICtrl*, const LLSD& data) { onCommitNormalTexture(data); });
+ mBumpyTextureCtrl->setOnCancelCallback([&](LLUICtrl*, const LLSD& data) { onCancelNormalTexture(data); });
+ mBumpyTextureCtrl->setOnSelectCallback([&](LLUICtrl*, const LLSD& data) { onSelectNormalTexture(data); });
+ mBumpyTextureCtrl->setDragCallback([&](LLUICtrl*, LLInventoryItem* item) { return onDragTexture(item); });
+ mBumpyTextureCtrl->setOnTextureSelectedCallback([&](LLInventoryItem* item) { onTextureSelectionChanged(item); });
+ mBumpyTextureCtrl->setOnCloseCallback([&](LLUICtrl*, const LLSD& data) { onCloseTexturePicker(data); });
+ mBumpyTextureCtrl->setFollowsTop();
+ mBumpyTextureCtrl->setFollowsLeft();
+ mBumpyTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
+ mBumpyTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
- if(mColorSwatch)
- {
- mColorSwatch->setCommitCallback(boost::bind(&LLPanelFace::onCommitColor, this, _2));
- mColorSwatch->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelColor, this, _2));
- mColorSwatch->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectColor, this, _2));
- mColorSwatch->setFollowsTop();
- mColorSwatch->setFollowsLeft();
- mColorSwatch->setCanApplyImmediately(true);
- }
+ mColorSwatch->setCommitCallback([&](LLUICtrl*, const LLSD&) { onCommitColor(); });
+ mColorSwatch->setOnCancelCallback([&](LLUICtrl*, const LLSD&) { onCancelColor(); });
+ mColorSwatch->setOnSelectCallback([&](LLUICtrl*, const LLSD&) { onSelectColor(); });
+ mColorSwatch->setFollowsTop();
+ mColorSwatch->setFollowsLeft();
+ mColorSwatch->setCanApplyImmediately(true);
mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch");
- if(mShinyColorSwatch)
- {
- mShinyColorSwatch->setCommitCallback(boost::bind(&LLPanelFace::onCommitShinyColor, this, _2));
- mShinyColorSwatch->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelShinyColor, this, _2));
- mShinyColorSwatch->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectShinyColor, this, _2));
- mShinyColorSwatch->setFollowsTop();
- mShinyColorSwatch->setFollowsLeft();
- mShinyColorSwatch->setCanApplyImmediately(true);
- }
+ mShinyColorSwatch->setCommitCallback([&](LLUICtrl*, const LLSD&) { onCommitShinyColor(); });
+ mShinyColorSwatch->setOnCancelCallback([&](LLUICtrl*, const LLSD&) { onCancelShinyColor(); });
+ mShinyColorSwatch->setOnSelectCallback([&](LLUICtrl*, const LLSD&) { onSelectShinyColor(); });
+ mShinyColorSwatch->setFollowsTop();
+ mShinyColorSwatch->setFollowsLeft();
+ mShinyColorSwatch->setCanApplyImmediately(true);
mLabelColorTransp = getChild<LLTextBox>("color trans");
- if(mLabelColorTransp)
- {
- mLabelColorTransp->setFollowsTop();
- mLabelColorTransp->setFollowsLeft();
- }
+ mLabelColorTransp->setFollowsTop();
+ mLabelColorTransp->setFollowsLeft();
mCtrlColorTransp = getChild<LLSpinCtrl>("ColorTrans");
- if(mCtrlColorTransp)
- {
- mCtrlColorTransp->setCommitCallback(boost::bind(&LLPanelFace::onCommitAlpha, this, _2));
- mCtrlColorTransp->setPrecision(0);
- mCtrlColorTransp->setFollowsTop();
- mCtrlColorTransp->setFollowsLeft();
- }
+ mCtrlColorTransp->setCommitCallback([&](LLUICtrl*, const LLSD&) { onCommitAlpha(); });
+ mCtrlColorTransp->setPrecision(0);
+ mCtrlColorTransp->setFollowsTop();
+ mCtrlColorTransp->setFollowsLeft();
- mCheckFullbright = getChild<LLCheckBoxCtrl>("checkbox fullbright");
- if (mCheckFullbright)
- {
- mCheckFullbright->setCommitCallback(LLPanelFace::onCommitFullbright, this);
- }
+ getChildSetCommitCallback(mCheckFullbright, "checkbox fullbright", [&](LLUICtrl*, const LLSD&) { onCommitFullbright(); });
- mComboTexGen = getChild<LLComboBox>("combobox texgen");
- if(mComboTexGen)
- {
- mComboTexGen->setCommitCallback(LLPanelFace::onCommitTexGen, this);
- mComboTexGen->setFollows(FOLLOWS_LEFT | FOLLOWS_TOP);
- }
+ mLabelTexGen = getChild<LLTextBox>("tex gen");
+ getChildSetCommitCallback(mComboTexGen, "combobox texgen", [&](LLUICtrl*, const LLSD&) { onCommitTexGen(); });
+ mComboTexGen->setFollows(FOLLOWS_LEFT | FOLLOWS_TOP);
- mComboMatMedia = getChild<LLComboBox>("combobox matmedia");
- if(mComboMatMedia)
- {
- mComboMatMedia->setCommitCallback(LLPanelFace::onCommitMaterialsMedia,this);
- mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL);
- }
+ getChildSetCommitCallback(mComboMatMedia, "combobox matmedia", [&](LLUICtrl*, const LLSD&) { onCommitMaterialsMedia(); });
+ mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL);
- LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
- if(radio_mat_type)
- {
- radio_mat_type->setCommitCallback(LLPanelFace::onCommitMaterialType, this);
- radio_mat_type->selectNthItem(MATTYPE_DIFFUSE);
- }
+ getChildSetCommitCallback(mRadioMaterialType, "radio_material_type", [&](LLUICtrl*, const LLSD&) { onCommitMaterialType(); });
+ mRadioMaterialType->selectNthItem(MATTYPE_DIFFUSE);
- LLRadioGroup* radio_pbr_type = findChild<LLRadioGroup>("radio_pbr_type");
- if (radio_pbr_type)
- {
- radio_pbr_type->setCommitCallback(LLPanelFace::onCommitPbrType, this);
- radio_pbr_type->selectNthItem(PBRTYPE_RENDER_MATERIAL_ID);
- }
+ getChildSetCommitCallback(mRadioPbrType, "radio_pbr_type", [&](LLUICtrl*, const LLSD&) { onCommitPbrType(); });
+ mRadioPbrType->selectNthItem(PBRTYPE_RENDER_MATERIAL_ID);
- mCtrlGlow = getChild<LLSpinCtrl>("glow");
- if(mCtrlGlow)
- {
- mCtrlGlow->setCommitCallback(LLPanelFace::onCommitGlow, this);
- }
+ mLabelGlow = getChild<LLTextBox>("glow label");
+ getChildSetCommitCallback(mCtrlGlow, "glow", [&](LLUICtrl*, const LLSD&) { onCommitGlow(); });
mMenuClipboardColor = getChild<LLMenuButton>("clipboard_color_params_btn");
mMenuClipboardTexture = getChild<LLMenuButton>("clipboard_texture_params_btn");
@@ -480,6 +443,19 @@ bool LLPanelFace::postBuild()
mTitleMedia = getChild<LLMediaCtrl>("title_media");
mTitleMediaText = getChild<LLTextBox>("media_info");
+ mLabelBumpiness = getChild<LLTextBox>("label bumpiness");
+ mLabelShininess = getChild<LLTextBox>("label shininess");
+ mLabelAlphaMode = getChild<LLTextBox>("label alphamode");
+ mLabelGlossiness = getChild<LLTextBox>("label glossiness");
+ mLabelEnvironment = getChild<LLTextBox>("label environment");
+ mLabelMaskCutoff = getChild<LLTextBox>("label maskcutoff");
+ mLabelShiniColor = getChild<LLTextBox>("label shinycolor");
+ mLabelColor = getChild<LLTextBox>("color label");
+
+ mLabelMatPermLoading = getChild<LLTextBox>("material_permissions_loading_label");
+
+ mCheckSyncSettings = getChild<LLCheckBoxCtrl>("checkbox_sync_settings");
+
clearCtrls();
return true;
@@ -532,9 +508,7 @@ void LLPanelFace::draw()
void LLPanelFace::sendTexture()
{
- LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("texture control");
- if(!mTextureCtrl) return;
- if( !mTextureCtrl->getTentative() )
+ if (!mTextureCtrl->getTentative())
{
// we grab the item id first, because we want to do a
// permissions check in the selection manager. ARGH!
@@ -553,101 +527,83 @@ void LLPanelFace::sendTexture()
void LLPanelFace::sendBump(U32 bumpiness)
{
- LLTextureCtrl* bumpytexture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
if (bumpiness < BUMPY_TEXTURE)
-{
+ {
LL_DEBUGS("Materials") << "clearing bumptexture control" << LL_ENDL;
- bumpytexture_ctrl->clear();
- bumpytexture_ctrl->setImageAssetID(LLUUID());
+ mBumpyTextureCtrl->clear();
+ mBumpyTextureCtrl->setImageAssetID(LLUUID());
}
updateBumpyControls(bumpiness == BUMPY_TEXTURE, true);
- LLUUID current_normal_map = bumpytexture_ctrl->getImageAssetID();
+ LLUUID current_normal_map = mBumpyTextureCtrl->getImageAssetID();
- U8 bump = (U8) bumpiness & TEM_BUMP_MASK;
+ U8 bump = (U8)bumpiness & TEM_BUMP_MASK;
// Clear legacy bump to None when using an actual normal map
- //
if (!current_normal_map.isNull())
+ {
bump = 0;
+ }
// Set the normal map or reset it to null as appropriate
//
LLSelectedTEMaterial::setNormalID(this, current_normal_map);
- LLSelectMgr::getInstance()->selectionSetBumpmap( bump, bumpytexture_ctrl->getImageItemID() );
+ LLSelectMgr::getInstance()->selectionSetBumpmap( bump, mBumpyTextureCtrl->getImageItemID() );
}
void LLPanelFace::sendTexGen()
{
- LLComboBox* mComboTexGen = getChild<LLComboBox>("combobox texgen");
- if(!mComboTexGen)return;
- U8 tex_gen = (U8) mComboTexGen->getCurrentIndex() << TEM_TEX_GEN_SHIFT;
- LLSelectMgr::getInstance()->selectionSetTexGen( tex_gen );
+ U8 tex_gen = (U8)mComboTexGen->getCurrentIndex() << TEM_TEX_GEN_SHIFT;
+ LLSelectMgr::getInstance()->selectionSetTexGen(tex_gen);
}
void LLPanelFace::sendShiny(U32 shininess)
{
- LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
-
if (shininess < SHINY_TEXTURE)
-{
- texture_ctrl->clear();
- texture_ctrl->setImageAssetID(LLUUID());
+ {
+ mShinyTextureCtrl->clear();
+ mShinyTextureCtrl->setImageAssetID(LLUUID());
}
LLUUID specmap = getCurrentSpecularMap();
U8 shiny = (U8) shininess & TEM_SHINY_MASK;
if (!specmap.isNull())
+ {
shiny = 0;
+ }
LLSelectedTEMaterial::setSpecularID(this, specmap);
- LLSelectMgr::getInstance()->selectionSetShiny( shiny, texture_ctrl->getImageItemID() );
+ LLSelectMgr::getInstance()->selectionSetShiny(shiny, mShinyTextureCtrl->getImageItemID());
updateShinyControls(!specmap.isNull(), true);
-
}
void LLPanelFace::sendFullbright()
{
- LLCheckBoxCtrl* mCheckFullbright = getChild<LLCheckBoxCtrl>("checkbox fullbright");
- if(!mCheckFullbright)return;
U8 fullbright = mCheckFullbright->get() ? TEM_FULLBRIGHT_MASK : 0;
- LLSelectMgr::getInstance()->selectionSetFullbright( fullbright );
+ LLSelectMgr::getInstance()->selectionSetFullbright(fullbright);
}
void LLPanelFace::sendColor()
{
-
- LLColorSwatchCtrl* mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
- if(!mColorSwatch)return;
LLColor4 color = mColorSwatch->get();
-
- LLSelectMgr::getInstance()->selectionSetColorOnly( color );
+ LLSelectMgr::getInstance()->selectionSetColorOnly(color);
}
void LLPanelFace::sendAlpha()
{
- LLSpinCtrl* mCtrlColorTransp = getChild<LLSpinCtrl>("ColorTrans");
- if(!mCtrlColorTransp)return;
F32 alpha = (100.f - mCtrlColorTransp->get()) / 100.f;
-
LLSelectMgr::getInstance()->selectionSetAlphaOnly( alpha );
}
-
void LLPanelFace::sendGlow()
{
- LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow");
- llassert(mCtrlGlow);
- if (mCtrlGlow)
- {
- F32 glow = mCtrlGlow->get();
- LLSelectMgr::getInstance()->selectionSetGlow( glow );
- }
+ F32 glow = mCtrlGlow->get();
+ LLSelectMgr::getInstance()->selectionSetGlow(glow);
}
struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
@@ -655,47 +611,49 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
LLPanelFaceSetTEFunctor(LLPanelFace* panel) : mPanel(panel) {}
virtual bool apply(LLViewerObject* object, S32 te)
{
- bool valid;
- F32 value;
- std::string prefix;
+ LLSpinCtrl *ctrlTexScaleS, *ctrlTexScaleT, *ctrlTexOffsetS, *ctrlTexOffsetT, *ctrlTexRotation;
// Effectively the same as MATMEDIA_PBR sans using different radio,
// separate for the sake of clarity
- LLRadioGroup * radio_mat_type = mPanel->getChild<LLRadioGroup>("radio_material_type");
- switch (radio_mat_type->getSelectedIndex())
+ switch (mPanel->mRadioMaterialType->getSelectedIndex())
{
case MATTYPE_DIFFUSE:
- prefix = "Tex";
+ ctrlTexScaleS = mPanel->mTexScaleU;
+ ctrlTexScaleT = mPanel->mTexScaleV;
+ ctrlTexOffsetS = mPanel->mTexOffsetU;
+ ctrlTexOffsetT = mPanel->mTexOffsetV;
+ ctrlTexRotation = mPanel->mTexRotate;
break;
case MATTYPE_NORMAL:
- prefix = "bumpy";
+ ctrlTexScaleS = mPanel->mBumpyScaleU;
+ ctrlTexScaleT = mPanel->mBumpyScaleV;
+ ctrlTexOffsetS = mPanel->mBumpyOffsetU;
+ ctrlTexOffsetT = mPanel->mBumpyOffsetV;
+ ctrlTexRotation = mPanel->mBumpyRotate;
break;
case MATTYPE_SPECULAR:
- prefix = "shiny";
+ ctrlTexScaleS = mPanel->mShinyScaleU;
+ ctrlTexScaleT = mPanel->mShinyScaleV;
+ ctrlTexOffsetS = mPanel->mShinyOffsetU;
+ ctrlTexOffsetT = mPanel->mShinyOffsetV;
+ ctrlTexRotation = mPanel->mShinyRotate;
break;
+ default:
+ llassert(false);
+ return false;
}
- LLSpinCtrl * ctrlTexScaleS = mPanel->getChild<LLSpinCtrl>(prefix + "ScaleU");
- LLSpinCtrl * ctrlTexScaleT = mPanel->getChild<LLSpinCtrl>(prefix + "ScaleV");
- LLSpinCtrl * ctrlTexOffsetS = mPanel->getChild<LLSpinCtrl>(prefix + "OffsetU");
- LLSpinCtrl * ctrlTexOffsetT = mPanel->getChild<LLSpinCtrl>(prefix + "OffsetV");
- LLSpinCtrl * ctrlTexRotation = mPanel->getChild<LLSpinCtrl>(prefix + "Rot");
+ bool align_planar = mPanel->mPlanarAlign->get();
- LLComboBox* comboTexGen = mPanel->getChild<LLComboBox>("combobox texgen");
- LLCheckBoxCtrl* cb_planar_align = mPanel->getChild<LLCheckBoxCtrl>("checkbox planar align");
- bool align_planar = (cb_planar_align && cb_planar_align->get());
-
- llassert(comboTexGen);
llassert(object);
if (ctrlTexScaleS)
{
- valid = !ctrlTexScaleS->getTentative(); // || !checkFlipScaleS->getTentative();
+ bool valid = !ctrlTexScaleS->getTentative(); // || !checkFlipScaleS->getTentative();
if (valid || align_planar)
{
- value = ctrlTexScaleS->get();
- if (comboTexGen &&
- comboTexGen->getCurrentIndex() == 1)
+ F32 value = ctrlTexScaleS->get();
+ if (mPanel->mComboTexGen->getCurrentIndex() == 1)
{
value *= 0.5f;
}
@@ -711,20 +669,19 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
if (ctrlTexScaleT)
{
- valid = !ctrlTexScaleT->getTentative(); // || !checkFlipScaleT->getTentative();
+ bool valid = !ctrlTexScaleT->getTentative(); // || !checkFlipScaleT->getTentative();
if (valid || align_planar)
{
- value = ctrlTexScaleT->get();
- //if( checkFlipScaleT->get() )
+ F32 value = ctrlTexScaleT->get();
+ //if (checkFlipScaleT->get())
//{
// value = -value;
//}
- if (comboTexGen &&
- comboTexGen->getCurrentIndex() == 1)
+ if (mPanel->mComboTexGen->getCurrentIndex() == 1)
{
value *= 0.5f;
}
- object->setTEScaleT( te, value );
+ object->setTEScaleT(te, value);
if (align_planar)
{
@@ -736,11 +693,11 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
if (ctrlTexOffsetS)
{
- valid = !ctrlTexOffsetS->getTentative();
+ bool valid = !ctrlTexOffsetS->getTentative();
if (valid || align_planar)
{
- value = ctrlTexOffsetS->get();
- object->setTEOffsetS( te, value );
+ F32 value = ctrlTexOffsetS->get();
+ object->setTEOffsetS(te, value);
if (align_planar)
{
@@ -752,11 +709,11 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
if (ctrlTexOffsetT)
{
- valid = !ctrlTexOffsetT->getTentative();
+ bool valid = !ctrlTexOffsetT->getTentative();
if (valid || align_planar)
{
- value = ctrlTexOffsetT->get();
- object->setTEOffsetT( te, value );
+ F32 value = ctrlTexOffsetT->get();
+ object->setTEOffsetT(te, value);
if (align_planar)
{
@@ -768,11 +725,11 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
if (ctrlTexRotation)
{
- valid = !ctrlTexRotation->getTentative();
+ bool valid = !ctrlTexRotation->getTentative();
if (valid || align_planar)
{
- value = ctrlTexRotation->get() * DEG_TO_RAD;
- object->setTERotation( te, value );
+ F32 value = ctrlTexRotation->get() * DEG_TO_RAD;
+ object->setTERotation(te, value);
if (align_planar)
{
@@ -781,6 +738,7 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
}
}
}
+
return true;
}
private:
@@ -937,7 +895,7 @@ struct LLPanelFaceGetIsAlignedTEFunctor : public LLSelectedTEFunctor
LLVector2 aligned_st_offset, aligned_st_scale;
F32 aligned_st_rot;
- if ( facep->calcAlignedPlanarTE(mCenterFace, &aligned_st_offset, &aligned_st_scale, &aligned_st_rot) )
+ if (facep->calcAlignedPlanarTE(mCenterFace, &aligned_st_offset, &aligned_st_scale, &aligned_st_rot))
{
const LLTextureEntry* tep = facep->getTextureEntry();
LLVector2 st_offset, st_scale;
@@ -978,7 +936,7 @@ struct LLPanelFaceSendFunctor : public LLSelectedObjectFunctor
void LLPanelFace::sendTextureInfo()
{
- if ((bool)childGetValue("checkbox planar align").asBoolean())
+ if (mPlanarAlign->getValue().asBoolean())
{
LLFace* last_face = NULL;
bool identical_face =false;
@@ -996,14 +954,13 @@ void LLPanelFace::sendTextureInfo()
LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc);
}
-void LLPanelFace::alignTestureLayer()
+void LLPanelFace::alignTextureLayer()
{
LLFace* last_face = NULL;
bool identical_face = false;
LLSelectedTE::getFace(last_face, identical_face);
- LLRadioGroup * radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
- LLPanelFaceSetAlignedConcreteTEFunctor setfunc(this, last_face, static_cast<LLRender::eTexIndex>(radio_mat_type->getSelectedIndex()));
+ LLPanelFaceSetAlignedConcreteTEFunctor setfunc(this, last_face, static_cast<LLRender::eTexIndex>(mRadioMaterialType->getSelectedIndex()));
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
}
@@ -1031,7 +988,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
const bool has_material = !has_pbr_material;
// only turn on auto-adjust button if there is a media renderer and the media is loaded
- childSetEnabled("button align", editable);
+ mBtnAlign->setEnabled(editable);
if (mComboMatMedia->getCurrentIndex() < MATMEDIA_MATERIAL)
{
@@ -1055,10 +1012,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bool identical_norm = false;
bool identical_spec = false;
- LLTextureCtrl *texture_ctrl = getChild<LLTextureCtrl>("texture control");
- LLTextureCtrl *shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
- LLTextureCtrl *bumpytexture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
-
LLUUID id;
LLUUID normmap_id;
LLUUID specmap_id;
@@ -1122,117 +1075,90 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
mComboMatMedia->setEnabled(editable);
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
- if (radio_mat_type->getSelectedIndex() < MATTYPE_DIFFUSE)
+ if (mRadioMaterialType->getSelectedIndex() < MATTYPE_DIFFUSE)
{
- radio_mat_type->selectNthItem(MATTYPE_DIFFUSE);
+ mRadioMaterialType->selectNthItem(MATTYPE_DIFFUSE);
}
- radio_mat_type->setEnabled(editable);
+ mRadioMaterialType->setEnabled(editable);
- LLRadioGroup* radio_pbr_type = getChild<LLRadioGroup>("radio_pbr_type");
- if (radio_pbr_type->getSelectedIndex() < PBRTYPE_RENDER_MATERIAL_ID)
+ if (mRadioPbrType->getSelectedIndex() < PBRTYPE_RENDER_MATERIAL_ID)
{
- radio_pbr_type->selectNthItem(PBRTYPE_RENDER_MATERIAL_ID);
+ mRadioPbrType->selectNthItem(PBRTYPE_RENDER_MATERIAL_ID);
}
- radio_pbr_type->setEnabled(editable);
+ mRadioPbrType->setEnabled(editable);
const bool pbr_selected = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR;
- const bool texture_info_selected = pbr_selected && radio_pbr_type->getSelectedIndex() != PBRTYPE_RENDER_MATERIAL_ID;
+ const bool texture_info_selected = pbr_selected && mRadioPbrType->getSelectedIndex() != PBRTYPE_RENDER_MATERIAL_ID;
- getChildView("checkbox_sync_settings")->setEnabled(editable);
- childSetValue("checkbox_sync_settings", gSavedSettings.getBOOL("SyncMaterialSettings"));
+ mCheckSyncSettings->setEnabled(editable);
+ mCheckSyncSettings->setValue(gSavedSettings.getBOOL("SyncMaterialSettings"));
updateVisibility(objectp);
// Color swatch
- {
- getChildView("color label")->setEnabled(editable);
- }
- LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>("colorswatch");
-
+ mLabelColor->setEnabled(editable);
LLColor4 color = LLColor4::white;
bool identical_color = false;
- if (color_swatch)
- {
- LLSelectedTE::getColor(color, identical_color);
- LLColor4 prev_color = color_swatch->get();
-
- color_swatch->setOriginal(color);
- color_swatch->set(color, force_set_values || (prev_color != color) || !editable);
-
- color_swatch->setValid(editable && !has_pbr_material);
- color_swatch->setEnabled( editable && !has_pbr_material);
- color_swatch->setCanApplyImmediately( editable && !has_pbr_material);
- }
+ LLSelectedTE::getColor(color, identical_color);
+ LLColor4 prev_color = mColorSwatch->get();
+ mColorSwatch->setOriginal(color);
+ mColorSwatch->set(color, force_set_values || (prev_color != color) || !editable);
+ mColorSwatch->setValid(editable && !has_pbr_material);
+ mColorSwatch->setEnabled( editable && !has_pbr_material);
+ mColorSwatch->setCanApplyImmediately( editable && !has_pbr_material);
// Color transparency
- getChildView("color trans")->setEnabled(editable);
+ mLabelColorTransp->setEnabled(editable);
F32 transparency = (1.f - color.mV[VALPHA]) * 100.f;
- getChild<LLUICtrl>("ColorTrans")->setValue(editable ? transparency : 0);
- getChildView("ColorTrans")->setEnabled(editable && has_material);
+ mCtrlColorTransp->setValue(editable ? transparency : 0);
+ mCtrlColorTransp->setEnabled(editable && has_material);
+ // Shiny
U8 shiny = 0;
- bool identical_shiny = false;
+ {
+ bool identical_shiny = false;
- // Shiny
- LLSelectedTE::getShiny(shiny, identical_shiny);
- identical = identical && identical_shiny;
+ LLSelectedTE::getShiny(shiny, identical_shiny);
+ identical = identical && identical_shiny;
- shiny = specmap_id.isNull() ? shiny : SHINY_TEXTURE;
+ shiny = specmap_id.isNull() ? shiny : SHINY_TEXTURE;
- LLCtrlSelectionInterface* combobox_shininess = childGetSelectionInterface("combobox shininess");
- if (combobox_shininess)
- {
- combobox_shininess->selectNthItem((S32)shiny);
- }
+ mComboShininess->getSelectionInterface()->selectNthItem((S32)shiny);
- getChildView("label shininess")->setEnabled(editable);
- getChildView("combobox shininess")->setEnabled(editable);
+ mLabelShininess->setEnabled(editable);
+ mComboShininess->setEnabled(editable);
- getChildView("label glossiness")->setEnabled(editable);
- getChildView("glossiness")->setEnabled(editable);
+ mLabelGlossiness->setEnabled(editable);
+ mGlossiness->setEnabled(editable);
- getChildView("label environment")->setEnabled(editable);
- getChildView("environment")->setEnabled(editable);
- getChildView("label shinycolor")->setEnabled(editable);
+ mLabelEnvironment->setEnabled(editable);
+ mEnvironment->setEnabled(editable);
+ mLabelShiniColor->setEnabled(editable);
- getChild<LLUICtrl>("combobox shininess")->setTentative(!identical_spec);
- getChild<LLUICtrl>("glossiness")->setTentative(!identical_spec);
- getChild<LLUICtrl>("environment")->setTentative(!identical_spec);
- getChild<LLUICtrl>("shinycolorswatch")->setTentative(!identical_spec);
+ mComboShininess->setTentative(!identical_spec);
+ mGlossiness->setTentative(!identical_spec);
+ mEnvironment->setTentative(!identical_spec);
+ mShinyColorSwatch->setTentative(!identical_spec);
- LLColorSwatchCtrl* mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch");
- if (mShinyColorSwatch)
- {
mShinyColorSwatch->setValid(editable);
- mShinyColorSwatch->setEnabled( editable );
- mShinyColorSwatch->setCanApplyImmediately( editable );
+ mShinyColorSwatch->setEnabled(editable);
+ mShinyColorSwatch->setCanApplyImmediately(editable);
}
- U8 bumpy = 0;
// Bumpy
+ U8 bumpy = 0;
{
bool identical_bumpy = false;
- LLSelectedTE::getBumpmap(bumpy,identical_bumpy);
+ LLSelectedTE::getBumpmap(bumpy, identical_bumpy);
LLUUID norm_map_id = getCurrentNormalMap();
- LLCtrlSelectionInterface* combobox_bumpiness = childGetSelectionInterface("combobox bumpiness");
-
bumpy = norm_map_id.isNull() ? bumpy : BUMPY_TEXTURE;
+ mComboBumpiness->getSelectionInterface()->selectNthItem((S32)bumpy);
- if (combobox_bumpiness)
- {
- combobox_bumpiness->selectNthItem((S32)bumpy);
- }
- else
- {
- LL_WARNS() << "failed childGetSelectionInterface for 'combobox bumpiness'" << LL_ENDL;
- }
-
- getChildView("combobox bumpiness")->setEnabled(editable);
- getChild<LLUICtrl>("combobox bumpiness")->setTentative(!identical_bumpy);
- getChildView("label bumpiness")->setEnabled(editable);
+ mComboBumpiness->setEnabled(editable);
+ mComboBumpiness->setTentative(!identical_bumpy);
+ mLabelBumpiness->setEnabled(editable);
}
// Texture
@@ -1270,7 +1196,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (LLViewerMedia::getInstance()->textureHasMedia(id))
{
- getChildView("button align")->setEnabled(editable);
+ mBtnAlign->setEnabled(editable);
}
// Diffuse Alpha Mode
@@ -1285,68 +1211,60 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
//
LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(alpha_mode, identical_alpha_mode, mIsAlpha);
- LLCtrlSelectionInterface* combobox_alphamode = childGetSelectionInterface("combobox alphamode");
- if (combobox_alphamode)
- {
- //it is invalid to have any alpha mode other than blend if transparency is greater than zero ...
- // Want masking? Want emissive? Tough! You get BLEND!
- alpha_mode = (transparency > 0.f) ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : alpha_mode;
+ // it is invalid to have any alpha mode other than blend if transparency is greater than zero ...
+ // Want masking? Want emissive? Tough! You get BLEND!
+ alpha_mode = (transparency > 0.f) ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : alpha_mode;
- // ... unless there is no alpha channel in the texture, in which case alpha mode MUST be none
- alpha_mode = mIsAlpha ? alpha_mode : LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
+ // ... unless there is no alpha channel in the texture, in which case alpha mode MUST be none
+ alpha_mode = mIsAlpha ? alpha_mode : LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
- combobox_alphamode->selectNthItem(alpha_mode);
- }
- else
- {
- LL_WARNS() << "failed childGetSelectionInterface for 'combobox alphamode'" << LL_ENDL;
- }
+ mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode);
updateAlphaControls();
- if (texture_ctrl)
+ if (mTextureCtrl)
{
if (identical_diffuse)
{
- texture_ctrl->setTentative(false);
- texture_ctrl->setEnabled(editable && !has_pbr_material);
- texture_ctrl->setImageAssetID(id);
+ mTextureCtrl->setTentative(false);
+ mTextureCtrl->setEnabled(editable && !has_pbr_material);
+ mTextureCtrl->setImageAssetID(id);
bool can_change_alpha = editable && mIsAlpha && !missing_asset && !has_pbr_material;
- getChildView("combobox alphamode")->setEnabled(can_change_alpha && transparency <= 0.f);
- getChildView("label alphamode")->setEnabled(can_change_alpha);
- getChildView("maskcutoff")->setEnabled(can_change_alpha);
- getChildView("label maskcutoff")->setEnabled(can_change_alpha);
+ mComboAlphaMode->setEnabled(can_change_alpha && transparency <= 0.f);
+ mLabelAlphaMode->setEnabled(can_change_alpha);
+ mMaskCutoff->setEnabled(can_change_alpha);
+ mLabelMaskCutoff->setEnabled(can_change_alpha);
- texture_ctrl->setBakeTextureEnabled(true);
+ mTextureCtrl->setBakeTextureEnabled(true);
}
else if (id.isNull())
{
// None selected
- texture_ctrl->setTentative(false);
- texture_ctrl->setEnabled(false);
- texture_ctrl->setImageAssetID(LLUUID::null);
- getChildView("combobox alphamode")->setEnabled(false);
- getChildView("label alphamode")->setEnabled(false);
- getChildView("maskcutoff")->setEnabled(false);
- getChildView("label maskcutoff")->setEnabled(false);
-
- texture_ctrl->setBakeTextureEnabled(false);
+ mTextureCtrl->setTentative(false);
+ mTextureCtrl->setEnabled(false);
+ mTextureCtrl->setImageAssetID(LLUUID::null);
+ mComboAlphaMode->setEnabled(false);
+ mLabelAlphaMode->setEnabled(false);
+ mMaskCutoff->setEnabled(false);
+ mLabelMaskCutoff->setEnabled(false);
+
+ mTextureCtrl->setBakeTextureEnabled(false);
}
else
{
// Tentative: multiple selected with different textures
- texture_ctrl->setTentative(true);
- texture_ctrl->setEnabled(editable && !has_pbr_material);
- texture_ctrl->setImageAssetID(id);
+ mTextureCtrl->setTentative(true);
+ mTextureCtrl->setEnabled(editable && !has_pbr_material);
+ mTextureCtrl->setImageAssetID(id);
bool can_change_alpha = editable && mIsAlpha && !missing_asset && !has_pbr_material;
- getChildView("combobox alphamode")->setEnabled(can_change_alpha && transparency <= 0.f);
- getChildView("label alphamode")->setEnabled(can_change_alpha);
- getChildView("maskcutoff")->setEnabled(can_change_alpha);
- getChildView("label maskcutoff")->setEnabled(can_change_alpha);
+ mComboAlphaMode->setEnabled(can_change_alpha && transparency <= 0.f);
+ mLabelAlphaMode->setEnabled(can_change_alpha);
+ mMaskCutoff->setEnabled(can_change_alpha);
+ mLabelMaskCutoff->setEnabled(can_change_alpha);
- texture_ctrl->setBakeTextureEnabled(true);
+ mTextureCtrl->setBakeTextureEnabled(true);
}
if (attachment)
@@ -1354,70 +1272,66 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
// attachments are in world and in inventory,
// server doesn't support changing permissions
// in such case
- texture_ctrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ mTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
}
else
{
- texture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ mTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
}
}
- if (shinytexture_ctrl)
+ if (mShinyTextureCtrl)
{
- shinytexture_ctrl->setTentative( !identical_spec );
- shinytexture_ctrl->setEnabled( editable && !has_pbr_material);
- shinytexture_ctrl->setImageAssetID( specmap_id );
+ mShinyTextureCtrl->setTentative(!identical_spec);
+ mShinyTextureCtrl->setEnabled(editable && !has_pbr_material);
+ mShinyTextureCtrl->setImageAssetID(specmap_id);
if (attachment)
{
- shinytexture_ctrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ mShinyTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
}
else
{
- shinytexture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ mShinyTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
}
}
- if (bumpytexture_ctrl)
+ if (mBumpyTextureCtrl)
{
- bumpytexture_ctrl->setTentative( !identical_norm );
- bumpytexture_ctrl->setEnabled( editable && !has_pbr_material);
- bumpytexture_ctrl->setImageAssetID( normmap_id );
+ mBumpyTextureCtrl->setTentative(!identical_norm);
+ mBumpyTextureCtrl->setEnabled(editable && !has_pbr_material);
+ mBumpyTextureCtrl->setImageAssetID(normmap_id);
if (attachment)
{
- bumpytexture_ctrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ mBumpyTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
}
else
{
- bumpytexture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ mBumpyTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
}
}
}
// planar align
- bool align_planar = false;
+ bool align_planar = mPlanarAlign->get();
bool identical_planar_aligned = false;
- {
- LLCheckBoxCtrl* cb_planar_align = getChild<LLCheckBoxCtrl>("checkbox planar align");
- align_planar = (cb_planar_align && cb_planar_align->get());
- bool enabled = (editable && isIdenticalPlanarTexgen() && !texture_info_selected);
- childSetValue("checkbox planar align", align_planar && enabled);
- childSetVisible("checkbox planar align", enabled);
- childSetEnabled("checkbox planar align", enabled);
- childSetEnabled("button align textures", enabled && LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 1);
+ bool enabled = (editable && isIdenticalPlanarTexgen() && !texture_info_selected);
+ mPlanarAlign->setValue(align_planar && enabled);
+ mPlanarAlign->setVisible(enabled);
+ mPlanarAlign->setEnabled(enabled);
+ mBtnAlignTex->setEnabled(enabled && LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 1);
- if (align_planar && enabled)
- {
- LLFace* last_face = NULL;
- bool identical_face = false;
- LLSelectedTE::getFace(last_face, identical_face);
+ if (align_planar && enabled)
+ {
+ LLFace* last_face = NULL;
+ bool identical_face = false;
+ LLSelectedTE::getFace(last_face, identical_face);
- LLPanelFaceGetIsAlignedTEFunctor get_is_aligend_func(last_face);
- // this will determine if the texture param controls are tentative:
- identical_planar_aligned = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&get_is_aligend_func);
- }
+ LLPanelFaceGetIsAlignedTEFunctor get_is_aligend_func(last_face);
+ // this will determine if the texture param controls are tentative:
+ identical_planar_aligned = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&get_is_aligend_func);
}
// Needs to be public and before tex scale settings below to properly reflect
@@ -1428,10 +1342,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bool identical_texgen = true;
bool identical_planar_texgen = false;
- {
- LLSelectedTE::getTexGen(selected_texgen, identical_texgen);
- identical_planar_texgen = (identical_texgen && (selected_texgen == LLTextureEntry::TEX_GEN_PLANAR));
- }
+ LLSelectedTE::getTexGen(selected_texgen, identical_texgen);
+ identical_planar_texgen = (identical_texgen && (selected_texgen == LLTextureEntry::TEX_GEN_PLANAR));
// Texture scale
{
@@ -1458,21 +1370,21 @@ 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;
- getChild<LLUICtrl>("TexScaleU")->setValue(diff_scale_s);
- getChild<LLUICtrl>("shinyScaleU")->setValue(spec_scale_s);
- getChild<LLUICtrl>("bumpyScaleU")->setValue(norm_scale_s);
+ mTexScaleU->setValue(diff_scale_s);
+ mShinyScaleU->setValue(spec_scale_s);
+ mBumpyScaleU->setValue(norm_scale_s);
- getChildView("TexScaleU")->setEnabled(editable && has_material);
- getChildView("shinyScaleU")->setEnabled(editable && has_material && specmap_id.notNull());
- getChildView("bumpyScaleU")->setEnabled(editable && has_material && normmap_id.notNull());
+ mTexScaleU->setEnabled(editable && has_material);
+ mShinyScaleU->setEnabled(editable && has_material && specmap_id.notNull());
+ mBumpyScaleU->setEnabled(editable && has_material && normmap_id.notNull());
bool diff_scale_tentative = !(identical && identical_diff_scale_s);
bool norm_scale_tentative = !(identical && identical_norm_scale_s);
bool spec_scale_tentative = !(identical && identical_spec_scale_s);
- getChild<LLUICtrl>("TexScaleU")->setTentative( LLSD(diff_scale_tentative));
- getChild<LLUICtrl>("shinyScaleU")->setTentative(LLSD(spec_scale_tentative));
- getChild<LLUICtrl>("bumpyScaleU")->setTentative(LLSD(norm_scale_tentative));
+ mTexScaleU->setTentative(LLSD(diff_scale_tentative));
+ mShinyScaleU->setTentative(LLSD(spec_scale_tentative));
+ mBumpyScaleU->setTentative(LLSD(norm_scale_tentative));
}
{
@@ -1501,24 +1413,24 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bool norm_scale_tentative = !identical_norm_scale_t;
bool spec_scale_tentative = !identical_spec_scale_t;
- getChildView("TexScaleV")->setEnabled(editable && has_material);
- getChildView("shinyScaleV")->setEnabled(editable && has_material && specmap_id.notNull());
- getChildView("bumpyScaleV")->setEnabled(editable && has_material && normmap_id.notNull());
+ mTexScaleV->setEnabled(editable && has_material);
+ mShinyScaleV->setEnabled(editable && has_material && specmap_id.notNull());
+ mBumpyScaleV->setEnabled(editable && has_material && normmap_id.notNull());
if (force_set_values)
{
- getChild<LLSpinCtrl>("TexScaleV")->forceSetValue(diff_scale_t);
+ mTexScaleV->forceSetValue(diff_scale_t);
}
else
{
- getChild<LLSpinCtrl>("TexScaleV")->setValue(diff_scale_t);
+ mTexScaleV->setValue(diff_scale_t);
}
- getChild<LLUICtrl>("shinyScaleV")->setValue(norm_scale_t);
- getChild<LLUICtrl>("bumpyScaleV")->setValue(spec_scale_t);
+ mShinyScaleV->setValue(spec_scale_t);
+ mBumpyScaleV->setValue(norm_scale_t);
- getChild<LLUICtrl>("TexScaleV")->setTentative(LLSD(diff_scale_tentative));
- getChild<LLUICtrl>("shinyScaleV")->setTentative(LLSD(norm_scale_tentative));
- getChild<LLUICtrl>("bumpyScaleV")->setTentative(LLSD(spec_scale_tentative));
+ mTexScaleV->setTentative(LLSD(diff_scale_tentative));
+ mShinyScaleV->setTentative(LLSD(spec_scale_tentative));
+ mBumpyScaleV->setTentative(LLSD(norm_scale_tentative));
}
// Texture offset
@@ -1539,17 +1451,17 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bool norm_offset_u_tentative = !(align_planar ? identical_planar_aligned : identical_norm_offset_s);
bool spec_offset_u_tentative = !(align_planar ? identical_planar_aligned : identical_spec_offset_s);
- getChild<LLUICtrl>("TexOffsetU")->setValue( editable ? diff_offset_s : 0.0f);
- getChild<LLUICtrl>("bumpyOffsetU")->setValue(editable ? norm_offset_s : 0.0f);
- getChild<LLUICtrl>("shinyOffsetU")->setValue(editable ? spec_offset_s : 0.0f);
+ mTexOffsetU->setValue(editable ? diff_offset_s : 0.0f);
+ mBumpyOffsetU->setValue(editable ? norm_offset_s : 0.0f);
+ mShinyOffsetU->setValue(editable ? spec_offset_s : 0.0f);
- getChild<LLUICtrl>("TexOffsetU")->setTentative(LLSD(diff_offset_u_tentative));
- getChild<LLUICtrl>("shinyOffsetU")->setTentative(LLSD(norm_offset_u_tentative));
- getChild<LLUICtrl>("bumpyOffsetU")->setTentative(LLSD(spec_offset_u_tentative));
+ mTexOffsetU->setTentative(LLSD(diff_offset_u_tentative));
+ mShinyOffsetU->setTentative(LLSD(spec_offset_u_tentative));
+ mBumpyOffsetU->setTentative(LLSD(norm_offset_u_tentative));
- getChildView("TexOffsetU")->setEnabled(editable && has_material);
- getChildView("shinyOffsetU")->setEnabled(editable && has_material && specmap_id.notNull());
- getChildView("bumpyOffsetU")->setEnabled(editable && has_material && normmap_id.notNull());
+ mTexOffsetU->setEnabled(editable && has_material);
+ mShinyOffsetU->setEnabled(editable && has_material && specmap_id.notNull());
+ mBumpyOffsetU->setEnabled(editable && has_material && normmap_id.notNull());
}
{
@@ -1569,17 +1481,17 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bool norm_offset_v_tentative = !(align_planar ? identical_planar_aligned : identical_norm_offset_t);
bool spec_offset_v_tentative = !(align_planar ? identical_planar_aligned : identical_spec_offset_t);
- getChild<LLUICtrl>("TexOffsetV")->setValue( editable ? diff_offset_t : 0.0f);
- getChild<LLUICtrl>("bumpyOffsetV")->setValue(editable ? norm_offset_t : 0.0f);
- getChild<LLUICtrl>("shinyOffsetV")->setValue(editable ? spec_offset_t : 0.0f);
+ mTexOffsetV->setValue( editable ? diff_offset_t : 0.0f);
+ mBumpyOffsetV->setValue(editable ? norm_offset_t : 0.0f);
+ mShinyOffsetV->setValue(editable ? spec_offset_t : 0.0f);
- getChild<LLUICtrl>("TexOffsetV")->setTentative(LLSD(diff_offset_v_tentative));
- getChild<LLUICtrl>("shinyOffsetV")->setTentative(LLSD(norm_offset_v_tentative));
- getChild<LLUICtrl>("bumpyOffsetV")->setTentative(LLSD(spec_offset_v_tentative));
+ mTexOffsetV->setTentative(LLSD(diff_offset_v_tentative));
+ mBumpyOffsetV->setTentative(LLSD(norm_offset_v_tentative));
+ mShinyOffsetV->setTentative(LLSD(spec_offset_v_tentative));
- getChildView("TexOffsetV")->setEnabled(editable && has_material);
- getChildView("shinyOffsetV")->setEnabled(editable && has_material && specmap_id.notNull());
- getChildView("bumpyOffsetV")->setEnabled(editable && has_material && normmap_id.notNull());
+ mTexOffsetV->setEnabled(editable && has_material);
+ mShinyOffsetV->setEnabled(editable && has_material && specmap_id.notNull());
+ mBumpyOffsetV->setEnabled(editable && has_material && normmap_id.notNull());
}
// Texture rotation
@@ -1592,9 +1504,9 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
F32 norm_rotation = 0.f;
F32 spec_rotation = 0.f;
- LLSelectedTE::getRotation(diff_rotation,identical_diff_rotation);
- LLSelectedTEMaterial::getSpecularRotation(spec_rotation,identical_spec_rotation);
- LLSelectedTEMaterial::getNormalRotation(norm_rotation,identical_norm_rotation);
+ LLSelectedTE::getRotation(diff_rotation, identical_diff_rotation);
+ LLSelectedTEMaterial::getSpecularRotation(spec_rotation, identical_spec_rotation);
+ LLSelectedTEMaterial::getNormalRotation(norm_rotation, identical_norm_rotation);
bool diff_rot_tentative = !(align_planar ? identical_planar_aligned : identical_diff_rotation);
bool norm_rot_tentative = !(align_planar ? identical_planar_aligned : identical_norm_rotation);
@@ -1604,55 +1516,47 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
F32 norm_rot_deg = norm_rotation * RAD_TO_DEG;
F32 spec_rot_deg = spec_rotation * RAD_TO_DEG;
- getChildView("TexRot")->setEnabled(editable && has_material);
- getChildView("shinyRot")->setEnabled(editable && has_material && specmap_id.notNull());
- getChildView("bumpyRot")->setEnabled(editable && has_material && normmap_id.notNull());
+ mTexRotate->setEnabled(editable && has_material);
+ mShinyRotate->setEnabled(editable && has_material && specmap_id.notNull());
+ mBumpyRotate->setEnabled(editable && has_material && normmap_id.notNull());
- getChild<LLUICtrl>("TexRot")->setTentative(diff_rot_tentative);
- getChild<LLUICtrl>("shinyRot")->setTentative(LLSD(norm_rot_tentative));
- getChild<LLUICtrl>("bumpyRot")->setTentative(LLSD(spec_rot_tentative));
+ mTexRotate->setTentative(LLSD(diff_rot_tentative));
+ mShinyRotate->setTentative(LLSD(spec_rot_tentative));
+ mBumpyRotate->setTentative(LLSD(norm_rot_tentative));
- getChild<LLUICtrl>("TexRot")->setValue( editable ? diff_rot_deg : 0.0f);
- getChild<LLUICtrl>("shinyRot")->setValue(editable ? spec_rot_deg : 0.0f);
- getChild<LLUICtrl>("bumpyRot")->setValue(editable ? norm_rot_deg : 0.0f);
+ mTexRotate->setValue(editable ? diff_rot_deg : 0.0f);
+ mShinyRotate->setValue(editable ? spec_rot_deg : 0.0f);
+ mBumpyRotate->setValue(editable ? norm_rot_deg : 0.0f);
}
{
F32 glow = 0.f;
bool identical_glow = false;
- LLSelectedTE::getGlow(glow,identical_glow);
- getChild<LLUICtrl>("glow")->setValue(glow);
- getChild<LLUICtrl>("glow")->setTentative(!identical_glow);
- getChildView("glow")->setEnabled(editable);
- getChildView("glow label")->setEnabled(editable);
+ LLSelectedTE::getGlow(glow, identical_glow);
+ mCtrlGlow->setValue(glow);
+ mCtrlGlow->setTentative(!identical_glow);
+ mCtrlGlow->setEnabled(editable);
+ mLabelGlow->setEnabled(editable);
}
{
- LLCtrlSelectionInterface* combobox_texgen = childGetSelectionInterface("combobox texgen");
- if (combobox_texgen)
- {
- // Maps from enum to combobox entry index
- combobox_texgen->selectNthItem(((S32)selected_texgen) >> 1);
- }
- else
- {
- LL_WARNS() << "failed childGetSelectionInterface for 'combobox texgen'" << LL_ENDL;
- }
+ // Maps from enum to combobox entry index
+ mComboTexGen->selectNthItem(((S32)selected_texgen) >> 1);
- getChildView("combobox texgen")->setEnabled(editable);
- getChild<LLUICtrl>("combobox texgen")->setTentative(!identical);
- getChildView("tex gen")->setEnabled(editable);
+ mComboTexGen->setEnabled(editable);
+ mComboTexGen->setTentative(!identical);
+ mLabelTexGen->setEnabled(editable);
}
{
U8 fullbright_flag = 0;
bool identical_fullbright = false;
- LLSelectedTE::getFullbright(fullbright_flag,identical_fullbright);
+ LLSelectedTE::getFullbright(fullbright_flag, identical_fullbright);
- getChild<LLUICtrl>("checkbox fullbright")->setValue((S32)(fullbright_flag != 0));
- getChildView("checkbox fullbright")->setEnabled(editable && !has_pbr_material);
- getChild<LLUICtrl>("checkbox fullbright")->setTentative(!identical_fullbright);
+ mCheckFullbright->setValue((S32)(fullbright_flag != 0));
+ mCheckFullbright->setEnabled(editable && !has_pbr_material);
+ mCheckFullbright->setTentative(!identical_fullbright);
mComboMatMedia->setEnabledByValue("Materials", !has_pbr_material);
}
@@ -1670,77 +1574,66 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats);
LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats);
- LLComboBox* mComboTexGen = getChild<LLComboBox>("combobox texgen");
- if (mComboTexGen)
{
S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0;
bool enabled = editable && (index != 1);
bool identical_repeats = true;
S32 material_selection = mComboMatMedia->getCurrentIndex();
- F32 repeats = 1.0f;
+ F32 repeats = 1.0f;
U32 material_type = MATTYPE_DIFFUSE;
if (material_selection == MATMEDIA_MATERIAL)
{
- material_type = radio_mat_type->getSelectedIndex();
+ material_type = mRadioMaterialType->getSelectedIndex();
}
else if (material_selection == MATMEDIA_PBR)
{
enabled = editable && has_pbr_material;
- material_type = radio_pbr_type->getSelectedIndex();
+ material_type = mRadioPbrType->getSelectedIndex();
}
switch (material_type)
{
default:
case MATTYPE_DIFFUSE:
- {
if (material_selection != MATMEDIA_PBR)
{
enabled = editable && !id.isNull();
}
identical_repeats = identical_diff_repeats;
repeats = repeats_diff;
- }
- break;
-
+ break;
case MATTYPE_SPECULAR:
- {
if (material_selection != MATMEDIA_PBR)
{
enabled = (editable && ((shiny == SHINY_TEXTURE) && !specmap_id.isNull()));
}
identical_repeats = identical_spec_repeats;
repeats = repeats_spec;
- }
- break;
-
+ break;
case MATTYPE_NORMAL:
- {
if (material_selection != MATMEDIA_PBR)
{
enabled = (editable && ((bumpy == BUMPY_TEXTURE) && !normmap_id.isNull()));
}
identical_repeats = identical_norm_repeats;
repeats = repeats_norm;
- }
- break;
+ break;
}
bool repeats_tentative = !identical_repeats;
- LLSpinCtrl* rpt_ctrl = getChild<LLSpinCtrl>("rptctrl");
if (force_set_values)
{
- //onCommit, previosly edited element updates related ones
- rpt_ctrl->forceSetValue(editable ? repeats : 1.0f);
+ // onCommit, previosly edited element updates related ones
+ mTexRepeat->forceSetValue(editable ? repeats : 1.0f);
}
else
{
- rpt_ctrl->setValue(editable ? repeats : 1.0f);
+ mTexRepeat->setValue(editable ? repeats : 1.0f);
}
- rpt_ctrl->setTentative(LLSD(repeats_tentative));
- rpt_ctrl->setEnabled(has_material && !identical_planar_texgen && enabled);
+ mTexRepeat->setTentative(LLSD(repeats_tentative));
+ mTexRepeat->setEnabled(has_material && !identical_planar_texgen && enabled);
}
}
@@ -1754,9 +1647,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LL_DEBUGS("Materials") << material->asLLSD() << LL_ENDL;
// Alpha
- LLCtrlSelectionInterface* combobox_alphamode =
- childGetSelectionInterface("combobox alphamode");
- if (combobox_alphamode)
{
U32 alpha_mode = material->getDiffuseAlphaMode();
@@ -1770,26 +1660,22 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
}
- combobox_alphamode->selectNthItem(alpha_mode);
+ mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode);
}
- else
- {
- LL_WARNS() << "failed childGetSelectionInterface for 'combobox alphamode'" << LL_ENDL;
- }
- getChild<LLUICtrl>("maskcutoff")->setValue(material->getAlphaMaskCutoff());
+
+ mMaskCutoff->setValue(material->getAlphaMaskCutoff());
updateAlphaControls();
identical_planar_texgen = isIdenticalPlanarTexgen();
// Shiny (specular)
F32 offset_x, offset_y, repeat_x, repeat_y, rot;
- LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
- texture_ctrl->setImageAssetID(material->getSpecularID());
+ mShinyTextureCtrl->setImageAssetID(material->getSpecularID());
if (!material->getSpecularID().isNull() && (shiny == SHINY_TEXTURE))
{
- material->getSpecularOffset(offset_x,offset_y);
- material->getSpecularRepeat(repeat_x,repeat_y);
+ material->getSpecularOffset(offset_x, offset_y);
+ material->getSpecularRepeat(repeat_x, repeat_y);
if (identical_planar_texgen)
{
@@ -1798,13 +1684,13 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
rot = material->getSpecularRotation();
- getChild<LLUICtrl>("shinyScaleU")->setValue(repeat_x);
- getChild<LLUICtrl>("shinyScaleV")->setValue(repeat_y);
- getChild<LLUICtrl>("shinyRot")->setValue(rot*RAD_TO_DEG);
- getChild<LLUICtrl>("shinyOffsetU")->setValue(offset_x);
- getChild<LLUICtrl>("shinyOffsetV")->setValue(offset_y);
- getChild<LLUICtrl>("glossiness")->setValue(material->getSpecularLightExponent());
- getChild<LLUICtrl>("environment")->setValue(material->getEnvironmentIntensity());
+ mShinyScaleU->setValue(repeat_x);
+ mShinyScaleV->setValue(repeat_y);
+ mShinyRotate->setValue(rot * RAD_TO_DEG);
+ mShinyOffsetU->setValue(offset_x);
+ mShinyOffsetV->setValue(offset_y);
+ mGlossiness->setValue(material->getSpecularLightExponent());
+ mEnvironment->setValue(material->getEnvironmentIntensity());
updateShinyControls(!material->getSpecularID().isNull(), true);
}
@@ -1814,17 +1700,15 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
//
if (!material->getSpecularID().isNull())
{
- LLColorSwatchCtrl* shiny_swatch = getChild<LLColorSwatchCtrl>("shinycolorswatch");
LLColor4 new_color = material->getSpecularLightColor();
- LLColor4 old_color = shiny_swatch->get();
+ LLColor4 old_color = mShinyColorSwatch->get();
- shiny_swatch->setOriginal(new_color);
- shiny_swatch->set(new_color, force_set_values || old_color != new_color || !editable);
+ mShinyColorSwatch->setOriginal(new_color);
+ mShinyColorSwatch->set(new_color, force_set_values || old_color != new_color || !editable);
}
// Bumpy (normal)
- texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
- texture_ctrl->setImageAssetID(material->getNormalID());
+ mBumpyTextureCtrl->setImageAssetID(material->getNormalID());
if (!material->getNormalID().isNull())
{
@@ -1838,29 +1722,30 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
rot = material->getNormalRotation();
- getChild<LLUICtrl>("bumpyScaleU")->setValue(repeat_x);
- getChild<LLUICtrl>("bumpyScaleV")->setValue(repeat_y);
- getChild<LLUICtrl>("bumpyRot")->setValue(rot*RAD_TO_DEG);
- getChild<LLUICtrl>("bumpyOffsetU")->setValue(offset_x);
- getChild<LLUICtrl>("bumpyOffsetV")->setValue(offset_y);
+ mBumpyScaleU->setValue(repeat_x);
+ mBumpyScaleV->setValue(repeat_y);
+ mBumpyRotate->setValue(rot*RAD_TO_DEG);
+ mBumpyOffsetU->setValue(offset_x);
+ mBumpyOffsetV->setValue(offset_y);
updateBumpyControls(!material->getNormalID().isNull(), true);
}
}
}
+
S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
bool single_volume = (selected_count == 1);
mMenuClipboardColor->setEnabled(editable && single_volume);
// Set variable values for numeric expressions
LLCalc* calcp = LLCalc::getInstance();
- calcp->setVar(LLCalc::TEX_U_SCALE, childGetValue("TexScaleU").asReal());
- calcp->setVar(LLCalc::TEX_V_SCALE, childGetValue("TexScaleV").asReal());
- calcp->setVar(LLCalc::TEX_U_OFFSET, childGetValue("TexOffsetU").asReal());
- calcp->setVar(LLCalc::TEX_V_OFFSET, childGetValue("TexOffsetV").asReal());
- calcp->setVar(LLCalc::TEX_ROTATION, childGetValue("TexRot").asReal());
- calcp->setVar(LLCalc::TEX_TRANSPARENCY, childGetValue("ColorTrans").asReal());
- calcp->setVar(LLCalc::TEX_GLOW, childGetValue("glow").asReal());
+ calcp->setVar(LLCalc::TEX_U_SCALE, (F32)mTexScaleU->getValue().asReal());
+ calcp->setVar(LLCalc::TEX_V_SCALE, (F32)mTexScaleV->getValue().asReal());
+ calcp->setVar(LLCalc::TEX_U_OFFSET, (F32)mTexOffsetU->getValue().asReal());
+ calcp->setVar(LLCalc::TEX_V_OFFSET, (F32)mTexOffsetV->getValue().asReal());
+ calcp->setVar(LLCalc::TEX_ROTATION, (F32)mTexRotate->getValue().asReal());
+ calcp->setVar(LLCalc::TEX_TRANSPARENCY, (F32)mCtrlColorTransp->getValue().asReal());
+ calcp->setVar(LLCalc::TEX_GLOW, (F32)mCtrlGlow->getValue().asReal());
}
else
{
@@ -1868,40 +1753,39 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
clearCtrls();
// Disable non-UICtrls
- LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
- if (pbr_ctrl)
+ if (mPBRTextureCtrl)
{
- pbr_ctrl->setImageAssetID(LLUUID::null);
- pbr_ctrl->setEnabled(false);
+ mPBRTextureCtrl->setImageAssetID(LLUUID::null);
+ mPBRTextureCtrl->setEnabled(false);
}
- LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control");
- if (texture_ctrl)
+
+ if (mTextureCtrl)
{
- texture_ctrl->setImageAssetID( LLUUID::null );
- texture_ctrl->setEnabled( false ); // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl.
-// texture_ctrl->setValid(false);
+ mTextureCtrl->setImageAssetID( LLUUID::null );
+ mTextureCtrl->setEnabled( false ); // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl.
+// mTextureCtrl->setValid(false);
}
- LLColorSwatchCtrl* mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
+
if (mColorSwatch)
{
mColorSwatch->setEnabled( false );
mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") );
mColorSwatch->setValid(false);
}
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
- if (radio_mat_type)
+
+ if (mRadioMaterialType)
{
- radio_mat_type->setSelectedIndex(0);
+ mRadioMaterialType->setSelectedIndex(0);
}
- getChildView("color trans")->setEnabled(false);
- getChildView("rptctrl")->setEnabled(false);
- getChildView("tex gen")->setEnabled(false);
- getChildView("label shininess")->setEnabled(false);
- getChildView("label bumpiness")->setEnabled(false);
- getChildView("button align")->setEnabled(false);
- getChildView("pbr_from_inventory")->setEnabled(false);
- getChildView("edit_selected_pbr")->setEnabled(false);
- getChildView("save_selected_pbr")->setEnabled(false);
+ mLabelColorTransp->setEnabled(false);
+ mTexRepeat->setEnabled(false);
+ mLabelTexGen->setEnabled(false);
+ mLabelShininess->setEnabled(false);
+ mLabelBumpiness->setEnabled(false);
+ mBtnAlign->setEnabled(false);
+ mBtnPbrFromInv->setEnabled(false);
+ mBtnEditBbr->setEnabled(false);
+ mBtnSaveBbr->setEnabled(false);
updateVisibility();
@@ -2005,29 +1889,28 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,
const bool saveable = LLMaterialEditor::canSaveObjectsMaterial();
// pbr material
- LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
LLUUID pbr_id;
- if (pbr_ctrl)
+ if (mPBRTextureCtrl)
{
LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr, has_pbr_material, has_faces_without_pbr);
- pbr_ctrl->setTentative(!identical_pbr);
- pbr_ctrl->setEnabled(settable);
- pbr_ctrl->setImageAssetID(pbr_id);
+ mPBRTextureCtrl->setTentative(!identical_pbr);
+ mPBRTextureCtrl->setEnabled(settable);
+ mPBRTextureCtrl->setImageAssetID(pbr_id);
if (objectp->isAttachment())
{
- pbr_ctrl->setFilterPermissionMasks(PERM_COPY | PERM_TRANSFER | PERM_MODIFY);
+ mPBRTextureCtrl->setFilterPermissionMasks(PERM_COPY | PERM_TRANSFER | PERM_MODIFY);
}
else
{
- pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ mPBRTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
}
}
- getChildView("pbr_from_inventory")->setEnabled(settable);
- getChildView("edit_selected_pbr")->setEnabled(editable && !has_faces_without_pbr);
- getChildView("save_selected_pbr")->setEnabled(saveable && identical_pbr);
+ mBtnPbrFromInv->setEnabled(settable);
+ mBtnEditBbr->setEnabled(editable && !has_faces_without_pbr);
+ mBtnSaveBbr->setEnabled(saveable && identical_pbr);
if (objectp->isInventoryPending())
{
// Reuse the same listener when possible
@@ -2057,17 +1940,11 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,
{
const bool new_state = has_pbr_capabilities && has_pbr_material && !has_faces_without_pbr;
- LLUICtrl* gltfCtrlTextureScaleU = getChild<LLUICtrl>("gltfTextureScaleU");
- LLUICtrl* gltfCtrlTextureScaleV = getChild<LLUICtrl>("gltfTextureScaleV");
- LLUICtrl* gltfCtrlTextureRotation = getChild<LLUICtrl>("gltfTextureRotation");
- LLUICtrl* gltfCtrlTextureOffsetU = getChild<LLUICtrl>("gltfTextureOffsetU");
- LLUICtrl* gltfCtrlTextureOffsetV = getChild<LLUICtrl>("gltfTextureOffsetV");
-
- gltfCtrlTextureScaleU->setEnabled(new_state);
- gltfCtrlTextureScaleV->setEnabled(new_state);
- gltfCtrlTextureRotation->setEnabled(new_state);
- gltfCtrlTextureOffsetU->setEnabled(new_state);
- gltfCtrlTextureOffsetV->setEnabled(new_state);
+ mPBRScaleU->setEnabled(new_state);
+ mPBRScaleV->setEnabled(new_state);
+ mPBRRotate->setEnabled(new_state);
+ mPBROffsetU->setEnabled(new_state);
+ mPBROffsetV->setEnabled(new_state);
// Control values will be set once per frame in
// setMaterialOverridesFromSelection
@@ -2080,24 +1957,23 @@ void LLPanelFace::updateVisibilityGLTF(LLViewerObject* objectp /*= nullptr */)
const bool show_pbr = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR && mComboMatMedia->getEnabled();
const bool inventory_pending = objectp && objectp->isInventoryPending();
- LLRadioGroup* radio_pbr_type = findChild<LLRadioGroup>("radio_pbr_type");
- radio_pbr_type->setVisible(show_pbr);
+ mRadioPbrType->setVisible(show_pbr);
- const U32 pbr_type = radio_pbr_type->getSelectedIndex();
+ const U32 pbr_type = mRadioPbrType->getSelectedIndex();
const bool show_pbr_render_material_id = show_pbr && (pbr_type == PBRTYPE_RENDER_MATERIAL_ID);
- getChildView("pbr_control")->setVisible(show_pbr_render_material_id);
+ mPBRTextureCtrl->setVisible(show_pbr_render_material_id);
- getChildView("pbr_from_inventory")->setVisible(show_pbr_render_material_id);
- getChildView("edit_selected_pbr")->setVisible(show_pbr_render_material_id && !inventory_pending);
- getChildView("save_selected_pbr")->setVisible(show_pbr_render_material_id && !inventory_pending);
- getChildView("material_permissions_loading_label")->setVisible(show_pbr_render_material_id && inventory_pending);
+ mBtnPbrFromInv->setVisible(show_pbr_render_material_id);
+ mBtnEditBbr->setVisible(show_pbr_render_material_id && !inventory_pending);
+ mBtnSaveBbr->setVisible(show_pbr_render_material_id && !inventory_pending);
+ mLabelMatPermLoading->setVisible(show_pbr_render_material_id && inventory_pending);
- getChildView("gltfTextureScaleU")->setVisible(show_pbr);
- getChildView("gltfTextureScaleV")->setVisible(show_pbr);
- getChildView("gltfTextureRotation")->setVisible(show_pbr);
- getChildView("gltfTextureOffsetU")->setVisible(show_pbr);
- getChildView("gltfTextureOffsetV")->setVisible(show_pbr);
+ mPBRScaleU->setVisible(show_pbr);
+ mPBRScaleV->setVisible(show_pbr);
+ mPBRRotate->setVisible(show_pbr);
+ mPBROffsetU->setVisible(show_pbr);
+ mPBROffsetV->setVisible(show_pbr);
}
void LLPanelFace::updateCopyTexButton()
@@ -2127,7 +2003,7 @@ void LLPanelFace::refreshMedia()
&& first_object->permModify()
))
{
- getChildView("add_media")->setEnabled(false);
+ mAddMedia->setEnabled(false);
mTitleMediaText->clear();
clearMediaSettings();
return;
@@ -2138,7 +2014,7 @@ void LLPanelFace::refreshMedia()
if (!has_media_capability)
{
- getChildView("add_media")->setEnabled(false);
+ mAddMedia->setEnabled(false);
LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL;
clearMediaSettings();
return;
@@ -2220,7 +2096,7 @@ void LLPanelFace::refreshMedia()
// update UI depending on whether "object" (prim or face) has media
// and whether or not you are allowed to edit it.
- getChildView("add_media")->setEnabled(editable);
+ mAddMedia->setEnabled(editable);
// IF all the faces have media (or all dont have media)
if (LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo)
{
@@ -2242,7 +2118,7 @@ void LLPanelFace::refreshMedia()
media_title = multi_media_info_str;
}
- getChildView("delete_media")->setEnabled(bool_has_media && editable);
+ mDelMedia->setEnabled(bool_has_media && editable);
// TODO: display a list of all media on the face - use 'identical' flag
}
else // not all face has media but at least one does.
@@ -2264,7 +2140,7 @@ void LLPanelFace::refreshMedia()
}
}
- getChildView("delete_media")->setEnabled(true);
+ mDelMedia->setEnabled(true);
}
U32 materials_media = mComboMatMedia->getCurrentIndex();
@@ -2305,7 +2181,7 @@ void LLPanelFace::onMaterialOverrideReceived(const LLUUID& object_id, S32 side)
//////////////////////////////////////////////////////////////////////////////
//
-void LLPanelFace::navigateToTitleMedia( const std::string url )
+void LLPanelFace::navigateToTitleMedia(const std::string& url)
{
std::string multi_media_info_str = LLTrans::getString("Multiple Media");
if (url.empty() || multi_media_info_str == url)
@@ -2317,9 +2193,9 @@ void LLPanelFace::navigateToTitleMedia( const std::string url )
{
LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
// check if url changed or if we need a new media source
- if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == NULL)
+ if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == nullptr)
{
- mTitleMedia->navigateTo( url );
+ mTitleMedia->navigateTo(url);
LLViewerMediaImpl* impl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(mTitleMedia->getTextureID());
if (impl)
@@ -2872,367 +2748,287 @@ void LLPanelFace::updateMediaTitle()
};
}
-//
-// Static functions
-//
-
// static
F32 LLPanelFace::valueGlow(LLViewerObject* object, S32 face)
{
return (F32)(object->getTE(face)->getGlow());
}
-
-void LLPanelFace::onCommitColor(const LLSD& data)
+void LLPanelFace::onCommitColor()
{
sendColor();
}
-void LLPanelFace::onCommitShinyColor(const LLSD& data)
+void LLPanelFace::onCommitShinyColor()
{
- LLSelectedTEMaterial::setSpecularLightColor(this, getChild<LLColorSwatchCtrl>("shinycolorswatch")->get());
+ LLSelectedTEMaterial::setSpecularLightColor(this, mShinyColorSwatch->get());
}
-void LLPanelFace::onCommitAlpha(const LLSD& data)
+void LLPanelFace::onCommitAlpha()
{
sendAlpha();
}
-void LLPanelFace::onCancelColor(const LLSD& data)
+void LLPanelFace::onCancelColor()
{
LLSelectMgr::getInstance()->selectionRevertColors();
}
-void LLPanelFace::onCancelShinyColor(const LLSD& data)
+void LLPanelFace::onCancelShinyColor()
{
LLSelectMgr::getInstance()->selectionRevertShinyColors();
}
-void LLPanelFace::onSelectColor(const LLSD& data)
+void LLPanelFace::onSelectColor()
{
LLSelectMgr::getInstance()->saveSelectedObjectColors();
sendColor();
}
-void LLPanelFace::onSelectShinyColor(const LLSD& data)
+void LLPanelFace::onSelectShinyColor()
{
- LLSelectedTEMaterial::setSpecularLightColor(this, getChild<LLColorSwatchCtrl>("shinycolorswatch")->get());
+ LLSelectedTEMaterial::setSpecularLightColor(this, mShinyColorSwatch->get());
LLSelectMgr::getInstance()->saveSelectedShinyColors();
}
-// static
-void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialsMedia()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
// Force to default states to side-step problems with menu contents
// and generally reflecting old state when switching tabs or objects
//
- self->updateShinyControls(false,true);
- self->updateBumpyControls(false,true);
- self->updateUI();
- self->refreshMedia();
+ updateShinyControls(false, true);
+ updateBumpyControls(false, true);
+ updateUI();
+ refreshMedia();
}
void LLPanelFace::updateVisibility(LLViewerObject* objectp /* = nullptr */)
{
- LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
- LLRadioGroup* radio_pbr_type = findChild<LLRadioGroup>("radio_pbr_type");
- LLComboBox* combo_shininess = findChild<LLComboBox>("combobox shininess");
- LLComboBox* combo_bumpiness = findChild<LLComboBox>("combobox bumpiness");
- if (!radio_mat_type || !radio_pbr_type || !mComboMatMedia || !combo_shininess || !combo_bumpiness)
+ if (!mRadioMaterialType || !mRadioPbrType)
{
LL_WARNS("Materials") << "Combo box not found...exiting." << LL_ENDL;
return;
}
U32 materials_media = mComboMatMedia->getCurrentIndex();
- U32 material_type = radio_mat_type->getSelectedIndex();
+ U32 material_type = mRadioMaterialType->getSelectedIndex();
bool show_media = (materials_media == MATMEDIA_MEDIA) && mComboMatMedia->getEnabled();
bool show_material = materials_media == MATMEDIA_MATERIAL;
bool show_texture = (show_media || (show_material && (material_type == MATTYPE_DIFFUSE) && mComboMatMedia->getEnabled()));
bool show_bumpiness = show_material && (material_type == MATTYPE_NORMAL) && mComboMatMedia->getEnabled();
bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && mComboMatMedia->getEnabled();
const bool show_pbr = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR && mComboMatMedia->getEnabled();
- const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
- const LLGLTFMaterial::TextureInfo texture_info = texture_info_from_pbrtype(pbr_type);
+ const LLGLTFMaterial::TextureInfo texture_info = getPBRTextureInfo();
const bool show_pbr_asset = show_pbr && texture_info == LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT;
- radio_mat_type->setVisible(show_material);
+ mRadioMaterialType->setVisible(show_material);
// Shared material controls
- getChildView("checkbox_sync_settings")->setVisible(show_material || show_media);
- getChildView("tex gen")->setVisible(show_material || show_media || show_pbr_asset);
- getChildView("combobox texgen")->setVisible(show_material || show_media || show_pbr_asset);
- getChildView("button align textures")->setVisible(show_material || show_media);
+ mCheckSyncSettings->setVisible(show_material || show_media);
+ mLabelTexGen->setVisible(show_material || show_media || show_pbr_asset);
+ mComboTexGen->setVisible(show_material || show_media || show_pbr_asset);
+ mBtnAlignTex->setVisible(show_material || show_media);
// Media controls
mTitleMediaText->setVisible(show_media);
- getChildView("add_media")->setVisible(show_media);
- getChildView("delete_media")->setVisible(show_media);
- getChildView("button align")->setVisible(show_media);
+ mAddMedia->setVisible(show_media);
+ mDelMedia->setVisible(show_media);
+ mBtnAlign->setVisible(show_media);
// Diffuse texture controls
- getChildView("texture control")->setVisible(show_texture && show_material);
- getChildView("label alphamode")->setVisible(show_texture && show_material);
- getChildView("combobox alphamode")->setVisible(show_texture && show_material);
- getChildView("label maskcutoff")->setVisible(false);
- getChildView("maskcutoff")->setVisible(false);
+ mTextureCtrl->setVisible(show_texture && show_material);
+ mLabelAlphaMode->setVisible(show_texture && show_material);
+ mComboAlphaMode->setVisible(show_texture && show_material);
+ mLabelMaskCutoff->setVisible(false);
+ mMaskCutoff->setVisible(false);
if (show_texture && show_material)
{
updateAlphaControls();
}
// texture scale and position controls
- getChildView("TexScaleU")->setVisible(show_texture);
- getChildView("TexScaleV")->setVisible(show_texture);
- getChildView("TexRot")->setVisible(show_texture);
- getChildView("TexOffsetU")->setVisible(show_texture);
- getChildView("TexOffsetV")->setVisible(show_texture);
+ mTexScaleU->setVisible(show_texture);
+ mTexScaleV->setVisible(show_texture);
+ mTexRotate->setVisible(show_texture);
+ mTexOffsetU->setVisible(show_texture);
+ mTexOffsetV->setVisible(show_texture);
// Specular map controls
- getChildView("shinytexture control")->setVisible(show_shininess);
- getChildView("combobox shininess")->setVisible(show_shininess);
- getChildView("label shininess")->setVisible(show_shininess);
- getChildView("label glossiness")->setVisible(false);
- getChildView("glossiness")->setVisible(false);
- getChildView("label environment")->setVisible(false);
- getChildView("environment")->setVisible(false);
- getChildView("label shinycolor")->setVisible(false);
- getChildView("shinycolorswatch")->setVisible(false);
+ mShinyTextureCtrl->setVisible(show_shininess);
+ mComboShininess->setVisible(show_shininess);
+ mLabelShininess->setVisible(show_shininess);
+ mLabelGlossiness->setVisible(false);
+ mGlossiness->setVisible(false);
+ mLabelEnvironment->setVisible(false);
+ mEnvironment->setVisible(false);
+ mLabelShiniColor->setVisible(false);
+ mShinyColorSwatch->setVisible(false);
if (show_shininess)
{
updateShinyControls();
}
- getChildView("shinyScaleU")->setVisible(show_shininess);
- getChildView("shinyScaleV")->setVisible(show_shininess);
- getChildView("shinyRot")->setVisible(show_shininess);
- getChildView("shinyOffsetU")->setVisible(show_shininess);
- getChildView("shinyOffsetV")->setVisible(show_shininess);
+ mShinyScaleU->setVisible(show_shininess);
+ mShinyScaleV->setVisible(show_shininess);
+ mShinyRotate->setVisible(show_shininess);
+ mShinyOffsetU->setVisible(show_shininess);
+ mShinyOffsetV->setVisible(show_shininess);
// Normal map controls
if (show_bumpiness)
{
updateBumpyControls();
}
- getChildView("bumpytexture control")->setVisible(show_bumpiness);
- getChildView("combobox bumpiness")->setVisible(show_bumpiness);
- getChildView("label bumpiness")->setVisible(show_bumpiness);
- getChildView("bumpyScaleU")->setVisible(show_bumpiness);
- getChildView("bumpyScaleV")->setVisible(show_bumpiness);
- getChildView("bumpyRot")->setVisible(show_bumpiness);
- getChildView("bumpyOffsetU")->setVisible(show_bumpiness);
- getChildView("bumpyOffsetV")->setVisible(show_bumpiness);
+ mBumpyTextureCtrl->setVisible(show_bumpiness);
+ mComboBumpiness->setVisible(show_bumpiness);
+ mLabelBumpiness->setVisible(show_bumpiness);
+ mBumpyScaleU->setVisible(show_bumpiness);
+ mBumpyScaleV->setVisible(show_bumpiness);
+ mBumpyRotate->setVisible(show_bumpiness);
+ mBumpyOffsetU->setVisible(show_bumpiness);
+ mBumpyOffsetV->setVisible(show_bumpiness);
- getChild<LLSpinCtrl>("rptctrl")->setVisible(show_material || show_media);
+ mTexRepeat->setVisible(show_material || show_media);
// PBR controls
updateVisibilityGLTF(objectp);
}
-// static
-void LLPanelFace::onCommitMaterialType(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialType()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
// Force to default states to side-step problems with menu contents
// and generally reflecting old state when switching tabs or objects
//
- self->updateShinyControls(false,true);
- self->updateBumpyControls(false,true);
- self->updateUI();
+ updateShinyControls(false, true);
+ updateBumpyControls(false, true);
+ updateUI();
}
-// static
-void LLPanelFace::onCommitPbrType(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitPbrType()
{
- LLPanelFace* self = (LLPanelFace*)userdata;
// Force to default states to side-step problems with menu contents
// and generally reflecting old state when switching tabs or objects
//
- self->updateUI();
+ updateUI();
}
-// static
-void LLPanelFace::onCommitBump(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitBump()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
-
- LLComboBox* mComboBumpiness = self->getChild<LLComboBox>("combobox bumpiness");
- if(!mComboBumpiness)
- return;
-
- U32 bumpiness = mComboBumpiness->getCurrentIndex();
-
- self->sendBump(bumpiness);
+ sendBump(mComboBumpiness->getCurrentIndex());
}
-// static
-void LLPanelFace::onCommitTexGen(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitTexGen()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- self->sendTexGen();
+ sendTexGen();
}
-// static
void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_shiny_combobox)
{
- LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
- LLUUID shiny_texture_ID = texture_ctrl->getImageAssetID();
+ LLUUID shiny_texture_ID = mShinyTextureCtrl->getImageAssetID();
LL_DEBUGS("Materials") << "Shiny texture selected: " << shiny_texture_ID << LL_ENDL;
- LLComboBox* comboShiny = getChild<LLComboBox>("combobox shininess");
- if(mess_with_shiny_combobox)
+ if (mess_with_shiny_combobox)
{
- if (!comboShiny)
- {
- return;
- }
if (!shiny_texture_ID.isNull() && is_setting_texture)
{
- if (!comboShiny->itemExists(USE_TEXTURE))
+ if (!mComboShininess->itemExists(USE_TEXTURE))
{
- comboShiny->add(USE_TEXTURE);
+ mComboShininess->add(USE_TEXTURE);
}
- comboShiny->setSimple(USE_TEXTURE);
+ mComboShininess->setSimple(USE_TEXTURE);
}
else
{
- if (comboShiny->itemExists(USE_TEXTURE))
+ if (mComboShininess->itemExists(USE_TEXTURE))
{
- comboShiny->remove(SHINY_TEXTURE);
- comboShiny->selectFirstItem();
+ mComboShininess->remove(SHINY_TEXTURE);
+ mComboShininess->selectFirstItem();
}
}
}
else
{
- if (shiny_texture_ID.isNull() && comboShiny && comboShiny->itemExists(USE_TEXTURE))
+ if (shiny_texture_ID.isNull() && mComboShininess->itemExists(USE_TEXTURE))
{
- comboShiny->remove(SHINY_TEXTURE);
- comboShiny->selectFirstItem();
+ mComboShininess->remove(SHINY_TEXTURE);
+ mComboShininess->selectFirstItem();
}
}
-
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
U32 materials_media = mComboMatMedia->getCurrentIndex();
- U32 material_type = radio_mat_type->getSelectedIndex();
+ U32 material_type = mRadioMaterialType->getSelectedIndex();
bool show_material = (materials_media == MATMEDIA_MATERIAL);
bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && mComboMatMedia->getEnabled();
- U32 shiny_value = comboShiny->getCurrentIndex();
+ U32 shiny_value = mComboShininess->getCurrentIndex();
bool show_shinyctrls = (shiny_value == SHINY_TEXTURE) && show_shininess; // Use texture
- getChildView("label glossiness")->setVisible(show_shinyctrls);
- getChildView("glossiness")->setVisible(show_shinyctrls);
- getChildView("label environment")->setVisible(show_shinyctrls);
- getChildView("environment")->setVisible(show_shinyctrls);
- getChildView("label shinycolor")->setVisible(show_shinyctrls);
- getChildView("shinycolorswatch")->setVisible(show_shinyctrls);
+ mLabelGlossiness->setVisible(show_shinyctrls);
+ mGlossiness->setVisible(show_shinyctrls);
+ mLabelEnvironment->setVisible(show_shinyctrls);
+ mEnvironment->setVisible(show_shinyctrls);
+ mLabelShiniColor->setVisible(show_shinyctrls);
+ mShinyColorSwatch->setVisible(show_shinyctrls);
}
-// static
void LLPanelFace::updateBumpyControls(bool is_setting_texture, bool mess_with_combobox)
{
- LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
- LLUUID bumpy_texture_ID = texture_ctrl->getImageAssetID();
+ LLUUID bumpy_texture_ID = mBumpyTextureCtrl->getImageAssetID();
LL_DEBUGS("Materials") << "texture: " << bumpy_texture_ID << (mess_with_combobox ? "" : " do not") << " update combobox" << LL_ENDL;
- LLComboBox* comboBumpy = getChild<LLComboBox>("combobox bumpiness");
- if (!comboBumpy)
- {
- return;
- }
if (mess_with_combobox)
{
- LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
- LLUUID bumpy_texture_ID = texture_ctrl->getImageAssetID();
- LL_DEBUGS("Materials") << "texture: " << bumpy_texture_ID << (mess_with_combobox ? "" : " do not") << " update combobox" << LL_ENDL;
-
if (!bumpy_texture_ID.isNull() && is_setting_texture)
{
- if (!comboBumpy->itemExists(USE_TEXTURE))
+ if (!mComboBumpiness->itemExists(USE_TEXTURE))
{
- comboBumpy->add(USE_TEXTURE);
+ mComboBumpiness->add(USE_TEXTURE);
}
- comboBumpy->setSimple(USE_TEXTURE);
+ mComboBumpiness->setSimple(USE_TEXTURE);
}
else
{
- if (comboBumpy->itemExists(USE_TEXTURE))
+ if (mComboBumpiness->itemExists(USE_TEXTURE))
{
- comboBumpy->remove(BUMPY_TEXTURE);
- comboBumpy->selectFirstItem();
+ mComboBumpiness->remove(BUMPY_TEXTURE);
+ mComboBumpiness->selectFirstItem();
}
}
}
}
-// static
-void LLPanelFace::onCommitShiny(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitShiny()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
-
-
- LLComboBox* mComboShininess = self->getChild<LLComboBox>("combobox shininess");
- if(!mComboShininess)
- return;
-
- U32 shininess = mComboShininess->getCurrentIndex();
-
- self->sendShiny(shininess);
+ sendShiny(mComboShininess->getCurrentIndex());
}
-// static
void LLPanelFace::updateAlphaControls()
{
- LLComboBox* comboAlphaMode = getChild<LLComboBox>("combobox alphamode");
- if (!comboAlphaMode)
- {
- return;
- }
- U32 alpha_value = comboAlphaMode->getCurrentIndex();
+ U32 alpha_value = mComboAlphaMode->getCurrentIndex();
bool show_alphactrls = (alpha_value == ALPHAMODE_MASK); // Alpha masking
- U32 mat_media = MATMEDIA_MATERIAL;
- if (mComboMatMedia)
- {
- mat_media = mComboMatMedia->getCurrentIndex();
- }
-
- U32 mat_type = MATTYPE_DIFFUSE;
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
- if(radio_mat_type)
- {
- mat_type = radio_mat_type->getSelectedIndex();
- }
+ U32 mat_media = mComboMatMedia->getCurrentIndex();
+ U32 mat_type = mRadioMaterialType->getSelectedIndex();
show_alphactrls = show_alphactrls && (mat_media == MATMEDIA_MATERIAL);
show_alphactrls = show_alphactrls && (mat_type == MATTYPE_DIFFUSE);
- getChildView("label maskcutoff")->setVisible(show_alphactrls);
- getChildView("maskcutoff")->setVisible(show_alphactrls);
+ mLabelMaskCutoff->setVisible(show_alphactrls);
+ mMaskCutoff->setVisible(show_alphactrls);
}
-// static
-void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitAlphaMode()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- self->updateAlphaControls();
- LLSelectedTEMaterial::setDiffuseAlphaMode(self,self->getCurrentDiffuseAlphaMode());
+ updateAlphaControls();
+ LLSelectedTEMaterial::setDiffuseAlphaMode(this, getCurrentDiffuseAlphaMode());
}
-// static
-void LLPanelFace::onCommitFullbright(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitFullbright()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- self->sendFullbright();
+ sendFullbright();
}
-// static
-void LLPanelFace::onCommitGlow(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitGlow()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- self->sendGlow();
+ sendGlow();
}
-// static
-bool LLPanelFace::onDragPbr(LLUICtrl*, LLInventoryItem* item)
+bool LLPanelFace::onDragPbr(LLInventoryItem* item)
{
bool accept = true;
for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin();
@@ -3249,46 +3045,42 @@ bool LLPanelFace::onDragPbr(LLUICtrl*, LLInventoryItem* item)
return accept;
}
-void LLPanelFace::onCommitPbr(const LLSD& data)
+void LLPanelFace::onCommitPbr()
{
- LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
- if (!pbr_ctrl) return;
- if (!pbr_ctrl->getTentative())
+ if (!mPBRTextureCtrl->getTentative())
{
// we grab the item id first, because we want to do a
// permissions check in the selection manager. ARGH!
- LLUUID id = pbr_ctrl->getImageItemID();
+ LLUUID id = mPBRTextureCtrl->getImageItemID();
if (id.isNull())
{
- id = pbr_ctrl->getImageAssetID();
+ id = mPBRTextureCtrl->getImageAssetID();
}
if (!LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id))
{
- // If failed to set material, refresh pbr_ctrl's value
+ // If failed to set material, refresh mPBRTextureCtrl's value
refresh();
}
}
}
-void LLPanelFace::onCancelPbr(const LLSD& data)
+void LLPanelFace::onCancelPbr()
{
LLSelectMgr::getInstance()->selectionRevertGLTFMaterials();
}
-void LLPanelFace::onSelectPbr(const LLSD& data)
+void LLPanelFace::onSelectPbr()
{
LLSelectMgr::getInstance()->saveSelectedObjectTextures();
- LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
- if (!pbr_ctrl) return;
- if (!pbr_ctrl->getTentative())
+ if (!mPBRTextureCtrl->getTentative())
{
// we grab the item id first, because we want to do a
// permissions check in the selection manager. ARGH!
- LLUUID id = pbr_ctrl->getImageItemID();
+ LLUUID id = mPBRTextureCtrl->getImageItemID();
if (id.isNull())
{
- id = pbr_ctrl->getImageAssetID();
+ id = mPBRTextureCtrl->getImageAssetID();
}
if (!LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id))
{
@@ -3297,8 +3089,7 @@ void LLPanelFace::onSelectPbr(const LLSD& data)
}
}
-// static
-bool LLPanelFace::onDragTexture(LLUICtrl*, LLInventoryItem* item)
+bool LLPanelFace::onDragTexture(LLInventoryItem* item)
{
bool accept = true;
for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin();
@@ -3315,18 +3106,18 @@ bool LLPanelFace::onDragTexture(LLUICtrl*, LLInventoryItem* item)
return accept;
}
-void LLPanelFace::onCommitTexture( const LLSD& data )
+void LLPanelFace::onCommitTexture()
{
add(LLStatViewer::EDIT_TEXTURE, 1);
sendTexture();
}
-void LLPanelFace::onCancelTexture(const LLSD& data)
+void LLPanelFace::onCancelTexture()
{
LLSelectMgr::getInstance()->selectionRevertTextures();
}
-void LLPanelFace::onSelectTexture(const LLSD& data)
+void LLPanelFace::onSelectTexture()
{
LLSelectMgr::getInstance()->saveSelectedObjectTextures();
sendTexture();
@@ -3336,31 +3127,25 @@ void LLPanelFace::onSelectTexture(const LLSD& data)
bool missing_asset = false;
LLSelectedTE::getImageFormat(image_format, identical_image_format, missing_asset);
- LLCtrlSelectionInterface* combobox_alphamode =
- childGetSelectionInterface("combobox alphamode");
-
U32 alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
- if (combobox_alphamode && !missing_asset)
+ if (!missing_asset)
{
switch (image_format)
{
case GL_RGBA:
case GL_ALPHA:
- {
- alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_BLEND;
- }
+ alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_BLEND;
+ break;
+ case GL_RGB:
break;
-
- case GL_RGB: break;
default:
- {
- LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL;
- }
+ LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL;
break;
}
- combobox_alphamode->selectNthItem(alpha_mode);
+ mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode);
}
+
LLSelectedTEMaterial::setDiffuseAlphaMode(this, getCurrentDiffuseAlphaMode());
}
@@ -3370,13 +3155,13 @@ void LLPanelFace::onCloseTexturePicker(const LLSD& data)
updateUI();
}
-void LLPanelFace::onCommitSpecularTexture( const LLSD& data )
+void LLPanelFace::onCommitSpecularTexture(const LLSD& data)
{
LL_DEBUGS("Materials") << data << LL_ENDL;
sendShiny(SHINY_TEXTURE);
}
-void LLPanelFace::onCommitNormalTexture( const LLSD& data )
+void LLPanelFace::onCommitNormalTexture(const LLSD& data)
{
LL_DEBUGS("Materials") << data << LL_ENDL;
LLUUID nmap_id = getCurrentNormalMap();
@@ -3388,7 +3173,7 @@ void LLPanelFace::onCancelSpecularTexture(const LLSD& data)
U8 shiny = 0;
bool identical_shiny = false;
LLSelectedTE::getShiny(shiny, identical_shiny);
- LLUUID spec_map_id = getChild<LLTextureCtrl>("shinytexture control")->getImageAssetID();
+ LLUUID spec_map_id = mShinyTextureCtrl->getImageAssetID();
shiny = spec_map_id.isNull() ? shiny : SHINY_TEXTURE;
sendShiny(shiny);
}
@@ -3398,7 +3183,7 @@ void LLPanelFace::onCancelNormalTexture(const LLSD& data)
U8 bumpy = 0;
bool identical_bumpy = false;
LLSelectedTE::getBumpmap(bumpy, identical_bumpy);
- LLUUID spec_map_id = getChild<LLTextureCtrl>("bumpytexture control")->getImageAssetID();
+ LLUUID spec_map_id = mBumpyTextureCtrl->getImageAssetID();
bumpy = spec_map_id.isNull() ? bumpy : BUMPY_TEXTURE;
sendBump(bumpy);
}
@@ -3419,34 +3204,32 @@ void LLPanelFace::onSelectNormalTexture(const LLSD& data)
//////////////////////////////////////////////////////////////////////////////
// called when a user wants to edit existing media settings on a prim or prim face
// TODO: test if there is media on the item and only allow editing if present
-void LLPanelFace::onClickBtnEditMedia(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onClickBtnEditMedia()
{
- LLPanelFace* self = (LLPanelFace*)userdata;
- self->refreshMedia();
+ refreshMedia();
LLFloaterReg::showInstance("media_settings");
}
//////////////////////////////////////////////////////////////////////////////
// called when a user wants to delete media from a prim or prim face
-void LLPanelFace::onClickBtnDeleteMedia(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onClickBtnDeleteMedia()
{
LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
}
//////////////////////////////////////////////////////////////////////////////
// called when a user wants to add media to a prim or prim face
-void LLPanelFace::onClickBtnAddMedia(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onClickBtnAddMedia()
{
// check if multiple faces are selected
if (LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
{
- LLPanelFace* self = (LLPanelFace*)userdata;
- self->refreshMedia();
+ refreshMedia();
LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
}
else
{
- onClickBtnEditMedia(ctrl, userdata);
+ onClickBtnEditMedia();
}
}
@@ -3487,401 +3270,319 @@ bool LLPanelFace::multipleFacesSelectedConfirm(const LLSD& notification, const L
return false;
}
-//static
-void LLPanelFace::syncOffsetX(LLPanelFace* self, F32 offsetU)
+void LLPanelFace::syncOffsetX(F32 offsetU)
{
- LLSelectedTEMaterial::setNormalOffsetX(self,offsetU);
- LLSelectedTEMaterial::setSpecularOffsetX(self,offsetU);
- self->getChild<LLSpinCtrl>("TexOffsetU")->forceSetValue(offsetU);
- self->sendTextureInfo();
+ LLSelectedTEMaterial::setNormalOffsetX(this, offsetU);
+ LLSelectedTEMaterial::setSpecularOffsetX(this, offsetU);
+ mTexOffsetU->forceSetValue(LLSD(offsetU));
+ sendTextureInfo();
}
-//static
-void LLPanelFace::syncOffsetY(LLPanelFace* self, F32 offsetV)
+void LLPanelFace::syncOffsetY(F32 offsetV)
{
- LLSelectedTEMaterial::setNormalOffsetY(self,offsetV);
- LLSelectedTEMaterial::setSpecularOffsetY(self,offsetV);
- self->getChild<LLSpinCtrl>("TexOffsetV")->forceSetValue(offsetV);
- self->sendTextureInfo();
+ LLSelectedTEMaterial::setNormalOffsetY(this, offsetV);
+ LLSelectedTEMaterial::setSpecularOffsetY(this, offsetV);
+ mTexOffsetV->forceSetValue(LLSD(offsetV));
+ sendTextureInfo();
}
-//static
-void LLPanelFace::onCommitMaterialBumpyOffsetX(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialBumpyOffsetX()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- syncOffsetX(self,self->getCurrentBumpyOffsetU());
+ syncOffsetX(getCurrentBumpyOffsetU());
}
else
{
- LLSelectedTEMaterial::setNormalOffsetX(self,self->getCurrentBumpyOffsetU());
+ LLSelectedTEMaterial::setNormalOffsetX(this, getCurrentBumpyOffsetU());
}
-
}
-//static
-void LLPanelFace::onCommitMaterialBumpyOffsetY(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialBumpyOffsetY()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- syncOffsetY(self,self->getCurrentBumpyOffsetV());
+ syncOffsetY(getCurrentBumpyOffsetV());
}
else
{
- LLSelectedTEMaterial::setNormalOffsetY(self,self->getCurrentBumpyOffsetV());
+ LLSelectedTEMaterial::setNormalOffsetY(this, getCurrentBumpyOffsetV());
}
}
-//static
-void LLPanelFace::onCommitMaterialShinyOffsetX(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialShinyOffsetX()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- syncOffsetX(self, self->getCurrentShinyOffsetU());
+ syncOffsetX(getCurrentShinyOffsetU());
}
else
{
- LLSelectedTEMaterial::setSpecularOffsetX(self,self->getCurrentShinyOffsetU());
+ LLSelectedTEMaterial::setSpecularOffsetX(this, getCurrentShinyOffsetU());
}
}
-//static
-void LLPanelFace::onCommitMaterialShinyOffsetY(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialShinyOffsetY()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- syncOffsetY(self,self->getCurrentShinyOffsetV());
+ syncOffsetY(getCurrentShinyOffsetV());
}
else
{
- LLSelectedTEMaterial::setSpecularOffsetY(self,self->getCurrentShinyOffsetV());
+ LLSelectedTEMaterial::setSpecularOffsetY(this, getCurrentShinyOffsetV());
}
}
-//static
-void LLPanelFace::syncRepeatX(LLPanelFace* self, F32 scaleU)
+void LLPanelFace::syncRepeatX(F32 scaleU)
{
- LLSelectedTEMaterial::setNormalRepeatX(self,scaleU);
- LLSelectedTEMaterial::setSpecularRepeatX(self,scaleU);
- self->sendTextureInfo();
+ LLSelectedTEMaterial::setNormalRepeatX(this, scaleU);
+ LLSelectedTEMaterial::setSpecularRepeatX(this, scaleU);
+ sendTextureInfo();
}
-//static
-void LLPanelFace::syncRepeatY(LLPanelFace* self, F32 scaleV)
+void LLPanelFace::syncRepeatY(F32 scaleV)
{
- LLSelectedTEMaterial::setNormalRepeatY(self,scaleV);
- LLSelectedTEMaterial::setSpecularRepeatY(self,scaleV);
- self->sendTextureInfo();
+ LLSelectedTEMaterial::setNormalRepeatY(this, scaleV);
+ LLSelectedTEMaterial::setSpecularRepeatY(this, scaleV);
+ sendTextureInfo();
}
-//static
-void LLPanelFace::onCommitMaterialBumpyScaleX(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialBumpyScaleX()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
- F32 bumpy_scale_u = self->getCurrentBumpyScaleU();
- if (self->isIdenticalPlanarTexgen())
+ F32 bumpy_scale_u = getCurrentBumpyScaleU();
+ if (isIdenticalPlanarTexgen())
{
bumpy_scale_u *= 0.5f;
}
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- self->getChild<LLSpinCtrl>("TexScaleU")->forceSetValue(self->getCurrentBumpyScaleU());
- syncRepeatX(self, bumpy_scale_u);
+ mTexScaleU->forceSetValue(LLSD(getCurrentBumpyScaleU()));
+ syncRepeatX(bumpy_scale_u);
}
else
{
- LLSelectedTEMaterial::setNormalRepeatX(self,bumpy_scale_u);
+ LLSelectedTEMaterial::setNormalRepeatX(this, bumpy_scale_u);
}
}
-//static
-void LLPanelFace::onCommitMaterialBumpyScaleY(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialBumpyScaleY()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
- F32 bumpy_scale_v = self->getCurrentBumpyScaleV();
- if (self->isIdenticalPlanarTexgen())
+ F32 bumpy_scale_v = getCurrentBumpyScaleV();
+ if (isIdenticalPlanarTexgen())
{
bumpy_scale_v *= 0.5f;
}
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- self->getChild<LLSpinCtrl>("TexScaleV")->forceSetValue(self->getCurrentBumpyScaleV());
- syncRepeatY(self, bumpy_scale_v);
+ mTexScaleV->forceSetValue(LLSD(getCurrentBumpyScaleV()));
+ syncRepeatY(bumpy_scale_v);
}
else
{
- LLSelectedTEMaterial::setNormalRepeatY(self,bumpy_scale_v);
+ LLSelectedTEMaterial::setNormalRepeatY(this, bumpy_scale_v);
}
}
-//static
-void LLPanelFace::onCommitMaterialShinyScaleX(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialShinyScaleX()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
- F32 shiny_scale_u = self->getCurrentShinyScaleU();
- if (self->isIdenticalPlanarTexgen())
+ F32 shiny_scale_u = getCurrentShinyScaleU();
+ if (isIdenticalPlanarTexgen())
{
shiny_scale_u *= 0.5f;
}
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- self->getChild<LLSpinCtrl>("TexScaleU")->forceSetValue(self->getCurrentShinyScaleU());
- syncRepeatX(self, shiny_scale_u);
+ mTexScaleU->forceSetValue(LLSD(getCurrentShinyScaleU()));
+ syncRepeatX(shiny_scale_u);
}
else
{
- LLSelectedTEMaterial::setSpecularRepeatX(self,shiny_scale_u);
+ LLSelectedTEMaterial::setSpecularRepeatX(this, shiny_scale_u);
}
}
-//static
-void LLPanelFace::onCommitMaterialShinyScaleY(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialShinyScaleY()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
- F32 shiny_scale_v = self->getCurrentShinyScaleV();
- if (self->isIdenticalPlanarTexgen())
+ F32 shiny_scale_v = getCurrentShinyScaleV();
+ if (isIdenticalPlanarTexgen())
{
shiny_scale_v *= 0.5f;
}
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- self->getChild<LLSpinCtrl>("TexScaleV")->forceSetValue(self->getCurrentShinyScaleV());
- syncRepeatY(self, shiny_scale_v);
+ mTexScaleV->forceSetValue(LLSD(getCurrentShinyScaleV()));
+ syncRepeatY(shiny_scale_v);
}
else
{
- LLSelectedTEMaterial::setSpecularRepeatY(self,shiny_scale_v);
+ LLSelectedTEMaterial::setSpecularRepeatY(this, shiny_scale_v);
}
}
-//static
-void LLPanelFace::syncMaterialRot(LLPanelFace* self, F32 rot, int te)
+void LLPanelFace::syncMaterialRot(F32 rot, int te)
{
- LLSelectedTEMaterial::setNormalRotation(self,rot * DEG_TO_RAD, te);
- LLSelectedTEMaterial::setSpecularRotation(self,rot * DEG_TO_RAD, te);
- self->sendTextureInfo();
+ LLSelectedTEMaterial::setNormalRotation(this, rot * DEG_TO_RAD, te);
+ LLSelectedTEMaterial::setSpecularRotation(this, rot * DEG_TO_RAD, te);
+ sendTextureInfo();
}
-//static
-void LLPanelFace::onCommitMaterialBumpyRot(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialBumpyRot()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- self->getChild<LLSpinCtrl>("TexRot")->forceSetValue(self->getCurrentBumpyRot());
- syncMaterialRot(self, self->getCurrentBumpyRot());
+ mTexRotate->forceSetValue(LLSD(getCurrentBumpyRot()));
+ syncMaterialRot(getCurrentBumpyRot());
}
else
{
- if ((bool)self->childGetValue("checkbox planar align").asBoolean())
+ if (mPlanarAlign->getValue().asBoolean())
{
LLFace* last_face = NULL;
bool identical_face = false;
LLSelectedTE::getFace(last_face, identical_face);
- LLPanelFaceSetAlignedTEFunctor setfunc(self, last_face);
+ LLPanelFaceSetAlignedTEFunctor setfunc(this, last_face);
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
}
else
{
- LLSelectedTEMaterial::setNormalRotation(self, self->getCurrentBumpyRot() * DEG_TO_RAD);
+ LLSelectedTEMaterial::setNormalRotation(this, getCurrentBumpyRot() * DEG_TO_RAD);
}
}
}
-//static
-void LLPanelFace::onCommitMaterialShinyRot(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialShinyRot()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- self->getChild<LLSpinCtrl>("TexRot")->forceSetValue(self->getCurrentShinyRot());
- syncMaterialRot(self, self->getCurrentShinyRot());
+ mTexRotate->forceSetValue(LLSD(getCurrentShinyRot()));
+ syncMaterialRot(getCurrentShinyRot());
}
else
{
- if ((bool)self->childGetValue("checkbox planar align").asBoolean())
+ if (mPlanarAlign->getValue().asBoolean())
{
LLFace* last_face = NULL;
bool identical_face = false;
LLSelectedTE::getFace(last_face, identical_face);
- LLPanelFaceSetAlignedTEFunctor setfunc(self, last_face);
+ LLPanelFaceSetAlignedTEFunctor setfunc(this, last_face);
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
}
else
{
- LLSelectedTEMaterial::setSpecularRotation(self, self->getCurrentShinyRot() * DEG_TO_RAD);
+ LLSelectedTEMaterial::setSpecularRotation(this, getCurrentShinyRot() * DEG_TO_RAD);
}
}
}
-//static
-void LLPanelFace::onCommitMaterialGloss(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialGloss()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
- LLSelectedTEMaterial::setSpecularLightExponent(self,self->getCurrentGlossiness());
+ LLSelectedTEMaterial::setSpecularLightExponent(this, getCurrentGlossiness());
}
-//static
-void LLPanelFace::onCommitMaterialEnv(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialEnv()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- llassert_always(self);
- LLSelectedTEMaterial::setEnvironmentIntensity(self,self->getCurrentEnvIntensity());
+ LLSelectedTEMaterial::setEnvironmentIntensity(this, getCurrentEnvIntensity());
}
-//static
-void LLPanelFace::onCommitMaterialMaskCutoff(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitMaterialMaskCutoff()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- LLSelectedTEMaterial::setAlphaMaskCutoff(self,self->getCurrentAlphaMaskCutoff());
+ LLSelectedTEMaterial::setAlphaMaskCutoff(this, getCurrentAlphaMaskCutoff());
}
-// static
-void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata )
+void LLPanelFace::onCommitTextureInfo()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- self->sendTextureInfo();
+ sendTextureInfo();
// vertical scale and repeats per meter depends on each other, so force set on changes
- self->updateUI(true);
+ updateUI(true);
}
-// static
-void LLPanelFace::onCommitTextureScaleX( LLUICtrl* ctrl, void* userdata )
+void LLPanelFace::onCommitTextureScaleX()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- F32 bumpy_scale_u = self->getChild<LLUICtrl>("TexScaleU")->getValue().asReal();
- if (self->isIdenticalPlanarTexgen())
+ F32 bumpy_scale_u = (F32)mTexScaleU->getValue().asReal();
+ if (isIdenticalPlanarTexgen())
{
bumpy_scale_u *= 0.5f;
}
- syncRepeatX(self, bumpy_scale_u);
+ syncRepeatX(bumpy_scale_u);
}
else
{
- self->sendTextureInfo();
+ sendTextureInfo();
}
- self->updateUI(true);
+ updateUI(true);
}
-// static
-void LLPanelFace::onCommitTextureScaleY( LLUICtrl* ctrl, void* userdata )
+void LLPanelFace::onCommitTextureScaleY()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- F32 bumpy_scale_v = self->getChild<LLUICtrl>("TexScaleV")->getValue().asReal();
- if (self->isIdenticalPlanarTexgen())
+ F32 bumpy_scale_v = (F32)mTexScaleV->getValue().asReal();
+ if (isIdenticalPlanarTexgen())
{
bumpy_scale_v *= 0.5f;
}
- syncRepeatY(self, bumpy_scale_v);
+ syncRepeatY(bumpy_scale_v);
}
else
{
- self->sendTextureInfo();
+ sendTextureInfo();
}
- self->updateUI(true);
+ updateUI(true);
}
-// static
-void LLPanelFace::onCommitTextureRot( LLUICtrl* ctrl, void* userdata )
+void LLPanelFace::onCommitTextureRot()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- syncMaterialRot(self, self->getChild<LLUICtrl>("TexRot")->getValue().asReal());
+ syncMaterialRot((F32)mTexRotate->getValue().asReal());
}
else
{
- self->sendTextureInfo();
+ sendTextureInfo();
}
- self->updateUI(true);
+ updateUI(true);
}
-// static
-void LLPanelFace::onCommitTextureOffsetX( LLUICtrl* ctrl, void* userdata )
+void LLPanelFace::onCommitTextureOffsetX()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- syncOffsetX(self, self->getChild<LLUICtrl>("TexOffsetU")->getValue().asReal());
+ syncOffsetX((F32)mTexOffsetU->getValue().asReal());
}
else
{
- self->sendTextureInfo();
+ sendTextureInfo();
}
- self->updateUI(true);
+ updateUI(true);
}
-// static
-void LLPanelFace::onCommitTextureOffsetY( LLUICtrl* ctrl, void* userdata )
+void LLPanelFace::onCommitTextureOffsetY()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- syncOffsetY(self, self->getChild<LLUICtrl>("TexOffsetV")->getValue().asReal());
+ syncOffsetY((F32)mTexOffsetV->getValue().asReal());
}
else
{
- self->sendTextureInfo();
+ sendTextureInfo();
}
- self->updateUI(true);
+ updateUI(true);
}
// Commit the number of repeats per meter
-// static
-void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitRepeatsPerMeter()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
+ F32 repeats_per_meter = (F32)mTexRepeat->getValue().asReal();
- LLUICtrl* repeats_ctrl = self->getChild<LLUICtrl>("rptctrl");
-
- U32 materials_media = self->mComboMatMedia->getCurrentIndex();
- U32 material_type = 0;
- if (materials_media == MATMEDIA_PBR)
- {
- LLRadioGroup* radio_mat_type = self->getChild<LLRadioGroup>("radio_pbr_type");
- material_type = radio_mat_type->getSelectedIndex();
- }
- if (materials_media == MATMEDIA_MATERIAL)
- {
- LLRadioGroup* radio_mat_type = self->getChild<LLRadioGroup>("radio_material_type");
- material_type = radio_mat_type->getSelectedIndex();
- }
-
- F32 repeats_per_meter = repeats_ctrl->getValue().asReal();
-
- F32 obj_scale_s = 1.0f;
- F32 obj_scale_t = 1.0f;
+ F32 obj_scale_s = 1.0f;
+ F32 obj_scale_t = 1.0f;
bool identical_scale_s = false;
bool identical_scale_t = false;
@@ -3889,64 +3590,51 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
LLSelectedTE::getObjectScaleS(obj_scale_s, identical_scale_s);
LLSelectedTE::getObjectScaleS(obj_scale_t, identical_scale_t);
- LLUICtrl* bumpy_scale_u = self->getChild<LLUICtrl>("bumpyScaleU");
- LLUICtrl* bumpy_scale_v = self->getChild<LLUICtrl>("bumpyScaleV");
- LLUICtrl* shiny_scale_u = self->getChild<LLUICtrl>("shinyScaleU");
- LLUICtrl* shiny_scale_v = self->getChild<LLUICtrl>("shinyScaleV");
-
if (gSavedSettings.getBOOL("SyncMaterialSettings"))
{
- LLSelectMgr::getInstance()->selectionTexScaleAutofit( repeats_per_meter );
+ LLSelectMgr::getInstance()->selectionTexScaleAutofit(repeats_per_meter);
- bumpy_scale_u->setValue(obj_scale_s * repeats_per_meter);
- bumpy_scale_v->setValue(obj_scale_t * repeats_per_meter);
+ mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter);
+ mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter);
- LLSelectedTEMaterial::setNormalRepeatX(self,obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setNormalRepeatY(self,obj_scale_t * repeats_per_meter);
+ LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter);
+ LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter);
- shiny_scale_u->setValue(obj_scale_s * repeats_per_meter);
- shiny_scale_v->setValue(obj_scale_t * repeats_per_meter);
+ mShinyScaleU->setValue(obj_scale_s * repeats_per_meter);
+ mShinyScaleV->setValue(obj_scale_t * repeats_per_meter);
- LLSelectedTEMaterial::setSpecularRepeatX(self,obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setSpecularRepeatY(self,obj_scale_t * repeats_per_meter);
+ LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter);
+ LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter);
}
else
{
+ U32 material_type = mRadioMaterialType->getSelectedIndex();
switch (material_type)
{
- case MATTYPE_DIFFUSE:
- {
- LLSelectMgr::getInstance()->selectionTexScaleAutofit( repeats_per_meter );
- }
+ case MATTYPE_DIFFUSE:
+ 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);
- case MATTYPE_NORMAL:
- {
- bumpy_scale_u->setValue(obj_scale_s * repeats_per_meter);
- bumpy_scale_v->setValue(obj_scale_t * repeats_per_meter);
-
- LLSelectedTEMaterial::setNormalRepeatX(self,obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setNormalRepeatY(self,obj_scale_t * repeats_per_meter);
- }
+ LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter);
+ LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter);
break;
+ case MATTYPE_SPECULAR:
+ mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter);
+ mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter);
- case MATTYPE_SPECULAR:
- {
- shiny_scale_u->setValue(obj_scale_s * repeats_per_meter);
- shiny_scale_v->setValue(obj_scale_t * repeats_per_meter);
-
- LLSelectedTEMaterial::setSpecularRepeatX(self,obj_scale_s * repeats_per_meter);
- LLSelectedTEMaterial::setSpecularRepeatY(self,obj_scale_t * repeats_per_meter);
- }
+ LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter);
+ LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter);
+ break;
+ default:
+ llassert(false);
break;
-
- default:
- llassert(false);
- break;
}
}
// vertical scale and repeats per meter depends on each other, so force set on changes
- self->updateUI(true);
+ updateUI(true);
}
struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
@@ -3956,22 +3644,20 @@ struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
viewer_media_t pMediaImpl;
const LLTextureEntry* tep = object->getTE(te);
- const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL;
- if ( mep )
+ if (const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL)
{
pMediaImpl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(mep->getMediaID());
}
- if ( pMediaImpl.isNull())
+ if (pMediaImpl.isNull())
{
// If we didn't find face media for this face, check whether this face is showing parcel media.
pMediaImpl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(tep->getID());
}
- if ( pMediaImpl.notNull())
+ if (pMediaImpl.notNull())
{
- LLPluginClassMedia *media = pMediaImpl->getMediaPlugin();
- if(media)
+ if (LLPluginClassMedia* media = pMediaImpl->getMediaPlugin())
{
S32 media_width = media->getWidth();
S32 media_height = media->getHeight();
@@ -3981,17 +3667,17 @@ struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
F32 scale_t = (F32)media_height / (F32)texture_height;
// set scale and adjust offset
- object->setTEScaleS( te, scale_s );
- object->setTEScaleT( te, scale_t ); // don't need to flip Y anymore since QT does this for us now.
- object->setTEOffsetS( te, -( 1.0f - scale_s ) / 2.0f );
- object->setTEOffsetT( te, -( 1.0f - scale_t ) / 2.0f );
+ object->setTEScaleS(te, scale_s);
+ object->setTEScaleT(te, scale_t); // don't need to flip Y anymore since QT does this for us now.
+ object->setTEOffsetS(te, -( 1.0f - scale_s ) / 2.0f);
+ object->setTEOffsetT(te, -( 1.0f - scale_t ) / 2.0f);
}
}
return true;
};
};
-void LLPanelFace::onClickAutoFix(void* userdata)
+void LLPanelFace::onClickAutoFix()
{
LLPanelFaceSetMediaFunctor setfunc;
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
@@ -4000,26 +3686,23 @@ void LLPanelFace::onClickAutoFix(void* userdata)
LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc);
}
-void LLPanelFace::onAlignTexture(void* userdata)
+void LLPanelFace::onAlignTexture()
{
- LLPanelFace* self = (LLPanelFace*)userdata;
- self->alignTestureLayer();
+ alignTextureLayer();
}
-void LLPanelFace::onClickBtnLoadInvPBR(void* userdata)
+void LLPanelFace::onClickBtnLoadInvPBR()
{
// Shouldn't this be "save to inventory?"
- LLPanelFace* self = (LLPanelFace*)userdata;
- LLTextureCtrl* pbr_ctrl = self->findChild<LLTextureCtrl>("pbr_control");
- pbr_ctrl->showPicker(true);
+ mPBRTextureCtrl->showPicker(true);
}
-void LLPanelFace::onClickBtnEditPBR(void* userdata)
+void LLPanelFace::onClickBtnEditPBR()
{
LLMaterialEditor::loadLive();
}
-void LLPanelFace::onClickBtnSavePBR(void* userdata)
+void LLPanelFace::onClickBtnSavePBR()
{
LLMaterialEditor::saveObjectsMaterialAs();
}
@@ -4880,44 +4563,39 @@ bool LLPanelFace::menuEnableItem(const LLSD& userdata)
return false;
}
-
-// static
-void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::onCommitPlanarAlign()
{
- LLPanelFace* self = (LLPanelFace*) userdata;
- self->getState();
- self->sendTextureInfo();
+ getState();
+ sendTextureInfo();
}
-void LLPanelFace::updateGLTFTextureTransform(float value, U32 pbr_type, std::function<void(LLGLTFMaterial::TextureTransform*)> edit)
+void LLPanelFace::updateGLTFTextureTransform(std::function<void(LLGLTFMaterial::TextureTransform*)> edit)
{
- U32 texture_info_start;
- U32 texture_info_end;
- const LLGLTFMaterial::TextureInfo texture_info = texture_info_from_pbrtype(pbr_type);
+ const LLGLTFMaterial::TextureInfo texture_info = getPBRTextureInfo();
if (texture_info == LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT)
{
- texture_info_start = 0;
- texture_info_end = LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT;
+ updateSelectedGLTFMaterials([&](LLGLTFMaterial* new_override)
+ {
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[(LLGLTFMaterial::TextureInfo)i];
+ edit(&new_transform);
+ }
+ });
}
else
{
- texture_info_start = texture_info_from_pbrtype(pbr_type);
- texture_info_end = texture_info_start + 1;
+ updateSelectedGLTFMaterials([&](LLGLTFMaterial* new_override)
+ {
+ LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[texture_info];
+ edit(&new_transform);
+ });
}
- updateSelectedGLTFMaterials([&](LLGLTFMaterial* new_override)
- {
- for (U32 ti = texture_info_start; ti < texture_info_end; ++ti)
- {
- LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[(LLGLTFMaterial::TextureInfo)ti];
- edit(&new_transform);
- }
- });
}
void LLPanelFace::setMaterialOverridesFromSelection()
{
- const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
- const LLGLTFMaterial::TextureInfo texture_info = texture_info_from_pbrtype(pbr_type);
+ const LLGLTFMaterial::TextureInfo texture_info = getPBRTextureInfo();
U32 texture_info_start;
U32 texture_info_end;
if (texture_info == LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_COUNT)
@@ -4990,23 +4668,17 @@ void LLPanelFace::setMaterialOverridesFromSelection()
}
}
- LLUICtrl* gltfCtrlTextureScaleU = getChild<LLUICtrl>("gltfTextureScaleU");
- LLUICtrl* gltfCtrlTextureScaleV = getChild<LLUICtrl>("gltfTextureScaleV");
- LLUICtrl* gltfCtrlTextureRotation = getChild<LLUICtrl>("gltfTextureRotation");
- LLUICtrl* gltfCtrlTextureOffsetU = getChild<LLUICtrl>("gltfTextureOffsetU");
- LLUICtrl* gltfCtrlTextureOffsetV = getChild<LLUICtrl>("gltfTextureOffsetV");
+ mPBRScaleU->setValue(transform.mScale[VX]);
+ mPBRScaleV->setValue(transform.mScale[VY]);
+ mPBRRotate->setValue(transform.mRotation * RAD_TO_DEG);
+ mPBROffsetU->setValue(transform.mOffset[VX]);
+ mPBROffsetV->setValue(transform.mOffset[VY]);
- gltfCtrlTextureScaleU->setValue(transform.mScale[VX]);
- gltfCtrlTextureScaleV->setValue(transform.mScale[VY]);
- gltfCtrlTextureRotation->setValue(transform.mRotation * RAD_TO_DEG);
- gltfCtrlTextureOffsetU->setValue(transform.mOffset[VX]);
- gltfCtrlTextureOffsetV->setValue(transform.mOffset[VY]);
-
- gltfCtrlTextureScaleU->setTentative(!scale_u_same);
- gltfCtrlTextureScaleV->setTentative(!scale_v_same);
- gltfCtrlTextureRotation->setTentative(!rotation_same);
- gltfCtrlTextureOffsetU->setTentative(!offset_u_same);
- gltfCtrlTextureOffsetV->setTentative(!offset_v_same);
+ mPBRScaleU->setTentative(!scale_u_same);
+ mPBRScaleV->setTentative(!scale_v_same);
+ mPBRRotate->setTentative(!rotation_same);
+ mPBROffsetU->setTentative(!offset_u_same);
+ mPBROffsetV->setTentative(!offset_v_same);
}
void LLPanelFace::Selection::connect()
@@ -5083,51 +4755,46 @@ bool LLPanelFace::Selection::compareSelection()
return selection_changed;
}
-void LLPanelFace::onCommitGLTFTextureScaleU(LLUICtrl* ctrl)
+void LLPanelFace::onCommitGLTFTextureScaleU()
{
- const float value = ctrl->getValue().asReal();
- const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
- updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
+ F32 value = (F32)mPBRScaleU->getValue().asReal();
+ updateGLTFTextureTransform([&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mScale.mV[VX] = value;
});
}
-void LLPanelFace::onCommitGLTFTextureScaleV(LLUICtrl* ctrl)
+void LLPanelFace::onCommitGLTFTextureScaleV()
{
- const float value = ctrl->getValue().asReal();
- const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
- updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
+ F32 value = (F32)mPBRScaleV->getValue().asReal();
+ updateGLTFTextureTransform([&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mScale.mV[VY] = value;
});
}
-void LLPanelFace::onCommitGLTFRotation(LLUICtrl* ctrl)
+void LLPanelFace::onCommitGLTFRotation()
{
- const float value = ctrl->getValue().asReal() * DEG_TO_RAD;
- const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
- updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
+ F32 value = (F32)mPBRRotate->getValue().asReal() * DEG_TO_RAD;
+ updateGLTFTextureTransform([&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mRotation = value;
});
}
-void LLPanelFace::onCommitGLTFTextureOffsetU(LLUICtrl* ctrl)
+void LLPanelFace::onCommitGLTFTextureOffsetU()
{
- const float value = ctrl->getValue().asReal();
- const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
- updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
+ F32 value = (F32)mPBROffsetU->getValue().asReal();
+ updateGLTFTextureTransform([&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mOffset.mV[VX] = value;
});
}
-void LLPanelFace::onCommitGLTFTextureOffsetV(LLUICtrl* ctrl)
+void LLPanelFace::onCommitGLTFTextureOffsetV()
{
- const float value = ctrl->getValue().asReal();
- const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
- updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
+ F32 value = (F32)mPBROffsetV->getValue().asReal();
+ updateGLTFTextureTransform([&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mOffset.mV[VY] = value;
});
@@ -5136,59 +4803,51 @@ void LLPanelFace::onCommitGLTFTextureOffsetV(LLUICtrl* ctrl)
void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp)
{
LL_DEBUGS("Materials") << "item asset " << itemp->getAssetUUID() << LL_ENDL;
- LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
- if(!radio_mat_type)
- {
- return;
- }
- U32 mattype = radio_mat_type->getSelectedIndex();
- std::string which_control="texture control";
+
+ LLTextureCtrl* texture_ctrl;
+ U32 mattype = mRadioMaterialType->getSelectedIndex();
switch (mattype)
{
case MATTYPE_SPECULAR:
- which_control = "shinytexture control";
+ texture_ctrl = mShinyTextureCtrl;
break;
case MATTYPE_NORMAL:
- which_control = "bumpytexture control";
+ texture_ctrl = mBumpyTextureCtrl;
break;
- // no default needed
+ default:
+ texture_ctrl = mTextureCtrl;
}
- LL_DEBUGS("Materials") << "control " << which_control << LL_ENDL;
- LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>(which_control);
- if (texture_ctrl)
- {
- LLUUID obj_owner_id;
- std::string obj_owner_name;
- LLSelectMgr::instance().selectGetOwner(obj_owner_id, obj_owner_name);
- LLSaleInfo sale_info;
- LLSelectMgr::instance().selectGetSaleInfo(sale_info);
+ LLUUID obj_owner_id;
+ std::string obj_owner_name;
+ LLSelectMgr::instance().selectGetOwner(obj_owner_id, obj_owner_name);
- bool can_copy = itemp->getPermissions().allowCopyBy(gAgentID); // do we have perm to copy this texture?
- bool can_transfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID); // do we have perm to transfer this texture?
- bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply texture belong to the agent?
- bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply texture not for sale?
+ LLSaleInfo sale_info;
+ LLSelectMgr::instance().selectGetSaleInfo(sale_info);
- if (can_copy && can_transfer)
- {
- texture_ctrl->setCanApply(true, true);
- return;
- }
+ bool can_copy = itemp->getPermissions().allowCopyBy(gAgentID); // do we have perm to copy this texture?
+ bool can_transfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID); // do we have perm to transfer this texture?
+ bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply texture belong to the agent?
+ bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply texture not for sale?
- // if texture has (no-transfer) attribute it can be applied only for object which we own and is not for sale
- texture_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
+ if (can_copy && can_transfer)
+ {
+ texture_ctrl->setCanApply(true, true);
+ return;
+ }
- if (gSavedSettings.getBOOL("TextureLivePreview"))
- {
- LLNotificationsUtil::add("LivePreviewUnavailable");
- }
+ // if texture has (no-transfer) attribute it can be applied only for object which we own and is not for sale
+ texture_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
+
+ if (gSavedSettings.getBOOL("TextureLivePreview"))
+ {
+ LLNotificationsUtil::add("LivePreviewUnavailable");
}
}
void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp)
{
- LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
- if (pbr_ctrl)
+ if (mPBRTextureCtrl)
{
LLUUID obj_owner_id;
std::string obj_owner_name;
@@ -5206,12 +4865,12 @@ void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp)
if ((can_copy && can_transfer && can_modify) || from_library)
{
- pbr_ctrl->setCanApply(true, true);
+ mPBRTextureCtrl->setCanApply(true, true);
return;
}
// if material has (no-transfer) attribute it can be applied only for object which we own and is not for sale
- pbr_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
+ mPBRTextureCtrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
if (gSavedSettings.getBOOL("TextureLivePreview"))
{
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 7e1553c80a..dfd3201533 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -52,6 +52,7 @@ class LLFloater;
class LLMaterialID;
class LLMediaCtrl;
class LLMenuButton;
+class LLRadioGroup;
class PBRPickerAgentListener;
class PBRPickerObjectListener;
@@ -124,59 +125,62 @@ public:
return new_material;
}
+ LLGLTFMaterial::TextureInfo getPBRTextureInfo();
LLRender::eTexIndex getTextureChannelToEdit();
+ LLRender::eTexIndex getMatTextureChannel();
+ LLRender::eTexIndex getPBRTextureChannel();
LLRender::eTexIndex getTextureDropChannel();
LLGLTFMaterial::TextureInfo getPBRDropChannel();
protected:
- void navigateToTitleMedia(const std::string url);
- bool selectedMediaEditable();
- void clearMediaSettings();
- void updateMediaSettings();
- void updateMediaTitle();
-
- void getState();
-
- void sendTexture(); // applies and sends texture
- void sendTextureInfo(); // applies and sends texture scale, offset, etc.
- void sendColor(); // applies and sends color
- void sendAlpha(); // applies and sends transparency
- void sendBump(U32 bumpiness); // applies and sends bump map
- void sendTexGen(); // applies and sends bump map
- void sendShiny(U32 shininess); // applies and sends shininess
- void sendFullbright(); // applies and sends full bright
-
- void sendGlow();
- void alignTestureLayer();
-
- void updateCopyTexButton();
-
- void onCommitPbr(const LLSD& data);
- void onCancelPbr(const LLSD& data);
- void onSelectPbr(const LLSD& data);
- static bool onDragPbr(LLUICtrl* ctrl, LLInventoryItem* item);
-
- // this function is to return true if the drag should succeed.
- static bool onDragTexture(LLUICtrl* ctrl, LLInventoryItem* item);
-
- void onCommitTexture(const LLSD& data);
- void onCancelTexture(const LLSD& data);
- void onSelectTexture(const LLSD& data);
- void onCommitSpecularTexture(const LLSD& data);
- void onCancelSpecularTexture(const LLSD& data);
- void onSelectSpecularTexture(const LLSD& data);
- void onCommitNormalTexture(const LLSD& data);
- void onCancelNormalTexture(const LLSD& data);
- void onSelectNormalTexture(const LLSD& data);
- void onCommitColor(const LLSD& data);
- void onCommitShinyColor(const LLSD& data);
- void onCommitAlpha(const LLSD& data);
- void onCancelColor(const LLSD& data);
- void onCancelShinyColor(const LLSD& data);
- void onSelectColor(const LLSD& data);
- void onSelectShinyColor(const LLSD& data);
-
- void onCloseTexturePicker(const LLSD& data);
+ void navigateToTitleMedia(const std::string& url);
+ bool selectedMediaEditable();
+ void clearMediaSettings();
+ void updateMediaSettings();
+ void updateMediaTitle();
+
+ void getState();
+
+ void sendTexture(); // applies and sends texture
+ void sendTextureInfo(); // applies and sends texture scale, offset, etc.
+ void sendColor(); // applies and sends color
+ void sendAlpha(); // applies and sends transparency
+ void sendBump(U32 bumpiness); // applies and sends bump map
+ void sendTexGen(); // applies and sends bump map
+ void sendShiny(U32 shininess); // applies and sends shininess
+ void sendFullbright(); // applies and sends full bright
+
+ void sendGlow();
+ void alignTextureLayer();
+
+ void updateCopyTexButton();
+
+ void onCommitPbr();
+ void onCancelPbr();
+ void onSelectPbr();
+
+ // These functions are to return true if the drag should succeed
+ bool onDragPbr(LLInventoryItem* item);
+ bool onDragTexture(LLInventoryItem* item);
+
+ void onCommitTexture();
+ void onCancelTexture();
+ void onSelectTexture();
+ void onCommitSpecularTexture(const LLSD& data);
+ void onCancelSpecularTexture(const LLSD& data);
+ void onSelectSpecularTexture(const LLSD& data);
+ void onCommitNormalTexture(const LLSD& data);
+ void onCancelNormalTexture(const LLSD& data);
+ void onSelectNormalTexture(const LLSD& data);
+ void onCommitColor();
+ void onCommitShinyColor();
+ void onCommitAlpha();
+ void onCancelColor();
+ void onCancelShinyColor();
+ void onSelectColor();
+ void onSelectShinyColor();
+
+ void onCloseTexturePicker(const LLSD& data);
static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response);
static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
@@ -194,81 +198,78 @@ protected:
// Callback funcs for individual controls
//
- static void onCommitTextureInfo(LLUICtrl* ctrl, void* userdata);
- static void onCommitTextureScaleX(LLUICtrl* ctrl, void* userdata);
- static void onCommitTextureScaleY(LLUICtrl* ctrl, void* userdata);
- static void onCommitTextureRot(LLUICtrl* ctrl, void* userdata);
- static void onCommitTextureOffsetX(LLUICtrl* ctrl, void* userdata);
- static void onCommitTextureOffsetY(LLUICtrl* ctrl, void* userdata);
-
- static void onCommitMaterialBumpyScaleX( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialBumpyScaleY( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialBumpyRot( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialBumpyOffsetX( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialBumpyOffsetY( LLUICtrl* ctrl, void* userdata);
-
- static void syncRepeatX(LLPanelFace* self, F32 scaleU);
- static void syncRepeatY(LLPanelFace* self, F32 scaleV);
- static void syncOffsetX(LLPanelFace* self, F32 offsetU);
- static void syncOffsetY(LLPanelFace* self, F32 offsetV);
- static void syncMaterialRot(LLPanelFace* self, F32 rot, int te = -1);
-
- static void onCommitMaterialShinyScaleX( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialShinyScaleY( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialShinyRot( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialShinyOffsetX( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialShinyOffsetY( LLUICtrl* ctrl, void* userdata);
-
- static void onCommitMaterialGloss( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialEnv( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialMaskCutoff( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialID( LLUICtrl* ctrl, void* userdata);
-
- static void onCommitMaterialsMedia( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterialType( LLUICtrl* ctrl, void* userdata);
- static void onCommitPbrType(LLUICtrl* ctrl, void* userdata);
- static void onClickBtnEditMedia(LLUICtrl* ctrl, void* userdata);
- static void onClickBtnDeleteMedia(LLUICtrl* ctrl, void* userdata);
- static void onClickBtnAddMedia(LLUICtrl* ctrl, void* userdata);
- static void onCommitBump( LLUICtrl* ctrl, void* userdata);
- static void onCommitTexGen( LLUICtrl* ctrl, void* userdata);
- static void onCommitShiny( LLUICtrl* ctrl, void* userdata);
- static void onCommitAlphaMode( LLUICtrl* ctrl, void* userdata);
- static void onCommitFullbright( LLUICtrl* ctrl, void* userdata);
- static void onCommitGlow( LLUICtrl* ctrl, void *userdata);
- static void onCommitPlanarAlign( LLUICtrl* ctrl, void* userdata);
- static void onCommitRepeatsPerMeter( LLUICtrl* ctrl, void* userinfo);
-
- void onCommitGLTFTextureScaleU(LLUICtrl* ctrl);
- void onCommitGLTFTextureScaleV(LLUICtrl* ctrl);
- void onCommitGLTFRotation(LLUICtrl* ctrl);
- void onCommitGLTFTextureOffsetU(LLUICtrl* ctrl);
- void onCommitGLTFTextureOffsetV(LLUICtrl* ctrl);
-
- static void onClickAutoFix(void*);
- static void onAlignTexture(void*);
- static void onClickBtnLoadInvPBR(void* userdata);
- static void onClickBtnEditPBR(void* userdata);
- static void onClickBtnSavePBR(void* userdata);
+ void onCommitTextureInfo();
+ void onCommitTextureScaleX();
+ void onCommitTextureScaleY();
+ void onCommitTextureRot();
+ void onCommitTextureOffsetX();
+ void onCommitTextureOffsetY();
+
+ void onCommitMaterialBumpyScaleX();
+ void onCommitMaterialBumpyScaleY();
+ void onCommitMaterialBumpyRot();
+ void onCommitMaterialBumpyOffsetX();
+ void onCommitMaterialBumpyOffsetY();
+
+ void syncRepeatX(F32 scaleU);
+ void syncRepeatY(F32 scaleV);
+ void syncOffsetX(F32 offsetU);
+ void syncOffsetY(F32 offsetV);
+ void syncMaterialRot(F32 rot, int te = -1);
+
+ void onCommitMaterialShinyScaleX();
+ void onCommitMaterialShinyScaleY();
+ void onCommitMaterialShinyRot();
+ void onCommitMaterialShinyOffsetX();
+ void onCommitMaterialShinyOffsetY();
+
+ void onCommitMaterialGloss();
+ void onCommitMaterialEnv();
+ void onCommitMaterialMaskCutoff();
+
+ void onCommitMaterialsMedia();
+ void onCommitMaterialType();
+ void onCommitPbrType();
+ void onClickBtnEditMedia();
+ void onClickBtnDeleteMedia();
+ void onClickBtnAddMedia();
+ void onCommitBump();
+ void onCommitTexGen();
+ void onCommitShiny();
+ void onCommitAlphaMode();
+ void onCommitFullbright();
+ void onCommitGlow();
+ void onCommitPlanarAlign();
+ void onCommitRepeatsPerMeter();
+
+ void onCommitGLTFTextureScaleU();
+ void onCommitGLTFTextureScaleV();
+ void onCommitGLTFRotation();
+ void onCommitGLTFTextureOffsetU();
+ void onCommitGLTFTextureOffsetV();
+
+ void onClickAutoFix();
+ void onAlignTexture();
+ void onClickBtnLoadInvPBR();
+ void onClickBtnEditPBR();
+ void onClickBtnSavePBR();
public: // needs to be accessible to selection manager
- void onCopyColor(); // records all selected faces
- void onPasteColor(); // to specific face
- void onPasteColor(LLViewerObject* objectp, S32 te); // to specific face
- void onCopyTexture();
- void onPasteTexture();
- void onPasteTexture(LLViewerObject* objectp, S32 te);
+ void onCopyColor(); // records all selected faces
+ void onPasteColor(); // to specific face
+ void onPasteColor(LLViewerObject* objectp, S32 te); // to specific face
+ void onCopyTexture();
+ void onPasteTexture();
+ void onPasteTexture(LLViewerObject* objectp, S32 te);
protected:
- void menuDoToSelected(const LLSD& userdata);
- bool menuEnableItem(const LLSD& userdata);
-
- static F32 valueGlow(LLViewerObject* object, S32 face);
-
+ void menuDoToSelected(const LLSD& userdata);
+ bool menuEnableItem(const LLSD& userdata);
+ static F32 valueGlow(LLViewerObject* object, S32 face);
private:
- bool isAlpha() { return mIsAlpha; }
+ bool isAlpha() const { return mIsAlpha; }
// Convenience funcs to keep the visual flack to a minimum
//
@@ -291,9 +292,77 @@ private:
F32 getCurrentShinyOffsetU();
F32 getCurrentShinyOffsetV();
- LLComboBox *mComboMatMedia;
- LLMediaCtrl *mTitleMedia;
- LLTextBox *mTitleMediaText;
+ LLTextureCtrl* mPBRTextureCtrl { nullptr };
+ LLTextureCtrl* mTextureCtrl { nullptr };
+ LLTextureCtrl* mShinyTextureCtrl { nullptr };
+ LLTextureCtrl* mBumpyTextureCtrl { nullptr };
+ LLTextBox* mLabelColor { nullptr };
+ LLColorSwatchCtrl* mColorSwatch { nullptr };
+ LLTextBox* mLabelShiniColor { nullptr };
+ LLColorSwatchCtrl* mShinyColorSwatch { nullptr };
+
+ LLTextBox* mLabelTexGen { nullptr };
+ LLComboBox* mComboTexGen { nullptr };
+
+ LLRadioGroup* mRadioMaterialType { nullptr };
+ LLRadioGroup* mRadioPbrType { nullptr };
+
+ LLCheckBoxCtrl* mCheckFullbright { nullptr };
+
+ LLTextBox* mLabelColorTransp { nullptr };
+ LLSpinCtrl* mCtrlColorTransp { nullptr }; // transparency = 1 - alpha
+
+ LLTextBox* mLabelGlow { nullptr };
+ LLSpinCtrl* mCtrlGlow { nullptr };
+ LLComboBox* mComboMatMedia { nullptr };
+ LLMediaCtrl* mTitleMedia { nullptr };
+ LLTextBox* mTitleMediaText { nullptr };
+
+ LLTextBox* mLabelMatPermLoading { nullptr };
+ LLCheckBoxCtrl* mCheckSyncSettings { nullptr };
+
+ LLTextBox* mLabelBumpiness { nullptr };
+ LLComboBox* mComboBumpiness { nullptr };
+ LLTextBox* mLabelShininess { nullptr };
+ LLComboBox* mComboShininess { nullptr };
+ LLTextBox* mLabelAlphaMode { nullptr };
+ LLComboBox* mComboAlphaMode { nullptr };
+ LLSpinCtrl* mTexScaleU { nullptr };
+ LLSpinCtrl* mTexScaleV { nullptr };
+ LLSpinCtrl* mTexRotate { nullptr };
+ LLSpinCtrl* mTexRepeat { nullptr };
+ LLSpinCtrl* mTexOffsetU { nullptr };
+ LLSpinCtrl* mTexOffsetV { nullptr };
+ LLCheckBoxCtrl* mPlanarAlign{ nullptr };
+ LLSpinCtrl* mBumpyScaleU { nullptr };
+ LLSpinCtrl* mBumpyScaleV { nullptr };
+ LLSpinCtrl* mBumpyRotate { nullptr };
+ LLSpinCtrl* mBumpyOffsetU { nullptr };
+ LLSpinCtrl* mBumpyOffsetV { nullptr };
+ LLSpinCtrl* mShinyScaleU { nullptr };
+ LLSpinCtrl* mShinyScaleV { nullptr };
+ LLSpinCtrl* mShinyRotate { nullptr };
+ LLSpinCtrl* mShinyOffsetU { nullptr };
+ LLSpinCtrl* mShinyOffsetV { nullptr };
+ LLTextBox* mLabelGlossiness { nullptr };
+ LLSpinCtrl* mGlossiness { nullptr };
+ LLTextBox* mLabelEnvironment { nullptr };
+ LLSpinCtrl* mEnvironment { nullptr };
+ LLTextBox* mLabelMaskCutoff { nullptr };
+ LLSpinCtrl* mMaskCutoff { nullptr };
+ LLButton* mAddMedia { nullptr };
+ LLButton* mDelMedia { nullptr };
+ LLSpinCtrl* mPBRScaleU { nullptr };
+ LLSpinCtrl* mPBRScaleV { nullptr };
+ LLSpinCtrl* mPBRRotate { nullptr };
+ LLSpinCtrl* mPBROffsetU { nullptr };
+ LLSpinCtrl* mPBROffsetV { nullptr };
+
+ LLButton* mBtnAlign { nullptr };
+ LLButton* mBtnAlignTex { nullptr };
+ LLButton* mBtnPbrFromInv { nullptr };
+ LLButton* mBtnEditBbr { nullptr };
+ LLButton* mBtnSaveBbr { nullptr };
// Update visibility of controls to match current UI mode
// (e.g. materials vs media editing)
@@ -305,6 +374,20 @@ private:
// Hey look everyone, a type-safe alternative to copy and paste! :)
//
+ template<class T>
+ void getChildSetCommitCallback(T*& ctrl, std::string_view name, std::function<void(LLUICtrl*, const LLSD&)> cb)
+ {
+ ctrl = this->getChild<T>(name);
+ ctrl->setCommitCallback(cb);
+ }
+
+ template<class T>
+ void getChildSetClickedCallback(T*& ctrl, std::string_view name, std::function<void(LLUICtrl*, const LLSD&)> cb)
+ {
+ ctrl = this->getChild<T>(name);
+ ctrl->setClickedCallback(cb);
+ }
+
// Update material parameters by applying 'edit_func' to selected TEs
//
template<
@@ -464,7 +547,7 @@ private:
void updateVisibilityGLTF(LLViewerObject* objectp = nullptr);
void updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*)> func);
- void updateGLTFTextureTransform(float value, U32 pbr_type, std::function<void(LLGLTFMaterial::TextureTransform*)> edit);
+ void updateGLTFTextureTransform(std::function<void(LLGLTFMaterial::TextureTransform*)> edit);
void setMaterialOverridesFromSelection();
@@ -559,41 +642,41 @@ public:
static void getMaxNormalRepeats(F32& repeats, bool& identical);
static void getCurrentDiffuseAlphaMode(U8& diffuse_alpha_mode, bool& identical, bool diffuse_texture_has_alpha);
- 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)
- DEF_GET_MAT_STATE(F32,F32,getSpecularRepeatX,1.0f, true, 0.001f)
- DEF_GET_MAT_STATE(F32,F32,getSpecularRepeatY,1.0f, true, 0.001f)
- DEF_GET_MAT_STATE(F32,F32,getSpecularOffsetX,0.0f, true, 0.001f)
- DEF_GET_MAT_STATE(F32,F32,getSpecularOffsetY,0.0f, true, 0.001f)
- DEF_GET_MAT_STATE(F32,F32,getSpecularRotation,0.0f, true, 0.001f)
-
- DEF_GET_MAT_STATE(F32,F32,getNormalRepeatX,1.0f, true, 0.001f)
- DEF_GET_MAT_STATE(F32,F32,getNormalRepeatY,1.0f, true, 0.001f)
- DEF_GET_MAT_STATE(F32,F32,getNormalOffsetX,0.0f, true, 0.001f)
- DEF_GET_MAT_STATE(F32,F32,getNormalOffsetY,0.0f, true, 0.001f)
- DEF_GET_MAT_STATE(F32,F32,getNormalRotation,0.0f, true, 0.001f)
-
- DEF_EDIT_MAT_STATE(U8,U8,setDiffuseAlphaMode);
- DEF_EDIT_MAT_STATE(U8,U8,setAlphaMaskCutoff);
-
- DEF_EDIT_MAT_STATE(F32,F32,setNormalOffsetX);
- DEF_EDIT_MAT_STATE(F32,F32,setNormalOffsetY);
- DEF_EDIT_MAT_STATE(F32,F32,setNormalRepeatX);
- DEF_EDIT_MAT_STATE(F32,F32,setNormalRepeatY);
- DEF_EDIT_MAT_STATE(F32,F32,setNormalRotation);
-
- DEF_EDIT_MAT_STATE(F32,F32,setSpecularOffsetX);
- DEF_EDIT_MAT_STATE(F32,F32,setSpecularOffsetY);
- DEF_EDIT_MAT_STATE(F32,F32,setSpecularRepeatX);
- DEF_EDIT_MAT_STATE(F32,F32,setSpecularRepeatY);
- DEF_EDIT_MAT_STATE(F32,F32,setSpecularRotation);
-
- DEF_EDIT_MAT_STATE(U8,U8,setEnvironmentIntensity);
- DEF_EDIT_MAT_STATE(U8,U8,setSpecularLightExponent);
-
- DEF_EDIT_MAT_STATE(LLUUID,const LLUUID&,setNormalID);
- DEF_EDIT_MAT_STATE(LLUUID,const LLUUID&,setSpecularID);
- DEF_EDIT_MAT_STATE(LLColor4U, const LLColor4U&,setSpecularLightColor);
+ 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);
+ DEF_GET_MAT_STATE(F32, F32, getSpecularRepeatX, 1.0f, true, 0.001f);
+ DEF_GET_MAT_STATE(F32, F32, getSpecularRepeatY, 1.0f, true, 0.001f);
+ DEF_GET_MAT_STATE(F32, F32, getSpecularOffsetX, 0.0f, true, 0.001f);
+ DEF_GET_MAT_STATE(F32, F32, getSpecularOffsetY, 0.0f, true, 0.001f);
+ DEF_GET_MAT_STATE(F32, F32, getSpecularRotation, 0.0f, true, 0.001f);
+
+ DEF_GET_MAT_STATE(F32, F32, getNormalRepeatX, 1.0f, true, 0.001f);
+ DEF_GET_MAT_STATE(F32, F32, getNormalRepeatY, 1.0f, true, 0.001f);
+ DEF_GET_MAT_STATE(F32, F32, getNormalOffsetX, 0.0f, true, 0.001f);
+ DEF_GET_MAT_STATE(F32, F32, getNormalOffsetY, 0.0f, true, 0.001f);
+ DEF_GET_MAT_STATE(F32, F32, getNormalRotation, 0.0f, true, 0.001f);
+
+ DEF_EDIT_MAT_STATE(U8, U8, setDiffuseAlphaMode);
+ DEF_EDIT_MAT_STATE(U8, U8, setAlphaMaskCutoff);
+
+ DEF_EDIT_MAT_STATE(F32, F32, setNormalOffsetX);
+ DEF_EDIT_MAT_STATE(F32, F32, setNormalOffsetY);
+ DEF_EDIT_MAT_STATE(F32, F32, setNormalRepeatX);
+ DEF_EDIT_MAT_STATE(F32, F32, setNormalRepeatY);
+ DEF_EDIT_MAT_STATE(F32, F32, setNormalRotation);
+
+ DEF_EDIT_MAT_STATE(F32, F32, setSpecularOffsetX);
+ DEF_EDIT_MAT_STATE(F32, F32, setSpecularOffsetY);
+ DEF_EDIT_MAT_STATE(F32, F32, setSpecularRepeatX);
+ DEF_EDIT_MAT_STATE(F32, F32, setSpecularRepeatY);
+ DEF_EDIT_MAT_STATE(F32, F32, setSpecularRotation);
+
+ DEF_EDIT_MAT_STATE(U8, U8, setEnvironmentIntensity);
+ DEF_EDIT_MAT_STATE(U8, U8, setSpecularLightExponent);
+
+ DEF_EDIT_MAT_STATE(LLUUID, const LLUUID&,setNormalID);
+ DEF_EDIT_MAT_STATE(LLUUID, const LLUUID&,setSpecularID);
+ DEF_EDIT_MAT_STATE(LLColor4U, const LLColor4U&, setSpecularLightColor);
};
class LLSelectedTE
@@ -619,6 +702,8 @@ public:
DEF_GET_TE_STATE(LLTextureEntry::e_texgen,LLTextureEntry::e_texgen,getTexGen,LLTextureEntry::TEX_GEN_DEFAULT, false, LLTextureEntry::TEX_GEN_DEFAULT)
DEF_GET_TE_STATE(LLColor4,const LLColor4&,getColor,LLColor4::white, false, LLColor4::black);
};
+
+ friend struct LLPanelFaceSetTEFunctor;
};
#endif
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 4aa4b13f2c..65aa1876b0 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -110,7 +110,7 @@ void LLPanelGroup::onOpen(const LLSD& key)
if(!key.has("action"))
{
setGroupID(group_id);
- getChild<LLAccordionCtrl>("groups_accordion")->expandDefaultTab();
+ mGroupsAccordion->expandDefaultTab();
return;
}
@@ -145,24 +145,26 @@ void LLPanelGroup::onOpen(const LLSD& key)
bool LLPanelGroup::postBuild()
{
+ mGroupsAccordion = getChild<LLAccordionCtrl>("groups_accordion");
+
mDefaultNeedsApplyMesg = getString("default_needs_apply_text");
mWantApplyMesg = getString("want_apply_text");
- LLButton* button;
+ mButtonApply = getChild<LLButton>("btn_apply");
+ mButtonApply->setClickedCallback(onBtnApply, this);
+ mButtonApply->setVisible(true);
+ mButtonApply->setEnabled(false);
- button = getChild<LLButton>("btn_apply");
- button->setClickedCallback(onBtnApply, this);
- button->setVisible(true);
- button->setEnabled(false);
+ mButtonCall = getChild<LLButton>("btn_call");
+ mButtonCall->setClickedCallback(onBtnGroupCallClicked, this);
- button = getChild<LLButton>("btn_call");
- button->setClickedCallback(onBtnGroupCallClicked, this);
+ mButtonChat = getChild<LLButton>("btn_chat");
+ mButtonChat->setClickedCallback(onBtnGroupChatClicked, this);
- button = getChild<LLButton>("btn_chat");
- button->setClickedCallback(onBtnGroupChatClicked, this);
+ mButtonRefresh = getChild<LLButton>("btn_refresh");
+ mButtonRefresh->setClickedCallback(onBtnRefresh, this);
- button = getChild<LLButton>("btn_refresh");
- button->setClickedCallback(onBtnRefresh, this);
+ mGroupNameCtrl = getChild<LLUICtrl>("group_name");
childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL);
@@ -181,7 +183,7 @@ bool LLPanelGroup::postBuild()
if(panel_general)
{
panel_general->setupCtrls(this);
- button = panel_general->getChild<LLButton>("btn_join");
+ LLButton* button = panel_general->getChild<LLButton>("btn_join");
button->setVisible(false);
button->setEnabled(true);
@@ -196,9 +198,8 @@ bool LLPanelGroup::postBuild()
return true;
}
-void LLPanelGroup::reposButton(const std::string& name)
+void LLPanelGroup::reposButton(LLButton* button)
{
- LLButton* button = findChild<LLButton>(name);
if(!button)
return;
LLRect btn_rect = button->getRect();
@@ -208,23 +209,10 @@ void LLPanelGroup::reposButton(const std::string& name)
void LLPanelGroup::reposButtons()
{
- LLButton* button_refresh = findChild<LLButton>("btn_refresh");
- LLButton* button_cancel = findChild<LLButton>("btn_cancel");
-
- if(button_refresh && button_cancel && button_refresh->getVisible() && button_cancel->getVisible())
- {
- LLRect btn_refresh_rect = button_refresh->getRect();
- LLRect btn_cancel_rect = button_cancel->getRect();
- btn_refresh_rect.setLeftTopAndSize( btn_cancel_rect.mLeft + btn_cancel_rect.getWidth() + 2,
- btn_refresh_rect.getHeight() + 2, btn_refresh_rect.getWidth(), btn_refresh_rect.getHeight());
- button_refresh->setRect(btn_refresh_rect);
- }
-
- reposButton("btn_apply");
- reposButton("btn_refresh");
- reposButton("btn_cancel");
- reposButton("btn_chat");
- reposButton("btn_call");
+ reposButton(mButtonApply);
+ reposButton(mButtonRefresh);
+ reposButton(mButtonChat);
+ reposButton(mButtonCall);
}
void LLPanelGroup::reshape(S32 width, S32 height, bool called_from_parent )
@@ -276,9 +264,9 @@ void LLPanelGroup::onBtnJoin()
}
else
{
- LL_DEBUGS() << "joining group: " << mID << LL_ENDL;
- LLGroupActions::join(mID);
-}
+ LL_DEBUGS() << "joining group: " << mID << LL_ENDL;
+ LLGroupActions::join(mID);
+ }
}
void LLPanelGroup::changed(LLGroupChange gc)
@@ -296,7 +284,7 @@ void LLPanelGroup::onChange(EStatusType status, const LLSD& channelInfo, bool pr
return;
}
- childSetEnabled("btn_call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
+ mButtonCall->setEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
}
void LLPanelGroup::notifyObservers()
@@ -310,9 +298,8 @@ void LLPanelGroup::update(LLGroupChange gc)
if(gdatap)
{
std::string group_name = gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName;
- LLUICtrl* group_name_ctrl = getChild<LLUICtrl>("group_name");
- group_name_ctrl->setValue(group_name);
- group_name_ctrl->setToolTip(group_name);
+ mGroupNameCtrl->setValue(group_name);
+ mGroupNameCtrl->setToolTip(group_name);
LLGroupData agent_gdatap;
bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlikeWithoutAdminMenuFakery();
@@ -364,37 +351,24 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(gdatap)
{
std::string group_name = gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName;
- LLUICtrl* group_name_ctrl = getChild<LLUICtrl>("group_name");
- group_name_ctrl->setValue(group_name);
- group_name_ctrl->setToolTip(group_name);
+ mGroupNameCtrl->setValue(group_name);
+ mGroupNameCtrl->setToolTip(group_name);
}
- LLButton* button_apply = findChild<LLButton>("btn_apply");
- LLButton* button_refresh = findChild<LLButton>("btn_refresh");
-
- LLButton* button_cancel = findChild<LLButton>("btn_cancel");
- LLButton* button_call = findChild<LLButton>("btn_call");
- LLButton* button_chat = findChild<LLButton>("btn_chat");
-
-
bool is_null_group_id = group_id == LLUUID::null;
- if(button_apply)
- button_apply->setVisible(!is_null_group_id);
- if(button_refresh)
- button_refresh->setVisible(!is_null_group_id);
-
- if(button_cancel)
- button_cancel->setVisible(!is_null_group_id);
+ if(mButtonApply)
+ mButtonApply->setVisible(!is_null_group_id);
+ if(mButtonRefresh)
+ mButtonRefresh->setVisible(!is_null_group_id);
- if(button_call)
- button_call->setVisible(!is_null_group_id);
- if(button_chat)
- button_chat->setVisible(!is_null_group_id);
+ if(mButtonCall)
+ mButtonCall->setVisible(!is_null_group_id);
+ if(mButtonChat)
+ mButtonChat->setVisible(!is_null_group_id);
getChild<LLUICtrl>("prepend_founded_by")->setVisible(!is_null_group_id);
- LLAccordionCtrl* tab_ctrl = getChild<LLAccordionCtrl>("groups_accordion");
- tab_ctrl->reset();
+ mGroupsAccordion->reset();
LLAccordionCtrlTab* tab_general = getChild<LLAccordionCtrlTab>("group_general_tab");
LLAccordionCtrlTab* tab_roles = getChild<LLAccordionCtrlTab>("group_roles_tab");
@@ -425,13 +399,13 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
tab_land->setVisible(false);
tab_experiences->setVisible(false);
- getChild<LLUICtrl>("group_name")->setVisible(false);
+ mGroupNameCtrl->setVisible(false);
getChild<LLUICtrl>("group_name_editor")->setVisible(true);
- if(button_call)
- button_call->setVisible(false);
- if(button_chat)
- button_chat->setVisible(false);
+ if(mButtonCall)
+ mButtonCall->setVisible(false);
+ if(mButtonChat)
+ mButtonChat->setVisible(false);
}
else
{
@@ -457,18 +431,18 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
tab_land->setVisible(is_member);
tab_experiences->setVisible(is_member);
- getChild<LLUICtrl>("group_name")->setVisible(true);
+ mGroupNameCtrl->setVisible(true);
getChild<LLUICtrl>("group_name_editor")->setVisible(false);
- if(button_apply)
- button_apply->setVisible(is_member);
- if(button_call)
- button_call->setVisible(is_member);
- if(button_chat)
- button_chat->setVisible(is_member);
+ if(mButtonApply)
+ mButtonApply->setVisible(is_member);
+ if(mButtonCall)
+ mButtonCall->setVisible(is_member);
+ if(mButtonChat)
+ mButtonChat->setVisible(is_member);
}
- tab_ctrl->arrange();
+ mGroupsAccordion->arrange();
reposButtons();
update(GC_ALL);//show/hide "join" button if data is already ready
@@ -536,20 +510,18 @@ void LLPanelGroup::draw()
if (mRefreshTimer.hasExpired())
{
mRefreshTimer.stop();
- childEnable("btn_refresh");
- childEnable("groups_accordion");
+ if(mButtonRefresh) mButtonRefresh->setEnabled(true);
+ mGroupsAccordion->setEnabled(true);
}
- LLButton* button_apply = findChild<LLButton>("btn_apply");
-
- if(button_apply && button_apply->getVisible())
+ if(mButtonApply && mButtonApply->getVisible())
{
bool enable = false;
std::string mesg;
for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
enable = enable || (*it)->needsApply(mesg);
- childSetEnabled("btn_apply", enable);
+ mButtonApply->setEnabled(enable);
}
}
@@ -565,8 +537,8 @@ void LLPanelGroup::refreshData()
setGroupID(getID());
// 5 second timeout
- childDisable("btn_refresh");
- childDisable("groups_accordion");
+ if(mButtonRefresh) mButtonRefresh->setEnabled(false);
+ mGroupsAccordion->setEnabled(false);
mRefreshTimer.start();
mRefreshTimer.setTimerExpirySec(5);
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index ede8118720..fa0e1d4104 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -33,11 +33,12 @@
class LLOfferInfo;
-const F32 UPDATE_MEMBERS_SECONDS_PER_FRAME = 0.005; // 5ms
+const F32 UPDATE_MEMBERS_SECONDS_PER_FRAME = 0.005f; // 5ms
// Forward declares
class LLPanelGroupTab;
class LLTabContainer;
+class LLAccordionCtrl;
class LLAgent;
@@ -98,7 +99,7 @@ protected:
static void onBtnGroupCallClicked(void*);
static void onBtnGroupChatClicked(void*);
- void reposButton(const std::string& name);
+ void reposButton(LLButton* button);
void reposButtons();
@@ -114,7 +115,14 @@ protected:
std::vector<LLPanelGroupTab* > mTabs;
- LLButton* mButtonJoin;
+ LLAccordionCtrl* mGroupsAccordion = nullptr;
+
+ LLUICtrl* mGroupNameCtrl = nullptr;
+ LLButton* mButtonJoin = nullptr;
+ LLButton* mButtonApply = nullptr;
+ LLButton* mButtonCall = nullptr;
+ LLButton* mButtonChat = nullptr;
+ LLButton* mButtonRefresh = nullptr;
LLUICtrl* mJoinText;
};
diff --git a/indra/newview/llpanelgroupbulk.cpp b/indra/newview/llpanelgroupbulk.cpp
index f54ec45a3c..433db74cda 100644
--- a/indra/newview/llpanelgroupbulk.cpp
+++ b/indra/newview/llpanelgroupbulk.cpp
@@ -68,33 +68,36 @@ LLPanelGroupBulkImpl::LLPanelGroupBulkImpl(const LLUUID& group_id) :
mAlreadyInGroup(),
mConfirmedOwnerInvite(false),
mListFullNotificationSent(false)
-{}
+{
+}
LLPanelGroupBulkImpl::~LLPanelGroupBulkImpl()
{
- if(mAvatarNameCacheConnection.connected())
+ if (mAvatarNameCacheConnection.connected())
{
mAvatarNameCacheConnection.disconnect();
}
}
+// static
void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
{
- LLPanelGroupBulk* panelp = (LLPanelGroupBulk*)userdata;
-
- if(panelp)
+ if (LLPanelGroupBulk* panelp = (LLPanelGroupBulk*)userdata)
{
- //Right now this is hard coded with some knowledge that it is part
- //of a floater since the avatar picker needs to be added as a dependent
- //floater to the parent floater.
- //Soon the avatar picker will be embedded into this panel
- //instead of being it's own separate floater. But that is next week.
- //This will do for now. -jwolk May 10, 2006
+ // Right now this is hard coded with some knowledge that it is part
+ // of a floater since the avatar picker needs to be added as a dependent
+ // floater to the parent floater.
+ // Soon the avatar picker will be embedded into this panel
+ // instead of being it's own separate floater. But that is next week.
+ // This will do for now. -jwolk May 10, 2006
LLView* button = panelp->findChild<LLButton>("add_button");
LLFloater* root_floater = gFloaterView->getParentFloater(panelp);
LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
- boost::bind(callbackAddUsers, _1, panelp->mImplementation), true, false, false, root_floater->getName(), button);
- if(picker)
+ [&](const uuid_vec_t& agent_ids, const std::vector<LLAvatarName>&)
+ {
+ panelp->mImplementation->addUsers(agent_ids);
+ }, true, false, false, root_floater->getName(), button);
+ if (picker)
{
root_floater->addDependentFloater(picker);
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(panelp->mImplementation->mGroupID);
@@ -102,70 +105,72 @@ void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
}
}
+// static
void LLPanelGroupBulkImpl::callbackClickRemove(void* userdata)
{
- LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
- if (selfp)
+ if (LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata)
+ {
selfp->handleRemove();
+ }
}
+// static
void LLPanelGroupBulkImpl::callbackClickCancel(void* userdata)
{
- LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
- if(selfp)
+ if (LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata)
+ {
(*(selfp->mCloseCallback))(selfp->mCloseCallbackUserData);
+ }
}
+// static
void LLPanelGroupBulkImpl::callbackSelect(LLUICtrl* ctrl, void* userdata)
{
- LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
- if (selfp)
+ if (LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata)
+ {
selfp->handleSelection();
+ }
}
-void LLPanelGroupBulkImpl::callbackAddUsers(const uuid_vec_t& agent_ids, void* user_data)
+void LLPanelGroupBulkImpl::addUsers(const uuid_vec_t& agent_ids)
{
std::vector<std::string> names;
- for (S32 i = 0; i < (S32)agent_ids.size(); i++)
+ for (const LLUUID& agent_id : agent_ids)
{
LLAvatarName av_name;
- if (LLAvatarNameCache::get(agent_ids[i], &av_name))
+ if (LLAvatarNameCache::get(agent_id, &av_name))
{
- onAvatarNameCache(agent_ids[i], av_name, user_data);
+ onAvatarNameCache(agent_id, av_name);
}
else
{
- LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*) user_data;
- if (selfp)
+ if (mAvatarNameCacheConnection.connected())
{
- if (selfp->mAvatarNameCacheConnection.connected())
- {
- selfp->mAvatarNameCacheConnection.disconnect();
- }
- // *TODO : Add a callback per avatar name being fetched.
- selfp->mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_ids[i],boost::bind(onAvatarNameCache, _1, _2, user_data));
+ mAvatarNameCacheConnection.disconnect();
}
+ // *TODO : Add a callback per avatar name being fetched.
+ mAvatarNameCacheConnection = 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, void* user_data)
+void LLPanelGroupBulkImpl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
{
- LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*) user_data;
-
- if (selfp)
+ if (mAvatarNameCacheConnection.connected())
{
- if (selfp->mAvatarNameCacheConnection.connected())
- {
- selfp->mAvatarNameCacheConnection.disconnect();
- }
- std::vector<std::string> names;
- uuid_vec_t agent_ids;
- agent_ids.push_back(agent_id);
- names.push_back(av_name.getCompleteName());
-
- selfp->addUsers(names, agent_ids);
+ mAvatarNameCacheConnection.disconnect();
}
+
+ std::vector<std::string> names;
+ uuid_vec_t agent_ids;
+ agent_ids.push_back(agent_id);
+ names.push_back(av_name.getCompleteName());
+
+ addUsers(names, agent_ids);
}
void LLPanelGroupBulkImpl::handleRemove()
@@ -174,17 +179,15 @@ void LLPanelGroupBulkImpl::handleRemove()
if (selection.empty())
return;
- std::vector<LLScrollListItem*>::iterator iter;
- for(iter = selection.begin(); iter != selection.end(); ++iter)
+ for (const LLScrollListItem* item : selection)
{
- mInviteeIDs.erase((*iter)->getUUID());
+ mInviteeIDs.erase(item->getUUID());
}
mBulkAgentList->deleteSelectedItems();
mRemoveButton->setEnabled(false);
- if( mOKButton && mOKButton->getEnabled() &&
- mBulkAgentList->isEmpty())
+ if (mOKButton && mOKButton->getEnabled() && mBulkAgentList->isEmpty())
{
mOKButton->setEnabled(false);
}
@@ -192,24 +195,17 @@ void LLPanelGroupBulkImpl::handleRemove()
void LLPanelGroupBulkImpl::handleSelection()
{
- std::vector<LLScrollListItem*> selection = mBulkAgentList->getAllSelected();
- if (selection.empty())
- mRemoveButton->setEnabled(false);
- else
- mRemoveButton->setEnabled(true);
+ mRemoveButton->setEnabled(mBulkAgentList->getFirstSelected());
}
void LLPanelGroupBulkImpl::addUsers(const std::vector<std::string>& names, const uuid_vec_t& agent_ids)
{
- std::string name;
- LLUUID id;
-
- if(mListFullNotificationSent)
+ if (mListFullNotificationSent)
{
return;
}
- if( !mListFullNotificationSent &&
+ if (!mListFullNotificationSent &&
(names.size() + mInviteeIDs.size() > MAX_GROUP_INVITES))
{
mListFullNotificationSent = true;
@@ -223,32 +219,35 @@ void LLPanelGroupBulkImpl::addUsers(const std::vector<std::string>& names, const
for (S32 i = 0; i < (S32)names.size(); ++i)
{
- name = names[i];
- id = agent_ids[i];
+ const LLUUID& id = agent_ids[i];
- if(mInviteeIDs.find(id) != mInviteeIDs.end())
+ if (mInviteeIDs.find(id) != mInviteeIDs.end())
{
continue;
}
- //add the name to the names list
+ // Add the name to the name list
LLSD row;
row["id"] = id;
- row["columns"][0]["value"] = name;
+ row["columns"][0]["value"] = names[i];
mBulkAgentList->addElement(row);
mInviteeIDs.insert(id);
// We've successfully added someone to the list.
- if(mOKButton && !mOKButton->getEnabled())
+ if (mOKButton && !mOKButton->getEnabled())
+ {
mOKButton->setEnabled(true);
+ }
}
}
void LLPanelGroupBulkImpl::setGroupName(std::string name)
{
- if(mGroupName)
+ if (mGroupName)
+ {
mGroupName->setText(name);
+ }
}
@@ -258,7 +257,8 @@ LLPanelGroupBulk::LLPanelGroupBulk(const LLUUID& group_id) :
mPendingGroupPropertiesUpdate(false),
mPendingRoleDataUpdate(false),
mPendingMemberDataUpdate(false)
-{}
+{
+}
LLPanelGroupBulk::~LLPanelGroupBulk()
{
@@ -269,11 +269,15 @@ void LLPanelGroupBulk::clear()
{
mImplementation->mInviteeIDs.clear();
- if(mImplementation->mBulkAgentList)
+ if (mImplementation->mBulkAgentList)
+ {
mImplementation->mBulkAgentList->deleteAllItems();
+ }
- if(mImplementation->mOKButton)
+ if (mImplementation->mOKButton)
+ {
mImplementation->mOKButton->setEnabled(false);
+ }
}
void LLPanelGroupBulk::update()
@@ -292,12 +296,14 @@ void LLPanelGroupBulk::updateGroupName()
{
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
- if( gdatap &&
+ if (gdatap &&
gdatap->isGroupPropertiesDataComplete())
{
// Only do work if the current group name differs
- if(mImplementation->mGroupName->getText().compare(gdatap->mName) != 0)
+ if (mImplementation->mGroupName->getText().compare(gdatap->mName) != 0)
+ {
mImplementation->setGroupName(gdatap->mName);
+ }
}
else
{
@@ -308,43 +314,34 @@ void LLPanelGroupBulk::updateGroupName()
void LLPanelGroupBulk::updateGroupData()
{
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
- if(gdatap && gdatap->isGroupPropertiesDataComplete())
+ if (gdatap && gdatap->isGroupPropertiesDataComplete())
{
mPendingGroupPropertiesUpdate = false;
}
- else
+ else if (!mPendingGroupPropertiesUpdate)
{
- if(!mPendingGroupPropertiesUpdate)
- {
- mPendingGroupPropertiesUpdate = true;
- LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID);
- }
+ mPendingGroupPropertiesUpdate = true;
+ LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID);
}
- if(gdatap && gdatap->isRoleDataComplete())
+ if (gdatap && gdatap->isRoleDataComplete())
{
mPendingRoleDataUpdate = false;
}
- else
+ else if (!mPendingRoleDataUpdate)
{
- if(!mPendingRoleDataUpdate)
- {
- mPendingRoleDataUpdate = true;
- LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID);
- }
+ mPendingRoleDataUpdate = true;
+ LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID);
}
- if(gdatap && gdatap->isMemberDataComplete())
+ if (gdatap && gdatap->isMemberDataComplete())
{
mPendingMemberDataUpdate = false;
}
- else
+ else if (!mPendingMemberDataUpdate)
{
- if(!mPendingMemberDataUpdate)
- {
- mPendingMemberDataUpdate = true;
- LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID);
- }
+ mPendingMemberDataUpdate = true;
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID);
}
}
@@ -367,21 +364,20 @@ void LLPanelGroupBulk::setCloseCallback(void (*close_callback)(void*), void* dat
void LLPanelGroupBulk::addUsers(uuid_vec_t& agent_ids)
{
std::vector<std::string> names;
- for (S32 i = 0; i < (S32)agent_ids.size(); i++)
+ for (size_t i = 0; i < agent_ids.size(); i++)
{
std::string fullname;
- LLUUID agent_id = agent_ids[i];
+ const LLUUID& agent_id = agent_ids[i];
LLViewerObject* dest = gObjectList.findObject(agent_id);
- if(dest && dest->isAvatar())
+ if (dest && dest->isAvatar())
{
LLNameValue* nvfirst = dest->getNVPair("FirstName");
LLNameValue* nvlast = dest->getNVPair("LastName");
- if(nvfirst && nvlast)
+ if (nvfirst && nvlast)
{
- fullname = LLCacheName::buildFullName(
- nvfirst->getString(), nvlast->getString());
-
+ fullname = LLCacheName::buildFullName(nvfirst->getString(), nvlast->getString());
}
+
if (!fullname.empty())
{
names.push_back(fullname);
@@ -394,20 +390,25 @@ void LLPanelGroupBulk::addUsers(uuid_vec_t& agent_ids)
}
else
{
- //looks like user try to invite offline friend
- //for offline avatar_id gObjectList.findObject() will return null
- //so we need to do this additional search in avatar tracker, see EXT-4732
+ // Looks like the user tries to invite a friend which is offline.
+ // For offline avatar_id gObjectList.findObject() will return null
+ // so we need to do this additional search in avatar tracker, see EXT-4732
if (LLAvatarTracker::instance().isBuddy(agent_id))
{
LLAvatarName av_name;
if (!LLAvatarNameCache::get(agent_id, &av_name))
{
- // actually it should happen, just in case
- LLAvatarNameCache::get(LLUUID(agent_id), boost::bind(&LLPanelGroupBulk::addUserCallback, this, _1, _2));
+ // Actually it shouldn't happen, just in case
+ LLAvatarNameCache::get(LLUUID(agent_id),
+ [&](const LLUUID& agent_id, const LLAvatarName& av_name)
+ {
+ addUserCallback(agent_id, av_name);
+ });
// for this special case!
- //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+ // when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
// removed id will be added in callback
agent_ids.erase(agent_ids.begin() + i);
+ i--; // To process the next agent_id with the same index
}
else
{
diff --git a/indra/newview/llpanelgroupbulkimpl.h b/indra/newview/llpanelgroupbulkimpl.h
index 963780200a..5a479f8117 100644
--- a/indra/newview/llpanelgroupbulkimpl.h
+++ b/indra/newview/llpanelgroupbulkimpl.h
@@ -50,9 +50,10 @@ public:
static void callbackClickCancel(void* userdata);
static void callbackSelect(LLUICtrl* ctrl, void* userdata);
- static void callbackAddUsers(const uuid_vec_t& agent_ids, void* user_data);
- static void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, void* user_data);
+ void addUsers(const uuid_vec_t& agent_ids);
+
+ void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
void handleRemove();
void handleSelection();
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index bc56b49e5d..4404efff98 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -812,20 +812,14 @@ bool LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
{
LLPanelGroupSubTab::postBuildSubTab(root);
- // Upcast parent so we can ask it for sibling controls.
- LLPanelGroupRoles* parent = (LLPanelGroupRoles*) root;
-
// Look recursively from the parent to find all our widgets.
- bool recurse = true;
- mHeader = parent->findChild<LLPanel>("members_header", recurse);
- mFooter = parent->findChild<LLPanel>("members_footer", recurse);
-
- mMembersList = parent->getChild<LLNameListCtrl>("member_list", recurse);
- mAssignedRolesList = parent->getChild<LLScrollListCtrl>("member_assigned_roles", recurse);
- mAllowedActionsList = parent->getChild<LLScrollListCtrl>("member_allowed_actions", recurse);
- mActionDescription = parent->getChild<LLTextEditor>("member_action_description", recurse);
+ mHeader = root->findChild<LLPanel>("members_header");
+ mFooter = root->findChild<LLPanel>("members_footer");
- if (!mMembersList || !mAssignedRolesList || !mAllowedActionsList || !mActionDescription) return false;
+ mMembersList = root->getChild<LLNameListCtrl>("member_list");
+ mAssignedRolesList = root->getChild<LLScrollListCtrl>("member_assigned_roles");
+ mAllowedActionsList = root->getChild<LLScrollListCtrl>("member_allowed_actions");
+ mActionDescription = root->getChild<LLTextEditor>("member_action_description");
mAllowedActionsList->setCommitOnSelectionChange(true);
mAllowedActionsList->setCommitCallback(boost::bind(&LLPanelGroupMembersSubTab::updateActionDescription, this));
@@ -844,31 +838,22 @@ bool LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
row["columns"][2]["column"] = "online";
mMembersList->addElement(row);
std::string order_by = gSavedSettings.getString("GroupMembersSortOrder");
- if(!order_by.empty())
+ if (!order_by.empty())
{
mMembersList->sortByColumn(order_by, true);
}
- LLButton* button = parent->getChild<LLButton>("member_invite", recurse);
- if ( button )
- {
- button->setClickedCallback(onInviteMember, this);
- button->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_INVITE));
- }
+ LLButton* button = root->getChild<LLButton>("member_invite");
+ button->setClickedCallback(onInviteMember, this);
+ button->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_INVITE));
- mEjectBtn = parent->getChild<LLButton>("member_eject", recurse);
- if ( mEjectBtn )
- {
- mEjectBtn->setClickedCallback(onEjectMembers, this);
- mEjectBtn->setEnabled(false);
- }
+ mEjectBtn = root->getChild<LLButton>("member_eject");
+ mEjectBtn->setClickedCallback(onEjectMembers, this);
+ mEjectBtn->setEnabled(false);
- mBanBtn = parent->getChild<LLButton>("member_ban", recurse);
- if(mBanBtn)
- {
- mBanBtn->setClickedCallback(onBanMember, this);
- mBanBtn->setEnabled(false);
- }
+ mBanBtn = root->getChild<LLButton>("member_ban");
+ mBanBtn->setClickedCallback(onBanMember, this);
+ mBanBtn->setEnabled(false);
return true;
}
@@ -1371,11 +1356,14 @@ void LLPanelGroupMembersSubTab::activate()
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
LLPanelGroupSubTab::activate();
- if(!mActivated)
+ if (!mActivated)
{
if (!gdatap || !gdatap->isMemberDataComplete())
{
- LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
+ const U32 page_size = 50;
+ std::string sort_column_name = mMembersList->getSortColumnName();
+ bool sort_descending = !mMembersList->getSortAscending();
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID, page_size, 0, sort_column_name, sort_descending);
}
if (!gdatap || !gdatap->isRoleMemberDataComplete())
@@ -1483,8 +1471,7 @@ bool LLPanelGroupMembersSubTab::addOwnerCB(const LLSD& notification, const LLSD&
void LLPanelGroupMembersSubTab::applyMemberChanges()
{
- //sucks to do a find again here, but it is in constant time, so, could
- //be worse
+ // Sucks to do a find again here, but it is in constant time, so, could be worse
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (!gdatap)
{
@@ -1492,8 +1479,7 @@ void LLPanelGroupMembersSubTab::applyMemberChanges()
return;
}
- //we need to add all of the changed roles data
- //for each member whose role changed
+ // We need to add all of the changed roles data for each member whose role changed
for (member_role_changes_map_t::iterator member = mMemberRoleChangeData.begin();
member != mMemberRoleChangeData.end(); ++member)
{
@@ -1511,7 +1497,7 @@ void LLPanelGroupMembersSubTab::applyMemberChanges()
mMemberRoleChangeData.clear();
LLGroupMgr::getInstance()->sendGroupRoleMemberChanges(mGroupID);
- //force a UI update
+ // Force an UI update
handleMemberSelect();
mChanged = false;
@@ -1522,32 +1508,23 @@ void LLPanelGroupMembersSubTab::applyMemberChanges()
bool LLPanelGroupMembersSubTab::matchesSearchFilter(const std::string& fullname)
{
// If the search filter is empty, everything passes.
- if (mSearchFilter.empty()) return true;
+ if (mSearchFilter.empty())
+ return true;
// Create a full name, and compare it to the search filter.
std::string fullname_lc(fullname);
LLStringUtil::toLower(fullname_lc);
std::string::size_type match = fullname_lc.find(mSearchFilter);
-
- if (std::string::npos == match)
- {
- // not found
- return false;
- }
- else
- {
- return true;
- }
+ return match != std::string::npos;
}
U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& agent_id)
{
- //we loop over all of the changes
- //if we are adding a role, then we simply add the role's powers
- //if we are removing a role, we store that role id away
- //and then we have to build the powers up bases on the roles the agent
- //is in
+ // We loop over all of the changes
+ // If we are adding a role, then we simply add the role's powers
+ // If we are removing a role, we store that role id away
+ // and then we have to build the powers up bases on the roles the agent is in
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (!gdatap)
@@ -1557,7 +1534,7 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag
}
LLGroupMgrGroupData::member_list_t::iterator iter = gdatap->mMembers.find(agent_id);
- if ( iter == gdatap->mMembers.end() )
+ if (iter == gdatap->mMembers.end())
{
LL_WARNS() << "LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges() -- No member data for member with UUID " << agent_id << LL_ENDL;
return GP_NO_POWERS;
@@ -1570,37 +1547,36 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag
return GP_NO_POWERS;
}
- //see if there are unsaved role changes for this agent
+ // See if there are unsaved role changes for this agent
role_change_data_map_t* role_change_datap = NULL;
member_role_changes_map_t::iterator member = mMemberRoleChangeData.find(agent_id);
- if ( member != mMemberRoleChangeData.end() )
+ if (member != mMemberRoleChangeData.end())
{
- //this member has unsaved role changes
- //so grab them
- role_change_datap = (*member).second;
+ // This member has unsaved role changes
+ // so grab them
+ role_change_datap = member->second;
}
U64 new_powers = GP_NO_POWERS;
- if ( role_change_datap )
+ if (role_change_datap)
{
uuid_vec_t roles_to_be_removed;
- for (role_change_data_map_t::iterator role = role_change_datap->begin();
- role != role_change_datap->end(); ++ role)
+ for (const auto& role : *role_change_datap)
{
- if ( role->second == RMC_ADD )
+ if (role.second == RMC_ADD)
{
- new_powers |= gdatap->getRolePowers(role->first);
+ new_powers |= gdatap->getRolePowers(role.first);
}
else
{
- roles_to_be_removed.push_back(role->first);
+ roles_to_be_removed.push_back(role.first);
}
}
- //loop over the member's current roles, summing up
- //the powers (not including the role we are removing)
+ // loop over the member's current roles, summing up
+ // the powers (not including the role we are removing)
for (LLGroupMemberData::role_list_t::iterator current_role = member_data->roleBegin();
current_role != member_data->roleEnd(); ++current_role)
{
@@ -1661,9 +1637,10 @@ void LLPanelGroupMembersSubTab::draw()
void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
{
- if (mGroupID.isNull()) return;
+ if (mGroupID.isNull())
+ return;
- if ( GC_TITLES == gc || GC_PROPERTIES == gc )
+ if (GC_TITLES == gc || GC_PROPERTIES == gc)
{
// Don't care about title or general group properties updates.
return;
@@ -1677,9 +1654,9 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
}
// Wait for both all data to be retrieved before displaying anything.
- if ( gdatap->isMemberDataComplete()
- && gdatap->isRoleDataComplete()
- && gdatap->isRoleMemberDataComplete())
+ if (gdatap->isMemberDataComplete() &&
+ gdatap->isRoleDataComplete() &&
+ gdatap->isRoleMemberDataComplete())
{
mMemberProgress = gdatap->mMembers.begin();
mPendingMemberUpdate = true;
@@ -1690,18 +1667,18 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
// Build a string with info on retrieval progress.
std::ostringstream retrieved;
- if ( gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && !gdatap->mMembers.size() )
+ if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && !gdatap->mMembers.size())
{
// MAINT-5237
retrieved << "Member list not available.";
}
- else if ( !gdatap->isMemberDataComplete() )
+ else if (!gdatap->isMemberDataComplete())
{
// Still busy retreiving member list.
retrieved << "Retrieving member list (" << gdatap->mMembers.size()
<< " / " << gdatap->mMemberCount << ")...";
}
- else if( !gdatap->isRoleDataComplete() )
+ else if (!gdatap->isRoleDataComplete())
{
// Still busy retreiving role list.
retrieved << "Retrieving role list (" << gdatap->mRoles.size()
@@ -1719,7 +1696,9 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
void LLPanelGroupMembersSubTab::addMemberToList(LLGroupMemberData* data)
{
- if (!data) return;
+ if (!data)
+ return;
+
LLUIString donated = getString("donation_area");
donated.setArg("[AREA]", llformat("%d", data->getContribution()));
@@ -1765,7 +1744,7 @@ void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemb
if (matchesSearchFilter(av_name.getAccountName()))
{
addMemberToList(member);
- if(!mMembersList->getEnabled())
+ if (!mMembersList->getEnabled())
{
mMembersList->setEnabled(true);
}
@@ -1788,15 +1767,15 @@ void LLPanelGroupMembersSubTab::updateMembers()
// Make sure all data is still complete. Incomplete data
// may occur if we refresh.
- if ( !gdatap->isMemberDataComplete()
- || !gdatap->isRoleDataComplete()
- || !gdatap->isRoleMemberDataComplete())
+ if (!gdatap->isMemberDataComplete() ||
+ !gdatap->isRoleDataComplete() ||
+ !gdatap->isRoleMemberDataComplete())
{
return;
}
- //cleanup list only for first iteration
- if(mMemberProgress == gdatap->mMembers.begin())
+ // Cleanup list only for first iteration
+ if (mMemberProgress == gdatap->mMembers.begin())
{
mMembersList->deleteAllItems();
}
@@ -1806,7 +1785,7 @@ void LLPanelGroupMembersSubTab::updateMembers()
LLTimer update_time;
update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);
- for( ; mMemberProgress != end && !update_time.hasExpired(); ++mMemberProgress)
+ for (; mMemberProgress != end && !update_time.hasExpired(); ++mMemberProgress)
{
if (!mMemberProgress->second)
continue;
@@ -1866,7 +1845,8 @@ void LLPanelGroupMembersSubTab::onBanMember(void* user_data)
void LLPanelGroupMembersSubTab::confirmBanMembers()
{
std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
- if (selection.empty()) return;
+ if (selection.empty())
+ return;
auto selection_count = selection.size();
if (selection_count == 1)
@@ -1912,8 +1892,7 @@ void LLPanelGroupMembersSubTab::updateActionDescription()
return;
}
- LLRoleAction* rap = (LLRoleAction*)action_item->getUserdata();
- if (rap)
+ if (LLRoleAction* rap = (LLRoleAction*)action_item->getUserdata())
{
std::string desc = rap->mLongDescription.empty() ? rap->mDescription : rap->mLongDescription;
mActionDescription->setText(desc);
@@ -1923,23 +1902,22 @@ void LLPanelGroupMembersSubTab::updateActionDescription()
void LLPanelGroupMembersSubTab::handleBanMember()
{
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if(!gdatap)
+ if (!gdatap)
{
LL_WARNS("Groups") << "Unable to get group data for group " << mGroupID << LL_ENDL;
return;
}
std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
- if(selection.empty())
+ if (selection.empty())
{
return;
}
uuid_vec_t ban_ids;
- std::vector<LLScrollListItem*>::iterator itor;
- for(itor = selection.begin(); itor != selection.end(); ++itor)
+ for (const LLScrollListItem* item : selection)
{
- LLUUID ban_id = (*itor)->getUUID();
+ LLUUID ban_id = item->getUUID();
ban_ids.push_back(ban_id);
LLGroupBanData ban_data;
@@ -1983,54 +1961,33 @@ bool LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root)
LLPanelGroupRoles* parent = (LLPanelGroupRoles*) root;
// Look recursively from the parent to find all our widgets.
- bool recurse = true;
- mHeader = parent->findChild<LLPanel>("roles_header", recurse);
- mFooter = parent->findChild<LLPanel>("roles_footer", recurse);
-
-
- mRolesList = parent->getChild<LLScrollListCtrl>("role_list", recurse);
- mAssignedMembersList = parent->getChild<LLNameListCtrl>("role_assigned_members", recurse);
- mAllowedActionsList = parent->getChild<LLScrollListCtrl>("role_allowed_actions", recurse);
- mActionDescription = parent->getChild<LLTextEditor>("role_action_description", recurse);
+ mHeader = parent->findChild<LLPanel>("roles_header");
+ mFooter = parent->findChild<LLPanel>("roles_footer");
- mRoleName = parent->getChild<LLLineEditor>("role_name", recurse);
- mRoleTitle = parent->getChild<LLLineEditor>("role_title", recurse);
- mRoleDescription = parent->getChild<LLTextEditor>("role_description", recurse);
+ mRolesList = parent->getChild<LLScrollListCtrl>("role_list");
+ mAssignedMembersList = parent->getChild<LLNameListCtrl>("role_assigned_members");
+ mAllowedActionsList = parent->getChild<LLScrollListCtrl>("role_allowed_actions");
+ mActionDescription = parent->getChild<LLTextEditor>("role_action_description");
- mMemberVisibleCheck = parent->getChild<LLCheckBoxCtrl>("role_visible_in_list", recurse);
+ mRoleName = parent->getChild<LLLineEditor>("role_name");
+ mRoleTitle = parent->getChild<LLLineEditor>("role_title");
+ mRoleDescription = parent->getChild<LLTextEditor>("role_description");
- if (!mRolesList || !mAssignedMembersList || !mAllowedActionsList || !mActionDescription
- || !mRoleName || !mRoleTitle || !mRoleDescription || !mMemberVisibleCheck)
- {
- LL_WARNS() << "ARG! element not found." << LL_ENDL;
- return false;
- }
+ mMemberVisibleCheck = parent->getChild<LLCheckBoxCtrl>("role_visible_in_list");
mRemoveEveryoneTxt = getString("cant_delete_role");
- mCreateRoleButton =
- parent->getChild<LLButton>("role_create", recurse);
- if ( mCreateRoleButton )
- {
- mCreateRoleButton->setClickedCallback(onCreateRole, this);
- mCreateRoleButton->setEnabled(false);
- }
+ mCreateRoleButton = parent->getChild<LLButton>("role_create");
+ mCreateRoleButton->setClickedCallback(onCreateRole, this);
+ mCreateRoleButton->setEnabled(false);
- mCopyRoleButton =
- parent->getChild<LLButton>("role_copy", recurse);
- if ( mCopyRoleButton )
- {
- mCopyRoleButton->setClickedCallback(onCopyRole, this);
- mCopyRoleButton->setEnabled(false);
- }
+ mCopyRoleButton = parent->getChild<LLButton>("role_copy");
+ mCopyRoleButton->setClickedCallback(onCopyRole, this);
+ mCopyRoleButton->setEnabled(false);
- mDeleteRoleButton =
- parent->getChild<LLButton>("role_delete", recurse);
- if ( mDeleteRoleButton )
- {
- mDeleteRoleButton->setClickedCallback(onDeleteRole, this);
- mDeleteRoleButton->setEnabled(false);
- }
+ mDeleteRoleButton = parent->getChild<LLButton>("role_delete");
+ mDeleteRoleButton->setClickedCallback(onDeleteRole, this);
+ mDeleteRoleButton->setEnabled(false);
mRolesList->setCommitOnSelectionChange(true);
mRolesList->setCommitCallback(onRoleSelect, this);
@@ -2949,26 +2906,19 @@ void LLPanelGroupActionsSubTab::handleActionSelect()
mActionMembers->deleteAllItems();
mActionRoles->deleteAllItems();
- U64 power_mask = GP_NO_POWERS;
- std::vector<LLScrollListItem*> selection =
- mActionList->getAllSelected();
- if (selection.empty()) return;
-
- LLRoleAction* rap;
+ std::vector<LLScrollListItem*> selection = mActionList->getAllSelected();
+ if (selection.empty())
+ return;
- std::vector<LLScrollListItem*>::iterator itor;
- for (itor = selection.begin() ;
- itor != selection.end(); ++itor)
+ U64 power_mask = GP_NO_POWERS;
+ for (const LLScrollListItem* item : selection)
{
- rap = (LLRoleAction*)( (*itor)->getUserdata() );
- power_mask |= rap->mPowerBit;
+ power_mask |= ((LLRoleAction*)item->getUserdata())->mPowerBit;
}
if (selection.size() == 1)
{
- LLScrollListItem* item = selection[0];
- rap = (LLRoleAction*)(item->getUserdata());
-
+ LLRoleAction* rap = (LLRoleAction*)selection.front()->getUserdata();
if (rap->mLongDescription.empty())
{
mActionDescription->setText(rap->mDescription);
@@ -2985,21 +2935,19 @@ void LLPanelGroupActionsSubTab::handleActionSelect()
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if (!gdatap) return;
+ if (!gdatap)
+ return;
if (gdatap->isMemberDataComplete())
{
- LLGroupMgrGroupData::member_list_t::iterator it = gdatap->mMembers.begin();
- LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
- LLGroupMemberData* gmd;
-
- for ( ; it != end; ++it)
+ for (const auto& it : gdatap->mMembers)
{
- gmd = (*it).second;
- if (!gmd) continue;
- if ((gmd->getAgentPowers() & power_mask) == power_mask)
+ if (LLGroupMemberData* gmd = it.second)
{
- mActionMembers->addNameItem(gmd->getID());
+ if ((gmd->getAgentPowers() & power_mask) == power_mask)
+ {
+ mActionMembers->addNameItem(gmd->getID());
+ }
}
}
}
diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp
index 3e22374294..07f4a710db 100644
--- a/indra/newview/llpanelland.cpp
+++ b/indra/newview/llpanelland.cpp
@@ -58,14 +58,26 @@ public:
bool LLPanelLandInfo::postBuild()
{
- childSetAction("button buy land",boost::bind(onClickClaim));
- childSetAction("button abandon land", boost::bind(onClickRelease));
- childSetAction("button subdivide land", boost::bind(onClickDivide));
- childSetAction("button join land", boost::bind(onClickJoin));
- childSetAction("button about land", boost::bind(onClickAbout));
+ mButtonBuyLand = getChild<LLButton>("button buy land");
+ mButtonBuyLand->setCommitCallback(boost::bind(&LLPanelLandInfo::onClickClaim, this));
+
+ mButtonAbandonLand = getChild<LLButton>("button abandon land");
+ mButtonAbandonLand->setCommitCallback(boost::bind(&LLPanelLandInfo::onClickRelease, this));
+
+ mButtonSubdivLand = getChild<LLButton>("button subdivide land");
+ mButtonSubdivLand->setCommitCallback(boost::bind(&LLPanelLandInfo::onClickDivide, this));
+
+ mButtonJoinLand = getChild<LLButton>("button join land");
+ mButtonJoinLand->setCommitCallback(boost::bind(&LLPanelLandInfo::onClickJoin, this));
+
+ mButtonAboutLand = getChild<LLButton>("button about land");
+ mButtonAboutLand->setCommitCallback(boost::bind(&LLPanelLandInfo::onClickAbout, this));
mCheckShowOwners = getChild<LLCheckBoxCtrl>("checkbox show owners");
- getChild<LLUICtrl>("checkbox show owners")->setValue(gSavedSettings.getBOOL("ShowParcelOwners"));
+ mCheckShowOwners->setValue(gSavedSettings.getBOOL("ShowParcelOwners"));
+
+ mTextArea = getChild<LLTextBox>("label_area");
+ mTextAreaPrice = getChild<LLTextBox>("label_area_price");
return true;
}
@@ -119,17 +131,14 @@ void LLPanelLandInfo::refresh()
if (!parcel || !regionp)
{
// nothing selected, disable panel
- getChildView("label_area_price")->setVisible(false);
- getChildView("label_area")->setVisible(false);
-
- //mTextPrice->setText(LLStringUtil::null);
- getChild<LLUICtrl>("textbox price")->setValue(LLStringUtil::null);
-
- getChildView("button buy land")->setEnabled(false);
- getChildView("button abandon land")->setEnabled(false);
- getChildView("button subdivide land")->setEnabled(false);
- getChildView("button join land")->setEnabled(false);
- getChildView("button about land")->setEnabled(false);
+ mTextAreaPrice->setVisible(false);
+ mTextArea->setVisible(false);
+
+ mButtonBuyLand->setEnabled(false);
+ mButtonAbandonLand->setEnabled(false);
+ mButtonSubdivLand->setEnabled(false);
+ mButtonJoinLand->setEnabled(false);
+ mButtonAboutLand->setEnabled(false);
}
else
{
@@ -147,11 +156,11 @@ void LLPanelLandInfo::refresh()
if (is_public && !LLViewerParcelMgr::getInstance()->getParcelSelection()->getMultipleOwners())
{
- getChildView("button buy land")->setEnabled(true);
+ mButtonBuyLand->setEnabled(true);
}
else
{
- getChildView("button buy land")->setEnabled(can_buy);
+ mButtonBuyLand->setEnabled(can_buy);
}
bool owner_release = LLViewerParcelMgr::isParcelOwnedByAgent(parcel, GP_LAND_RELEASE);
@@ -163,16 +172,16 @@ void LLPanelLandInfo::refresh()
bool manager_divideable = ( gAgent.canManageEstate()
&& ((parcel->getOwnerID() == regionp->getOwner()) || owner_divide) );
- getChildView("button abandon land")->setEnabled(owner_release || manager_releaseable || gAgent.isGodlike());
+ mButtonAbandonLand->setEnabled(owner_release || manager_releaseable || gAgent.isGodlike());
// only mainland sims are subdividable by owner
if (regionp->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))
{
- getChildView("button subdivide land")->setEnabled(owner_divide || manager_divideable || gAgent.isGodlike());
+ mButtonSubdivLand->setEnabled(owner_divide || manager_divideable || gAgent.isGodlike());
}
else
{
- getChildView("button subdivide land")->setEnabled(manager_divideable || gAgent.isGodlike());
+ mButtonSubdivLand->setEnabled(manager_divideable || gAgent.isGodlike());
}
// To join land, must have something selected,
@@ -183,15 +192,15 @@ void LLPanelLandInfo::refresh()
//&& LLViewerParcelMgr::getInstance()->getSelfCount() > 1
&& !LLViewerParcelMgr::getInstance()->getParcelSelection()->getWholeParcelSelected())
{
- getChildView("button join land")->setEnabled(true);
+ mButtonJoinLand->setEnabled(true);
}
else
{
LL_DEBUGS() << "Invalid selection for joining land" << LL_ENDL;
- getChildView("button join land")->setEnabled(false);
+ mButtonJoinLand->setEnabled(false);
}
- getChildView("button about land")->setEnabled(true);
+ mButtonAboutLand->setEnabled(true);
// show pricing information
S32 area;
@@ -206,47 +215,42 @@ void LLPanelLandInfo::refresh()
&dwell);
if(is_public || (is_for_sale && LLViewerParcelMgr::getInstance()->getParcelSelection()->getWholeParcelSelected()))
{
- getChild<LLUICtrl>("label_area_price")->setTextArg("[PRICE]", llformat("%d",claim_price));
- getChild<LLUICtrl>("label_area_price")->setTextArg("[AREA]", llformat("%d",area));
- getChildView("label_area_price")->setVisible(true);
- getChildView("label_area")->setVisible(false);
+ mTextAreaPrice->setTextArg("[PRICE]", llformat("%d",claim_price));
+ mTextAreaPrice->setTextArg("[AREA]", llformat("%d",area));
+ mTextAreaPrice->setVisible(true);
+ mTextArea->setVisible(false);
}
else
{
- getChildView("label_area_price")->setVisible(false);
- getChild<LLUICtrl>("label_area")->setTextArg("[AREA]", llformat("%d",area));
- getChildView("label_area")->setVisible(true);
+ mTextAreaPrice->setVisible(false);
+ mTextArea->setTextArg("[AREA]", llformat("%d",area));
+ mTextArea->setVisible(true);
}
}
}
-//static
void LLPanelLandInfo::onClickClaim()
{
LLViewerParcelMgr::getInstance()->startBuyLand();
}
-//static
void LLPanelLandInfo::onClickRelease()
{
LLViewerParcelMgr::getInstance()->startReleaseLand();
}
-// static
void LLPanelLandInfo::onClickDivide()
{
LLViewerParcelMgr::getInstance()->startDivideLand();
}
-// static
void LLPanelLandInfo::onClickJoin()
{
LLViewerParcelMgr::getInstance()->startJoinLand();
}
-//static
void LLPanelLandInfo::onClickAbout()
{
// Promote the rectangle selection to a parcel selection
diff --git a/indra/newview/llpanelland.h b/indra/newview/llpanelland.h
index 7d0c6936bd..aeadee4085 100644
--- a/indra/newview/llpanelland.h
+++ b/indra/newview/llpanelland.h
@@ -46,20 +46,27 @@ public:
void refresh() override;
static void refreshAll();
- LLCheckBoxCtrl *mCheckShowOwners;
-
protected:
- static void onClickClaim();
- static void onClickRelease();
- static void onClickDivide();
- static void onClickJoin();
- static void onClickAbout();
+ void onClickClaim();
+ void onClickRelease();
+ void onClickDivide();
+ void onClickJoin();
+ void onClickAbout();
protected:
bool postBuild() override;
static LLPanelLandSelectObserver* sObserver;
static LLPanelLandInfo* sInstance;
+private:
+ LLCheckBoxCtrl *mCheckShowOwners = nullptr;
+ LLButton* mButtonBuyLand = nullptr;
+ LLButton* mButtonAbandonLand = nullptr;
+ LLButton* mButtonSubdivLand = nullptr;
+ LLButton* mButtonJoinLand = nullptr;
+ LLButton* mButtonAboutLand = nullptr;
+ LLTextBox* mTextArea = nullptr;
+ LLTextBox* mTextAreaPrice = nullptr;
};
#endif
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 00fd17badf..a1bf25fb05 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -30,7 +30,6 @@
#include "llpanel.h"
#include "llpointer.h" // LLPointer<>
#include "llmediactrl.h" // LLMediaCtrlObserver
-#include <boost/scoped_ptr.hpp>
class LLLineEditor;
class LLUIImage;
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index ba52da0760..2466ee5973 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -154,28 +154,30 @@ bool LLPanelMainInventory::postBuild()
//panel->getFilter().markDefault();
// Set up the default inv. panel/filter settings.
- mActivePanel = getChild<LLInventoryPanel>(ALL_ITEMS);
- if (mActivePanel)
+ mAllItemsPanel = getChild<LLInventoryPanel>(ALL_ITEMS);
+ if (mAllItemsPanel)
{
// "All Items" is the previous only view, so it gets the InventorySortOrder
- mActivePanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
- mActivePanel->getFilter().markDefault();
- mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
- mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
+ mAllItemsPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
+ mAllItemsPanel->getFilter().markDefault();
+ mAllItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ mAllItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mAllItemsPanel, _1, _2));
mResortActivePanel = true;
}
- LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>(RECENT_ITEMS);
- if (recent_items_panel)
+ mActivePanel = mAllItemsPanel;
+
+ mRecentPanel = getChild<LLInventoryPanel>(RECENT_ITEMS);
+ if (mRecentPanel)
{
// assign default values until we will be sure that we have setting to restore
- recent_items_panel->setSinceLogoff(true);
- recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
- recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- LLInventoryFilter& recent_filter = recent_items_panel->getFilter();
+ mRecentPanel->setSinceLogoff(true);
+ mRecentPanel->setSortOrder(LLInventoryFilter::SO_DATE);
+ mRecentPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ LLInventoryFilter& recent_filter = mRecentPanel->getFilter();
recent_filter.setFilterObjectTypes(recent_filter.getFilterObjectTypes() & ~(0x1 << LLInventoryType::IT_CATEGORY));
recent_filter.setEmptyLookupMessage("InventoryNoMatchingRecentItems");
recent_filter.markDefault();
- recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
+ mRecentPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mRecentPanel, _1, _2));
}
mWornItemsPanel = getChild<LLInventoryPanel>(WORN_ITEMS);
@@ -211,17 +213,17 @@ bool LLPanelMainInventory::postBuild()
// Load the persistent "Recent Items" settings.
// Note that the "All Items" settings do not persist.
- if(recent_items_panel)
+ if(mRecentPanel)
{
- if(savedFilterState.has(recent_items_panel->getFilter().getName()))
+ if(savedFilterState.has(mRecentPanel->getFilter().getName()))
{
LLSD recent_items = savedFilterState.get(
- recent_items_panel->getFilter().getName());
+ mRecentPanel->getFilter().getName());
LLInventoryFilter::Params p;
LLParamSDParser parser;
parser.readSD(recent_items, p);
- recent_items_panel->getFilter().fromParams(p);
- recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
+ mRecentPanel->getFilter().fromParams(p);
+ mRecentPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
}
}
if(mActivePanel)
@@ -301,31 +303,29 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
// for example, LLParamSDParser doesn't know about U64,
// so some FilterOps params should be revised.
LLSD filterRoot;
- LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>(ALL_ITEMS);
- if (all_items_panel)
+ if (mAllItemsPanel)
{
LLSD filterState;
LLInventoryPanel::InventoryState p;
- all_items_panel->getFilter().toParams(p.filter);
- all_items_panel->getRootViewModel().getSorter().toParams(p.sort);
+ mAllItemsPanel->getFilter().toParams(p.filter);
+ mAllItemsPanel->getRootViewModel().getSorter().toParams(p.sort);
if (p.validateBlock(false))
{
LLParamSDParser().writeSD(filterState, p);
- filterRoot[all_items_panel->getName()] = filterState;
+ filterRoot[mAllItemsPanel->getName()] = filterState;
}
}
- LLInventoryPanel* panel = findChild<LLInventoryPanel>(RECENT_ITEMS);
- if (panel)
+ if (mRecentPanel)
{
LLSD filterState;
LLInventoryPanel::InventoryState p;
- panel->getFilter().toParams(p.filter);
- panel->getRootViewModel().getSorter().toParams(p.sort);
+ mRecentPanel->getFilter().toParams(p.filter);
+ mRecentPanel->getRootViewModel().getSorter().toParams(p.sort);
if (p.validateBlock(false))
{
LLParamSDParser().writeSD(filterState, p);
- filterRoot[panel->getName()] = filterState;
+ filterRoot[mRecentPanel->getName()] = filterState;
}
}
@@ -362,7 +362,7 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
{
- return getChild<LLInventoryPanel>(ALL_ITEMS);
+ return mAllItemsPanel;
}
void LLPanelMainInventory::selectAllItemsPanel()
@@ -372,7 +372,7 @@ void LLPanelMainInventory::selectAllItemsPanel()
bool LLPanelMainInventory::isRecentItemsPanelSelected()
{
- return (RECENT_ITEMS == getActivePanel()->getName());
+ return (mRecentPanel == getActivePanel());
}
void LLPanelMainInventory::startSearch()
@@ -759,14 +759,9 @@ void LLPanelMainInventory::onClearSearch()
}
mFilterSubString = "";
- LLSidepanelInventory * sidepanel_inventory = getParentSidepanelInventory();
- if (sidepanel_inventory)
+ if (mInboxPanel)
{
- LLPanelMarketplaceInbox* inbox_panel = sidepanel_inventory->getChild<LLPanelMarketplaceInbox>("marketplace_inbox");
- if (inbox_panel)
- {
- inbox_panel->onClearSearch();
- }
+ mInboxPanel->onClearSearch();
}
}
@@ -816,14 +811,9 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
// set new filter string
setFilterSubString(mFilterSubString);
- LLSidepanelInventory * sidepanel_inventory = getParentSidepanelInventory();
- if (sidepanel_inventory)
+ if (mInboxPanel)
{
- LLPanelMarketplaceInbox* inbox_panel = sidepanel_inventory->getChild<LLPanelMarketplaceInbox>("marketplace_inbox");
- if (inbox_panel)
- {
- inbox_panel->onFilterEdit(search_string);
- }
+ mInboxPanel->onFilterEdit(search_string);
}
}
@@ -1077,8 +1067,8 @@ void LLPanelMainInventory::toggleFindOptions()
void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
{
- getChild<LLInventoryPanel>(ALL_ITEMS)->setSelectCallback(cb);
- getChild<LLInventoryPanel>(RECENT_ITEMS)->setSelectCallback(cb);
+ mAllItemsPanel->setSelectCallback(cb);
+ mRecentPanel->setSelectCallback(cb);
}
void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, bool user_action)
@@ -1177,7 +1167,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
return;
// Get data needed for filter display
- U32 filter_types = mFilter->getFilterObjectTypes();
+ U32 filter_types = (U32)mFilter->getFilterObjectTypes();
LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
U32 hours = mFilter->getHoursAgo();
U32 date_search_direction = mFilter->getDateSearchDirection();
@@ -1482,10 +1472,10 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
void LLPanelMainInventory::initListCommandsHandlers()
{
childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
- childSetAction("view_mode_btn", boost::bind(&LLPanelMainInventory::onViewModeClick, this));
- childSetAction("up_btn", boost::bind(&LLPanelMainInventory::onUpFolderClicked, this));
- childSetAction("back_btn", boost::bind(&LLPanelMainInventory::onBackFolderClicked, this));
- childSetAction("forward_btn", boost::bind(&LLPanelMainInventory::onForwardFolderClicked, this));
+ mViewModeBtn->setCommitCallback(boost::bind(&LLPanelMainInventory::onViewModeClick, this));
+ mUpBtn->setCommitCallback(boost::bind(&LLPanelMainInventory::onUpFolderClicked, this));
+ mBackBtn->setCommitCallback(boost::bind(&LLPanelMainInventory::onBackFolderClicked, this));
+ mForwardBtn->setCommitCallback(boost::bind(&LLPanelMainInventory::onForwardFolderClicked, this));
mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
mEnableCallbackRegistrar.add("Inventory.GearDefault.Check", boost::bind(&LLPanelMainInventory::isActionChecked, this, _2));
@@ -1528,17 +1518,13 @@ void LLPanelMainInventory::onAddButtonClick()
void LLPanelMainInventory::setActivePanel()
{
// Todo: should cover gallery mode in some way
- if(mSingleFolderMode && isListViewMode())
- {
- mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
- }
- else if(mSingleFolderMode && isCombinationViewMode())
+ if(mSingleFolderMode && (isListViewMode() || isCombinationViewMode()))
{
- mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
+ mActivePanel = mCombinationInventoryPanel;
}
else
{
- mActivePanel = (LLInventoryPanel*)getChild<LLTabContainer>("inventory filter tabs")->getCurrentPanel();
+ mActivePanel = (LLInventoryPanel*)mFilterTabs->getCurrentPanel();
}
mViewModeBtn->setEnabled(mSingleFolderMode || (getAllItemsPanel() == getActivePanel()));
}
@@ -1550,12 +1536,9 @@ void LLPanelMainInventory::initSingleFolderRoot(const LLUUID& start_folder_id)
void LLPanelMainInventory::initInventoryViews()
{
- LLInventoryPanel* all_item = getChild<LLInventoryPanel>(ALL_ITEMS);
- all_item->initializeViewBuilding();
- LLInventoryPanel* recent_item = getChild<LLInventoryPanel>(RECENT_ITEMS);
- recent_item->initializeViewBuilding();
- LLInventoryPanel* worn_item = getChild<LLInventoryPanel>(WORN_ITEMS);
- worn_item->initializeViewBuilding();
+ mAllItemsPanel->initializeViewBuilding();
+ mRecentPanel->initializeViewBuilding();
+ mWornItemsPanel->initializeViewBuilding();
}
void LLPanelMainInventory::toggleViewMode()
@@ -1579,16 +1562,15 @@ void LLPanelMainInventory::toggleViewMode()
updateTitle();
onFilterSelected();
- LLSidepanelInventory* sidepanel_inventory = getParentSidepanelInventory();
- if (sidepanel_inventory)
+ if (mParentSidepanel)
{
if(mSingleFolderMode)
{
- sidepanel_inventory->hideInbox();
+ mParentSidepanel->hideInbox();
}
else
{
- sidepanel_inventory->toggleInbox();
+ mParentSidepanel->toggleInbox();
}
}
}
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index cad2501645..3347ab904b 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -49,6 +49,8 @@ class LLSidepanelInventory;
class LLToggleableMenu;
class LLFloater;
class LLFloaterSidePanelContainer;
+class LLSidepanelInventory;
+class LLPanelMarketplaceInbox;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLPanelMainInventory
@@ -137,6 +139,9 @@ public:
LLInventoryFilter& getCurrentFilter();
+ void setParentSidepanel(LLSidepanelInventory* parent_sidepanel) { mParentSidepanel = parent_sidepanel; }
+ void setInboxPanel(LLPanelMarketplaceInbox* inbox_panel) { mInboxPanel = inbox_panel; }
+
protected:
//
// Misc functions
@@ -184,7 +189,9 @@ private:
LLUICtrl* mCounterCtrl;
LLHandle<LLFloater> mFinderHandle;
LLInventoryPanel* mActivePanel;
- LLInventoryPanel* mWornItemsPanel;
+ LLInventoryPanel* mAllItemsPanel = nullptr;
+ LLInventoryPanel* mRecentPanel = nullptr;
+ LLInventoryPanel* mWornItemsPanel = nullptr;
bool mResortActivePanel;
LLSaveFolderState* mSavedFolderState;
std::string mFilterText;
@@ -242,6 +249,9 @@ protected:
void setUploadCostIfNeeded();
void disableAddIfNeeded();
private:
+ LLSidepanelInventory* mParentSidepanel = nullptr;
+ LLPanelMarketplaceInbox* mInboxPanel = nullptr;
+
LLToggleableMenu* mMenuGearDefault;
LLToggleableMenu* mMenuViewDefault;
LLToggleableMenu* mMenuVisibility;
diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp
index 0925351350..35961da579 100644
--- a/indra/newview/llpanelmarketplaceinbox.cpp
+++ b/indra/newview/llpanelmarketplaceinbox.cpp
@@ -119,7 +119,7 @@ void LLPanelMarketplaceInbox::onFocusReceived()
sidepanel_inventory->clearSelections(true, false);
}
- gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", (U32)time_corrected());
}
bool LLPanelMarketplaceInbox::handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg)
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
index 526462b940..557c7bbd7b 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -225,7 +225,7 @@ void LLInboxFolderViewFolder::deFreshify()
{
mFresh = false;
- gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", (U32)time_corrected());
LLInboxNewItemsStorage::getInstance()->removeItem(static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getUUID());
}
@@ -304,7 +304,7 @@ void LLInboxFolderViewItem::deFreshify()
{
mFresh = false;
- gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", (U32)time_corrected());
}
LLInboxNewItemsStorage::LLInboxNewItemsStorage()
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index ce545ae21d..4cd4afaa5a 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -434,6 +434,8 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()
delete mCOFDragAndDropObserver;
+ delete mWearableListViewItemsComparator;
+
while (!mListViewItemTypes.empty()) {
delete mListViewItemTypes.back();
mListViewItemTypes.pop_back();
@@ -476,8 +478,10 @@ bool LLPanelOutfitEdit::postBuild()
mFolderViewBtn = getChild<LLButton>("folder_view_btn");
mListViewBtn = getChild<LLButton>("list_view_btn");
+ mFilterPanel = getChild<LLView>("filter_panel");
+ mFilterBtn = getChild<LLButton>("filter_button");
+ mFilterBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this));
- childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL);
childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesFolderView, this), NULL);
childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL);
childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL);
@@ -530,13 +534,17 @@ bool LLPanelOutfitEdit::postBuild()
mSearchFilter = getChild<LLFilterEditor>("look_item_filter");
mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2));
- childSetAction("show_add_wearables_btn", boost::bind(&LLPanelOutfitEdit::onAddMoreButtonClicked, this));
+ mShowAddWearablesBtn = getChild<LLButton>("show_add_wearables_btn");
+ mShowAddWearablesBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onAddMoreButtonClicked, this));
mPlusBtn = getChild<LLButton>("plus_btn");
mPlusBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onPlusBtnClicked, this));
childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
+ mNoAddWearablesButtonBar = getChild<LLUICtrl>("no_add_wearables_button_bar");
+ mAddWearablesButtonBar = getChild<LLUICtrl>("add_wearables_button_bar");
+
/*
* By default AT_CLOTHING are sorted by (in in MY OUTFITS):
* - by type (types order determined in LLWearableType::EType)
@@ -567,7 +575,11 @@ bool LLPanelOutfitEdit::postBuild()
getChild<LLButton>(SAVE_BTN)->setCommitCallback(boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));
getChild<LLButton>(SAVE_AS_BTN)->setCommitCallback(boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true));
+ mLoadingIndicator = getChild<LLLoadingIndicator>("edit_outfit_loading_indicator");
+ mOutfitNameStatusPanel = getChild<LLPanel>("outfit_name_and_status");
+
onOutfitChanging(gAgentWearables.isCOFChangeInProgress());
+
return true;
}
@@ -603,15 +615,15 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)
{
mAddWearablesPanel->setVisible(show_add_wearables);
- getChild<LLUICtrl>("show_add_wearables_btn")->setValue(show_add_wearables);
+ mShowAddWearablesBtn->setValue(show_add_wearables);
updateFiltersVisibility();
- getChildView("filter_button")->setVisible( show_add_wearables);
+ mFilterBtn->setVisible( show_add_wearables);
//search filter should be disabled
if (!show_add_wearables)
{
- getChild<LLUICtrl>("filter_button")->setValue(false);
+ mFilterBtn->setValue(false);
mFolderViewFilterCmbBox->setVisible(false);
mListViewFilterCmbBox->setVisible(false);
@@ -638,15 +650,15 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)
}
//switching button bars
- getChildView("no_add_wearables_button_bar")->setVisible( !show_add_wearables);
- getChildView("add_wearables_button_bar")->setVisible( show_add_wearables);
+ mNoAddWearablesButtonBar->setVisible( !show_add_wearables);
+ mAddWearablesButtonBar->setVisible( show_add_wearables);
}
void LLPanelOutfitEdit::showWearablesFilter()
{
- bool filter_visible = getChild<LLUICtrl>("filter_button")->getValue();
+ bool filter_visible = mFilterBtn->getValue();
- getChildView("filter_panel")->setVisible( filter_visible);
+ mFilterPanel->setVisible(filter_visible);
if(!filter_visible)
{
@@ -1309,19 +1321,17 @@ static void update_status_widget_rect(LLView * widget, S32 right_border)
void LLPanelOutfitEdit::onOutfitChanging(bool started)
{
- static LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("edit_outfit_loading_indicator");
- static LLView* status_panel = getChild<LLView>("outfit_name_and_status");
- static S32 indicator_delta = status_panel->getRect().getWidth() - indicator->getRect().mLeft;
+ S32 indicator_delta = mOutfitNameStatusPanel->getRect().getWidth() - mLoadingIndicator->getRect().mLeft;
S32 delta = started ? indicator_delta : 0;
- S32 right_border = status_panel->getRect().getWidth() - delta;
+ S32 right_border = mOutfitNameStatusPanel->getRect().getWidth() - delta;
if (mCurrentOutfitName)
update_status_widget_rect(mCurrentOutfitName, right_border);
if (mStatus)
update_status_widget_rect(mStatus, right_border);
- indicator->setVisible(started);
+ mLoadingIndicator->setVisible(started);
}
void LLPanelOutfitEdit::getCurrentItemUUID(LLUUID& selected_id)
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 384b7faee4..a989d93d9e 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -59,6 +59,7 @@ class LLMenuGL;
class LLFindNonLinksByMask;
class LLFindWearablesOfType;
class LLWearableItemTypeNameComparator;
+class LLLoadingIndicator;
class LLPanelOutfitEdit : public LLPanel
{
@@ -218,7 +219,14 @@ private:
LLButton* mFolderViewBtn;
LLButton* mListViewBtn;
LLButton* mPlusBtn;
+ LLButton* mShowAddWearablesBtn = nullptr;
+ LLButton* mFilterBtn = nullptr;
LLPanel* mAddWearablesPanel;
+ LLPanel* mOutfitNameStatusPanel = nullptr;
+ LLLoadingIndicator* mLoadingIndicator = nullptr;
+ LLView* mFilterPanel = nullptr;
+ LLUICtrl* mNoAddWearablesButtonBar = nullptr;
+ LLUICtrl* mAddWearablesButtonBar = nullptr;
LLComboBox* mFolderViewFilterCmbBox;
LLComboBox* mListViewFilterCmbBox;
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 5b595a48b7..47c02793a3 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -252,7 +252,8 @@ void LLPanelOutfitsInventory::openApearanceTab(const std::string& tab_name)
void LLPanelOutfitsInventory::initListCommandsHandlers()
{
mListCommands = getChild<LLPanel>("bottom_panel");
- mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this));
+ mWearBtn = mListCommands->getChild<LLButton>("wear_btn");
+ mWearBtn->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this));
mMyOutfitsPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
mOutfitGalleryPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
}
@@ -263,14 +264,12 @@ void LLPanelOutfitsInventory::updateListCommands()
bool wear_enabled = isActionEnabled("wear");
bool wear_visible = !isCOFPanelActive();
bool make_outfit_enabled = isActionEnabled("save_outfit");
-
- LLButton* wear_btn = mListCommands->getChild<LLButton>("wear_btn");
mMyOutfitsPanel->childSetEnabled("trash_btn", trash_enabled);
mOutfitGalleryPanel->childSetEnabled("trash_btn", trash_enabled);
- wear_btn->setEnabled(wear_enabled);
- wear_btn->setVisible(wear_visible);
+ mWearBtn->setEnabled(wear_enabled);
+ mWearBtn->setVisible(wear_visible);
getChild<LLButton>(SAVE_BTN)->setEnabled(make_outfit_enabled);
- wear_btn->setToolTip(getString((!isOutfitsGalleryPanelActive() && mMyOutfitsPanel->hasItemSelected()) ? "wear_items_tooltip" : "wear_outfit_tooltip"));
+ mWearBtn->setToolTip(getString((!isOutfitsGalleryPanelActive() && mMyOutfitsPanel->hasItemSelected()) ? "wear_items_tooltip" : "wear_outfit_tooltip"));
}
void LLPanelOutfitsInventory::onTrashButtonClick()
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index 0c501d5c71..e046681e95 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -101,6 +101,7 @@ protected:
private:
LLPanel* mListCommands;
LLMenuGL* mMenuAdd;
+ LLButton* mWearBtn = nullptr;
// List Commands //
//////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 0b02d3c9c6..25672db318 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -153,8 +153,6 @@ public:
id_it = uuids.begin(),
id_end = uuids.end();
- LLAvatarItemDistanceComparator::id_to_pos_map_t pos_map;
-
mAvatarsPositions.clear();
for (;pos_it != pos_end && id_it != id_end; ++pos_it, ++id_it )
@@ -613,15 +611,13 @@ bool LLPanelPeople::postBuild()
{
S32 max_premium = LLAgentBenefitsMgr::get("Premium").getGroupMembershipLimit();
- mNearbyFilterCommitConnection = getChild<LLFilterEditor>("nearby_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
- mFriedsFilterCommitConnection = getChild<LLFilterEditor>("friends_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
- mGroupsFilterCommitConnection = getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
- mRecentFilterCommitConnection = getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
-
+ LLPanel* group_tab = getChild<LLPanel>(GROUP_TAB_NAME);
+ mGroupDelBtn = group_tab->getChild<LLButton>("minus_btn");
+ mGroupCountText = group_tab->getChild<LLTextBox>("groupcount");
if(LLAgentBenefitsMgr::current().getGroupMembershipLimit() < max_premium)
{
- getChild<LLTextBox>("groupcount")->setText(getString("GroupCountWithInfo"));
- getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
+ mGroupCountText->setText(getString("GroupCountWithInfo"));
+ mGroupCountText->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
}
mTabContainer = getChild<LLTabContainer>("tabs");
@@ -634,40 +630,56 @@ bool LLPanelPeople::postBuild()
friends_tab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2));
friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::removePicker, this));
+ mFriendsGearBtn = friends_tab->getChild<LLButton>("gear_btn");
+ mFriendsDelFriendBtn = friends_tab->getChild<LLUICtrl>("friends_del_btn");
+
mOnlineFriendList = friends_tab->getChild<LLAvatarList>("avatars_online");
mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all");
mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));
mOnlineFriendList->setShowIcons("FriendsListShowIcons");
- mOnlineFriendList->showPermissions("FriendsListShowPermissions");
+ mOnlineFriendList->showPermissions(gSavedSettings.getBOOL("FriendsListShowPermissions"));
mOnlineFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
mAllFriendList->setNoItemsCommentText(getString("no_friends"));
mAllFriendList->setShowIcons("FriendsListShowIcons");
- mAllFriendList->showPermissions("FriendsListShowPermissions");
+ mAllFriendList->showPermissions(gSavedSettings.getBOOL("FriendsListShowPermissions"));
mAllFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
LLPanel* nearby_tab = getChild<LLPanel>(NEARBY_TAB_NAME);
nearby_tab->setVisibleCallback(boost::bind(&Updater::setActive, mNearbyListUpdater, _2));
+
mNearbyList = nearby_tab->getChild<LLAvatarList>("avatar_list");
mNearbyList->setNoItemsCommentText(getString("no_one_near"));
mNearbyList->setNoItemsMsg(getString("no_one_near"));
mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));
mNearbyList->setShowIcons("NearbyListShowIcons");
mNearbyList->setShowCompleteName(!gSavedSettings.getBOOL("NearbyListHideUsernames"));
- mMiniMap = (LLNetMap*)getChildView("Net Map",true);
+ mMiniMap = nearby_tab->getChild<LLNetMap>("Net Map", true);
mMiniMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
getString("AltMiniMapToolTipMsg") : getString("MiniMapToolTipMsg"));
- mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
+ mNearbyGearBtn = nearby_tab->getChild<LLButton>("gear_btn");
+ mNearbyAddFriendBtn = nearby_tab->getChild<LLButton>("add_friend_btn");
+
+ LLPanel* recent_tab = getChild<LLPanel>(RECENT_TAB_NAME);
+ mRecentList = recent_tab->getChild<LLAvatarList>("avatar_list");
mRecentList->setNoItemsCommentText(getString("no_recent_people"));
mRecentList->setNoItemsMsg(getString("no_recent_people"));
mRecentList->setNoFilteredItemsMsg(getString("no_filtered_recent_people"));
mRecentList->setShowIcons("RecentListShowIcons");
- mGroupList = getChild<LLGroupList>("group_list");
+ mRecentGearBtn = recent_tab->getChild<LLButton>("gear_btn");
+ mRecentAddFriendBtn = recent_tab->getChild<LLButton>("add_friend_btn");
+
+ mGroupList = group_tab->getChild<LLGroupList>("group_list");
mGroupList->setNoItemsCommentText(getString("no_groups_msg"));
mGroupList->setNoItemsMsg(getString("no_groups_msg"));
mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg"));
+ mNearbyFilterCommitConnection = nearby_tab->getChild<LLFilterEditor>("nearby_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+ mFriedsFilterCommitConnection = friends_tab->getChild<LLFilterEditor>("friends_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+ mRecentFilterCommitConnection = recent_tab->getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+ mGroupsFilterCommitConnection = group_tab->getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+
mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyPeopleContextMenu);
mRecentList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);
mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);
@@ -710,12 +722,14 @@ bool LLPanelPeople::postBuild()
LL_WARNS() << "People->Groups list menu not found" << LL_ENDL;
}
- LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");
- accordion_tab->setDropDownStateChangedCallback(
+ mFriendsAccordion = friends_tab->getChild<LLAccordionCtrl>("friends_accordion");
+
+ mFriendsAllTab = mFriendsAccordion->getChild<LLAccordionCtrlTab>("tab_all");
+ mFriendsAllTab->setDropDownStateChangedCallback(
boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mAllFriendList));
- accordion_tab = getChild<LLAccordionCtrlTab>("tab_online");
- accordion_tab->setDropDownStateChangedCallback(
+ mFriendsOnlineTab = mFriendsAccordion->getChild<LLAccordionCtrlTab>("tab_online");
+ mFriendsOnlineTab->setDropDownStateChangedCallback(
boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mOnlineFriendList));
// Must go after setting commit callback and initializing all pointers to children.
@@ -845,10 +859,11 @@ void LLPanelPeople::updateRecentList()
void LLPanelPeople::updateButtons()
{
- std::string cur_tab = getActiveTabName();
+ const std::string& cur_tab = getActiveTabName();
+ bool nearby_tab_active = (cur_tab == NEARBY_TAB_NAME);
bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME);
bool group_tab_active = (cur_tab == GROUP_TAB_NAME);
- //bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
+ bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
LLUUID selected_id;
uuid_vec_t selected_uuids;
@@ -863,14 +878,13 @@ void LLPanelPeople::updateButtons()
selected_id = mGroupList->getSelectedUUID();
}
- LLPanel* groups_panel = mTabContainer->getCurrentPanel();
- groups_panel->getChildView("minus_btn")->setEnabled(item_selected && selected_id.notNull()); // a real group selected
+ mGroupDelBtn->setEnabled(item_selected && selected_id.notNull()); // a real group selected
U32 groups_count = static_cast<U32>(gAgent.mGroups.size());
U32 max_groups = LLAgentBenefitsMgr::current().getGroupMembershipLimit();
U32 groups_remaining = max_groups > groups_count ? max_groups - groups_count : 0;
- groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[COUNT]", llformat("%d", groups_count));
- groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[REMAINING]", llformat("%d", groups_remaining));
+ mGroupCountText->setTextArg("[COUNT]", llformat("%d", groups_count));
+ mGroupCountText->setTextArg("[REMAINING]", llformat("%d", groups_remaining));
}
else
{
@@ -884,33 +898,36 @@ void LLPanelPeople::updateButtons()
is_self = gAgent.getID() == selected_id;
}
- LLPanel* cur_panel = mTabContainer->getCurrentPanel();
- if (cur_panel)
{
- if (cur_panel->hasChild("add_friend_btn", true))
- cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend && !is_self);
+ if(nearby_tab_active)
+ {
+ mNearbyAddFriendBtn->setEnabled(item_selected && !is_friend && !is_self);
+ mNearbyGearBtn->setEnabled(multiple_selected);
+ }
if (friends_tab_active)
{
- cur_panel->getChildView("friends_del_btn")->setEnabled(multiple_selected);
+ mFriendsDelFriendBtn->setEnabled(multiple_selected);
+ mFriendsGearBtn->setEnabled(multiple_selected);
}
- if (!group_tab_active)
+ if (recent_tab_active)
{
- cur_panel->getChildView("gear_btn")->setEnabled(multiple_selected);
+ mRecentAddFriendBtn->setEnabled(item_selected && !is_friend && !is_self);
+ mRecentGearBtn->setEnabled(multiple_selected);
}
}
}
}
-std::string LLPanelPeople::getActiveTabName() const
+const std::string& LLPanelPeople::getActiveTabName() const
{
return mTabContainer->getCurrentPanel()->getName();
}
LLUUID LLPanelPeople::getCurrentItemID() const
{
- std::string cur_tab = getActiveTabName();
+ const std::string& cur_tab = getActiveTabName();
if (cur_tab == FRIENDS_TAB_NAME) // this tab has two lists
{
@@ -940,7 +957,7 @@ LLUUID LLPanelPeople::getCurrentItemID() const
void LLPanelPeople::getCurrentItemIDs(uuid_vec_t& selected_uuids) const
{
- std::string cur_tab = getActiveTabName();
+ const std::string& cur_tab = getActiveTabName();
if (cur_tab == FRIENDS_TAB_NAME)
{
@@ -1028,7 +1045,7 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
saved_filter = search_upper;
// Apply new filter to the current tab.
- const std::string cur_tab = getActiveTabName();
+ const std::string& cur_tab = getActiveTabName();
if (cur_tab == NEARBY_TAB_NAME)
{
mNearbyList->setNameFilter(filter);
@@ -1044,8 +1061,8 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
mOnlineFriendList->setNameFilter(filter);
mAllFriendList->setNameFilter(filter);
- setAccordionCollapsedByUser("tab_online", false);
- setAccordionCollapsedByUser("tab_all", false);
+ setAccordionCollapsedByUser(mFriendsOnlineTab, false);
+ setAccordionCollapsedByUser(mFriendsAllTab, false);
showFriendsAccordionsIfNeeded();
// restore accordion tabs state _after_ all manipulations
@@ -1088,7 +1105,6 @@ void LLPanelPeople::onGroupLimitInfo()
void LLPanelPeople::onTabSelected(const LLSD& param)
{
- std::string tab_name = getChild<LLPanel>(param.asString())->getName();
updateButtons();
showFriendsAccordionsIfNeeded();
@@ -1122,9 +1138,9 @@ void LLPanelPeople::onAvatarListCommitted(LLAvatarList* list)
uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
mMiniMap->setSelected(selected_uuids);
- } else
+ }
// Make sure only one of the friends lists (online/all) has selection.
- if (getActiveTabName() == FRIENDS_TAB_NAME)
+ else if (getActiveTabName() == FRIENDS_TAB_NAME)
{
if (list == mOnlineFriendList)
mAllFriendList->resetSelection(true);
@@ -1149,12 +1165,9 @@ void LLPanelPeople::onAddFriendButtonClicked()
bool LLPanelPeople::isItemsFreeOfFriends(const uuid_vec_t& uuids)
{
const LLAvatarTracker& av_tracker = LLAvatarTracker::instance();
- for ( uuid_vec_t::const_iterator
- id = uuids.begin(),
- id_end = uuids.end();
- id != id_end; ++id )
+ for (const LLUUID& uuid : uuids)
{
- if (av_tracker.isBuddy (*id))
+ if (av_tracker.isBuddy(uuid))
{
return false;
}
@@ -1459,15 +1472,8 @@ bool LLPanelPeople::notifyChildren(const LLSD& info)
return LLPanel::notifyChildren(info);
}
-void LLPanelPeople::showAccordion(const std::string name, bool show)
+void LLPanelPeople::showAccordion(LLAccordionCtrlTab* tab, bool show)
{
- if(name.empty())
- {
- LL_WARNS() << "No name provided" << LL_ENDL;
- return;
- }
-
- LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name);
tab->setVisible(show);
if(show)
{
@@ -1485,12 +1491,11 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded()
if(FRIENDS_TAB_NAME == getActiveTabName())
{
// Expand and show accordions if needed, else - hide them
- showAccordion("tab_online", mOnlineFriendList->filterHasMatches());
- showAccordion("tab_all", mAllFriendList->filterHasMatches());
+ showAccordion(mFriendsOnlineTab, mOnlineFriendList->filterHasMatches());
+ showAccordion(mFriendsAllTab, mAllFriendList->filterHasMatches());
// Rearrange accordions
- LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
- accordion->arrange();
+ mFriendsAccordion->arrange();
// *TODO: new no_matched_tabs_text attribute was implemented in accordion (EXT-7368).
// this code should be refactored to use it
@@ -1503,11 +1508,11 @@ void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param
{
if(ctrl == mOnlineFriendList)
{
- showAccordion("tab_online", param.asInteger());
+ showAccordion(mFriendsOnlineTab, param.asInteger());
}
else if(ctrl == mAllFriendList)
{
- showAccordion("tab_all", param.asInteger());
+ showAccordion(mFriendsAllTab, param.asInteger());
}
}
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 768ba1ef49..aef66db980 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -40,6 +40,8 @@ class LLGroupList;
class LLMenuButton;
class LLTabContainer;
class LLNetMap;
+class LLAccordionCtrl;
+class LLAccordionCtrlTab;
class LLPanelPeople
: public LLPanel
@@ -84,7 +86,7 @@ private:
bool isItemsFreeOfFriends(const uuid_vec_t& uuids);
void updateButtons();
- std::string getActiveTabName() const;
+ const std::string& getActiveTabName() const;
LLUUID getCurrentItemID() const;
void getCurrentItemIDs(uuid_vec_t& selected_uuids) const;
void setSortOrder(LLAvatarList* list, ESortOrder order, bool save = true);
@@ -120,7 +122,7 @@ private:
void onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list);
- void showAccordion(const std::string name, bool show);
+ void showAccordion(LLAccordionCtrlTab* tab, bool show);
void showFriendsAccordionsIfNeeded();
@@ -139,6 +141,21 @@ private:
LLGroupList* mGroupList;
LLNetMap* mMiniMap;
+ LLAccordionCtrl* mFriendsAccordion = nullptr;
+ LLAccordionCtrlTab* mFriendsAllTab = nullptr;
+ LLAccordionCtrlTab* mFriendsOnlineTab = nullptr;
+
+ LLButton* mNearbyGearBtn = nullptr;
+ LLButton* mFriendsGearBtn = nullptr;
+ LLButton* mRecentGearBtn = nullptr;
+ LLButton* mGroupDelBtn = nullptr;
+
+ LLButton* mNearbyAddFriendBtn = nullptr;
+ LLButton* mRecentAddFriendBtn = nullptr;
+ LLUICtrl* mFriendsDelFriendBtn = nullptr;
+
+ LLTextBox* mGroupCountText = nullptr;
+
std::vector<std::string> mSavedOriginalFilters;
std::vector<std::string> mSavedFilters;
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 172c7d0828..f8a73ddb46 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -245,11 +245,14 @@ bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata)
{
return LLLogChat::isTranscriptExist(mUUIDs.front());
}
- else if (item == std::string("can_im") || item == std::string("can_invite") ||
- item == std::string("can_share") || item == std::string("can_pay"))
+ else if (item == std::string("can_im") || item == std::string("can_invite"))
{
return true;
}
+ else if (item == std::string("can_share") || item == std::string("can_pay"))
+ {
+ return mUUIDs.size() == 1;
+ }
return false;
}
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 2a27a6e143..0ce1f0f9d3 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -399,7 +399,7 @@ void LLPanelPermissions::refresh()
// Style for creator and owner links (both group and agent)
LLStyle::Params style_params;
- LLColor4 link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ LLUIColor link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
style_params.color = link_color;
style_params.readonly_color = link_color;
style_params.is_link = true; // link will be added later
@@ -986,7 +986,7 @@ void shorten_name(std::string &name, const LLStyle::Params& style_params, S32 ma
LLWString wline = utf8str_to_wstring(name);
// panel supports two lines long names
- S32 segment_length = font->maxDrawableChars(wline.c_str(), max_pixels, static_cast<S32>(wline.length()), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
+ S32 segment_length = font->maxDrawableChars(wline.c_str(), (F32)max_pixels, static_cast<S32>(wline.length()), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
if (segment_length == wline.length())
{
// no work needed
@@ -994,7 +994,7 @@ void shorten_name(std::string &name, const LLStyle::Params& style_params, S32 ma
}
S32 first_line_length = segment_length;
- segment_length = font->maxDrawableChars(wline.substr(first_line_length).c_str(), max_pixels, static_cast<S32>(wline.length()), LLFontGL::ANYWHERE);
+ segment_length = font->maxDrawableChars(wline.substr(first_line_length).c_str(), (F32)max_pixels, static_cast<S32>(wline.length()), LLFontGL::ANYWHERE);
if (segment_length + first_line_length == wline.length())
{
// no work needed
@@ -1003,8 +1003,8 @@ void shorten_name(std::string &name, const LLStyle::Params& style_params, S32 ma
// name does not fit, cut it, add ...
const LLWString dots_pad(utf8str_to_wstring(std::string("....")));
- S32 elipses_width = font->getWidthF32(dots_pad.c_str());
- segment_length = font->maxDrawableChars(wline.substr(first_line_length).c_str(), max_pixels - elipses_width, static_cast<S32>(wline.length()), LLFontGL::ANYWHERE);
+ F32 elipses_width = font->getWidthF32(dots_pad.c_str());
+ segment_length = font->maxDrawableChars(wline.substr(first_line_length).c_str(), (F32)max_pixels - elipses_width, static_cast<S32>(wline.length()), LLFontGL::ANYWHERE);
name = name.substr(0, segment_length + first_line_length) + std::string("...");
}
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 4ceeaa5d51..18588514f8 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -395,9 +395,9 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
(F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
(F32)pos_global.mdV[VZ]);
- parcel_data.global_x = pos_global.mdV[VX];
- parcel_data.global_y = pos_global.mdV[VY];
- parcel_data.global_z = pos_global.mdV[VZ];
+ parcel_data.global_x = (F32)pos_global.mdV[VX];
+ parcel_data.global_y = (F32)pos_global.mdV[VY];
+ parcel_data.global_z = (F32)pos_global.mdV[VZ];
parcel_data.owner_id = parcel->getOwnerID();
std::string on = getString("on");
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 1299c8c656..4e905ae0fd 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -421,7 +421,7 @@ void LLPanelPrimMediaControls::updateShape()
if(mUpdateSlider && mMovieDuration!= 0)
{
F64 current_time = media_plugin->getCurrentTime();
- F32 percent = current_time / mMovieDuration;
+ F32 percent = (F32)(current_time / mMovieDuration);
mMediaPlaySliderCtrl->setValue(percent);
mMediaPlaySliderCtrl->setEnabled(true);
}
@@ -1309,7 +1309,7 @@ void LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseUp()
}
else
{
- media_impl->seek(cur_value * mMovieDuration);
+ media_impl->seek((F32)(cur_value * mMovieDuration));
}
}
diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp
index 2536dce606..32c9f6f402 100644
--- a/indra/newview/llpanelsnapshot.cpp
+++ b/indra/newview/llpanelsnapshot.cpp
@@ -41,7 +41,7 @@
#include "llagentbenefits.h"
-constexpr S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512
+constexpr S32 MAX_TEXTURE_SIZE = 2048 ; //max upload texture size 2048 * 2048
S32 power_of_two(S32 sz, S32 upper)
{
@@ -61,7 +61,9 @@ LLPanelSnapshot::LLPanelSnapshot()
// virtual
bool LLPanelSnapshot::postBuild()
{
- getChild<LLUICtrl>("save_btn")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
+ S32 w = getTypedPreviewWidth();
+ S32 h = getTypedPreviewHeight();
+ getChild<LLUICtrl>("save_btn")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost(w, h)));
getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onResolutionComboCommit, this, _1));
if (!getWidthSpinnerName().empty())
{
@@ -211,12 +213,12 @@ void LLPanelSnapshot::onCustomResolutionCommit()
S32 width = widthSpinner->getValue().asInteger();
width = power_of_two(width, MAX_TEXTURE_SIZE);
info["w"] = width;
- widthSpinner->setIncrement(width >> 1);
+ widthSpinner->setIncrement((F32)(width >> 1));
widthSpinner->forceSetValue(width);
S32 height = heightSpinner->getValue().asInteger();
height = power_of_two(height, MAX_TEXTURE_SIZE);
- heightSpinner->setIncrement(height >> 1);
- heightSpinner->forceSetValue(height);
+ heightSpinner->setIncrement((F32)(height >> 1));
+ heightSpinner->forceSetValue((F32)height);
info["h"] = height;
}
else
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
index 4abb89120b..96b17acc40 100644
--- a/indra/newview/llpanelsnapshotinventory.cpp
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -155,7 +155,19 @@ void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)
void LLPanelSnapshotInventoryBase::onSend()
{
- S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ S32 w = 0;
+ S32 h = 0;
+
+ if( mSnapshotFloater )
+ {
+ LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView();
+ if( preview )
+ {
+ preview->getSize(w, h);
+ }
+ }
+
+ S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(w, h);
if (can_afford_transaction(expected_upload_cost))
{
if (mSnapshotFloater)
diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp
index 776de460a9..962d3bba16 100644
--- a/indra/newview/llpanelsnapshotoptions.cpp
+++ b/indra/newview/llpanelsnapshotoptions.cpp
@@ -30,6 +30,7 @@
#include "llsidetraypanelcontainer.h"
#include "llfloatersnapshot.h" // FIXME: create a snapshot model
+#include "llsnapshotlivepreview.h"
#include "llfloaterreg.h"
#include "llagentbenefits.h"
@@ -89,7 +90,19 @@ void LLPanelSnapshotOptions::onOpen(const LLSD& key)
void LLPanelSnapshotOptions::updateUploadCost()
{
- S32 upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ S32 w = 0;
+ S32 h = 0;
+
+ if( mSnapshotFloater )
+ {
+ LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView();
+ if( preview )
+ {
+ preview->getSize(w, h);
+ }
+ }
+
+ S32 upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(w, h);
getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost));
}
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 16c38bf1f0..951dc45a78 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -151,6 +151,7 @@ bool LLPanelVolume::postBuild()
{
childSetCommitCallback("Reflection Probe", onCommitIsReflectionProbe, this);
childSetCommitCallback("Probe Update Type", onCommitProbe, this);
+ childSetCommitCallback("Probe Dynamic", onCommitProbe, this);
childSetCommitCallback("Probe Volume Type", onCommitProbe, this);
childSetCommitCallback("Probe Ambiance", onCommitProbe, this);
childSetCommitCallback("Probe Near Clip", onCommitProbe, this);
@@ -412,6 +413,7 @@ void LLPanelVolume::getState( )
getChild<LLSpinCtrl>("Probe Ambiance", true)->clear();
getChild<LLSpinCtrl>("Probe Near Clip", true)->clear();
getChild<LLComboBox>("Probe Update Type", true)->clear();
+ getChild<LLUICtrl>("Probe Dynamic")->setValue(false);
}
else
{
@@ -446,6 +448,7 @@ void LLPanelVolume::getState( )
getChild<LLSpinCtrl>("Probe Ambiance", true)->setValue(volobjp->getReflectionProbeAmbiance());
getChild<LLSpinCtrl>("Probe Near Clip", true)->setValue(volobjp->getReflectionProbeNearClip());
getChild<LLComboBox>("Probe Update Type", true)->setValue(update_type);
+ getChild<LLUICtrl>("Probe Dynamic")->setValue(volobjp->getReflectionProbeIsDynamic());
}
// Animated Mesh
@@ -733,6 +736,7 @@ void LLPanelVolume::clearCtrls()
getChildView("Reflection Probe")->setEnabled(false);;
getChildView("Probe Volume Type")->setEnabled(false);
getChildView("Probe Update Type")->setEnabled(false);
+ getChildView("Probe Dynamic")->setEnabled(false);
getChildView("Probe Ambiance")->setEnabled(false);
getChildView("Probe Near Clip")->setEnabled(false);
getChildView("Animated Mesh Checkbox Ctrl")->setEnabled(false);
@@ -895,25 +899,25 @@ void LLPanelVolume::sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata)
void LLPanelVolume::sendPhysicsGravity(LLUICtrl* ctrl, void* userdata)
{
- F32 val = ctrl->getValue().asReal();
+ F32 val = (F32)ctrl->getValue().asReal();
LLSelectMgr::getInstance()->selectionSetGravity(val);
}
void LLPanelVolume::sendPhysicsFriction(LLUICtrl* ctrl, void* userdata)
{
- F32 val = ctrl->getValue().asReal();
+ F32 val = (F32)ctrl->getValue().asReal();
LLSelectMgr::getInstance()->selectionSetFriction(val);
}
void LLPanelVolume::sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata)
{
- F32 val = ctrl->getValue().asReal();
+ F32 val = (F32)ctrl->getValue().asReal();
LLSelectMgr::getInstance()->selectionSetRestitution(val);
}
void LLPanelVolume::sendPhysicsDensity(LLUICtrl* ctrl, void* userdata)
{
- F32 val = ctrl->getValue().asReal();
+ F32 val = (F32)ctrl->getValue().asReal();
LLSelectMgr::getInstance()->selectionSetDensity(val);
}
@@ -1095,10 +1099,10 @@ void LLPanelVolume::onPasteFeatures()
objectp->setMaterial(material);
objectp->sendMaterialUpdate();
- objectp->setPhysicsGravity(clipboard["physics"]["gravity"].asReal());
- objectp->setPhysicsFriction(clipboard["physics"]["friction"].asReal());
- objectp->setPhysicsDensity(clipboard["physics"]["density"].asReal());
- objectp->setPhysicsRestitution(clipboard["physics"]["restitution"].asReal());
+ objectp->setPhysicsGravity((F32)clipboard["physics"]["gravity"].asReal());
+ objectp->setPhysicsFriction((F32)clipboard["physics"]["friction"].asReal());
+ objectp->setPhysicsDensity((F32)clipboard["physics"]["density"].asReal());
+ objectp->setPhysicsRestitution((F32)clipboard["physics"]["restitution"].asReal());
objectp->updateFlags(true);
}
@@ -1123,10 +1127,10 @@ void LLPanelVolume::onPasteFeatures()
LLFlexibleObjectData new_attributes;
new_attributes = *attributes;
new_attributes.setSimulateLOD(clipboard["flex"]["lod"].asInteger());
- new_attributes.setGravity(clipboard["flex"]["gav"].asReal());
- new_attributes.setTension(clipboard["flex"]["ten"].asReal());
- new_attributes.setAirFriction(clipboard["flex"]["fri"].asReal());
- new_attributes.setWindSensitivity(clipboard["flex"]["sen"].asReal());
+ new_attributes.setGravity((F32)clipboard["flex"]["gav"].asReal());
+ new_attributes.setTension((F32)clipboard["flex"]["ten"].asReal());
+ new_attributes.setAirFriction((F32)clipboard["flex"]["fri"].asReal());
+ new_attributes.setWindSensitivity((F32)clipboard["flex"]["sen"].asReal());
F32 fx = (F32)clipboard["flex"]["forx"].asReal();
F32 fy = (F32)clipboard["flex"]["fory"].asReal();
F32 fz = (F32)clipboard["flex"]["forz"].asReal();
@@ -1428,15 +1432,26 @@ void LLPanelVolume::onCommitProbe(LLUICtrl* ctrl, void* userdata)
volobjp->setReflectionProbeAmbiance((F32)self->getChild<LLUICtrl>("Probe Ambiance")->getValue().asReal());
volobjp->setReflectionProbeNearClip((F32)self->getChild<LLUICtrl>("Probe Near Clip")->getValue().asReal());
- std::string update_type = self->getChild<LLUICtrl>("Probe Update Type")->getValue().asString();
+ bool mirrors_enabled = LLPipeline::RenderMirrors;
+ bool is_mirror = false;
- bool is_mirror = update_type.find("Mirror") != std::string::npos;
+ if (mirrors_enabled)
+ {
+ std::string update_type = self->getChild<LLUICtrl>("Probe Update Type")->getValue().asString();
- self->getChildView("Probe Volume Type")->setEnabled(!is_mirror);
+ is_mirror = update_type.find("Mirror") != std::string::npos;
- volobjp->setReflectionProbeIsDynamic(update_type.find("Dynamic") != std::string::npos);
- volobjp->setReflectionProbeIsMirror(is_mirror);
+ volobjp->setReflectionProbeIsDynamic(update_type.find("Dynamic") != std::string::npos);
+ volobjp->setReflectionProbeIsMirror(is_mirror);
+ }
+ else
+ {
+ is_mirror = volobjp->getReflectionProbeIsMirror();
+ bool is_dynamic = self->getChild<LLUICtrl>("Probe Dynamic")->getValue().asBoolean();
+ volobjp->setReflectionProbeIsDynamic(is_dynamic);
+ }
+ self->getChildView("Probe Volume Type")->setEnabled(!is_mirror);
self->getChildView("Probe Ambiance")->setEnabled(!is_mirror);
self->getChildView("Probe Near Clip")->setEnabled(!is_mirror);
diff --git a/indra/newview/llpathfindingcharacter.cpp b/indra/newview/llpathfindingcharacter.cpp
index 66cc26469e..a6d26727f4 100644
--- a/indra/newview/llpathfindingcharacter.cpp
+++ b/indra/newview/llpathfindingcharacter.cpp
@@ -83,7 +83,7 @@ void LLPathfindingCharacter::parseCharacterData(const LLSD &pCharacterData)
{
llassert(pCharacterData.has(CHARACTER_CPU_TIME_FIELD));
llassert(pCharacterData.get(CHARACTER_CPU_TIME_FIELD).isReal());
- mCPUTime = pCharacterData.get(CHARACTER_CPU_TIME_FIELD).asReal();
+ mCPUTime = (F32)pCharacterData.get(CHARACTER_CPU_TIME_FIELD).asReal();
llassert(pCharacterData.has(CHARACTER_HORIZONTAL_FIELD));
llassert(pCharacterData.get(CHARACTER_HORIZONTAL_FIELD).isBoolean());
@@ -91,9 +91,9 @@ void LLPathfindingCharacter::parseCharacterData(const LLSD &pCharacterData)
llassert(pCharacterData.has(CHARACTER_LENGTH_FIELD));
llassert(pCharacterData.get(CHARACTER_LENGTH_FIELD).isReal());
- mLength = pCharacterData.get(CHARACTER_LENGTH_FIELD).asReal();
+ mLength = (F32)pCharacterData.get(CHARACTER_LENGTH_FIELD).asReal();
llassert(pCharacterData.has(CHARACTER_RADIUS_FIELD));
llassert(pCharacterData.get(CHARACTER_RADIUS_FIELD).isReal());
- mRadius = pCharacterData.get(CHARACTER_RADIUS_FIELD).asReal();
+ mRadius = (F32)pCharacterData.get(CHARACTER_RADIUS_FIELD).asReal();
}
diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp
index 5e7bc4fb3b..84a62b3cbf 100644
--- a/indra/newview/llpathfindingmanager.cpp
+++ b/indra/newview/llpathfindingmanager.cpp
@@ -35,7 +35,6 @@
#include <boost/bind.hpp>
#include <boost/function.hpp>
-#include <boost/shared_ptr.hpp>
#include <boost/signals2.hpp>
#include "llagent.h"
diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h
index 18b6a31845..d838a1a51c 100644
--- a/indra/newview/llpathfindingnavmesh.h
+++ b/indra/newview/llpathfindingnavmesh.h
@@ -29,7 +29,6 @@
#include <string>
-#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
diff --git a/indra/newview/llpathfindingnavmeshzone.cpp b/indra/newview/llpathfindingnavmeshzone.cpp
index 012cc11eee..e9ef170176 100644
--- a/indra/newview/llpathfindingnavmeshzone.cpp
+++ b/indra/newview/llpathfindingnavmeshzone.cpp
@@ -30,20 +30,9 @@
#include "llpathfindingnavmeshzone.h"
-#include <vector>
-
-#include <boost/bind.hpp>
-#include <boost/function.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/signals2.hpp>
-
#include "llagent.h"
#include "llpathfindingmanager.h"
-#include "llpathfindingnavmesh.h"
-#include "llpathfindingnavmeshstatus.h"
#include "llpathinglib.h"
-#include "llsd.h"
-#include "lluuid.h"
#include "llviewercontrol.h"
#include "llviewerregion.h"
diff --git a/indra/newview/llpathfindingnavmeshzone.h b/indra/newview/llpathfindingnavmeshzone.h
index a2c8691391..e770efa0d0 100644
--- a/indra/newview/llpathfindingnavmeshzone.h
+++ b/indra/newview/llpathfindingnavmeshzone.h
@@ -29,7 +29,6 @@
#include <vector>
-#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
diff --git a/indra/newview/llpathfindingobject.h b/indra/newview/llpathfindingobject.h
index 17f12efd83..79a796dd60 100644
--- a/indra/newview/llpathfindingobject.h
+++ b/indra/newview/llpathfindingobject.h
@@ -29,7 +29,6 @@
#include <string>
-#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
diff --git a/indra/newview/llpathfindingobjectlist.h b/indra/newview/llpathfindingobjectlist.h
index 654423183e..cfcd43dc1d 100644
--- a/indra/newview/llpathfindingobjectlist.h
+++ b/indra/newview/llpathfindingobjectlist.h
@@ -30,8 +30,6 @@
#include <string>
#include <map>
-#include <boost/shared_ptr.hpp>
-
#include "llpathfindingobject.h"
class LLPathfindingObjectList;
diff --git a/indra/newview/llperfstats.cpp b/indra/newview/llperfstats.cpp
index 64f438976a..37bb59a65c 100644
--- a/indra/newview/llperfstats.cpp
+++ b/indra/newview/llperfstats.cpp
@@ -91,7 +91,7 @@ namespace LLPerfStats
const auto newval = gSavedSettings.getF32("RenderAvatarMaxART");
if(newval < log10(LLPerfStats::ART_UNLIMITED_NANOS/1000))
{
- LLPerfStats::renderAvatarMaxART_ns = pow(10,newval)*1000;
+ LLPerfStats::renderAvatarMaxART_ns = (U64)pow(10,newval)*1000;
}
else
{
@@ -301,7 +301,7 @@ namespace LLPerfStats
std::vector<LLVector3d> positions;
uuid_vec_t avatar_ids;
- LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, our_pos, distance);
+ LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, our_pos, (F32)distance);
return static_cast<int>(positions.size());
}
@@ -375,7 +375,7 @@ namespace LLPerfStats
{
// if we have less than the user's "max Non-Impostors" avatars within the desired range then adjust the limit.
// also adjusts back up again for nearby crowds.
- auto count = countNearbyAvatars(std::min(LLPipeline::RenderFarClip, tunables.userImpostorDistance));
+ auto count = countNearbyAvatars((S32)std::min(LLPipeline::RenderFarClip, tunables.userImpostorDistance));
if( count != tunables.nonImpostors )
{
tunables.updateNonImposters(((U32)count < LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER) ? count : 0);
@@ -476,7 +476,7 @@ namespace LLPerfStats
// max render this frame may be higher than the last (cos new entrants and jitter) so make sure we are heading in the right direction
if( new_render_limit_ns > renderAvatarMaxART_ns )
{
- new_render_limit_ns = renderAvatarMaxART_ns;
+ new_render_limit_ns = (double)renderAvatarMaxART_ns;
}
if (new_render_limit_ns > LLPerfStats::ART_MIN_ADJUST_DOWN_NANOS)
@@ -485,12 +485,12 @@ namespace LLPerfStats
}
// bounce at the bottom to prevent "no limit"
- new_render_limit_ns = std::max((U64)new_render_limit_ns, (U64)LLPerfStats::ART_MINIMUM_NANOS);
+ new_render_limit_ns = (double)std::max((U64)new_render_limit_ns, (U64)LLPerfStats::ART_MINIMUM_NANOS);
// assign the new value
if (renderAvatarMaxART_ns != new_render_limit_ns)
{
- renderAvatarMaxART_ns = new_render_limit_ns;
+ renderAvatarMaxART_ns = (U64)new_render_limit_ns;
tunables.updateSettingsFromRenderCostLimit();
}
// LL_DEBUGS() << "AUTO_TUNE: avatar_budget adjusted to:" << new_render_limit_ns << LL_ENDL;
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index b6bcd6dd7d..86291708b0 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -445,8 +445,8 @@ F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, const
const F32 acceleration_local = (velocity_local - mVelocityJoint_local) / time_delta;
const F32 smoothed_acceleration_local =
- acceleration_local * 1.0/smoothing +
- mAccelerationJoint_local * (smoothing-1.0)/smoothing;
+ acceleration_local * 1.0f/smoothing +
+ mAccelerationJoint_local * (smoothing-1.0f)/smoothing;
return smoothed_acceleration_local;
}
@@ -454,25 +454,26 @@ F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, const
bool LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
- // Skip if disabled globally.
- if (!gSavedSettings.getBOOL("AvatarPhysics"))
- {
- return true;
- }
+ // Skip if disabled globally.
+ static LLCachedControl<bool> av_physics(gSavedSettings, "AvatarPhysics");
+ if (!av_physics)
+ {
+ return true;
+ }
- bool update_visuals = false;
- for (motion_vec_t::iterator iter = mMotions.begin();
- iter != mMotions.end();
- ++iter)
- {
- LLPhysicsMotion *motion = (*iter);
- update_visuals |= motion->onUpdate(time);
- }
+ bool update_visuals = false;
+ for (motion_vec_t::iterator iter = mMotions.begin();
+ iter != mMotions.end();
+ ++iter)
+ {
+ LLPhysicsMotion *motion = (*iter);
+ update_visuals |= motion->onUpdate(time);
+ }
- if (update_visuals)
- mCharacter->updateVisualParams();
+ if (update_visuals)
+ mCharacter->updateVisualParams();
- return true;
+ return true;
}
// Return true if character has to update visual params.
@@ -603,7 +604,7 @@ bool LLPhysicsMotion::onUpdate(F32 time)
// Drag is a force imparted by velocity (intuitively it is similar to wind resistance)
// F = .5kv^2
- const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local);
+ const F32 force_drag = (F32)(.5 * behavior_drag * velocity_joint_local * velocity_joint_local * llsgn(velocity_joint_local));
const F32 force_net = (force_accel +
force_gravity +
@@ -631,7 +632,7 @@ bool LLPhysicsMotion::onUpdate(F32 time)
// Temporary debugging setting to cause all avatars to move, for profiling purposes.
if (physics_test)
{
- velocity_new_local = sin(time*4.0);
+ velocity_new_local = sin(time*4.0f);
}
// Calculate the new parameters, or remain unchanged if max speed is 0.
F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step;
@@ -697,7 +698,7 @@ bool LLPhysicsMotion::onUpdate(F32 time)
// For non-self, if the avatar is small enough visually, then don't update.
const F32 area_for_max_settings = 0.0;
const F32 area_for_min_settings = 1400.0;
- const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor);
+ const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0f-lod_factor);
const F32 pixel_area = sqrtf(mCharacter->getPixelArea());
const bool is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL);
@@ -763,8 +764,8 @@ void LLPhysicsMotion::setParamValue(const LLViewerVisualParam *param,
{
const F32 value_min_local = param->getMinWeight();
const F32 value_max_local = param->getMaxWeight();
- const F32 min_val = 0.5f-behavior_maxeffect/2.0;
- const F32 max_val = 0.5f+behavior_maxeffect/2.0;
+ const F32 min_val = 0.5f-behavior_maxeffect/2.0f;
+ const F32 max_val = 0.5f+behavior_maxeffect/2.0f;
// Scale from [0,1] to [min_val,max_val]
const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized;
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 620b7c8b2d..9a991727b2 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -67,8 +67,7 @@
// Default constructor
LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id,
- : LLPreview( key ),
- mLiveFile(NULL)
+ : LLPreview( key )
{
const LLInventoryItem *item = getItem();
if (item)
@@ -88,24 +87,30 @@ bool LLPreviewNotecard::postBuild()
mEditor->setNotecardInfo(mItemUUID, mObjectID, getKey());
mEditor->makePristine();
- childSetAction("Save", onClickSave, this);
- getChildView("lock")->setVisible( false);
+ mSaveBtn = getChild<LLButton>("Save");
+ mSaveBtn->setCommitCallback(boost::bind(&LLPreviewNotecard::saveIfNeeded, this, nullptr, true));
- childSetAction("Delete", onClickDelete, this);
- getChildView("Delete")->setEnabled(false);
+ mLockBtn = getChild<LLUICtrl>("lock");
+ mLockBtn->setVisible(false);
- childSetAction("Edit", onClickEdit, this);
+ mDeleteBtn = getChild<LLButton>("Delete");
+ mDeleteBtn->setCommitCallback(boost::bind(&LLPreviewNotecard::deleteNotecard, this));
+ mDeleteBtn->setEnabled(false);
+
+ mEditBtn = getChild<LLButton>("Edit");
+ mEditBtn->setCommitCallback(boost::bind(&LLPreviewNotecard::openInExternalEditor, this));
const LLInventoryItem* item = getItem();
- childSetCommitCallback("desc", LLPreview::onText, this);
+ mDescEditor = getChild<LLLineEditor>("desc");
+ mDescEditor->setCommitCallback(boost::bind(&LLPreview::onText, mDescEditor, this));
if (item)
{
- getChild<LLUICtrl>("desc")->setValue(item->getDescription());
+ mDescEditor->setValue(item->getDescription());
bool source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID());
- getChildView("Delete")->setEnabled(!source_library);
+ mDeleteBtn->setEnabled(!source_library);
}
- getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
+ mDescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
@@ -118,22 +123,30 @@ bool LLPreviewNotecard::saveItem()
void LLPreviewNotecard::setEnabled(bool enabled)
{
-
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
-
- getChildView("Notecard Editor")->setEnabled(enabled);
- getChildView("lock")->setVisible( !enabled);
- getChildView("desc")->setEnabled(enabled);
- getChildView("Save")->setEnabled(enabled && editor && (!editor->isPristine()));
+ if (mEditor)
+ {
+ mEditor->setEnabled(enabled);
+ }
+ if (mLockBtn)
+ {
+ mLockBtn->setVisible(!enabled);
+ }
+ if (mDescEditor)
+ {
+ mDescEditor->setEnabled(enabled);
+ }
+ if (mSaveBtn)
+ {
+ mSaveBtn->setEnabled(enabled && mEditor && (!mEditor->isPristine()));
+ }
}
void LLPreviewNotecard::draw()
{
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
- bool changed = !editor->isPristine();
+ bool changed = !mEditor->isPristine();
- getChildView("Save")->setEnabled(changed && getEnabled());
+ mSaveBtn->setEnabled(changed && getEnabled());
LLPreview::draw();
}
@@ -153,9 +166,7 @@ bool LLPreviewNotecard::handleKeyHere(KEY key, MASK mask)
// virtual
bool LLPreviewNotecard::canClose()
{
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
-
- if(mForceClose || editor->isPristine())
+ if(mForceClose || mEditor->isPristine())
{
return true;
}
@@ -176,28 +187,18 @@ void LLPreviewNotecard::setObjectID(const LLUUID& object_id)
{
LLPreview::setObjectID(object_id);
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
- editor->setNotecardObjectID(mObjectUUID);
- editor->makePristine();
+ mEditor->setNotecardObjectID(mObjectUUID);
+ mEditor->makePristine();
}
const LLInventoryItem* LLPreviewNotecard::getDragItem()
{
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
-
- if(editor)
- {
- return editor->getDragItem();
- }
- return NULL;
+ return mEditor->getDragItem();
}
bool LLPreviewNotecard::hasEmbeddedInventory()
{
- LLViewerTextEditor* editor = NULL;
- editor = getChild<LLViewerTextEditor>("Notecard Editor");
- if (!editor) return false;
- return editor->hasEmbeddedInventory();
+ return mEditor->hasEmbeddedInventory();
}
void LLPreviewNotecard::refreshFromInventory(const LLUUID& new_item_id)
@@ -215,10 +216,9 @@ void LLPreviewNotecard::updateTitleButtons()
{
LLPreview::updateTitleButtons();
- LLUICtrl* lock_btn = getChild<LLUICtrl>("lock");
- if(lock_btn->getVisible() && !isMinimized()) // lock button stays visible if floater is minimized.
+ if(mLockBtn && mLockBtn->getVisible() && !isMinimized()) // lock button stays visible if floater is minimized.
{
- LLRect lock_rc = lock_btn->getRect();
+ LLRect lock_rc = mLockBtn->getRect();
LLRect buttons_rect = getDragHandle()->getButtonsRect();
buttons_rect.mLeft = lock_rc.mLeft;
getDragHandle()->setButtonsRect(buttons_rect);
@@ -229,11 +229,6 @@ void LLPreviewNotecard::loadAsset()
{
// request the asset.
const LLInventoryItem* item = getItem();
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
-
- if (!editor)
- return;
-
bool fail = false;
if(item)
@@ -249,9 +244,9 @@ void LLPreviewNotecard::loadAsset()
mAssetID = item->getAssetUUID();
if(mAssetID.isNull())
{
- editor->setText(LLStringUtil::null);
- editor->makePristine();
- editor->setEnabled(true);
+ mEditor->setText(LLStringUtil::null);
+ mEditor->makePristine();
+ mEditor->setEnabled(true);
mAssetStatus = PREVIEW_ASSET_LOADED;
}
else
@@ -270,9 +265,9 @@ void LLPreviewNotecard::loadAsset()
// The object that we're trying to look at disappeared, bail.
LL_WARNS() << "Can't find object " << mObjectUUID << " associated with notecard." << LL_ENDL;
mAssetID.setNull();
- editor->setText(getString("no_object"));
- editor->makePristine();
- editor->setEnabled(false);
+ mEditor->setText(getString("no_object"));
+ mEditor->makePristine();
+ mEditor->setEnabled(false);
mAssetStatus = PREVIEW_ASSET_LOADED;
return;
}
@@ -301,22 +296,22 @@ void LLPreviewNotecard::loadAsset()
else
{
mAssetID.setNull();
- editor->setText(getString("not_allowed"));
- editor->makePristine();
- editor->setEnabled(false);
+ mEditor->setText(getString("not_allowed"));
+ mEditor->makePristine();
+ mEditor->setEnabled(false);
mAssetStatus = PREVIEW_ASSET_LOADED;
}
if(!allow_modify)
{
- editor->setEnabled(false);
- getChildView("lock")->setVisible( true);
- getChildView("Edit")->setEnabled(false);
+ mEditor->setEnabled(false);
+ mLockBtn->setVisible( true);
+ mEditBtn->setEnabled(false);
}
if((allow_modify || is_owner) && !source_library)
{
- getChildView("Delete")->setEnabled(true);
+ mDeleteBtn->setEnabled(true);
}
}
else if (mObjectUUID.notNull() && mItemUUID.notNull())
@@ -345,9 +340,9 @@ void LLPreviewNotecard::loadAsset()
if (fail)
{
- editor->setText(LLStringUtil::null);
- editor->makePristine();
- editor->setEnabled(true);
+ mEditor->setText(LLStringUtil::null);
+ mEditor->makePristine();
+ mEditor->setEnabled(true);
// Don't set asset status here; we may not have set the item id yet
// (e.g. when this gets called initially)
//mAssetStatus = PREVIEW_ASSET_LOADED;
@@ -377,7 +372,7 @@ void LLPreviewNotecard::onLoadComplete(const LLUUID& asset_uuid,
buffer[file_length] = 0;
- LLViewerTextEditor* previewEditor = preview->getChild<LLViewerTextEditor>("Notecard Editor");
+ LLViewerTextEditor* previewEditor = preview->mEditor;
if( (file_length > 19) && !strncmp( &buffer[0], "Linden text version", 19 ) )
{
@@ -421,38 +416,6 @@ void LLPreviewNotecard::onLoadComplete(const LLUUID& asset_uuid,
delete floater_key;
}
-// static
-void LLPreviewNotecard::onClickSave(void* user_data)
-{
- //LL_INFOS() << "LLPreviewNotecard::onBtnSave()" << LL_ENDL;
- LLPreviewNotecard* preview = (LLPreviewNotecard*)user_data;
- if(preview)
- {
- preview->saveIfNeeded();
- }
-}
-
-
-// static
-void LLPreviewNotecard::onClickDelete(void* user_data)
-{
- LLPreviewNotecard* preview = (LLPreviewNotecard*)user_data;
- if(preview)
- {
- preview->deleteNotecard();
- }
-}
-
-// static
-void LLPreviewNotecard::onClickEdit(void* user_data)
-{
- LLPreviewNotecard* preview = (LLPreviewNotecard*)user_data;
- if (preview)
- {
- preview->openInExternalEditor();
- }
-}
-
struct LLSaveNotecardInfo
{
LLPreviewNotecard* mSelf;
@@ -515,23 +478,15 @@ void LLPreviewNotecard::finishTaskUpload(LLUUID itemId, LLUUID newAssetId, LLUUI
bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem, bool sync)
{
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
-
- if(!editor)
- {
- LL_WARNS() << "Cannot get handle to the notecard editor." << LL_ENDL;
- return false;
- }
-
- if(!editor->isPristine())
+ if(!mEditor->isPristine())
{
std::string buffer;
- if (!editor->exportBuffer(buffer))
+ if (!mEditor->exportBuffer(buffer))
{
return false;
}
- editor->makePristine();
+ mEditor->makePristine();
const LLInventoryItem* item = getItem();
// save it out to database
if (item)
@@ -692,11 +647,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
// Perform item copy to inventory
if (info->mCopyItem.notNull())
{
- LLViewerTextEditor* editor = info->mSelf->getChild<LLViewerTextEditor>("Notecard Editor");
- if (editor)
- {
- editor->copyInventory(info->mCopyItem);
- }
+ info->mSelf->mEditor->copyInventory(info->mCopyItem);
}
// Find our window and close it if requested.
@@ -731,7 +682,7 @@ bool LLPreviewNotecard::handleSaveChangesDialog(const LLSD& notification, const
{
case 0: // "Yes"
mCloseAfterSave = true;
- LLPreviewNotecard::onClickSave((void*)this);
+ saveIfNeeded();
break;
case 1: // "No"
diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h
index db677b1cf9..be3c804f9b 100644
--- a/indra/newview/llpreviewnotecard.h
+++ b/indra/newview/llpreviewnotecard.h
@@ -41,6 +41,7 @@
class LLViewerTextEditor;
class LLButton;
+class LLLineEditor;
class LLPreviewNotecard : public LLPreview, public LLVOInventoryListener
{
@@ -93,12 +94,6 @@ protected:
LLAssetType::EType type,
void* user_data, S32 status, LLExtStat ext_status);
- static void onClickSave(void* data);
-
- static void onClickDelete(void* data);
-
- static void onClickEdit(void* data);
-
static void onSaveComplete(const LLUUID& asset_uuid,
void* user_data,
S32 status, LLExtStat ext_status);
@@ -116,14 +111,18 @@ protected:
std::string getTmpFileName();
protected:
- LLViewerTextEditor* mEditor;
- LLButton* mSaveBtn;
+ LLViewerTextEditor* mEditor = nullptr;
+ LLLineEditor* mDescEditor = nullptr;
+ LLButton* mSaveBtn = nullptr;
+ LLButton* mEditBtn = nullptr;
+ LLButton* mDeleteBtn = nullptr;
+ LLUICtrl* mLockBtn = nullptr;
LLUUID mAssetID;
LLUUID mObjectID;
- LLLiveLSLFile* mLiveFile;
+ LLLiveLSLFile* mLiveFile = nullptr;
};
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index b7c929f0b5..02a4c7fb26 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -435,7 +435,7 @@ void LLLiveLSLEditor::experienceChanged()
if(mScriptEd->getAssociatedExperience() != mExperiences->getSelectedValue().asUUID())
{
mScriptEd->enableSave(getIsModifiable());
- //getChildView("Save_btn")->setEnabled(true);
+ //mSaveBtn->setEnabled(true);
mScriptEd->setAssociatedExperience(mExperiences->getSelectedValue().asUUID());
updateExperiencePanel();
}
@@ -481,6 +481,7 @@ void LLLiveLSLEditor::onToggleExperience( LLUICtrl *ui, void* userdata )
bool LLScriptEdCore::postBuild()
{
+ mLineCol = getChild<LLTextBox>("line_col");
mErrorList = getChild<LLScrollListCtrl>("lsl errors");
mFunctions = getChild<LLComboBox>("Insert...");
@@ -490,7 +491,8 @@ bool LLScriptEdCore::postBuild()
mEditor = getChild<LLScriptEditor>("Script Editor");
childSetCommitCallback("lsl errors", &LLScriptEdCore::onErrorList, this);
- childSetAction("Save_btn", boost::bind(&LLScriptEdCore::doSave,this,false));
+ mSaveBtn = getChild<LLButton>("Save_btn");
+ mSaveBtn->setCommitCallback(boost::bind(&LLScriptEdCore::doSave, this, false));
childSetAction("Edit_btn", boost::bind(&LLScriptEdCore::openInExternalEditor, this));
initMenu();
@@ -711,7 +713,7 @@ bool LLScriptEdCore::hasChanged()
void LLScriptEdCore::draw()
{
bool script_changed = hasChanged();
- getChildView("Save_btn")->setEnabled(script_changed && !mScriptRemoved);
+ mSaveBtn->setEnabled(script_changed && !mScriptRemoved);
if( mEditor->hasFocus() )
{
@@ -723,11 +725,11 @@ void LLScriptEdCore::draw()
args["[LINE]"] = llformat ("%d", line);
args["[COLUMN]"] = llformat ("%d", column);
cursor_pos = LLTrans::getString("CursorPos", args);
- getChild<LLUICtrl>("line_col")->setValue(cursor_pos);
+ mLineCol->setValue(cursor_pos);
}
else
{
- getChild<LLUICtrl>("line_col")->setValue(LLStringUtil::null);
+ mLineCol->setValue(LLStringUtil::null);
}
updateDynamicHelp();
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 9a3bc35f12..70ee1a4274 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -195,6 +195,8 @@ private:
bool mScriptRemoved;
bool mSaveDialogShown;
LLUUID mAssetID;
+ LLTextBox* mLineCol = nullptr;
+ LLButton* mSaveBtn = nullptr;
LLScriptEdContainer* mContainer; // parent view
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 259332a3ff..1b657d9ea1 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -129,6 +129,10 @@ void LLPreviewTexture::populateRatioList()
// virtual
bool LLPreviewTexture::postBuild()
{
+ mButtonsPanel = getChild<LLLayoutPanel>("buttons_panel");
+ mDimensionsText = getChild<LLUICtrl>("dimensions");
+ mAspectRatioText = getChild<LLUICtrl>("aspect_ratio");
+
if (mCopyToInv)
{
getChild<LLButton>("Keep")->setLabel(getString("Copy"));
@@ -346,15 +350,20 @@ void LLPreviewTexture::reshape(S32 width, S32 height, bool called_from_parent)
{
LLPreview::reshape(width, height, called_from_parent);
- LLRect dim_rect(getChildView("dimensions")->getRect());
-
S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
// add space for dimensions and aspect ratio
- S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
- if (getChild<LLLayoutPanel>("buttons_panel")->getVisible())
+ S32 info_height = CLIENT_RECT_VPAD;
+
+ if (mDimensionsText)
+ {
+ LLRect dim_rect(mDimensionsText->getRect());
+ info_height += dim_rect.mTop;
+ }
+
+ if (mButtonsPanel && mButtonsPanel->getVisible())
{
- info_height += getChild<LLLayoutPanel>("buttons_panel")->getRect().getHeight();
+ info_height += mButtonsPanel->getRect().getHeight();
}
LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
@@ -404,8 +413,8 @@ void LLPreviewTexture::hideCtrlButtons()
{
getChildView("desc txt")->setVisible(false);
getChildView("desc")->setVisible(false);
- getChild<LLLayoutStack>("preview_stack")->collapsePanel(getChild<LLLayoutPanel>("buttons_panel"), true);
- getChild<LLLayoutPanel>("buttons_panel")->setVisible(false);
+ getChild<LLLayoutStack>("preview_stack")->collapsePanel(mButtonsPanel, true);
+ mButtonsPanel->setVisible(false);
getChild<LLComboBox>("combo_aspect_ratio")->setCurrentByIndex(0); //unconstrained
reshape(getRect().getWidth(), getRect().getHeight());
}
@@ -538,8 +547,8 @@ void LLPreviewTexture::updateDimensions()
// Update the width/height display every time
- getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", img_width));
- getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", img_height));
+ mDimensionsText->setTextArg("[WIDTH]", llformat("%d", img_width));
+ mDimensionsText->setTextArg("[HEIGHT]", llformat("%d", img_height));
mLastHeight = img_height;
mLastWidth = img_width;
@@ -554,9 +563,9 @@ void LLPreviewTexture::updateDimensions()
gFloaterView->adjustToFitScreen(this, false);
- LLRect dim_rect(getChildView("dimensions")->getRect());
- LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect());
- getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft);
+ LLRect dim_rect(mDimensionsText->getRect());
+ LLRect aspect_label_rect(mAspectRatioText->getRect());
+ mAspectRatioText->setVisible( dim_rect.mRight < aspect_label_rect.mLeft);
}
}
@@ -657,7 +666,7 @@ void LLPreviewTexture::adjustAspectRatio()
S32 num = mImage->getFullWidth() / divisor;
S32 denom = mImage->getFullHeight() / divisor;
- if (setAspectRatio(num, denom))
+ if (setAspectRatio((F32)num, (F32)denom))
{
// Select corresponding ratio entry in the combo list
LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
@@ -677,7 +686,7 @@ void LLPreviewTexture::adjustAspectRatio()
}
else
{
- combo->setCurrentByIndex(found - mRatiosList.begin());
+ combo->setCurrentByIndex((S32)(found - mRatiosList.begin()));
}
}
}
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index e55d61ef10..44f3f07339 100644
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -34,6 +34,7 @@
class LLComboBox;
class LLImageRaw;
+class LLLayoutPanel;
class LLPreviewTexture : public LLPreview
{
@@ -105,5 +106,9 @@ private:
LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
std::vector<std::string> mRatiosList;
+
+ LLLayoutPanel* mButtonsPanel = nullptr;
+ LLUICtrl* mDimensionsText = nullptr;
+ LLUICtrl* mAspectRatioText = nullptr;
};
#endif // LL_LLPREVIEWTEXTURE_H
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index e03984a44c..80e403dfde 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -81,6 +81,11 @@ bool LLProgressView::postBuild()
{
mProgressBar = getChild<LLProgressBar>("login_progress_bar");
+ mLogosLabel = getChild<LLTextBox>("logos_lbl");
+
+ mProgressText = getChild<LLTextBox>("progress_text");
+ mMessageText = getChild<LLTextBox>("message_text");
+
// media control that is used to play intro video
mMediaCtrl = getChild<LLMediaCtrl>("login_media_panel");
mMediaCtrl->setVisible( false ); // hidden initially
@@ -238,9 +243,8 @@ void LLProgressView::drawLogos(F32 alpha)
// logos are tied to label,
// due to potential resizes we have to figure offsets out on draw or resize
- LLTextBox *logos_label = getChild<LLTextBox>("logos_lbl");
S32 offset_x, offset_y;
- logos_label->localPointToScreen(0, 0, &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++)
@@ -325,7 +329,7 @@ void LLProgressView::draw()
void LLProgressView::setText(const std::string& text)
{
- getChild<LLUICtrl>("progress_text")->setValue(text);
+ mProgressText->setValue(text);
}
void LLProgressView::setPercent(const F32 percent)
@@ -336,7 +340,7 @@ void LLProgressView::setPercent(const F32 percent)
void LLProgressView::setMessage(const std::string& msg)
{
mMessage = msg;
- getChild<LLUICtrl>("message_text")->setValue(mMessage);
+ mMessageText->setValue(mMessage);
}
void LLProgressView::loadLogo(const std::string &path,
@@ -387,8 +391,7 @@ void LLProgressView::initLogos()
S32 icon_width, icon_height;
// We don't know final screen rect yet, so we can't precalculate position fully
- LLTextBox *logos_label = getChild<LLTextBox>("logos_lbl");
- S32 texture_start_x = logos_label->getFont()->getWidthF32(logos_label->getText()) + default_pad;
+ S32 texture_start_x = (S32)mLogosLabel->getFont()->getWidthF32(mLogosLabel->getWText().c_str()) + default_pad;
S32 texture_start_y = -7;
// Normally we would just preload these textures from textures.xml,
@@ -590,7 +593,7 @@ bool LLProgressView::handleUpdate(const LLSD& event_data)
if(percent.isDefined())
{
- setPercent(percent.asReal());
+ setPercent((F32)percent.asReal());
}
return false;
}
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index db3f4a2e32..15b04a8eb9 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -36,6 +36,7 @@ class LLImageRaw;
class LLButton;
class LLProgressBar;
class LLViewerTexture;
+class LLTextBox;
class LLProgressView :
public LLPanel,
@@ -85,6 +86,9 @@ public:
protected:
LLProgressBar* mProgressBar;
LLMediaCtrl* mMediaCtrl;
+ LLTextBox* mLogosLabel = nullptr;
+ LLTextBox* mProgressText = nullptr;
+ LLTextBox* mMessageText = nullptr;
F32 mPercentDone;
std::string mMessage;
LLButton* mCancelBtn;
diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp
index d64dfdfcbc..c698139c6d 100644
--- a/indra/newview/llrecentpeople.cpp
+++ b/indra/newview/llrecentpeople.cpp
@@ -114,8 +114,8 @@ F32 LLRecentPeople::getArrivalTimeByID(const LLUUID& id)
if (it != mAvatarsArrivalTime.end())
{
- return it->second;
+ return (F32)(it->second);
}
- return LLDate::now().secondsSinceEpoch();
+ return (F32)LLDate::now().secondsSinceEpoch();
}
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index cb1ab0dac2..3526004071 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -230,7 +230,7 @@ void LLReflectionMapManager::update()
if (mMipChain.empty())
{
U32 res = mProbeResolution;
- U32 count = log2((F32)res) + 0.5f;
+ U32 count = (U32)(log2((F32)res) + 0.5f);
mMipChain.resize(count);
for (U32 i = 0; i < count; ++i)
@@ -251,7 +251,7 @@ void LLReflectionMapManager::update()
auto const & iter = std::find(mProbes.begin(), mProbes.end(), probe);
if (iter != mProbes.end())
{
- deleteProbe(iter - mProbes.begin());
+ deleteProbe((U32)(iter - mProbes.begin()));
}
}
@@ -761,7 +761,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
}
- S32 mips = log2((F32)mProbeResolution) + 0.5f;
+ S32 mips = (S32)(log2((F32)mProbeResolution) + 0.5f);
gReflectionMipProgram.bind();
S32 diffuseChannel = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE);
@@ -839,7 +839,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
static LLStaticHashedString sWidth("u_width");
gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1));
- gRadianceGenProgram.uniform1f(sMipLevel, i);
+ gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i);
gRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
for (int cf = 0; cf < 6; ++cf)
@@ -1371,14 +1371,22 @@ void LLReflectionMapManager::initReflectionMaps()
{
U32 count = LL_MAX_REFLECTION_PROBE_COUNT;
- if (mTexture.isNull() || mReflectionProbeCount != count || mReset)
+ static LLCachedControl<U32> ref_probe_res(gSavedSettings, "RenderReflectionProbeResolution", 128U);
+ U32 probe_resolution = nhpo2(llclamp(ref_probe_res(), (U32)64, (U32)512));
+ if (mTexture.isNull() || mReflectionProbeCount != count || mProbeResolution != probe_resolution || mReset)
{
+ if(mProbeResolution != probe_resolution)
+ {
+ mRenderTarget.release();
+ mMipChain.clear();
+ }
+
gEXRImage = nullptr;
mReset = false;
mReflectionProbeCount = count;
- mProbeResolution = nhpo2(llclamp(gSavedSettings.getU32("RenderReflectionProbeResolution"), (U32)64, (U32)512));
- mMaxProbeLOD = log2f(mProbeResolution) - 1.f; // number of mips - 1
+ mProbeResolution = probe_resolution;
+ mMaxProbeLOD = log2f((F32)mProbeResolution) - 1.f; // number of mips - 1
if (mTexture.isNull() ||
mTexture->getWidth() != mProbeResolution ||
diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp
index cdccaf44e9..7498c2d524 100644
--- a/indra/newview/llscenemonitor.cpp
+++ b/indra/newview/llscenemonitor.cpp
@@ -225,11 +225,10 @@ void LLSceneMonitor::freezeScene()
return;
}
- //freeze all avatars
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ // freeze all avatars
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- freezeAvatar((LLCharacter*)(*iter));
+ freezeAvatar((LLCharacter*)character);
}
// freeze everything else
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 89ec2bf72e..44c2a8fdaf 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -55,12 +55,12 @@ LLRect LLScreenChannelBase::getChannelRect()
if (mFloaterSnapRegion == NULL)
{
- mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ mFloaterSnapRegion = gViewerWindow->getFloaterSnapRegion();
}
if (mChicletRegion == NULL)
{
- mChicletRegion = gViewerWindow->getRootView()->getChildView("chiclet_container");
+ mChicletRegion = gViewerWindow->getChicletContainer();
}
LLRect channel_rect;
@@ -103,12 +103,12 @@ bool LLScreenChannelBase::postBuild()
{
if (mFloaterSnapRegion == NULL)
{
- mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ mFloaterSnapRegion = gViewerWindow->getFloaterSnapRegion();
}
if (mChicletRegion == NULL)
{
- mChicletRegion = gViewerWindow->getRootView()->getChildView("chiclet_container");
+ mChicletRegion = gViewerWindow->getChicletContainer();
}
return true;
@@ -259,7 +259,7 @@ void LLScreenChannel::updatePositionAndSize(LLRect new_world_rect)
//--------------------------------------------------------------------------
void LLScreenChannel::addToast(const LLToast::Params& p)
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
bool store_toast = false, show_toast = false;
if (mDisplayToastsAlways)
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index 22fb41e559..651483dbe3 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -30,7 +30,6 @@
#include "lltoast.h"
#include <map>
-#include <boost/shared_ptr.hpp>
namespace LLNotificationsUI
{
diff --git a/indra/newview/llscripteditor.cpp b/indra/newview/llscripteditor.cpp
index 6eb8cf0b37..59cf3ac02b 100644
--- a/indra/newview/llscripteditor.cpp
+++ b/indra/newview/llscripteditor.cpp
@@ -122,12 +122,12 @@ void LLScriptEditor::drawLineNumbers()
const LLWString ltext = utf8str_to_wstring(llformat("%d", line.mLineNum ));
bool is_cur_line = cursor_line == line.mLineNum;
const U8 style = is_cur_line ? LLFontGL::BOLD : LLFontGL::NORMAL;
- const LLColor4 fg_color = is_cur_line ? mCursorColor : mReadOnlyFgColor;
+ const LLColor4& fg_color = is_cur_line ? mCursorColor : mReadOnlyFgColor;
getScriptFont()->render(
ltext, // string to draw
0, // begin offset
UI_TEXTEDITOR_LINE_NUMBER_MARGIN - 2, // x
- line_bottom, // y
+ (F32)line_bottom, // y
fg_color,
LLFontGL::RIGHT, // horizontal alignment
LLFontGL::BOTTOM, // vertical alignment
diff --git a/indra/newview/llscrollingpanelparambase.cpp b/indra/newview/llscrollingpanelparambase.cpp
index 247639aa48..d6b5434fa4 100644
--- a/indra/newview/llscrollingpanelparambase.cpp
+++ b/indra/newview/llscrollingpanelparambase.cpp
@@ -51,12 +51,13 @@ LLScrollingPanelParamBase::LLScrollingPanelParamBase( const LLPanel::Params& pan
else
buildFromFile( "panel_scrolling_param_base.xml");
- getChild<LLUICtrl>("param slider")->setValue(weightToPercent(param->getWeight()));
+ mParamSlider = getChild<LLUICtrl>("param slider");
+ mParamSlider->setValue(weightToPercent(param->getWeight()));
std::string display_name = LLTrans::getString(param->getDisplayName());
- getChild<LLUICtrl>("param slider")->setLabelArg("[DESC]", display_name);
- getChildView("param slider")->setEnabled(mAllowModify);
- childSetCommitCallback("param slider", LLScrollingPanelParamBase::onSliderMoved, this);
+ mParamSlider->setLabelArg("[DESC]", display_name);
+ mParamSlider->setEnabled(mAllowModify);
+ mParamSlider->setCommitCallback(LLScrollingPanelParamBase::onSliderMoved, this);
setVisible(false);
setBorderVisible( false );
@@ -77,9 +78,9 @@ void LLScrollingPanelParamBase::updatePanel(bool allow_modify)
}
F32 current_weight = mWearable->getVisualParamWeight( param->getID() );
- getChild<LLUICtrl>("param slider")->setValue(weightToPercent( current_weight ) );
+ mParamSlider->setValue(weightToPercent( current_weight ) );
mAllowModify = allow_modify;
- getChildView("param slider")->setEnabled(mAllowModify);
+ mParamSlider->setEnabled(mAllowModify);
}
// static
diff --git a/indra/newview/llscrollingpanelparambase.h b/indra/newview/llscrollingpanelparambase.h
index 9deafcc81a..d5477a8397 100644
--- a/indra/newview/llscrollingpanelparambase.h
+++ b/indra/newview/llscrollingpanelparambase.h
@@ -55,6 +55,7 @@ public:
public:
LLViewerVisualParam* mParam;
protected:
+ LLUICtrl* mParamSlider = nullptr;
bool mAllowModify;
LLWearable *mWearable;
};
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index 5cc78d09dc..ceea11cc34 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -35,6 +35,7 @@
#include "llexception.h"
#ifdef LL_WINDOWS
+#pragma warning (push)
#pragma warning(disable:4250)
#endif // LL_WINDOWS
@@ -549,5 +550,8 @@ void registerSecHandler(const std::string& handler_type,
extern LLPointer<LLSecAPIHandler> gSecAPIHandler;
+#ifdef LL_WINDOWS
+#pragma warning (pop)
+#endif // LL_WINDOWS
#endif // LL_SECAPI_H
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index 2d8a5eaf13..1e50135e89 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -901,7 +901,7 @@ void _validateCert(int validation_policy,
if (validation_policy & VALIDATION_POLICY_TIME)
{
- LLDate validation_date(time(NULL));
+ LLDate validation_date((double)time(NULL));
if(validation_params.has(CERT_VALIDATION_DATE))
{
validation_date = validation_params[CERT_VALIDATION_DATE];
@@ -1111,7 +1111,7 @@ void LLBasicCertificateStore::validate(int validation_policy,
}
else
{
- validation_date = LLDate(time(NULL)); // current time
+ validation_date = LLDate((double)time(NULL)); // current time
}
if((validation_date < cache_entry->second.first) ||
@@ -1358,8 +1358,8 @@ void LLSecAPIBasicHandler::_readProtectedData(unsigned char *unique_id, U32 id_l
protected_data_stream.read((char *)buffer, BUFFER_READ_SIZE);
EVP_DecryptUpdate(ctx, decrypted_buffer, &decrypted_length,
- buffer, protected_data_stream.gcount());
- decrypted_data.append((const char *)decrypted_buffer, protected_data_stream.gcount());
+ buffer, (int)protected_data_stream.gcount());
+ decrypted_data.append((const char *)decrypted_buffer, (int)protected_data_stream.gcount());
}
// RC4 is a stream cipher, so we don't bother to EVP_DecryptFinal, as there is
@@ -1447,7 +1447,7 @@ void LLSecAPIBasicHandler::_writeProtectedData()
}
int encrypted_length;
EVP_EncryptUpdate(ctx, encrypted_buffer, &encrypted_length,
- buffer, formatted_data_istream.gcount());
+ buffer, (int)formatted_data_istream.gcount());
protected_data_stream.write((const char *)encrypted_buffer, encrypted_length);
}
diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h
index 1484c6d0e1..2dffe84775 100644
--- a/indra/newview/llsechandler_basic.h
+++ b/indra/newview/llsechandler_basic.h
@@ -28,6 +28,11 @@
#ifndef LLSECHANDLER_BASIC
#define LLSECHANDLER_BASIC
+#ifdef LL_WINDOWS
+#pragma warning (push)
+#pragma warning(disable:4250)
+#endif // LL_WINDOWS
+
#include "llsecapi.h"
#include <vector>
#include <openssl/x509.h>
@@ -346,6 +351,10 @@ protected:
bool valueCompareLLSD(const LLSD& lhs, const LLSD& rhs);
+#ifdef LL_WINDOWS
+#pragma warning (pop)
+#endif // LL_WINDOWS
+
#endif // LLSECHANDLER_BASIC
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index b3420f9c57..342048252f 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -56,6 +56,7 @@
#include "llattachmentsmgr.h"
#include "llviewerwindow.h"
#include "lldrawable.h"
+#include "llfloatergltfasseteditor.h"
#include "llfloaterinspect.h"
#include "llfloaterreporter.h"
#include "llfloaterreg.h"
@@ -127,12 +128,12 @@ F32 LLSelectMgr::sHighlightAlpha = 0.f;
F32 LLSelectMgr::sHighlightAlphaTest = 0.f;
F32 LLSelectMgr::sHighlightUAnim = 0.f;
F32 LLSelectMgr::sHighlightVAnim = 0.f;
-LLColor4 LLSelectMgr::sSilhouetteParentColor;
-LLColor4 LLSelectMgr::sSilhouetteChildColor;
-LLColor4 LLSelectMgr::sHighlightInspectColor;
-LLColor4 LLSelectMgr::sHighlightParentColor;
-LLColor4 LLSelectMgr::sHighlightChildColor;
-LLColor4 LLSelectMgr::sContextSilhouetteColor;
+LLUIColor LLSelectMgr::sSilhouetteParentColor;
+LLUIColor LLSelectMgr::sSilhouetteChildColor;
+LLUIColor LLSelectMgr::sHighlightInspectColor;
+LLUIColor LLSelectMgr::sHighlightParentColor;
+LLUIColor LLSelectMgr::sHighlightChildColor;
+LLUIColor LLSelectMgr::sContextSilhouetteColor;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// struct LLDeRezInfo
@@ -467,6 +468,11 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S3
if (object->isSelected() ) {
// make sure point at position is updated
updatePointAt();
+ LLSelectNode* nodep = mSelectedObjects->findNode(object);
+ if (nodep)
+ {
+ nodep->selectGLTFNode(gltf_node, gltf_primitive, true);
+ }
gEditMenuHandler = this;
return NULL;
}
@@ -3052,7 +3058,7 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
for (U8 te_num = 0; te_num < object->getNumTEs(); te_num++)
{
- const LLTextureEntry* tep = object->getTE(te_num);
+ LLTextureEntry* tep = object->getTE(te_num);
bool planar = tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR;
if (planar == stretch)
@@ -3086,8 +3092,6 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
object->setTEScale(te_num, diffuse_scale_s, diffuse_scale_t);
- LLTextureEntry* tep = object->getTE(te_num);
-
if (tep && !tep->getMaterialParams().isNull())
{
LLMaterialPtr orig = tep->getMaterialParams();
@@ -3125,6 +3129,47 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
LLMaterialMgr::getInstance()->put(object->getID(), te_num, *p);
}
}
+
+ if (tep->getGLTFMaterial())
+ {
+ LLPointer<LLGLTFMaterial> material = tep->getGLTFMaterialOverride();
+ if (!material)
+ {
+ material = new LLGLTFMaterial();
+ tep->setGLTFMaterialOverride(material);
+ }
+
+ F32 scale_x = 1;
+ F32 scale_y = 1;
+
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i];
+
+ if (planar)
+ {
+ scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis];
+ scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis];
+ }
+ else
+ {
+ scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis];
+ scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis];
+ }
+ material->mTextureTransform[i].mScale.set(scale_x, scale_y);
+ }
+
+ LLFetchedGLTFMaterial* render_mat = (LLFetchedGLTFMaterial*)tep->getGLTFRenderMaterial();
+ if (render_mat)
+ {
+ render_mat->applyOverride(*material);
+ }
+
+ if (send_to_sim)
+ {
+ LLGLTFMaterialList::queueModify(object, te_num, material);
+ }
+ }
send = send_to_sim;
}
}
@@ -6392,8 +6437,10 @@ void LLSelectMgr::renderSilhouettes(bool for_hud)
bool wireframe_selection = (gFloaterTools && gFloaterTools->getVisible()) || LLSelectMgr::sRenderHiddenSelections;
F32 fogCfx = (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal() - gAgentCamera.getCameraPositionGlobal()).magVec() / (LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec() * 4), 0.0, 1.0);
- static LLColor4 sParentColor = LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha);
- static LLColor4 sChildColor = LLColor4(sSilhouetteChildColor[VRED], sSilhouetteChildColor[VGREEN], sSilhouetteChildColor[VBLUE], LLSelectMgr::sHighlightAlpha);
+ LLColor4 sParentColor = sSilhouetteParentColor;
+ sParentColor.mV[VALPHA] = LLSelectMgr::sHighlightAlpha;
+ LLColor4 sChildColor = sSilhouetteChildColor;
+ sChildColor.mV[VALPHA] = LLSelectMgr::sHighlightAlpha;
auto renderMeshSelection_f = [fogCfx, wireframe_selection](LLSelectNode* node, LLViewerObject* objectp, LLColor4 hlColor)
{
@@ -6848,6 +6895,7 @@ void LLSelectNode::saveGLTFMaterials(const uuid_vec_t& materials, const gltf_mat
void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
{
mTextureScaleRatios.clear();
+ mGLTFScaleRatios.clear();
if (mObject.notNull())
{
@@ -6882,6 +6930,40 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
v.mV[t_axis] = diffuse_t/scale.mV[t_axis];
mTextureScaleRatios.push_back(v);
}
+
+ LLGLTFMaterial* material = tep->getGLTFMaterialOverride();
+ LLVector3 material_v;
+ F32 scale_x = 1;
+ F32 scale_y = 1;
+ std::vector<LLVector3> material_v_vec;
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ if (material)
+ {
+ LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i];
+ scale_x = transform.mScale[VX];
+ scale_y = transform.mScale[VY];
+ }
+ else
+ {
+ // Not having an override doesn't mean that there is no material
+ scale_x = 1;
+ scale_y = 1;
+ }
+
+ if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR)
+ {
+ material_v.mV[s_axis] = scale_x * scale.mV[s_axis];
+ material_v.mV[t_axis] = scale_y * scale.mV[t_axis];
+ }
+ else
+ {
+ material_v.mV[s_axis] = scale_x / scale.mV[s_axis];
+ material_v.mV[t_axis] = scale_y / scale.mV[t_axis];
+ }
+ material_v_vec.push_back(material_v);
+ }
+ mGLTFScaleRatios.push_back(material_v_vec);
}
}
}
@@ -7187,6 +7269,12 @@ void dialog_refresh_all()
{
panel_task_info->dirty();
}
+
+ LLFloaterGLTFAssetEditor * gltf_editor = LLFloaterReg::findTypedInstance<LLFloaterGLTFAssetEditor>("gltf_asset_editor");
+ if (gltf_editor)
+ {
+ gltf_editor->dirty();
+ }
}
S32 get_family_count(LLViewerObject *parent)
@@ -7920,12 +8008,9 @@ S32 LLObjectSelection::getSelectedObjectRenderCost()
cost += object->getRenderCost(textures);
computed_objects.insert(object->getID());
- const_child_list_t children = object->getChildren();
- for (const_child_list_t::const_iterator child_iter = children.begin();
- child_iter != children.end();
- ++child_iter)
+ const const_child_list_t& children = object->getChildren();
+ for (LLViewerObject* child_obj : children)
{
- LLViewerObject* child_obj = *child_iter;
LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj );
if (child)
{
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 89a803725e..f8242675dc 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -44,6 +44,7 @@
#include "llcontrol.h"
#include "llviewerobject.h" // LLObjectSelection::getSelectedTEValue template
#include "llmaterial.h"
+#include "lluicolor.h"
#include <deque>
#include <boost/iterator/filter_iterator.hpp>
@@ -238,6 +239,7 @@ public:
uuid_vec_t mSavedGLTFMaterialIds;
gltf_materials_vec_t mSavedGLTFOverrideMaterials;
std::vector<LLVector3> mTextureScaleRatios;
+ std::vector< std::vector<LLVector3> > mGLTFScaleRatios;
std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
bool mSilhouetteExists; // need to generate silhouette?
@@ -448,12 +450,12 @@ public:
static F32 sHighlightAlphaTest;
static F32 sHighlightUAnim;
static F32 sHighlightVAnim;
- static LLColor4 sSilhouetteParentColor;
- static LLColor4 sSilhouetteChildColor;
- static LLColor4 sHighlightParentColor;
- static LLColor4 sHighlightChildColor;
- static LLColor4 sHighlightInspectColor;
- static LLColor4 sContextSilhouetteColor;
+ static LLUIColor sSilhouetteParentColor;
+ static LLUIColor sSilhouetteChildColor;
+ static LLUIColor sHighlightParentColor;
+ static LLUIColor sHighlightChildColor;
+ static LLUIColor sHighlightInspectColor;
+ static LLUIColor sContextSilhouetteColor;
LLCachedControl<bool> mHideSelectedObjects;
LLCachedControl<bool> mRenderHighlightSelections;
diff --git a/indra/newview/llsetkeybinddialog.cpp b/indra/newview/llsetkeybinddialog.cpp
index e172e15a0e..5dbd579b45 100644
--- a/indra/newview/llsetkeybinddialog.cpp
+++ b/indra/newview/llsetkeybinddialog.cpp
@@ -337,8 +337,8 @@ void LLSetKeyBindDialog::onCancel(void* user_data)
void LLSetKeyBindDialog::onBlank(void* user_data)
{
LLSetKeyBindDialog* self = (LLSetKeyBindDialog*)user_data;
- // tmp needs 'no key' button
- self->setKeyBind(CLICK_NONE, KEY_NONE, MASK_NONE, false);
+
+ self->setKeyBind(CLICK_NONE, KEY_NONE, MASK_NONE, self->pCheckBox->getValue().asBoolean());
self->closeFloater();
}
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index a02af98bbc..5152570786 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -608,8 +608,8 @@ LLSD LLSettingsVOSky::convertToLegacy(const LLSettingsSky::ptr_t &psky, bool isA
legacy[SETTING_CLOUD_POS_DENSITY2] = ensure_array_4(settings[SETTING_CLOUD_POS_DENSITY2], 1.0);
legacy[SETTING_CLOUD_SCALE] = llsd::array(settings[SETTING_CLOUD_SCALE], LLSD::Real(0.0), LLSD::Real(0.0), LLSD::Real(1.0));
legacy[SETTING_CLOUD_SCROLL_RATE] = settings[SETTING_CLOUD_SCROLL_RATE];
- legacy[SETTING_LEGACY_ENABLE_CLOUD_SCROLL] = llsd::array(LLSD::Boolean(!is_approx_zero(settings[SETTING_CLOUD_SCROLL_RATE][0].asReal())),
- LLSD::Boolean(!is_approx_zero(settings[SETTING_CLOUD_SCROLL_RATE][1].asReal())));
+ legacy[SETTING_LEGACY_ENABLE_CLOUD_SCROLL] = llsd::array(LLSD::Boolean(!is_approx_zero((F32)settings[SETTING_CLOUD_SCROLL_RATE][0].asReal())),
+ LLSD::Boolean(!is_approx_zero((F32)settings[SETTING_CLOUD_SCROLL_RATE][1].asReal())));
legacy[SETTING_CLOUD_SHADOW] = llsd::array(settings[SETTING_CLOUD_SHADOW].asReal(), 0.0f, 0.0f, 1.0f);
legacy[SETTING_GAMMA] = llsd::array(settings[SETTING_GAMMA], 0.0f, 0.0f, 1.0f);
legacy[SETTING_GLOW] = ensure_array_4(settings[SETTING_GLOW], 1.0);
@@ -755,7 +755,7 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
if (psky->getReflectionProbeAmbiance() != 0.f)
{
shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3(ambient.mV));
- shader->uniform1f(LLShaderMgr::SKY_HDR_SCALE, sqrtf(g)*2.0); // use a modifier here so 1.0 maps to the "most desirable" default and the maximum value doesn't go off the rails
+ shader->uniform1f(LLShaderMgr::SKY_HDR_SCALE, sqrtf(g)*2.0f); // use a modifier here so 1.0 maps to the "most desirable" default and the maximum value doesn't go off the rails
}
else if (psky->canAutoAdjust() && should_auto_adjust)
{ // auto-adjust legacy sky to take advantage of probe ambiance
@@ -1054,7 +1054,7 @@ void LLSettingsVOWater::applySpecial(void *ptarget, bool force)
shader->uniform3fv(LLShaderMgr::WATER_FOGCOLOR_LINEAR, linearColor3(fog_color).mV);
- F32 blend_factor = env.getCurrentWater()->getBlendFactor();
+ F32 blend_factor = (F32)env.getCurrentWater()->getBlendFactor();
shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
// update to normal lightnorm, water shader itself will use rotated lightnorm as necessary
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 35d07d1ac8..c618483fc4 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -39,6 +39,7 @@
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
#include "llfolderviewmodel.h"
+#include "llloadingindicator.h"
#include "lloutfitobserver.h"
#include "llpaneleditwearable.h"
#include "llpaneloutfitsinventory.h"
@@ -137,6 +138,8 @@ bool LLSidepanelAppearance::postBuild()
mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
+ mWearableLoadingIndicator = getChild<LLLoadingIndicator>("wearables_loading_indicator");
+ mEditOutfitBtn = getChild<LLButton>("edit_outfit_btn");
setVisibleCallback(boost::bind(&LLSidepanelAppearance::onVisibilityChanged,this,_2));
@@ -541,8 +544,8 @@ void LLSidepanelAppearance::inventoryFetched()
void LLSidepanelAppearance::setWearablesLoading(bool val)
{
- getChildView("wearables_loading_indicator")->setVisible( val);
- getChildView("edit_outfit_btn")->setVisible( !val);
+ mWearableLoadingIndicator->setVisible(val);
+ mEditOutfitBtn->setVisible(!val);
if (!val)
{
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index f3d34a857c..1c1de99795 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -38,6 +38,7 @@ class LLCurrentlyWornFetchObserver;
class LLPanelEditWearable;
class LLViewerWearable;
class LLPanelOutfitsInventory;
+class LLLoadingIndicator;
class LLSidepanelAppearance : public LLPanel
{
@@ -86,8 +87,11 @@ private:
LLButton* mOpenOutfitBtn;
LLButton* mEditAppearanceBtn;
+ LLButton* mEditOutfitBtn = nullptr;
LLPanel* mCurrOutfitPanel;
+ LLLoadingIndicator* mWearableLoadingIndicator = nullptr;
+
LLTextBox* mCurrentLookName;
LLTextBox* mOutfitStatus;
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 0d81f2c099..5693f2808c 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -161,6 +161,8 @@ bool LLSidepanelInventory::postBuild()
mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
+ mPanelMainInventory->setParentSidepanel(this);
+ mPanelMainInventory->setInboxPanel(getChild<LLPanelMarketplaceInbox>("marketplace_inbox"));
//LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs");
//tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
@@ -372,7 +374,7 @@ void LLSidepanelInventory::onToggleInboxBtn()
mInboxLayoutPanel->setTargetDim(gSavedPerAccountSettings.getS32("InventoryInboxHeight"));
if (mInboxLayoutPanel->isInVisibleChain())
{
- gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", (U32)time_corrected());
}
}
else
@@ -397,7 +399,7 @@ void LLSidepanelInventory::onOpen(const LLSD& key)
#else
if (mInboxEnabled && getChild<LLButton>(INBOX_BUTTON_NAME)->getToggleState())
{
- gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", (U32)time_corrected());
}
#endif
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 7775e3d9f6..fccf745a74 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -351,7 +351,7 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
// Style for creator and owner links
LLStyle::Params style_params;
- LLColor4 link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ LLUIColor link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
style_params.color = link_color;
style_params.readonly_color = link_color;
style_params.is_link = true; // link will be added later
diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp
index eb8e05ec27..44e0c3b05c 100644
--- a/indra/newview/llsidetraypanelcontainer.cpp
+++ b/indra/newview/llsidetraypanelcontainer.cpp
@@ -62,10 +62,10 @@ void LLSideTrayPanelContainer::onOpen(const LLSD& key)
getCurrentPanel()->onOpen(key);
}
-void LLSideTrayPanelContainer::openPanel(const std::string& panel_name, const LLSD& key)
+void LLSideTrayPanelContainer::openPanel(std::string_view panel_name, const LLSD& key)
{
LLSD combined_key = key;
- combined_key[PARAM_SUB_PANEL_NAME] = panel_name;
+ combined_key[PARAM_SUB_PANEL_NAME] = std::string(panel_name);
onOpen(combined_key);
}
diff --git a/indra/newview/llsidetraypanelcontainer.h b/indra/newview/llsidetraypanelcontainer.h
index 5dfd7f2d83..0017d7743f 100644
--- a/indra/newview/llsidetraypanelcontainer.h
+++ b/indra/newview/llsidetraypanelcontainer.h
@@ -59,7 +59,7 @@ public:
/**
* Opens given subpanel.
*/
- void openPanel(const std::string& panel_name, const LLSD& key = LLSD::emptyMap());
+ void openPanel(std::string_view panel_name, const LLSD& key = LLSD::emptyMap());
/**
* Opens previous panel from panel navigation history.
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 432ec3899a..9e567e3262 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -32,13 +32,15 @@
#include "llpanellogin.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
-#include "llfiltersd2xmlrpc.h"
+
#include "curl/curl.h"
+
const char* LLSLURL::SLURL_HTTP_SCHEME = "http";
const char* LLSLURL::SLURL_HTTPS_SCHEME = "https";
const char* LLSLURL::SLURL_SECONDLIFE_SCHEME = "secondlife";
const char* LLSLURL::SLURL_SECONDLIFE_PATH = "secondlife";
const char* LLSLURL::SLURL_COM = "slurl.com";
+
// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag
// text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this
// version is required also.
@@ -340,7 +342,7 @@ LLSLURL::LLSLURL(const std::string& grid,
S32 y = ll_round((F32)fmod(position[VY], (F32)REGION_WIDTH_METERS));
S32 z = ll_round((F32)position[VZ]);
mType = LOCATION;
- mPosition = LLVector3(x, y, z);
+ mPosition = LLVector3((F32)x, (F32)y, (F32)z);
}
// create a simstring
@@ -356,7 +358,7 @@ LLSLURL::LLSLURL(const std::string& grid,
const LLVector3d& global_position)
{
*this = LLSLURL(LLGridManager::getInstance()->getGridId(grid), region,
- LLVector3(global_position.mdV[VX], global_position.mdV[VY], global_position.mdV[VZ]));
+ LLVector3((F32)global_position.mdV[VX], (F32)global_position.mdV[VY], (F32)global_position.mdV[VZ]));
}
// create a slurl from a global position
@@ -437,7 +439,7 @@ std::string LLSLURL::getLoginString() const
LL_WARNS("AppInit") << "Unexpected SLURL type (" << (int)mType << ")for login string" << LL_ENDL;
break;
}
- return xml_escape_string(unescaped_start.str());
+ return LLStringFn::xml_encode(unescaped_start.str(), true);
}
bool LLSLURL::operator ==(const LLSLURL& rhs)
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 787dd3b667..0b73aa493c 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -65,10 +65,10 @@ constexpr F32 FALL_TIME = 0.6f;
constexpr S32 BORDER_WIDTH = 6;
constexpr S32 TOP_PANEL_HEIGHT = 30;
-constexpr S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512
+constexpr S32 MAX_TEXTURE_SIZE = 2048 ; //max upload texture size 2048 * 2048
std::set<LLSnapshotLivePreview*> LLSnapshotLivePreview::sList;
-LLPointer<LLImageFormatted> LLSnapshotLivePreview::sSaveLocalImage = NULL;
+LLPointer<LLImageFormatted> LLSnapshotLivePreview::sSaveLocalImage = nullptr;
LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Params& p)
: LLView(p),
@@ -906,7 +906,7 @@ void LLSnapshotLivePreview::estimateDataSize()
break;
case LLSnapshotModel::SNAPSHOT_FORMAT_JPEG:
// Observed from JPG compression tests
- ratio = (110 - mSnapshotQuality) / 2;
+ ratio = (F32)(110 - mSnapshotQuality) / 2.f;
break;
case LLSnapshotModel::SNAPSHOT_FORMAT_BMP:
ratio = 1.0; // No compression with BMP
@@ -1024,7 +1024,7 @@ void LLSnapshotLivePreview::saveTexture(bool outfit_snapshot, std::string name)
LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL);
std::string who_took_it;
LLAgentUI::buildFullname(who_took_it);
- S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(scaled->getWidth(), scaled->getHeight());
std::string res_name = outfit_snapshot ? name : "Snapshot : " + pos_string;
std::string res_desc = outfit_snapshot ? "" : "Taken by " + who_took_it + " at " + pos_string;
LLFolderType::EType folder_type = outfit_snapshot ? LLFolderType::FT_NONE : LLFolderType::FT_SNAPSHOT_CATEGORY;
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 782d57aed8..b1f80e48af 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -409,7 +409,7 @@ LLSpatialGroup* LLSpatialGroup::getParent()
bool LLSpatialGroup::removeObject(LLDrawable *drawablep, bool from_octree)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL;
if(!drawablep)
{
@@ -498,7 +498,7 @@ public:
void LLSpatialGroup::setState(U32 state, S32 mode)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL;
llassert(state <= LLSpatialGroup::STATE_MASK);
@@ -547,7 +547,7 @@ public:
void LLSpatialGroup::clearState(U32 state, S32 mode)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL;
llassert(state <= LLSpatialGroup::STATE_MASK);
@@ -634,7 +634,7 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
F32 LLSpatialPartition::calcDistance(LLSpatialGroup* group, LLCamera& camera)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL;
LLVector4a eye;
LLVector4a origin;
@@ -729,7 +729,7 @@ F32 LLSpatialGroup::getUpdateUrgency() const
bool LLSpatialGroup::changeLOD()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL;
if (hasState(ALPHA_DIRTY | OBJECT_DIRTY))
{
@@ -818,7 +818,7 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
void LLSpatialGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* child)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL;
if (child->getListenerCount() == 0)
{
@@ -1051,7 +1051,8 @@ public:
LLSpatialGroup* group = (LLSpatialGroup*)base_group;
group->checkOcclusion();
- if (group->getOctreeNode()->getParent() && //never occlusion cull the root node
+ if (group->getOctreeNode() &&
+ group->getOctreeNode()->getParent() && //never occlusion cull the root node
LLPipeline::sUseOcclusion && //ignore occlusion if disabled
group->isOcclusionState(LLSpatialGroup::OCCLUDED))
{
@@ -2035,7 +2036,7 @@ void renderNormals(LLDrawable *drawablep)
obj_scale.normalize3();
// Create inverse-scale vector for normals
- inv_scale.set(1.0 / scale_v3.mV[VX], 1.0 / scale_v3.mV[VY], 1.0 / scale_v3.mV[VZ], 0.0);
+ inv_scale.set(1.0f / scale_v3.mV[VX], 1.0f / scale_v3.mV[VY], 1.0f/ scale_v3.mV[VZ], 0.0f);
inv_scale.mul(inv_scale); // Squared, to apply inverse scale twice
inv_scale.normalize3fast();
@@ -2763,7 +2764,7 @@ void renderTexelDensity(LLDrawable* drawable)
break;
}
- checkerboard_matrix.initScale(LLVector3(texturep->getWidth(discard_level) / 8, texturep->getHeight(discard_level) / 8, 1.f));
+ checkerboard_matrix.initScale(LLVector3((F32)texturep->getWidth(discard_level) / 8.f, (F32)texturep->getHeight(discard_level) / 8.f, 1.f));
gGL.getTexUnit(0)->bind(LLViewerTexture::sCheckerBoardImagep, true);
gGL.matrixMode(LLRender::MM_TEXTURE);
@@ -3978,12 +3979,14 @@ void LLCullResult::clear()
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
{
- for (U32 j = 0; j < mRenderMapSize[i]; j++)
+ drawinfo_list_t& render_map = mRenderMap[i];
+ U32 render_map_size = llmin((U32)render_map.size(), mRenderMapSize[i]);
+ for (U32 j = 0; j < render_map_size; j++)
{
- mRenderMap[i][j] = 0;
+ render_map[j] = 0;
}
mRenderMapSize[i] = 0;
- mRenderMapEnd[i] = &(mRenderMap[i][0]);
+ mRenderMapEnd[i] = &render_map.front();
}
}
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 8fc3f1454f..4956c188fb 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -368,8 +368,8 @@ void LLSpeakerMgr::update(bool resort_ok)
return;
}
- LLColor4 speaking_color = LLUIColorTable::instance().getColor("SpeakingColor");
- LLColor4 overdriven_color = LLUIColorTable::instance().getColor("OverdrivenColor");
+ static const LLUIColor speaking_color = LLUIColorTable::instance().getColor("SpeakingColor");
+ static const LLUIColor overdriven_color = LLUIColorTable::instance().getColor("OverdrivenColor");
if(resort_ok) // only allow list changes when user is not interacting with it
{
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index dd005874a5..7cefa21125 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -957,7 +957,7 @@ bool idle_startup()
// and startup time is close enough if we don't have a real value.
if (gSavedPerAccountSettings.getU32("LastLogoff") == 0)
{
- gSavedPerAccountSettings.setU32("LastLogoff", time_corrected());
+ gSavedPerAccountSettings.setU32("LastLogoff", (U32)time_corrected());
}
//Default the path if one isn't set.
@@ -1285,7 +1285,6 @@ bool idle_startup()
//
// Initialize classes w/graphics stuff.
//
- LLViewerStatsRecorder::instance(); // Since textures work in threads
LLSurface::initClasses();
display_startup();
@@ -1508,7 +1507,11 @@ bool idle_startup()
// create a container's instance for start a controlling conversation windows
// by the voice's events
- LLFloaterIMContainer::getInstance();
+ LLFloaterIMContainer *im_inst = LLFloaterIMContainer::getInstance();
+ if(gAgent.isFirstLogin())
+ {
+ im_inst->openFloater(im_inst->getKey());
+ }
if (gSavedSettings.getS32("ParcelMediaAutoPlayEnable") == 2)
{
LLViewerParcelAskPlay::getInstance()->loadSettings();
@@ -3665,7 +3668,7 @@ bool process_login_success_response()
if(server_utc_time)
{
time_t now = time(NULL);
- gUTCOffset = (server_utc_time - now);
+ gUTCOffset = (S32)(server_utc_time - now);
// Print server timestamp
LLSD substitution;
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index e6bced5c92..1826885069 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -54,6 +54,7 @@
#include "llglheaders.h"
#include "lldrawpoolterrain.h"
#include "lldrawable.h"
+#include "llworldmipmap.h"
extern LLPipeline gPipeline;
extern bool gShiftFrame;
@@ -74,7 +75,6 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) :
mDetailTextureScale(0.f),
mOriginGlobal(0.0, 0.0, 0.0),
mSTexturep(NULL),
- mWaterTexturep(NULL),
mGridsPerPatchEdge(0),
mMetersPerGrid(1.0f),
mMetersPerEdge(1.0f),
@@ -129,14 +129,7 @@ LLSurface::~LLSurface()
{
gPipeline.removePool(poolp);
// Don't enable this until we blitz the draw pool for it as well. -- djs
- if (mSTexturep)
- {
- mSTexturep = NULL;
- }
- if (mWaterTexturep)
- {
- mWaterTexturep = NULL;
- }
+ mSTexturep = NULL;
}
else
{
@@ -216,62 +209,17 @@ LLViewerTexture* LLSurface::getSTexture()
return mSTexturep;
}
-LLViewerTexture* LLSurface::getWaterTexture()
-{
- if (mWaterTexturep.notNull() && !mWaterTexturep->hasGLTexture())
- {
- createWaterTexture();
- }
- return mWaterTexturep;
-}
-
void LLSurface::createSTexture()
{
if (!mSTexturep)
{
- // Fill with dummy gray data.
- // GL NOT ACTIVE HERE
- LLPointer<LLImageRaw> raw = new LLImageRaw(sTextureSize, sTextureSize, 3);
- U8 *default_texture = raw->getData();
- for (S32 i = 0; i < sTextureSize; i++)
- {
- for (S32 j = 0; j < sTextureSize; j++)
- {
- *(default_texture + (i*sTextureSize + j)*3) = 128;
- *(default_texture + (i*sTextureSize + j)*3 + 1) = 128;
- *(default_texture + (i*sTextureSize + j)*3 + 2) = 128;
- }
- }
+ U64 handle = mRegionp->getHandle();
- mSTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), false);
- mSTexturep->dontDiscard();
- gGL.getTexUnit(0)->bind(mSTexturep);
- mSTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
- }
-}
+ U32 grid_x, grid_y;
-void LLSurface::createWaterTexture()
-{
- if (!mWaterTexturep)
- {
- // Create the water texture
- LLPointer<LLImageRaw> raw = new LLImageRaw(sTextureSize/2, sTextureSize/2, 4);
- U8 *default_texture = raw->getData();
- for (S32 i = 0; i < sTextureSize/2; i++)
- {
- for (S32 j = 0; j < sTextureSize/2; j++)
- {
- *(default_texture + (i*sTextureSize/2 + j)*4) = MAX_WATER_COLOR.mV[0];
- *(default_texture + (i*sTextureSize/2 + j)*4 + 1) = MAX_WATER_COLOR.mV[1];
- *(default_texture + (i*sTextureSize/2 + j)*4 + 2) = MAX_WATER_COLOR.mV[2];
- *(default_texture + (i*sTextureSize/2 + j)*4 + 3) = MAX_WATER_COLOR.mV[3];
- }
- }
+ grid_from_region_handle(handle, &grid_x, &grid_y);
- mWaterTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), false);
- mWaterTexturep->dontDiscard();
- gGL.getTexUnit(0)->bind(mWaterTexturep);
- mWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
+ mSTexturep = LLWorldMipmap::loadObjectsTile(grid_x, grid_y, 1);
}
}
@@ -285,11 +233,10 @@ void LLSurface::initTextures()
///////////////////////
//
- // Water texture
+ // Water object
//
if (gSavedSettings.getBOOL("RenderWater") )
{
- createWaterTexture();
mWaterObjp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, mRegionp);
gPipeline.createObject(mWaterObjp);
LLVector3d water_pos_global = from_region_handle(mRegionp->getHandle());
@@ -683,11 +630,8 @@ bool LLSurface::idleUpdate(F32 max_update_time)
}
}
- if (did_update)
- {
- // some patches changed, update region reflection probes
- mRegionp->updateReflectionProbes();
- }
+ // some patches changed, update region reflection probes
+ mRegionp->updateReflectionProbes(did_update);
return did_update;
}
@@ -1221,98 +1165,3 @@ F32 LLSurface::getWaterHeight() const
}
}
-
-bool LLSurface::generateWaterTexture(const F32 x, const F32 y,
- const F32 width, const F32 height)
-{
- LL_PROFILE_ZONE_SCOPED
- if (!getWaterTexture())
- {
- return false;
- }
-
- S32 tex_width = mWaterTexturep->getWidth();
- S32 tex_height = mWaterTexturep->getHeight();
- S32 tex_comps = mWaterTexturep->getComponents();
- S32 tex_stride = tex_width * tex_comps;
- LLPointer<LLImageRaw> raw = new LLImageRaw(tex_width, tex_height, tex_comps);
- U8 *rawp = raw->getData();
-
- F32 scale = 256.f * getMetersPerGrid() / (F32)tex_width;
- F32 scale_inv = 1.f / scale;
-
- S32 x_begin, y_begin, x_end, y_end;
-
- x_begin = ll_round(x * scale_inv);
- y_begin = ll_round(y * scale_inv);
- x_end = ll_round((x + width) * scale_inv);
- y_end = ll_round((y + width) * scale_inv);
-
- if (x_end > tex_width)
- {
- x_end = tex_width;
- }
- if (y_end > tex_width)
- {
- y_end = tex_width;
- }
-
- // OK, for now, just have the composition value equal the height at the point.
- LLVector3 location;
- LLColor4U coloru;
-
- const F32 WATER_HEIGHT = getWaterHeight();
-
- S32 i, j, offset;
- for (j = y_begin; j < y_end; j++)
- {
- for (i = x_begin; i < x_end; i++)
- {
- //F32 nv[2];
- //nv[0] = i/256.f;
- //nv[1] = j/256.f;
- // const S32 modulation = noise2(nv)*40;
- offset = j*tex_stride + i*tex_comps;
- location.mV[VX] = i*scale;
- location.mV[VY] = j*scale;
-
- // Sample multiple points
- const F32 height = resolveHeightRegion(location);
-
- if (height > WATER_HEIGHT)
- {
- // Above water...
- coloru = MAX_WATER_COLOR;
- coloru.mV[3] = ABOVE_WATERLINE_ALPHA;
- *(rawp + offset++) = coloru.mV[0];
- *(rawp + offset++) = coloru.mV[1];
- *(rawp + offset++) = coloru.mV[2];
- *(rawp + offset++) = coloru.mV[3];
- }
- else
- {
- // Want non-linear curve for transparency gradient
- coloru = MAX_WATER_COLOR;
- const F32 frac = 1.f - 2.f/(2.f - (height - WATER_HEIGHT));
- S32 alpha = 64 + ll_round((255-64)*frac);
-
- alpha = llmin(ll_round((F32)MAX_WATER_COLOR.mV[3]), alpha);
- alpha = llmax(64, alpha);
-
- coloru.mV[3] = alpha;
- *(rawp + offset++) = coloru.mV[0];
- *(rawp + offset++) = coloru.mV[1];
- *(rawp + offset++) = coloru.mV[2];
- *(rawp + offset++) = coloru.mV[3];
- }
- }
- }
-
- if (!mWaterTexturep->hasGLTexture())
- {
- mWaterTexturep->createGLTexture(0, raw);
- }
-
- mWaterTexturep->setSubImage(raw, x_begin, y_begin, x_end - x_begin, y_end - y_begin);
- return true;
-}
diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h
index 324296a4d3..10a104730b 100644
--- a/indra/newview/llsurface.h
+++ b/indra/newview/llsurface.h
@@ -110,6 +110,7 @@ public:
LLSurfacePatch *resolvePatchRegion(const F32 x, const F32 y) const;
LLSurfacePatch *resolvePatchRegion(const LLVector3 &position_region) const;
LLSurfacePatch *resolvePatchGlobal(const LLVector3d &position_global) const;
+ LLSurfacePatch *getPatch(const S32 x, const S32 y) const;
// Update methods (called during idle, normally)
template<bool PBR>
@@ -128,7 +129,7 @@ public:
F32 getWaterHeight() const;
LLViewerTexture *getSTexture();
- LLViewerTexture *getWaterTexture();
+
bool hasZData() const { return mHasZData; }
void dirtyAllPatches(); // Use this to dirty all patches when changing terrain parameters
@@ -171,21 +172,11 @@ public:
protected:
void createSTexture();
- void createWaterTexture();
void initTextures();
- void initWater();
-
void createPatchData(); // Allocates memory for patches.
void destroyPatchData(); // Deallocates memory for patches.
- bool generateWaterTexture(const F32 x, const F32 y,
- const F32 width, const F32 height); // Generate texture from composition values.
-
- //F32 updateTexture(LLSurfacePatch *ppatch);
-
- LLSurfacePatch *getPatch(const S32 x, const S32 y) const;
-
protected:
LLVector3d mOriginGlobal; // In absolute frame
LLSurfacePatch *mPatchList; // Array of all patches
@@ -201,7 +192,6 @@ protected:
// The textures should never be directly initialized - use the setter methods!
LLPointer<LLViewerTexture> mSTexturep; // Texture for surface
- LLPointer<LLViewerTexture> mWaterTexturep; // Water texture
LLPointer<LLVOWater> mWaterObjp;
diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp
index 042d770550..4315c4c6b0 100644
--- a/indra/newview/llsurfacepatch.cpp
+++ b/indra/newview/llsurfacepatch.cpp
@@ -201,13 +201,13 @@ LLVector2 LLSurfacePatch::getTexCoords(const U32 x, const U32 y) const
void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 *vertex, LLVector3 *normal,
- LLVector2 *tex0, LLVector2 *tex1)
+ LLVector2 *tex1) const
{
if (!mSurfacep || !mSurfacep->getRegion() || !mSurfacep->getGridsPerEdge() || !mVObjp)
{
return; // failsafe
}
- llassert_always(vertex && normal && tex0 && tex1);
+ llassert_always(vertex && normal && tex1);
U32 surface_stride = mSurfacep->getGridsPerEdge();
U32 point_offset = x + y*surface_stride;
@@ -220,12 +220,6 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3
pos_agent.mV[VZ] = *(mDataZ + point_offset);
*vertex = pos_agent-mVObjp->getRegion()->getOriginAgent();
- LLVector3 rel_pos = pos_agent - mSurfacep->getOriginAgent();
- // *NOTE: Only PBR terrain uses the UVs right now. Texture terrain just ignores it.
- // *NOTE: In the future, UVs and horizontal position will no longer have a 1:1 relationship for PBR terrain
- LLVector3 tex_pos = rel_pos;
- tex0->mV[0] = tex_pos.mV[0];
- tex0->mV[1] = tex_pos.mV[1];
tex1->mV[0] = mSurfacep->getRegion()->getCompositionXY(llfloor(mOriginRegion.mV[0])+x, llfloor(mOriginRegion.mV[1])+y);
const F32 xyScale = 4.9215f*7.f; //0.93284f;
@@ -895,7 +889,7 @@ bool LLSurfacePatch::updateTexture()
void LLSurfacePatch::updateGL()
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
F32 meters_per_grid = getSurface()->getMetersPerGrid();
F32 grids_per_patch_edge = (F32)getSurface()->getGridsPerPatchEdge();
@@ -906,15 +900,8 @@ void LLSurfacePatch::updateGL()
updateCompositionStats();
F32 tex_patch_size = meters_per_grid*grids_per_patch_edge;
- if (comp->generateMinimapTileLand((F32)origin_region[VX], (F32)origin_region[VY],
- tex_patch_size, tex_patch_size))
- {
- mSTexUpdate = false;
- // Also generate the water texture
- mSurfacep->generateWaterTexture((F32)origin_region.mdV[VX], (F32)origin_region.mdV[VY],
- tex_patch_size, tex_patch_size);
- }
+ mSTexUpdate = false;
}
void LLSurfacePatch::dirtyZ()
diff --git a/indra/newview/llsurfacepatch.h b/indra/newview/llsurfacepatch.h
index 195250d2c0..f4831487c1 100644
--- a/indra/newview/llsurfacepatch.h
+++ b/indra/newview/llsurfacepatch.h
@@ -116,7 +116,7 @@ public:
void calcNormalFlat(LLVector3& normal_out, const U32 x, const U32 y, const U32 index /* 0 or 1 */);
void eval(const U32 x, const U32 y, const U32 stride,
- LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex0, LLVector2 *tex1);
+ LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex1) const;
@@ -146,6 +146,8 @@ public:
void dirty(); // Mark this surface patch as dirty...
void clearDirty() { mDirty = false; }
+ bool isHeightsGenerated() const { return mHeightsGenerated; }
+
void clearVObj();
public:
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index fa4e92e209..dd7c6aa9e3 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -127,7 +127,7 @@ void LLTeleportHistoryStorage::addItem(const std::string title, const LLVector3d
S32 removed_index = -1;
if (item_iter != mItems.end())
{
- removed_index = item_iter - mItems.begin();
+ removed_index = (S32)(item_iter - mItems.begin());
mItems.erase(item_iter);
}
diff --git a/indra/newview/llterrainpaintmap.cpp b/indra/newview/llterrainpaintmap.cpp
new file mode 100644
index 0000000000..4381d14546
--- /dev/null
+++ b/indra/newview/llterrainpaintmap.cpp
@@ -0,0 +1,285 @@
+/**
+ * @file llterrainpaintmap.cpp
+ * @brief Utilities for managing terrain paint maps
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llterrainpaintmap.h"
+
+#include "llviewerprecompiledheaders.h"
+
+// library includes
+#include "llglslshader.h"
+#include "llrendertarget.h"
+#include "llvertexbuffer.h"
+
+// newview includes
+#include "llrender.h"
+#include "llsurface.h"
+#include "llsurfacepatch.h"
+#include "llviewercamera.h"
+#include "llviewerregion.h"
+#include "llviewershadermgr.h"
+#include "llviewertexture.h"
+
+// static
+bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion& region, LLViewerTexture& tex)
+{
+ llassert(tex.getComponents() == 3);
+ llassert(tex.getWidth() > 0 && tex.getHeight() > 0);
+ llassert(tex.getWidth() == tex.getHeight());
+ llassert(tex.getPrimaryFormat() == GL_RGB);
+ llassert(tex.getGLTexture());
+
+ const LLSurface& surface = region.getLand();
+ const U32 patch_count = surface.getPatchesPerEdge();
+
+ // *TODO: mHeightsGenerated isn't guaranteed to be true. Assume terrain is
+ // loaded for now. Would be nice to fix the loading issue or find a better
+ // heuristic to determine that the terrain is sufficiently loaded.
+#if 0
+ // Don't proceed if the region heightmap isn't loaded
+ for (U32 rj = 0; rj < patch_count; ++rj)
+ {
+ for (U32 ri = 0; ri < patch_count; ++ri)
+ {
+ const LLSurfacePatch* patch = surface.getPatch(ri, rj);
+ if (!patch->isHeightsGenerated())
+ {
+ LL_WARNS() << "Region heightmap not fully loaded" << LL_ENDL;
+ return false;
+ }
+ }
+ }
+#endif
+
+ // Bind the debug shader and render terrain to tex
+ // Use a scratch render target because its dimensions may exceed the standard bake target, and this is a one-off bake
+ LLRenderTarget scratch_target;
+ const S32 dim = llmin(tex.getWidth(), tex.getHeight());
+ scratch_target.allocate(dim, dim, GL_RGB, false, LLTexUnit::eTextureType::TT_TEXTURE,
+ LLTexUnit::eTextureMipGeneration::TMG_NONE);
+ if (!scratch_target.isComplete())
+ {
+ llassert(false);
+ LL_WARNS() << "Failed to allocate render target" << LL_ENDL;
+ return false;
+ }
+ gGL.getTexUnit(0)->disable();
+ stop_glerror();
+
+ scratch_target.bindTarget();
+ glClearColor(0, 0, 0, 0);
+ scratch_target.clear();
+
+ // Render terrain heightmap to paint map via shader
+
+ // Set up viewport, camera, and orthographic projection matrix. Position
+ // the camera such that the camera points straight down, and the region
+ // completely covers the "screen". Since orthographic projection does not
+ // distort, we arbitrarily choose the near plane and far plane to cover the
+ // full span of region heights, plus a small amount of padding to account
+ // for rounding errors.
+ const F32 region_width = region.getWidth();
+ const F32 region_half_width = region_width / 2.0f;
+ const F32 region_camera_height = surface.getMaxZ() + DEFAULT_NEAR_PLANE;
+ LLViewerCamera camera;
+ const LLVector3 region_center = LLVector3(region_half_width, region_half_width, 0.0) + region.getOriginAgent();
+ const LLVector3 camera_origin = LLVector3(0.0f, 0.0f, region_camera_height) + region_center;
+ camera.lookAt(camera_origin, region_center, LLVector3::y_axis);
+ camera.setAspect(F32(scratch_target.getHeight()) / F32(scratch_target.getWidth()));
+ const LLRect texture_rect(0, scratch_target.getHeight(), scratch_target.getWidth(), 0);
+ glViewport(texture_rect.mLeft, texture_rect.mBottom, texture_rect.getWidth(), texture_rect.getHeight());
+ // Manually get modelview matrix from camera orientation.
+ glh::matrix4f modelview((GLfloat *) OGL_TO_CFR_ROTATION);
+ GLfloat ogl_matrix[16];
+ camera.getOpenGLTransform(ogl_matrix);
+ modelview *= glh::matrix4f(ogl_matrix);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.loadMatrix(modelview.m);
+ // Override the projection matrix from the camera
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ llassert(camera_origin.mV[VZ] >= surface.getMaxZ());
+ const F32 region_high_near = camera_origin.mV[VZ] - surface.getMaxZ();
+ constexpr F32 far_plane_delta = 0.25f;
+ const F32 region_low_far = camera_origin.mV[VZ] - surface.getMinZ() + far_plane_delta;
+ gGL.ortho(-region_half_width, region_half_width, -region_half_width, region_half_width, region_high_near, region_low_far);
+ // No need to call camera.setPerspective because we don't need the clip planes. It would be inaccurate due to the perspective rendering anyway.
+
+ // Need to get the full resolution vertices in order to get an accurate
+ // paintmap. It's not sufficient to iterate over the surface patches, as
+ // they may be at lower LODs.
+ // The functionality here is a subset of
+ // LLVOSurfacePatch::getTerrainGeometry. Unlike said function, we don't
+ // care about stride length since we're always rendering at full
+ // resolution. We also don't care about normals/tangents because those
+ // don't contribute to the paintmap.
+ // *NOTE: The actual getTerrainGeometry fits the terrain vertices snugly
+ // under the 16-bit indices limit. For the sake of simplicity, that has not
+ // been replicated here.
+ std::vector<LLPointer<LLDrawInfo>> infos;
+ // Vertex and index counts adapted from LLVOSurfacePatch::getGeomSizesMain,
+ // with additional vertices added as we are including the north and east
+ // edges here.
+ const U32 patch_size = (U32)surface.getGridsPerPatchEdge();
+ constexpr U32 stride = 1;
+ const U32 vert_size = (patch_size / stride) + 1;
+ const U32 n = vert_size * vert_size;
+ const U32 ni = 6 * (vert_size - 1) * (vert_size - 1);
+ const U32 region_vertices = n * patch_count * patch_count;
+ const U32 region_indices = ni * patch_count * patch_count;
+ if (LLGLSLShader::sCurBoundShaderPtr == nullptr)
+ { // make sure a shader is bound to satisfy mVertexBuffer->setBuffer
+ gDebugProgram.bind();
+ }
+ LLPointer<LLVertexBuffer> buf = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD1);
+ {
+ buf->allocateBuffer(region_vertices, region_indices*2); // hack double index count... TODO: find a better way to indicate 32-bit indices will be used
+ buf->setBuffer();
+ U32 vertex_total = 0;
+ std::vector<U32> index_array(region_indices);
+ std::vector<LLVector4a> positions(region_vertices);
+ std::vector<LLVector2> texcoords1(region_vertices);
+ auto idx = index_array.begin();
+ auto pos = positions.begin();
+ auto tex1 = texcoords1.begin();
+ for (U32 rj = 0; rj < patch_count; ++rj)
+ {
+ for (U32 ri = 0; ri < patch_count; ++ri)
+ {
+ const U32 index_offset = vertex_total;
+ for (U32 j = 0; j < (vert_size - 1); ++j)
+ {
+ for (U32 i = 0; i < (vert_size - 1); ++i)
+ {
+ // y
+ // 2....3
+ // ^ . .
+ // | 0....1
+ // |
+ // -------> x
+ //
+ // triangle 1: 0,1,2
+ // triangle 2: 1,3,2
+ // 0: vert0
+ // 1: vert0 + 1
+ // 2: vert0 + vert_size
+ // 3: vert0 + vert_size + 1
+ const U32 vert0 = index_offset + i + (j*vert_size);
+ *idx++ = vert0;
+ *idx++ = vert0 + 1;
+ *idx++ = vert0 + vert_size;
+ *idx++ = vert0 + 1;
+ *idx++ = vert0 + vert_size + 1;
+ *idx++ = vert0 + vert_size;
+ }
+ }
+
+ const LLSurfacePatch* patch = surface.getPatch(ri, rj);
+ for (U32 j = 0; j < vert_size; ++j)
+ {
+ for (U32 i = 0; i < vert_size; ++i)
+ {
+ LLVector3 scratch3;
+ LLVector3 pos3;
+ LLVector2 tex1_temp;
+ patch->eval(i, j, stride, &pos3, &scratch3, &tex1_temp);
+ (*pos++).set(pos3.mV[VX], pos3.mV[VY], pos3.mV[VZ]);
+ *tex1++ = tex1_temp;
+ vertex_total++;
+ }
+ }
+ }
+ }
+ buf->setIndexData(index_array.data(), 0, (U32)index_array.size());
+ buf->setPositionData(positions.data(), 0, (U32)positions.size());
+ buf->setTexCoord1Data(texcoords1.data(), 0, (U32)texcoords1.size());
+ buf->unmapBuffer();
+ buf->unbind();
+ }
+
+ // Draw the region in agent space at full resolution
+ {
+
+ LLGLSLShader::unbind();
+ // *NOTE: A theoretical non-PBR terrain bake program would be
+ // *slightly* different, due the texture terrain shader not having an
+ // alpha ramp threshold (TERRAIN_RAMP_MIX_THRESHOLD)
+ LLGLSLShader& shader = gPBRTerrainBakeProgram;
+ shader.bind();
+
+ LLGLDisable stencil(GL_STENCIL_TEST);
+ LLGLDisable scissor(GL_SCISSOR_TEST);
+ LLGLEnable cull_face(GL_CULL_FACE);
+ LLGLDepthTest depth_test(GL_FALSE, GL_FALSE, GL_ALWAYS);
+
+ S32 alpha_ramp = shader.enableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
+ LLPointer<LLViewerTexture> alpha_ramp_texture = LLViewerTextureManager::getFetchedTexture(IMG_ALPHA_GRAD_2D);
+ gGL.getTexUnit(alpha_ramp)->bind(alpha_ramp_texture);
+ gGL.getTexUnit(alpha_ramp)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+
+ buf->setBuffer();
+ for (U32 rj = 0; rj < patch_count; ++rj)
+ {
+ for (U32 ri = 0; ri < patch_count; ++ri)
+ {
+ const U32 patch_index = ri + (rj * patch_count);
+ const U32 index_offset = ni * patch_index;
+ const U32 vertex_offset = n * patch_index;
+ llassert(index_offset + ni <= region_indices);
+ llassert(vertex_offset + n <= region_vertices);
+ buf->drawRange(LLRender::TRIANGLES, vertex_offset, vertex_offset + n - 1, ni, index_offset);
+ }
+ }
+
+ shader.disableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
+
+ gGL.getTexUnit(alpha_ramp)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(alpha_ramp)->disable();
+ gGL.getTexUnit(alpha_ramp)->activate();
+
+ shader.unbind();
+ }
+
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+
+ gGL.flush();
+ LLVertexBuffer::unbind();
+ // Final step: Copy the output to the terrain paintmap
+ const bool success = tex.getGLTexture()->setSubImageFromFrameBuffer(0, 0, 0, 0, dim, dim);
+ if (!success)
+ {
+ LL_WARNS() << "Failed to copy framebuffer to paintmap" << LL_ENDL;
+ }
+ glGenerateMipmap(GL_TEXTURE_2D);
+ stop_glerror();
+
+ scratch_target.flush();
+
+ LLGLSLShader::unbind();
+
+ return success;
+}
diff --git a/indra/newview/llterrainpaintmap.h b/indra/newview/llterrainpaintmap.h
new file mode 100644
index 0000000000..66827862c5
--- /dev/null
+++ b/indra/newview/llterrainpaintmap.h
@@ -0,0 +1,42 @@
+/**
+ * @file llterrainpaintmap.h
+ * @brief Utilities for managing terrain paint maps
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#pragma once
+
+class LLViewerRegion;
+class LLViewerTexture;
+
+class LLTerrainPaintMap
+{
+public:
+
+ // Convert a region's heightmap and composition into a paint map texture which
+ // approximates how the terrain would be rendered with the heightmap.
+ // In effect, this allows converting terrain of type TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
+ // to type TERRAIN_PAINT_TYPE_PBR_PAINTMAP.
+ // Returns true if successful
+ static bool bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion& region, LLViewerTexture& tex);
+};
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 843da97089..be7653c011 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1260,7 +1260,7 @@ void LLTextureCache::updateEntryTimeStamp(S32 idx, Entry& entry)
{
if (!mReadOnly)
{
- entry.mTime = time(NULL);
+ entry.mTime = (U32)time(NULL);
mUpdatedEntryMap[idx] = entry ;
}
}
@@ -1299,7 +1299,7 @@ bool LLTextureCache::updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32
mTexturesSizeTotal -= entry.mBodySize ;
mTexturesSizeTotal += new_body_size ;
}
- entry.mTime = time(NULL);
+ entry.mTime = (U32)time(NULL);
entry.mImageSize = new_image_size ;
entry.mBodySize = new_body_size ;
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 81a70a81cf..35057a910a 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -558,6 +558,7 @@ bool LLFloaterTexturePicker::postBuild()
mResolutionLabel = getChild<LLTextBox>("size_lbl");
mResolutionWarning = getChild<LLTextBox>("over_limit_lbl");
+ mPreviewWidget = getChild<LLView>("preview_widget");
mDefaultBtn = getChild<LLButton>("Default");
mNoneBtn = getChild<LLButton>("None");
@@ -653,7 +654,6 @@ void LLFloaterTexturePicker::draw()
bool valid_dims = updateImageStats();
// if we're inactive, gray out "apply immediate" checkbox
- getChildView("show_folders_check")->setEnabled(mActive && mCanApplyImmediately && !mNoCopyTextureSelected);
mSelectBtn->setEnabled(mActive && mCanApply && valid_dims);
mPipetteBtn->setEnabled(mActive);
mPipetteBtn->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
@@ -731,7 +731,7 @@ void LLFloaterTexturePicker::draw()
}
// Border
- LLRect border = getChildView("preview_widget")->getRect();
+ LLRect border = mPreviewWidget->getRect();
gl_rect_2d( border, LLColor4::black, false );
@@ -2308,8 +2308,8 @@ void LLTextureCtrl::draw()
font->renderUTF8(
mLoadingPlaceholderString,
0,
- llfloor(interior.mLeft+3),
- llfloor(interior.mTop-v_offset),
+ (interior.mLeft+3),
+ (interior.mTop-v_offset),
LLColor4::white,
LLFontGL::LEFT,
LLFontGL::BASELINE,
@@ -2325,17 +2325,17 @@ void LLTextureCtrl::draw()
v_offset += 12;
tdesc = llformat(" PK : %d%%", U32(mTexturep->getDownloadProgress()*100.0));
- font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset),
+ font->renderUTF8(tdesc, 0, interior.mLeft+3, interior.mTop-v_offset,
LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
v_offset += 12;
tdesc = llformat(" LVL: %d", mTexturep->getDiscardLevel());
- font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset),
+ font->renderUTF8(tdesc, 0, interior.mLeft+3, interior.mTop-v_offset,
LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
v_offset += 12;
tdesc = llformat(" ID : %s...", (mImageAssetID.asString().substr(0,7)).c_str());
- font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset),
+ font->renderUTF8(tdesc, 0, interior.mLeft+3, interior.mTop-v_offset,
LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
}
}
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 3c6cff4eaa..df5e763139 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -437,6 +437,7 @@ protected:
LLButton* mPipetteBtn;
LLButton* mSelectBtn;
LLButton* mCancelBtn;
+ LLView* mPreviewWidget = nullptr;
private:
bool mCanApply;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index ee13baaa18..69c40066b4 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -467,14 +467,6 @@ private:
// Locks: Mw (ctor invokes without lock)
void setDesiredDiscard(S32 discard, S32 size);
- // Threads: T*
- // Locks: Mw
- bool insertPacket(S32 index, U8* data, S32 size);
-
- // Locks: Mw
- void clearPackets();
-
-
// Locks: Mw
void removeFromCache();
@@ -592,21 +584,6 @@ private:
// Work Data
LLMutex mWorkMutex;
- struct PacketData
- {
- PacketData(U8* data, S32 size)
- : mData(data), mSize(size)
- {}
- ~PacketData() { clearData(); }
- void clearData() { delete[] mData; mData = NULL; }
-
- U8* mData;
- U32 mSize;
- };
- std::vector<PacketData*> mPackets;
- S32 mFirstPacket;
- S32 mLastPacket;
- U16 mTotalPackets;
U8 mImageCodec;
LLViewerAssetStats::duration_t mMetricsStartTime;
@@ -922,9 +899,6 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mRetryAttempt(0),
mActiveCount(0),
mWorkMutex(),
- mFirstPacket(0),
- mLastPacket(-1),
- mTotalPackets(0),
mImageCodec(IMG_CODEC_INVALID),
mMetricsStartTime(0),
mHttpHandle(LLCORE_HTTP_HANDLE_INVALID),
@@ -980,7 +954,6 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
mFetcher->mTextureCache->writeComplete(mCacheWriteHandle, true);
}
mFormattedImage = NULL;
- clearPackets();
if (mHttpBufferArray)
{
mHttpBufferArray->release();
@@ -992,16 +965,6 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
mFetcher->updateStateStats(mCacheReadCount, mCacheWriteCount, mResourceWaitCount);
}
-// Locks: Mw
-void LLTextureFetchWorker::clearPackets()
-{
- for_each(mPackets.begin(), mPackets.end(), DeletePointer());
- mPackets.clear();
- mTotalPackets = 0;
- mLastPacket = -1;
- mFirstPacket = 0;
-}
-
// Locks: Mw (ctor invokes without lock)
void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
{
@@ -1164,7 +1127,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
mHttpReplySize = 0;
mHttpReplyOffset = 0;
mHaveAllData = false;
- clearPackets(); // TODO: Shouldn't be necessary
mCacheReadHandle = LLTextureCache::nullHandle();
mCacheWriteHandle = LLTextureCache::nullHandle();
setState(LOAD_FROM_TEXTURE_CACHE);
@@ -2441,8 +2403,6 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, bool threaded, bool qa_mod
: LLWorkerThread("TextureFetch", threaded, true),
mDebugCount(0),
mDebugPause(false),
- mPacketCount(0),
- mBadPacketCount(0),
mQueueMutex(),
mNetworkQueueMutex(),
mTextureCache(cache),
@@ -3066,43 +3026,6 @@ void LLTextureFetch::threadedUpdate()
#endif
}
-//////////////////////////////////////////////////////////////////////////////
-
-// Threads: T*
-// Locks: Mw
-bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
-{
- LL_PROFILE_ZONE_SCOPED;
- mRequestedDeltaTimer.reset();
- if (index >= mTotalPackets)
- {
-// LL_WARNS(LOG_TXT) << "Received Image Packet " << index << " > max: " << mTotalPackets << " for image: " << mID << LL_ENDL;
- return false;
- }
- if (index > 0 && index < mTotalPackets-1 && size != MAX_IMG_PACKET_SIZE)
- {
-// LL_WARNS(LOG_TXT) << "Received bad sized packet: " << index << ", " << size << " != " << MAX_IMG_PACKET_SIZE << " for image: " << mID << LL_ENDL;
- return false;
- }
-
- if (index >= (S32)mPackets.size())
- {
- mPackets.resize(index+1, (PacketData*)NULL); // initializes v to NULL pointers
- }
- else if (mPackets[index] != NULL)
- {
-// LL_WARNS(LOG_TXT) << "Received duplicate packet: " << index << " for image: " << mID << LL_ENDL;
- return false;
- }
-
- mPackets[index] = new PacketData(data, size);
- while (mLastPacket+1 < (S32)mPackets.size() && mPackets[mLastPacket+1] != NULL)
- {
- ++mLastPacket;
- }
- return true;
-}
-
void LLTextureFetchWorker::setState(e_state new_state)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
@@ -3210,7 +3133,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
{
requested_priority = worker->mImagePriority;
}
- fetch_priority = worker->getImagePriority();
+ fetch_priority = (U32)worker->getImagePriority();
can_use_http = worker->getCanUseHTTP() ;
worker->unlockWorkMutex(); // -Mw
}
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index aebd2f8f95..3405f76e37 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -293,8 +293,6 @@ public:
LLUUID mDebugID;
S32 mDebugCount;
bool mDebugPause;
- S32 mPacketCount;
- S32 mBadPacketCount;
static LLTrace::CountStatHandle<F64> sCacheHit;
static LLTrace::CountStatHandle<F64> sCacheAttempt;
diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp
index 84ef45c97a..514064cf49 100644
--- a/indra/newview/lltextureinfo.cpp
+++ b/indra/newview/lltextureinfo.cpp
@@ -214,7 +214,7 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon
F64 region_vocache_hit_rate = 0;
if (region_hit_count > 0 || region_miss_count > 0)
{
- region_vocache_hit_rate = region_hit_count / (region_hit_count + region_miss_count);
+ region_vocache_hit_rate = (F64)region_hit_count / (region_hit_count + region_miss_count);
}
object_cache["vo_region_hitcount"] = ll_sd_from_U64(region_hit_count);
object_cache["vo_region_misscount"] = ll_sd_from_U64(region_miss_count);
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index f521293b96..ca3386948d 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -59,8 +59,6 @@
#include "llvoavatarself.h"
#include "lltexlayer.h"
-extern F32 texmem_lower_bound_scale;
-
LLTextureView *gTextureView = NULL;
#define HIGH_PRIORITY 100000000.f
@@ -325,13 +323,6 @@ void LLTextureBar::draw()
{
LLGLSUIDefault gls_ui;
- // draw the packet data
-// {
-// std::string num_str = llformat("%3d/%3d", mImagep->mLastPacket+1, mImagep->mPackets);
-// LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, bar_left + 100, getRect().getHeight(), color,
-// LLFontGL::LEFT, LLFontGL::TOP);
-// }
-
// draw the image size at the end
{
std::string num_str = llformat("%3dx%3d (%2d) %7d", mImagep->getWidth(), mImagep->getHeight(),
@@ -424,12 +415,14 @@ void LLAvatarTexBar::draw()
text_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
line_num++;
}
+ const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout");
const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
LLColor4 header_color(1.f, 1.f, 1.f, 0.9f);
+ const std::string texture_timeout_str = texture_timeout ? llformat("%d", texture_timeout) : "Disabled";
const std::string override_tex_discard_level_str = override_tex_discard_level ? llformat("%d",override_tex_discard_level) : "Disabled";
- std::string header_text = llformat("[ Timeout:60 ] [ LOD_Override('TextureDiscardLevel'):%s ]", override_tex_discard_level_str.c_str());
+ std::string header_text = llformat("[ Timeout('AvatarBakedTextureUploadTimeout'):%s ] [ LOD_Override('TextureDiscardLevel'):%s ]", texture_timeout_str.c_str(), override_tex_discard_level_str.c_str());
LLFontGL::getFontMonospace()->renderUTF8(header_text, 0, l_offset, v_offset + line_height*line_num,
header_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
line_num++;
@@ -463,7 +456,7 @@ public:
: texture_view("texture_view")
{
S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
- changeDefault(rect, LLRect(0,0,100,line_height * 4));
+ changeDefault(rect, LLRect(0,0,0,line_height * 7));
}
};
@@ -483,8 +476,8 @@ private:
void LLGLTexMemBar::draw()
{
F32 discard_bias = LLViewerTexture::sDesiredDiscardBias;
- F32 cache_usage = LLAppViewer::getTextureCache()->getUsage().valueInUnits<LLUnits::Megabytes>();
- F32 cache_max_usage = LLAppViewer::getTextureCache()->getMaxUsage().valueInUnits<LLUnits::Megabytes>();
+ F32 cache_usage = (F32)LLAppViewer::getTextureCache()->getUsage().valueInUnits<LLUnits::Megabytes>();
+ F32 cache_max_usage = (F32)LLAppViewer::getTextureCache()->getMaxUsage().valueInUnits<LLUnits::Megabytes>();
S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
S32 v_offset = 0;//(S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);
F32Bytes total_texture_downloaded = gTotalTextureData;
@@ -494,19 +487,54 @@ void LLGLTexMemBar::draw()
U32 total_objects = gObjectList.getNumObjects();
F32 x_right = 0.0;
+ U32 image_count = gTextureList.getNumImages();
+ U32 raw_image_count = 0;
+ U64 raw_image_bytes = 0;
+
+ U32 saved_raw_image_count = 0;
+ U64 saved_raw_image_bytes = 0;
+
+ U32 aux_raw_image_count = 0;
+ U64 aux_raw_image_bytes = 0;
+
+ for (auto& image : gTextureList)
+ {
+ const LLImageRaw* raw_image = image->getRawImage();
+
+ if (raw_image)
+ {
+ raw_image_count++;
+ raw_image_bytes += raw_image->getDataSize();
+ }
+
+ raw_image = image->getSavedRawImage();
+ if (raw_image)
+ {
+ saved_raw_image_count++;
+ saved_raw_image_bytes += raw_image->getDataSize();
+ }
+
+ raw_image = image->getAuxRawImage();
+ if (raw_image)
+ {
+ aux_raw_image_count++;
+ aux_raw_image_bytes += raw_image->getDataSize();
+ }
+ }
+
+ F64 raw_image_bytes_MB = raw_image_bytes / (1024.0 * 1024.0);
+ F64 saved_raw_image_bytes_MB = saved_raw_image_bytes / (1024.0 * 1024.0);
+ F64 aux_raw_image_bytes_MB = aux_raw_image_bytes / (1024.0 * 1024.0);
+ F64 texture_bytes_alloc = LLImageGL::getTextureBytesAllocated() / 1024.0 / 1024.0 * 1.3333f; // add 33% for mipmaps
+ F64 vertex_bytes_alloc = LLVertexBuffer::getBytesAllocated() / 1024.0 / 1024.0;
+ F64 render_bytes_alloc = LLRenderTarget::sBytesAllocated / 1024.0 / 1024.0;
+
//----------------------------------------------------------------------------
LLGLSUIDefault gls_ui;
LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
LLColor4 color;
- // Gray background using completely magic numbers
- gGL.color4f(0.f, 0.f, 0.f, 0.25f);
- // const LLRect & rect(getRect());
- // gl_rect_2d(-4, v_offset, rect.mRight - rect.mLeft + 2, v_offset + line_height*4);
-
std::string text = "";
- LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
- text_color, LLFontGL::LEFT, LLFontGL::TOP);
LLTrace::Recording& recording = LLViewerStats::instance().getRecording();
@@ -527,6 +555,10 @@ void LLGLTexMemBar::draw()
U32 texFetchLatMed = U32(recording.getMean(LLTextureFetch::sTexFetchLatency).value() * 1000.0f);
U32 texFetchLatMax = U32(recording.getMax(LLTextureFetch::sTexFetchLatency).value() * 1000.0f);
+ // draw a background above first line.... no idea where the rest of the background comes from for the below text
+ gGL.color4f(0.f, 0.f, 0.f, 0.25f);
+ gl_rect_2d(-10, getRect().getHeight() + line_height*2 + 1, getRect().getWidth()+2, getRect().getHeight()+2);
+
text = llformat("Est. Free: %d MB Sys Free: %d MB FBO: %d MB Bias: %.2f Cache: %.1f/%.1f MB",
(S32)LLViewerTexture::sFreeVRAMMegabytes,
LLMemory::getAvailableMemKB()/1024,
@@ -534,11 +566,23 @@ void LLGLTexMemBar::draw()
discard_bias,
cache_usage,
cache_max_usage);
- //, cache_entries, cache_max_entries
-
- LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*8,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ text = llformat("Images: %d Raw: %d (%.2f MB) Saved: %d (%.2f MB) Aux: %d (%.2f MB)", image_count, raw_image_count, raw_image_bytes_MB,
+ saved_raw_image_count, saved_raw_image_bytes_MB,
+ aux_raw_image_count, aux_raw_image_bytes_MB);
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height * 7,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ text = llformat("Textures: %.2f MB Vertex: %.2f MB Render: %.2f MB Total: %.2f MB",
+ texture_bytes_alloc,
+ vertex_bytes_alloc,
+ render_bytes_alloc,
+ texture_bytes_alloc+vertex_bytes_alloc+render_bytes_alloc);
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height * 6,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
U32 cache_read(0U), cache_write(0U), res_wait(0U);
LLAppViewer::getTextureFetch()->getStateStats(&cache_read, &cache_write, &res_wait);
@@ -551,7 +595,6 @@ void LLGLTexMemBar::draw()
cache_read,
cache_write,
res_wait);
-
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*5,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
@@ -572,10 +615,9 @@ void LLGLTexMemBar::draw()
//----------------------------------------------------------------------------
- text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d RAW:%d HTP:%d DEC:%d CRE:%d ",
+ text = llformat("Textures: %d Fetch: %d(%d) Cache R/W: %d/%d LFS:%d RAW:%d HTP:%d DEC:%d CRE:%d ",
gTextureList.getNumImages(),
LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(),
- LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount,
LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(),
LLLFSThread::sLocal->getPending(),
LLImageRaw::sRawImageCount,
@@ -583,8 +625,8 @@ void LLGLTexMemBar::draw()
LLAppViewer::getImageDecodeThread()->getPending(),
gTextureList.mCreateTextureList.size());
- x_right = 550.0;
- LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3,
+ x_right = 550.0f;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0.f, (F32)(v_offset + line_height*3),
text_color, LLFontGL::LEFT, LLFontGL::TOP,
LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &x_right);
@@ -593,7 +635,7 @@ void LLGLTexMemBar::draw()
color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;
color[VALPHA] = text_color[VALPHA];
text = llformat("BW:%.0f/%.0f",bandwidth.value(), max_bandwidth.value());
- LLFontGL::getFontMonospace()->renderUTF8(text, 0, x_right, v_offset + line_height*3,
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, (S32)x_right, v_offset + line_height*3,
color, LLFontGL::LEFT, LLFontGL::TOP);
// Mesh status line
@@ -791,10 +833,10 @@ void LLTextureView::draw()
LL_INFOS() << "ID\tMEM\tBOOST\tPRI\tWIDTH\tHEIGHT\tDISCARD" << LL_ENDL;
}
- for (LLViewerTextureList::image_priority_list_t::iterator iter = gTextureList.mImageList.begin();
+ for (LLViewerTextureList::image_list_t::iterator iter = gTextureList.mImageList.begin();
iter != gTextureList.mImageList.end(); )
{
- LLPointer<LLViewerFetchedTexture> imagep = *iter++;
+ LLViewerFetchedTexture* imagep = *iter++;
if(!imagep->hasFetcher())
{
continue ;
diff --git a/indra/newview/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp
index d26ad2f060..ae21d3e733 100644
--- a/indra/newview/llthumbnailctrl.cpp
+++ b/indra/newview/llthumbnailctrl.cpp
@@ -164,8 +164,8 @@ void LLThumbnailCtrl::draw()
font->renderUTF8(
mLoadingPlaceholderString,
0,
- llfloor(draw_rect.mLeft+3),
- llfloor(draw_rect.mTop-v_offset),
+ (draw_rect.mLeft+3),
+ (draw_rect.mTop-v_offset),
LLColor4::white,
LLFontGL::LEFT,
LLFontGL::BASELINE,
diff --git a/indra/newview/lltinygltfhelper.cpp b/indra/newview/lltinygltfhelper.cpp
index 168708ca37..b8cb3d712d 100644
--- a/indra/newview/lltinygltfhelper.cpp
+++ b/indra/newview/lltinygltfhelper.cpp
@@ -140,7 +140,7 @@ LLColor4 LLTinyGLTFHelper::getColor(const std::vector<double>& in)
LLColor4 out;
for (S32 i = 0; i < llmin((S32)in.size(), 4); ++i)
{
- out.mV[i] = in[i];
+ out.mV[i] = (F32)in[i];
}
return out;
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 638a01a080..84503e66a5 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -94,8 +94,8 @@ LLToast::Params::Params()
enable_hide_btn("enable_hide_btn", true),
force_show("force_show", false),
force_store("force_store", false),
- fading_time_secs("fading_time_secs", gSavedSettings.getS32("ToastFadingTime")),
- lifetime_secs("lifetime_secs", gSavedSettings.getS32("NotificationToastLifeTime"))
+ fading_time_secs("fading_time_secs", (F32)gSavedSettings.getS32("ToastFadingTime")),
+ lifetime_secs("lifetime_secs", (F32)gSavedSettings.getS32("NotificationToastLifeTime"))
{};
LLToast::LLToast(const LLToast::Params& p)
@@ -256,12 +256,12 @@ void LLToast::onFocusReceived()
void LLToast::setLifetime(S32 seconds)
{
- mToastLifetime = seconds;
+ mToastLifetime = (F32)seconds;
}
void LLToast::setFadingTime(S32 seconds)
{
- mToastFadingTime = seconds;
+ mToastFadingTime = (F32)seconds;
}
void LLToast::closeToast()
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index 0ac2653021..6f8691bb26 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -114,7 +114,7 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
LLToastPanel* LLToastPanel::buidPanelFromNotification(
const LLNotificationPtr& notification)
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
LLToastPanel* res = NULL;
//process tip toast panels
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index 5180b1808c..0063e0b7fd 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -566,7 +566,7 @@ void LLToolBarView::draw()
// Draw drop zones if drop of a tool is active
if (isToolDragged())
{
- LLColor4 drop_color = LLUIColorTable::instance().getColor( "ToolbarDropZoneColor" );
+ static const LLUIColor drop_color = LLUIColorTable::instance().getColor( "ToolbarDropZoneColor" );
for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++)
{
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index e2b6924aeb..2fe81df4fb 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -547,7 +547,7 @@ void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region
wz = land.getZ((i+di)+(j+dj)*land.mGridsPerEdge),
norm_dist = sqrt((float)di*di + dj*dj) / half_edge,
force_scale = sqrt(2.f) - norm_dist, // 1 at center, 0 at corner
- wz2 = wz + .2 + (.2 + force/100) * force_scale, // top vertex
+ wz2 = wz + .2f + (.2f + force/100.f) * force_scale, // top vertex
tic = .075f; // arrowhead size
// vertical line
gGL.vertex3f(wx, wy, wz);
diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp
index 0ba7ae5e84..b8878b1e6f 100644
--- a/indra/newview/lltoolfocus.cpp
+++ b/indra/newview/lltoolfocus.cpp
@@ -440,7 +440,7 @@ bool LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
}
else
{
- gAgentCamera.cameraZoomIn( pow( IN_FACTOR, dy ) );
+ gAgentCamera.cameraZoomIn((F32)pow( IN_FACTOR, dy ) );
}
}
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index b3871a6d6c..24cfca5eee 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -189,7 +189,7 @@ bool LLVisualParamHint::render()
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.loadIdentity();
- gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.ortho(0.0f, (F32)mFullWidth, 0.0f, (F32)mFullHeight, -1.0f, 1.0f);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 531e657a1e..8cdc2e94f4 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1424,7 +1424,8 @@ void LLToolPie::handleDeselect()
LLTool* LLToolPie::getOverrideTool(MASK mask)
{
- if (gSavedSettings.getBOOL("EnableGrab"))
+ static LLCachedControl<bool> enable_grab(gSavedSettings, "EnableGrab");
+ if (enable_grab)
{
if (mask == DEFAULT_GRAB_MASK)
{
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index a28bbb3bf1..d4d3e71b46 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -516,7 +516,7 @@ void LLTracker::drawBeacon(LLVector3 pos_agent, std::string direction, LLColor4
height = pos_agent.mV[2];
}
- nRows = ceil((BEACON_ROWS * height) / MAX_HEIGHT);
+ nRows = (U32)ceil((BEACON_ROWS * height) / MAX_HEIGHT);
if(nRows<2) nRows=2;
rowHeight = height / nRows;
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index b6fbcaa330..72e30bd765 100644
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -398,7 +398,7 @@ bool LLGoogleTranslationHandler::parseResponse(
{
const std::string& text = !body.empty() ? body : http_response["error_body"].asStringRef();
- boost::json::error_code ec;
+ boost::system::error_code ec;
boost::json::value root = boost::json::parse(text, ec);
if (ec.failed())
{
@@ -431,7 +431,7 @@ void LLGoogleTranslationHandler::parseErrorResponse(
int& status,
std::string& err_msg)
{
- boost::json::error_code ec;
+ boost::system::error_code ec;
auto message = root.find_pointer("/data/message", ec);
auto code = root.find_pointer("/data/code", ec);
if (!message || !code)
@@ -456,7 +456,7 @@ bool LLGoogleTranslationHandler::parseTranslation(
std::string& translation,
std::string& detected_lang)
{
- boost::json::error_code ec;
+ boost::system::error_code ec;
auto translated_text = root.find_pointer("/data/translations/0/translatedText", ec);
if (!translated_text) return false;
@@ -656,7 +656,7 @@ bool LLAzureTranslationHandler::checkVerificationResponse(
// Expected: "{\"error\":{\"code\":400000,\"message\":\"One of the request inputs is not valid.\"}}"
// But for now just verify response is a valid json
- boost::json::error_code ec;
+ boost::system::error_code ec;
boost::json::value root = boost::json::parse(response["error_body"].asString(), ec);
if (ec.failed())
{
@@ -686,7 +686,7 @@ bool LLAzureTranslationHandler::parseResponse(
//Example:
// "[{\"detectedLanguage\":{\"language\":\"en\",\"score\":1.0},\"translations\":[{\"text\":\"Hello, what is your name?\",\"to\":\"en\"}]}]"
- boost::json::error_code ec;
+ boost::system::error_code ec;
boost::json::value root = boost::json::parse(body, ec);
if (ec.failed())
{
@@ -726,7 +726,7 @@ std::string LLAzureTranslationHandler::parseErrorResponse(
// Expected: "{\"error\":{\"code\":400000,\"message\":\"One of the request inputs is not valid.\"}}"
// But for now just verify response is a valid json with an error
- boost::json::error_code ec;
+ boost::system::error_code ec;
boost::json::value root = boost::json::parse(body, ec);
if (ec.failed())
{
@@ -956,7 +956,7 @@ bool LLDeepLTranslationHandler::parseResponse(
//Example:
// "{\"translations\":[{\"detected_source_language\":\"EN\",\"text\":\"test\"}]}"
- boost::json::error_code ec;
+ boost::system::error_code ec;
boost::json::value root = boost::json::parse(body, ec);
if (ec.failed())
{
@@ -1004,7 +1004,7 @@ std::string LLDeepLTranslationHandler::parseErrorResponse(
const std::string& body)
{
// Example: "{\"message\":\"One of the request inputs is not valid.\"}"
- boost::json::error_code ec;
+ boost::system::error_code ec;
boost::json::value root = boost::json::parse(body, ec);
if (ec.failed())
{
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index fbcaaef1b8..39a9f0f8bc 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -306,9 +306,9 @@ public:
LLVector3 coords(128, 128, 0);
if (tokens.size() <= 4)
{
- coords = LLVector3(tokens[1].asReal(),
- tokens[2].asReal(),
- tokens[3].asReal());
+ coords = LLVector3((F32)tokens[1].asReal(),
+ (F32)tokens[2].asReal(),
+ (F32)tokens[3].asReal());
}
// Region names may be %20 escaped.
@@ -332,9 +332,9 @@ public:
{
// region specified, coordinates (if any) are region-local
LLVector3 local_pos(
- params.has("x")? params["x"].asReal() : 128,
- params.has("y")? params["y"].asReal() : 128,
- params.has("z")? params["z"].asReal() : 0);
+ params.has("x")? (F32)params["x"].asReal() : 128.f,
+ params.has("y")? (F32)params["y"].asReal() : 128.f,
+ params.has("z")? (F32)params["z"].asReal() : 0.f);
std::string regionname(params["regionname"]);
std::string destination(LLSLURL(regionname, local_pos).getSLURLString());
// have to resolve region's global coordinates first
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index a571b5544b..4e8320b72a 100644
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -76,37 +76,37 @@ LLVersionInfo::~LLVersionInfo()
{
}
-S32 LLVersionInfo::getMajor()
+S32 LLVersionInfo::getMajor() const
{
return LL_VIEWER_VERSION_MAJOR;
}
-S32 LLVersionInfo::getMinor()
+S32 LLVersionInfo::getMinor() const
{
return LL_VIEWER_VERSION_MINOR;
}
-S32 LLVersionInfo::getPatch()
+S32 LLVersionInfo::getPatch() const
{
return LL_VIEWER_VERSION_PATCH;
}
-U64 LLVersionInfo::getBuild()
+U64 LLVersionInfo::getBuild() const
{
return LL_VIEWER_VERSION_BUILD;
}
-std::string LLVersionInfo::getVersion()
+std::string LLVersionInfo::getVersion() const
{
return version;
}
-std::string LLVersionInfo::getShortVersion()
+std::string LLVersionInfo::getShortVersion() const
{
return short_version;
}
-std::string LLVersionInfo::getChannelAndVersion()
+std::string LLVersionInfo::getChannelAndVersion() const
{
if (mVersionChannel.empty())
{
@@ -117,7 +117,7 @@ std::string LLVersionInfo::getChannelAndVersion()
return mVersionChannel;
}
-std::string LLVersionInfo::getChannel()
+std::string LLVersionInfo::getChannel() const
{
return mWorkingChannelName;
}
@@ -128,7 +128,7 @@ void LLVersionInfo::resetChannel(const std::string& channel)
mVersionChannel.clear(); // Reset version and channel string til next use.
}
-LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity()
+LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity() const
{
ViewerMaturity maturity;
@@ -166,12 +166,12 @@ LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity()
}
-std::string LLVersionInfo::getBuildConfig()
+std::string LLVersionInfo::getBuildConfig() const
{
return build_configuration;
}
-std::string LLVersionInfo::getReleaseNotes()
+std::string LLVersionInfo::getReleaseNotes() const
{
return mReleaseNotes;
}
diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h
index aed43263a6..237b37a084 100644
--- a/indra/newview/llversioninfo.h
+++ b/indra/newview/llversioninfo.h
@@ -52,38 +52,38 @@ public:
~LLVersionInfo();
/// return the major version number as an integer
- S32 getMajor();
+ S32 getMajor() const;
/// return the minor version number as an integer
- S32 getMinor();
+ S32 getMinor() const;
/// return the patch version number as an integer
- S32 getPatch();
+ S32 getPatch() const;
/// return the build number as an integer
- U64 getBuild();
+ U64 getBuild() const;
/// return the full viewer version as a string like "2.0.0.200030"
- std::string getVersion();
+ std::string getVersion() const;
/// return the viewer version as a string like "2.0.0"
- std::string getShortVersion();
+ std::string getShortVersion() const;
/// return the viewer version and channel as a string
/// like "Second Life Release 2.0.0.200030"
- std::string getChannelAndVersion();
+ std::string getChannelAndVersion() const;
/// return the channel name, e.g. "Second Life"
- std::string getChannel();
+ std::string getChannel() const;
/// return the CMake build type
- std::string getBuildConfig();
+ std::string getBuildConfig() const;
/// reset the channel name used by the viewer.
void resetChannel(const std::string& channel);
/// return the bit width of an address
- S32 getAddressSize() { return ADDRESS_SIZE; }
+ S32 getAddressSize() const { return ADDRESS_SIZE; }
typedef enum
{
@@ -92,11 +92,11 @@ public:
BETA_VIEWER,
RELEASE_VIEWER
} ViewerMaturity;
- ViewerMaturity getViewerMaturity();
+ ViewerMaturity getViewerMaturity() const;
/// get the release-notes URL, once it becomes available -- until then,
/// return empty string
- std::string getReleaseNotes();
+ std::string getReleaseNotes() const;
private:
std::string version;
@@ -107,7 +107,7 @@ private:
std::string mWorkingChannelName;
// Storage for the "version and channel" string.
// This will get reset too.
- std::string mVersionChannel;
+ mutable std::string mVersionChannel;
std::string build_configuration;
std::string mReleaseNotes;
// Store unique_ptrs to the next couple things so we don't have to explain
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index 26707f5d9a..5ab9f76e47 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -376,6 +376,7 @@ void LLViewerAssetStorage::queueRequestHttp(
bool duplicate,
bool is_priority)
{
+ LL_PROFILE_ZONE_SCOPED;
LL_DEBUGS("ViewerAsset") << "Request asset via HTTP " << uuid << " type " << LLAssetType::lookup(atype) << LL_ENDL;
bool with_http = true;
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
index 337c18f218..7ef2c8d697 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -226,7 +226,7 @@ LLUUID LLResourceUploadInfo::finishUpload(LLSD &result)
LL_INFOS() << "inventory_item_flags " << flagsInventoryItem << LL_ENDL;
}
}
- S32 creationDate = time_corrected();
+ S32 creationDate = (S32)time_corrected();
LLUUID serverInventoryItem = result["new_inventory_item"].asUUID();
LLUUID serverAssetId = result["new_asset"].asUUID();
@@ -370,7 +370,8 @@ LLNewFileResourceUploadInfo::LLNewFileResourceUploadInfo(
LLResourceUploadInfo(name, description, compressionInfo,
destinationType, inventoryType,
nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory),
- mFileName(fileName)
+ mFileName(fileName),
+ mMaxImageSize(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT)
{
}
@@ -422,7 +423,7 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile()
else if (assetType == LLAssetType::AT_TEXTURE)
{
// It's an image file, the upload procedure is the same for all
- if (!LLViewerTextureList::createUploadFile(getFileName(), filename, codec))
+ if (!LLViewerTextureList::createUploadFile(getFileName(), filename, codec, mMaxImageSize))
{
errorMessage = llformat("Problem with file %s:\n\n%s\n",
getFileName().c_str(), LLImage::getLastThreadError().c_str());
@@ -478,7 +479,12 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile()
else
{
S32 size = LLAPRFile::size(getFileName());
- U8* buffer = new U8[size];
+ U8* buffer = new(std::nothrow) U8[size];
+ if (!buffer)
+ {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS() << "Bad memory allocation for buffer, size: " << size << LL_ENDL;
+ }
S32 size_read = infile.read(buffer,size);
if (size_read != size)
{
@@ -978,6 +984,7 @@ void LLViewerAssetUpload::HandleUploadError(LLCore::HttpStatus status, LLSD &res
label = result["label"].asString();
}
+ LLFloaterSnapshot* floater_snapshot = LLFloaterSnapshot::findInstance();
if (result.has("message"))
{
reason = result["message"].asString();
@@ -988,6 +995,12 @@ void LLViewerAssetUpload::HandleUploadError(LLCore::HttpStatus status, LLSD &res
{
case 404:
reason = LLTrans::getString("AssetUploadServerUnreacheble");
+ if (floater_snapshot
+ && floater_snapshot->isWaitingState()
+ && uploadInfo->getAssetType() == LLAssetType::AT_IMAGE_JPEG)
+ {
+ label = "CannotUploadSnapshotEmailTooBig";
+ }
break;
case 499:
reason = LLTrans::getString("AssetUploadServerDifficulties");
@@ -1024,7 +1037,6 @@ void LLViewerAssetUpload::HandleUploadError(LLCore::HttpStatus status, LLSD &res
// Todo: move these floater specific actions into proper callbacks
// Let the Snapshot floater know we have failed uploading.
- LLFloaterSnapshot* floater_snapshot = LLFloaterSnapshot::findInstance();
if (floater_snapshot && floater_snapshot->isWaitingState())
{
if (uploadInfo->getAssetType() == LLAssetType::AT_IMAGE_JPEG)
diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h
index 5a07fbf802..365436ede0 100644
--- a/indra/newview/llviewerassetupload.h
+++ b/indra/newview/llviewerassetupload.h
@@ -161,13 +161,15 @@ public:
std::string getFileName() const { return mFileName; };
+ void setMaxImageSize(U32 maxUploadSize) { mMaxImageSize = maxUploadSize; }
+
protected:
virtual LLSD exportTempFile();
private:
std::string mFileName;
-
+ S32 mMaxImageSize;
};
//-------------------------------------------------------------------------
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index ab7953846f..766280e145 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -153,12 +153,12 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVecto
add(sVelocityStat, dpos);
add(sAngularVelocityStat, drot);
- mAverageSpeed = LLTrace::get_frame_recording().getPeriodMeanPerSec(sVelocityStat, 50);
- mAverageAngularSpeed = LLTrace::get_frame_recording().getPeriodMeanPerSec(sAngularVelocityStat);
+ mAverageSpeed = (F32)LLTrace::get_frame_recording().getPeriodMeanPerSec(sVelocityStat, 50);
+ mAverageAngularSpeed = (F32)LLTrace::get_frame_recording().getPeriodMeanPerSec(sAngularVelocityStat);
mCosHalfCameraFOV = cosf(0.5f * getView() * llmax(1.0f, getAspect()));
// update pixel meter ratio using default fov, not modified one
- mPixelMeterRatio = getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5));
+ mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f)));
// update screen pixel area
mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));
}
@@ -903,6 +903,6 @@ bool LLViewerCamera::isDefaultFOVChanged()
void LLViewerCamera::updateCameraAngle(const LLSD& value)
{
- setDefaultFOV(value.asReal());
+ setDefaultFOV((F32)value.asReal());
}
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index 597cf3c98c..8b01c4ef88 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -41,7 +41,7 @@
LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal;
//static
-void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
+void LLViewerChat::getChatColor(const LLChat& chat, LLUIColor& r_color, F32& r_color_alpha)
{
if(chat.mMuted)
{
@@ -90,7 +90,7 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
}
break;
default:
- r_color.setToWhite();
+ r_color = LLUIColorTable::instance().getColor("White");
}
if (!chat.mPosAgent.isExactlyZero())
@@ -101,7 +101,11 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
if (distance_squared > dist_near_chat * dist_near_chat)
{
// diminish far-off chat
- r_color.mV[VALPHA] = 0.8f;
+ r_color_alpha = 0.8f;
+ }
+ else
+ {
+ r_color_alpha = 1.0f;
}
}
}
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
index a84d7dbc5d..6138358caf 100644
--- a/indra/newview/llviewerchat.h
+++ b/indra/newview/llviewerchat.h
@@ -29,15 +29,14 @@
#include "llchat.h"
#include "llfontgl.h"
-#include "v4color.h"
-
+#include "lluicolor.h"
class LLViewerChat
{
public:
typedef boost::signals2::signal<void (LLFontGL*)> font_change_signal_t;
- static void getChatColor(const LLChat& chat, LLColor4& r_color);
+ static void getChatColor(const LLChat& chat, LLUIColor& r_color, F32& r_color_alpha);
static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha);
static LLFontGL* getChatFont();
static S32 getChatFontSize();
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 862bb3dfa9..c1bf31ff9a 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -637,7 +637,7 @@ void handleAutoTuneFPSChanged(const LLSD& newValue)
LLPerfStats::tunables.userAutoTuneEnabled = newval;
if(newval && LLPerfStats::renderAvatarMaxART_ns == 0) // If we've enabled autotune we override "unlimited" to max
{
- gSavedSettings.setF32("RenderAvatarMaxART",log10(LLPerfStats::ART_UNLIMITED_NANOS-1000));//triggers callback to update static var
+ gSavedSettings.setF32("RenderAvatarMaxART", (F32)log10(LLPerfStats::ART_UNLIMITED_NANOS-1000));//triggers callback to update static var
}
}
@@ -719,6 +719,8 @@ void handleLocalTerrainChanged(const LLSD& newValue)
{
gLocalTerrainMaterials.setMaterialOverride(i, mat_override);
}
+ const bool paint_enabled = gSavedSettings.getBOOL("LocalTerrainPaintEnabled");
+ gLocalTerrainMaterials.setPaintType(paint_enabled ? TERRAIN_PAINT_TYPE_PBR_PAINTMAP : TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE);
}
}
////////////////////////////////////////////////////////////////////////////
@@ -800,6 +802,7 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);
setting_setup_signal_listener(gSavedSettings, "RenderScreenSpaceReflections", handleReflectionProbeDetailChanged);
+ setting_setup_signal_listener(gSavedSettings, "RenderMirrors", handleReflectionProbeDetailChanged);
setting_setup_signal_listener(gSavedSettings, "RenderHeroProbeResolution", handleHeroProbeResolutionChanged);
setting_setup_signal_listener(gSavedSettings, "RenderShadowDetail", handleSetShaderChanged);
setting_setup_signal_listener(gSavedSettings, "RenderDeferredSSAO", handleSetShaderChanged);
@@ -908,6 +911,7 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "AutoTuneImpostorByDistEnabled", handleUserImpostorByDistEnabledChanged);
setting_setup_signal_listener(gSavedSettings, "TuningFPSStrategy", handleFPSTuningStrategyChanged);
{
+ setting_setup_signal_listener(gSavedSettings, "LocalTerrainPaintEnabled", handleLocalTerrainChanged);
const char* transform_suffixes[] = {
"ScaleU",
"ScaleV",
@@ -926,6 +930,7 @@ void settings_setup_listeners()
}
}
}
+ setting_setup_signal_listener(gSavedSettings, "TerrainPaintBitDepth", handleSetShaderChanged);
setting_setup_signal_listener(gSavedPerAccountSettings, "AvatarHoverOffsetZ", handleAvatarHoverOffsetChanged);
}
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 09f77c0c29..8c6a38876a 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -213,7 +213,7 @@ void display_update_camera()
// Write some stats to LL_INFOS()
void display_stats()
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
const F32 FPS_LOG_FREQUENCY = 10.f;
if (gRecentFPSTime.getElapsedTimeF32() >= FPS_LOG_FREQUENCY)
{
@@ -654,7 +654,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
gPipeline.resetFrameStats(); // Reset per-frame statistics.
- if (!gDisconnected)
+ if (!gDisconnected && !LLApp::isExiting())
{
// Render mirrors and associated hero probes before we render the rest of the scene.
// This ensures the scene state in the hero probes are exactly the same as the rest of the scene before we render it.
@@ -1539,6 +1539,11 @@ void render_ui_3d()
gObjectList.resetObjectBeacons();
gSky.addSunMoonBeacons();
}
+ else
+ {
+ // Make sure particle effects disappear
+ LLHUDObject::renderAllForTimer();
+ }
stop_glerror();
}
@@ -1591,14 +1596,14 @@ void render_ui_2d()
}
- if (gSavedSettings.getBOOL("RenderUIBuffer"))
+ if (LLPipeline::RenderUIBuffer)
{
if (LLView::sIsRectDirty)
{
LLView::sIsRectDirty = false;
LLRect t_rect;
- gPipeline.mRT->uiScreen.bindTarget();
+ gPipeline.mUIScreen.bindTarget();
gGL.setColorMask(true, true);
{
static const S32 pad = 8;
@@ -1630,7 +1635,7 @@ void render_ui_2d()
gViewerWindow->draw();
}
- gPipeline.mRT->uiScreen.flush();
+ gPipeline.mUIScreen.flush();
gGL.setColorMask(true, false);
LLView::sDirtyRect = t_rect;
@@ -1640,13 +1645,13 @@ void render_ui_2d()
LLGLDisable blend(GL_BLEND);
S32 width = gViewerWindow->getWindowWidthScaled();
S32 height = gViewerWindow->getWindowHeightScaled();
- gGL.getTexUnit(0)->bind(&gPipeline.mRT->uiScreen);
+ gGL.getTexUnit(0)->bind(&gPipeline.mUIScreen);
gGL.begin(LLRender::TRIANGLE_STRIP);
- gGL.color4f(1,1,1,1);
- gGL.texCoord2f(0, 0); gGL.vertex2i(0, 0);
- gGL.texCoord2f(width, 0); gGL.vertex2i(width, 0);
- gGL.texCoord2f(0, height); gGL.vertex2i(0, height);
- gGL.texCoord2f(width, height); gGL.vertex2i(width, height);
+ gGL.color4f(1.f,1.f,1.f,1.f);
+ gGL.texCoord2f(0.f, 0.f); gGL.vertex2i(0, 0);
+ gGL.texCoord2f((F32)width, 0.f); gGL.vertex2i(width, 0);
+ gGL.texCoord2f(0.f, (F32)height); gGL.vertex2i(0, height);
+ gGL.texCoord2f((F32)width, (F32)height); gGL.vertex2i(width, height);
gGL.end();
}
else
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index ceda2675d5..9bdd246129 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -47,6 +47,7 @@
#include "llfloaterbeacons.h"
#include "llfloaterbuildoptions.h"
#include "llfloaterbulkpermission.h"
+#include "llfloaterbulkupload.h"
#include "llfloaterbump.h"
#include "llfloaterbuy.h"
#include "llfloaterbuycontents.h"
@@ -76,6 +77,7 @@
#include "llfloaterfonttest.h"
#include "llfloaterforgetuser.h"
#include "llfloatergesture.h"
+#include "llfloatergltfasseteditor.h"
#include "llfloatergodtools.h"
#include "llfloatergridstatus.h"
#include "llfloatergroups.h"
@@ -132,6 +134,7 @@
#include "llfloaterscriptlimits.h"
#include "llfloatersearch.h"
#include "llfloatersellland.h"
+#include "llfloatersettingscolor.h"
#include "llfloatersettingsdebug.h"
#include "llfloatersidepanelcontainer.h"
#include "llfloatersnapshot.h"
@@ -206,6 +209,7 @@ public:
"camera_presets",
"delete_pref_preset",
"forget_username",
+ "gltf_asset_editor",
"god_tools",
"group_picker",
"hud",
@@ -222,7 +226,8 @@ public:
"upload_image",
"upload_model",
"upload_script",
- "upload_sound"
+ "upload_sound",
+ "bulk_upload"
};
return std::find(blacklist_clicked.begin(), blacklist_clicked.end(), fl_name) == blacklist_clicked.end();
}
@@ -246,6 +251,7 @@ public:
"env_edit_extdaycycle",
"font_test",
"forget_username",
+ "gltf_asset_editor",
"god_tools",
"group_picker",
"hud",
@@ -271,7 +277,8 @@ public:
"upload_image",
"upload_model",
"upload_script",
- "upload_sound"
+ "upload_sound",
+ "bulk_upload"
};
return std::find(blacklist_untrusted.begin(), blacklist_untrusted.end(), fl_name) == blacklist_untrusted.end();
}
@@ -336,6 +343,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("buy_object_contents", "floater_buy_contents.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBuyContents>);
LLFloaterReg::add("build", "floater_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTools>);
LLFloaterReg::add("build_options", "floater_build_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBuildOptions>);
+ LLFloaterReg::add("bulk_upload", "floater_bulk_upload.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBulkUpload>);
LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>);
LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>);
@@ -372,6 +380,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("forget_username", "floater_forget_user.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterForgetUser>);
LLFloaterReg::add("gestures", "floater_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGesture>);
+ LLFloaterReg::add("gltf_asset_editor", "floater_gltf_asset_editor.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGLTFAssetEditor>);
LLFloaterReg::add("god_tools", "floater_god_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGodTools>);
LLFloaterReg::add("grid_status", "floater_grid_status.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGridStatus>);
LLFloaterReg::add("group_picker", "floater_choose_group.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGroupPicker>);
@@ -478,6 +487,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>);
LLFloaterReg::add("my_scripts", "floater_my_scripts.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMyScripts>);
LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
+ LLFloaterReg::add("settings_color", "floater_settings_color.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsColor>);
LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>);
LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 96541b030c..e2022cae37 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -334,7 +334,7 @@ LLViewerInventoryItem::LLViewerInventoryItem(const LLUUID& uuid,
U32 flags,
time_t creation_date_utc) :
LLInventoryItem(uuid, parent_uuid, perm, asset_uuid, type, inv_type,
- name, desc, sale_info, flags, creation_date_utc),
+ name, desc, sale_info, flags, (S32)creation_date_utc),
mIsComplete(true)
{
}
@@ -534,7 +534,7 @@ void LLViewerInventoryItem::packMessage(LLMessageSystem* msg) const
mSaleInfo.packMessage(msg);
msg->addStringFast(_PREHASH_Name, mName);
msg->addStringFast(_PREHASH_Description, mDescription);
- msg->addS32Fast(_PREHASH_CreationDate, mCreationDate);
+ msg->addS32Fast(_PREHASH_CreationDate, (S32)mCreationDate);
U32 crc = getCRC32();
msg->addU32Fast(_PREHASH_CRC, crc);
}
@@ -675,7 +675,7 @@ bool LLViewerInventoryCategory::fetch(S32 expiry_seconds)
{
LL_DEBUGS(LOG_INV) << "Fetching category children: " << mName << ", UUID: " << mUUID << LL_ENDL;
mDescendentsRequested.reset();
- mDescendentsRequested.setTimerExpirySec(expiry_seconds);
+ mDescendentsRequested.setTimerExpirySec((F32)expiry_seconds);
std::string url;
if (gAgent.getRegion())
@@ -721,7 +721,7 @@ void LLViewerInventoryCategory::setFetching(LLViewerInventoryCategory::EFetchTyp
mDescendentsRequested.reset();
if (AISAPI::isAvailable())
{
- mDescendentsRequested.setTimerExpirySec(AISAPI::HTTP_TIMEOUT);
+ mDescendentsRequested.setTimerExpirySec((F32)AISAPI::HTTP_TIMEOUT);
}
else
{
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index ce6dfa4ad1..7543fb3743 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -329,7 +329,7 @@ LLViewerJoystick::LLViewerJoystick()
memset(mBtn, 0, sizeof(mBtn));
// factor in bandwidth? bandwidth = gViewerStats->mKBitStat
- mPerfScale = 4000.f / gSysCPU.getMHz(); // hmm. why?
+ mPerfScale = 4000.f / (F32)gSysCPU.getMHz(); // hmm. why?
mLastDeviceUUID = LLSD::Integer(1);
}
@@ -524,7 +524,7 @@ void LLViewerJoystick::initDevice(LLSD &guid)
#endif
}
-bool LLViewerJoystick::initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, std::string &name, LLSD &guid)
+bool LLViewerJoystick::initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, const std::string &name, const LLSD &guid)
{
#if LIB_NDOF
mLastDeviceUUID = guid;
diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h
index b459987c68..c989615653 100644
--- a/indra/newview/llviewerjoystick.h
+++ b/indra/newview/llviewerjoystick.h
@@ -56,7 +56,7 @@ public:
void init(bool autoenable);
void initDevice(LLSD &guid);
bool initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/);
- bool initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, std::string &name, LLSD &guid);
+ bool initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, const std::string &name, const LLSD &guid);
void terminate();
void updateStatus();
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 49b483d0d0..9739cac311 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1253,41 +1253,46 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
hostEnd = authority.size();
}
- LLViewerMedia* inst = getInstance();
if (url.length())
{
- LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
- if (media_instance)
- {
- std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart);
- std::string cookie_name = "";
- std::string cookie_value = "";
- std::string cookie_path = "";
- bool httponly = true;
- bool secure = true;
- if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) &&
- media_instance->getMediaPlugin())
+ LLAppViewer::instance()->postToMainCoro([=]()
{
- // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
- // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
- // For now, we use the URL for the OpenID POST request since it will have the same authority
- // as the domain field.
- // (Feels like there must be a less dirty way to construct a URL from component LLURL parts)
- // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further
- // down.
- std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority));
-
- media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
- cookie_path, httponly, secure);
-
- // Now that we have parsed the raw cookie, we must store it so that each new media instance
- // can also get a copy and faciliate logging into internal SL sites.
- media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
- cookie_host, cookie_path, httponly, secure);
- }
- }
+ LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
+ if (media_instance)
+ {
+ LLViewerMedia* inst = getInstance();
+ std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart);
+ std::string cookie_name = "";
+ std::string cookie_value = "";
+ std::string cookie_path = "";
+ bool httponly = true;
+ bool secure = true;
+ if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) &&
+ media_instance->getMediaPlugin())
+ {
+ // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
+ // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
+ // For now, we use the URL for the OpenID POST request since it will have the same authority
+ // as the domain field.
+ // (Feels like there must be a less dirty way to construct a URL from component LLURL parts)
+ // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further
+ // down.
+ std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority));
+
+ media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
+ cookie_path, httponly, secure);
+
+ // Now that we have parsed the raw cookie, we must store it so that each new media instance
+ // can also get a copy and faciliate logging into internal SL sites.
+ media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
+ cookie_host, cookie_path, httponly, secure);
+ }
+ }
+ });
}
+ LLViewerMedia* inst = getInstance();
+
// Note: Rider: MAINT-6392 - Some viewer code requires access to the my.sl.com openid cookie for such
// actions as posting snapshots to the feed. This is handled through HTTPCore rather than CEF and so
// we must learn to SHARE the cookies.
@@ -1899,7 +1904,7 @@ void LLViewerMediaImpl::loadURI()
// or a seek happened before the media loaded. In either case, seek to the saved time.
if(mPreviousMediaTime != 0.0f)
{
- seek(mPreviousMediaTime);
+ seek((F32)mPreviousMediaTime);
}
if(mPreviousMediaState == MEDIA_PLAYING)
@@ -2034,7 +2039,7 @@ void LLViewerMediaImpl::skipBack(F32 step_scale)
{
back_step = 0.0;
}
- mMediaSource->seek(back_step);
+ mMediaSource->seek((F32)back_step);
}
}
}
@@ -2051,7 +2056,7 @@ void LLViewerMediaImpl::skipForward(F32 step_scale)
{
forward_step = mMediaSource->getDuration();
}
- mMediaSource->seek(forward_step);
+ mMediaSource->seek((F32)forward_step);
}
}
}
@@ -2100,7 +2105,7 @@ void LLViewerMediaImpl::updateVolume()
F64 attenuation = 1.0 + (gSavedSettings.getF32("MediaRollOffRate") * adjusted_distance);
attenuation = 1.0 / (attenuation * attenuation);
// the attenuation multiplier should never be more than one since that would increase volume
- volume = volume * llmin(1.0, attenuation);
+ volume = volume * (F32)llmin(1.0, attenuation);
}
}
@@ -2230,11 +2235,11 @@ void LLViewerMediaImpl::scaleTextureCoords(const LLVector2& texture_coords, S32
// Deal with repeating textures by wrapping the coordinates into the range [0, 1.0)
texture_x = fmodf(texture_x, 1.0f);
if(texture_x < 0.0f)
- texture_x = 1.0 + texture_x;
+ texture_x = 1.0f + texture_x;
texture_y = fmodf(texture_y, 1.0f);
if(texture_y < 0.0f)
- texture_y = 1.0 + texture_y;
+ texture_y = 1.0f + texture_y;
// scale x and y to texel units.
*x = ll_round(texture_x * mMediaSource->getTextureWidth());
diff --git a/indra/newview/llviewermedia_streamingaudio.cpp b/indra/newview/llviewermedia_streamingaudio.cpp
index af3a21c183..b68ffbe1a2 100644
--- a/indra/newview/llviewermedia_streamingaudio.cpp
+++ b/indra/newview/llviewermedia_streamingaudio.cpp
@@ -70,6 +70,8 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url)
LL_INFOS() << "setting stream to NULL"<< LL_ENDL;
mURL.clear();
mMediaPlugin->stop();
+ delete mMediaPlugin;
+ mMediaPlugin = nullptr;
}
}
@@ -79,6 +81,8 @@ void LLStreamingAudio_MediaPlugins::stop()
if(mMediaPlugin)
{
mMediaPlugin->stop();
+ delete mMediaPlugin;
+ mMediaPlugin = nullptr;
}
mURL.clear();
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index c8d25180b9..dbec66f81d 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -241,19 +241,19 @@ LLVector3d LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 n
if(camera_aspect < 1.0f || invert)
{
angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect());
- distance = width * 0.5 * padding_factor / tan(angle_of_view * 0.5f );
+ distance = width * 0.5f * padding_factor / tanf(angle_of_view * 0.5f );
LL_DEBUGS() << "using width (" << width << "), angle_of_view = " << angle_of_view << ", distance = " << distance << LL_ENDL;
}
else
{
angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getView());
- distance = height * 0.5 * padding_factor / tan(angle_of_view * 0.5f );
+ distance = height * 0.5f * padding_factor / tanf(angle_of_view * 0.5f );
LL_DEBUGS() << "using height (" << height << "), angle_of_view = " << angle_of_view << ", distance = " << distance << LL_ENDL;
}
- distance += depth * 0.5;
+ distance += depth * 0.5f;
// Finally animate the camera to this new position and focal point
LLVector3d target_pos;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 9a9a316adf..97d5781566 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -42,6 +42,7 @@
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llviewereventrecorder.h"
+#include "v4coloru.h"
// newview includes
#include "llagent.h"
@@ -105,6 +106,7 @@
#include "llsidepanelappearance.h"
#include "llspellcheckmenuhandler.h"
#include "llstatusbar.h"
+#include "llterrainpaintmap.h"
#include "lltextureview.h"
#include "lltoolbarview.h"
#include "lltoolcomp.h"
@@ -122,6 +124,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
#include "llviewerstatsrecorder.h"
+#include "llvlcomposition.h"
#include "llvoavatarself.h"
#include "llvoicevivox.h"
#include "llworld.h"
@@ -350,7 +353,10 @@ class LLMenuParcelObserver : public LLParcelObserver
public:
LLMenuParcelObserver();
~LLMenuParcelObserver();
- virtual void changed();
+ void changed() override;
+private:
+ LLHandle<LLUICtrl> mLandBuyHandle;
+ LLHandle<LLUICtrl> mLandBuyPassHandle;
};
static LLMenuParcelObserver* gMenuParcelObserver = NULL;
@@ -359,6 +365,8 @@ static LLUIListener sUIListener;
LLMenuParcelObserver::LLMenuParcelObserver()
{
+ mLandBuyHandle = gMenuLand->getChild<LLMenuItemCallGL>("Land Buy")->getHandle();
+ mLandBuyPassHandle = gMenuLand->getChild<LLMenuItemCallGL>("Land Buy Pass")->getHandle();
LLViewerParcelMgr::getInstance()->addObserver(this);
}
@@ -372,17 +380,16 @@ void LLMenuParcelObserver::changed()
LLParcel *parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
if (gMenuLand && parcel)
{
- LLView* child = gMenuLand->findChild<LLView>("Land Buy Pass");
- if (child)
+ if (!mLandBuyPassHandle.isDead())
{
- child->setEnabled(LLPanelLandGeneral::enableBuyPass(NULL) && !(parcel->getOwnerID() == gAgent.getID()));
+ LLParcel *parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+ static_cast<LLMenuItemCallGL*>(mLandBuyPassHandle.get())->setEnabled(LLPanelLandGeneral::enableBuyPass(NULL) && !(parcel->getOwnerID() == gAgent.getID()));
}
- child = gMenuLand->findChild<LLView>("Land Buy");
- if (child)
+ if (!mLandBuyHandle.isDead())
{
bool buyable = enable_buy_land(NULL);
- child->setEnabled(buyable);
+ static_cast<LLMenuItemCallGL*>(mLandBuyHandle.get())->setEnabled(buyable);
}
}
}
@@ -402,10 +409,34 @@ void initialize_menus();
// Break up groups of more than 6 items with separators
//-----------------------------------------------------------------------------
-void set_merchant_SLM_menu()
+void set_merchant_SLM_menu();
+
+class LLSLMMenuUpdater
+{
+public:
+ LLSLMMenuUpdater();
+ ~LLSLMMenuUpdater() = default;
+
+ void setMerchantMenu();
+ void checkMerchantStatus(bool force);
+
+private:
+ LLHandle<LLView> mMarketplaceListingsItem;
+};
+
+static LLSLMMenuUpdater* gSLMMenuUpdater = NULL;
+
+LLSLMMenuUpdater::LLSLMMenuUpdater()
+{
+ mMarketplaceListingsItem = gMenuHolder->getChild<LLView>("MarketplaceListings")->getHandle();
+}
+void LLSLMMenuUpdater::setMerchantMenu()
{
// All other cases (new merchant, not merchant, migrated merchant): show the new Marketplace Listings menu and enable the tool
- gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(true);
+ if(!mMarketplaceListingsItem.isDead())
+ {
+ mMarketplaceListingsItem.get()->setVisible(true);
+ }
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
gToolBarView->enableCommand(command->id(), true);
@@ -422,7 +453,7 @@ void set_merchant_SLM_menu()
}
}
-void check_merchant_status(bool force)
+void LLSLMMenuUpdater::checkMerchantStatus(bool force)
{
if (force)
{
@@ -430,7 +461,10 @@ void check_merchant_status(bool force)
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED);
}
// Hide SLM related menu item
- gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(false);
+ if(!mMarketplaceListingsItem.isDead())
+ {
+ mMarketplaceListingsItem.get()->setVisible(false);
+ }
// Also disable the toolbar button for Marketplace Listings
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
@@ -440,6 +474,16 @@ void check_merchant_status(bool force)
LLMarketplaceData::instance().initializeSLM(boost::bind(&set_merchant_SLM_menu));
}
+void set_merchant_SLM_menu()
+{
+ if(gSLMMenuUpdater) gSLMMenuUpdater->setMerchantMenu();
+}
+
+void check_merchant_status(bool force)
+{
+ if(gSLMMenuUpdater) gSLMMenuUpdater->checkMerchantStatus(force);
+}
+
void init_menus()
{
// Initialize actions
@@ -495,9 +539,7 @@ void init_menus()
///
/// set up the colors
///
- LLColor4 color;
-
- LLColor4 context_menu_color = LLUIColorTable::instance().getColor("MenuPopupBgColor");
+ LLUIColor context_menu_color = LLUIColorTable::instance().getColor("MenuPopupBgColor");
gMenuAvatarSelf->setBackgroundColor( context_menu_color );
gMenuAvatarOther->setBackgroundColor( context_menu_color );
@@ -507,7 +549,7 @@ void init_menus()
gMenuLand->setBackgroundColor( context_menu_color );
- color = LLUIColorTable::instance().getColor( "MenuPopupBgColor" );
+ LLUIColor color = LLUIColorTable::instance().getColor( "MenuPopupBgColor" );
gPopupMenuView->setBackgroundColor( color );
// If we are not in production, use a different color to make it apparent.
@@ -555,6 +597,8 @@ void init_menus()
// Let land based option enable when parcel changes
gMenuParcelObserver = new LLMenuParcelObserver();
+ gSLMMenuUpdater = new LLSLMMenuUpdater();
+
gLoginMenuBarView = LLUICtrlFactory::getInstance()->createFromFile<LLMenuBarGL>("menu_login.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
gLoginMenuBarView->arrangeAndClear();
LLRect menuBarRect = gLoginMenuBarView->getRect();
@@ -1344,6 +1388,65 @@ class LLAdvancedResetInterestLists : public view_listener_t
};
+/////////////
+// TERRAIN //
+/////////////
+
+class LLAdvancedRebuildTerrain : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ gPipeline.rebuildTerrain();
+ return true;
+ }
+};
+
+class LLAdvancedTerrainCreateLocalPaintMap : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ {
+ LL_WARNS() << "Agent not in a region" << LL_ENDL;
+ return false;
+ }
+
+ U16 dim = (U16)gSavedSettings.getU32("TerrainPaintResolution");
+ // Ensure a reasonable image size of power two
+ const U32 max_resolution = gSavedSettings.getU32("RenderMaxTextureResolution");
+ dim = llclamp(dim, 16, max_resolution);
+ dim = 1 << U32(std::ceil(std::log2(dim)));
+ LLPointer<LLImageRaw> image_raw = new LLImageRaw(dim,dim,3);
+ LLPointer<LLViewerTexture> tex = LLViewerTextureManager::getLocalTexture(image_raw.get(), true);
+ const bool success = LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(*region, *tex);
+ // This calls gLocalTerrainMaterials.setPaintType
+ gSavedSettings.setBOOL("LocalTerrainPaintEnabled", true);
+ // If baking the paintmap failed, set the paintmap to nullptr. This
+ // causes LLDrawPoolTerrain to use a blank paintmap instead.
+ if (!success) { tex = nullptr; }
+ gLocalTerrainMaterials.setPaintMap(tex);
+
+ return true;
+ }
+};
+
+class LLAdvancedTerrainDeleteLocalPaintMap : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ // This calls gLocalTerrainMaterials.setPaintType
+ gSavedSettings.setBOOL("LocalTerrainPaintEnabled", false);
+ gLocalTerrainMaterials.setPaintMap(nullptr);
+
+ return true;
+ }
+};
+
+
+/////////////
+
+
class LLAdvancedBuyCurrencyTest : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -1849,10 +1952,9 @@ class LLAdvancedForceParamsToDefault : public view_listener_t
static void set_all_animation_time_factors(F32 time_factor)
{
LLMotionController::setCurrentTimeFactor(time_factor);
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- (*iter)->setAnimTimeFactor(time_factor);
+ character->setAnimTimeFactor(time_factor);
}
}
@@ -2200,20 +2302,6 @@ class LLAdvancedPurgeShaderCache : public view_listener_t
}
};
-/////////////////////
-// REBUILD TERRAIN //
-/////////////////////
-
-
-class LLAdvancedRebuildTerrain : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- gPipeline.rebuildTerrain();
- return true;
- }
-};
-
////////////////////
// EVENT Recorder //
///////////////////
@@ -2752,6 +2840,9 @@ class LLAdminOnSaveState: public view_listener_t
//-----------------------------------------------------------------------------
void cleanup_menus()
{
+ delete gSLMMenuUpdater;
+ gSLMMenuUpdater = nullptr;
+
delete gMenuParcelObserver;
gMenuParcelObserver = NULL;
@@ -2768,7 +2859,7 @@ void cleanup_menus()
gMenuAttachmentSelf = NULL;
delete gMenuAttachmentOther;
- gMenuAttachmentSelf = NULL;
+ gMenuAttachmentOther = NULL;
delete gMenuLand;
gMenuLand = NULL;
@@ -8139,6 +8230,15 @@ class LLAdvancedClickGLTFUpload: public view_listener_t
}
};
+class LLAdvancedClickGLTFEdit : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterReg::showInstance("gltf_asset_editor");
+ return true;
+ }
+};
+
class LLAdvancedClickResizeWindow : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -9794,9 +9894,9 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedClickGLTFOpen(), "Advanced.ClickGLTFOpen");
view_listener_t::addMenu(new LLAdvancedClickGLTFSaveAs(), "Advanced.ClickGLTFSaveAs");
view_listener_t::addMenu(new LLAdvancedClickGLTFUpload(), "Advanced.ClickGLTFUpload");
+ view_listener_t::addMenu(new LLAdvancedClickGLTFEdit(), "Advanced.ClickGLTFEdit");
view_listener_t::addMenu(new LLAdvancedClickResizeWindow(), "Advanced.ClickResizeWindow");
view_listener_t::addMenu(new LLAdvancedPurgeShaderCache(), "Advanced.ClearShaderCache");
- view_listener_t::addMenu(new LLAdvancedRebuildTerrain(), "Advanced.RebuildTerrain");
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
view_listener_t::addMenu(new LLAdvancedHandleToggleHackedGodmode(), "Advanced.HandleToggleHackedGodmode");
@@ -9813,6 +9913,11 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedCheckInterestList360Mode(), "Advanced.CheckInterestList360Mode");
view_listener_t::addMenu(new LLAdvancedResetInterestLists(), "Advanced.ResetInterestLists");
+ // Develop > Terrain
+ view_listener_t::addMenu(new LLAdvancedRebuildTerrain(), "Advanced.RebuildTerrain");
+ view_listener_t::addMenu(new LLAdvancedTerrainCreateLocalPaintMap(), "Advanced.TerrainCreateLocalPaintMap");
+ view_listener_t::addMenu(new LLAdvancedTerrainDeleteLocalPaintMap(), "Advanced.TerrainDeleteLocalPaintMap");
+
// Advanced > UI
commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser
commit.add("Advanced.WebContentTest", boost::bind(&handle_web_content_test, _2)); // this one opens the Web Content floater
@@ -10020,7 +10125,6 @@ void initialize_menus()
commit.add("Object.Buy", boost::bind(&handle_buy));
commit.add("Object.Edit", boost::bind(&handle_object_edit));
- commit.add("Object.Edit", boost::bind(&handle_object_edit));
commit.add("Object.EditGLTFMaterial", boost::bind(&handle_object_edit_gltf_material));
commit.add("Object.Inspect", boost::bind(&handle_object_inspect));
commit.add("Object.Open", boost::bind(&handle_object_open));
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index e3da52fc78..83f8e96f9a 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -523,15 +523,8 @@ const void upload_single_file(const std::vector<std::string>& filenames, LLFileP
return;
}
-void do_bulk_upload(std::vector<std::string> filenames, const LLSD& notification, const LLSD& response)
+void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k)
{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option != 0)
- {
- // Cancel upload
- return;
- }
-
for (std::vector<std::string>::const_iterator in_iter = filenames.begin(); in_iter != filenames.end(); ++in_iter)
{
std::string filename = (*in_iter);
@@ -551,12 +544,14 @@ void do_bulk_upload(std::vector<std::string> filenames, const LLSD& notification
if (LLResourceUploadInfo::findAssetTypeAndCodecOfExtension(ext, asset_type, codec))
{
bool resource_upload = false;
- if (asset_type == LLAssetType::AT_TEXTURE)
+ if (asset_type == LLAssetType::AT_TEXTURE && allow_2k)
{
LLPointer<LLImageFormatted> image_frmted = LLImageFormatted::createFromType(codec);
- if (gDirUtilp->fileExists(filename) && image_frmted->load(filename))
+ if (gDirUtilp->fileExists(filename) && image_frmted && image_frmted->load(filename))
{
- expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(image_frmted);
+ S32 biased_width = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getWidth(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ S32 biased_height = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getHeight(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(biased_width, biased_height);
resource_upload = true;
}
}
@@ -567,7 +562,7 @@ void do_bulk_upload(std::vector<std::string> filenames, const LLSD& notification
if (resource_upload)
{
- LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(
+ LLNewFileResourceUploadInfo* info_p = new LLNewFileResourceUploadInfo(
filename,
asset_name,
asset_name, 0,
@@ -575,7 +570,13 @@ void do_bulk_upload(std::vector<std::string> filenames, const LLSD& notification
LLFloaterPerms::getNextOwnerPerms("Uploads"),
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
- expected_upload_cost));
+ expected_upload_cost);
+
+ if (!allow_2k)
+ {
+ info_p->setMaxImageSize(1024);
+ }
+ LLResourceUploadInfo::ptr_t uploadInfo(info_p);
upload_new_resource(uploadInfo);
}
@@ -601,11 +602,30 @@ void do_bulk_upload(std::vector<std::string> filenames, const LLSD& notification
}
}
-bool get_bulk_upload_expected_cost(const std::vector<std::string>& filenames, S32& total_cost, S32& file_count, S32& bvh_count)
+void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k, const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0)
+ {
+ // Cancel upload
+ return;
+ }
+
+ do_bulk_upload(filenames, allow_2k);
+}
+
+bool get_bulk_upload_expected_cost(
+ const std::vector<std::string>& filenames,
+ bool allow_2k,
+ S32& total_cost,
+ S32& file_count,
+ S32& bvh_count,
+ S32& textures_2k_count)
{
total_cost = 0;
file_count = 0;
bvh_count = 0;
+ textures_2k_count = 0;
for (std::vector<std::string>::const_iterator in_iter = filenames.begin(); in_iter != filenames.end(); ++in_iter)
{
std::string filename = (*in_iter);
@@ -622,12 +642,19 @@ bool get_bulk_upload_expected_cost(const std::vector<std::string>& filenames, S3
if (LLResourceUploadInfo::findAssetTypeAndCodecOfExtension(ext, asset_type, codec))
{
- if (asset_type == LLAssetType::AT_TEXTURE)
+ if (asset_type == LLAssetType::AT_TEXTURE && allow_2k)
{
LLPointer<LLImageFormatted> image_frmted = LLImageFormatted::createFromType(codec);
- if (gDirUtilp->fileExists(filename) && image_frmted->load(filename))
+ if (gDirUtilp->fileExists(filename) && image_frmted && image_frmted->load(filename))
{
- total_cost += LLAgentBenefitsMgr::current().getTextureUploadCost(image_frmted);
+ S32 biased_width = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getWidth(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ S32 biased_height = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getHeight(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ total_cost += LLAgentBenefitsMgr::current().getTextureUploadCost(biased_width, biased_height);
+ S32 area = biased_width * biased_height;
+ if (area >= LLAgentBenefits::MIN_2K_TEXTURE_AREA)
+ {
+ textures_2k_count++;
+ }
file_count++;
}
}
@@ -682,38 +709,27 @@ bool get_bulk_upload_expected_cost(const std::vector<std::string>& filenames, S3
return file_count > 0;
}
-const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type)
+const void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_2k)
{
- // TODO:
- // Check user balance for entire cost
- // Charge user entire cost
- // Loop, uploading
- // If an upload fails, refund the user for that one
- //
- // Also fix single upload to charge first, then refund
-
- // FIXME PREMIUM what about known types that can't be bulk uploaded
- // (bvh)? These will fail in the item by item upload but won't be
- // mentioned in the notification.
- std::vector<std::string> filtered_filenames;
- for (std::vector<std::string>::const_iterator in_iter = filenames.begin(); in_iter != filenames.end(); ++in_iter)
- {
- const std::string& filename = *in_iter;
- if (check_file_extension(filename, type))
- {
- filtered_filenames.push_back(filename);
- }
- }
-
S32 expected_upload_cost;
S32 expected_upload_count;
S32 bvh_count;
- if (get_bulk_upload_expected_cost(filtered_filenames, expected_upload_cost, expected_upload_count, bvh_count))
+ S32 textures_2k_count;
+ if (get_bulk_upload_expected_cost(filtered_filenames, allow_2k, expected_upload_cost, expected_upload_count, bvh_count, textures_2k_count))
{
- LLSD args;
- args["COST"] = expected_upload_cost;
- args["COUNT"] = expected_upload_count;
- LLNotificationsUtil::add("BulkUploadCostConfirmation", args, LLSD(), boost::bind(do_bulk_upload, filtered_filenames, _1, _2));
+ LLSD key;
+ key["upload_cost"] = expected_upload_cost;
+ key["upload_count"] = expected_upload_count;
+ key["has_2k_textures"] = (textures_2k_count > 0);
+
+ LLSD array;
+ for (const std::string& str : filtered_filenames)
+ {
+ array.append(str);
+ }
+ key["files"] = array;
+
+ LLFloaterReg::showInstance("bulk_upload", key);
if (filtered_filenames.size() > expected_upload_count)
{
@@ -738,6 +754,31 @@ const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::
}
+const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k)
+{
+ // TODO:
+ // Check user balance for entire cost
+ // Charge user entire cost
+ // Loop, uploading
+ // If an upload fails, refund the user for that one
+ //
+ // Also fix single upload to charge first, then refund
+
+ // FIXME PREMIUM what about known types that can't be bulk uploaded
+ // (bvh)? These will fail in the item by item upload but won't be
+ // mentioned in the notification.
+ std::vector<std::string> filtered_filenames;
+ for (std::vector<std::string>::const_iterator in_iter = filenames.begin(); in_iter != filenames.end(); ++in_iter)
+ {
+ const std::string& filename = *in_iter;
+ if (check_file_extension(filename, type))
+ {
+ filtered_filenames.push_back(filename);
+ }
+ }
+ upload_bulk(filtered_filenames, allow_2k);
+}
+
class LLFileUploadImage : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -803,7 +844,7 @@ class LLFileUploadBulk : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
- LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2), LLFilePicker::FFLOAD_ALL, true);
+ LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true), LLFilePicker::FFLOAD_ALL, true);
return true;
}
};
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 1acb701d50..d99f9dc4c6 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -64,13 +64,15 @@ void upload_new_resource(
LLAssetStorage::LLStoreAssetCallback callback = LLAssetStorage::LLStoreAssetCallback(),
void *userdata = NULL);
-
-void assign_defaults_and_show_upload_message(
- LLAssetType::EType asset_type,
- LLInventoryType::EType& inventory_type,
- std::string& name,
- const std::string& display_name,
- std::string& description);
+bool get_bulk_upload_expected_cost(
+ const std::vector<std::string>& filenames,
+ bool allow_2k,
+ S32& total_cost,
+ S32& file_count,
+ S32& bvh_count,
+ S32& textures_2k_count);
+
+void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k);
//consider moving all file pickers below to more suitable place
class LLFilePickerThread : public LLThread
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 0d5482dcd1..872a9a1581 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3672,7 +3672,7 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
LLWorld::getInstance()->setSpaceTimeUSec(space_time_usec);
- LL_DEBUGS("WindlightSync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL;
+ LL_DEBUGS("WindlightSync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25f, 1.f) * 24.f << " h" << LL_ENDL;
/* LAPRAS
We decode these parts of the message but ignore them
@@ -3691,7 +3691,7 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
}
U64 region_handle = 0;
- F32 gain = 0;
+ F32 gain = 0.f;
LLUUID sound_id;
LLUUID owner_id;
LLUUID object_id;
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 9ad2474e9b..a2abd1d930 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -1521,7 +1521,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
S32 size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ExtraParams);
if (size > 0)
{
- U8 *buffer = new U8[size];
+ U8 *buffer = new(std::nothrow) U8[size];
+ if (!buffer)
+ {
+ LLError::LLUserWarningMsg::showOutOfMemory();
+ LL_ERRS() << "Bad memory allocation for buffer, size: " << size << LL_ENDL;
+ }
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ExtraParams, buffer, size, block_num);
LLDataPackerBinaryBuffer dp(buffer, size);
@@ -2451,7 +2456,7 @@ void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &frame_time)
{
// calculate dt from last update
F32 time_dilation = mRegionp ? mRegionp->getTimeDilation() : 1.0f;
- F32 dt_raw = ((F64Seconds)frame_time - mLastInterpUpdateSecs).value();
+ F32 dt_raw = (F32)((F64Seconds)frame_time - mLastInterpUpdateSecs).value();
F32 dt = time_dilation * dt_raw;
applyAngularVelocity(dt);
@@ -2950,7 +2955,7 @@ void LLViewerObject::fetchInventoryDelayed(const F64 &time_seconds)
//static
void LLViewerObject::fetchInventoryDelayedCoro(const LLUUID task_inv, const F64 time_seconds)
{
- llcoro::suspendUntilTimeout(time_seconds);
+ llcoro::suspendUntilTimeout((float)time_seconds);
LLViewerObject *obj = gObjectList.findObject(task_inv);
if (obj)
{
@@ -3676,6 +3681,8 @@ bool LLViewerObject::updateLOD()
bool LLViewerObject::updateGeometry(LLDrawable *drawable)
{
+ // return true means "update complete", return false means "try again next frame"
+ // default should be return true
return true;
}
@@ -4416,6 +4423,7 @@ void LLViewerObject::moveGLTFNode(S32 node_index, const LLVector3& offset)
matMul(trans, mat, mat);
node.mMatrix = glm::make_mat4(mat.getF32ptr());
+ node.mTRSValid = false;
// TODO -- only update transforms for this node and its children (or use a dirty flag)
mGLTFAsset->updateTransforms();
@@ -5745,7 +5753,8 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const
}
if (avatar_parent && avatar_parent->isAvatar() &&
- root_edit && root_edit->mDrawable.notNull() && root_edit->mDrawable->getXform()->getParent())
+ root_edit && root_edit->mDrawable.notNull() && !root_edit->mDrawable->isDead() &&
+ root_edit->mDrawable->getXform()->getParent())
{
LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index bfbb701a8e..435bd60917 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -889,6 +889,7 @@ void LLViewerObjectList::update(LLAgent &agent)
static std::vector<LLViewerObject*> idle_list;
U32 idle_count = 0;
+ mNumAvatars = 0;
{
for (std::vector<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
@@ -906,6 +907,10 @@ void LLViewerObjectList::update(LLAgent &agent)
idle_list[idle_count] = objectp;
}
++idle_count;
+ if (objectp->isAvatar())
+ {
+ mNumAvatars++;
+ }
}
else
{ // There shouldn't be any NULL pointers in the list, but they have caused
@@ -1127,10 +1132,10 @@ void LLViewerObjectList::fetchObjectCostsCoro(std::string url)
{
LLSD objectData = result[it->asString()];
- F32 linkCost = objectData["linked_set_resource_cost"].asReal();
- F32 objectCost = objectData["resource_cost"].asReal();
- F32 physicsCost = objectData["physics_cost"].asReal();
- F32 linkPhysicsCost = objectData["linked_set_physics_cost"].asReal();
+ F32 linkCost = (F32)objectData["linked_set_resource_cost"].asReal();
+ F32 objectCost = (F32)objectData["resource_cost"].asReal();
+ F32 physicsCost = (F32)objectData["physics_cost"].asReal();
+ F32 linkPhysicsCost = (F32)objectData["linked_set_physics_cost"].asReal();
gObjectList.updateObjectCost(objectId, objectCost, linkCost, physicsCost, linkPhysicsCost);
}
@@ -1255,10 +1260,10 @@ void LLViewerObjectList::fetchPhisicsFlagsCoro(std::string url)
if (data.has("Density"))
{
- F32 density = data["Density"].asReal();
- F32 friction = data["Friction"].asReal();
- F32 restitution = data["Restitution"].asReal();
- F32 gravityMult = data["GravityMultiplier"].asReal();
+ F32 density = (F32)data["Density"].asReal();
+ F32 friction = (F32)data["Friction"].asReal();
+ F32 restitution = (F32)data["Restitution"].asReal();
+ F32 gravityMult = (F32)data["GravityMultiplier"].asReal();
gObjectList.updatePhysicsProperties(objectId, density,
friction, restitution, gravityMult);
@@ -1715,15 +1720,15 @@ void LLViewerObjectList::clearAllMapObjectsInRegion(LLViewerRegion* regionp)
void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
- LLColor4 above_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnAboveWater" );
- LLColor4 below_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnBelowWater" );
- LLColor4 you_own_above_water_color =
+ static const LLUIColor above_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnAboveWater" );
+ static const LLUIColor below_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnBelowWater" );
+ static const LLUIColor you_own_above_water_color =
LLUIColorTable::instance().getColor( "NetMapYouOwnAboveWater" );
- LLColor4 you_own_below_water_color =
+ static const LLUIColor you_own_below_water_color =
LLUIColorTable::instance().getColor( "NetMapYouOwnBelowWater" );
- LLColor4 group_own_above_water_color =
+ static const LLUIColor group_own_above_water_color =
LLUIColorTable::instance().getColor( "NetMapGroupOwnAboveWater" );
- LLColor4 group_own_below_water_color =
+ static const LLUIColor group_own_below_water_color =
LLUIColorTable::instance().getColor( "NetMapGroupOwnBelowWater" );
F32 max_radius = gSavedSettings.getF32("MiniMapPrimMaxRadius");
@@ -1753,7 +1758,7 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
// See DEV-17370 and DEV-29869/SNOW-79 for details.
approx_radius = llmin(approx_radius, max_radius);
- LLColor4U color = above_water_color;
+ LLColor4U color = above_water_color.get();
if( objectp->permYouOwner() )
{
const F32 MIN_RADIUS_FOR_OWNED_OBJECTS = 2.f;
@@ -1766,29 +1771,29 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
if ( objectp->permGroupOwner() )
{
- color = group_own_above_water_color;
+ color = group_own_above_water_color.get();
}
else
{
- color = you_own_above_water_color;
+ color = you_own_above_water_color.get();
}
}
else
{
if ( objectp->permGroupOwner() )
{
- color = group_own_below_water_color;
+ color = group_own_below_water_color.get();
}
else
{
- color = you_own_below_water_color;
+ color = you_own_below_water_color.get();
}
}
}
else
if( pos.mdV[VZ] < water_height )
{
- color = below_water_color;
+ color = below_water_color.get();
}
netmap.renderScaledPointGlobal(
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index ebdfd0d369..7dfa94b99f 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -145,6 +145,7 @@ public:
S32 getOrphanParentCount() const { return (S32) mOrphanParents.size(); }
S32 getOrphanCount() const { return mNumOrphans; }
+ S32 getAvatarCount() const { return mNumAvatars; }
void orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port);
void findOrphans(LLViewerObject* objectp, U32 ip, U32 port);
@@ -191,6 +192,7 @@ protected:
std::vector<U64> mOrphanParents; // LocalID/ip,port of orphaned objects
std::vector<OrphanInfo> mOrphanChildren; // UUID's of orphaned objects
S32 mNumOrphans;
+ S32 mNumAvatars;
typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t;
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index 1f14aa4afc..2e9b5de72b 100755
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -53,6 +53,14 @@
static const U8 OVERLAY_IMG_COMPONENTS = 4;
static const F32 LINE_WIDTH = 0.0625f;
+bool LLViewerParcelOverlay::sColorSetInitialized = false;
+LLUIColor LLViewerParcelOverlay::sAvailColor;
+LLUIColor LLViewerParcelOverlay::sOwnedColor;
+LLUIColor LLViewerParcelOverlay::sGroupColor;
+LLUIColor LLViewerParcelOverlay::sSelfColor;
+LLUIColor LLViewerParcelOverlay::sForSaleColor;
+LLUIColor LLViewerParcelOverlay::sAuctionColor;
+
LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_width_meters)
: mRegion( region ),
mParcelGridsPerEdge( S32( region_width_meters / PARCEL_GRID_STEP_METERS ) ),
@@ -60,6 +68,17 @@ LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_
mTimeSinceLastUpdate(),
mOverlayTextureIdx(-1)
{
+ if (!sColorSetInitialized)
+ {
+ sColorSetInitialized = true;
+ sAvailColor = LLUIColorTable::instance().getColor("PropertyColorAvail").get();
+ sOwnedColor = LLUIColorTable::instance().getColor("PropertyColorOther").get();
+ sGroupColor = LLUIColorTable::instance().getColor("PropertyColorGroup").get();
+ sSelfColor = LLUIColorTable::instance().getColor("PropertyColorSelf").get();
+ sForSaleColor = LLUIColorTable::instance().getColor("PropertyColorForSale").get();
+ sAuctionColor = LLUIColorTable::instance().getColor("PropertyColorAuction").get();
+ }
+
// Create a texture to hold color information.
// 4 components
// Use mipmaps = false, clamped, NEAREST filter, for sharp edges
@@ -321,12 +340,12 @@ void LLViewerParcelOverlay::updateOverlayTexture()
mOverlayTextureIdx = 0;
}
- const LLColor4U avail = LLUIColorTable::instance().getColor("PropertyColorAvail").get();
- const LLColor4U owned = LLUIColorTable::instance().getColor("PropertyColorOther").get();
- const LLColor4U group = LLUIColorTable::instance().getColor("PropertyColorGroup").get();
- const LLColor4U self = LLUIColorTable::instance().getColor("PropertyColorSelf").get();
- const LLColor4U for_sale = LLUIColorTable::instance().getColor("PropertyColorForSale").get();
- const LLColor4U auction = LLUIColorTable::instance().getColor("PropertyColorAuction").get();
+ const LLColor4U avail = sAvailColor.get();
+ const LLColor4U owned = sOwnedColor.get();
+ const LLColor4U group = sGroupColor.get();
+ const LLColor4U self = sSelfColor.get();
+ const LLColor4U for_sale = sForSaleColor.get();
+ const LLColor4U auction = sAuctionColor.get();
// Create the base texture.
U8 *raw = mImageRaw->getData();
@@ -339,7 +358,7 @@ void LLViewerParcelOverlay::updateOverlayTexture()
{
U8 ownership = mOwnership[i];
- F32 r,g,b,a;
+ U8 r,g,b,a;
// Color stored in low three bits
switch( ownership & 0x7 )
@@ -433,11 +452,11 @@ void LLViewerParcelOverlay::updatePropertyLines()
return;
LLColor4U colors[PARCEL_COLOR_MASK + 1];
- colors[PARCEL_SELF] = LLUIColorTable::instance().getColor("PropertyColorSelf").get();
- colors[PARCEL_OWNED] = LLUIColorTable::instance().getColor("PropertyColorOther").get();
- colors[PARCEL_GROUP] = LLUIColorTable::instance().getColor("PropertyColorGroup").get();
- colors[PARCEL_FOR_SALE] = LLUIColorTable::instance().getColor("PropertyColorForSale").get();
- colors[PARCEL_AUCTION] = LLUIColorTable::instance().getColor("PropertyColorAuction").get();
+ colors[PARCEL_SELF] = sSelfColor.get();
+ colors[PARCEL_OWNED] = sOwnedColor.get();
+ colors[PARCEL_GROUP] = sGroupColor.get();
+ colors[PARCEL_FOR_SALE] = sForSaleColor.get();
+ colors[PARCEL_AUCTION] = sAuctionColor.get();
mEdges.clear();
@@ -611,7 +630,7 @@ void LLViewerParcelOverlay::setDirty()
void LLViewerParcelOverlay::updateGL()
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
updateOverlayTexture();
}
diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h
index d78005e376..03ae464cb8 100644
--- a/indra/newview/llviewerparceloverlay.h
+++ b/indra/newview/llviewerparceloverlay.h
@@ -35,6 +35,7 @@
#include "lluuid.h"
#include "llviewertexture.h"
#include "llgl.h"
+#include "lluicolor.h"
class LLViewerRegion;
class LLVector3;
@@ -123,6 +124,14 @@ private:
};
std::vector<Edge> mEdges;
+
+ static bool sColorSetInitialized;
+ static LLUIColor sAvailColor;
+ static LLUIColor sOwnedColor;
+ static LLUIColor sGroupColor;
+ static LLUIColor sSelfColor;
+ static LLUIColor sForSaleColor;
+ static LLUIColor sAuctionColor;
};
#endif
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 8398cd8a54..a857887247 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -37,25 +37,16 @@
#include "linden_common.h"
-// Work around stupid Microsoft STL warning
-#ifdef LL_WINDOWS
-#pragma warning (disable : 4702) // warning C4702: unreachable code
-#endif
-
#include <algorithm>
#include <deque>
#include <functional>
#include <map>
#include <set>
-
-#ifdef LL_WINDOWS
-#pragma warning (3 : 4702) // we like level 3, not 4
-#endif
+#include <vector>
// Library headers from llcommon project:
#include "indra_constants.h"
#include "llinitparam.h"
-#include "llallocator.h"
#include "llapp.h"
#include "llcriticaldamp.h"
#include "lldefs.h"
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 19a1990665..ac64c47abe 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1269,8 +1269,12 @@ U32 LLViewerRegion::getNumOfVisibleGroups() const
return mImpl ? static_cast<U32>(mImpl->mVisibleGroups.size()) : 0;
}
-void LLViewerRegion::updateReflectionProbes()
+void LLViewerRegion::updateReflectionProbes(bool full_update)
{
+ if (!full_update && mReflectionMaps.empty())
+ {
+ return;
+ }
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
const F32 probe_spacing = 32.f;
const F32 probe_radius = sqrtf((probe_spacing * 0.5f) * (probe_spacing * 0.5f) * 3.f);
@@ -1278,7 +1282,7 @@ void LLViewerRegion::updateReflectionProbes()
F32 start = probe_spacing * 0.5f;
- U32 grid_width = REGION_WIDTH_METERS / probe_spacing;
+ U32 grid_width = (U32)(REGION_WIDTH_METERS / probe_spacing);
mReflectionMaps.resize(grid_width * grid_width);
@@ -3143,16 +3147,24 @@ void LLViewerRegion::unpackRegionHandshake()
compp->setParamsReady();
}
- LLPBRTerrainFeatures::queueQuery(*this, [](LLUUID region_id, bool success, const LLModifyRegion& composition_changes)
+ std::string cap = getCapability("ModifyRegion"); // needed for queueQuery
+ if (cap.empty())
+ {
+ LLFloaterRegionInfo::sRefreshFromRegion(this);
+ }
+ else
{
- if (!success) { return; }
- LLViewerRegion* region = LLWorld::getInstance()->getRegionFromID(region_id);
- if (!region) { return; }
- LLVLComposition* compp = region->getComposition();
- if (!compp) { return; }
- compp->apply(composition_changes);
- LLFloaterRegionInfo::sRefreshFromRegion(region);
- });
+ LLPBRTerrainFeatures::queueQuery(*this, [](LLUUID region_id, bool success, const LLModifyRegion& composition_changes)
+ {
+ if (!success) { return; }
+ LLViewerRegion* region = LLWorld::getInstance()->getRegionFromID(region_id);
+ if (!region) { return; }
+ LLVLComposition* compp = region->getComposition();
+ if (!compp) { return; }
+ compp->apply(composition_changes);
+ LLFloaterRegionInfo::sRefreshFromRegion(region);
+ });
+ }
}
@@ -3264,6 +3276,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("VoiceSignalingRequest");
capabilityNames.append("ReadOfflineMsgs"); // Requires to respond reliably: AcceptFriendship, AcceptGroupInvite, DeclineFriendship, DeclineGroupInvite
capabilityNames.append("RegionObjects");
+ capabilityNames.append("RegionSchedule");
capabilityNames.append("RemoteParcelRequest");
capabilityNames.append("RenderMaterials");
capabilityNames.append("RequestTextureDownload");
@@ -3735,7 +3748,7 @@ void LLViewerRegion::resetMaterialsCapThrottle()
if ( mSimulatorFeatures.has("RenderMaterialsCapability")
&& mSimulatorFeatures["RenderMaterialsCapability"].isReal() )
{
- requests_per_sec = mSimulatorFeatures["RenderMaterialsCapability"].asReal();
+ requests_per_sec = (F32)mSimulatorFeatures["RenderMaterialsCapability"].asReal();
if ( requests_per_sec == 0.0f )
{
requests_per_sec = 1.0f;
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 68247dc18e..d0ec1fe877 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -428,7 +428,7 @@ public:
static bool isNewObjectCreationThrottleDisabled() {return sNewObjectCreationThrottle < 0;}
// rebuild reflection probe list
- void updateReflectionProbes();
+ void updateReflectionProbes(bool full_update);
private:
void addToVOCacheTree(LLVOCacheEntry* entry);
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 12d0aa4f8e..073a1787d5 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -100,6 +100,7 @@ LLGLSLShader gBenchmarkProgram;
LLGLSLShader gReflectionProbeDisplayProgram;
LLGLSLShader gCopyProgram;
LLGLSLShader gCopyDepthProgram;
+LLGLSLShader gPBRTerrainBakeProgram;
//object shaders
LLGLSLShader gObjectPreviewProgram;
@@ -226,7 +227,7 @@ LLGLSLShader gDeferredSkinnedPBROpaqueProgram;
LLGLSLShader gHUDPBRAlphaProgram;
LLGLSLShader gDeferredPBRAlphaProgram;
LLGLSLShader gDeferredSkinnedPBRAlphaProgram;
-LLGLSLShader gDeferredPBRTerrainProgram;
+LLGLSLShader gDeferredPBRTerrainProgram[TERRAIN_PAINT_TYPE_COUNT];
LLGLSLShader gGLTFPBRMetallicRoughnessProgram;
@@ -432,7 +433,10 @@ void LLViewerShaderMgr::finalizeShaderList()
mShaderList.push_back(&gGLTFPBRMetallicRoughnessProgram);
mShaderList.push_back(&gDeferredAvatarProgram);
mShaderList.push_back(&gDeferredTerrainProgram);
- mShaderList.push_back(&gDeferredPBRTerrainProgram);
+ for (U32 paint_type = 0; paint_type < TERRAIN_PAINT_TYPE_COUNT; ++paint_type)
+ {
+ mShaderList.push_back(&gDeferredPBRTerrainProgram[paint_type]);
+ }
mShaderList.push_back(&gDeferredDiffuseAlphaMaskProgram);
mShaderList.push_back(&gDeferredNonIndexedDiffuseAlphaMaskProgram);
mShaderList.push_back(&gDeferredTreeProgram);
@@ -495,8 +499,6 @@ void LLViewerShaderMgr::setShaders()
mShaderList.clear();
- LLShaderMgr::sMirrorsEnabled = LLPipeline::RenderMirrors;
-
if (!gGLManager.mHasRequirements)
{
// Viewer will show 'hardware requirements' warning later
@@ -755,6 +757,8 @@ std::string LLViewerShaderMgr::loadBasicShaders()
bool ssr = gSavedSettings.getBOOL("RenderScreenSpaceReflections");
+ bool mirrors = gSavedSettings.getBOOL("RenderMirrors");
+
bool has_reflection_probes = gSavedSettings.getBOOL("RenderReflectionsEnabled") && gGLManager.mGLVersion > 3.99f;
S32 probe_level = llclamp(gSavedSettings.getS32("RenderReflectionProbeLevel"), 0, 3);
@@ -782,6 +786,11 @@ std::string LLViewerShaderMgr::loadBasicShaders()
attribs["REF_SAMPLE_COUNT"] = "32";
}
+ if (mirrors)
+ {
+ attribs["HERO_PROBES"] = "1";
+ }
+
{ // PBR terrain
const S32 mapping = clamp_terrain_mapping(gSavedSettings.getS32("RenderTerrainPBRPlanarSampleCount"));
attribs["TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT"] = llformat("%d", mapping);
@@ -1124,7 +1133,10 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gDeferredSkinnedPBROpaqueProgram.unload();
gDeferredPBRAlphaProgram.unload();
gDeferredSkinnedPBRAlphaProgram.unload();
- gDeferredPBRTerrainProgram.unload();
+ for (U32 paint_type = 0; paint_type < TERRAIN_PAINT_TYPE_COUNT; ++paint_type)
+ {
+ gDeferredPBRTerrainProgram[paint_type].unload();
+ }
return true;
}
@@ -1438,25 +1450,31 @@ bool LLViewerShaderMgr::loadShadersDeferred()
S32 detail = gSavedSettings.getS32("RenderTerrainPBRDetail");
detail = llclamp(detail, TERRAIN_PBR_DETAIL_MIN, TERRAIN_PBR_DETAIL_MAX);
const S32 mapping = clamp_terrain_mapping(gSavedSettings.getS32("RenderTerrainPBRPlanarSampleCount"));
- gDeferredPBRTerrainProgram.mName = llformat("Deferred PBR Terrain Shader %d %s",
- detail,
- (mapping == 1 ? "flat" : "triplanar"));
- gDeferredPBRTerrainProgram.mFeatures.hasSrgb = true;
- gDeferredPBRTerrainProgram.mFeatures.isAlphaLighting = true;
- gDeferredPBRTerrainProgram.mFeatures.calculatesAtmospherics = true;
- gDeferredPBRTerrainProgram.mFeatures.hasAtmospherics = true;
- gDeferredPBRTerrainProgram.mFeatures.hasGamma = true;
- gDeferredPBRTerrainProgram.mFeatures.hasTransport = true;
- gDeferredPBRTerrainProgram.mFeatures.isPBRTerrain = true;
+ for (U32 paint_type = 0; paint_type < TERRAIN_PAINT_TYPE_COUNT; ++paint_type)
+ {
+ LLGLSLShader* shader = &gDeferredPBRTerrainProgram[paint_type];
+ shader->mName = llformat("Deferred PBR Terrain Shader %d %s %s",
+ detail,
+ (paint_type == TERRAIN_PAINT_TYPE_PBR_PAINTMAP ? "paintmap" : "heightmap-with-noise"),
+ (mapping == 1 ? "flat" : "triplanar"));
+ shader->mFeatures.hasSrgb = true;
+ shader->mFeatures.isAlphaLighting = true;
+ shader->mFeatures.calculatesAtmospherics = true;
+ shader->mFeatures.hasAtmospherics = true;
+ shader->mFeatures.hasGamma = true;
+ shader->mFeatures.hasTransport = true;
+ shader->mFeatures.isPBRTerrain = true;
- gDeferredPBRTerrainProgram.mShaderFiles.clear();
- gDeferredPBRTerrainProgram.mShaderFiles.push_back(make_pair("deferred/pbrterrainV.glsl", GL_VERTEX_SHADER));
- gDeferredPBRTerrainProgram.mShaderFiles.push_back(make_pair("deferred/pbrterrainF.glsl", GL_FRAGMENT_SHADER));
- gDeferredPBRTerrainProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
- gDeferredPBRTerrainProgram.addPermutation("TERRAIN_PBR_DETAIL", llformat("%d", detail));
- gDeferredPBRTerrainProgram.addPermutation("TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT", llformat("%d", mapping));
- success = gDeferredPBRTerrainProgram.createShader();
- llassert(success);
+ shader->mShaderFiles.clear();
+ shader->mShaderFiles.push_back(make_pair("deferred/pbrterrainV.glsl", GL_VERTEX_SHADER));
+ shader->mShaderFiles.push_back(make_pair("deferred/pbrterrainF.glsl", GL_FRAGMENT_SHADER));
+ shader->mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ shader->addPermutation("TERRAIN_PBR_DETAIL", llformat("%d", detail));
+ shader->addPermutation("TERRAIN_PAINT_TYPE", llformat("%d", paint_type));
+ shader->addPermutation("TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT", llformat("%d", mapping));
+ success = success && shader->createShader();
+ llassert(success);
+ }
}
if (success)
@@ -2954,6 +2972,25 @@ bool LLViewerShaderMgr::loadShadersInterface()
if (success)
{
+ LLGLSLShader* shader = &gPBRTerrainBakeProgram;
+ U32 bit_depth = gSavedSettings.getU32("TerrainPaintBitDepth");
+ // LLTerrainPaintMap currently uses an RGB8 texture internally
+ bit_depth = llclamp(bit_depth, 1, 8);
+ shader->mName = llformat("Terrain Bake Shader RGB%o", bit_depth);
+ shader->mFeatures.isPBRTerrain = true;
+
+ shader->mShaderFiles.clear();
+ shader->mShaderFiles.push_back(make_pair("interface/pbrTerrainBakeV.glsl", GL_VERTEX_SHADER));
+ shader->mShaderFiles.push_back(make_pair("interface/pbrTerrainBakeF.glsl", GL_FRAGMENT_SHADER));
+ shader->mShaderLevel = mShaderLevel[SHADER_INTERFACE];
+ const U32 value_range = (1 << bit_depth) - 1;
+ shader->addPermutation("TERRAIN_PAINT_PRECISION", llformat("%d", value_range));
+ success = success && shader->createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
gAlphaMaskProgram.mName = "Alpha Mask Shader";
gAlphaMaskProgram.mShaderFiles.clear();
gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskV.glsl", GL_VERTEX_SHADER));
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 60ce8c430b..af47014a43 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -174,6 +174,7 @@ extern LLGLSLShader gBenchmarkProgram;
extern LLGLSLShader gReflectionProbeDisplayProgram;
extern LLGLSLShader gCopyProgram;
extern LLGLSLShader gCopyDepthProgram;
+extern LLGLSLShader gPBRTerrainBakeProgram;
//output tex0[tc0] - tex1[tc1]
extern LLGLSLShader gTwoTextureCompareProgram;
@@ -304,5 +305,13 @@ enum TerrainPBRDetail : S32
TERRAIN_PBR_DETAIL_BASE_COLOR = -4,
TERRAIN_PBR_DETAIL_MIN = -4,
};
-extern LLGLSLShader gDeferredPBRTerrainProgram;
+enum TerrainPaintType : U32
+{
+ // Use LLVLComposition::mDatap (heightmap) generated by generateHeights, plus noise from TERRAIN_ALPHARAMP
+ TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE = 0,
+ // Use paint map if PBR terrain, otherwise fall back to TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
+ TERRAIN_PAINT_TYPE_PBR_PAINTMAP = 1,
+ TERRAIN_PAINT_TYPE_COUNT = 2,
+};
+extern LLGLSLShader gDeferredPBRTerrainProgram[TERRAIN_PAINT_TYPE_COUNT];
#endif
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 3499c7eb7d..d1ee9ea17c 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -284,13 +284,13 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff)
add(LLStatViewer::LOSS_5_PERCENT_TIME, time_diff);
}
- F32 sim_fps = getRecording().getLastValue(LLStatViewer::SIM_FPS);
+ F32 sim_fps = (F32)getRecording().getLastValue(LLStatViewer::SIM_FPS);
if (0.f < sim_fps && sim_fps < 20.f)
{
add(LLStatViewer::SIM_20_FPS_TIME, time_diff);
}
- F32 sim_physics_fps = getRecording().getLastValue(LLStatViewer::SIM_PHYSICS_FPS);
+ F32 sim_physics_fps = (F32)getRecording().getLastValue(LLStatViewer::SIM_PHYSICS_FPS);
if (0.f < sim_physics_fps && sim_physics_fps < 20.f)
{
diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp
index 88edb96fbb..58065ecce5 100644
--- a/indra/newview/llviewerstatsrecorder.cpp
+++ b/indra/newview/llviewerstatsrecorder.cpp
@@ -27,16 +27,13 @@
#include "llviewerprecompiledheaders.h"
#include "llviewerstatsrecorder.h"
-
#include "llcontrol.h"
#include "llfile.h"
+#include "llviewercontrol.h"
#include "llviewerregion.h"
#include "llviewerobject.h"
#include "llworld.h"
-extern LLControlGroup gSavedSettings;
-
-LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL;
LLViewerStatsRecorder::LLViewerStatsRecorder() :
mStatsFile(NULL),
mTimer(),
@@ -48,11 +45,6 @@ LLViewerStatsRecorder::LLViewerStatsRecorder() :
mMaxDuration(300.f),
mSkipSaveIfZeros(false)
{
- if (NULL != sInstance)
- {
- LL_ERRS() << "Attempted to create multiple instances of LLViewerStatsRecorder!" << LL_ENDL;
- }
- sInstance = this;
clearStats();
}
diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h
index ecc321c0a8..2108f49dc3 100644
--- a/indra/newview/llviewerstatsrecorder.h
+++ b/indra/newview/llviewerstatsrecorder.h
@@ -38,13 +38,12 @@
class LLMutex;
class LLViewerObject;
-class LLViewerStatsRecorder : public LLSingleton<LLViewerStatsRecorder>
+class LLViewerStatsRecorder : public LLSimpleton<LLViewerStatsRecorder>
{
- LLSINGLETON(LLViewerStatsRecorder);
+public:
+ LLViewerStatsRecorder();
LOG_CLASS(LLViewerStatsRecorder);
~LLViewerStatsRecorder();
-
- public:
// Enable/disable stats recording. This is broken down into two
// flags so we can record stats without writing them to the log
// file. This is useful to analyzing updates for scene loading.
@@ -140,8 +139,6 @@ private:
void closeStatsFile();
void makeStatsFileName();
- static LLViewerStatsRecorder* sInstance;
-
LLFILE * mStatsFile; // File to write data into
std::string mStatsFileName;
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 0ab0265586..14228b469f 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -220,17 +220,11 @@ public:
LLRectf image_rect = draw_rect;
image_rect.mRight = image_rect.mLeft + mImage->getWidth();
image_rect.mTop = image_rect.mBottom + mImage->getHeight();
- mImage->draw(LLRect(image_rect.mLeft, image_rect.mTop, image_rect.mRight, image_rect.mBottom));
+ mImage->draw(LLRect((S32)image_rect.mLeft, (S32)image_rect.mTop, (S32)image_rect.mRight, (S32)image_rect.mBottom));
- LLColor4 color;
- if (mEditor.getReadOnly())
- {
- color = LLUIColorTable::instance().getColor("TextEmbeddedItemReadOnlyColor");
- }
- else
- {
- color = LLUIColorTable::instance().getColor("TextEmbeddedItemColor");
- }
+ static const LLUIColor embedded_item_readonly_col = LLUIColorTable::instance().getColor("TextEmbeddedItemReadOnlyColor");
+ static const LLUIColor embedded_item_col = LLUIColorTable::instance().getColor("TextEmbeddedItemColor");
+ const LLColor4& color = mEditor.getReadOnly() ? embedded_item_readonly_col : embedded_item_col;
F32 right_x;
mStyle->getFont()->render(mLabel, 0, image_rect.mRight + EMBEDDED_ITEM_LABEL_PADDING, draw_rect.mTop, color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::UNDERLINE, LLFontGL::NO_SHADOW, static_cast<S32>(mLabel.length()), S32_MAX, &right_x);
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 22c7c195c4..eab564a856 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -42,6 +42,7 @@
#include "llstl.h"
#include "message.h"
#include "lltimer.h"
+#include "v4coloru.h"
// viewer includes
#include "llimagegl.h"
@@ -63,23 +64,18 @@
#include "llwindow.h"
///////////////////////////////////////////////////////////////////////////////
-// extern
-const S32Megabytes gMinVideoRam(32);
-const S32Megabytes gMaxVideoRam(512);
-
-
// statics
-LLPointer<LLViewerTexture> LLViewerTexture::sNullImagep = NULL;
-LLPointer<LLViewerTexture> LLViewerTexture::sBlackImagep = NULL;
-LLPointer<LLViewerTexture> LLViewerTexture::sCheckerBoardImagep = NULL;
-LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = NULL;
-LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = NULL;
-LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = NULL;
-LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sSmokeImagep = NULL;
-LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sFlatNormalImagep = NULL;
+LLPointer<LLViewerTexture> LLViewerTexture::sNullImagep = nullptr;
+LLPointer<LLViewerTexture> LLViewerTexture::sBlackImagep = nullptr;
+LLPointer<LLViewerTexture> LLViewerTexture::sCheckerBoardImagep = nullptr;
+LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = nullptr;
+LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = nullptr;
+LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = nullptr;
+LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sSmokeImagep = nullptr;
+LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sFlatNormalImagep = nullptr;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultIrradiancePBRp;
LLViewerMediaTexture::media_map_t LLViewerMediaTexture::sMediaMap;
-LLTexturePipelineTester* LLViewerTextureManager::sTesterp = NULL;
+LLTexturePipelineTester* LLViewerTextureManager::sTesterp = nullptr;
F32 LLViewerFetchedTexture::sMaxVirtualSize = 8192.f*8192.f;
const std::string sTesterName("TextureTester");
@@ -89,18 +85,19 @@ S32 LLViewerTexture::sRawCount = 0;
S32 LLViewerTexture::sAuxCount = 0;
LLFrameTimer LLViewerTexture::sEvaluationTimer;
F32 LLViewerTexture::sDesiredDiscardBias = 0.f;
-F32 LLViewerTexture::sDesiredDiscardScale = 1.1f;
+
S32 LLViewerTexture::sMaxSculptRez = 128; //max sculpt image size
-const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64;
+constexpr S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64;
const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez;
-const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128;
-const S32 DEFAULT_ICON_DIMENSIONS = 32;
-const S32 DEFAULT_THUMBNAIL_DIMENSIONS = 256;
+constexpr S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128;
+constexpr S32 DEFAULT_ICON_DIMENSIONS = 32;
+constexpr S32 DEFAULT_THUMBNAIL_DIMENSIONS = 256;
U32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256.
U32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA;
bool LLViewerTexture::sFreezeImageUpdates = false;
F32 LLViewerTexture::sCurrentTime = 0.0f;
+constexpr F32 MEMORY_CHECK_WAIT_TIME = 1.0f;
constexpr F32 MIN_VRAM_BUDGET = 768.f;
F32 LLViewerTexture::sFreeVRAMMegabytes = MIN_VRAM_BUDGET;
@@ -413,8 +410,6 @@ void LLViewerTextureManager::init()
}
}
imagep->createGLTexture(0, image_raw);
- //cache the raw image
- imagep->setCachedRawImage(0, image_raw);
image_raw = NULL;
#else
LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, true, LLGLTexture::BOOST_UI);
@@ -484,10 +479,6 @@ void LLViewerTexture::initClass()
LLImageGL::sDefaultGLTexture = LLViewerFetchedTexture::sDefaultImagep->getGLTexture();
}
-// non-const (used externally
-F32 texmem_lower_bound_scale = 0.85f;
-F32 texmem_middle_bound_scale = 0.925f;
-
//static
void LLViewerTexture::updateClass()
{
@@ -512,21 +503,75 @@ void LLViewerTexture::updateClass()
// NOTE: our metrics miss about half the vram we use, so this biases high but turns out to typically be within 5% of the real number
F32 used = (F32)ll_round(texture_bytes_alloc + vertex_bytes_alloc + render_bytes_alloc);
- F32 budget = max_vram_budget == 0 ? gGLManager.mVRAM : max_vram_budget;
+ F32 budget = max_vram_budget == 0 ? (F32)gGLManager.mVRAM : (F32)max_vram_budget;
// try to leave half a GB for everyone else, but keep at least 768MB for ourselves
F32 target = llmax(budget - 512.f, MIN_VRAM_BUDGET);
sFreeVRAMMegabytes = target - used;
- F32 over_pct = llmax((used-target) / target, 0.f);
- sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.f + over_pct);
+ F32 over_pct = (used - target) / target;
+
+ bool is_low = over_pct > 0.f;
+
+ if (isSystemMemoryLow())
+ {
+ is_low = true;
+ // System RAM is low -> ramp up discard bias over time to free memory
+ if (sEvaluationTimer.getElapsedTimeF32() > MEMORY_CHECK_WAIT_TIME)
+ {
+ static LLCachedControl<F32> low_mem_min_discard_increment(gSavedSettings, "RenderLowMemMinDiscardIncrement", .1f);
+ sDesiredDiscardBias += (F32) low_mem_min_discard_increment * (F32) gFrameIntervalSeconds;
+ sEvaluationTimer.reset();
+ }
+ }
+ else
+ {
+ sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.f + over_pct);
+
+ if (sDesiredDiscardBias > 1.f && over_pct < 0.f)
+ {
+ sDesiredDiscardBias -= gFrameIntervalSeconds * 0.01f;
+ }
+ }
+
+ static bool was_low = false;
+ if (is_low && !was_low)
+ {
+ LL_WARNS() << "Low system memory detected, emergency downrezzing off screen textures" << LL_ENDL;
+ sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f);
+
+ for (auto& image : gTextureList)
+ {
+ gTextureList.updateImageDecodePriority(image, false /*will modify gTextureList otherwise!*/);
+ }
+ }
+
+ was_low = is_low;
+
+ sDesiredDiscardBias = llclamp(sDesiredDiscardBias, 1.f, 3.f);
- if (sDesiredDiscardBias > 1.f)
+ LLViewerTexture::sFreezeImageUpdates = false;
+}
+
+//static
+bool LLViewerTexture::isSystemMemoryLow()
+{
+ static LLFrameTimer timer;
+ static U32Megabytes physical_res = U32Megabytes(U32_MAX);
+
+ static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
+ const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory);
+
+ if (timer.getElapsedTimeF32() < MEMORY_CHECK_WAIT_TIME) //call this once per second.
{
- sDesiredDiscardBias -= gFrameIntervalSeconds * 0.01;
+ return physical_res < MIN_FREE_MAIN_MEMORY;
}
- LLViewerTexture::sFreezeImageUpdates = false; // sDesiredDiscardBias > (desired_discard_bias_max - 1.0f);
+ timer.reset();
+
+ LLMemory::updateMemoryInfo();
+ physical_res = LLMemory::getAvailableMemKB();
+ return physical_res < MIN_FREE_MAIN_MEMORY;
}
//end of static functions
@@ -585,16 +630,15 @@ void LLViewerTexture::init(bool firstinit)
mParcelMedia = NULL;
memset(&mNumVolumes, 0, sizeof(U32)* LLRender::NUM_VOLUME_TEXTURE_CHANNELS);
- mFaceList[LLRender::DIFFUSE_MAP].clear();
- mFaceList[LLRender::NORMAL_MAP].clear();
- mFaceList[LLRender::SPECULAR_MAP].clear();
- mNumFaces[LLRender::DIFFUSE_MAP] =
- mNumFaces[LLRender::NORMAL_MAP] =
- mNumFaces[LLRender::SPECULAR_MAP] = 0;
-
mVolumeList[LLRender::LIGHT_TEX].clear();
mVolumeList[LLRender::SCULPT_TEX].clear();
+ for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; i++)
+ {
+ mNumFaces[i] = 0;
+ mFaceList[i].clear();
+ }
+
mMainQueue = LL::WorkQueue::getInstance("mainloop");
mImageQueue = LL::WorkQueue::getInstance("LLImageGL");
}
@@ -696,9 +740,6 @@ bool LLViewerTexture::bindDefaultImage(S32 stage)
}
stop_glerror();
- //check if there is cached raw image and switch to it if possible
- switchToCachedImage();
-
LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName);
if (tester)
{
@@ -899,18 +940,6 @@ void LLViewerTexture::reorganizeVolumeList()
}
}
-//virtual
-void LLViewerTexture::switchToCachedImage()
-{
- //nothing here.
-}
-
-//virtual
-void LLViewerTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)
-{
- //nothing here.
-}
-
bool LLViewerTexture::isLargeImage()
{
return (S32)mTexelsPerImage > LLViewerTexture::sMinLargeImageSize;
@@ -1045,10 +1074,6 @@ void LLViewerFetchedTexture::init(bool firstinit)
mIsFetched = false;
mInFastCacheList = false;
- mCachedRawImage = NULL;
- mCachedRawDiscardLevel = -1;
- mCachedRawImageReady = false;
-
mSavedRawImage = NULL;
mForceToSaveRawImage = false;
mSaveRawImage = false;
@@ -1058,8 +1083,6 @@ void LLViewerFetchedTexture::init(bool firstinit)
mKeptSavedRawImageTime = 0.f;
mLastCallBackActiveTime = 0.f;
mForceCallbackFetch = false;
- mInDebug = false;
- mUnremovable = false;
mFTType = FTT_UNKNOWN;
}
@@ -1106,9 +1129,6 @@ void LLViewerFetchedTexture::cleanup()
// Clean up image data
destroyRawImage();
- mCachedRawImage = NULL;
- mCachedRawDiscardLevel = -1;
- mCachedRawImageReady = false;
mSavedRawImage = NULL;
mSavedRawDiscardLevel = -1;
}
@@ -1188,13 +1208,17 @@ void LLViewerFetchedTexture::setForSculpt()
{
static const S32 MAX_INTERVAL = 8; //frames
+ forceToSaveRawImage(0, F32_MAX);
+
+ setBoostLevel(llmax((S32)getBoostLevel(),
+ (S32)LLGLTexture::BOOST_SCULPTED));
+
mForSculpt = true;
if(isForSculptOnly() && hasGLTexture() && !getBoundRecently())
{
destroyGLTexture(); //sculpt image does not need gl texture.
mTextureState = ACTIVE;
}
- checkCachedRawSculptImage();
setMaxVirtualSizeResetInterval(MAX_INTERVAL);
}
@@ -1208,32 +1232,6 @@ bool LLViewerFetchedTexture::isDeleted()
return mTextureState == DELETED;
}
-bool LLViewerFetchedTexture::isInactive()
-{
- return mTextureState == INACTIVE;
-}
-
-bool LLViewerFetchedTexture::isDeletionCandidate()
-{
- return mTextureState == DELETION_CANDIDATE;
-}
-
-void LLViewerFetchedTexture::setDeletionCandidate()
-{
- if(mGLTexturep.notNull() && mGLTexturep->getTexName() && (mTextureState == INACTIVE))
- {
- mTextureState = DELETION_CANDIDATE;
- }
-}
-
-//set the texture inactive
-void LLViewerFetchedTexture::setInactive()
-{
- if(mTextureState == ACTIVE && mGLTexturep.notNull() && mGLTexturep->getTexName() && !mGLTexturep->getBoundRecently())
- {
- mTextureState = INACTIVE;
- }
-}
bool LLViewerFetchedTexture::isFullyLoaded() const
{
@@ -1307,10 +1305,6 @@ void LLViewerFetchedTexture::addToCreateTexture()
}
}
- //discard the cached raw image and the saved raw image
- mCachedRawImageReady = false;
- mCachedRawDiscardLevel = -1;
- mCachedRawImage = NULL;
mSavedRawDiscardLevel = -1;
mSavedRawImage = NULL;
}
@@ -1600,7 +1594,11 @@ void LLViewerFetchedTexture::scheduleCreateTexture()
}
else
{
- gTextureList.mCreateTextureList.insert(this);
+ if (!mCreatePending)
+ {
+ mCreatePending = true;
+ gTextureList.mCreateTextureList.push(this);
+ }
}
}
}
@@ -1624,13 +1622,12 @@ void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)
void LLViewerFetchedTexture::setDebugText(const std::string& text)
{
- for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch)
+ for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
{
- llassert(mNumFaces[ch] <= mFaceList[ch].size());
-
- for (U32 i = 0; i < mNumFaces[ch]; i++)
+ for (S32 fi = 0; fi < getNumFaces(i); ++fi)
{
- LLFace* facep = mFaceList[ch][i];
+ LLFace* facep = (*(getFaceList(i)))[fi];
+
if (facep)
{
LLDrawable* drawable = facep->getDrawable();
@@ -1643,10 +1640,15 @@ void LLViewerFetchedTexture::setDebugText(const std::string& text)
}
}
+extern bool gCubeSnapshot;
+
//virtual
void LLViewerFetchedTexture::processTextureStats()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
+ llassert(!gCubeSnapshot); // should only be called when the main camera is active
+ llassert(!LLPipeline::sShadowRender);
+
if(mFullyLoaded)
{
if(mDesiredDiscardLevel > mMinDesiredDiscardLevel)//need to load more
@@ -1748,20 +1750,6 @@ S32 LLViewerFetchedTexture::getCurrentDiscardLevelForFetching()
return current_discard;
}
-bool LLViewerFetchedTexture::setDebugFetching(S32 debug_level)
-{
- if(debug_level < 0)
- {
- mInDebug = false;
- return false;
- }
- mInDebug = true;
-
- mDesiredDiscardLevel = debug_level;
-
- return true;
-}
-
bool LLViewerFetchedTexture::isActiveFetching()
{
static LLCachedControl<bool> monitor_enabled(gSavedSettings,"DebugShowTextureInfo");
@@ -2011,13 +1999,6 @@ bool LLViewerFetchedTexture::updateFetch()
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - current < min");
make_request = false;
}
- else if(mCachedRawImage.notNull() // can be empty
- && mCachedRawImageReady
- && (current_discard < 0 || current_discard > mCachedRawDiscardLevel))
- {
- make_request = false;
- switchToCachedImage(); //use the cached raw data first
- }
if (make_request)
{
@@ -2511,20 +2492,6 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()
}
//
- // Do a readback if required, OR start off a texture decode
- //
- if (need_readback && (getMaxDiscardLevel() > gl_discard))
- {
- // Do a readback to get the GL data into the raw image
- // We have GL data.
-
- destroyRawImage();
- reloadRawImage(mLoadedCallbackDesiredDiscardLevel);
- llassert(mRawImage.notNull());
- llassert(!mNeedsAux || mAuxRawImage.notNull());
- }
-
- //
// Run raw/auxiliary data callbacks
//
if (run_raw_callbacks && mIsRawImageValid && (mRawDiscardLevel <= getMaxDiscardLevel()))
@@ -2631,61 +2598,6 @@ void LLViewerFetchedTexture::forceImmediateUpdate()
return;
}
-LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)
-{
- llassert(mGLTexturep.notNull());
- llassert(discard_level >= 0);
- llassert(mComponents > 0);
-
- if (mRawImage.notNull())
- {
- //mRawImage is in use by somebody else, do not delete it.
- return NULL;
- }
-
- if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level)
- {
- if (mSavedRawDiscardLevel != discard_level
- && mBoostLevel != BOOST_ICON
- && mBoostLevel != BOOST_THUMBNAIL)
- {
- mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents());
- mRawImage->copy(getSavedRawImage());
- }
- else
- {
- mRawImage = getSavedRawImage();
- }
- mRawDiscardLevel = discard_level;
- }
- else
- {
- //force to fetch raw image again if cached raw image is not good enough.
- if(mCachedRawDiscardLevel > discard_level)
- {
- mRawImage = mCachedRawImage;
- mRawDiscardLevel = mCachedRawDiscardLevel;
- }
- else //cached raw image is good enough, copy it.
- {
- if(mCachedRawDiscardLevel != discard_level)
- {
- mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents());
- mRawImage->copy(mCachedRawImage);
- }
- else
- {
- mRawImage = mCachedRawImage;
- }
- mRawDiscardLevel = discard_level;
- }
- }
- mIsRawImageValid = true;
- sRawCount++;
-
- return mRawImage;
-}
-
bool LLViewerFetchedTexture::needsToSaveRawImage()
{
return mForceToSaveRawImage || mSaveRawImage;
@@ -2710,7 +2622,6 @@ void LLViewerFetchedTexture::destroyRawImage()
{
saveRawImage();
}
- setCachedRawImage();
}
mRawImage = NULL;
@@ -2720,151 +2631,6 @@ void LLViewerFetchedTexture::destroyRawImage()
}
}
-//use the mCachedRawImage to (re)generate the gl texture.
-//virtual
-void LLViewerFetchedTexture::switchToCachedImage()
-{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- if(mCachedRawImage.notNull() &&
- !mNeedsCreateTexture) // <--- texture creation is pending, don't step on it
- {
- mRawImage = mCachedRawImage;
-
- if (getComponents() != mRawImage->getComponents())
- {
- // We've changed the number of components, so we need to move any
- // objects using this pool to a different pool.
- mComponents = mRawImage->getComponents();
- mGLTexturep->setComponents(mComponents);
- gTextureList.dirtyImage(this);
- }
-
- mIsRawImageValid = true;
- mRawDiscardLevel = mCachedRawDiscardLevel;
-
- scheduleCreateTexture();
- }
-}
-
-//cache the imageraw forcefully.
-//virtual
-void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)
-{
- if(imageraw != mRawImage.get())
- {
- if (mBoostLevel == LLGLTexture::BOOST_ICON)
- {
- S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS;
- S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS;
- if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)
- {
- mCachedRawImage = new LLImageRaw(expected_width, expected_height, imageraw->getComponents());
- mCachedRawImage->copyScaled(imageraw);
- }
- else
- {
- mCachedRawImage = imageraw;
- }
- }
- else if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL)
- {
- S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS;
- S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS;
- if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)
- {
- mCachedRawImage = new LLImageRaw(expected_width, expected_height, imageraw->getComponents());
- mCachedRawImage->copyScaled(imageraw);
- }
- else
- {
- mCachedRawImage = imageraw;
- }
- }
- else
- {
- mCachedRawImage = imageraw;
- }
- mCachedRawDiscardLevel = discard_level;
- mCachedRawImageReady = true;
- }
-}
-
-void LLViewerFetchedTexture::setCachedRawImage()
-{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- if(mRawImage == mCachedRawImage)
- {
- return;
- }
- if(!mIsRawImageValid)
- {
- return;
- }
-
- if(mCachedRawImageReady)
- {
- return;
- }
-
- if(mCachedRawDiscardLevel < 0 || mCachedRawDiscardLevel > mRawDiscardLevel)
- {
- S32 i = 0;
- S32 w = mRawImage->getWidth();
- S32 h = mRawImage->getHeight();
-
- S32 max_size = MAX_CACHED_RAW_IMAGE_AREA;
- if(LLGLTexture::BOOST_TERRAIN == mBoostLevel)
- {
- max_size = MAX_CACHED_RAW_TERRAIN_IMAGE_AREA;
- }
- if(mForSculpt)
- {
- max_size = MAX_CACHED_RAW_SCULPT_IMAGE_AREA;
- mCachedRawImageReady = !mRawDiscardLevel;
- }
- else
- {
- mCachedRawImageReady = (!mRawDiscardLevel || ((w * h) >= max_size));
- }
-
- while(((w >> i) * (h >> i)) > max_size)
- {
- ++i;
- }
-
- if(i)
- {
- if(!(w >> i) || !(h >> i))
- {
- --i;
- }
-
- {
- //make a duplicate in case somebody else is using this raw image
- mRawImage = mRawImage->scaled(w >> i, h >> i);
- }
- }
- mCachedRawImage = mRawImage;
- mRawDiscardLevel += i;
- mCachedRawDiscardLevel = mRawDiscardLevel;
- }
-}
-
-void LLViewerFetchedTexture::checkCachedRawSculptImage()
-{
- if(mCachedRawImageReady && mCachedRawDiscardLevel > 0)
- {
- if(getDiscardLevel() != 0)
- {
- mCachedRawImageReady = false;
- }
- else if(isForSculptOnly())
- {
- resetTextureStats(); //do not update this image any more.
- }
- }
-}
-
void LLViewerFetchedTexture::saveRawImage()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
@@ -2904,6 +2670,20 @@ void LLViewerFetchedTexture::saveRawImage()
mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents());
}
}
+ else if (mBoostLevel == LLGLTexture::BOOST_SCULPTED)
+ {
+ S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : sMaxSculptRez;
+ S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : sMaxSculptRez;
+ if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)
+ {
+ mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents());
+ mSavedRawImage->copyScaled(mRawImage);
+ }
+ else
+ {
+ mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents());
+ }
+ }
else
{
mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents());
@@ -2949,20 +2729,23 @@ void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, F32 kept_t
{
mForceToSaveRawImage = true;
mDesiredSavedRawDiscardLevel = desired_discard;
+ }
+}
- //copy from the cached raw image if exists.
- if(mCachedRawImage.notNull() && mRawImage.isNull() )
- {
- mRawImage = mCachedRawImage;
- mRawDiscardLevel = mCachedRawDiscardLevel;
-
- saveRawImage();
+void LLViewerFetchedTexture::readbackRawImage()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- mRawImage = NULL;
- mRawDiscardLevel = INVALID_DISCARD_LEVEL;
+ if (mGLTexturep.notNull() && mGLTexturep->getTexName() != 0 && mRawImage.isNull())
+ {
+ mRawImage = new LLImageRaw();
+ if (!mGLTexturep->readBackRaw(-1, mRawImage, false))
+ {
+ mRawImage = nullptr;
}
}
}
+
void LLViewerFetchedTexture::destroySavedRawImage()
{
if(mLastReferencedSavedRawImageTime < mKeptSavedRawImageTime)
@@ -2997,6 +2780,11 @@ LLImageRaw* LLViewerFetchedTexture::getSavedRawImage()
return mSavedRawImage;
}
+const LLImageRaw* LLViewerFetchedTexture::getSavedRawImage() const
+{
+ return mSavedRawImage;
+}
+
bool LLViewerFetchedTexture::hasSavedRawImage() const
{
return mSavedRawImage.notNull();
@@ -3028,7 +2816,7 @@ LLViewerLODTexture::LLViewerLODTexture(const std::string& url, FTType f_type, co
void LLViewerLODTexture::init(bool firstinit)
{
- mTexelsPerImage = 64.f*64.f;
+ mTexelsPerImage = 64*64;
mDiscardVirtualSize = 0.f;
mCalculatedDiscardLevel = -1.f;
}
@@ -3051,6 +2839,8 @@ void LLViewerLODTexture::processTextureStats()
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
updateVirtualSize();
+ bool did_downscale = false;
+
static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes", false);
{ // restrict texture resolution to download based on RenderMaxTextureResolution
@@ -3108,10 +2898,7 @@ void LLViewerLODTexture::processTextureStats()
mDiscardVirtualSize = mMaxVirtualSize;
mCalculatedDiscardLevel = discard_level;
}
- if (mBoostLevel < LLGLTexture::BOOST_SCULPTED)
- {
- discard_level *= sDesiredDiscardScale; // scale (default 1.1f)
- }
+
discard_level = floorf(discard_level);
F32 min_discard = 0.f;
@@ -3137,10 +2924,9 @@ void LLViewerLODTexture::processTextureStats()
//
S32 current_discard = getDiscardLevel();
- if (mBoostLevel < LLGLTexture::BOOST_AVATAR_BAKED &&
- current_discard >= 0)
+ if (mBoostLevel < LLGLTexture::BOOST_AVATAR_BAKED)
{
- if (current_discard < (mDesiredDiscardLevel-1) && !mForceToSaveRawImage)
+ if (current_discard < mDesiredDiscardLevel && !mForceToSaveRawImage)
{ // should scale down
scaleDown();
}
@@ -3160,9 +2946,6 @@ void LLViewerLODTexture::processTextureStats()
mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S8)mDesiredSavedRawDiscardLevel);
}
- // decay max virtual size over time
- mMaxVirtualSize *= 0.8f;
-
// selection manager will immediately reset BOOST_SELECTED but never unsets it
// unset it immediately after we consume it
if (getBoostLevel() == BOOST_SELECTED)
@@ -3171,22 +2954,24 @@ void LLViewerLODTexture::processTextureStats()
}
}
+extern LLGLSLShader gCopyProgram;
+
bool LLViewerLODTexture::scaleDown()
{
- if(hasGLTexture() && mCachedRawDiscardLevel > getDiscardLevel())
+ if (mGLTexturep.isNull() || !mGLTexturep->getHasGLTexture())
{
- switchToCachedImage();
-
- LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName);
- if (tester)
- {
- tester->setStablizingTime();
- }
+ return false;
+ }
- return true;
+ if (!mDownScalePending)
+ {
+ mDownScalePending = true;
+ gTextureList.mDownScaleQueue.push(this);
}
- return false;
+
+ return true;
}
+
//----------------------------------------------------------------------------------------------
//end of LLViewerLODTexture
//----------------------------------------------------------------------------------------------
@@ -3658,7 +3443,19 @@ void LLViewerMediaTexture::setPlaying(bool playing)
for(std::list< LLFace* >::iterator iter = mMediaFaceList.begin(); iter!= mMediaFaceList.end(); ++iter)
{
- switchTexture(LLRender::DIFFUSE_MAP, *iter);
+ LLFace* facep = *iter;
+ const LLTextureEntry* te = facep->getTextureEntry();
+ if (te->getGLTFMaterial())
+ {
+ // PBR material, switch emissive and basecolor
+ switchTexture(LLRender::EMISSIVE_MAP, *iter);
+ switchTexture(LLRender::BASECOLOR_MAP, *iter);
+ }
+ else
+ {
+ // blinn-phong material, switch diffuse map only
+ switchTexture(LLRender::DIFFUSE_MAP, *iter);
+ }
}
}
else //stop playing this media
@@ -4026,8 +3823,8 @@ LLMetricPerformanceTesterWithSession::LLTestSession* LLTexturePipelineTester::lo
}
//time
- F32 start_time = (*log)[label]["StartFetchingTime"].asReal();
- F32 cur_time = (*log)[label]["Time"].asReal();
+ F32 start_time = (F32)(*log)[label]["StartFetchingTime"].asReal();
+ F32 cur_time = (F32)(*log)[label]["Time"].asReal();
if(start_time - start_fetching_time > F_ALMOST_ZERO) //fetching has paused for a while
{
sessionp->mTotalGrayTime += total_gray_time;
@@ -4043,13 +3840,13 @@ LLMetricPerformanceTesterWithSession::LLTestSession* LLTexturePipelineTester::lo
}
else
{
- total_gray_time = (*log)[label]["TotalGrayTime"].asReal();
- total_stablizing_time = (*log)[label]["TotalStablizingTime"].asReal();
+ total_gray_time = (F32)(*log)[label]["TotalGrayTime"].asReal();
+ total_stablizing_time = (F32)(*log)[label]["TotalStablizingTime"].asReal();
- total_loading_sculpties_time = (*log)[label]["EndTimeLoadingSculpties"].asReal() - (*log)[label]["StartTimeLoadingSculpties"].asReal();
+ total_loading_sculpties_time = (F32)(*log)[label]["EndTimeLoadingSculpties"].asReal() - (F32)(*log)[label]["StartTimeLoadingSculpties"].asReal();
if(start_fetching_sculpties_time < 0.f && total_loading_sculpties_time > 0.f)
{
- start_fetching_sculpties_time = (*log)[label]["StartTimeLoadingSculpties"].asReal();
+ start_fetching_sculpties_time = (F32)(*log)[label]["StartTimeLoadingSculpties"].asReal();
}
}
@@ -4065,7 +3862,7 @@ LLMetricPerformanceTesterWithSession::LLTestSession* LLTexturePipelineTester::lo
sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedForLargeImagePerSecond +=
(*log)[label]["TotalBytesBoundForLargeImage"].asInteger();
sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAveragePercentageBytesUsedPerSecond +=
- (*log)[label]["PercentageBytesBound"].asReal();
+ (F32)(*log)[label]["PercentageBytesBound"].asReal();
frame_count++;
if(cur_time - last_time >= 1.0f)
{
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index dc9182bf1b..9046daeab2 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -37,13 +37,11 @@
#include "llmetricperformancetester.h"
#include "httpcommon.h"
#include "workqueue.h"
+#include "gltf/common.h"
#include <map>
#include <list>
-extern const S32Megabytes gMinVideoRam;
-extern const S32Megabytes gMaxVideoRam;
-
class LLFace;
class LLImageGL ;
class LLImageRaw;
@@ -102,7 +100,6 @@ public:
DYNAMIC_TEXTURE,
FETCHED_TEXTURE,
LOD_TEXTURE,
- ATLAS_TEXTURE,
INVALID_TEXTURE_TYPE
};
@@ -117,6 +114,7 @@ protected:
public:
static void initClass();
static void updateClass();
+ static bool isSystemMemoryLow();
LLViewerTexture(bool usemipmaps = true);
LLViewerTexture(const LLUUID& id, bool usemipmaps) ;
@@ -148,8 +146,6 @@ public:
virtual F32 getMaxVirtualSize() ;
- LLFrameTimer* getLastReferencedTimer() {return &mLastReferencedTimer ;}
-
S32 getFullWidth() const { return mFullWidth; }
S32 getFullHeight() const { return mFullHeight; }
/*virtual*/ void setKnownDrawSize(S32 width, S32 height);
@@ -165,8 +161,6 @@ public:
S32 getNumVolumes(U32 channel) const;
const ll_volume_list_t* getVolumeList(U32 channel) const { return &mVolumeList[channel]; }
-
- virtual void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
bool isLargeImage() ;
void setParcelMedia(LLViewerMediaTexture* media) {mParcelMedia = media;}
@@ -174,6 +168,15 @@ public:
LLViewerMediaTexture* getParcelMedia() const { return mParcelMedia;}
/*virtual*/ void updateBindStatsForTester() ;
+
+ struct MaterialEntry
+ {
+ S32 mIndex = LL::GLTF::INVALID_INDEX;
+ std::shared_ptr<LL::GLTF::Asset> mAsset;
+ };
+ typedef std::vector<MaterialEntry> material_list_t;
+ material_list_t mMaterialList; // reverse pointer pointing to LL::GLTF::Materials using this image as texture
+
protected:
void cleanup() ;
void init(bool firstinit) ;
@@ -184,8 +187,6 @@ private:
friend class LLBumpImageList;
friend class LLUIImageList;
- virtual void switchToCachedImage();
-
protected:
friend class LLViewerTextureList;
LLUUID mID;
@@ -194,7 +195,6 @@ protected:
mutable F32 mMaxVirtualSize = 0.f; // The largest virtual size of the image, in pixels - how much data to we need?
mutable S32 mMaxVirtualSizeResetCounter;
mutable S32 mMaxVirtualSizeResetInterval;
- LLFrameTimer mLastReferencedTimer;
ll_face_list_t mFaceList[LLRender::NUM_TEXTURE_CHANNELS]; //reverse pointer pointing to the faces using this image as texture
U32 mNumFaces[LLRender::NUM_TEXTURE_CHANNELS];
@@ -217,7 +217,6 @@ public:
static S32 sAuxCount;
static LLFrameTimer sEvaluationTimer;
static F32 sDesiredDiscardBias;
- static F32 sDesiredDiscardScale;
static S32 sMaxSculptRez ;
static U32 sMinLargeImageSize ;
static U32 sMaxSmallImageSize ;
@@ -337,11 +336,6 @@ public:
void setBoostLevel(S32 level) override;
bool updateFetch();
- bool setDebugFetching(S32 debug_level);
- bool isInDebug() const { return mInDebug; }
-
- void setUnremovable(bool value) { mUnremovable = value; }
- bool isUnremovable() const { return mUnremovable; }
void clearFetchedResults(); //clear all fetched results, for debug use.
@@ -370,17 +364,12 @@ public:
U32 getFetchPriority() const { return mFetchPriority ;}
F32 getDownloadProgress() const {return mDownloadProgress ;}
- LLImageRaw* reloadRawImage(S8 discard_level) ;
void destroyRawImage();
bool needsToSaveRawImage();
const std::string& getUrl() const {return mUrl;}
//---------------
bool isDeleted() ;
- bool isInactive() ;
- bool isDeletionCandidate();
- void setDeletionCandidate() ;
- void setInactive() ;
bool getUseDiscard() const { return mUseMipMaps && !mDontDiscard; }
//---------------
@@ -389,17 +378,20 @@ public:
bool isForSculptOnly() const;
//raw image management
- void checkCachedRawSculptImage() ;
LLImageRaw* getRawImage()const { return mRawImage ;}
S32 getRawImageLevel() const {return mRawDiscardLevel;}
- LLImageRaw* getCachedRawImage() const { return mCachedRawImage ;}
- S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
- bool isCachedRawImageReady() const {return mCachedRawImageReady ;}
bool isRawImageValid()const { return mIsRawImageValid ; }
void forceToSaveRawImage(S32 desired_discard = 0, F32 kept_time = 0.f) ;
- /*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) override;
+
+ // readback the raw image from OpenGL if mRawImage is not valid
+ void readbackRawImage();
+
void destroySavedRawImage() ;
LLImageRaw* getSavedRawImage() ;
+ S32 getSavedRawImageLevel() const {return mSavedRawDiscardLevel; }
+
+ const LLImageRaw* getSavedRawImage() const;
+ const LLImageRaw* getAuxRawImage() const { return mAuxRawImage; }
bool hasSavedRawImage() const ;
F32 getElapsedLastReferencedSavedRawImageTime() const ;
bool isFullyLoaded() const;
@@ -415,8 +407,10 @@ public:
/*virtual*/bool isActiveFetching() override; //is actively in fetching by the fetching pipeline.
+ bool mCreatePending = false; // if true, this is in gTextureList.mCreateTextureList
+ mutable bool mDownScalePending = false; // if true, this is in gTextureList.mDownScaleQueue
+
protected:
- /*virtual*/ void switchToCachedImage() override;
S32 getCurrentDiscardLevelForFetching() ;
void forceToRefetchTexture(S32 desired_discard = 0, F32 kept_time = 60.f);
@@ -425,17 +419,9 @@ private:
void cleanup() ;
void saveRawImage() ;
- void setCachedRawImage() ;
-
- //for atlas
- void resetFaceAtlas() ;
- void invalidateAtlas(bool rebuild_geom) ;
- bool insertToAtlas() ;
private:
bool mFullyLoaded;
- bool mInDebug;
- bool mUnremovable;
bool mInFastCacheList;
bool mForceCallbackFetch;
@@ -497,11 +483,6 @@ protected:
F32 mLastReferencedSavedRawImageTime ;
F32 mKeptSavedRawImageTime ;
- //a small version of the copy of the raw image (<= 64 * 64)
- LLPointer<LLImageRaw> mCachedRawImage;
- S32 mCachedRawDiscardLevel;
- bool mCachedRawImageReady; //the rez of the mCachedRawImage reaches the upper limit.
-
LLHost mTargetHost; // if invalid, just request from agent's simulator
// Timers
@@ -547,9 +528,10 @@ public:
/*virtual*/ void processTextureStats();
bool isUpdateFrozen() ;
+ bool scaleDown();
+
private:
void init(bool firstinit) ;
- bool scaleDown() ;
private:
F32 mDiscardVirtualSize; // Virtual size used to calculate desired discard
@@ -590,6 +572,10 @@ public:
/*virtual*/ void removeFace(U32 ch, LLFace* facep) ;
/*virtual*/ F32 getMaxVirtualSize() ;
+
+ // get the timer that tracks the last time reinit was called
+ LLFrameTimer* getLastReferencedTimer() { return &mLastReferencedTimer; }
+
private:
void switchTexture(U32 ch, LLFace* facep) ;
bool findFaces() ;
@@ -610,6 +596,9 @@ private:
bool mIsPlaying ;
U32 mUpdateVirtualSizeTime ;
+ // tracks last time reinit was called
+ LLFrameTimer mLastReferencedTimer;
+
public:
static void updateClass() ;
static void cleanUpClass() ;
diff --git a/indra/newview/llviewertextureanim.cpp b/indra/newview/llviewertextureanim.cpp
index 238e6830ea..d64026d8a3 100644
--- a/indra/newview/llviewertextureanim.cpp
+++ b/indra/newview/llviewertextureanim.cpp
@@ -217,7 +217,7 @@ S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t,
result |= SCALE;
mScaleS = scale_s = 1.f/mSizeX;
mScaleT = scale_t = 1.f/mSizeY;
- x_frame = fmod(frame_counter, mSizeX);
+ x_frame = fmodf(frame_counter, mSizeX);
y_frame = (S32)(frame_counter / mSizeX);
x_pos = x_frame * scale_s;
y_pos = y_frame * scale_t;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index b90c1868fc..1ac97a20cf 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -70,6 +70,8 @@ S32 LLViewerTextureList::sNumImages = 0;
LLViewerTextureList gTextureList;
+extern LLGLSLShader gCopyProgram;
+
ETexListType get_element_type(S32 priority)
{
return (priority == LLViewerFetchedTexture::BOOST_ICON || priority == LLViewerFetchedTexture::BOOST_THUMBNAIL) ? TEX_LIST_SCALE : TEX_LIST_STANDARD;
@@ -185,13 +187,6 @@ void LLViewerTextureList::doPreloadImages()
image->setAddressMode(LLTexUnit::TAM_CLAMP);
mImagePreloads.insert(image);
}
-
- LLPointer<LLImageRaw> img_blak_square_tex(new LLImageRaw(2, 2, 3));
- memset(img_blak_square_tex->getData(), 0, img_blak_square_tex->getDataSize());
- LLPointer<LLViewerFetchedTexture> img_blak_square(new LLViewerFetchedTexture(img_blak_square_tex, FTT_DEFAULT, false));
- gBlackSquareID = img_blak_square->getID();
- img_blak_square->setUnremovable(true);
- addImage(img_blak_square, TEX_LIST_STANDARD);
}
static std::string get_texture_list_name()
@@ -296,7 +291,7 @@ void LLViewerTextureList::shutdown()
// Write out list of currently loaded textures for precaching on startup
typedef std::set<std::pair<S32,LLViewerFetchedTexture*> > image_area_list_t;
image_area_list_t image_area_list;
- for (image_priority_list_t::iterator iter = mImageList.begin();
+ for (image_list_t::iterator iter = mImageList.begin();
iter != mImageList.end(); ++iter)
{
LLViewerFetchedTexture* image = *iter;
@@ -352,8 +347,11 @@ void LLViewerTextureList::shutdown()
mCallbackList.clear();
// Flush all of the references
- mLoadingStreamList.clear();
- mCreateTextureList.clear();
+ while (!mCreateTextureList.empty())
+ {
+ mCreateTextureList.front()->mCreatePending = false;
+ mCreateTextureList.pop();
+ }
mFastCacheList.clear();
mUUIDMap.clear();
@@ -367,7 +365,7 @@ void LLViewerTextureList::dump()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
LL_INFOS() << "LLViewerTextureList::dump()" << LL_ENDL;
- for (image_priority_list_t::iterator it = mImageList.begin(); it != mImageList.end(); ++it)
+ for (image_list_t::iterator it = mImageList.begin(); it != mImageList.end(); ++it)
{
LLViewerFetchedTexture* image = *it;
@@ -381,15 +379,9 @@ void LLViewerTextureList::dump()
}
}
-void LLViewerTextureList::destroyGL(bool save_state)
-{
- LLImageGL::destroyGL(save_state);
-}
-
-void LLViewerTextureList::restoreGL()
+void LLViewerTextureList::destroyGL()
{
- llassert_always(mInitialized) ;
- LLImageGL::restoreGL();
+ LLImageGL::destroyGL();
}
/* Vertical tab container button image IDs
@@ -726,6 +718,7 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
size_t count = 0;
if (image->isInImageList())
{
+ image->setInImageList(false);
count = mImageList.erase(image) ;
if(count != 1)
{
@@ -762,8 +755,6 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
<< LL_ENDL;
}
}
-
- image->setInImageList(false) ;
}
void LLViewerTextureList::addImage(LLViewerFetchedTexture *new_image, ETexListType tex_type)
@@ -809,15 +800,6 @@ void LLViewerTextureList::deleteImage(LLViewerFetchedTexture *image)
///////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-
-void LLViewerTextureList::dirtyImage(LLViewerFetchedTexture *image)
-{
- mDirtyTextureList.insert(image);
-}
-
-////////////////////////////////////////////////////////////////////////////
-
void LLViewerTextureList::updateImages(F32 max_time)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
@@ -834,7 +816,7 @@ void LLViewerTextureList::updateImages(F32 max_time)
}
cleared = false;
- LLAppViewer::getTextureFetch()->setTextureBandwidth(LLTrace::get_frame_recording().getPeriodMeanPerSec(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED).value());
+ LLAppViewer::getTextureFetch()->setTextureBandwidth((F32)LLTrace::get_frame_recording().getPeriodMeanPerSec(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED).value());
{
using namespace LLStatViewer;
@@ -858,12 +840,6 @@ void LLViewerTextureList::updateImages(F32 max_time)
//handle results from decode threads
updateImagesCreateTextures(remaining_time);
- if (!mDirtyTextureList.empty())
- {
- gPipeline.dirtyPoolObjectTextures(mDirtyTextureList);
- mDirtyTextureList.clear();
- }
-
bool didone = false;
for (image_list_t::iterator iter = mCallbackList.begin();
iter != mCallbackList.end(); )
@@ -895,7 +871,7 @@ void LLViewerTextureList::clearFetchingRequests()
LLAppViewer::getTextureFetch()->deleteAllRequests();
- for (image_priority_list_t::iterator iter = mImageList.begin();
+ for (image_list_t::iterator iter = mImageList.begin();
iter != mImageList.end(); ++iter)
{
LLViewerFetchedTexture* imagep = *iter;
@@ -903,102 +879,90 @@ void LLViewerTextureList::clearFetchingRequests()
}
}
-static void touch_texture(LLViewerFetchedTexture* tex, F32 vsize)
-{
- if (tex)
- {
- tex->addTextureStats(vsize);
- }
-}
-
extern bool gCubeSnapshot;
-void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imagep)
+void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imagep, bool flush_images)
{
- if (imagep->isInDebug() || imagep->isUnremovable())
- {
- //update_counter--;
- return; //is in debug, ignore.
- }
-
llassert(!gCubeSnapshot);
static LLCachedControl<F32> bias_distance_scale(gSavedSettings, "TextureBiasDistanceScale", 1.f);
static LLCachedControl<F32> texture_scale_min(gSavedSettings, "TextureScaleMinAreaFactor", 0.04f);
static LLCachedControl<F32> texture_scale_max(gSavedSettings, "TextureScaleMaxAreaFactor", 25.f);
- LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE
+ if (imagep->getType() == LLViewerTexture::LOD_TEXTURE && imagep->getBoostLevel() == LLViewerTexture::BOOST_NONE)
+ { // reset max virtual size for unboosted LOD_TEXTURES
+ // this is an alternative to decaying mMaxVirtualSize over time
+ // that keeps textures from continously downrezzing and uprezzing in the background
+ imagep->mMaxVirtualSize = 0.f;
+ }
+
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
+ for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
{
- for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
+ for (S32 fi = 0; fi < imagep->getNumFaces(i); ++fi)
{
- for (S32 fi = 0; fi < imagep->getNumFaces(i); ++fi)
+ LLFace* face = (*(imagep->getFaceList(i)))[fi];
+
+ if (face && face->getViewerObject())
{
- LLFace* face = (*(imagep->getFaceList(i)))[fi];
+ F32 radius;
+ F32 cos_angle_to_view_dir;
+ static LLCachedControl<F32> bias_unimportant_threshold(gSavedSettings, "TextureBiasUnimportantFactor", 0.25f);
+ F32 vsize = face->getPixelArea();
+ bool in_frustum = face->calcPixelArea(cos_angle_to_view_dir, radius);
+
+ // Scale desired texture resolution higher or lower depending on texture scale
+ //
+ // Minimum usage examples: a 1024x1024 texture with aplhabet, runing string
+ // shows one letter at a time
+ //
+ // Maximum usage examples: huge chunk of terrain repeats texture
+ S32 te_offset = face->getTEOffset(); // offset is -1 if not inited
+ LLViewerObject* objp = face->getViewerObject();
+ const LLTextureEntry* te = (te_offset < 0 || te_offset >= objp->getNumTEs()) ? nullptr : objp->getTE(te_offset);
+ F32 min_scale = te ? llmin(fabsf(te->getScaleS()), fabsf(te->getScaleT())) : 1.f;
+ min_scale = llclamp(min_scale * min_scale, texture_scale_min(), texture_scale_max());
+ vsize /= min_scale;
+
+ // if bias is > 2, apply to on-screen textures as well
+ bool apply_bias = LLViewerTexture::sDesiredDiscardBias > 2.f;
+
+ // apply bias to off screen objects or objects that are small on screen all the time
+ if (!in_frustum || !face->getDrawable()->isVisible() || face->getImportanceToCamera() < bias_unimportant_threshold)
+ { // further reduce by discard bias when off screen or occluded
+ apply_bias = true;
+ }
- if (face && face->getViewerObject() && face->getTextureEntry())
+ if (apply_bias)
{
- F32 vsize = face->getPixelArea();
-
- // Scale desired texture resolution higher or lower depending on texture scale
- //
- // Minimum usage examples: a 1024x1024 texture with aplhabet, runing string
- // shows one letter at a time
- //
- // Maximum usage examples: huge chunk of terrain repeats texture
- const LLTextureEntry* te = face->getTextureEntry();
- F32 min_scale = te ? llmin(fabsf(te->getScaleS()), fabsf(te->getScaleT())) : 1.f;
- min_scale = llclamp(min_scale*min_scale, texture_scale_min(), texture_scale_max());
-
- vsize /= min_scale;
- vsize /= LLViewerTexture::sDesiredDiscardBias;
- vsize /= llmax(1.f, (LLViewerTexture::sDesiredDiscardBias-1.f) * (1.f + face->getDrawable()->mDistanceWRTCamera * bias_distance_scale));
-
- F32 radius;
- F32 cos_angle_to_view_dir;
- bool in_frustum = face->calcPixelArea(cos_angle_to_view_dir, radius);
- if (!in_frustum || !face->getDrawable()->isVisible())
- { // further reduce by discard bias when off screen or occluded
- vsize /= LLViewerTexture::sDesiredDiscardBias;
- }
- // if a GLTF material is present, ignore that face
- // as far as this texture stats go, but update the GLTF material
- // stats
- LLFetchedGLTFMaterial* mat = te ? (LLFetchedGLTFMaterial*)te->getGLTFRenderMaterial() : nullptr;
- llassert(mat == nullptr || dynamic_cast<LLFetchedGLTFMaterial*>(te->getGLTFRenderMaterial()) != nullptr);
- if (mat)
- {
- touch_texture(mat->mBaseColorTexture, vsize);
- touch_texture(mat->mNormalTexture, vsize);
- touch_texture(mat->mMetallicRoughnessTexture, vsize);
- touch_texture(mat->mEmissiveTexture, vsize);
- }
- else
- {
- imagep->addTextureStats(vsize);
- }
+ F32 bias = powf(4, LLViewerTexture::sDesiredDiscardBias - 1.f);
+ bias = (F32)llround(bias);
+ vsize /= bias;
}
+
+ imagep->addTextureStats(vsize);
}
}
}
- //imagep->setDebugText(llformat("%.3f - %d", sqrtf(imagep->getMaxVirtualSize()), imagep->getBoostLevel()));
+ // make sure to addTextureStats for any spotlights that are using this texture
+ for (S32 vi = 0; vi < imagep->getNumVolumes(LLRender::LIGHT_TEX); ++vi)
+ {
+ LLVOVolume* volume = (*imagep->getVolumeList(LLRender::LIGHT_TEX))[vi];
+ volume->updateSpotLightPriority();
+ }
- F32 lazy_flush_timeout = 30.f; // stop decoding
- F32 max_inactive_time = 20.f; // actually delete
- S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, 1 for local reference
+ F32 max_inactive_time = 20.f; // inactive time before deleting saved raw image
+ S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, and 1 for "entries" in updateImagesFetchTextures
//
// Flush formatted images using a lazy flush
//
S32 num_refs = imagep->getNumRefs();
- if (num_refs == min_refs)
+ if (num_refs <= min_refs && flush_images)
{
- if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > lazy_flush_timeout)
- {
- // Remove the unused image from the image list
- deleteImage(imagep);
- imagep = NULL; // should destroy the image
- }
+ // Remove the unused image from the image list
+ deleteImage(imagep);
return;
}
else
@@ -1015,26 +979,6 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
{
return;
}
- else if (imagep->isDeletionCandidate())
- {
- imagep->destroyTexture();
- return;
- }
- else if (imagep->isInactive())
- {
- if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > max_inactive_time)
- {
- imagep->setDeletionCandidate();
- }
- return;
- }
- else
- {
- imagep->getLastReferencedTimer()->reset();
-
- //reset texture state.
- imagep->setInactive();
- }
}
if (!imagep->isInImageList())
@@ -1049,20 +993,6 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
imagep->processTextureStats();
}
-void LLViewerTextureList::setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level)
-{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- if(!tex->setDebugFetching(debug_level))
- {
- return;
- }
-
- const F32 DEBUG_PRIORITY = 100000.f;
- removeImageFromList(tex);
- tex->mMaxVirtualSize = DEBUG_PRIORITY;
- addImageToList(tex);
-}
-
F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
@@ -1074,22 +1004,65 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
//
LLTimer create_timer;
- image_list_t::iterator enditer = mCreateTextureList.begin();
- for (image_list_t::iterator iter = mCreateTextureList.begin();
- iter != mCreateTextureList.end();)
+
+ if (!mDownScaleQueue.empty() && gPipeline.mDownResMap.isComplete())
{
- image_list_t::iterator curiter = iter++;
- enditer = iter;
- LLViewerFetchedTexture *imagep = *curiter;
+ // just in case we downres textures, bind downresmap and copy program
+ gPipeline.mDownResMap.bindTarget();
+ gCopyProgram.bind();
+ gPipeline.mScreenTriangleVB->setBuffer();
+
+ // give time to downscaling first -- if mDownScaleQueue is not empty, we're running out of memory and need
+ // to free up memory by discarding off screen textures quickly
+
+ // do at least 5 and make sure we don't get too far behind even if it violates
+ // the time limit. If we don't downscale quickly the viewer will hit swap and may
+ // freeze.
+ S32 min_count = (S32)mCreateTextureList.size() / 20 + 5;
+
+ while (!mDownScaleQueue.empty())
+ {
+ LLViewerFetchedTexture* image = mDownScaleQueue.front();
+ llassert(image->mDownScalePending);
+
+ LLImageGL* img = image->getGLTexture();
+ if (img && img->getHasGLTexture())
+ {
+ img->scaleDown(image->getDesiredDiscardLevel());
+ }
+
+ image->mDownScalePending = false;
+ mDownScaleQueue.pop();
+
+ if (create_timer.getElapsedTimeF32() > max_time && --min_count <= 0)
+ {
+ break;
+ }
+ }
+
+ gCopyProgram.unbind();
+ gPipeline.mDownResMap.flush();
+ }
+
+ // do at least 5 and make sure we don't get too far behind even if it violates
+ // the time limit. Textures pending creation have a copy of their texture data
+ // in system memory, so we don't want to let them pile up.
+ S32 min_count = (S32) mCreateTextureList.size() / 20 + 5;
+
+ while (!mCreateTextureList.empty())
+ {
+ LLViewerFetchedTexture *imagep = mCreateTextureList.front();
+ llassert(imagep->mCreatePending);
imagep->createTexture();
imagep->postCreateTexture();
+ imagep->mCreatePending = false;
+ mCreateTextureList.pop();
- if (create_timer.getElapsedTimeF32() > max_time)
+ if (create_timer.getElapsedTimeF32() > max_time && --min_count <= 0)
{
break;
}
}
- mCreateTextureList.erase(mCreateTextureList.begin(), enditer);
return create_timer.getElapsedTimeF32();
}
@@ -1123,18 +1096,12 @@ F32 LLViewerTextureList::updateImagesLoadingFastCache(F32 max_time)
void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- if(!imagep)
+ if(!imagep || gCubeSnapshot)
{
return ;
}
- if(imagep->isInImageList())
- {
- removeImageFromList(imagep);
- }
imagep->processTextureStats();
- imagep->sMaxVirtualSize = LLViewerFetchedTexture::sMaxVirtualSize;
- addImageToList(imagep);
return ;
}
@@ -1142,18 +1109,22 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)
F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
+
typedef std::vector<LLPointer<LLViewerFetchedTexture> > entries_list_t;
entries_list_t entries;
// update N textures at beginning of mImageList
U32 update_count = 0;
static const S32 MIN_UPDATE_COUNT = gSavedSettings.getS32("TextureFetchUpdateMinCount"); // default: 32
- // WIP -- dumb code here
+
+ // NOTE: a texture may be deleted as a side effect of some of these updates
+ // Deletion rules check ref count, so be careful not to hold any LLPointer references to the textures here other than the one in entries.
+
//update MIN_UPDATE_COUNT or 5% of other textures, whichever is greater
update_count = llmax((U32) MIN_UPDATE_COUNT, (U32) mUUIDMap.size()/20);
update_count = llmin(update_count, (U32) mUUIDMap.size());
- {
+ { // copy entries out of UUID map to avoid iterator invalidation from deletion inside updateImageDecodeProiroty or updateFetch below
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vtluift - copy");
// copy entries out of UUID map for updating
@@ -1176,30 +1147,22 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
LLTimer timer;
- LLPointer<LLViewerTexture> last_imagep = nullptr;
-
for (auto& imagep : entries)
{
- if (imagep->getNumRefs() > 1) // make sure this image hasn't been deleted before attempting to update (may happen as a side effect of some other image updating)
+ mLastUpdateKey = LLTextureKey(imagep->getID(), (ETexListType)imagep->getTextureListType());
+ if (imagep->getNumRefs() > 1) // make sure this image hasn't been deleted before attempting to update (may happen as a side effect of some other image updating)
{
updateImageDecodePriority(imagep);
imagep->updateFetch();
}
- last_imagep = imagep;
-
if (timer.getElapsedTimeF32() > max_time)
{
break;
}
}
- if (last_imagep)
- {
- mLastUpdateKey = LLTextureKey(last_imagep->getID(), (ETexListType)last_imagep->getTextureListType());
- }
-
return timer.getElapsedTimeF32();
}
@@ -1208,7 +1171,7 @@ void LLViewerTextureList::updateImagesUpdateStats()
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
if (mForceResetTextureStats)
{
- for (image_priority_list_t::iterator iter = mImageList.begin();
+ for (image_list_t::iterator iter = mImageList.begin();
iter != mImageList.end(); )
{
LLViewerFetchedTexture* imagep = *iter++;
@@ -1228,7 +1191,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
// Update texture stats and priorities
std::vector<LLPointer<LLViewerFetchedTexture> > image_list;
- for (image_priority_list_t::iterator iter = mImageList.begin();
+ for (image_list_t::iterator iter = mImageList.begin();
iter != mImageList.end(); )
{
LLViewerFetchedTexture* imagep = *iter++;
@@ -1248,7 +1211,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
image_list.clear();
// Update fetch (decode)
- for (image_priority_list_t::iterator iter = mImageList.begin();
+ for (image_list_t::iterator iter = mImageList.begin();
iter != mImageList.end(); )
{
LLViewerFetchedTexture* imagep = *iter++;
@@ -1275,7 +1238,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
}
}
// Update fetch again
- for (image_priority_list_t::iterator iter = mImageList.begin();
+ for (image_list_t::iterator iter = mImageList.begin();
iter != mImageList.end(); )
{
LLViewerFetchedTexture* imagep = *iter++;
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index e4ebb7b0e8..7c7112f4cf 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -33,7 +33,7 @@
#include "llviewertexture.h"
#include "llui.h"
#include <list>
-#include <set>
+#include <unordered_set>
#include "lluiimage.h"
const U32 LL_IMAGE_REZ_LOSSLESS_CUTOFF = 128;
@@ -115,16 +115,13 @@ public:
void init();
void shutdown();
void dump();
- void destroyGL(bool save_state = true);
- void restoreGL();
+ void destroyGL();
bool isInitialized() const {return mInitialized;}
void findTexturesByID(const LLUUID &image_id, std::vector<LLViewerFetchedTexture*> &output);
LLViewerFetchedTexture *findImage(const LLUUID &image_id, ETexListType tex_type);
LLViewerFetchedTexture *findImage(const LLTextureKey &search_key);
- void dirtyImage(LLViewerFetchedTexture *image);
-
// Using image stats, determine what images are necessary, and perform image updates.
void updateImages(F32 max_time);
void forceImmediateUpdate(LLViewerFetchedTexture* imagep) ;
@@ -143,14 +140,14 @@ public:
void doPrefetchImages();
void clearFetchingRequests();
- void setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level);
-private:
// do some book keeping on the specified texture
// - updates decode priority
// - updates desired discard level
// - cleans up textures that haven't been referenced in awhile
- void updateImageDecodePriority(LLViewerFetchedTexture* imagep);
+ void updateImageDecodePriority(LLViewerFetchedTexture* imagep, bool flush_images = true);
+
+private:
F32 updateImagesCreateTextures(F32 max_time);
F32 updateImagesFetchTextures(F32 max_time);
void updateImagesUpdateStats();
@@ -188,7 +185,7 @@ private:
LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
- LLGLenum primary_format = 0,
+ LLGLenum primary_format = 0,
const LLUUID& force_id = LLUUID::null
);
@@ -211,27 +208,33 @@ private:
{ return getImage(image_id, f_type, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); }
public:
- typedef std::set<LLPointer<LLViewerFetchedTexture> > image_list_t;
- image_list_t mLoadingStreamList;
- image_list_t mCreateTextureList;
+ typedef std::unordered_set<LLPointer<LLViewerFetchedTexture> > image_list_t;
+ typedef std::queue<LLPointer<LLViewerFetchedTexture> > image_queue_t;
+
+ // images that have been loaded but are waiting to be uploaded to GL
+ image_queue_t mCreateTextureList;
+
+ // images that must be downscaled quickly so we don't run out of memory
+ image_queue_t mDownScaleQueue;
+
image_list_t mCallbackList;
image_list_t mFastCacheList;
- // Note: just raw pointers because they are never referenced, just compared against
- std::set<LLViewerFetchedTexture*> mDirtyTextureList;
-
bool mForceResetTextureStats;
+ // to make "for (auto& imagep : gTextureList)" work
+ const image_list_t::const_iterator begin() const { return mImageList.cbegin(); }
+ const image_list_t::const_iterator end() const { return mImageList.cend(); }
+
private:
typedef std::map< LLTextureKey, LLPointer<LLViewerFetchedTexture> > uuid_map_t;
uuid_map_t mUUIDMap;
LLTextureKey mLastUpdateKey;
- typedef std::set < LLPointer<LLViewerFetchedTexture> > image_priority_list_t;
- image_priority_list_t mImageList;
+ image_list_t mImageList;
// simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon
- std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads;
+ std::unordered_set<LLPointer<LLViewerFetchedTexture> > mImagePreloads;
bool mInitialized ;
LLFrameTimer mForceDecodeTimer;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 48439765e4..8ea8fbf905 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -741,18 +741,16 @@ public:
if (gSavedSettings.getBOOL("DebugShowAvatarRenderInfo"))
{
std::map<std::string, LLVOAvatar*> sorted_avs;
-
- std::vector<LLCharacter*>::iterator sort_iter = LLCharacter::sInstances.begin();
- while (sort_iter != LLCharacter::sInstances.end())
{
- LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*sort_iter);
- if (avatar &&
- !avatar->isDead()) // Not dead yet
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- // Stuff into a sorted map so the display is ordered
- sorted_avs[avatar->getFullname()] = avatar;
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead()) // Not dead yet
+ {
+ // Stuff into a sorted map so the display is ordered
+ sorted_avs[avatar->getFullname()] = avatar;
+ }
}
- sort_iter++;
}
std::string trunc_name;
@@ -805,8 +803,8 @@ public:
LLCoordGL coord = gViewerWindow->getCurrentMouse();
// Convert x,y to raw pixel coords
- S32 x_raw = llround(coord.mX * gViewerWindow->getWindowWidthRaw() / (F32) gViewerWindow->getWindowWidthScaled());
- S32 y_raw = llround(coord.mY * gViewerWindow->getWindowHeightRaw() / (F32) gViewerWindow->getWindowHeightScaled());
+ S32 x_raw = (S32)llround(coord.mX * gViewerWindow->getWindowWidthRaw() / (F32) gViewerWindow->getWindowWidthScaled());
+ S32 y_raw = (S32)llround(coord.mY * gViewerWindow->getWindowHeightRaw() / (F32) gViewerWindow->getWindowHeightScaled());
glReadPixels(x_raw, y_raw, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color);
addText(xpos, ypos, llformat("Pixel <%1d, %1d> R:%1d G:%1d B:%1d A:%1d", x_raw, y_raw, color[0], color[1], color[2], color[3]));
@@ -1827,10 +1825,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)
mToolStored( NULL ),
mHideCursorPermanent( false ),
mCursorHidden(false),
- mIgnoreActivate( false ),
mResDirty(false),
mStatesDirty(false),
- mCurrResolutionIndex(0),
mProgressView(NULL)
{
// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
@@ -2068,6 +2064,9 @@ void LLViewerWindow::initBase()
mPopupView = main_view->getChild<LLPopupView>("popup_holder");
mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle();
mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle();
+ mStatusBarContainer = main_view->getChild<LLPanel>("status_bar_container");
+ mNavBarContainer = mStatusBarContainer->getChild<LLView>("nav_bar_container");
+ mTopInfoContainer = main_view->getChild<LLPanel>("topinfo_bar_container");
// Create the toolbar view
// Get a pointer to the toolbar view holder
@@ -2083,6 +2082,8 @@ void LLViewerWindow::initBase()
// Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI())
gToolBarView->setVisible(false);
+ mFloaterSnapRegion = gToolBarView->getChild<LLView>("floater_snap_region");
+ mChicletContainer = gToolBarView->getChild<LLPanel>("chiclet_container");
// Constrain floaters to inside the menu and status bar regions.
gFloaterView = main_view->getChild<LLFloaterView>("Floater View");
for (S32 i = 0; i < LLToolBarEnums::TOOLBAR_COUNT; ++i)
@@ -2093,7 +2094,7 @@ void LLViewerWindow::initBase()
toolbarp->getCenterLayoutPanel()->setReshapeCallback(boost::bind(&LLFloaterView::setToolbarRect, gFloaterView, _1, _2));
}
}
- gFloaterView->setFloaterSnapView(main_view->getChild<LLView>("floater_snap_region")->getHandle());
+ gFloaterView->setFloaterSnapView(mFloaterSnapRegion->getHandle());
gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View");
const F32 CHAT_PERSIST_TIME = 20.f;
@@ -2159,12 +2160,11 @@ void LLViewerWindow::initWorldUI()
if (!gNonInteractive)
{
- LLPanel* chiclet_container = getRootView()->getChild<LLPanel>("chiclet_container");
LLChicletBar* chiclet_bar = LLChicletBar::getInstance();
- chiclet_bar->setShape(chiclet_container->getLocalRect());
+ chiclet_bar->setShape(mChicletContainer->getLocalRect());
chiclet_bar->setFollowsAll();
- chiclet_container->addChild(chiclet_bar);
- chiclet_container->setVisible(true);
+ mChicletContainer->addChild(chiclet_bar);
+ mChicletContainer->setVisible(true);
}
LLRect morph_view_rect = full_window;
@@ -2189,30 +2189,25 @@ void LLViewerWindow::initWorldUI()
if (!gStatusBar)
{
// Status bar
- LLPanel* status_bar_container = getRootView()->getChild<LLPanel>("status_bar_container");
- gStatusBar = new LLStatusBar(status_bar_container->getLocalRect());
+ gStatusBar = new LLStatusBar(mStatusBarContainer->getLocalRect());
gStatusBar->setFollows(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_RIGHT);
- gStatusBar->setShape(status_bar_container->getLocalRect());
+ gStatusBar->setShape(mStatusBarContainer->getLocalRect());
// sync bg color with menu bar
- gStatusBar->setBackgroundColor(gMenuBarView->getBackgroundColor().get());
+ gStatusBar->setBackgroundColor(gMenuBarView->getBackgroundColor());
// add InBack so that gStatusBar won't be drawn over menu
- status_bar_container->addChildInBack(gStatusBar, 2/*tab order, after menu*/);
- status_bar_container->setVisible(true);
+ mStatusBarContainer->addChildInBack(gStatusBar, 2/*tab order, after menu*/);
+ mStatusBarContainer->setVisible(true);
// Navigation bar
- LLView* nav_bar_container = getRootView()->getChild<LLView>("nav_bar_container");
-
- navbar->setShape(nav_bar_container->getLocalRect());
- navbar->setBackgroundColor(gMenuBarView->getBackgroundColor().get());
- nav_bar_container->addChild(navbar);
- nav_bar_container->setVisible(true);
+ navbar->setShape(mNavBarContainer->getLocalRect());
+ navbar->setBackgroundColor(gMenuBarView->getBackgroundColor());
+ mNavBarContainer->addChild(navbar);
+ mNavBarContainer->setVisible(true);
}
else
{
- LLPanel* status_bar_container = getRootView()->getChild<LLPanel>("status_bar_container");
- LLView* nav_bar_container = getRootView()->getChild<LLView>("nav_bar_container");
- status_bar_container->setVisible(true);
- nav_bar_container->setVisible(true);
+ mStatusBarContainer->setVisible(true);
+ mNavBarContainer->setVisible(true);
}
if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel"))
@@ -2226,13 +2221,11 @@ void LLViewerWindow::initWorldUI()
// Top Info bar
- LLPanel* topinfo_bar_container = getRootView()->getChild<LLPanel>("topinfo_bar_container");
LLPanelTopInfoBar* topinfo_bar = LLPanelTopInfoBar::getInstance();
+ topinfo_bar->setShape(mTopInfoContainer->getLocalRect());
- topinfo_bar->setShape(topinfo_bar_container->getLocalRect());
-
- topinfo_bar_container->addChild(topinfo_bar);
- topinfo_bar_container->setVisible(true);
+ mTopInfoContainer->addChild(topinfo_bar);
+ mTopInfoContainer->setVisible(true);
if (!gSavedSettings.getBOOL("ShowMiniLocationPanel"))
{
@@ -2252,7 +2245,7 @@ void LLViewerWindow::initWorldUI()
getRootView()->sendChildToBack(gHUDView);
}
- LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container");
+ LLPanel* panel_ssf_container = gToolBarView->getChild<LLPanel>("state_management_buttons_container");
LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance();
panel_ssf_container->addChild(panel_stand_stop_flying);
@@ -2402,7 +2395,7 @@ void LLViewerWindow::shutdownGL()
LLSelectMgr::getInstance()->cleanup();
LL_INFOS() << "Stopping GL during shutdown" << LL_ENDL;
- stopGL(false);
+ stopGL();
stop_glerror();
gGL.shutdown();
@@ -2575,19 +2568,18 @@ void LLViewerWindow::setNormalControlsVisible( bool visible )
gStatusBar->setEnabled( visible );
}
- LLNavigationBar* navbarp = LLUI::getInstance()->getRootView()->findChild<LLNavigationBar>("navigation_bar");
- if (navbarp)
+ if (mNavBarContainer)
{
// when it's time to show navigation bar we need to ensure that the user wants to see it
// i.e. ShowNavbarNavigationPanel option is true
- navbarp->setVisible( visible && gSavedSettings.getBOOL("ShowNavbarNavigationPanel") );
+ mNavBarContainer->setVisible( visible && gSavedSettings.getBOOL("ShowNavbarNavigationPanel") );
}
}
void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)
{
LLSD args;
- LLColor4 new_bg_color;
+ LLUIColor new_bg_color;
// god more important than project, proj more important than grid
if ( god_mode )
@@ -2677,7 +2669,7 @@ void LLViewerWindow::draw()
//S32 screen_x, screen_y;
- if (!gSavedSettings.getBOOL("RenderUIBuffer"))
+ if (!LLPipeline::RenderUIBuffer)
{
LLView::sDirtyRect = getWindowRectScaled();
}
@@ -4189,15 +4181,17 @@ void LLViewerWindow::renderSelections( bool for_gl_pick, bool pick_parcel_walls,
}
}
}
- if (selection->getSelectType() == SELECT_TYPE_HUD && selection->getObjectCount())
- {
- gGL.matrixMode(LLRender::MM_PROJECTION);
- gGL.popMatrix();
+ }
- gGL.matrixMode(LLRender::MM_MODELVIEW);
- gGL.popMatrix();
- stop_glerror();
- }
+ // un-setup HUD render
+ if (selection->getSelectType() == SELECT_TYPE_HUD && selection->getObjectCount())
+ {
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
+ stop_glerror();
}
}
}
@@ -4481,8 +4475,8 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const
F32 fov = LLViewerCamera::getInstance()->getView();
// find world view center in scaled ui coordinates
- F32 center_x = getWorldViewRectScaled().getCenterX();
- F32 center_y = getWorldViewRectScaled().getCenterY();
+ F32 center_x = (F32)getWorldViewRectScaled().getCenterX();
+ F32 center_y = (F32)getWorldViewRectScaled().getCenterY();
// calculate pixel distance to screen
F32 distance = ((F32)getWorldViewHeightScaled() * 0.5f) / (tan(fov / 2.f));
@@ -4507,8 +4501,8 @@ LLVector3 LLViewerWindow::mousePointHUD(const S32 x, const S32 y) const
S32 height = getWorldViewHeightScaled();
// find world view center
- F32 center_x = getWorldViewRectScaled().getCenterX();
- F32 center_y = getWorldViewRectScaled().getCenterY();
+ F32 center_x = (F32)getWorldViewRectScaled().getCenterX();
+ F32 center_y = (F32)getWorldViewRectScaled().getCenterY();
// remap with uniform scale (1/height) so that top is -0.5, bottom is +0.5
F32 hud_x = -((F32)x - center_x) / height;
@@ -4530,8 +4524,8 @@ LLVector3 LLViewerWindow::mouseDirectionCamera(const S32 x, const S32 y) const
S32 width = getWorldViewWidthScaled();
// find world view center
- F32 center_x = getWorldViewRectScaled().getCenterX();
- F32 center_y = getWorldViewRectScaled().getCenterY();
+ F32 center_x = (F32)getWorldViewRectScaled().getCenterX();
+ F32 center_y = (F32)getWorldViewRectScaled().getCenterY();
// calculate click point relative to middle of screen
F32 click_x = (((F32)x - center_x) / (F32)width) * fov_width * -1.f;
@@ -4779,7 +4773,7 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
args["NEED_MEMORY"] = needM_bytes_string;
std::string freeM_bytes_string;
- LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (b_space.free) >> 10);
+ LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (S32)(b_space.free >> 10));
args["FREE_MEMORY"] = freeM_bytes_string;
LLNotificationsUtil::add("SnapshotToComputerFailed", args);
@@ -5625,7 +5619,7 @@ void LLViewerWindow::setup3DRender()
void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_UI
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset;
gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset;
gGLViewport[2] = mWorldViewRectRaw.getWidth();
@@ -5715,7 +5709,7 @@ void LLViewerWindow::dumpState()
<< LL_ENDL;
}
-void LLViewerWindow::stopGL(bool save_state)
+void LLViewerWindow::stopGL()
{
//Note: --bao
//if not necessary, do not change the order of the function calls in this function.
@@ -5761,7 +5755,7 @@ void LLViewerWindow::stopGL(bool save_state)
gPostProcess->invalidate();
}
- gTextureList.destroyGL(save_state);
+ gTextureList.destroyGL();
stop_glerror();
gGLManager.mIsDisabled = true;
@@ -5778,6 +5772,14 @@ void LLViewerWindow::stopGL(bool save_state)
void LLViewerWindow::restoreGL(const std::string& progress_message)
{
+ llassert(false);
+ // DEPRECATED -- this is left over from when we would completely destroy and restore a GL context
+ // when switching from windowed to fullscreen. None of this machinery has been exercised in years
+ // and is unreliable. If we ever *do* have another use case where completely unloading and reloading
+ // everthing is necessary, requiring a viewer restart for that operation is a fine thing to do.
+ // -- davep
+
+
//Note: --bao
//if not necessary, do not change the order of the function calls in this function.
//if change something, make sure it will not break anything.
@@ -5790,8 +5792,6 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)
initGLDefaults();
LLGLState::restoreGL();
- gTextureList.restoreGL();
-
// for future support of non-square pixels, and fonts that are properly stretched
//LLFontGL::destroyDefaultFonts();
initFonts();
@@ -5867,122 +5867,6 @@ void LLViewerWindow::checkSettings()
}
}
-void LLViewerWindow::restartDisplay(bool show_progress_bar)
-{
- LL_INFOS() << "Restaring GL" << LL_ENDL;
- stopGL();
- if (show_progress_bar)
- {
- restoreGL(LLTrans::getString("ProgressChangingResolution"));
- }
- else
- {
- restoreGL();
- }
-}
-
-bool LLViewerWindow::changeDisplaySettings(LLCoordScreen size, bool enable_vsync, bool show_progress_bar)
-{
- //bool was_maximized = gSavedSettings.getBOOL("WindowMaximized");
-
- //gResizeScreenTexture = true;
-
-
- //U32 fsaa = gSavedSettings.getU32("RenderFSAASamples");
- //U32 old_fsaa = mWindow->getFSAASamples();
-
- // if not maximized, use the request size
- if (!mWindow->getMaximized())
- {
- mWindow->setSize(size);
- }
-
- //if (fsaa == old_fsaa)
- {
- return true;
- }
-
-/*
-
- // Close floaters that don't handle settings change
- LLFloaterReg::hideInstance("snapshot");
-
- bool result_first_try = false;
- bool result_second_try = false;
-
- LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus();
- send_agent_pause();
- LL_INFOS() << "Stopping GL during changeDisplaySettings" << LL_ENDL;
- stopGL();
- mIgnoreActivate = true;
- LLCoordScreen old_size;
- LLCoordScreen old_pos;
- mWindow->getSize(&old_size);
-
- //mWindow->setFSAASamples(fsaa);
-
- result_first_try = mWindow->switchContext(false, size, disable_vsync);
- if (!result_first_try)
- {
- // try to switch back
- //mWindow->setFSAASamples(old_fsaa);
- result_second_try = mWindow->switchContext(false, old_size, disable_vsync);
-
- if (!result_second_try)
- {
- // we are stuck...try once again with a minimal resolution?
- send_agent_resume();
- mIgnoreActivate = false;
- return false;
- }
- }
- send_agent_resume();
-
- LL_INFOS() << "Restoring GL during resolution change" << LL_ENDL;
- if (show_progress_bar)
- {
- restoreGL(LLTrans::getString("ProgressChangingResolution"));
- }
- else
- {
- restoreGL();
- }
-
- if (!result_first_try)
- {
- LLSD args;
- args["RESX"] = llformat("%d",size.mX);
- args["RESY"] = llformat("%d",size.mY);
- LLNotificationsUtil::add("ResolutionSwitchFail", args);
- size = old_size; // for reshape below
- }
-
- bool success = result_first_try || result_second_try;
-
- if (success)
- {
- // maximize window if was maximized, else reposition
- if (was_maximized)
- {
- mWindow->maximize();
- }
- else
- {
- S32 windowX = gSavedSettings.getS32("WindowX");
- S32 windowY = gSavedSettings.getS32("WindowY");
-
- mWindow->setPosition(LLCoordScreen ( windowX, windowY ) );
- }
- }
-
- mIgnoreActivate = false;
- gFocusMgr.setKeyboardFocus(keyboard_focus);
-
- return success;
-
- */
-}
-
F32 LLViewerWindow::getWorldViewAspectRatio() const
{
F32 world_aspect = (F32)mWorldViewRectRaw.getWidth() / (F32)mWorldViewRectRaw.getHeight();
@@ -6066,23 +5950,20 @@ LLRect LLViewerWindow::getChatConsoleRect()
void LLViewerWindow::reshapeStatusBarContainer()
{
- LLPanel* status_bar_container = getRootView()->getChild<LLPanel>("status_bar_container");
- LLView* nav_bar_container = getRootView()->getChild<LLView>("nav_bar_container");
-
- S32 new_height = status_bar_container->getRect().getHeight();
- S32 new_width = status_bar_container->getRect().getWidth();
+ S32 new_height = mStatusBarContainer->getRect().getHeight();
+ S32 new_width = mStatusBarContainer->getRect().getWidth();
if (gSavedSettings.getBOOL("ShowNavbarNavigationPanel"))
{
// Navigation bar is outside visible area, expand status_bar_container to show it
- new_height += nav_bar_container->getRect().getHeight();
+ new_height += mNavBarContainer->getRect().getHeight();
}
else
{
// collapse status_bar_container
- new_height -= nav_bar_container->getRect().getHeight();
+ new_height -= mNavBarContainer->getRect().getHeight();
}
- status_bar_container->reshape(new_width, new_height, true);
+ mStatusBarContainer->reshape(new_width, new_height, true);
}
void LLViewerWindow::resetStatusBarContainer()
@@ -6091,12 +5972,10 @@ void LLViewerWindow::resetStatusBarContainer()
if (gSavedSettings.getBOOL("ShowNavbarNavigationPanel") || navbar->getVisible())
{
// was previously showing navigation bar
- LLView* nav_bar_container = getRootView()->getChild<LLView>("nav_bar_container");
- LLPanel* status_bar_container = getRootView()->getChild<LLPanel>("status_bar_container");
- S32 new_height = status_bar_container->getRect().getHeight();
- S32 new_width = status_bar_container->getRect().getWidth();
- new_height -= nav_bar_container->getRect().getHeight();
- status_bar_container->reshape(new_width, new_height, true);
+ S32 new_height = mStatusBarContainer->getRect().getHeight();
+ S32 new_width = mStatusBarContainer->getRect().getWidth();
+ new_height -= mNavBarContainer->getRect().getHeight();
+ mStatusBarContainer->reshape(new_width, new_height, true);
}
}
//----------------------------------------------------------------------------
@@ -6123,7 +6002,7 @@ void LLViewerWindow::setUIVisibility(bool visible)
LLNavigationBar::getInstance()->setVisible(visible ? gSavedSettings.getBOOL("ShowNavbarNavigationPanel") : false);
LLPanelTopInfoBar::getInstance()->setVisible(visible? gSavedSettings.getBOOL("ShowMiniLocationPanel") : false);
- mRootView->getChildView("status_bar_container")->setVisible(visible);
+ mStatusBarContainer->setVisible(visible);
}
bool LLViewerWindow::getUIVisibility()
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 4a6b901b33..1b995ea650 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -50,7 +50,6 @@
#include <boost/function.hpp>
#include <boost/signals2.hpp>
-#include <boost/scoped_ptr.hpp>
class LLView;
class LLViewerObject;
@@ -455,9 +454,7 @@ public:
// handle shutting down GL and bringing it back up
void requestResolutionUpdate();
void checkSettings();
- void restartDisplay(bool show_progress_bar);
- bool changeDisplaySettings(LLCoordScreen size, bool enable_vsync, bool show_progress_bar);
- bool getIgnoreDestroyWindow() { return mIgnoreActivate; }
+
F32 getWorldViewAspectRatio() const;
const LLVector2& getDisplayScale() const { return mDisplayScale; }
void calcDisplayScale();
@@ -465,13 +462,16 @@ public:
static std::string getLastSnapshotDir();
+ LLView* getFloaterSnapRegion() { return mFloaterSnapRegion; }
+ LLPanel* getChicletContainer() { return mChicletContainer; }
+
private:
bool shouldShowToolTipFor(LLMouseHandler *mh);
void switchToolByMask(MASK mask);
void destroyWindow();
void drawMouselookInstructions();
- void stopGL(bool save_state = true);
+ void stopGL();
void restoreGL(const std::string& progress_message = LLStringUtil::null);
void initFonts(F32 zoom_factor = 1.f);
void schedulePick(LLPickInfo& pick_info);
@@ -493,6 +493,11 @@ private:
LLRect mWorldViewRectRaw; // area of screen for 3D world
LLRect mWorldViewRectScaled; // area of screen for 3D world scaled by UI size
LLRootView* mRootView; // a view of size mWindowRectRaw, containing all child views
+ LLView* mFloaterSnapRegion = nullptr;
+ LLView* mNavBarContainer = nullptr;
+ LLPanel* mStatusBarContainer = nullptr;
+ LLPanel* mChicletContainer = nullptr;
+ LLPanel* mTopInfoContainer = nullptr;
LLVector2 mDisplayScale;
LLCoordGL mCurrentMousePoint; // last mouse position in GL coords
@@ -528,8 +533,6 @@ private:
std::string mOverlayTitle; // Used for special titles such as "Second Life - Special E3 2003 Beta"
- bool mIgnoreActivate;
-
std::string mInitAlert; // Window / GL initialization requires an alert
LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world
@@ -542,7 +545,6 @@ private:
bool mResDirty;
bool mStatesDirty;
- U32 mCurrResolutionIndex;
std::unique_ptr<LLWindowListener> mWindowListener;
std::unique_ptr<LLViewerWindowListener> mViewerWindowListener;
diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp
index ba255f2b24..077e6e6cb1 100644
--- a/indra/newview/llvlcomposition.cpp
+++ b/indra/newview/llvlcomposition.cpp
@@ -312,12 +312,23 @@ bool LLTerrainMaterials::makeMaterialsReady(bool boost, bool strict)
return one_ready;
}
+LLViewerTexture* LLTerrainMaterials::getPaintMap()
+{
+ return mPaintMap.get();
+}
+
+void LLTerrainMaterials::setPaintMap(LLViewerTexture* paint_map)
+{
+ llassert(!paint_map || mPaintType == TERRAIN_PAINT_TYPE_PBR_PAINTMAP);
+ mPaintMap = paint_map;
+}
+
// Boost the texture loading priority
// Return true when ready to use (i.e. texture is sufficiently loaded)
// static
bool LLTerrainMaterials::makeTextureReady(LLPointer<LLViewerFetchedTexture>& tex, bool boost)
{
- llassert(tex);
+ //llassert(tex); ??? maybe ok ???
if (!tex) { return false; }
if (tex->getDiscardLevel() < 0)
@@ -571,416 +582,6 @@ bool LLVLComposition::generateComposition()
return LLTerrainMaterials::generateMaterials();
}
-namespace
-{
- void prepare_fallback_image(LLImageRaw* raw_image)
- {
- raw_image->resize(BASE_SIZE, BASE_SIZE, 4);
- raw_image->fill(LLColor4U::white);
- }
-
- // Check if the raw image is loaded for this texture at a discard
- // level the minimap can use, and if not then try to get it loaded.
- bool prepare_raw_image(LLPointer<LLImageRaw>& raw_image, bool emissive, LLViewerFetchedTexture* tex, bool& delete_raw_post)
- {
- if (!tex)
- {
- if (!emissive)
- {
- prepare_fallback_image(raw_image);
- }
- else
- {
- llassert(!raw_image);
- raw_image = nullptr;
- }
- return true;
- }
- if (raw_image)
- {
- // Callback already initiated
- if (raw_image->getDataSize() > 0)
- {
- // Callback finished
- delete_raw_post = true;
- return true;
- }
- else
- {
- return false;
- }
- }
-
- raw_image = new LLImageRaw();
-
- S32 ddiscard = 0;
- {
- S32 min_dim = llmin(tex->getFullWidth(), tex->getFullHeight());
- while (min_dim > BASE_SIZE && ddiscard < MAX_DISCARD_LEVEL)
- {
- ddiscard++;
- min_dim /= 2;
- }
- }
-
- struct PendingImage
- {
- LLImageRaw* mRawImage;
- S32 mDesiredDiscard;
- LLUUID mTextureId;
- PendingImage(LLImageRaw* raw_image, S32 ddiscard, const LLUUID& texture_id)
- : mRawImage(raw_image)
- , mDesiredDiscard(ddiscard)
- , mTextureId(texture_id)
- {
- mRawImage->ref();
- }
- ~PendingImage()
- {
- mRawImage->unref();
- }
- };
- PendingImage* pending_image = new PendingImage(raw_image, ddiscard, tex->getID());
-
- loaded_callback_func cb = [](bool success, LLViewerFetchedTexture * src_vi, LLImageRaw * src, LLImageRaw * src_aux, S32 discard_level, bool is_final, void* userdata) {
- PendingImage* pending = (PendingImage*)userdata;
- // Owning LLVLComposition still exists
-
- // Assume mRawImage only used by single LLVLComposition for now
- const bool in_use_by_composition = pending->mRawImage->getNumRefs() > 1;
- llassert(pending->mRawImage->getNumRefs());
- llassert(pending->mRawImage->getNumRefs() <= 2);
- const bool needs_data = !pending->mRawImage->getDataSize();
- if (in_use_by_composition && needs_data)
- {
- if (success && pending->mDesiredDiscard == discard_level)
- {
- pending->mRawImage->resize(BASE_SIZE, BASE_SIZE, src->getComponents());
- pending->mRawImage->copyScaled(src);
- }
- else if (is_final)
- {
- prepare_fallback_image(pending->mRawImage);
- }
- }
-
- if (is_final) { delete pending; }
- };
- tex->setLoadedCallback(cb, ddiscard, true, false, pending_image, nullptr);
- tex->forceToSaveRawImage(ddiscard);
-
- return false;
- }
-};
-
-bool LLVLComposition::generateMinimapTileLand(const F32 x, const F32 y,
- const F32 width, const F32 height)
-{
- LL_PROFILE_ZONE_SCOPED
- llassert(mSurfacep);
- llassert(x >= 0.f);
- llassert(y >= 0.f);
-
- ///////////////////////////
- //
- // Generate raw data arrays for surface textures
- //
- //
-
- // These have already been validated by generateComposition.
- U8* st_data[ASSET_COUNT];
- S32 st_data_size[ASSET_COUNT]; // for debugging
-
- const bool use_textures = getMaterialType() != LLTerrainMaterials::Type::PBR;
- if (use_textures)
- {
- if (!makeTexturesReady(true, true)) { return false; }
- }
- else
- {
- if (!makeMaterialsReady(true, true)) { return false; }
- }
-
- for (S32 i = 0; i < ASSET_COUNT; i++)
- {
- if (mRawImages[i].isNull())
- {
- // Read back a raw image for this discard level, if it exists
- LLViewerFetchedTexture* tex;
- LLViewerFetchedTexture* tex_emissive; // Can be null
- bool has_base_color_factor;
- bool has_emissive_factor;
- bool has_alpha;
- LLColor3 base_color_factor;
- LLColor3 emissive_factor;
- if (use_textures)
- {
- tex = mDetailTextures[i];
- tex_emissive = nullptr;
- has_base_color_factor = false;
- has_emissive_factor = false;
- has_alpha = false;
- llassert(tex);
- }
- else
- {
- LLPointer<LLFetchedGLTFMaterial>& mat = mDetailRenderMaterials[i];
- tex = mat->mBaseColorTexture;
- tex_emissive = mat->mEmissiveTexture;
- base_color_factor = LLColor3(mat->mBaseColor);
- // *HACK: Treat alpha as black
- base_color_factor *= (mat->mBaseColor.mV[VW]);
- emissive_factor = mat->mEmissiveColor;
- has_base_color_factor = (base_color_factor.mV[VX] != 1.f ||
- base_color_factor.mV[VY] != 1.f ||
- base_color_factor.mV[VZ] != 1.f);
- has_emissive_factor = (emissive_factor.mV[VX] != 1.f ||
- emissive_factor.mV[VY] != 1.f ||
- emissive_factor.mV[VZ] != 1.f);
- has_alpha = mat->mAlphaMode != LLGLTFMaterial::ALPHA_MODE_OPAQUE;
- }
-
- if (!tex) { tex = LLViewerFetchedTexture::sWhiteImagep; }
-
- bool delete_raw_post = false;
- bool delete_raw_post_emissive = false;
- if (!prepare_raw_image(mRawImagesBaseColor[i], false, tex, delete_raw_post)) { return false; }
- if (tex_emissive && !prepare_raw_image(mRawImagesEmissive[i], true, tex_emissive, delete_raw_post_emissive)) { return false; }
- // tex_emissive can be null, and then will be ignored
-
- // In the simplest case, the minimap image is just the base color.
- // This will be replaced if we need to do any tinting/compositing.
- mRawImages[i] = mRawImagesBaseColor[i];
-
- // *TODO: This isn't quite right for PBR:
- // 1) It does not convert the color images from SRGB to linear
- // before mixing (which will always require copying the image).
- // 2) It mixes emissive and base color before mixing terrain
- // materials, but it should be the other way around
- // Long-term, we should consider a method that is more
- // maintainable. Shaders, perhaps? Bake shaders to textures?
- LLPointer<LLImageRaw> raw_emissive;
- if (tex_emissive)
- {
- raw_emissive = mRawImagesEmissive[i];
- if (has_emissive_factor ||
- tex_emissive->getWidth(tex_emissive->getRawImageLevel()) != BASE_SIZE ||
- tex_emissive->getHeight(tex_emissive->getRawImageLevel()) != BASE_SIZE ||
- tex_emissive->getComponents() != 4)
- {
- LLPointer<LLImageRaw> newraw_emissive = new LLImageRaw(BASE_SIZE, BASE_SIZE, 4);
- // Copy RGB, leave alpha alone (set to opaque by default)
- newraw_emissive->copy(mRawImagesEmissive[i]);
- if (has_emissive_factor)
- {
- newraw_emissive->tint(emissive_factor);
- }
- raw_emissive = newraw_emissive;
- }
- }
- if (has_base_color_factor ||
- raw_emissive ||
- has_alpha ||
- tex->getWidth(tex->getRawImageLevel()) != BASE_SIZE ||
- tex->getHeight(tex->getRawImageLevel()) != BASE_SIZE ||
- tex->getComponents() != 3)
- {
- LLPointer<LLImageRaw> newraw = new LLImageRaw(BASE_SIZE, BASE_SIZE, 3);
- if (has_alpha)
- {
- // Approximate the water underneath terrain alpha with solid water color
- newraw->clear(
- MAX_WATER_COLOR.mV[VX],
- MAX_WATER_COLOR.mV[VY],
- MAX_WATER_COLOR.mV[VZ],
- 255);
- }
- newraw->composite(mRawImagesBaseColor[i]);
- if (has_base_color_factor)
- {
- newraw->tint(base_color_factor);
- }
- // Apply emissive texture
- if (raw_emissive)
- {
- newraw->addEmissive(raw_emissive);
- }
-
- mRawImages[i] = newraw; // deletes old
- }
-
- if (delete_raw_post)
- {
- tex->destroyRawImage();
- }
- if (delete_raw_post_emissive)
- {
- tex_emissive->destroyRawImage();
- }
-
- // Remove intermediary image references
- mRawImagesBaseColor[i] = nullptr;
- mRawImagesEmissive[i] = nullptr;
- }
- st_data[i] = mRawImages[i]->getData();
- st_data_size[i] = mRawImages[i]->getDataSize();
- }
-
- ///////////////////////////////////////
- //
- // Generate and clamp x/y bounding box.
- //
- //
-
- S32 x_begin, y_begin, x_end, y_end;
- x_begin = (S32)(x * mScaleInv);
- y_begin = (S32)(y * mScaleInv);
- x_end = ll_round( (x + width) * mScaleInv );
- y_end = ll_round( (y + width) * mScaleInv );
-
- if (x_end > mWidth)
- {
- llassert(false);
- x_end = mWidth;
- }
- if (y_end > mWidth)
- {
- llassert(false);
- y_end = mWidth;
- }
-
-
- ///////////////////////////////////////////
- //
- // Generate target texture information, stride ratios.
- //
- //
-
- LLViewerTexture *texturep;
- U32 tex_width, tex_height, tex_comps;
- U32 tex_stride;
- F32 tex_x_scalef, tex_y_scalef;
- S32 tex_x_begin, tex_y_begin, tex_x_end, tex_y_end;
- F32 tex_x_ratiof, tex_y_ratiof;
-
- texturep = mSurfacep->getSTexture();
- tex_width = texturep->getWidth();
- tex_height = texturep->getHeight();
- tex_comps = texturep->getComponents();
- tex_stride = tex_width * tex_comps;
-
- U32 st_comps = 3;
- U32 st_width = BASE_SIZE;
- U32 st_height = BASE_SIZE;
-
- if (tex_comps != st_comps)
- {
- llassert(false);
- return false;
- }
-
- tex_x_scalef = (F32)tex_width / (F32)mWidth;
- tex_y_scalef = (F32)tex_height / (F32)mWidth;
- tex_x_begin = (S32)((F32)x_begin * tex_x_scalef);
- tex_y_begin = (S32)((F32)y_begin * tex_y_scalef);
- tex_x_end = (S32)((F32)x_end * tex_x_scalef);
- tex_y_end = (S32)((F32)y_end * tex_y_scalef);
-
- tex_x_ratiof = (F32)mWidth*mScale / (F32)tex_width;
- tex_y_ratiof = (F32)mWidth*mScale / (F32)tex_height;
-
- LLPointer<LLImageRaw> raw = new LLImageRaw(tex_width, tex_height, tex_comps);
- U8 *rawp = raw->getData();
-
- F32 st_x_stride, st_y_stride;
- st_x_stride = ((F32)st_width / (F32)mTexScaleX)*((F32)mWidth / (F32)tex_width);
- st_y_stride = ((F32)st_height / (F32)mTexScaleY)*((F32)mWidth / (F32)tex_height);
-
- llassert(st_x_stride > 0.f);
- llassert(st_y_stride > 0.f);
- ////////////////////////////////
- //
- // Iterate through the target texture, striding through the
- // subtextures and interpolating appropriately.
- //
- //
-
- F32 sti, stj;
- S32 st_offset;
- sti = (tex_x_begin * st_x_stride) - st_width*(llfloor((tex_x_begin * st_x_stride)/st_width));
- stj = (tex_y_begin * st_y_stride) - st_height*(llfloor((tex_y_begin * st_y_stride)/st_height));
-
- st_offset = (llfloor(stj * st_width) + llfloor(sti)) * st_comps;
- for (S32 j = tex_y_begin; j < tex_y_end; j++)
- {
- U32 offset = j * tex_stride + tex_x_begin * tex_comps;
- sti = (tex_x_begin * st_x_stride) - st_width*((U32)(tex_x_begin * st_x_stride)/st_width);
- for (S32 i = tex_x_begin; i < tex_x_end; i++)
- {
- S32 tex0, tex1;
- F32 composition = getValueScaled(i*tex_x_ratiof, j*tex_y_ratiof);
-
- tex0 = llfloor( composition );
- tex0 = llclamp(tex0, 0, 3);
- composition -= tex0;
- tex1 = tex0 + 1;
- tex1 = llclamp(tex1, 0, 3);
-
- st_offset = (lltrunc(sti) + lltrunc(stj)*st_width) * st_comps;
- for (U32 k = 0; k < tex_comps; k++)
- {
- // Linearly interpolate based on composition.
- if (st_offset >= st_data_size[tex0] || st_offset >= st_data_size[tex1])
- {
- // SJB: This shouldn't be happening, but does... Rounding error?
- //LL_WARNS() << "offset 0 [" << tex0 << "] =" << st_offset << " >= size=" << st_data_size[tex0] << LL_ENDL;
- //LL_WARNS() << "offset 1 [" << tex1 << "] =" << st_offset << " >= size=" << st_data_size[tex1] << LL_ENDL;
- }
- else
- {
- F32 a = *(st_data[tex0] + st_offset);
- F32 b = *(st_data[tex1] + st_offset);
- rawp[ offset ] = (U8)lltrunc( a + composition * (b - a) );
- }
- offset++;
- st_offset++;
- }
-
- sti += st_x_stride;
- if (sti >= st_width)
- {
- sti -= st_width;
- }
- }
-
- stj += st_y_stride;
- if (stj >= st_height)
- {
- stj -= st_height;
- }
- }
-
- if (!texturep->hasGLTexture())
- {
- texturep->createGLTexture(0, raw);
- }
- texturep->setSubImage(raw, tex_x_begin, tex_y_begin, tex_x_end - tex_x_begin, tex_y_end - tex_y_begin);
-
- // Un-boost detail textures (will get re-boosted if rendering in high detail)
- for (S32 i = 0; i < ASSET_COUNT; i++)
- {
- unboost_minimap_texture(mDetailTextures[i]);
- }
-
- // Un-boost textures for each detail material (will get re-boosted if rendering in high detail)
- for (S32 i = 0; i < ASSET_COUNT; i++)
- {
- unboost_minimap_material(mDetailMaterials[i]);
- }
-
- return true;
-}
-
F32 LLVLComposition::getStartHeight(S32 corner)
{
return mStartHeight[corner];
diff --git a/indra/newview/llvlcomposition.h b/indra/newview/llvlcomposition.h
index 61c35ade28..f15f9bff6a 100644
--- a/indra/newview/llvlcomposition.h
+++ b/indra/newview/llvlcomposition.h
@@ -28,6 +28,8 @@
#define LL_LLVLCOMPOSITION_H
#include "llviewerlayer.h"
+#include "llviewershadermgr.h"
+#include "llviewertexture.h"
#include "llpointer.h"
#include "llimage.h"
@@ -44,6 +46,7 @@ public:
virtual const LLGLTFMaterial* getMaterialOverride(S32 asset) const = 0;
};
+// The subset of the composition used by local terrain debug materials (gLocalTerrainMaterials)
class LLTerrainMaterials : public LLModifyRegion
{
public:
@@ -79,6 +82,12 @@ public:
// strict = false -> at least one material must be loaded
bool makeMaterialsReady(bool boost, bool strict);
+ // See TerrainPaintType
+ U32 getPaintType() const { return mPaintType; }
+ void setPaintType(U32 paint_type) { mPaintType = paint_type; }
+ LLViewerTexture* getPaintMap();
+ void setPaintMap(LLViewerTexture* paint_map);
+
protected:
void unboost();
static bool makeTextureReady(LLPointer<LLViewerFetchedTexture>& tex, bool boost);
@@ -93,6 +102,9 @@ protected:
LLPointer<LLGLTFMaterial> mDetailMaterialOverrides[ASSET_COUNT];
LLPointer<LLFetchedGLTFMaterial> mDetailRenderMaterials[ASSET_COUNT];
bool mMaterialTexturesSet[ASSET_COUNT];
+
+ U32 mPaintType = TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE;
+ LLPointer<LLViewerTexture> mPaintMap;
};
// Local materials to override all regions
@@ -114,8 +126,6 @@ public:
// Viewer side hack to generate composition values
bool generateHeights(const F32 x, const F32 y, const F32 width, const F32 height);
bool generateComposition();
- // Generate texture from composition values.
- bool generateMinimapTileLand(const F32 x, const F32 y, const F32 width, const F32 height);
// Use these as indeces ito the get/setters below that use 'corner'
enum ECorner
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index c68ce8d956..09375a6930 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -768,6 +768,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
}
mVisuallyMuteSetting = LLVOAvatar::VisualMuteSettings(LLRenderMuteList::getInstance()->getSavedVisualMuteSetting(getID()));
+
+ sInstances.push_back(this);
}
std::string LLVOAvatar::avString() const
@@ -815,6 +817,8 @@ void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string c
//------------------------------------------------------------------------
LLVOAvatar::~LLVOAvatar()
{
+ sInstances.remove(this);
+
if (!mFullyLoaded)
{
debugAvatarRezTime("AvatarRezLeftCloudNotification","left after ruth seconds as cloud");
@@ -957,26 +961,16 @@ void LLVOAvatar::deleteLayerSetCaches(bool clearAll)
// static
bool LLVOAvatar::areAllNearbyInstancesBaked(S32& grey_avatars)
{
- bool res = true;
grey_avatars = 0;
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*) *iter;
- if( inst->isDead() )
+ LLVOAvatar* inst = (LLVOAvatar*)character;
+ if (!inst->isDead() && inst->mHasGrey && !inst->isFullyBaked())
{
- continue;
- }
- else if( !inst->isFullyBaked() )
- {
- res = false;
- if (inst->mHasGrey)
- {
- ++grey_avatars;
- }
+ ++grey_avatars;
}
}
- return res;
+ return !grey_avatars;
}
// static
@@ -987,11 +981,10 @@ void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_t
avg_cloud_time = 0;
cloud_avatars = 0;
S32 count_avg = 0;
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*) *iter;
- if (inst)
+ if (LLVOAvatar* inst = (LLVOAvatar*)character)
{
S32 rez_status = inst->getRezzedStatus();
counts[rez_status]++;
@@ -1008,6 +1001,7 @@ void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_t
}
}
}
+
if (count_avg > 0)
{
avg_cloud_time /= count_avg;
@@ -1017,11 +1011,19 @@ void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_t
// static
std::string LLVOAvatar::rezStatusToString(S32 rez_status)
{
- if (rez_status==0) return "cloud";
- if (rez_status==1) return "gray";
- if (rez_status==2) return "downloading baked";
- if (rez_status==3) return "loading attachments";
- if (rez_status==4) return "full";
+ switch (rez_status)
+ {
+ case 0:
+ return "cloud";
+ case 1:
+ return "gray";
+ case 2:
+ return "downloading baked";
+ case 3:
+ return "loading attachments";
+ case 4:
+ return "full";
+ }
return "unknown";
}
@@ -1030,10 +1032,9 @@ void LLVOAvatar::dumpBakedStatus()
{
LLVector3d camera_pos_global = gAgentCamera.getCameraPositionGlobal();
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*) *iter;
+ LLVOAvatar* inst = (LLVOAvatar*)character;
LL_INFOS() << "Avatar ";
LLNameValue* firstname = inst->getNVPair("FirstName");
@@ -1128,10 +1129,9 @@ void LLVOAvatar::destroyGL()
//static
void LLVOAvatar::resetImpostors()
{
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* avatar = (LLVOAvatar*) *iter;
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
avatar->mImpostor.release();
avatar->mNeedsImpostorUpdate = true;
avatar->mLastImpostorUpdateReason = 1;
@@ -1143,11 +1143,9 @@ void LLVOAvatar::deleteCachedImages(bool clearAll)
{
if (LLViewerTexLayerSet::sHasCaches)
{
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*) *iter;
- inst->deleteLayerSetCaches(clearAll);
+ ((LLVOAvatar*)character)->deleteLayerSetCaches(clearAll);
}
LLViewerTexLayerSet::sHasCaches = false;
}
@@ -1202,7 +1200,7 @@ void LLVOAvatar::initInstance()
//-------------------------------------------------------------------------
if (LLCharacter::sInstances.size() == 1)
{
- registerMotion( ANIM_AGENT_DO_NOT_DISTURB, LLNullMotion::create );
+ registerMotion( ANIM_AGENT_DO_NOT_DISTURB, LLNullMotion::create );
registerMotion( ANIM_AGENT_CROUCH, LLKeyframeStandMotion::create );
registerMotion( ANIM_AGENT_CROUCHWALK, LLKeyframeWalkMotion::create );
registerMotion( ANIM_AGENT_EXPRESS_AFRAID, LLEmote::create );
@@ -2589,6 +2587,9 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+ if (LLApp::isExiting())
+ return;
+
if (isDead())
{
LL_INFOS() << "Warning! Idle on dead avatar" << LL_ENDL;
@@ -2630,6 +2631,29 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
}
// Update should be happening max once per frame.
+ static LLCachedControl<S32> refreshPeriod(gSavedSettings, "AvatarExtentRefreshPeriodBatch");
+ static LLCachedControl<S32> refreshMaxPerPeriod(gSavedSettings, "AvatarExtentRefreshMaxPerBatch");
+ static S32 upd_freq = refreshPeriod; // initialise to a reasonable default of 1 batch
+ static S32 lastRecalibrationFrame{ 0 };
+
+ const S32 thisFrame = LLDrawable::getCurrentFrame();
+ if (thisFrame - lastRecalibrationFrame >= upd_freq)
+ {
+ // Only update at the start of a cycle. .
+ // update frequency = ((Num_Avatars -1 / NumberPerPeriod) + 1 ) * Periodicity
+ // Given NumberPerPeriod = 5 and Periodicity = 4
+ // | NumAvatars | frequency |
+ // +-------------+-----------+
+ // | 1 | 4 |
+ // | 2 | 4 |
+ // | 5 | 4 |
+ // | 10 | 8 |
+ // | 25 | 20 |
+
+ upd_freq = (((gObjectList.getAvatarCount() - 1) / refreshMaxPerPeriod) + 1)*refreshPeriod;
+ lastRecalibrationFrame = thisFrame;
+ }
+
if ((mLastAnimExtents[0]==LLVector3())||
(mLastAnimExtents[1])==LLVector3())
{
@@ -2637,8 +2661,9 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
}
else
{
- const S32 upd_freq = 4; // force update every upd_freq frames.
- mNeedsExtentUpdate = ((LLDrawable::getCurrentFrame()+mID.mData[0])%upd_freq==0);
+ // Update extent if necessary.
+ // if the frame counnter + the first byte of the UUID % upd_freq = 0 then update the extent.
+ mNeedsExtentUpdate = ((thisFrame + mID.mData[0]) % upd_freq == 0);
}
LLScopedContextString str("avatar_idle_update " + getFullname());
@@ -3056,30 +3081,15 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
}
else
{
- F32 morph_amt = calcMorphAmount();
- LLVisualParam *param;
-
if (!isSelf())
{
+ F32 morph_amt = calcMorphAmount();
// animate only top level params for non-self avatars
- for (param = getFirstVisualParam();
- param;
- param = getNextVisualParam())
- {
- if (param->isTweakable())
- {
- param->animate(morph_amt);
- }
- }
+ animateTweakableVisualParams(morph_amt);
}
// apply all params
- for (param = getFirstVisualParam();
- param;
- param = getNextVisualParam())
- {
- param->apply(avatar_sex);
- }
+ applyAllVisualParams(avatar_sex);
mLastAppearanceBlendTime = appearance_anim_time;
}
@@ -3087,7 +3097,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
}
}
-F32 LLVOAvatar::calcMorphAmount()
+F32 LLVOAvatar::calcMorphAmount() const
{
F32 appearance_anim_time = mAppearanceMorphTimer.getElapsedTimeF32();
F32 blend_frac = calc_bouncy_animation(appearance_anim_time / APPEARANCE_MORPH_TIME);
@@ -3144,7 +3154,7 @@ void LLVOAvatar::idleUpdateLipSync(bool voice_enabled)
void LLVOAvatar::idleUpdateLoadingEffect()
{
// update visibility when avatar is partially loaded
- if (updateIsFullyLoaded()) // changed?
+ if (!mFullyLoaded && updateIsFullyLoaded()) // Avoid repeat calculations by checking if mFullyLoaded is true first.
{
if (isFullyLoaded())
{
@@ -3394,7 +3404,7 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name)
{
is_muted = isInMuteList();
}
- bool is_friend = LLAvatarTracker::instance().isBuddy(getID());
+ bool is_friend = isBuddy();
bool is_cloud = getIsCloud();
if (is_appearance != mNameAppearance)
@@ -3530,7 +3540,9 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name)
std::deque<LLChat>::iterator chat_iter = mChats.begin();
mNameText->clearString();
- LLColor4 new_chat = LLUIColorTable::instance().getColor( isSelf() ? "UserChatColor" : "AgentChatColor" );
+ static const LLUIColor user_chat_color = LLUIColorTable::instance().getColor("UserChatColor");
+ static const LLUIColor agent_chat_color = LLUIColorTable::instance().getColor("AgentChatColor");
+ const LLColor4& new_chat = isSelf() ? user_chat_color : agent_chat_color;
LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f);
LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f);
if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES)
@@ -3625,29 +3637,28 @@ void LLVOAvatar::clearNameTag()
mTimeVisible.reset();
}
-//static
+// static
void LLVOAvatar::invalidateNameTag(const LLUUID& agent_id)
{
- LLViewerObject* obj = gObjectList.findObject(agent_id);
- if (!obj) return;
-
- LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(obj);
- if (!avatar) return;
-
- avatar->clearNameTag();
+ if (LLViewerObject* obj = gObjectList.findObject(agent_id))
+ {
+ if (LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(obj))
+ {
+ avatar->clearNameTag();
+ }
+ }
}
-//static
+// static
void LLVOAvatar::invalidateNameTags()
{
- std::vector<LLCharacter*>::iterator it = LLCharacter::sInstances.begin();
- for ( ; it != LLCharacter::sInstances.end(); ++it)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*it);
- if (!avatar) continue;
- if (avatar->isDead()) continue;
-
- avatar->clearNameTag();
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead())
+ {
+ avatar->clearNameTag();
+ }
}
}
@@ -4067,12 +4078,14 @@ void LLVOAvatar::updateDebugText()
{
// Leave mDebugText uncleared here, in case a derived class has added some state first
- if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))
+ static LLCachedControl<bool> debug_av_appearance_message(gSavedSettings, "DebugAvatarAppearanceMessage");
+ if (debug_av_appearance_message)
{
updateAppearanceMessageDebugText();
}
- if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked"))
+ static LLCachedControl<bool> debug_av_composite_baked(gSavedSettings, "DebugAvatarCompositeBaked");
+ if (debug_av_composite_baked)
{
if (!mBakedTextureDebugText.empty())
addDebugText(mBakedTextureDebugText);
@@ -4531,7 +4544,7 @@ void LLVOAvatar::updateRootPositionAndRotation(LLAgent& agent, F32 speed, bool w
root_pos += LLVector3d(getHoverOffset());
if (getOverallAppearance() == AOA_JELLYDOLL)
{
- F32 offz = -0.5 * (getScale()[VZ] - mBodySize.mV[VZ]);
+ F32 offz = -0.5f * (getScale()[VZ] - mBodySize.mV[VZ]);
root_pos[2] += offz;
// if (!isSelf() && !isControlAvatar())
// {
@@ -4778,8 +4791,8 @@ bool LLVOAvatar::updateCharacter(LLAgent &agent)
if (!getParent() && (isSitting() || was_sit_ground_constrained))
{
- F32 off_z = LLVector3d(getHoverOffset()).mdV[VZ];
- if (off_z != 0.0)
+ F32 off_z = (F32)LLVector3d(getHoverOffset()).mdV[VZ];
+ if (off_z != 0.0f)
{
LLVector3 pos = mRoot->getWorldPosition();
pos.mV[VZ] += off_z;
@@ -7239,7 +7252,7 @@ void LLVOAvatar::updateGL()
{
if (mMeshTexturesDirty)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
updateMeshTextures();
mMeshTexturesDirty = false;
}
@@ -8256,15 +8269,13 @@ void LLVOAvatar::logPendingPhases()
//static
void LLVOAvatar::logPendingPhasesAllAvatars()
{
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*) *iter;
- if( inst->isDead() )
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead())
{
- continue;
+ avatar->logPendingPhases();
}
- inst->logPendingPhases();
}
}
@@ -8452,7 +8463,7 @@ bool LLVOAvatar::isTooComplex() const
{
bool too_complex;
static LLCachedControl<S32> compelxity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
- bool render_friend = (LLAvatarTracker::instance().isBuddy(getID()) && compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY);
+ bool render_friend = (isBuddy() && compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY);
if (isSelf() || render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
{
@@ -8488,7 +8499,7 @@ bool LLVOAvatar::isTooSlow() const
static LLCachedControl<S32> compelxity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
static LLCachedControl<bool> friends_only(gSavedSettings, "RenderAvatarFriendsOnly", false);
- bool is_friend = LLAvatarTracker::instance().isBuddy(getID());
+ bool is_friend = isBuddy();
bool render_friend = is_friend && compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY;
if (render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
@@ -8529,7 +8540,7 @@ void LLVOAvatar::updateTooSlow()
auto it = std::find(sAVsIgnoringARTLimit.begin(), sAVsIgnoringARTLimit.end(), mID);
if (it != sAVsIgnoringARTLimit.end())
{
- S32 index = it - sAVsIgnoringARTLimit.begin();
+ S32 index = (S32)(it - sAVsIgnoringARTLimit.begin());
ignore_tune = (index < (MIN_NONTUNED_AVS - sAvatarsNearby + 1 + LLPerfStats::tunedAvatars));
}
}
@@ -8545,7 +8556,7 @@ void LLVOAvatar::updateTooSlow()
if(!mTooSlowWithoutShadows) // if we were not previously above the full impostor cap
{
bool always_render_friends = compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY;
- bool render_friend_or_exception = (always_render_friends && LLAvatarTracker::instance().isBuddy( id ) ) ||
+ bool render_friend_or_exception = (always_render_friends && isBuddy()) ||
( getVisualMuteSettings() == LLVOAvatar::AV_ALWAYS_RENDER );
if( (!isSelf() || allowSelfImpostor) && !render_friend_or_exception)
{
@@ -8589,7 +8600,8 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const
// colorized if using deferred rendering.
void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color)
{
- if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked"))
+ static LLCachedControl<bool> debug_av_composite_baked(gSavedSettings, "DebugAvatarCompositeBaked");
+ if (debug_av_composite_baked)
{
avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();
avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end();
@@ -8723,7 +8735,7 @@ void LLVOAvatar::updateMeshVisibility()
// virtual
void LLVOAvatar::updateMeshTextures()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
static S32 update_counter = 0;
mBakedTextureDebugText.clear();
@@ -9505,7 +9517,7 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe
std::vector<LLVisualParam*>::iterator it = std::find(contents.mParams.begin(), contents.mParams.end(),appearance_version_param);
if (it != contents.mParams.end())
{
- S32 index = it - contents.mParams.begin();
+ S32 index = (S32)(it - contents.mParams.begin());
contents.mParamAppearanceVersion = ll_round(contents.mParamWeights[index]);
//LL_DEBUGS("Avatar") << "appversion req by appearance_version param: " << contents.mParamAppearanceVersion << LL_ENDL;
}
@@ -10437,15 +10449,16 @@ void LLVOAvatar::setVisibilityRank(U32 rank)
S32 LLVOAvatar::getUnbakedPixelAreaRank()
{
S32 rank = 1;
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*) *iter;
- if (inst == this)
+ if (character == this)
{
return rank;
}
- else if (!inst->isDead() && !inst->isFullyBaked())
+
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead() && !avatar->isFullyBaked())
{
rank++;
}
@@ -10455,49 +10468,37 @@ S32 LLVOAvatar::getUnbakedPixelAreaRank()
return 0;
}
-struct CompareScreenAreaGreater
-{
- bool operator()(const LLCharacter* const& lhs, const LLCharacter* const& rhs)
- {
- return lhs->getPixelArea() > rhs->getPixelArea();
- }
-};
-
// static
void LLVOAvatar::cullAvatarsByPixelArea()
{
- std::sort(LLCharacter::sInstances.begin(), LLCharacter::sInstances.end(), CompareScreenAreaGreater());
+ LLCharacter::sInstances.sort([](LLCharacter* lhs, LLCharacter* rhs)
+ {
+ return lhs->getPixelArea() > rhs->getPixelArea();
+ });
// Update the avatars that have changed status
- U32 rank = 2; //1 is reserved for self.
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
{
- LLVOAvatar* inst = (LLVOAvatar*) *iter;
- bool culled;
- if (inst->isSelf() || inst->isFullyBaked())
- {
- culled = false;
- }
- else
+ U32 rank = 2; //1 is reserved for self.
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- culled = true;
- }
+ LLVOAvatar* inst = (LLVOAvatar*)character;
+ bool culled = !inst->isSelf() && !inst->isFullyBaked();
- if (inst->mCulled != culled)
- {
- inst->mCulled = culled;
- LL_DEBUGS() << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled" ) << LL_ENDL;
- inst->updateMeshTextures();
- }
+ if (inst->mCulled != culled)
+ {
+ inst->mCulled = culled;
+ LL_DEBUGS() << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled" ) << LL_ENDL;
+ inst->updateMeshTextures();
+ }
- if (inst->isSelf())
- {
- inst->setVisibilityRank(1);
- }
- else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible())
- {
- inst->setVisibilityRank(rank++);
+ if (inst->isSelf())
+ {
+ inst->setVisibilityRank(1);
+ }
+ else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible())
+ {
+ inst->setVisibilityRank(rank++);
+ }
}
}
@@ -10633,18 +10634,19 @@ void showRigInfoTabExtents(LLVOAvatar *avatar, LLJointRiggingInfoTab& tab, S32&
void LLVOAvatar::getAssociatedVolumes(std::vector<LLVOVolume*>& volumes)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
- for ( LLVOAvatar::attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter )
+ for (const auto& iter : mAttachmentPoints)
{
- LLViewerJointAttachment* attachment = iter->second;
+ LLViewerJointAttachment* attachment = iter.second;
LLViewerJointAttachment::attachedobjs_vec_t::iterator attach_end = attachment->mAttachedObjects.end();
- for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attach_iter = attachment->mAttachedObjects.begin();
- attach_iter != attach_end; ++attach_iter)
+ for (LLViewerObject* attached_object : attachment->mAttachedObjects)
{
- LLViewerObject* attached_object = attach_iter->get();
- LLVOVolume *volume = dynamic_cast<LLVOVolume*>(attached_object);
- if (volume)
+ if (attached_object->isDead())
+ continue;
+
+ if (attached_object->getPCode() == LL_PCODE_VOLUME)
{
+ LLVOVolume* volume = (LLVOVolume*)attached_object;
volumes.push_back(volume);
if (volume->isAnimatedObject())
{
@@ -10654,15 +10656,12 @@ void LLVOAvatar::getAssociatedVolumes(std::vector<LLVOVolume*>& volumes)
continue;
}
}
- LLViewerObject::const_child_list_t& children = attached_object->getChildren();
- for (LLViewerObject::const_child_list_t::const_iterator it = children.begin();
- it != children.end(); ++it)
+
+ for (LLViewerObject* childp : attached_object->getChildren())
{
- LLViewerObject *childp = *it;
- LLVOVolume *volume = dynamic_cast<LLVOVolume*>(childp);
- if (volume)
+ if (!childp->isDead() && childp->getPCode() == LL_PCODE_VOLUME)
{
- volumes.push_back(volume);
+ volumes.push_back((LLVOVolume*)childp);
}
}
}
@@ -10701,42 +10700,40 @@ void LLVOAvatar::updateRiggingInfo()
getAssociatedVolumes(volumes);
- std::map<LLUUID,S32> curr_rigging_info_key;
+ std::map<LLUUID, S32> curr_rigging_info_key;
+
+ // Get current rigging info key
+ for (LLVOVolume* vol : volumes)
{
- // Get current rigging info key
- for (std::vector<LLVOVolume*>::iterator it = volumes.begin(); it != volumes.end(); ++it)
+ if (vol->isMesh() && vol->getVolume())
{
- LLVOVolume *vol = *it;
- if (vol->isMesh() && vol->getVolume())
- {
- const LLUUID& mesh_id = vol->getVolume()->getParams().getSculptID();
- S32 max_lod = llmax(vol->getLOD(), vol->mLastRiggingInfoLOD);
- curr_rigging_info_key[mesh_id] = max_lod;
- }
+ const LLUUID& mesh_id = vol->getVolume()->getParams().getSculptID();
+ S32 max_lod = llmax(vol->getLOD(), vol->mLastRiggingInfoLOD);
+ curr_rigging_info_key[mesh_id] = max_lod;
}
+ }
- // Check for key change, which indicates some change in volume composition or LOD.
- if (curr_rigging_info_key == mLastRiggingInfoKey)
- {
- return;
- }
+ // Check for key change, which indicates some change in volume composition or LOD.
+ if (curr_rigging_info_key == mLastRiggingInfoKey)
+ {
+ return;
}
// Something changed. Update.
mLastRiggingInfoKey = curr_rigging_info_key;
mJointRiggingInfoTab.clear();
- for (std::vector<LLVOVolume*>::iterator it = volumes.begin(); it != volumes.end(); ++it)
+ for (LLVOVolume* vol : volumes)
{
- LLVOVolume *vol = *it;
vol->updateRiggingInfo();
mJointRiggingInfoTab.merge(vol->mJointRiggingInfoTab);
}
//LL_INFOS() << "done update rig count is " << countRigInfoTab(mJointRiggingInfoTab) << LL_ENDL;
- LL_DEBUGS("RigSpammish") << getFullname() << " after update rig tab:" << LL_ENDL;
- S32 joint_count, box_count;
- showRigInfoTabExtents(this, mJointRiggingInfoTab, joint_count, box_count);
- LL_DEBUGS("RigSpammish") << "uses " << joint_count << " joints " << " nonzero boxes: " << box_count << LL_ENDL;
+ // Remove debug only stuff on hot path
+ // LL_DEBUGS("RigSpammish") << getFullname() << " after update rig tab:" << LL_ENDL;
+ // S32 joint_count, box_count;
+ // showRigInfoTabExtents(this, mJointRiggingInfoTab, joint_count, box_count);
+ // LL_DEBUGS("RigSpammish") << "uses " << joint_count << " joints " << " nonzero boxes: " << box_count << LL_ENDL;
}
// virtual
@@ -10756,11 +10753,9 @@ void LLVOAvatar::updateImpostors()
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
- std::vector<LLCharacter*> instances_copy = LLCharacter::sInstances;
- for (std::vector<LLCharacter*>::iterator iter = instances_copy.begin();
- iter != instances_copy.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* avatar = (LLVOAvatar*) *iter;
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
if (!avatar->isDead()
&& avatar->isVisible()
&& avatar->isImpostor()
@@ -10917,21 +10912,17 @@ void LLVOAvatar::updateNearbyAvatarCount()
S32 avs_nearby = 0;
static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64);
F32 radius = render_far_clip * render_far_clip;
- std::vector<LLCharacter *>::iterator char_iter = LLCharacter::sInstances.begin();
- while (char_iter != LLCharacter::sInstances.end())
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar *avatar = dynamic_cast<LLVOAvatar *>(*char_iter);
- if (avatar && !avatar->isDead() && !avatar->isControlAvatar())
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead() && !avatar->isControlAvatar())
{
- if ((dist_vec_squared(avatar->getPositionGlobal(), gAgent.getPositionGlobal()) > radius) &&
- (dist_vec_squared(avatar->getPositionGlobal(), gAgentCamera.getCameraPositionGlobal()) > radius))
+ if ((dist_vec_squared(avatar->getPositionGlobal(), gAgent.getPositionGlobal()) <= radius) ||
+ (dist_vec_squared(avatar->getPositionGlobal(), gAgentCamera.getCameraPositionGlobal()) <= radius))
{
- char_iter++;
- continue;
+ avs_nearby++;
}
- avs_nearby++;
}
- char_iter++;
}
sAvatarsNearby = avs_nearby;
agent_update_timer.reset();
@@ -11101,7 +11092,7 @@ void LLVOAvatar::accountRenderComplexityForObject(
LLObjectComplexity object_complexity;
object_complexity.objectName = attached_object->getAttachmentItemName();
object_complexity.objectId = attached_object->getAttachmentItemID();
- object_complexity.objectCost = attachment_total_cost;
+ object_complexity.objectCost = (U32)attachment_total_cost;
object_complexity_list.push_back(object_complexity);
}
}
@@ -11505,7 +11496,7 @@ void LLVOAvatar::calcMutedAVColor()
new_color = LLColor4::grey4;
change_msg = " not rendered: color is grey4";
}
- else if (LLMuteList::getInstance()->isMuted(av_id)) // the user blocked them
+ else if (isInMuteList()) // the user blocked them
{
// blocked avatars are dark grey
new_color = LLColor4::grey4;
@@ -11704,10 +11695,9 @@ F32 LLVOAvatar::getTotalGPURenderTime()
F32 ret = 0.f;
- for (LLCharacter* iter : LLCharacter::sInstances)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*) iter;
- ret += inst->getGPURenderTime();
+ ret += ((LLVOAvatar*)character)->getGPURenderTime();
}
return ret;
@@ -11719,10 +11709,9 @@ F32 LLVOAvatar::getMaxGPURenderTime()
F32 ret = 0.f;
- for (LLCharacter* iter : LLCharacter::sInstances)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*)iter;
- ret = llmax(inst->getGPURenderTime(), ret);
+ ret = llmax(((LLVOAvatar*)character)->getGPURenderTime(), ret);
}
return ret;
@@ -11736,12 +11725,12 @@ F32 LLVOAvatar::getAverageGPURenderTime()
S32 count = 0;
- for (LLCharacter* iter : LLCharacter::sInstances)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* inst = (LLVOAvatar*)iter;
- if (!inst->isTooSlow())
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isTooSlow())
{
- ret += inst->getGPURenderTime();
+ ret += avatar->getGPURenderTime();
++count;
}
}
@@ -11753,8 +11742,23 @@ F32 LLVOAvatar::getAverageGPURenderTime()
return ret;
}
+
bool LLVOAvatar::isBuddy() const
{
- return LLAvatarTracker::instance().isBuddy(getID());
+ bool is_friend = false;
+ F64 now = LLFrameTimer::getTotalSeconds();
+ if (now < mCachedBuddyListUpdateTime)
+ {
+ is_friend = mCachedInBuddyList;
+ }
+ else
+ {
+ is_friend = LLAvatarTracker::instance().isBuddy(getID());
+
+ const F64 SECONDS_BETWEEN_BUDDY_UPDATES = 1;
+ mCachedBuddyListUpdateTime = now + SECONDS_BETWEEN_BUDDY_UPDATES;
+ mCachedInBuddyList = is_friend;
+ }
+ return is_friend;
}
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 1ca8b81553..aa6aee0de5 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -422,7 +422,7 @@ protected:
bool updateIsFullyLoaded();
bool processFullyLoadedChange(bool loading);
void updateRuthTimer(bool loading);
- F32 calcMorphAmount();
+ F32 calcMorphAmount() const;
private:
bool mFirstFullyVisible;
@@ -587,6 +587,8 @@ private:
mutable bool mCachedInMuteList;
mutable F64 mCachedMuteListUpdateTime;
+ mutable bool mCachedInBuddyList = false;
+ mutable F64 mCachedBuddyListUpdateTime = 0.0;
VisualMuteSettings mVisuallyMuteSetting; // Always or never visually mute this AV
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index e4a7b53d9f..00a7325db2 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -24,12 +24,6 @@
* $/LicenseInfo$
*/
-#if LL_MSVC
-// disable warning about boost::lexical_cast returning uninitialized data
-// when it fails to parse the string
-#pragma warning (disable:4701)
-#endif
-
#include "llviewerprecompiledheaders.h"
#include "llvoavatarself.h"
@@ -69,11 +63,6 @@
#include "llcorehttputil.h"
#include "lluiusage.h"
-#if LL_MSVC
-// disable boost::lexical_cast warning
-#pragma warning (disable:4702)
-#endif
-
#include <boost/lexical_cast.hpp>
LLPointer<LLVOAvatarSelf> gAgentAvatarp = NULL;
@@ -699,7 +688,7 @@ bool LLVOAvatarSelf::isValid() const
// virtual
void LLVOAvatarSelf::idleUpdate(LLAgent &agent, const F64 &time)
{
- if (isValid())
+ if (isAgentAvatarValid())
{
LLVOAvatar::idleUpdate(agent, time);
idleUpdateTractorBeam();
@@ -1238,7 +1227,7 @@ bool LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
// Make sure the inventory is in sync with the avatar.
// Update COF contents, don't trigger appearance update.
- if (!isValid())
+ if (!isAgentAvatarValid())
{
LL_INFOS() << "removeItemLinks skipped, avatar is under destruction" << LL_ENDL;
}
@@ -2346,7 +2335,7 @@ LLSD summarize_by_buckets(std::vector<LLSD> in_records,
key[field] = record[field];
}
LLViewerStats::StatsAccumulator& stats = accum[key];
- F32 value = record[val_field].asReal();
+ F32 value = (F32)record[val_field].asReal();
stats.push(value);
}
for (std::map<LLSD,LLViewerStats::StatsAccumulator>::iterator accum_it = accum.begin();
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 77556c8412..051ac791c0 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -111,7 +111,7 @@ private:
public:
/*virtual*/ bool isSelf() const { return true; }
virtual bool isBuddy() const { return false; }
- /*virtual*/ bool isValid() const;
+ /*virtual*/ bool isValid() const; // use isAgentAvatarValid, it's fuller
//--------------------------------------------------------------------
// Updates
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 0fe2a3e714..27c105c8d6 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -479,8 +479,8 @@ void LLVOCacheEntry::updateDebugSettings()
LLMemory::updateMemoryInfo() ;
U32 allocated_mem = LLMemory::getAllocatedMemKB().value();
static const F32 KB_to_MB = 1.f / 1024.f;
- U32 clamped_memory = llclamp(allocated_mem * KB_to_MB, (F32) low_mem_bound_MB, (F32) high_mem_bound_MB);
- const F32 adjust_range = high_mem_bound_MB - low_mem_bound_MB;
+ U32 clamped_memory = (U32)llclamp(allocated_mem * KB_to_MB, (F32) low_mem_bound_MB, (F32) high_mem_bound_MB);
+ const F32 adjust_range = (F32)(high_mem_bound_MB - low_mem_bound_MB);
const F32 adjust_factor = (high_mem_bound_MB - clamped_memory) / adjust_range; // [0, 1]
//min radius: all objects within this radius remain loaded in memory
@@ -502,7 +502,7 @@ void LLVOCacheEntry::updateDebugSettings()
static const U32 MIN_FRAMES = 10;
static const U32 MAX_FRAMES = 64;
const U32 clamped_frames = inv_obj_time ? llclamp((U32) inv_obj_time, MIN_FRAMES, MAX_FRAMES) : MAX_FRAMES; // [10, 64], with zero => 64
- sMinFrameRange = MIN_FRAMES + ((clamped_frames - MIN_FRAMES) * adjust_factor);
+ sMinFrameRange = MIN_FRAMES + (U32)((clamped_frames - MIN_FRAMES) * adjust_factor);
}
#endif // LL_TEST
@@ -1762,7 +1762,7 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
entry = new HeaderEntryInfo();
entry->mHandle = handle ;
- entry->mTime = time(NULL) ;
+ entry->mTime = (U32)time(NULL) ;
entry->mIndex = mNumEntries++;
mHeaderEntryQueue.insert(entry) ;
mHandleEntryMap[handle] = entry ;
@@ -1775,7 +1775,7 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
//resort
mHeaderEntryQueue.erase(entry) ;
- entry->mTime = time(NULL) ;
+ entry->mTime = (U32)time(NULL) ;
mHeaderEntryQueue.insert(entry) ;
}
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index e04bdbf1d9..6903af2619 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -451,6 +451,9 @@ void LLVOGrass::plantBlades()
face->setVertexBuffer(NULL);
face->setTEOffset(0);
face->mCenterLocal = mPosition + mRegionp->getOriginAgent();
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+ face->mExtents[0] = ext[0];
+ face->mExtents[1] = ext[1];
}
mDepth = (face->mCenterLocal - LLViewerCamera::getInstance()->getOrigin())*LLViewerCamera::getInstance()->getAtAxis();
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index c989b1f5d9..d53f512d82 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -38,7 +38,6 @@ class LLVOAvatar;
#include "llcallingcard.h" // for LLFriendObserver
#include "llsecapi.h"
#include "llcontrol.h"
-#include <boost/shared_ptr.hpp>
// devices
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index a489f96fe7..2358c04236 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -1283,7 +1283,7 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
{
if (result.has("retry") && ++retries <= CONNECT_RETRY_MAX && !sShuttingDown)
{
- F32 timeout = LLSD::Real(result["retry"]);
+ F32 timeout = (F32)LLSD::Real(result["retry"]);
timeout *= retries;
LL_INFOS("Voice") << "Retry connection to voice service in " << timeout << " seconds" << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp
index 4c3ab11623..22b53c0b85 100644
--- a/indra/newview/llvoicewebrtc.cpp
+++ b/indra/newview/llvoicewebrtc.cpp
@@ -24,7 +24,6 @@
* $/LicenseInfo$
*/
#include <algorithm>
-#include <format>
#include "llvoicewebrtc.h"
#include "llsdutil.h"
@@ -330,7 +329,7 @@ const LLVoiceVersionInfo& LLWebRTCVoiceClient::getVersion()
void LLWebRTCVoiceClient::updateSettings()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
setVoiceEnabled(LLVoiceClient::getInstance()->voiceEnabled());
static LLCachedControl<S32> sVoiceEarLocation(gSavedSettings, "VoiceEarLocation");
@@ -375,7 +374,7 @@ void LLWebRTCVoiceClient::removeObserver(LLVoiceClientParticipantObserver *obser
void LLWebRTCVoiceClient::notifyParticipantObservers()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
for (observer_set_t::iterator it = mParticipantObservers.begin(); it != mParticipantObservers.end();)
{
LLVoiceClientParticipantObserver *observer = *it;
@@ -397,7 +396,7 @@ void LLWebRTCVoiceClient::removeObserver(LLVoiceClientStatusObserver *observer)
void LLWebRTCVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
LL_DEBUGS("Voice") << "( " << LLVoiceClientStatusObserver::status2string(status) << " )"
<< " mSession=" << mSession << LL_ENDL;
@@ -588,7 +587,7 @@ void LLWebRTCVoiceClient::voiceConnectionCoro()
// for cross-region voice.
void LLWebRTCVoiceClient::updateNeighboringRegions()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
static const std::vector<LLVector3d> neighbors {LLVector3d(0.0f, 1.0f, 0.0f), LLVector3d(0.707f, 0.707f, 0.0f),
LLVector3d(1.0f, 0.0f, 0.0f), LLVector3d(0.707f, -0.707f, 0.0f),
@@ -621,7 +620,7 @@ void LLWebRTCVoiceClient::updateNeighboringRegions()
// shut down the current audio session to make room for the next one.
void LLWebRTCVoiceClient::leaveAudioSession()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
if(mSession)
{
@@ -681,7 +680,7 @@ void LLWebRTCVoiceClient::OnDevicesChangedImpl(const llwebrtc::LLWebRTCVoiceDevi
{
return;
}
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
@@ -761,7 +760,7 @@ void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume)
if (volume != mTuningSpeakerVolume)
{
- mTuningSpeakerVolume = volume;
+ mTuningSpeakerVolume = (int)volume;
}
}
@@ -769,11 +768,11 @@ float LLWebRTCVoiceClient::getAudioLevel()
{
if (mIsInTuningMode)
{
- return (1.0 - mWebRTCDeviceInterface->getTuningAudioLevel() * LEVEL_SCALE_WEBRTC) * mTuningMicGain / 2.1;
+ return (1.0f - mWebRTCDeviceInterface->getTuningAudioLevel() * LEVEL_SCALE_WEBRTC) * mTuningMicGain / 2.1f;
}
else
{
- return (1.0 - mWebRTCDeviceInterface->getPeerConnectionAudioLevel() * LEVEL_SCALE_WEBRTC) * mMicGain / 2.1;
+ return (1.0f - mWebRTCDeviceInterface->getPeerConnectionAudioLevel() * LEVEL_SCALE_WEBRTC) * mMicGain / 2.1f;
}
}
@@ -848,7 +847,7 @@ void LLWebRTCVoiceClient::setHidden(bool hidden)
// notify the observers.
void LLWebRTCVoiceClient::OnConnectionEstablished(const std::string &channelID, const LLUUID &regionID)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
if (gAgent.getRegion()->getRegionID() == regionID)
{
@@ -932,7 +931,7 @@ void LLWebRTCVoiceClient::setEarLocation(S32 loc)
void LLWebRTCVoiceClient::updatePosition(void)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
LLViewerRegion *region = gAgent.getRegion();
if (region && isAgentAvatarValid())
@@ -1061,7 +1060,7 @@ void LLWebRTCVoiceClient::enforceTether()
// standard 50m
void LLWebRTCVoiceClient::sendPositionUpdate(bool force)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
std::string spatial_data;
@@ -1177,7 +1176,7 @@ LLWebRTCVoiceClient::participantStatePtr_t LLWebRTCVoiceClient::addParticipantBy
void LLWebRTCVoiceClient::removeParticipantByID(const std::string &channelID, const LLUUID &id, const LLUUID& region)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
participantStatePtr_t result;
LLWebRTCVoiceClient::sessionState::ptr_t session = sessionState::matchSessionByChannelID(channelID);
@@ -1207,7 +1206,7 @@ LLWebRTCVoiceClient::participantState::participantState(const LLUUID& agent_id,
LLWebRTCVoiceClient::participantStatePtr_t LLWebRTCVoiceClient::sessionState::addParticipant(const LLUUID& agent_id, const LLUUID& region)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
participantStatePtr_t result;
@@ -1245,7 +1244,7 @@ LLWebRTCVoiceClient::participantStatePtr_t LLWebRTCVoiceClient::sessionState::ad
LLWebRTCVoiceClient::participantStatePtr_t LLWebRTCVoiceClient::sessionState::findParticipantByID(const LLUUID& id)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
participantStatePtr_t result;
participantUUIDMap::iterator iter = mParticipantsByUUID.find(id);
@@ -1260,7 +1259,7 @@ LLWebRTCVoiceClient::participantStatePtr_t LLWebRTCVoiceClient::sessionState::fi
void LLWebRTCVoiceClient::sessionState::removeParticipant(const LLWebRTCVoiceClient::participantStatePtr_t &participant)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
if (participant)
{
@@ -1543,7 +1542,7 @@ void LLWebRTCVoiceClient::setMicGain(F32 gain)
void LLWebRTCVoiceClient::setVoiceEnabled(bool enabled)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
LL_DEBUGS("Voice")
<< "( " << (enabled ? "enabled" : "disabled") << " )"
@@ -1949,7 +1948,7 @@ void LLWebRTCVoiceClient::sessionState::revive()
void LLWebRTCVoiceClient::sessionState::processSessionStates()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
auto iter = sSessions.begin();
while (iter != sSessions.end())
@@ -1970,7 +1969,7 @@ void LLWebRTCVoiceClient::sessionState::processSessionStates()
// process the states on each connection associated with a session.
bool LLWebRTCVoiceClient::sessionState::processConnectionStates()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
std::list<connectionPtr_t>::iterator iter = mWebRTCConnections.begin();
while (iter != mWebRTCConnections.end())
@@ -1994,7 +1993,7 @@ bool LLWebRTCVoiceClient::sessionState::processConnectionStates()
// on our location.
bool LLWebRTCVoiceClient::estateSessionState::processConnectionStates()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
if (!mShuttingDown)
{
@@ -2165,7 +2164,7 @@ LLVoiceWebRTCConnection::LLVoiceWebRTCConnection(const LLUUID &regionID, const s
// retries wait a short period...randomize it so
// all clients don't try to reconnect at once.
- mRetryWaitSecs = ((F32) rand() / (RAND_MAX)) + 0.5;
+ mRetryWaitSecs = (F32)((F32) rand() / (RAND_MAX)) + 0.5f;
mWebRTCPeerConnectionInterface = llwebrtc::newPeerConnection();
mWebRTCPeerConnectionInterface->setSignalingObserver(this);
@@ -2238,7 +2237,7 @@ void LLVoiceWebRTCConnection::processIceUpdates()
// will make the cap call to the server sending up the ICE candidates.
void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
if (connection->mShutDown || LLWebRTCVoiceClient::isShuttingDown())
{
@@ -2471,7 +2470,7 @@ void LLVoiceWebRTCConnection::sendData(const std::string &data)
// The simulator will pass this on to the Secondlife WebRTC server.
void LLVoiceWebRTCConnection::breakVoiceConnectionCoro(connectionPtr_t connection)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
LL_DEBUGS("Voice") << "Disconnecting voice." << LL_ENDL;
if (connection->mWebRTCDataInterface)
@@ -2534,7 +2533,7 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro(connectionPtr_t connectio
// will use the offer and answer to negotiate the session.
void LLVoiceWebRTCSpatialConnection::requestVoiceConnection()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID);
@@ -2607,7 +2606,7 @@ void LLVoiceWebRTCSpatialConnection::requestVoiceConnection()
void LLVoiceWebRTCConnection::OnVoiceConnectionRequestSuccess(const LLSD &result)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
if (LLWebRTCVoiceClient::isShuttingDown())
{
@@ -2662,7 +2661,7 @@ static llwebrtc::LLWebRTCPeerConnectionInterface::InitOptions getConnectionOptio
// Secondlife WebRTC server.
bool LLVoiceWebRTCConnection::connectionStateMachine()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
processIceUpdates();
@@ -2758,7 +2757,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
case VOICE_STATE_SESSION_UP:
{
mRetryWaitPeriod = 0;
- mRetryWaitSecs = ((F32) rand() / (RAND_MAX)) + 0.5;
+ mRetryWaitSecs = (F32)((F32) rand() / (RAND_MAX)) + 0.5f;
LLUUID agentRegionID;
if (isSpatial() && gAgent.getRegion())
{
@@ -2791,7 +2790,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
{
// back off the retry period, and do it by a small random
// bit so all clients don't reconnect at once.
- mRetryWaitSecs += ((F32) rand() / (RAND_MAX)) + 0.5;
+ mRetryWaitSecs += (F32)((F32) rand() / (RAND_MAX)) + 0.5f;
mRetryWaitPeriod = 0;
}
}
@@ -2880,7 +2879,7 @@ void LLVoiceWebRTCConnection::OnDataReceived(const std::string& data, bool binar
// this pointer.
void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool binary)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
if (mShutDown)
{
@@ -2893,7 +2892,7 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
return;
}
- boost::json::error_code ec;
+ boost::system::error_code ec;
boost::json::value voice_data_parsed = boost::json::parse(data, ec);
if (!ec) // don't collect comments
{
@@ -3047,7 +3046,7 @@ void LLVoiceWebRTCConnection::OnDataChannelReady(llwebrtc::LLWebRTCDataInterface
// to peers.
void LLVoiceWebRTCConnection::sendJoin()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
boost::json::object root;
@@ -3125,7 +3124,7 @@ LLVoiceWebRTCAdHocConnection::~LLVoiceWebRTCAdHocConnection()
// So, we have a separate requestVoiceConnection call.
void LLVoiceWebRTCAdHocConnection::requestVoiceConnection()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE;
LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID);
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 2b8ed74b0f..ab8d0d2564 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -107,7 +107,7 @@ void LLSkyTex::init(bool isShiny)
{
mTexture[i] = LLViewerTextureManager::getLocalTexture(false);
mTexture[i]->setAddressMode(LLTexUnit::TAM_CLAMP);
- mImageRaw[i] = new LLImageRaw(SKYTEX_RESOLUTION, SKYTEX_RESOLUTION, SKYTEX_COMPONENTS);
+ mImageRaw[i] = new LLImageRaw((U16)SKYTEX_RESOLUTION, (U16)SKYTEX_RESOLUTION, (S8)SKYTEX_COMPONENTS);
initEmpty(i);
}
@@ -139,7 +139,7 @@ LLSkyTex::~LLSkyTex()
S32 LLSkyTex::getResolution()
{
- return SKYTEX_RESOLUTION;
+ return (S32)SKYTEX_RESOLUTION;
}
S32 LLSkyTex::getCurrent()
@@ -172,8 +172,8 @@ void LLSkyTex::initEmpty(const S32 tex)
{
for (S32 j = 0; j < SKYTEX_RESOLUTION; ++j)
{
- const S32 basic_offset = (i * SKYTEX_RESOLUTION + j);
- S32 offset = basic_offset * SKYTEX_COMPONENTS;
+ const S32 basic_offset = (i * (S32)SKYTEX_RESOLUTION + j);
+ S32 offset = basic_offset * (S32)SKYTEX_COMPONENTS;
data[offset] = 0;
data[offset+1] = 0;
data[offset+2] = 0;
@@ -194,8 +194,8 @@ void LLSkyTex::create()
{
for (S32 j = 0; j < SKYTEX_RESOLUTION; ++j)
{
- const S32 basic_offset = (i * SKYTEX_RESOLUTION + j);
- S32 offset = basic_offset * SKYTEX_COMPONENTS;
+ const S32 basic_offset = (i * (S32)SKYTEX_RESOLUTION + j);
+ S32 offset = basic_offset * (S32)SKYTEX_COMPONENTS;
U32* pix = (U32*)(data + offset);
LLColor4U temp = LLColor4U(mSkyData[basic_offset]);
*pix = temp.asRGBA();
@@ -392,8 +392,8 @@ const LLVector3* LLHeavenBody::corners() const
Sky
***************************************/
-const S32 SKYTEX_TILE_RES_X = SKYTEX_RESOLUTION / NUM_TILES_X;
-const S32 SKYTEX_TILE_RES_Y = SKYTEX_RESOLUTION / NUM_TILES_Y;
+const S32 SKYTEX_TILE_RES_X = (S32)SKYTEX_RESOLUTION / NUM_TILES_X;
+const S32 SKYTEX_TILE_RES_Y = (S32)SKYTEX_RESOLUTION / NUM_TILES_Y;
LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
: LLStaticViewerObject(id, pcode, regionp, true),
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index ad7570105e..17cffcadb4 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -83,26 +83,26 @@ protected:
void setDir(const LLVector3 &dir, const S32 i, const S32 j)
{
- S32 offset = i * SKYTEX_RESOLUTION + j;
+ S32 offset = (S32)(i * SKYTEX_RESOLUTION + j);
mSkyDirs[offset] = dir;
}
const LLVector3 &getDir(const S32 i, const S32 j) const
{
- S32 offset = i * SKYTEX_RESOLUTION + j;
+ S32 offset = (S32)(i * SKYTEX_RESOLUTION + j);
return mSkyDirs[offset];
}
void setPixel(const LLColor4 &col, const S32 i, const S32 j)
{
- S32 offset = i * SKYTEX_RESOLUTION + j;
+ S32 offset = (S32)(i * SKYTEX_RESOLUTION + j);
mSkyData[offset] = col;
}
void setPixel(const LLColor4U &col, const S32 i, const S32 j)
{
LLImageDataSharedLock lock(mImageRaw[sCurrent]);
- S32 offset = (i * SKYTEX_RESOLUTION + j) * SKYTEX_COMPONENTS;
+ S32 offset = (S32)((i * SKYTEX_RESOLUTION + j) * SKYTEX_COMPONENTS);
U32* pix = (U32*) &(mImageRaw[sCurrent]->getData()[offset]);
*pix = col.asRGBA();
}
@@ -111,7 +111,7 @@ protected:
{
LLColor4U col;
LLImageDataSharedLock lock(mImageRaw[sCurrent]);
- S32 offset = (i * SKYTEX_RESOLUTION + j) * SKYTEX_COMPONENTS;
+ S32 offset = (S32)((i * SKYTEX_RESOLUTION + j) * SKYTEX_COMPONENTS);
U32* pix = (U32*) &(mImageRaw[sCurrent]->getData()[offset]);
col.fromRGBA( *pix );
return col;
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index 56742751e8..fdccf34e6a 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -142,7 +142,7 @@ void LLVOSurfacePatch::updateGL()
{
if (mPatchp)
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
mPatchp->updateGL();
}
}
@@ -245,7 +245,6 @@ bool LLVOSurfacePatch::updateLOD()
void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp)
{
@@ -260,21 +259,18 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,
updateMainGeometry(facep,
verticesp,
normalsp,
- texCoords0p,
texCoords1p,
indicesp,
index_offset);
updateNorthGeometry(facep,
verticesp,
normalsp,
- texCoords0p,
texCoords1p,
indicesp,
index_offset);
updateEastGeometry(facep,
verticesp,
normalsp,
- texCoords0p,
texCoords1p,
indicesp,
index_offset);
@@ -283,7 +279,6 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,
void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset)
@@ -322,10 +317,9 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
{
x = i * render_stride;
y = j * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
}
@@ -387,7 +381,6 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset)
@@ -421,10 +414,9 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * render_stride;
y = 16 - render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -433,10 +425,9 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
{
x = i * render_stride;
y = 16;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -469,10 +460,9 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * render_stride;
y = 16 - render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -482,10 +472,9 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * render_stride;
y = 16;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -525,10 +514,9 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * north_stride;
y = 16 - render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -538,10 +526,9 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
x = i * north_stride;
y = 16;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -577,7 +564,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset)
@@ -606,10 +592,9 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16 - render_stride;
y = i * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -618,10 +603,9 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
{
x = 16;
y = i * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -654,10 +638,9 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16 - render_stride;
y = i * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
// Iterate through the east patch's points
@@ -666,10 +649,9 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16;
y = i * render_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -708,10 +690,9 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16 - render_stride;
y = i * east_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
// Iterate through the east patch's points
@@ -720,10 +701,9 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
x = 16;
y = i * east_stride;
- mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
+ mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get());
verticesp++;
normalsp++;
- texCoords0p++;
texCoords1p++;
}
@@ -987,15 +967,15 @@ LLTerrainPartition::LLTerrainPartition(LLViewerRegion* regionp)
}
// Do not add vertices; honor strict vertex count specified by strider_vertex_count
-void gen_terrain_tangents(U16 strider_vertex_count,
+void gen_terrain_tangents(U32 strider_vertex_count,
U32 strider_index_count,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
LLStrider<LLVector4a> &tangentsp,
- LLStrider<LLVector2> &texCoords0p,
- LLStrider<U16> &indicesp)
+ LLStrider<U16> &indicesp,
+ F32 region_width)
{
- LL_PROFILE_ZONE_SCOPED
+ LL_PROFILE_ZONE_SCOPED;
LLVector4a *vertices = new LLVector4a[strider_vertex_count];
LLVector4a *normals = new LLVector4a[strider_vertex_count];
@@ -1003,14 +983,17 @@ void gen_terrain_tangents(U16 strider_vertex_count,
std::vector<LLVector2> texcoords(strider_vertex_count);
std::vector<U16> indices(strider_index_count);
- for (U16 v = 0; v < strider_vertex_count; ++v)
+ for (U32 v = 0; v < strider_vertex_count; ++v)
{
F32 *vert = verticesp[v].mV;
vertices[v] = LLVector4a(vert[0], vert[1], vert[2], 1.f);
F32 *n = normalsp[v].mV;
normals[v] = LLVector4a(n[0], n[1], n[2], 1.f);
tangents[v] = tangentsp[v];
- texcoords[v] = texCoords0p[v];
+
+ // Calculate texcoords on-the-fly using the terrain positions
+ texcoords[v].mV[VX] = verticesp[v].mV[VX] / region_width;
+ texcoords[v].mV[VY] = verticesp[v].mV[VY] / region_width;
}
for (U32 i = 0; i < strider_index_count; ++i)
{
@@ -1019,7 +1002,7 @@ void gen_terrain_tangents(U16 strider_vertex_count,
LLCalculateTangentArray(strider_vertex_count, vertices, normals, texcoords.data(), strider_index_count / 3, indices.data(), tangents);
- for (U16 v = 0; v < strider_vertex_count; ++v)
+ for (U32 v = 0; v < strider_vertex_count; ++v)
{
tangentsp[v] = tangents[v];
}
@@ -1039,14 +1022,12 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
LLStrider<LLVector3> vertices_start;
LLStrider<LLVector3> normals_start;
LLStrider<LLVector4a> tangents_start;
- LLStrider<LLVector2> texcoords_start;
LLStrider<LLVector2> texcoords2_start;
LLStrider<U16> indices_start;
llassert_always(buffer->getVertexStrider(vertices_start));
llassert_always(buffer->getNormalStrider(normals_start));
llassert_always(buffer->getTangentStrider(tangents_start));
- llassert_always(buffer->getTexCoord0Strider(texcoords_start));
llassert_always(buffer->getTexCoord1Strider(texcoords2_start));
llassert_always(buffer->getIndexStrider(indices_start));
@@ -1056,7 +1037,6 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
{
LLStrider<LLVector3> vertices = vertices_start;
LLStrider<LLVector3> normals = normals_start;
- LLStrider<LLVector2> texcoords = texcoords_start;
LLStrider<LLVector2> texcoords2 = texcoords2_start;
LLStrider<U16> indices = indices_start;
@@ -1069,7 +1049,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
facep->setVertexBuffer(buffer);
LLVOSurfacePatch* patchp = (LLVOSurfacePatch*) facep->getViewerObject();
- patchp->getTerrainGeometry(vertices, normals, texcoords, texcoords2, indices);
+ patchp->getTerrainGeometry(vertices, normals, texcoords2, indices);
indices_index += facep->getIndicesCount();
index_offset += facep->getGeomCount();
@@ -1082,10 +1062,20 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
LLStrider<LLVector3> vertices = vertices_start;
LLStrider<LLVector3> normals = normals_start;
LLStrider<LLVector4a> tangents = tangents_start;
- LLStrider<LLVector2> texcoords = texcoords_start;
LLStrider<U16> indices = indices_start;
- gen_terrain_tangents(index_offset, indices_index, vertices, normals, tangents, texcoords, indices);
+ F32 region_width = 256.0f;
+ if (mFaceList.empty())
+ {
+ llassert(false);
+ }
+ else
+ {
+ const LLViewerRegion* regionp = mFaceList[0]->getViewerObject()->getRegion();
+ llassert(regionp == mFaceList.back()->getViewerObject()->getRegion()); // Assume this spatial group is confined to one region
+ region_width = regionp->getWidth();
+ }
+ gen_terrain_tangents(index_offset, indices_index, vertices, normals, tangents, indices, region_width);
}
buffer->unmapBuffer();
diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h
index 2780b97a97..af5f05774b 100644
--- a/indra/newview/llvosurfacepatch.h
+++ b/indra/newview/llvosurfacepatch.h
@@ -41,14 +41,6 @@ class LLVOSurfacePatch : public LLStaticViewerObject
public:
static F32 sLODFactor;
- enum
- {
- VERTEX_DATA_MASK = (1 << LLVertexBuffer::TYPE_VERTEX) |
- (1 << LLVertexBuffer::TYPE_NORMAL) |
- (1 << LLVertexBuffer::TYPE_TEXCOORD0) |
- (1 << LLVertexBuffer::TYPE_TEXCOORD1)
- };
-
LLVOSurfacePatch(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
/*virtual*/ void markDead();
@@ -65,7 +57,6 @@ public:
/*virtual*/ void updateFaceSize(S32 idx);
void getTerrainGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp);
@@ -118,21 +109,18 @@ protected:
void updateMainGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset);
void updateNorthGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset);
void updateEastGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
U32 &index_offset);
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index a981c60ef2..d982592ee7 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -461,9 +461,7 @@ void LLVOTree::updateTextures()
{
setDebugText(llformat("%4.0f", (F32) sqrt(mPixelArea)));
}
- mTreeImagep->addTextureStats(mPixelArea);
}
-
}
@@ -479,7 +477,7 @@ LLDrawable* LLVOTree::createDrawable(LLPipeline *pipeline)
// Just a placeholder for an actual object...
LLFace *facep = mDrawable->addFace(poolp, mTreeImagep);
facep->setSize(1, 3);
-
+ facep->setTexture(LLRender::DIFFUSE_MAP, mTreeImagep);
updateRadius();
return mDrawable;
@@ -1169,6 +1167,10 @@ void LLVOTree::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
LLVector4a pos;
pos.load3(center.mV);
mDrawable->setPositionGroup(pos);
+
+ LLFace* facep = mDrawable->getFace(0);
+ facep->mExtents[0] = newMin;
+ facep->mExtents[1] = newMax;
}
bool LLVOTree::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, bool pick_transparent, bool pick_rigged, bool pick_unselectable, S32 *face_hitp,
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 2f03531f1d..7a7d88327b 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -851,19 +851,9 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
if (mSculptTexture.notNull())
{
- mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(),
- (S32)LLGLTexture::BOOST_SCULPTED));
mSculptTexture->setForSculpt() ;
- if(!mSculptTexture->isCachedRawImageReady())
- {
- S32 lod = llmin(mLOD, 3);
- F32 lodf = ((F32)(lod + 1.0f)/4.f);
- F32 tex_size = lodf * LLViewerTexture::sMaxSculptRez ;
- mSculptTexture->addTextureStats(2.f * tex_size * tex_size, false);
- }
-
- S32 texture_discard = mSculptTexture->getCachedRawImageLevel(); //try to match the texture
+ S32 texture_discard = mSculptTexture->getRawImageLevel(); //try to match the texture
S32 current_discard = getVolume() ? getVolume()->getSculptLevel() : -2 ;
if (texture_discard >= 0 && //texture has some data available
@@ -1159,7 +1149,9 @@ void LLVOVolume::updateSculptTexture()
LLUUID id = sculpt_params->getSculptTexture();
if (id.notNull())
{
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_SCULPTED, LLViewerTexture::LOD_TEXTURE);
+ mSculptTexture->forceToSaveRawImage(0, F32_MAX);
+ mSculptTexture->addTextureStats(256.f*256.f);
}
mSkinInfoUnavaliable = false;
@@ -1252,8 +1244,22 @@ void LLVOVolume::sculpt()
S8 sculpt_components = 0;
const U8* sculpt_data = NULL;
- S32 discard_level = mSculptTexture->getCachedRawImageLevel() ;
- LLImageRaw* raw_image = mSculptTexture->getCachedRawImage() ;
+ S32 discard_level = mSculptTexture->getRawImageLevel() ;
+ LLImageRaw* raw_image = mSculptTexture->getRawImage() ;
+
+ if (!raw_image)
+ {
+ raw_image = mSculptTexture->getSavedRawImage();
+ discard_level = mSculptTexture->getSavedRawImageLevel();
+ }
+
+ if (!raw_image)
+ {
+ // last resort, read back from GL
+ mSculptTexture->readbackRawImage();
+ raw_image = mSculptTexture->getRawImage();
+ discard_level = mSculptTexture->getRawImageLevel();
+ }
S32 max_discard = mSculptTexture->getMaxDiscardLevel();
if (discard_level > max_discard)
@@ -1269,8 +1275,8 @@ void LLVOVolume::sculpt()
if(current_discard < -2)
{
static S32 low_sculpty_discard_warning_count = 1;
- S32 exponent = llmax(1, llfloor( log10((F64) low_sculpty_discard_warning_count) ));
- S32 interval = pow(10.0, exponent);
+ S32 exponent = llmax(1, llfloor((F32)log10((F64) low_sculpty_discard_warning_count)));
+ S32 interval = (S32)pow(10.0, exponent);
if ( low_sculpty_discard_warning_count < 10 ||
(low_sculpty_discard_warning_count % interval) == 0)
{ // Log first 10 time, then decreasing intervals afterwards otherwise this can flood the logs
@@ -1288,8 +1294,8 @@ void LLVOVolume::sculpt()
else if (current_discard > MAX_DISCARD_LEVEL)
{
static S32 high_sculpty_discard_warning_count = 1;
- S32 exponent = llmax(1, llfloor( log10((F64) high_sculpty_discard_warning_count) ));
- S32 interval = pow(10.0, exponent);
+ S32 exponent = llmax(1, llfloor((F32)log10((F64) high_sculpty_discard_warning_count)));
+ S32 interval = (S32)pow(10.0, exponent);
if ( high_sculpty_discard_warning_count < 10 ||
(high_sculpty_discard_warning_count % interval) == 0)
{ // Log first 10 time, then decreasing intervals afterwards otherwise this can flood the logs
@@ -1310,8 +1316,6 @@ void LLVOVolume::sculpt()
if(!raw_image)
{
- llassert(discard_level < 0) ;
-
sculpt_width = 0;
sculpt_height = 0;
sculpt_data = NULL ;
@@ -1537,7 +1541,7 @@ bool LLVOVolume::calcLOD()
if (isRootEdit())
{
S32 total_tris = recursiveGetTriangleCount();
- S32 est_max_tris = recursiveGetEstTrianglesMax();
+ S32 est_max_tris = (S32)recursiveGetEstTrianglesMax();
setDebugText(llformat("TRIS SHOWN %d EST %d", total_tris, est_max_tris));
}
}
@@ -4049,12 +4053,12 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
// Scaling here is to make animated object vs
// non-animated object ARC proportional to the
// corresponding calculations for streaming cost.
- num_triangles = (ANIMATED_OBJECT_COST_PER_KTRI * 0.001 * costs.getEstTrisForStreamingCost())/0.06;
+ num_triangles = (U32)((ANIMATED_OBJECT_COST_PER_KTRI * 0.001f * costs.getEstTrisForStreamingCost())/0.06f);
}
else
{
F32 radius = getScale().length()*0.5f;
- num_triangles = costs.getRadiusWeightedTris(radius);
+ num_triangles = (U32)costs.getRadiusWeightedTris(radius);
}
}
@@ -4530,7 +4534,7 @@ F32 LLVOVolume::getBinRadius()
}
else
{
- F32 szf = size_factor;
+ F32 szf = (F32)size_factor;
radius = llmax(mDrawable->getRadius(), szf);
//radius = llmax(radius, mDrawable->mDistanceWRTCamera * distance_factor[0]);
}
@@ -5742,18 +5746,23 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
continue;
}
-#if 0
-#if LL_RELEASE_WITH_DEBUG_INFO
- const LLUUID pbr_id( "49c88210-7238-2a6b-70ac-92d4f35963cf" );
- const LLUUID obj_id( vobj->getID() );
- bool is_pbr = (obj_id == pbr_id);
-#else
- bool is_pbr = false;
-#endif
-#else
- LLGLTFMaterial *gltf_mat = facep->getTextureEntry()->getGLTFRenderMaterial();
+
+ LLFetchedGLTFMaterial *gltf_mat = (LLFetchedGLTFMaterial*) facep->getTextureEntry()->getGLTFRenderMaterial();
bool is_pbr = gltf_mat != nullptr;
-#endif
+
+ if (is_pbr)
+ {
+ // tell texture streaming system to ignore blinn-phong textures
+ facep->setTexture(LLRender::DIFFUSE_MAP, nullptr);
+ facep->setTexture(LLRender::NORMAL_MAP, nullptr);
+ facep->setTexture(LLRender::SPECULAR_MAP, nullptr);
+
+ // let texture streaming system know about PBR textures
+ facep->setTexture(LLRender::BASECOLOR_MAP, gltf_mat->mBaseColorTexture);
+ facep->setTexture(LLRender::GLTF_NORMAL_MAP, gltf_mat->mNormalTexture);
+ facep->setTexture(LLRender::METALLIC_ROUGHNESS_MAP, gltf_mat->mMetallicRoughnessTexture);
+ facep->setTexture(LLRender::EMISSIVE_MAP, gltf_mat->mEmissiveTexture);
+ }
//ALWAYS null out vertex buffer on rebuild -- if the face lands in a render
// batch, it will recover its vertex buffer reference from the spatial group
@@ -5871,7 +5880,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
F32 alpha;
if (is_pbr)
{
- alpha = gltf_mat ? gltf_mat->mBaseColor.mV[3] : 1.0;
+ alpha = gltf_mat ? gltf_mat->mBaseColor.mV[3] : 1.0f;
}
else
{
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp
index 34040e1aca..4a7e231f30 100644
--- a/indra/newview/llvowater.cpp
+++ b/indra/newview/llvowater.cpp
@@ -59,7 +59,6 @@ LLVOWater::LLVOWater(const LLUUID &id,
mbCanSelect = false;
setScale(LLVector3(256.f, 256.f, 0.f)); // Hack for setting scale for bounding boxes/visibility.
- mUseTexture = true;
mIsEdgePatch = false;
}
@@ -101,14 +100,7 @@ LLDrawable *LLVOWater::createDrawable(LLPipeline *pipeline)
LLDrawPoolWater *pool = (LLDrawPoolWater*) gPipeline.getPool(LLDrawPool::POOL_WATER);
- if (mUseTexture)
- {
- mDrawable->setNumFaces(1, pool, mRegionp->getLand().getWaterTexture());
- }
- else
- {
- mDrawable->setNumFaces(1, pool, LLWorld::getInstance()->getDefaultWaterTexture());
- }
+ mDrawable->setNumFaces(1, pool, LLWorld::getInstance()->getDefaultWaterTexture());
return mDrawable;
}
@@ -146,8 +138,8 @@ bool LLVOWater::updateGeometry(LLDrawable *drawable)
S32 size_y = LLPipeline::sRenderTransparentWater ? 8 : 1;
const LLVector3& scale = getScale();
- size_x *= llmin(llround(scale.mV[0] / 256.f), 8);
- size_y *= llmin(llround(scale.mV[1] / 256.f), 8);
+ size_x *= (S32)llmin(llround(scale.mV[0] / 256.f), 8);
+ size_y *= (S32)llmin(llround(scale.mV[1] / 256.f), 8);
const S32 num_quads = size_x * size_y;
face->setSize(vertices_per_quad * num_quads,
@@ -199,8 +191,8 @@ bool LLVOWater::updateGeometry(LLDrawable *drawable)
position_agent.mV[VX] += (x + 0.5f) * step_x;
position_agent.mV[VY] += (y + 0.5f) * step_y;
- position_agent.mV[VX] = llround(position_agent.mV[VX]);
- position_agent.mV[VY] = llround(position_agent.mV[VY]);
+ position_agent.mV[VX] = (F32)llround(position_agent.mV[VX]);
+ position_agent.mV[VY] = (F32)llround(position_agent.mV[VY]);
*verticesp++ = position_agent - right + up;
*verticesp++ = position_agent - right - up;
@@ -249,11 +241,6 @@ void setVecZ(LLVector3& v)
v.mV[VZ] = 1;
}
-void LLVOWater::setUseTexture(const bool use_texture)
-{
- mUseTexture = use_texture;
-}
-
void LLVOWater::setIsEdgePatch(const bool edge_patch)
{
mIsEdgePatch = edge_patch;
diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h
index adae86691a..ba3da510c4 100644
--- a/indra/newview/llvowater.h
+++ b/indra/newview/llvowater.h
@@ -70,13 +70,10 @@ public:
/*virtual*/ bool isActive() const; // Whether this object needs to do an idleUpdate.
- void setUseTexture(const bool use_texture);
void setIsEdgePatch(const bool edge_patch);
- bool getUseTexture() const { return mUseTexture; }
bool getIsEdgePatch() const { return mIsEdgePatch; }
protected:
- bool mUseTexture;
bool mIsEdgePatch;
S32 mRenderType;
};
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 5ee6aec9f9..8ce1a745c3 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -102,15 +102,21 @@ LLPanelWearableOutfitItem::Params::Params()
bool LLPanelWearableOutfitItem::postBuild()
{
+ if (mShowWidgets)
+ {
+ mAddWearableBtn = getChild<LLButton>("add_wearable");
+ mRemoveWearableBtn = getChild<LLButton>("remove_wearable");
+ }
+
LLPanelWearableListItem::postBuild();
if(mShowWidgets)
{
- addWidgetToRightSide("add_wearable");
- addWidgetToRightSide("remove_wearable");
+ addWidgetToRightSide(mAddWearableBtn);
+ addWidgetToRightSide(mRemoveWearableBtn);
- childSetAction("add_wearable", boost::bind(&LLPanelWearableOutfitItem::onAddWearable, this));
- childSetAction("remove_wearable", boost::bind(&LLPanelWearableOutfitItem::onRemoveWearable, this));
+ mAddWearableBtn->setClickedCallback(boost::bind(&LLPanelWearableOutfitItem::onAddWearable, this));
+ mRemoveWearableBtn->setClickedCallback(boost::bind(&LLPanelWearableOutfitItem::onRemoveWearable, this));
setWidgetsVisible(false);
reshapeWidgets();
@@ -205,12 +211,12 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
}
if(mShowWidgets)
{
- setShowWidget("add_wearable", !is_worn);
+ setShowWidget(mAddWearableBtn, !is_worn);
// Body parts can't be removed, only replaced
LLViewerInventoryItem* inv_item = getItem();
bool show_remove = is_worn && inv_item && (inv_item->getType() != LLAssetType::AT_BODYPART);
- setShowWidget("remove_wearable", show_remove);
+ setShowWidget(mRemoveWearableBtn, show_remove);
if(mHovered)
{
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index 7b69711154..3fe1059176 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -104,6 +104,8 @@ protected:
bool worn_indication_enabled, const Params& params, bool show_widgets = false);
private:
+ LLButton* mAddWearableBtn = nullptr;
+ LLButton* mRemoveWearableBtn = nullptr;
bool mWornIndicationEnabled;
bool mShowWidgets;
};
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index d8852de954..a319aa00bc 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -50,7 +50,6 @@
#include "llviewerwindow.h"
#include "llnotificationsutil.h"
#include "lluriparser.h"
-#include "uriparser/Uri.h"
bool on_load_url_external_response(const LLSD& notification, const LLSD& response, bool async );
diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp
index 83e417633a..feb5ecb1fb 100644
--- a/indra/newview/llwebprofile.cpp
+++ b/indra/newview/llwebprofile.cpp
@@ -38,6 +38,7 @@
// newview
#include "llavataractions.h" // for getProfileURL()
#include "llviewermedia.h" // FIXME: don't use LLViewerMedia internals
+#include "llnotificationsutil.h"
#include "llcorehttputil.h"
@@ -132,6 +133,10 @@ void LLWebProfile::uploadImageCoro(LLPointer<LLImageFormatted> image, std::strin
if (!status)
{
+ if (image->getDataSize() > MAX_WEB_DATASIZE)
+ {
+ LLNotificationsUtil::add("CannotUploadSnapshotWebTooBig");
+ }
LL_WARNS("Snapshots") << "Failed to get image upload config" << LL_ENDL;
LLWebProfile::reportImageUploadStatus(false);
return;
diff --git a/indra/newview/llwebprofile.h b/indra/newview/llwebprofile.h
index 335282bf13..a9cfa102c0 100644
--- a/indra/newview/llwebprofile.h
+++ b/indra/newview/llwebprofile.h
@@ -57,6 +57,8 @@ public:
static void setAuthCookie(const std::string& cookie);
static void setImageUploadResultCallback(status_callback_t cb) { mStatusCallback = cb; }
+ static constexpr S32 MAX_WEB_DATASIZE = 8 * 1024 * 1024; // 8MB
+
private:
static LLCore::HttpHeaders::ptr_t buildDefaultHeaders();
diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h
index d2801c86e1..770584c88d 100644
--- a/indra/newview/llwindebug.h
+++ b/indra/newview/llwindebug.h
@@ -30,10 +30,7 @@
#include "stdtypes.h"
#include "llwin32headerslean.h"
-#pragma warning (push)
-#pragma warning (disable:4091) // a microsoft header has warnings. Very nice.
#include <dbghelp.h>
-#pragma warning (pop)
class LLWinDebug:
public LLSingleton<LLWinDebug>
diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp
index 6221d67b26..ebcdd537a5 100644
--- a/indra/newview/llwindowlistener.cpp
+++ b/indra/newview/llwindowlistener.cpp
@@ -43,7 +43,6 @@
#include "stringize.h"
#include <typeinfo>
#include <map>
-#include <boost/scoped_ptr.hpp>
#include <boost/bind.hpp>
LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& kbgetter)
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 2eadea20ef..40bfa8ec83 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -805,10 +805,10 @@ void LLWorld::updateNetStats()
add(LLStatViewer::PACKETS_OUT, packets_out);
add(LLStatViewer::PACKETS_LOST, packets_lost);
- F32 total_packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN);
- if (total_packets_in > 0)
+ F32 total_packets_in = (F32)LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN);
+ if (total_packets_in > 0.f)
{
- F32 total_packets_lost = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_LOST);
+ F32 total_packets_lost = (F32)LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_LOST);
sample(LLStatViewer::PACKETS_LOST_PERCENT, LLUnits::Ratio::fromValue((F32)total_packets_lost/(F32)total_packets_in));
}
@@ -961,7 +961,6 @@ void LLWorld::updateWaterObjects()
if (!getRegionFromHandle(region_handle))
{ // No region at that area, so make water
LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion());
- waterp->setUseTexture(false);
waterp->setPositionGlobal(LLVector3d(x + rwidth/2,
y + rwidth/2,
256.f + water_height));
@@ -1015,7 +1014,6 @@ void LLWorld::updateWaterObjects()
mEdgeWaterObjects[dir] = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER,
gAgent.getRegion());
waterp = mEdgeWaterObjects[dir];
- waterp->setUseTexture(false);
waterp->setIsEdgePatch(true);
gPipeline.createObject(waterp);
}
@@ -1266,7 +1264,7 @@ void send_agent_pause()
void send_agent_resume()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
// Note: used to check for LLWorld initialization before it became a singleton.
// Rather than just remove this check I'm changing it to assure that the message
// system has been initialized. -MG
@@ -1322,35 +1320,32 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
}
// get the list of avatars from the character list first, so distances are correct
// when agent is above 1020m and other avatars are nearby
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
-
- if (!pVOAvatar->isDead() && !pVOAvatar->mIsDummy && !pVOAvatar->isOrphaned())
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead() && !avatar->mIsDummy && !avatar->isOrphaned())
{
- LLVector3d pos_global = pVOAvatar->getPositionGlobal();
- LLUUID uuid = pVOAvatar->getID();
+ LLVector3d pos_global = avatar->getPositionGlobal();
+ LLUUID uuid = avatar->getID();
if (!uuid.isNull()
&& dist_vec_squared(pos_global, relative_to) <= radius_squared)
{
- if(positions != NULL)
+ if (positions != NULL)
{
positions->push_back(pos_global);
}
- if(avatar_ids !=NULL)
+ if (avatar_ids != NULL)
{
avatar_ids->push_back(uuid);
}
}
}
}
+
// region avatars added for situations where radius is greater than RenderFarClip
- for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
- iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
+ for (const LLViewerRegion* regionp : LLWorld::getInstance()->getRegionList())
{
- LLViewerRegion* regionp = *iter;
const LLVector3d& origin_global = regionp->getOriginGlobal();
auto count = regionp->mMapAvatars.size();
for (size_t i = 0; i < count; i++)
@@ -1373,33 +1368,31 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
}
}
-F32 LLWorld::getNearbyAvatarsAndMaxGPUTime(std::vector<LLCharacter*> &valid_nearby_avs)
+F32 LLWorld::getNearbyAvatarsAndMaxGPUTime(std::vector<LLVOAvatar*> &valid_nearby_avs)
{
static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64);
+
F32 nearby_max_complexity = 0;
F32 radius = render_far_clip * render_far_clip;
- std::vector<LLCharacter*>::iterator char_iter = LLCharacter::sInstances.begin();
- while (char_iter != LLCharacter::sInstances.end())
+
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*char_iter);
- if (avatar && !avatar->isDead() && !avatar->isControlAvatar())
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (!avatar->isDead() && !avatar->isControlAvatar())
{
- if ((dist_vec_squared(avatar->getPositionGlobal(), gAgent.getPositionGlobal()) > radius) &&
- (dist_vec_squared(avatar->getPositionGlobal(), gAgentCamera.getCameraPositionGlobal()) > radius))
+ if ((dist_vec_squared(avatar->getPositionGlobal(), gAgent.getPositionGlobal()) <= radius) ||
+ (dist_vec_squared(avatar->getPositionGlobal(), gAgentCamera.getCameraPositionGlobal()) <= radius))
{
- char_iter++;
- continue;
- }
-
- if (!avatar->isTooSlow())
- {
- gPipeline.profileAvatar(avatar);
+ if (!avatar->isTooSlow())
+ {
+ gPipeline.profileAvatar(avatar);
+ }
+ nearby_max_complexity = llmax(nearby_max_complexity, avatar->getGPURenderTime());
+ valid_nearby_avs.push_back(avatar);
}
- nearby_max_complexity = llmax(nearby_max_complexity, avatar->getGPURenderTime());
- valid_nearby_avs.push_back(*char_iter);
}
- char_iter++;
}
+
return nearby_max_complexity;
}
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index 01f666d19a..dc95a4eff1 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -172,7 +172,7 @@ public:
// profile nearby avatars using gPipeline.profileAvatar and update their render times
// return max GPU time
- F32 getNearbyAvatarsAndMaxGPUTime(std::vector<LLCharacter*> &valid_nearby_avs);
+ F32 getNearbyAvatarsAndMaxGPUTime(std::vector<LLVOAvatar*> &valid_nearby_avs);
private:
void clearHoleWaterObjects();
diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h
index fb9d140851..aab19a4d5f 100644
--- a/indra/newview/llworldmap.h
+++ b/indra/newview/llworldmap.h
@@ -128,9 +128,9 @@ public:
LLPointer<LLViewerFetchedTexture> getLandForSaleImage(); // Get the overlay image, fetch it if necessary
bool isName(const std::string& name) const;
- bool isDown() { return (mAccess == SIM_ACCESS_DOWN); }
- bool isPG() { return (mAccess <= SIM_ACCESS_PG); }
- bool isAdult() { return (mAccess == SIM_ACCESS_ADULT); }
+ bool isDown() const { return (mAccess == SIM_ACCESS_DOWN); }
+ bool isPG() const { return (mAccess <= SIM_ACCESS_PG); }
+ bool isAdult() const { return (mAccess == SIM_ACCESS_ADULT); }
// Debug only
void dump() const; // Print the region info to the standard output
@@ -157,6 +157,8 @@ public:
const LLSimInfo::item_info_list_t& getLandForSaleAdult() const { return mLandForSaleAdult; }
const LLSimInfo::item_info_list_t& getAgentLocation() const { return mAgentLocations; }
+ const U64& getHandle() const { return mHandle; }
+
private:
U64 mHandle; // This is a hash of the X and Y world coordinates of the SW corner of the sim
std::string mName; // Region name
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 09a18a9825..4757bd42e0 100755
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -255,7 +255,7 @@ void LLWorldMapView::zoom(F32 zoom)
void LLWorldMapView::zoomWithPivot(F32 zoom, S32 x, S32 y)
{
mTargetMapScale = scaleFromZoom(zoom);
- sZoomPivot = LLVector2(x, y);
+ sZoomPivot = LLVector2((F32)x, (F32)y);
if (!sZoomTimer.getStarted() && mMapScale != mTargetMapScale)
{
sZoomTimer.start();
@@ -297,8 +297,8 @@ void LLWorldMapView::setScale(F32 scale, bool snap)
if (!sZoomPivot.isExactlyZero())
{
LLVector2 relative_pivot;
- relative_pivot.mV[VX] = sZoomPivot.mV[VX] - (getRect().getWidth() / 2.0);
- relative_pivot.mV[VY] = sZoomPivot.mV[VY] - (getRect().getHeight() / 2.0);
+ relative_pivot.mV[VX] = sZoomPivot.mV[VX] - (getRect().getWidth() / 2.0f);
+ relative_pivot.mV[VY] = sZoomPivot.mV[VY] - (getRect().getHeight() / 2.0f);
LLVector2 zoom_pan_offset = relative_pivot - (relative_pivot * scale / old_scale);
mPanX += zoom_pan_offset.mV[VX];
mPanY += zoom_pan_offset.mV[VY];
@@ -422,8 +422,8 @@ void LLWorldMapView::draw()
// Find x and y position relative to camera's center.
LLVector3d rel_region_pos = origin_global - camera_global;
- F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * mMapScale;
- F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * mMapScale;
+ F32 relative_x = (F32)(rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * mMapScale;
+ F32 relative_y = (F32)(rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * mMapScale;
// Coordinates of the sim in pixels in the UI panel
// When the view isn't panned, 0,0 = center of rectangle
@@ -514,11 +514,11 @@ void LLWorldMapView::draw()
{
font->renderUTF8(
mesg, 0,
- llfloor(left + 3), llfloor(bottom + 2),
+ (F32)llfloor(left + 3), (F32)llfloor(bottom + 2),
LLColor4::white,
LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW,
S32_MAX, //max_chars
- mMapScale, //max_pixels
+ (S32)mMapScale, //max_pixels
NULL,
/*use_ellipses*/true);
}
@@ -1023,18 +1023,20 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
drawImage(pos_global, sTrackCircleImage, color);
}
- // clamp text position to on-screen
- const S32 TEXT_PADDING = DEFAULT_TRACKING_ARROW_SIZE + 2;
- S32 half_text_width = llfloor(font->getWidthF32(label) * 0.5f);
- text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING);
- text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - font->getLineHeight() - TEXT_PADDING - vert_offset);
-
if (label != "")
{
- font->renderUTF8(
- label, 0,
- text_x,
- text_y,
+ // clamp text position to on-screen
+ const S32 TEXT_PADDING = DEFAULT_TRACKING_ARROW_SIZE + 2;
+
+ LLWString wlabel = utf8string_to_wstring(label);
+ S32 half_text_width = llfloor(font->getWidthF32(wlabel.c_str()) * 0.5f);
+ text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING);
+ text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - font->getLineHeight() - TEXT_PADDING - vert_offset);
+
+ font->render(
+ wlabel, 0,
+ (F32)text_x,
+ (F32)text_y,
LLColor4::white, LLFontGL::HCENTER,
LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW);
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
index e226fd4748..d8ea2b884f 100644
--- a/indra/newview/llworldmipmap.cpp
+++ b/indra/newview/llworldmipmap.cpp
@@ -178,6 +178,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32
}
}
+//static
LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level)
{
// Get the grid coordinates
diff --git a/indra/newview/llworldmipmap.h b/indra/newview/llworldmipmap.h
index ab98b55b72..907f24d1e7 100644
--- a/indra/newview/llworldmipmap.h
+++ b/indra/newview/llworldmipmap.h
@@ -74,11 +74,13 @@ public:
// Convert world coordinates to mipmap grid coordinates at a given level
static void globalToMipmap(F64 global_x, F64 global_y, S32 level, U32* grid_x, U32* grid_y);
+ // Load the relevant tile from S3
+ static LLPointer<LLViewerFetchedTexture> loadObjectsTile(U32 grid_x, U32 grid_y, S32 level);
+
private:
// Get a handle (key) from grid coordinates
U64 convertGridToHandle(U32 grid_x, U32 grid_y) { return to_region_handle(grid_x * REGION_WIDTH_UNITS, grid_y * REGION_WIDTH_UNITS); }
- // Load the relevant tile from S3
- LLPointer<LLViewerFetchedTexture> loadObjectsTile(U32 grid_x, U32 grid_y, S32 level);
+
// Clear a level from its "missing" tiles
void cleanMissedTilesFromLevel(S32 level);
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index 1148e81fd5..92e6c88752 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -34,16 +34,6 @@
// STL headers
#include <map>
#include <set>
-// std headers
-// external library headers
-#include <boost/scoped_ptr.hpp>
-#include <boost/range.hpp> // boost::begin(), boost::end()
-
-#ifdef LL_USESYSTEMLIBS
-#include <xmlrpc.h>
-#else
-#include <xmlrpc-epi/xmlrpc.h>
-#endif
#include "curl/curl.h"
@@ -178,13 +168,6 @@ public:
static const CURLcodeMapper sCURLcodeMapper;
-LLXMLRPCListener::LLXMLRPCListener(const std::string& pumpname):
- mBoundListener(LLEventPumps::instance().
- obtain(pumpname).
- listen("LLXMLRPCListener", boost::bind(&LLXMLRPCListener::process, this, _1)))
-{
-}
-
/**
* Capture an outstanding LLXMLRPCTransaction and poll it periodically until
* done.
@@ -213,38 +196,20 @@ public:
mMethod(command["method"]),
mReplyPump(command["reply"])
{
- // LL_ERRS if any of these are missing
- const char* required[] = { "uri", "method", "reply" };
- // optional: "options" (array of string)
- // Validate the request
- std::set<std::string> missing;
- for (const char** ri = boost::begin(required); ri != boost::end(required); ++ri)
+ // LL_ERRS if any of these keys are missing or empty
+ if (mUri.empty() || mMethod.empty() || mReplyPump.empty())
{
- // If the command does not contain this required entry, add it to 'missing'.
- if (! command.has(*ri))
- {
- missing.insert(*ri);
- }
- }
- if (! missing.empty())
- {
- LL_ERRS("LLXMLRPCListener") << mMethod << " request missing params: ";
- const char* separator = "";
- for (std::set<std::string>::const_iterator mi(missing.begin()), mend(missing.end());
- mi != mend; ++mi)
- {
- LL_CONT << separator << *mi;
- separator = ", ";
- }
- LL_CONT << LL_ENDL;
+ LL_ERRS("LLXMLRPCListener")
+ << "Some params are missing: "
+ << "reply: '" << mReplyPump << "', "
+ << "method: '" << mMethod << "', "
+ << "uri: '" << mUri << "'"
+ << LL_ENDL;
}
- // Build the XMLRPC request.
- XMLRPC_REQUEST request = XMLRPC_RequestNew();
- XMLRPC_RequestSetMethodName(request, mMethod.c_str());
- XMLRPC_RequestSetRequestType(request, xmlrpc_request_call);
- XMLRPC_VALUE xparams = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct);
- LLSD params(command["params"]);
+ LLSD request_params = LLSD::emptyMap();
+
+ LLSD params = command.get("params");
if (params.isMap())
{
for (LLSD::map_const_iterator pi(params.beginMap()), pend(params.endMap());
@@ -252,44 +217,33 @@ public:
{
std::string name(pi->first);
LLSD param(pi->second);
- if (param.isString())
+ switch (param.type())
{
- XMLRPC_VectorAppendString(xparams, name.c_str(), param.asString().c_str(), 0);
- }
- else if (param.isInteger() || param.isBoolean())
- {
- XMLRPC_VectorAppendInt(xparams, name.c_str(), param.asInteger());
- }
- else if (param.isReal())
- {
- XMLRPC_VectorAppendDouble(xparams, name.c_str(), param.asReal());
- }
- else
- {
- LL_ERRS("LLXMLRPCListener") << mMethod << " request param "
- << name << " has unknown type: " << param << LL_ENDL;
+ case LLSD::TypeString:
+ case LLSD::TypeInteger:
+ case LLSD::TypeReal:
+ request_params.insert(name, param);
+ break;
+ case LLSD::TypeBoolean:
+ request_params.insert(name, param.asInteger());
+ break;
+ default:
+ LL_ERRS("LLXMLRPCListener") << mMethod
+ << " request param '" << name << "' has unknown type: " << param << LL_ENDL;
}
}
}
- LLSD options(command["options"]);
+
+ LLSD options = command.get("options");
if (options.isArray())
{
- XMLRPC_VALUE xoptions = XMLRPC_CreateVector("options", xmlrpc_vector_array);
- for (LLSD::array_const_iterator oi(options.beginArray()), oend(options.endArray());
- oi != oend; ++oi)
- {
- XMLRPC_VectorAppendString(xoptions, NULL, oi->asString().c_str(), 0);
- }
- XMLRPC_AddValueToVector(xparams, xoptions);
+ request_params.insert("options", options);
}
- XMLRPC_RequestSetData(request, xparams);
- mTransaction.reset(new LLXMLRPCTransaction(mUri, request, true, command.has("http_params")? LLSD(command["http_params"]) : LLSD()));
+ LLSD http_params = command.get("http_params");
+ mTransaction.reset(new LLXMLRPCTransaction(mUri, mMethod, request_params, http_params));
mPreviousStatus = mTransaction->status(NULL);
- // Free the XMLRPC_REQUEST object and the attached data values.
- XMLRPC_RequestFree(request, 1);
-
// Now ensure that we get regular callbacks to poll for completion.
mBoundListener =
LLEventPumps::instance().
@@ -323,7 +277,7 @@ public:
data["error"] = "";
data["transfer_rate"] = 0.0;
LLEventPump& replyPump(LLEventPumps::instance().obtain(mReplyPump));
- if (! done)
+ if (!done)
{
// Not done yet, carry on.
if (status == LLXMLRPCTransaction::StatusDownloading
@@ -367,10 +321,8 @@ public:
// Given 'message', need we care?
if (status == LLXMLRPCTransaction::StatusComplete)
{
- // Success! Parse data.
- std::string status_string(data["status"]);
- data["responses"] = parseResponse(status_string);
- data["status"] = status_string;
+ // Success! Retrieve response data.
+ data["responses"] = mTransaction->response();
}
// whether successful or not, send reply on requested LLEventPump
@@ -378,7 +330,7 @@ public:
// need to wake up the loginCoro now
llcoro::suspend();
- // Because mTransaction is a boost::scoped_ptr, deleting this object
+ // Because mTransaction is a std::unique_ptr, deleting this object
// frees our LLXMLRPCTransaction object.
// Because mBoundListener is an LLTempBoundListener, deleting this
// object disconnects it from "mainloop".
@@ -388,159 +340,6 @@ public:
}
private:
- /// Derived from LLUserAuth::parseResponse() and parseOptionInto()
- LLSD parseResponse(std::string& status_string)
- {
- // Extract every member into data["responses"] (a map of string
- // values).
- XMLRPC_REQUEST response = mTransaction->response();
- if (! response)
- {
- LL_DEBUGS("LLXMLRPCListener") << "No response" << LL_ENDL;
- return LLSD();
- }
-
- XMLRPC_VALUE param = XMLRPC_RequestGetData(response);
- if (! param)
- {
- LL_DEBUGS("LLXMLRPCListener") << "Response contains no data" << LL_ENDL;
- return LLSD();
- }
-
- // Now, parse everything
- return parseValues(status_string, "", param);
- }
-
- LLSD parseValue(std::string& status_string, const std::string& key, const std::string& key_pfx, XMLRPC_VALUE param)
- {
- LLSD response;
-
- XMLRPC_VALUE_TYPE_EASY type = XMLRPC_GetValueTypeEasy(param);
- switch (type)
- {
- case xmlrpc_type_empty:
- LL_INFOS("LLXMLRPCListener") << "Empty result for key " << key_pfx << key << LL_ENDL;
- break;
- case xmlrpc_type_base64:
- {
- S32 len = XMLRPC_GetValueStringLen(param);
- const char* buf = XMLRPC_GetValueBase64(param);
- if ((len > 0) && buf)
- {
- // During implementation this code was not tested
- // If you encounter this, please make sure this is correct,
- // then remove llassert
- llassert(0);
-
- LLSD::Binary data;
- data.resize(len);
- memcpy((void*)&data[0], (void*)buf, len);
- response = data;
- }
- else
- {
- LL_WARNS("LLXMLRPCListener") << "Potentially malformed xmlrpc_type_base64 for key "
- << key_pfx << key << LL_ENDL;
- }
- break;
- }
- case xmlrpc_type_boolean:
- {
- response = LLSD::Boolean(XMLRPC_GetValueBoolean(param));
- LL_DEBUGS("LLXMLRPCListener") << "val: " << response << LL_ENDL;
- break;
- }
- case xmlrpc_type_datetime:
- {
- std::string iso8601_date(XMLRPC_GetValueDateTime_ISO8601(param));
- LL_DEBUGS("LLXMLRPCListener") << "val: " << iso8601_date << LL_ENDL;
- response = LLSD::Date(iso8601_date);
- break;
- }
- case xmlrpc_type_double:
- {
- response = LLSD::Real(XMLRPC_GetValueDouble(param));
- LL_DEBUGS("LLXMLRPCListener") << "val: " << response << LL_ENDL;
- break;
- }
- case xmlrpc_type_int:
- {
- response = LLSD::Integer(XMLRPC_GetValueInt(param));
- LL_DEBUGS("LLXMLRPCListener") << "val: " << response << LL_ENDL;
- break;
- }
- case xmlrpc_type_string:
- {
- response = LLSD::String(XMLRPC_GetValueString(param));
- LL_DEBUGS("LLXMLRPCListener") << "val: " << response << LL_ENDL;
- break;
- }
- case xmlrpc_type_mixed:
- case xmlrpc_type_array:
- {
- // We expect this to be an array of submaps. Walk the array,
- // recursively parsing each submap and collecting them.
- LLSD array;
- int i = 0; // for descriptive purposes
- for (XMLRPC_VALUE row = XMLRPC_VectorRewind(param); row;
- row = XMLRPC_VectorNext(param), ++i)
- {
- // Recursive call. For the lower-level key_pfx, if 'key'
- // is "foo", pass "foo[0]:", then "foo[1]:", etc. In the
- // nested call, a subkey "bar" will then be logged as
- // "foo[0]:bar", and so forth.
- // Parse the scalar subkey/value pairs from this array
- // entry into a temp submap. Collect such submaps in 'array'.
-
- array.append(parseValue(status_string, "",
- STRINGIZE(key_pfx << key << '[' << i << "]:"),
- row));
- }
- // Having collected an 'array' of 'submap's, insert that whole
- // 'array' as the value of this 'key'.
- response = array;
- break;
- }
- case xmlrpc_type_struct:
- {
- response = parseValues(status_string,
- STRINGIZE(key_pfx << key << ':'),
- param);
- break;
- }
- case xmlrpc_type_none: // Not expected
- default:
- // whoops - unrecognized type
- LL_WARNS("LLXMLRPCListener") << "Unhandled xmlrpc type " << type << " for key "
- << key_pfx << key << LL_ENDL;
- response = STRINGIZE("<bad XMLRPC type " << type << '>');
- status_string = "BadType";
- }
- return response;
- }
-
- /**
- * Parse key/value pairs from a given XMLRPC_VALUE into an LLSD map.
- * @param key_pfx Used to describe a given key in log messages. At top
- * level, pass "". When parsing an options array, pass the top-level key
- * name of the array plus the index of the array entry; to this we'll
- * append the subkey of interest.
- * @param param XMLRPC_VALUE iterator. At top level, pass
- * XMLRPC_RequestGetData(XMLRPC_REQUEST).
- */
- LLSD parseValues(std::string& status_string, const std::string& key_pfx, XMLRPC_VALUE param)
- {
- LLSD responses;
- for (XMLRPC_VALUE current = XMLRPC_VectorRewind(param); current;
- current = XMLRPC_VectorNext(param))
- {
- std::string key(XMLRPC_GetValueID(current));
- LL_DEBUGS("LLXMLRPCListener") << "key: " << key_pfx << key << LL_ENDL;
- responses.insert(key, parseValue(status_string, key, key_pfx, current));
- }
- return responses;
- }
-
const LLReqID mReqID;
const std::string mUri;
const std::string mMethod;
@@ -550,11 +349,18 @@ private:
LLXMLRPCTransaction::EStatus mPreviousStatus; // To detect state changes.
};
-bool LLXMLRPCListener::process(const LLSD& command)
+LLXMLRPCListener::LLXMLRPCListener(const std::string& pumpname)
+: mBoundListener(LLEventPumps::instance().obtain(pumpname).listen
+(
+ "LLXMLRPCListener",
+ [&](const LLSD& command) -> bool
+ {
+ // Allocate a new heap Poller, but do not save a pointer to it. Poller
+ // will check its own status and free itself on completion of the request.
+ (new Poller(command));
+ // Conventional event listener return
+ return false;
+ }
+))
{
- // Allocate a new heap Poller, but do not save a pointer to it. Poller
- // will check its own status and free itself on completion of the request.
- (new Poller(command));
- // conventional event listener return
- return false;
}
diff --git a/indra/newview/llxmlrpclistener.h b/indra/newview/llxmlrpclistener.h
index aaed98eec5..fd75acb8b1 100644
--- a/indra/newview/llxmlrpclistener.h
+++ b/indra/newview/llxmlrpclistener.h
@@ -42,9 +42,6 @@ public:
/// Specify the pump name on which to listen
LLXMLRPCListener(const std::string& pumpname);
- /// Handle request events on the event pump specified at construction time
- bool process(const LLSD& command);
-
private:
LLTempBoundListener mBoundListener;
};
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index ec6e22cd7a..48461241a2 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -42,22 +42,11 @@
#include "bufferarray.h"
#include "llversioninfo.h"
#include "llviewercontrol.h"
+#include "llxmlnode.h"
#include "stringize.h"
// Have to include these last to avoid queue redefinition!
-#ifdef LL_USESYSTEMLIBS
-#include <xmlrpc.h>
-#else
-#include <xmlrpc-epi/xmlrpc.h>
-#endif
-// <xmlrpc-epi/queue.h> contains a harmful #define queue xmlrpc_queue. This
-// breaks any use of std::queue. Ditch that #define: if any of our code wants
-// to reference xmlrpc_queue, let it reference it directly.
-#if defined(queue)
-#undef queue
-#endif
-
#include "llappviewer.h"
#include "lltrans.h"
@@ -75,123 +64,17 @@ namespace boost
// nothing.
static LLXMLRPCListener listener("LLXMLRPCTransaction");
-LLXMLRPCValue LLXMLRPCValue::operator[](const char* id) const
-{
- return LLXMLRPCValue(XMLRPC_VectorGetValueWithID(mV, id));
-}
-
-std::string LLXMLRPCValue::asString() const
-{
- const char* s = XMLRPC_GetValueString(mV);
- return s ? s : "";
-}
-
-int LLXMLRPCValue::asInt() const { return XMLRPC_GetValueInt(mV); }
-bool LLXMLRPCValue::asBool() const { return XMLRPC_GetValueBoolean(mV) != 0; }
-double LLXMLRPCValue::asDouble() const { return XMLRPC_GetValueDouble(mV); }
-
-LLXMLRPCValue LLXMLRPCValue::rewind()
-{
- return LLXMLRPCValue(XMLRPC_VectorRewind(mV));
-}
-
-LLXMLRPCValue LLXMLRPCValue::next()
-{
- return LLXMLRPCValue(XMLRPC_VectorNext(mV));
-}
-
-bool LLXMLRPCValue::isValid() const
-{
- return mV != NULL;
-}
-
-LLXMLRPCValue LLXMLRPCValue::createArray()
-{
- return LLXMLRPCValue(XMLRPC_CreateVector(NULL, xmlrpc_vector_array));
-}
-
-LLXMLRPCValue LLXMLRPCValue::createStruct()
-{
- return LLXMLRPCValue(XMLRPC_CreateVector(NULL, xmlrpc_vector_struct));
-}
-
-
-void LLXMLRPCValue::append(LLXMLRPCValue& v)
-{
- XMLRPC_AddValueToVector(mV, v.mV);
-}
-
-void LLXMLRPCValue::appendString(const std::string& v)
-{
- XMLRPC_AddValueToVector(mV, XMLRPC_CreateValueString(NULL, v.c_str(), 0));
-}
-
-void LLXMLRPCValue::appendInt(int v)
-{
- XMLRPC_AddValueToVector(mV, XMLRPC_CreateValueInt(NULL, v));
-}
-
-void LLXMLRPCValue::appendBool(bool v)
-{
- XMLRPC_AddValueToVector(mV, XMLRPC_CreateValueBoolean(NULL, v));
-}
-
-void LLXMLRPCValue::appendDouble(double v)
-{
- XMLRPC_AddValueToVector(mV, XMLRPC_CreateValueDouble(NULL, v));
-}
-
-
-void LLXMLRPCValue::append(const char* id, LLXMLRPCValue& v)
-{
- XMLRPC_SetValueID(v.mV, id, 0);
- XMLRPC_AddValueToVector(mV, v.mV);
-}
-
-void LLXMLRPCValue::appendString(const char* id, const std::string& v)
-{
- XMLRPC_AddValueToVector(mV, XMLRPC_CreateValueString(id, v.c_str(), 0));
-}
-
-void LLXMLRPCValue::appendInt(const char* id, int v)
-{
- XMLRPC_AddValueToVector(mV, XMLRPC_CreateValueInt(id, v));
-}
-
-void LLXMLRPCValue::appendBool(const char* id, bool v)
-{
- XMLRPC_AddValueToVector(mV, XMLRPC_CreateValueBoolean(id, v));
-}
-
-void LLXMLRPCValue::appendDouble(const char* id, double v)
-{
- XMLRPC_AddValueToVector(mV, XMLRPC_CreateValueDouble(id, v));
-}
-
-void LLXMLRPCValue::cleanup()
-{
- XMLRPC_CleanupValue(mV);
- mV = NULL;
-}
-
-XMLRPC_VALUE LLXMLRPCValue::getValue() const
-{
- return mV;
-}
-
-
class LLXMLRPCTransaction::Handler : public LLCore::HttpHandler
{
public:
Handler(LLCore::HttpRequest::ptr_t &request, LLXMLRPCTransaction::Impl *impl);
- virtual ~Handler();
- virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
+ void onCompleted(LLCore::HttpHandle handle,
+ LLCore::HttpResponse* response) override;
typedef std::shared_ptr<LLXMLRPCTransaction::Handler> ptr_t;
private:
-
LLXMLRPCTransaction::Impl *mImpl;
LLCore::HttpRequest::ptr_t mRequest;
};
@@ -213,18 +96,23 @@ public:
LLCore::HttpHandle mPostH;
std::string mURI;
-
std::string mProxyAddress;
std::string mResponseText;
- XMLRPC_REQUEST mResponse;
+ LLSD mResponseData;
+ bool mHasResponse;
+ bool mResponseParsed;
+
std::string mCertStore;
- LLSD mErrorCertData;
+ LLSD mErrorCertData;
- Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);
- Impl(const std::string& uri,
- const std::string& method, LLXMLRPCValue params, bool useGzip);
- ~Impl();
+ Impl
+ (
+ const std::string& uri,
+ const std::string& method,
+ const LLSD& params,
+ const LLSD& httpParams
+ );
bool process();
@@ -232,7 +120,8 @@ public:
void setHttpStatus(const LLCore::HttpStatus &status);
private:
- void init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);
+ bool parseResponse(LLXMLNodePtr root);
+ bool parseValue(LLSD& target, LLXMLNodePtr source);
};
LLXMLRPCTransaction::Handler::Handler(LLCore::HttpRequest::ptr_t &request,
@@ -242,10 +131,6 @@ LLXMLRPCTransaction::Handler::Handler(LLCore::HttpRequest::ptr_t &request,
{
}
-LLXMLRPCTransaction::Handler::~Handler()
-{
-}
-
void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle,
LLCore::HttpResponse * response)
{
@@ -272,92 +157,41 @@ void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle,
return;
}
- mImpl->setStatus(LLXMLRPCTransaction::StatusComplete);
mImpl->mTransferStats = response->getTransferStats();
- // the contents of a buffer array are potentially noncontiguous, so we
+ // The contents of a buffer array are potentially noncontiguous, so we
// will need to copy them into an contiguous block of memory for XMLRPC.
LLCore::BufferArray *body = response->getBody();
- char * bodydata = new char[body->size()];
-
- body->read(0, bodydata, body->size());
-
- mImpl->mResponse = XMLRPC_REQUEST_FromXML(bodydata, static_cast<int>(body->size()), 0);
-
- delete[] bodydata;
-
- bool hasError = false;
- bool hasFault = false;
- int faultCode = 0;
- std::string faultString;
-
- LLXMLRPCValue error(XMLRPC_RequestGetError(mImpl->mResponse));
- if (error.isValid())
- {
- hasError = true;
- faultCode = error["faultCode"].asInt();
- faultString = error["faultString"].asString();
- }
- else if (XMLRPC_ResponseIsFault(mImpl->mResponse))
- {
- hasFault = true;
- faultCode = XMLRPC_GetResponseFaultCode(mImpl->mResponse);
- faultString = XMLRPC_GetResponseFaultString(mImpl->mResponse);
- }
+ mImpl->mResponseText.resize(body->size());
- if (hasError || hasFault)
- {
- mImpl->setStatus(LLXMLRPCTransaction::StatusXMLRPCError);
-
- LL_WARNS() << "LLXMLRPCTransaction XMLRPC "
- << (hasError ? "error " : "fault ")
- << faultCode << ": "
- << faultString << LL_ENDL;
- LL_WARNS() << "LLXMLRPCTransaction request URI: "
- << mImpl->mURI << LL_ENDL;
- }
+ body->read(0, mImpl->mResponseText.data(), body->size());
+ // We do not do the parsing in the HTTP coroutine, since it could exhaust
+ // the coroutine stack in extreme cases. Instead, we flag the data buffer
+ // as ready, and let mImpl decode it in its process() method, on the main
+ // coroutine. HB
+ mImpl->mHasResponse = true;
+ mImpl->setStatus(LLXMLRPCTransaction::StatusComplete);
}
//=========================================================================
-LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
- XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
- : mHttpRequest(),
- mStatus(LLXMLRPCTransaction::StatusNotStarted),
- mURI(uri),
- mResponse(0)
-{
- init(request, useGzip, httpParams);
-}
-
-
-LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
- const std::string& method, LLXMLRPCValue params, bool useGzip)
- : mHttpRequest(),
- mStatus(LLXMLRPCTransaction::StatusNotStarted),
- mURI(uri),
- mResponse(0)
-{
- XMLRPC_REQUEST request = XMLRPC_RequestNew();
- XMLRPC_RequestSetMethodName(request, method.c_str());
- XMLRPC_RequestSetRequestType(request, xmlrpc_request_call);
- XMLRPC_RequestSetData(request, params.getValue());
-
- init(request, useGzip, LLSD());
- // DEV-28398: without this XMLRPC_RequestFree() call, it looks as though
- // the 'request' object is simply leaked. It's less clear to me whether we
- // should also ask to free request value data (second param 1), since the
- // data come from 'params'.
- XMLRPC_RequestFree(request, 1);
-}
-
-void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
+LLXMLRPCTransaction::Impl::Impl
+(
+ const std::string& uri,
+ const std::string& method,
+ const LLSD& params,
+ const LLSD& http_params
+)
+ : mHttpRequest()
+ , mStatus(LLXMLRPCTransaction::StatusNotStarted)
+ , mURI(uri)
+ , mHasResponse(false)
+ , mResponseParsed(false)
{
LLCore::HttpOptions::ptr_t httpOpts;
LLCore::HttpHeaders::ptr_t httpHeaders;
-
if (!mHttpRequest)
{
mHttpRequest = LLCore::HttpRequest::ptr_t(new LLCore::HttpRequest);
@@ -366,37 +200,34 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const
// LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer
httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions());
- // delay between repeats will start from 5 sec and grow to 20 sec with each repeat
- httpOpts->setMinBackoff(5E6L);
- httpOpts->setMaxBackoff(20E6L);
+ // Delay between repeats will start from 5 sec and grow to 20 sec with each repeat
+ httpOpts->setMinBackoff((LLCore::HttpTime)5E6L);
+ httpOpts->setMaxBackoff((LLCore::HttpTime)20E6L);
- httpOpts->setTimeout(httpParams.has("timeout") ? httpParams["timeout"].asInteger() : 40L);
- if (httpParams.has("retries"))
+ httpOpts->setTimeout(http_params.has("timeout") ? http_params["timeout"].asInteger() : 40L);
+ if (http_params.has("retries"))
{
- httpOpts->setRetries(httpParams["retries"].asInteger());
+ httpOpts->setRetries(http_params["retries"].asInteger());
}
- if (httpParams.has("DNSCacheTimeout"))
+ if (http_params.has("DNSCacheTimeout"))
{
- httpOpts->setDNSCacheTimeout(httpParams["DNSCacheTimeout"].asInteger());
+ httpOpts->setDNSCacheTimeout(http_params["DNSCacheTimeout"].asInteger());
}
bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
mCertStore = gSavedSettings.getString("CertStore");
- httpOpts->setSSLVerifyPeer( vefifySSLCert );
- httpOpts->setSSLVerifyHost( vefifySSLCert ? 2 : 0);
+ httpOpts->setSSLVerifyPeer(vefifySSLCert);
+ httpOpts->setSSLVerifyHost(vefifySSLCert ? 2 : 0);
// LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer
httpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders());
httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML);
- std::string user_agent = stringize(
- LLVersionInfo::instance().getChannel(), ' ',
- LLVersionInfo::instance().getMajor(), '.',
- LLVersionInfo::instance().getMinor(), '.',
- LLVersionInfo::instance().getPatch(), " (",
- LLVersionInfo::instance().getBuild(), ')');
+ const LLVersionInfo& vi(LLVersionInfo::instance());
+ std::string user_agent = vi.getChannel() + llformat(" %d.%d.%d (%llu)",
+ vi.getMajor(), vi.getMinor(), vi.getPatch(), vi.getBuild());
httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
@@ -404,31 +235,70 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const
//This might help with bug #503 */
//httpOpts->setDNSCacheTimeout(-1);
- LLCore::BufferArray::ptr_t body = LLCore::BufferArray::ptr_t(new LLCore::BufferArray());
-
- // TODO: See if there is a way to serialize to a preallocated buffer I'm
- // not fond of the copy here.
- int requestSize(0);
- char * requestText = XMLRPC_REQUEST_ToXML(request, &requestSize);
+ std::string request =
+ "<?xml version=\"1.0\"?><methodCall><methodName>" + method +
+ "</methodName><params><param>" + params.asXMLRPCValue() +
+ "</param></params></methodCall>";
- body->append(requestText, requestSize);
+ LLCore::BufferArray::ptr_t body = LLCore::BufferArray::ptr_t(new LLCore::BufferArray());
- XMLRPC_Free(requestText);
+ body->append(request.c_str(), request.size());
- mHandler = LLXMLRPCTransaction::Handler::ptr_t(new Handler( mHttpRequest, this ));
+ mHandler = LLXMLRPCTransaction::Handler::ptr_t(new Handler(mHttpRequest, this));
mPostH = mHttpRequest->requestPost(LLCore::HttpRequest::DEFAULT_POLICY_ID,
mURI, body.get(), httpOpts, httpHeaders, mHandler);
-
}
-
-LLXMLRPCTransaction::Impl::~Impl()
+bool LLXMLRPCTransaction::Impl::parseResponse(LLXMLNodePtr root)
{
- if (mResponse)
+ // We have already checked in LLXMLNode::parseBuffer() that root contains
+ // exactly one child.
+ if (!root->hasName("methodResponse"))
+ {
+ LL_WARNS() << "Invalid root element in XML response; request URI: "
+ << mURI << LL_ENDL;
+ return false;
+ }
+
+ LLXMLNodePtr first = root->getFirstChild();
+ LLXMLNodePtr second = first->getFirstChild();
+ if (first && !first->getNextSibling() && second &&
+ !second->getNextSibling())
{
- XMLRPC_RequestFree(mResponse, 1);
+ if (first->hasName("fault"))
+ {
+ LLSD fault;
+ if (parseValue(fault, second) && fault.isMap() &&
+ fault.has("faultCode") && fault.has("faultString"))
+ {
+ LL_WARNS() << "Request failed. faultCode: '"
+ << fault.get("faultCode").asString()
+ << "', faultString: '"
+ << fault.get("faultString").asString()
+ << "', request URI: " << mURI << LL_ENDL;
+ return false;
+ }
+ }
+ else if (first->hasName("params") &&
+ second->hasName("param") && !second->getNextSibling())
+ {
+ LLXMLNodePtr third = second->getFirstChild();
+ if (third && !third->getNextSibling() &&
+ parseValue(mResponseData, third))
+ {
+ return true;
+ }
+ }
}
+
+ LL_WARNS() << "Invalid response format; request URI: " << mURI << LL_ENDL;
+ return false;
+}
+
+bool LLXMLRPCTransaction::Impl::parseValue(LLSD& target, LLXMLNodePtr src)
+{
+ return src->fromXMLRPCValue(target);
}
bool LLXMLRPCTransaction::Impl::process()
@@ -439,6 +309,29 @@ bool LLXMLRPCTransaction::Impl::process()
return true; //failed, quit.
}
+ // Parse the response when we have one and it has not yet been parsed. HB
+ if (mHasResponse && !mResponseParsed)
+ {
+ LLXMLNodePtr root;
+ if (!LLXMLNode::parseBuffer(mResponseText.data(), mResponseText.size(),
+ root, nullptr))
+ {
+ LL_WARNS() << "Failed parsing XML in response; request URI: "
+ << mURI << LL_ENDL;
+ }
+ else if (parseResponse(root))
+ {
+ LL_INFOS() << "XMLRPC response parsed successfully; request URI: "
+ << mURI << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS() << "XMLRPC response parsing failed; request URI: "
+ << mURI << LL_ENDL;
+ }
+ mResponseParsed = true;
+ }
+
switch (mStatus)
{
case LLXMLRPCTransaction::StatusComplete:
@@ -539,18 +432,16 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status)
}
-
-LLXMLRPCTransaction::LLXMLRPCTransaction(
- const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
-: impl(* new Impl(uri, request, useGzip, httpParams))
-{ }
-
-
-LLXMLRPCTransaction::LLXMLRPCTransaction(
+LLXMLRPCTransaction::LLXMLRPCTransaction
+(
const std::string& uri,
- const std::string& method, LLXMLRPCValue params, bool useGzip)
-: impl(* new Impl(uri, method, params, useGzip))
-{ }
+ const std::string& method,
+ const LLSD& params,
+ const LLSD& http_params
+)
+: impl(*new Impl(uri, method, params, http_params))
+{
+}
LLXMLRPCTransaction::~LLXMLRPCTransaction()
{
@@ -590,14 +481,9 @@ std::string LLXMLRPCTransaction::statusURI()
return impl.mStatusURI;
}
-XMLRPC_REQUEST LLXMLRPCTransaction::response()
-{
- return impl.mResponse;
-}
-
-LLXMLRPCValue LLXMLRPCTransaction::responseValue()
+const LLSD& LLXMLRPCTransaction::response()
{
- return LLXMLRPCValue(XMLRPC_RequestGetData(impl.mResponse));
+ return impl.mResponseData;
}
diff --git a/indra/newview/llxmlrpctransaction.h b/indra/newview/llxmlrpctransaction.h
index 4c8796f936..f7a38f5f90 100644
--- a/indra/newview/llxmlrpctransaction.h
+++ b/indra/newview/llxmlrpctransaction.h
@@ -29,73 +29,22 @@
#include <string>
-typedef struct _xmlrpc_request* XMLRPC_REQUEST;
-typedef struct _xmlrpc_value* XMLRPC_VALUE;
- // foward decl of types from xmlrpc.h (this usage is type safe)
-class LLCertificate;
-
-class LLXMLRPCValue
- // a c++ wrapper around XMLRPC_VALUE
-{
-public:
- LLXMLRPCValue() : mV(NULL) { }
- LLXMLRPCValue(XMLRPC_VALUE value) : mV(value) { }
-
- bool isValid() const;
-
- std::string asString() const;
- int asInt() const;
- bool asBool() const;
- double asDouble() const;
-
- LLXMLRPCValue operator[](const char*) const;
-
- LLXMLRPCValue rewind();
- LLXMLRPCValue next();
-
- static LLXMLRPCValue createArray();
- static LLXMLRPCValue createStruct();
-
- void append(LLXMLRPCValue&);
- void appendString(const std::string&);
- void appendInt(int);
- void appendBool(bool);
- void appendDouble(double);
- void appendValue(LLXMLRPCValue&);
-
- void append(const char*, LLXMLRPCValue&);
- void appendString(const char*, const std::string&);
- void appendInt(const char*, int);
- void appendBool(const char*, bool);
- void appendDouble(const char*, double);
- void appendValue(const char*, LLXMLRPCValue&);
-
- void cleanup();
- // only call this on the top level created value
-
- XMLRPC_VALUE getValue() const;
-
-private:
- XMLRPC_VALUE mV;
-};
-
-
+/// An asynchronous request and responses via XML-RPC
class LLXMLRPCTransaction
- // an asynchronous request and responses via XML-RPC
{
public:
- LLXMLRPCTransaction(const std::string& uri,
- XMLRPC_REQUEST request, bool useGzip = true, const LLSD& httpParams = LLSD());
- // does not take ownership of the request object
- // request can be freed as soon as the transaction is constructed
-
- LLXMLRPCTransaction(const std::string& uri,
- const std::string& method, LLXMLRPCValue params, bool useGzip = true);
- // *does* take control of the request value, you must not free it
+ LLXMLRPCTransaction
+ (
+ const std::string& uri,
+ const std::string& method,
+ const LLSD& params,
+ const LLSD& http_params = LLSD()
+ );
~LLXMLRPCTransaction();
- typedef enum e_status {
+ typedef enum e_status
+ {
StatusNotStarted,
StatusStarted,
StatusDownloading,
@@ -105,26 +54,25 @@ public:
StatusOtherError
} EStatus;
+ /// Run the request a little, returns true when done
bool process();
- // run the request a little, returns true when done
+ /// Return a status, and extended CURL code, if code isn't null
EStatus status(int* curlCode);
- // return status, and extended CURL code, if code isn't null
LLSD getErrorCertData();
+
+ /// Return a message string, suitable for showing the user
std::string statusMessage();
- // return a message string, suitable for showing the user
+
+ /// Return a URI for the user with more information (can be empty)
std::string statusURI();
- // return a URI for the user with more information
- // can be empty
- XMLRPC_REQUEST response();
- LLXMLRPCValue responseValue();
- // only valid if StatusComplete, otherwise NULL
- // retains ownership of the result object, don't free it
+ /// Only non-empty if StatusComplete, otherwise Undefined
+ const LLSD& response();
+ /// Only valid if StsatusComplete, otherwise 0.0
F64 transferRate();
- // only valid if StsatusComplete, otherwise 0.0
private:
class Handler;
@@ -133,6 +81,4 @@ private:
Impl& impl;
};
-
-
#endif // LLXMLRPCTRANSACTION_H
diff --git a/indra/newview/noise.h b/indra/newview/noise.h
index ae819cf542..fe3292ab9e 100644
--- a/indra/newview/noise.h
+++ b/indra/newview/noise.h
@@ -344,7 +344,7 @@ static void init(void)
}
// reintroduce entropy
- srand(time(NULL)); // Flawfinder: ignore
+ srand((unsigned int)time(NULL)); // Flawfinder: ignore
}
#undef B
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 6c9c4751d7..98fdb68222 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -776,9 +776,11 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
if (mRT == &mMainRT)
{ // hacky -- allocate auxillary buffer
+
+ gCubeSnapshot = true;
+
if (sReflectionProbesEnabled)
{
- gCubeSnapshot = true;
mReflectionMapManager.initReflectionMaps();
}
@@ -810,17 +812,6 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
resY /= res_mod;
}
- //water reflection texture (always needed as scratch space whether or not transparent water is enabled)
- mWaterDis.allocate(resX, resY, GL_RGBA16F, true);
-
- if (RenderUIBuffer)
- {
- if (!mRT->uiScreen.allocate(resX,resY, GL_RGBA))
- {
- return false;
- }
- }
-
S32 shadow_detail = RenderShadowDetail;
bool ssao = RenderDeferredSSAO;
@@ -834,15 +825,6 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
mRT->deferredScreen.shareDepthBuffer(mRT->screen);
- if (samples > 0)
- {
- if (!mRT->fxaaBuffer.allocate(resX, resY, GL_RGBA)) return false;
- }
- else
- {
- mRT->fxaaBuffer.release();
- }
-
if (shadow_detail > 0 || ssao || RenderDepthOfField || samples > 0)
{ //only need mRT->deferredLight for shadows OR ssao OR dof OR fxaa
if (!mRT->deferredLight.allocate(resX, resY, GL_RGBA16F)) return false;
@@ -854,15 +836,45 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
allocateShadowBuffer(resX, resY);
- if (!gCubeSnapshot && RenderScreenSpaceReflections) // hack to not allocate mSceneMap for cube snapshots
+ if (!gCubeSnapshot) // hack to not re-allocate various targets for cube snapshots
{
- mSceneMap.allocate(resX, resY, GL_RGB, true);
- }
+ if (RenderUIBuffer)
+ {
+ if (!mUIScreen.allocate(resX, resY, GL_RGBA))
+ {
+ return false;
+ }
+ }
+
+ if (samples > 0)
+ {
+ if (!mFXAAMap.allocate(resX, resY, GL_RGBA)) return false;
+ }
+ else
+ {
+ mFXAAMap.release();
+ }
+
+ //water reflection texture (always needed as scratch space whether or not transparent water is enabled)
+ mWaterDis.allocate(resX, resY, GL_RGBA16F, true);
- const bool post_hdr = gSavedSettings.getBOOL("RenderPostProcessingHDR");
- const U32 post_color_fmt = post_hdr ? GL_RGBA16F : GL_RGBA;
- mPostMap.allocate(resX, resY, post_color_fmt);
+ if(RenderScreenSpaceReflections)
+ {
+ mSceneMap.allocate(resX, resY, GL_RGB, true);
+ }
+ else
+ {
+ mSceneMap.release();
+ }
+ const bool post_hdr = gSavedSettings.getBOOL("RenderPostProcessingHDR");
+ const U32 post_color_fmt = post_hdr ? GL_RGBA16F : GL_RGBA;
+ mPostMap.allocate(resX, resY, post_color_fmt);
+
+ // used to scale down textures
+ // See LLViwerTextureList::updateImagesCreateTextures and LLImageGL::scaleDown
+ mDownResMap.allocate(4, 4, GL_RGBA);
+ }
//HACK make screenbuffer allocations start failing after 30 seconds
if (gSavedSettings.getBOOL("SimulateFBOFailure"))
{
@@ -884,7 +896,7 @@ bool LLPipeline::allocateShadowBuffer(U32 resX, U32 resY)
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
S32 shadow_detail = RenderShadowDetail;
- F32 scale = llmax(0.f, RenderShadowResolutionScale);
+ F32 scale = gCubeSnapshot ? 1.0f : llmax(0.f, RenderShadowResolutionScale); // Don't scale probe shadow maps
U32 sun_shadow_map_width = BlurHappySize(resX, scale);
U32 sun_shadow_map_height = BlurHappySize(resY, scale);
@@ -1066,12 +1078,7 @@ void LLPipeline::refreshCachedSettings()
RenderScreenSpaceReflectionAdaptiveStepMultiplier = gSavedSettings.getF32("RenderScreenSpaceReflectionAdaptiveStepMultiplier");
RenderScreenSpaceReflectionGlossySamples = gSavedSettings.getS32("RenderScreenSpaceReflectionGlossySamples");
RenderBufferVisualization = gSavedSettings.getS32("RenderBufferVisualization");
- if (gSavedSettings.getBOOL("RenderMirrors") != RenderMirrors)
- {
- RenderMirrors = gSavedSettings.getBOOL("RenderMirrors");
- LLViewerShaderMgr::instance()->clearShaderCache();
- LLViewerShaderMgr::instance()->setShaders();
- }
+ RenderMirrors = gSavedSettings.getBOOL("RenderMirrors");
RenderHeroProbeUpdateRate = gSavedSettings.getS32("RenderHeroProbeUpdateRate");
RenderHeroProbeConservativeUpdateMultiplier = gSavedSettings.getS32("RenderHeroProbeConservativeUpdateMultiplier");
@@ -1109,11 +1116,19 @@ void LLPipeline::releaseGLBuffers()
mPostMap.release();
+ mFXAAMap.release();
+
+ mUIScreen.release();
+
+ mDownResMap.release();
+
for (U32 i = 0; i < 3; i++)
{
mGlow[i].release();
}
+ mHeroProbeManager.cleanup(); // release hero probes
+
releaseScreenBuffers();
gBumpImageList.destroyGL();
@@ -1144,15 +1159,15 @@ void LLPipeline::releaseShadowBuffers()
void LLPipeline::releaseScreenBuffers()
{
- mRT->uiScreen.release();
mRT->screen.release();
- mRT->fxaaBuffer.release();
mRT->deferredScreen.release();
mRT->deferredLight.release();
- mHeroProbeRT.uiScreen.release();
+ mAuxillaryRT.screen.release();
+ mAuxillaryRT.deferredScreen.release();
+ mAuxillaryRT.deferredLight.release();
+
mHeroProbeRT.screen.release();
- mHeroProbeRT.fxaaBuffer.release();
mHeroProbeRT.deferredScreen.release();
mHeroProbeRT.deferredLight.release();
}
@@ -1233,7 +1248,7 @@ void LLPipeline::createGLBuffers()
F32 noise[noiseRes*noiseRes*3];
for (U32 i = 0; i < noiseRes*noiseRes*3; i++)
{
- noise[i] = ll_frand()*2.0-1.0;
+ noise[i] = ll_frand()*2.0f-1.0f;
}
LLImageGL::generateTextures(1, &mTrueNoiseMap);
@@ -3577,9 +3592,12 @@ void LLPipeline::postSort(LLCamera &camera)
{
mSelectedFaces.clear();
+ bool tex_index_changed = false;
if (!gNonInteractive)
{
- LLPipeline::setRenderHighlightTextureChannel(gFloaterTools->getPanelFace()->getTextureChannelToEdit());
+ LLRender::eTexIndex tex_index = sRenderHighlightTextureChannel;
+ setRenderHighlightTextureChannel(gFloaterTools->getPanelFace()->getTextureChannelToEdit());
+ tex_index_changed = sRenderHighlightTextureChannel != tex_index;
}
// Draw face highlights for selected faces.
@@ -3601,6 +3619,24 @@ void LLPipeline::postSort(LLCamera &camera)
}
} func;
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func);
+
+ if (tex_index_changed)
+ {
+ // Rebuild geometry for all selected faces with PBR textures
+ for (const LLFace* face : gPipeline.mSelectedFaces)
+ {
+ if (const LLViewerObject* vobj = face->getViewerObject())
+ {
+ if (const LLTextureEntry* tep = vobj->getTE(face->getTEOffset()))
+ {
+ if (tep->getGLTFRenderMaterial())
+ {
+ gPipeline.markRebuild(face->getDrawable(), LLDrawable::REBUILD_VOLUME);
+ }
+ }
+ }
+ }
+ }
}
}
@@ -3653,28 +3689,31 @@ void render_hud_elements()
gUIProgram.unbind();
}
-void LLPipeline::renderHighlights()
+static inline void bindHighlightProgram(LLGLSLShader& program)
{
- assertInitialized();
-
- // Draw 3D UI elements here (before we clear the Z buffer in POOL_HUD)
- // Render highlighted faces.
- LLGLSPipelineAlpha gls_pipeline_alpha;
- LLColor4 color(1.f, 1.f, 1.f, 0.5f);
- disableLights();
-
if ((LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
{
- gHighlightProgram.bind();
- gGL.diffuseColor4f(1,1,1,0.5f);
+ program.bind();
+ gGL.diffuseColor4f(1, 1, 1, 0.5f);
}
+}
- if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED) && !mFaceSelectImagep)
- {
- mFaceSelectImagep = LLViewerTextureManager::getFetchedTexture(IMG_FACE_SELECT);
- }
+static inline void unbindHighlightProgram(LLGLSLShader& program)
+{
+ if (LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0)
+ {
+ program.unbind();
+ }
+}
- if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED) && (sRenderHighlightTextureChannel == LLRender::DIFFUSE_MAP))
+void LLPipeline::renderSelectedFaces(const LLColor4& color)
+{
+ if (!mFaceSelectImagep)
+ {
+ mFaceSelectImagep = LLViewerTextureManager::getFetchedTexture(IMG_FACE_SELECT);
+ }
+
+ if (mFaceSelectImagep)
{
// Make sure the selection image gets downloaded and decoded
mFaceSelectImagep->addTextureStats((F32)MAX_IMAGE_AREA);
@@ -3690,81 +3729,61 @@ void LLPipeline::renderHighlights()
facep->renderSelected(mFaceSelectImagep, color);
}
}
+}
- if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED))
- {
- // Paint 'em red!
- color.setVec(1.f, 0.f, 0.f, 0.5f);
-
- for (auto facep : mHighlightFaces)
- {
- facep->renderSelected(LLViewerTexture::sNullImagep, color);
- }
- }
+void LLPipeline::renderHighlights()
+{
+ assertInitialized();
- // Contains a list of the faces of objects that are physical or
- // have touch-handlers.
- mHighlightFaces.clear();
+ // Draw 3D UI elements here (before we clear the Z buffer in POOL_HUD)
+ // Render highlighted faces.
+ LLGLSPipelineAlpha gls_pipeline_alpha;
+ disableLights();
- if (LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0)
+ if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED))
{
- gHighlightProgram.unbind();
- }
+ bindHighlightProgram(gHighlightProgram);
-
- if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED) && (sRenderHighlightTextureChannel == LLRender::NORMAL_MAP))
- {
- color.setVec(1.0f, 0.5f, 0.5f, 0.5f);
- if ((LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
+ if (sRenderHighlightTextureChannel == LLRender::DIFFUSE_MAP ||
+ sRenderHighlightTextureChannel == LLRender::BASECOLOR_MAP ||
+ sRenderHighlightTextureChannel == LLRender::METALLIC_ROUGHNESS_MAP ||
+ sRenderHighlightTextureChannel == LLRender::GLTF_NORMAL_MAP ||
+ sRenderHighlightTextureChannel == LLRender::EMISSIVE_MAP ||
+ sRenderHighlightTextureChannel == LLRender::NUM_TEXTURE_CHANNELS)
{
- gHighlightNormalProgram.bind();
- gGL.diffuseColor4f(1,1,1,0.5f);
+ static const LLColor4 highlight_selected_color(1.f, 1.f, 1.f, 0.5f);
+ renderSelectedFaces(highlight_selected_color);
}
- mFaceSelectImagep->addTextureStats((F32)MAX_IMAGE_AREA);
-
- for (auto facep : mSelectedFaces)
+ // Paint 'em red!
+ static const LLColor4 highlight_face_color(1.f, 0.f, 0.f, 0.5f);
+ for (auto facep : mHighlightFaces)
{
- if (!facep || facep->getDrawable()->isDead())
- {
- LL_ERRS() << "Bad face on selection" << LL_ENDL;
- return;
- }
-
- facep->renderSelected(mFaceSelectImagep, color);
+ facep->renderSelected(LLViewerTexture::sNullImagep, highlight_face_color);
}
- if ((LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
- {
- gHighlightNormalProgram.unbind();
- }
+ unbindHighlightProgram(gHighlightProgram);
}
- if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED) && (sRenderHighlightTextureChannel == LLRender::SPECULAR_MAP))
+ // Contains a list of the faces of objects that are physical or
+ // have touch-handlers.
+ mHighlightFaces.clear();
+
+ if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED))
{
- color.setVec(0.0f, 0.3f, 1.0f, 0.8f);
- if ((LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
+ if (sRenderHighlightTextureChannel == LLRender::NORMAL_MAP)
{
- gHighlightSpecularProgram.bind();
- gGL.diffuseColor4f(1,1,1,0.5f);
+ static const LLColor4 highlight_normal_color(1.0f, 0.5f, 0.5f, 0.5f);
+ bindHighlightProgram(gHighlightNormalProgram);
+ renderSelectedFaces(highlight_normal_color);
+ unbindHighlightProgram(gHighlightNormalProgram);
}
-
- mFaceSelectImagep->addTextureStats((F32)MAX_IMAGE_AREA);
-
- for (auto facep : mSelectedFaces)
+ else if (sRenderHighlightTextureChannel == LLRender::SPECULAR_MAP)
{
- if (!facep || facep->getDrawable()->isDead())
- {
- LL_ERRS() << "Bad face on selection" << LL_ENDL;
- return;
- }
-
- facep->renderSelected(mFaceSelectImagep, color);
- }
-
- if ((LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
- {
- gHighlightSpecularProgram.unbind();
+ static const LLColor4 highlight_specular_color(0.0f, 0.3f, 1.0f, 0.8f);
+ bindHighlightProgram(gHighlightSpecularProgram);
+ renderSelectedFaces(highlight_specular_color);
+ unbindHighlightProgram(gHighlightSpecularProgram);
}
}
}
@@ -4562,7 +4581,8 @@ void LLPipeline::renderDebug()
mReflectionMapManager.renderDebug();
}
- if (gSavedSettings.getBOOL("RenderReflectionProbeVolumes") && !hud_only)
+ static LLCachedControl<bool> render_ref_probe_volumes(gSavedSettings, "RenderReflectionProbeVolumes");
+ if (render_ref_probe_volumes && !hud_only)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("probe debug display");
@@ -5284,7 +5304,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
assertInitialized();
- if (LLPipeline::sReflectionRender || gCubeSnapshot || LLPipeline::sRenderingHUDs)
+ if (LLPipeline::sReflectionRender || gCubeSnapshot || LLPipeline::sRenderingHUDs || LLApp::isExiting())
{
return;
}
@@ -6252,7 +6272,10 @@ bool LLPipeline::getRenderHighlights()
// static
void LLPipeline::setRenderHighlightTextureChannel(LLRender::eTexIndex channel)
{
- sRenderHighlightTextureChannel = channel;
+ if (channel != sRenderHighlightTextureChannel)
+ {
+ sRenderHighlightTextureChannel = channel;
+ }
}
LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection,
@@ -6434,16 +6457,14 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
}
}
- //check all avatar nametags (silly, isn't it?)
- for (std::vector< LLCharacter* >::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end();
- ++iter)
+ // check all avatar nametags (silly, isn't it?)
+ for (LLCharacter* character : LLCharacter::sInstances)
{
- LLVOAvatar* av = (LLVOAvatar*) *iter;
- if (av->mNameText.notNull()
- && av->mNameText->lineSegmentIntersect(start, local_end, position))
+ LLVOAvatar* avatar = (LLVOAvatar*)character;
+ if (avatar->mNameText.notNull() &&
+ avatar->mNameText->lineSegmentIntersect(start, local_end, position))
{
- drawable = av->mDrawable;
+ drawable = avatar->mDrawable;
local_end = position;
}
}
@@ -6906,7 +6927,7 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool
}
}
shader->uniform1f(dt, gFrameIntervalSeconds);
- shader->uniform2f(noiseVec, ll_frand() * 2.0 - 1.0, ll_frand() * 2.0 - 1.0);
+ shader->uniform2f(noiseVec, ll_frand() * 2.0f - 1.0f, ll_frand() * 2.0f - 1.0f);
shader->uniform3f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max);
mScreenTriangleVB->setBuffer();
@@ -6952,7 +6973,7 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst) {
shader.bindTexture(LLShaderMgr::EXPOSURE_MAP, &mExposureMap);
- shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, src->getWidth(), src->getHeight());
+ shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight());
static LLCachedControl<F32> exposure(gSavedSettings, "RenderExposure", 1.f);
@@ -7031,8 +7052,8 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
gGlowExtractProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,
- mGlow[2].getWidth(),
- mGlow[2].getHeight());
+ (GLfloat)mGlow[2].getWidth(),
+ (GLfloat)mGlow[2].getHeight());
}
{
@@ -7114,7 +7135,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
{
{
llassert(!gCubeSnapshot);
- bool multisample = RenderFSAASamples > 1 && mRT->fxaaBuffer.isComplete();
+ bool multisample = RenderFSAASamples > 1 && mFXAAMap.isComplete();
LLGLSLShader* shader = &gGlowCombineProgram;
S32 width = dst->getWidth();
@@ -7125,7 +7146,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
{
LL_PROFILE_GPU_ZONE("aa");
// bake out texture2D with RGBL for FXAA shader
- mRT->fxaaBuffer.bindTarget();
+ mFXAAMap.bindTarget();
shader = &gGlowCombineFXAAProgram;
shader->bind();
@@ -7145,16 +7166,16 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
shader->unbind();
- mRT->fxaaBuffer.flush();
+ mFXAAMap.flush();
dst->bindTarget();
shader = &gFXAAProgram;
shader->bind();
- channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mRT->fxaaBuffer.getUsage());
+ channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAAMap.getUsage());
if (channel > -1)
{
- mRT->fxaaBuffer.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
+ mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
}
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
@@ -7164,8 +7185,8 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
- F32 scale_x = (F32)width / mRT->fxaaBuffer.getWidth();
- F32 scale_y = (F32)height / mRT->fxaaBuffer.getHeight();
+ F32 scale_x = (F32)width / mFXAAMap.getWidth();
+ F32 scale_y = (F32)height / mFXAAMap.getHeight();
shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y);
shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f / width * scale_x, 1.f / height * scale_y);
shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f / width * scale_x, -0.5f / height * scale_y,
@@ -7357,7 +7378,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff);
gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff);
- gDeferredCoFProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, dst->getWidth(), dst->getHeight());
+ gDeferredCoFProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance / 1000.f);
gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant);
gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f / LLDrawable::sCurPixelAngle));
@@ -7383,7 +7404,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
gDeferredPostProgram.bind();
gDeferredPostProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->deferredLight, LLTexUnit::TFO_POINT);
- gDeferredPostProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, dst->getWidth(), dst->getHeight());
+ gDeferredPostProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
@@ -7399,7 +7420,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
{ // combine result based on alpha
dst->bindTarget();
- if (RenderFSAASamples > 1 && mRT->fxaaBuffer.isComplete())
+ if (RenderFSAASamples > 1 && mFXAAMap.isComplete())
{
glViewport(0, 0, dst->getWidth(), dst->getHeight());
}
@@ -7416,7 +7437,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT);
gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_LIGHT, &mRT->deferredLight, LLTexUnit::TFO_POINT);
- gDeferredDoFCombineProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, dst->getWidth(), dst->getHeight());
+ gDeferredDoFCombineProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth());
@@ -7779,15 +7800,15 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
shader.uniform1f(LLShaderMgr::DEFERRED_BLUR_SIZE, RenderShadowBlurSize);
shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_RADIUS, RenderSSAOScale);
- shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_MAX_RADIUS, RenderSSAOMaxScale);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_MAX_RADIUS, (GLfloat)RenderSSAOMaxScale);
F32 ssao_factor = RenderSSAOFactor;
shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_FACTOR, ssao_factor);
- shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_FACTOR_INV, 1.0/ssao_factor);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_FACTOR_INV, 1.0f/ssao_factor);
LLVector3 ssao_effect = RenderSSAOEffect;
- F32 matrix_diag = (ssao_effect[0] + 2.0*ssao_effect[1])/3.0;
- F32 matrix_nondiag = (ssao_effect[0] - ssao_effect[1])/3.0;
+ F32 matrix_diag = (ssao_effect[0] + 2.0f*ssao_effect[1])/3.0f;
+ F32 matrix_nondiag = (ssao_effect[0] - ssao_effect[1])/3.0f;
// This matrix scales (proj of color onto <1/rt(3),1/rt(3),1/rt(3)>) by
// value factor, and scales remainder by saturation factor
F32 ssao_effect_mat[] = { matrix_diag, matrix_nondiag, matrix_nondiag,
@@ -7799,7 +7820,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
F32 shadow_bias_error = RenderShadowBiasError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2])/3000.f;
F32 shadow_bias = RenderShadowBias + shadow_bias_error;
- shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, deferred_target->getWidth(), deferred_target->getHeight());
+ shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)deferred_target->getWidth(), (GLfloat)deferred_target->getHeight());
shader.uniform1f(LLShaderMgr::DEFERRED_NEAR_CLIP, LLViewerCamera::getInstance()->getNear()*2.f);
shader.uniform1f (LLShaderMgr::DEFERRED_SHADOW_OFFSET, RenderShadowOffset); //*shadow_offset_error);
shader.uniform1f(LLShaderMgr::DEFERRED_SHADOW_BIAS, shadow_bias);
@@ -7808,8 +7829,8 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
shader.uniform3fv(LLShaderMgr::DEFERRED_SUN_DIR, 1, mTransformedSunDir.mV);
shader.uniform3fv(LLShaderMgr::DEFERRED_MOON_DIR, 1, mTransformedMoonDir.mV);
- shader.uniform2f(LLShaderMgr::DEFERRED_SHADOW_RES, mRT->shadow[0].getWidth(), mRT->shadow[0].getHeight());
- shader.uniform2f(LLShaderMgr::DEFERRED_PROJ_SHADOW_RES, mSpotShadow[0].getWidth(), mSpotShadow[0].getHeight());
+ shader.uniform2f(LLShaderMgr::DEFERRED_SHADOW_RES, (GLfloat)mRT->shadow[0].getWidth(), (GLfloat)mRT->shadow[0].getHeight());
+ shader.uniform2f(LLShaderMgr::DEFERRED_PROJ_SHADOW_RES, (GLfloat)mSpotShadow[0].getWidth(), (GLfloat)mSpotShadow[0].getHeight());
shader.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff);
shader.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff);
@@ -7940,8 +7961,8 @@ void LLPipeline::renderDeferredLighting()
gDeferredSunProgram.uniform3fv(sOffset, slice, offset);
gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,
- deferred_light_target->getWidth(),
- deferred_light_target->getHeight());
+ (GLfloat)deferred_light_target->getWidth(),
+ (GLfloat)deferred_light_target->getHeight());
{
LLGLDisable blend(GL_BLEND);
@@ -8640,7 +8661,7 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
{
gGL.getTexUnit(channel)->bind(img);
- F32 lod_range = logf(img->getWidth())/logf(2.f);
+ F32 lod_range = logf((F32)img->getWidth())/logf(2.f);
shader.uniform1f(LLShaderMgr::PROJECTOR_FOCUS, focus);
shader.uniform1f(LLShaderMgr::PROJECTOR_LOD, lod_range);
@@ -8765,17 +8786,17 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader)
}
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ITR_COUNT, RenderScreenSpaceReflectionIterations);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ITR_COUNT, (GLfloat)RenderScreenSpaceReflectionIterations);
shader.uniform1f(LLShaderMgr::DEFERRED_SSR_DIST_BIAS, RenderScreenSpaceReflectionDistanceBias);
shader.uniform1f(LLShaderMgr::DEFERRED_SSR_RAY_STEP, RenderScreenSpaceReflectionRayStep);
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_GLOSSY_SAMPLES, RenderScreenSpaceReflectionGlossySamples);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_GLOSSY_SAMPLES, (GLfloat)RenderScreenSpaceReflectionGlossySamples);
shader.uniform1f(LLShaderMgr::DEFERRED_SSR_REJECT_BIAS, RenderScreenSpaceReflectionDepthRejectBias);
mPoissonOffset++;
if (mPoissonOffset > 128 - RenderScreenSpaceReflectionGlossySamples)
mPoissonOffset = 0;
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_NOISE_SINE, mPoissonOffset);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_NOISE_SINE, (GLfloat)mPoissonOffset);
shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ADAPTIVE_STEP_MULT, RenderScreenSpaceReflectionAdaptiveStepMultiplier);
channel = shader.enableTexture(LLShaderMgr::SCENE_DEPTH);
@@ -8957,7 +8978,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
gGL.diffuseColor4f(1, 1, 1, 1);
- S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
+ S32 shadow_detail = RenderShadowDetail;
// if not using VSM, disable color writes
if (shadow_detail <= 2)
@@ -9941,7 +9962,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
{
LLTrace::CountStatHandle<>* velocity_stat = LLViewerCamera::getVelocityStat();
F32 fade_amt = gFrameIntervalSeconds.value()
- * llmax(LLTrace::get_frame_recording().getLastRecording().getSum(*velocity_stat) / LLTrace::get_frame_recording().getLastRecording().getDuration().value(), 1.0);
+ * (F32)llmax(LLTrace::get_frame_recording().getLastRecording().getSum(*velocity_stat) / LLTrace::get_frame_recording().getLastRecording().getDuration().value(), 1.0);
// should never happen
llassert(mTargetShadowSpotLight[0] != mTargetShadowSpotLight[1] || mTargetShadowSpotLight[0].isNull());
@@ -10108,8 +10129,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
for (U32 i = 0; i < 16; i++)
{
- gGLLastModelView[i] = last_modelview[i];
- gGLLastProjection[i] = last_projection[i];
+ gGLLastModelView[i] = (F32)last_modelview[i];
+ gGLLastProjection[i] = (F32)last_projection[i];
}
popRenderTypeMask();
@@ -10570,10 +10591,13 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
sShadowRender = false;
popRenderTypeMask();
- gGL.matrixMode(LLRender::MM_PROJECTION);
- gGL.popMatrix();
- gGL.matrixMode(LLRender::MM_MODELVIEW);
- gGL.popMatrix();
+ if (!preview_avatar)
+ {
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
+ }
if (!preview_avatar && !for_profile)
{
@@ -10656,6 +10680,7 @@ bool LLPipeline::hasAnyRenderType(U32 type, ...) const
{
if (mRenderTypeEnabled[type])
{
+ va_end(args);
return true;
}
type = va_arg(args, U32);
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 1d2033b4f0..024303d5f0 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -342,6 +342,7 @@ public:
void renderHighlight(const LLViewerObject* obj, F32 fade);
void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, bool depth_clamp);
+ void renderSelectedFaces(const LLColor4& color);
void renderHighlights();
void renderDebug();
void renderPhysicsDisplay();
@@ -686,10 +687,7 @@ public:
//screen texture
LLRenderTarget screen;
- LLRenderTarget uiScreen;
LLRenderTarget deferredScreen;
- LLRenderTarget fxaaBuffer;
- LLRenderTarget edgeMap;
LLRenderTarget deferredLight;
//sun shadow map
@@ -725,6 +723,15 @@ public:
// tonemapped and gamma corrected render ready for post
LLRenderTarget mPostMap;
+ // FXAA helper target
+ LLRenderTarget mFXAAMap;
+
+ // render ui to buffer target
+ LLRenderTarget mUIScreen;
+
+ // downres scratch space for GPU downscaling of textures
+ LLRenderTarget mDownResMap;
+
LLCullResult mSky;
LLCullResult mReflectedObjects;
LLCullResult mRefractedObjects;
diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml
index 7bcae69779..604eb7c58f 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -69,7 +69,6 @@ OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
PCRE Copyright (c) 1997-2008 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
google-perftools Copyright (c) 2005, Google Inc.
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index 10ccf0d5da..320db7f654 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -28,7 +28,6 @@ mit Open-Source-Beiträgen von:</text>
PCRE Copyright (c) 1997-2012 University of Cambridge.
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga.
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com).
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-loup Gailly und Mark Adler.
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index ff2fa93cbb..126cd84d56 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -111,7 +111,6 @@ Dummy Name replaced at run time
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
diff --git a/indra/newview/skins/default/xui/en/floater_bulk_upload.xml b/indra/newview/skins/default/xui/en/floater_bulk_upload.xml
new file mode 100644
index 0000000000..b2d03a5d04
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_bulk_upload.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ can_resize="false"
+ show_title="false"
+ can_minimize="false"
+ can_close="false"
+ header_height="10"
+ bg_opaque_image="Window_NoTitle_Foreground"
+ bg_alpha_image="Window_NoTitle_Background"
+ height="207"
+ layout="topleft"
+ name="bulk_upload"
+ width="430">
+ <layout_stack
+ follows="all"
+ height="203"
+ layout="topleft"
+ left="8"
+ animate="false"
+ top="1"
+ orientation="vertical"
+ name="maint_layout"
+ width="421">
+ <layout_panel
+ follows="all"
+ height="27"
+ layout="topleft"
+ auto_resize="false"
+ visible="true"
+ name="count_panel">
+ <text
+ follows="left|top"
+ layout="topleft"
+ top="6"
+ left="20"
+ name="number_of_items"
+ height="20"
+ wrap="true">
+ Number of items to upload: [COUNT]
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="37"
+ layout="topleft"
+ auto_resize="false"
+ visible="true"
+ name="warning_panel">
+ <text
+ name="textures_2k_warning"
+ follows="left|top"
+ layout="topleft"
+ top="6"
+ left="20"
+ height="30"
+ right="-20"
+ wrap="true">
+ By default, one or more selected textures will be scaled to 2048px.
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="23"
+ layout="topleft"
+ auto_resize="false"
+ visible="true"
+ name="checkbox_panel">
+ <check_box
+ height="16"
+ left="20"
+ label="Scale textures to a maximum of 1024px"
+ layout="topleft"
+ name="upload_2k" />
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="27"
+ layout="topleft"
+ auto_resize="false"
+ visible="true"
+ name="cost_panel">
+ <text
+ name="upload_cost"
+ follows="left|top"
+ layout="topleft"
+ font.style="BOLD"
+ top="6"
+ left="20"
+ height="20"
+ wrap="true">
+ Upload cost: L$[COST]
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="29"
+ layout="topleft"
+ auto_resize="false"
+ visible="true"
+ name="buttoms_panel">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Upload"
+ layout="topleft"
+ mouse_opaque="false"
+ name="upload_btn"
+ top="1"
+ left="84"
+ width="120" />
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="12"
+ top_delta="0"
+ mouse_opaque="false"
+ name="cancel_btn"
+ width="120" />
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="40"
+ layout="topleft"
+ auto_resize="false"
+ visible="true"
+ name="link_panel">
+ <text
+ follows="left|top"
+ layout="topleft"
+ top="6"
+ left="20"
+ name="new_folder_textbox"
+ height="39"
+ parse_urls="true"
+ skip_link_underline="true"
+ wrap="true">
+How textures are scaled during upload:
+https://wiki.secondlife.com/wiki/Limits#All_Viewers
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_fast_timers.xml b/indra/newview/skins/default/xui/en/floater_fast_timers.xml
index f5852fdfaf..00411ba20b 100644
--- a/indra/newview/skins/default/xui/en/floater_fast_timers.xml
+++ b/indra/newview/skins/default/xui/en/floater_fast_timers.xml
@@ -73,7 +73,9 @@
name="scroll_vert"
orientation="vertical"
step_size="16"
+ doc_pos="0"
doc_size="3000"
+ page_size="0"
/>
</layout_panel>
<layout_panel name="timers_panel"
diff --git a/indra/newview/skins/default/xui/en/floater_gltf_asset_editor.xml b/indra/newview/skins/default/xui/en/floater_gltf_asset_editor.xml
new file mode 100644
index 0000000000..b17d0aa5b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_gltf_asset_editor.xml
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ default_tab_group="1"
+ height="530"
+ width="256"
+ min_height="400"
+ min_width="200"
+ layout="topleft"
+ name="gltf asset editor"
+ title="[OBJECT_NAME]">
+ <floater.string name="floater_title" value="GLTF Scene Editor"/>
+ <floater.string name="scene_tittle" value="Scene"/>
+ <floater.string name="node_tittle" value="Node"/>
+ <floater.string name="mesh_tittle" value="Mesh"/>
+ <floater.string name="skin_tittle" value="Skin"/>
+
+ <layout_stack
+ name="main_layout"
+ orientation="vertical"
+ follows="all"
+ bottom="-1"
+ top="16"
+ left="5"
+ right="-1"
+ border_size="0">
+
+ <layout_panel
+ name="top_lp"
+ border="true"
+ bevel_style="in"
+ auto_resize="false"
+ user_resize="true"
+ visible="true"
+ height="200">
+ <panel
+ follows="all"
+ layout="topleft"
+ name="item_list_panel"
+ visible="true"
+ bottom="-1"
+ top="1"
+ left="5"
+ right="-1"/>
+ </layout_panel>
+
+ <layout_panel
+ name="transforms_panel"
+ border="true"
+ bevel_style="in"
+ auto_resize="true"
+ user_resize="true"
+ visible="true"
+ height="150">
+ <menu_button
+ menu_filename="menu_copy_paste_pos.xml"
+ follows="top|left"
+ height="11"
+ image_disabled="ClipboardSmallMenu_Disabled"
+ image_selected="ClipboardSmallMenu_Press"
+ image_unselected="ClipboardSmallMenu_Off"
+ layout="topleft"
+ left="4"
+ top="10"
+ name="clipboard_pos_btn"
+ tool_tip="Paste options"
+ width="19"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ name="label position"
+ tool_tip="Position (meters)"
+ left_pad="8"
+ top_delta="0"
+ width="121">
+ Position (m)
+ </text>
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="-27"
+ max_val="512"
+ min_val="-256"
+ name="Pos X"
+ text_enabled_color="1 0 0.3 .7"
+ top_pad="8"
+ width="87" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="512"
+ min_val="-256"
+ name="Pos Y"
+ text_enabled_color="EmphasisColor"
+ top_pad="3"
+ width="87" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Z"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="4096"
+ min_val="-32"
+ name="Pos Z"
+ text_enabled_color="0 0.8 1 .65"
+ top_pad="3"
+ width="87" />
+ <menu_button
+ menu_filename="menu_copy_paste_size.xml"
+ follows="top|left"
+ height="11"
+ image_disabled="ClipboardSmallMenu_Disabled"
+ image_selected="ClipboardSmallMenu_Press"
+ image_unselected="ClipboardSmallMenu_Off"
+ layout="topleft"
+ left_delta="0"
+ top_pad="13"
+ name="clipboard_size_btn"
+ tool_tip="Paste options"
+ width="19"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="8"
+ top_delta="0"
+ name="label size"
+ tool_tip="Size (meters)"
+ width="121">
+ Size (m)
+ </text>
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="-27"
+ max_val="64"
+ min_val="0.01"
+ name="Scale X"
+ text_enabled_color="1 1 1 1"
+ top_pad="8"
+ width="87" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="64"
+ min_val="0.01"
+ name="Scale Y"
+ text_enabled_color="1 1 1 1"
+ top_pad="3"
+ width="87" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Z"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="64"
+ min_val="0.01"
+ name="Scale Z"
+ text_enabled_color="1 1 1 1"
+ top_pad="3"
+ width="87" />
+ <menu_button
+ menu_filename="menu_copy_paste_rot.xml"
+ follows="top|left"
+ height="11"
+ image_disabled="ClipboardSmallMenu_Disabled"
+ image_selected="ClipboardSmallMenu_Press"
+ image_unselected="ClipboardSmallMenu_Off"
+ layout="topleft"
+ left_delta="0"
+ top_pad="13"
+ name="clipboard_rot_btn"
+ tool_tip="Paste options"
+ width="19"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="8"
+ top_delta="0"
+ name="label rotation"
+ tool_tip="Rotation (degrees)"
+ width="121">
+ Rotation (°)
+ </text>
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="-27"
+ max_val="9999"
+ min_val="-9999"
+ name="Rot X"
+ text_enabled_color="1 1 1 1"
+ top_pad="8"
+ width="87" />
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="9999"
+ min_val="-9999"
+ name="Rot Y"
+ text_enabled_color="1 1 1 1"
+ top_pad="3"
+ width="87" />
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="0"
+ label="Z"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="9999"
+ min_val="-9999"
+ name="Rot Z"
+ text_enabled_color="1 1 1 1"
+ top_pad="3"
+ width="87" />
+ </layout_panel>
+
+ <layout_panel
+ name="blank_panel"
+ border="true"
+ bevel_style="in"
+ auto_resize="true"
+ user_resize="true"
+ visible="false"
+ height="150">
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index 4df29c47de..176a2ca1a4 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -14,7 +14,7 @@
reuse_instance="true"
title="CONVERSATIONS"
bottom="-50"
- right="-5"
+ left="5"
width="450"
min_width="38">
<string
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 738d448f00..7b06bed0a3 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -341,7 +341,6 @@
name="emoji_recent_empty_text"
follows="top|left|right"
layout="topleft"
- auto_resize="false"
h_pad="20"
v_pad="10"
top="0"
diff --git a/indra/newview/skins/default/xui/en/floater_region_restart_schedule.xml b/indra/newview/skins/default/xui/en/floater_region_restart_schedule.xml
new file mode 100644
index 0000000000..fd04acde35
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_region_restart_schedule.xml
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ height="180"
+ layout="topleft"
+ name="floater_region_restart_schedule"
+ help_topic="Preferences_Graphics_Advanced"
+ single_instance="true"
+ save_rect="true"
+ title="REGION RESTART SCHEDULE"
+ width="300">
+
+<!-- This block shows Advanced Settings -->
+ <floater.string name="am_string">am</floater.string>
+ <floater.string name="pm_string">pm</floater.string>
+
+ <text
+ name="days_general"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ height="16"
+ top="15"
+ left="20"
+ width="328">
+ Restart the region on following days:
+ </text>
+
+ <check_box
+ name="s_chk"
+ label=""
+ tool_tip="Sunday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left="60"
+ top_pad="5" />
+
+ <check_box
+ name="m_chk"
+ label=""
+ tool_tip="Monday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="t_chk"
+ label=""
+ tool_tip="Tuesday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="w_chk"
+ label=""
+ tool_tip="Wednesday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="r_chk"
+ label=""
+ tool_tip="Thursday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="f_chk"
+ label=""
+ tool_tip="Friday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="a_chk"
+ label=""
+ tool_tip="Saturday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <text
+ name="su_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_pad="5"
+ left="57"
+ width="25">
+ Su
+ </text>
+
+ <text
+ name="mo_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Mo
+ </text>
+
+ <text
+ name="tu_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Tu
+ </text>
+
+ <text
+ name="we_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="1"
+ width="25">
+ We
+ </text>
+
+ <text
+ name="th_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Th
+ </text>
+
+ <text
+ name="fr_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Fr
+ </text>
+
+ <text
+ name="sa_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Sa
+ </text>
+
+ <text
+ name="at_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="right"
+ height="16"
+ top_pad="15"
+ left="30"
+ width="40">
+ at
+ </text>
+ <line_editor
+ name="hours_edt"
+ max_length_bytes="2"
+ follows="left|top"
+ layout="topleft"
+ commit_on_focus_lost="true"
+ height="23"
+ width="40"
+ left_pad="4"
+ top_delta="-5"/>
+ <text
+ name="separator_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="5"
+ left_pad="0"
+ width="12">
+ :
+ </text>
+ <line_editor
+ name="minutes_edt"
+ max_length_bytes="2"
+ follows="left|top"
+ layout="topleft"
+ commit_on_focus_lost="true"
+ height="23"
+ width="40"
+ left_pad="0"
+ top_delta="-5"/>
+ <button
+ name="am_pm_btn"
+ label="am"
+ follows="left|top"
+ layout="topleft"
+ height="23"
+ width="40"
+ left_pad="1"
+ top_delta="0"/>
+ <text
+ name="utc_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ height="16"
+ top_delta="5"
+ left_pad="5"
+ width="22">
+ UTC
+ </text>
+ <button
+ name="save_btn"
+ label="Save"
+ follows="top|left"
+ layout="topleft"
+ top="145"
+ left="25"
+ height="25"
+ width="110"/>
+ <button
+ name="cancel_btn"
+ label="Cancel"
+ follows="bottom|right"
+ layout="topleft"
+ left_pad="20"
+ top_delta="0"
+ height="25"
+ width="110"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_settings_color.xml b/indra/newview/skins/default/xui/en/floater_settings_color.xml
new file mode 100644
index 0000000000..0722677f1d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_settings_color.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ legacy_header_height="18"
+ can_minimize="false"
+ height="360"
+ min_height="367"
+ layout="topleft"
+ name="settings_color"
+ help_topic="settings_color"
+ title="COLOR SETTINGS"
+ reuse_instance="true"
+ can_resize="true"
+ min_width="550"
+ width="570">
+ <filter_editor
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left="10"
+ right="-10"
+ label="Enter search text"
+ max_length_chars="300"
+ name="filter_input"
+ text_pad_left="10"
+ top="30" />
+ <scroll_list
+ column_padding="0"
+ draw_heading="true"
+ draw_stripes="false"
+ heading_height="23"
+ height="266"
+ layout="topleft"
+ search_column="1"
+ sort_column="1"
+ left="10"
+ follows="left|top|bottom"
+ name="setting_list"
+ top_pad="2"
+ width="300">
+ <scroll_list.columns
+ name="changed_color"
+ relative_width="0.05" />
+ <scroll_list.columns
+ label="Color"
+ name="color" />
+ </scroll_list>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="color_name_txt"
+ font="SansSerifSmallBold"
+ top_delta="8"
+ left_pad="10"
+ visible="true"
+ use_ellipses="true"
+ text_color="White"
+ width="240">
+ Color name
+ </text>
+ <color_swatch
+ top_pad="0"
+ left_delta="0"
+ follows="top|left"
+ can_apply_immediately="true"
+ height="180"
+ name="color_swatch"
+ visible="true"
+ layout="topleft"
+ width="240">
+ <color_swatch.commit_callback
+ function="CommitSettings" />
+ </color_swatch>
+ <spinner
+ height="20"
+ label="Alpha"
+ layout="topleft"
+ follows="top|left"
+ left_delta="0"
+ min_val="0"
+ max_val="1"
+ decimal_digits="3"
+ name="alpha_spinner"
+ top_pad="5"
+ visible="true"
+ width="120">
+ <spinner.commit_callback
+ function="CommitSettings" />
+ </spinner>
+ <button
+ height="22"
+ label="Reset to default"
+ follows="left|top"
+ layout="topleft"
+ left_delta="0"
+ name="default_btn"
+ visible="true"
+ top_pad="15"
+ width="150">
+ <button.commit_callback
+ function="ClickDefault" />
+ </button>
+ <check_box
+ control_name="ColorSettingsHideDefault"
+ height="16"
+ initial_value="true"
+ label="Show changed colors only"
+ layout="topleft"
+ top_pad="10"
+ left="10"
+ follows="left|bottom"
+ name="hide_default"
+ width="330">
+ </check_box>
+</floater> \ No newline at end of file
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 7efa81d263..b0b818cde5 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -14,6 +14,9 @@
single_instance="true"
title="WORLD MAP"
width="650">
+ <string name="UnnamedParcel">
+ (Unnamed Parcel)
+ </string>
<string
name="collapse_icon"
value="map_ui_collapse_icon.png"/>
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index a71cbde21b..1d1b81e31a 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -149,6 +149,13 @@
function="Advanced.ShowDebugSettings"
parameter="all" />
</menu_item_call>
+ <menu_item_call
+ label="Show Color settings"
+ name="Color Settings">
+ <menu_item_call.on_click
+ function="Floater.Toggle"
+ parameter="settings_color" />
+ </menu_item_call>
<menu_item_separator />
<menu_item_call
label="XUI Preview Tool"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
index 63185b537c..61738e73db 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
@@ -48,6 +48,9 @@
name="share">
<on_click
function="Avatar.Share" />
+ <on_enable
+ function="Avatar.EnableItem"
+ parameter="can_share" />
</menu_item_call>
<menu_item_call
enabled="false"
@@ -56,6 +59,9 @@
name="pay">
<on_click
function="Avatar.Pay" />
+ <on_enable
+ function="Avatar.EnableItem"
+ parameter="can_pay" />
</menu_item_call>
<menu_item_call
label="Offer Teleport"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index d5d2d00630..40f3e51fca 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2851,6 +2851,14 @@ function="World.EnvPreset"
<menu_item_call.on_click
function="Advanced.ClickGLTFUpload" />
</menu_item_call>
+ <menu_item_call
+ label="Edit..."
+ name="Edit...">
+ <menu_item_call.on_enable
+ function="EnableGLTFUpload"/>
+ <menu_item_call.on_click
+ function="Advanced.ClickGLTFEdit" />
+ </menu_item_call>
</menu>
<menu
create_jump_keys="true"
@@ -3427,13 +3435,6 @@ function="World.EnvPreset"
<menu_item_call.on_click
function="Advanced.ClearShaderCache" />
</menu_item_call>
- <menu_item_call
- enabled="true"
- label="Rebuild Terrain"
- name="Rebuild Terrain">
- <menu_item_call.on_click
- function="Advanced.RebuildTerrain" />
- </menu_item_call>
<menu_item_separator />
<menu_item_call
enabled="true"
@@ -3654,6 +3655,37 @@ function="World.EnvPreset"
function="Advanced.ResetInterestLists" />
</menu_item_call>
</menu>
+ <!-- terrain -->
+ <menu
+ create_jump_keys="true"
+ label="Terrain"
+ name="DevelopTerrain"
+ tear_off="true">
+ <menu_item_call
+ enabled="true"
+ label="Rebuild Terrain"
+ name="Rebuild Terrain">
+ <menu_item_call.on_click
+ function="Advanced.RebuildTerrain" />
+ </menu_item_call>
+
+ <menu_item_separator/>
+
+ <menu_item_call
+ enabled="true"
+ label="Create Local Paintmap"
+ name="Create Local Paintmap">
+ <menu_item_call.on_click
+ function="Advanced.TerrainCreateLocalPaintMap" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="true"
+ label="Delete Local Paintmap"
+ name="Delete Local Paintmap">
+ <menu_item_call.on_click
+ function="Advanced.TerrainDeleteLocalPaintMap" />
+ </menu_item_call>
+ </menu>
<menu
create_jump_keys="true"
label="UI"
@@ -3822,6 +3854,13 @@ function="World.EnvPreset"
name="XUI"
tear_off="true">
<menu_item_call
+ label="Show Color settings"
+ name="Color Settings">
+ <menu_item_call.on_click
+ function="Floater.Toggle"
+ parameter="settings_color" />
+ </menu_item_call>
+ <menu_item_call
label="Reload Color Settings"
name="Reload Color Settings">
<menu_item_call.on_click
@@ -3959,6 +3998,16 @@ function="World.EnvPreset"
parameter="AllowSelectAvatar" />
</menu_item_check>
<menu_item_check
+ label="Disable Look At Animation"
+ name="Disable Look At Animation">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="DisableLookAtAnimation" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="DisableLookAtAnimation" />
+ </menu_item_check>
+ <menu_item_check
label="Render Only Friends"
name="Render Only Friends">
<menu_item_check.on_check
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 1e2cb9566d..e539388735 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2388,6 +2388,26 @@ Unable to upload [FILE] due to the following reason: [REASON]
Please try again later.
<tag>fail</tag>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CannotUploadSnapshotEmailTooBig"
+ type="alertmodal">
+Unable to upload snapshot [FILE] due to the following reason: [REASON]
+
+File might be too big, try reducing resolution, quality or try again later.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CannotUploadSnapshotWebTooBig"
+ type="alertmodal">
+Unable to upload snapshot.
+
+File might be too big, try reducing resolution or try again later.
+ <tag>fail</tag>
+ </notification>
<notification
icon="notifytip.tga"
@@ -3032,6 +3052,15 @@ This is usually a temporary failure. Please customize and save the wearable agai
</notification>
<notification
+ icon="notifytip.tga"
+ name="OutOfDiskSpace"
+ type="notifytip">
+The system is out of disk space. You will need to free up some space on your computer or clear the cache.
+<tag>fail</tag>
+ <unique/>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="YouHaveBeenLoggedOut"
type="alertmodal">
@@ -4254,6 +4283,20 @@ Can&apos;t change appearance until clothing and shape are loaded.
<notification
icon="alertmodal.tga"
+ name="UsavedWearableChanges"
+ type="alertmodal">
+You have unsaved changes.
+ <tag>group</tag>
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I discard unsaved wearable changes"
+ name="okcancelignore"
+ notext="Keep Editing"
+ yestext="Discard"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="ClassifiedMustBeAlphanumeric"
type="alertmodal">
The name of your classified must start with a letter from A to Z or a number. No punctuation is allowed.
@@ -9061,17 +9104,6 @@ Your voice has been muted by moderator.
name="okbutton"
yestext="OK"/>
</notification>
-
- <notification
- icon="alertmodal.tga"
- name="BulkUploadCostConfirmation"
- type="alertmodal">
-This will upload [COUNT] items at a total cost of L$[COST]. Do you wish to continue with the upload?
- <usetemplate
- name="okcancelbuttons"
- notext="Cancel"
- yestext="Upload"/>
- </notification>
<notification
icon="alertmodal.tga"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
index 30fee7361f..ab0e447028 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
@@ -33,7 +33,6 @@
top="0"
width="313" >
<check_box
- control_name="LowerAlphaTextureInvisible"
follows="left|top"
height="16"
layout="topleft"
@@ -58,7 +57,6 @@
</texture_picker>
<check_box
- control_name="UpperAlphaTextureInvisible"
follows="left|top"
height="16"
layout="topleft"
@@ -83,7 +81,6 @@
</texture_picker>
<check_box
- control_name="HeadAlphaTextureInvisible"
follows="left|top"
height="16"
layout="topleft"
@@ -108,7 +105,6 @@
</texture_picker>
<check_box
- control_name="Eye AlphaTextureInvisible"
follows="left|top"
height="16"
layout="topleft"
@@ -133,7 +129,6 @@
</texture_picker>
<check_box
- control_name="HairAlphaTextureInvisible"
follows="left|top"
height="16"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 1801ae1f49..27b74a46ce 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -145,7 +145,6 @@
control_name="RememberPassword"
follows="left|top"
font="SansSerifMedium"
- text_color="EmphasisColor"
height="24"
left="408"
bottom_delta="0"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
index fb528bf98f..425cbb6f44 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
@@ -69,7 +69,6 @@
sort_ascending="true"
width="495" />
<button
- enabled_control="FirstSelectedDisabledPopups"
follows="top|left"
height="23"
image_overlay="Arrow_Up"
@@ -83,7 +82,6 @@
function="Pref.ClickEnablePopup" />
</button>
<button
- enabled_control="FirstSelectedEnabledPopups"
follows="top|left"
height="23"
image_overlay="Arrow_Down"
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 5d93846ce5..44df5354aa 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -313,7 +313,6 @@
<color_swatch
can_apply_immediately="true"
color="0 0 0 1"
- control_name="NameTagBackground"
follows="left|top"
height="24"
label_height="0"
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index 04a510d4e8..be8468a15c 100644
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -140,7 +140,7 @@
layout="topleft"
left_delta="0"
name="return_other_land"
- tool_tip="Return only objects which are on land belonging to someone else"
+ tool_tip="Return only objects which are on land that isn't owned by selected user"
top_delta="20"
width="80" />
<check_box
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 74d21c436e..6ef1b6e44a 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -270,8 +270,20 @@
left="250"
name="manage_telehub_btn"
top="70"
- width="150">
+ width="160">
<button.commit_callback
function="RegionInfo.ManageTelehub" />
</button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Manage Restart Schedule..."
+ layout="topleft"
+ name="manage_restart_btn"
+ top_pad="5"
+ left_delta="0"
+ width="160">
+ <button.commit_callback
+ function="RegionInfo.ManageRestart" />
+ </button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
index 2035bc2caa..ec642131ae 100644
--- a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
+++ b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
@@ -84,7 +84,7 @@
enabled="false"
height="132"
image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled_Selected"
+ image_disabled_selected="PushButton_Selected_Disabled"
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
layout="topleft"
@@ -97,7 +97,7 @@
enabled="false"
height="132"
image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled_Selected"
+ image_disabled_selected="PushButton_Selected_Disabled"
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/widgets/drop_down.xml b/indra/newview/skins/default/xui/en/widgets/drop_down.xml
index 75ed485645..80f98b64fc 100644
--- a/indra/newview/skins/default/xui/en/widgets/drop_down.xml
+++ b/indra/newview/skins/default/xui/en/widgets/drop_down.xml
@@ -12,7 +12,7 @@
image_unselected="PushButton_Off"
image_selected="PushButton_Selected"
image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled_Selected"
+ image_disabled_selected="PushButton_Selected_Disabled"
image_overlay="Combobox_Over"
image_overlay_alignment="right" />
<drop_down.combo_list bg_writeable_color="white" />
diff --git a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml
index 6cc8d7118f..4a1ba169ad 100644
--- a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml
+++ b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<emoji_complete
autosize="false"
- hover_image="ListItem_Over"
selected_image="ListItem_Select"
max_visible="7"
padding="8"
diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
index 1cfe3d68f9..8c52f06c45 100644
--- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--All horizontal sliders are configured to have no highlighted track. See EXT-5939. -->
<slider_bar follows="left|top"
- track_color="SliderTrackColor"
thumb_outline_color="SliderThumbOutlineColor"
thumb_center_color="SliderThumbCenterColor"
thumb_image="SliderThumb_Off"
diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index e14ba32f69..8103a95376 100644
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -28,7 +28,6 @@ con contribuciones de código abierto de:</text>
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-loup Gailly y Mark Adler.
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index 09da1fb5fd..b6ea621177 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -28,7 +28,6 @@ avec les contributions Open Source de :</text>
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-Loup Gailly et Mark Adler.
diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index 7e195d3ca9..77be47d749 100644
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -28,7 +28,6 @@ con contributi open source da:</text>
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-loup Gailly e Mark Adler.
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 12d763be37..6cd22f6a31 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -33,7 +33,6 @@ OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index aaed728f84..0e95c53109 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -28,7 +28,6 @@ com contribuições de código aberto de:</text>
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
diff --git a/indra/newview/skins/default/xui/ru/floater_about.xml b/indra/newview/skins/default/xui/ru/floater_about.xml
index a65a979ccd..22827bc397 100644
--- a/indra/newview/skins/default/xui/ru/floater_about.xml
+++ b/indra/newview/skins/default/xui/ru/floater_about.xml
@@ -28,7 +28,6 @@
PCRE (c) 1997-2012, Кембриджский университет
SDL (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib (C) 1995-2012 Jean-loup Gailly и Mark Adler.
diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml
index 40ca3707c3..ca21bee464 100644
--- a/indra/newview/skins/default/xui/tr/floater_about.xml
+++ b/indra/newview/skins/default/xui/tr/floater_about.xml
@@ -28,7 +28,6 @@ açık kaynak kod katkısında bulunanlar şunlardır:</text>
PCRE Telif Hakkı (c) 1997-2012 University of Cambridge
SDL Telif Hakkı (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Telif Hakkı (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Telif Hakkı (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Telif Hakkı (C) 1995-2012 Jean-loup Gailly ve Mark Adler.
diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml
index a56ae753d1..727f598894 100644
--- a/indra/newview/skins/default/xui/zh/floater_about.xml
+++ b/indra/newview/skins/default/xui/zh/floater_about.xml
@@ -28,7 +28,6 @@
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
diff --git a/indra/newview/tests/lldateutil_test.cpp b/indra/newview/tests/lldateutil_test.cpp
index e9d4982e35..151aadfd4b 100644
--- a/indra/newview/tests/lldateutil_test.cpp
+++ b/indra/newview/tests/lldateutil_test.cpp
@@ -38,18 +38,23 @@
// Baked-in return values for getString()
-std::map< std::string, std::string > gString;
+std::map< std::string, std::string, std::less<>> gString;
// Baked-in return values for getCountString()
// map of pairs of input xml_desc and integer count
typedef std::pair< std::string, int > count_string_t;
std::map< count_string_t, std::string > gCountString;
-std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
+std::string LLTrans::getString(const std::string_view xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
{
- std::string text = gString[xml_desc];
- LLStringUtil::format(text, args);
- return text;
+ auto it = gString.find(xml_desc);
+ if (it != gString.end())
+ {
+ std::string text = it->second;
+ LLStringUtil::format(text, args);
+ return text;
+ }
+ return {};
}
std::string LLTrans::getCountString(const std::string& language, const std::string& xml_desc, S32 count)
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index df0f006d02..bff2289a7c 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -79,7 +79,7 @@ LLProgressView * LLViewerWindow::getProgressView(void) const { return 0; }
LLViewerWindow* gViewerWindow;
-std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
+std::string LLTrans::getString(std::string_view xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
{
return std::string("test_trans");
}
@@ -235,7 +235,7 @@ static LLEventPump * gTOSReplyPump = NULL;
LLPointer<LLSecAPIHandler> gSecAPIHandler;
//static
-LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, bool focus)
+LLFloater* LLFloaterReg::showInstance(std::string_view name, const LLSD& key, bool focus)
{
gTOSType = name;
gTOSReplyPump = &LLEventPumps::instance().obtain(key["reply_pump"]);
diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp
index 3be44a9bd5..fc9f5b707a 100644
--- a/indra/newview/tests/llslurl_test.cpp
+++ b/indra/newview/tests/llslurl_test.cpp
@@ -46,10 +46,10 @@ static const char * const TEST_FILENAME("llslurl_test.xml");
class LLTrans
{
public:
- static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string = false);
+ static std::string getString(std::string_view xml_desc, const LLStringUtil::format_map_t& args, bool def_string = false);
};
-std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
+std::string LLTrans::getString(std::string_view xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
{
return std::string();
}
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index 40c2059d27..d9cb9e7538 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -45,10 +45,10 @@ static const char * const TEST_FILENAME("llviewernetwork_test.xml");
class LLTrans
{
public:
- static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string = false);
+ static std::string getString(std::string_view xml_desc, const LLStringUtil::format_map_t& args, bool def_string = false);
};
-std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
+std::string LLTrans::getString(std::string_view xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
{
std::string grid_label = std::string();
if(xml_desc == "AgniGridLabel")
diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp
index 8564dbeeb6..d5bf189d82 100644
--- a/indra/newview/tests/llworldmap_test.cpp
+++ b/indra/newview/tests/llworldmap_test.cpp
@@ -66,7 +66,7 @@ void LLWorldMipmap::equalizeBoostLevels() { }
LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) { return NULL; }
// Stub other stuff
-std::string LLTrans::getString(const std::string &, const LLStringUtil::format_map_t&, bool def_string) { return std::string("test_trans"); }
+std::string LLTrans::getString(std::string_view, const LLStringUtil::format_map_t&, bool def_string) { return std::string("test_trans"); }
void LLUIString::updateResult() const { }
void LLUIString::setArg(const std::string& , const std::string& ) { }
void LLUIString::assign(const std::string& ) { }
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 470c8bc8a8..b2f9654eb3 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -561,14 +561,16 @@ class Windows_x86_64_Manifest(ViewerManifest):
# For textures
self.path("openjp2.dll")
- # Uriparser
- self.path("uriparser.dll")
-
# These need to be installed as a SxS assembly, currently a 'private' assembly.
# See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
self.path("msvcp140.dll")
+ self.path_optional("msvcp140_1.dll")
+ self.path_optional("msvcp140_2.dll")
+ self.path_optional("msvcp140_atomic_wait.dll")
+ self.path_optional("msvcp140_codecvt_ids.dll")
self.path("vcruntime140.dll")
self.path_optional("vcruntime140_1.dll")
+ self.path_optional("vcruntime140_threads.dll")
# SLVoice executable
with self.prefix(src=os.path.join(pkgdir, 'bin', 'release')):
@@ -578,22 +580,16 @@ class Windows_x86_64_Manifest(ViewerManifest):
self.path("vivoxsdk_x64.dll")
self.path("ortp_x64.dll")
- # OpenSSL
- self.path("libcrypto-1_1-x64.dll")
- self.path("libssl-1_1-x64.dll")
-
- # HTTP/2
- self.path("nghttp2.dll")
-
- # Hunspell
- self.path("libhunspell.dll")
-
# BugSplat
if self.args.get('bugsplat'):
self.path("BsSndRpt64.exe")
self.path("BugSplat64.dll")
self.path("BugSplatRc64.dll")
+ if self.args['tracy'] == 'ON':
+ with self.prefix(src=os.path.join(pkgdir, 'bin')):
+ self.path("tracy-profiler.exe")
+
self.path(src="licenses-win32.txt", dst="licenses.txt")
self.path("featuretable.txt")
self.path("cube.dae")
@@ -928,7 +924,6 @@ class Darwin_x86_64_Manifest(ViewerManifest):
with self.prefix(src=relpkgdir, dst=""):
self.path("libndofdev.dylib")
- self.path("libhunspell-*.dylib")
with self.prefix(src_dst="cursors_mac"):
self.path("*.tif")
@@ -1009,18 +1004,6 @@ class Darwin_x86_64_Manifest(ViewerManifest):
# Need to get the llcommon dll from any of the build directories as well.
libfile_parent = self.get_dst_prefix()
dylibs=[]
- for libfile in (
- "libapr-1.0.dylib",
- "libaprutil-1.0.dylib",
- "libexpat.1.dylib",
- # libnghttp2.dylib is a symlink to
- # libnghttp2.major.dylib, which is a symlink to
- # libnghttp2.version.dylib. Get all of them.
- "libnghttp2.*dylib",
- "liburiparser.*dylib",
- ):
- dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
-
# SLVoice executable
with self.prefix(src=os.path.join(pkgdir, 'bin', 'release')):
self.path("SLVoice")
@@ -1318,14 +1301,7 @@ class Linux_i686_Manifest(LinuxManifest):
debpkgdir = os.path.join(pkgdir, "lib", "debug")
with self.prefix(src=relpkgdir, dst="lib"):
- self.path("libapr-1.so")
- self.path("libapr-1.so.0")
- self.path("libapr-1.so.0.4.5")
- self.path("libaprutil-1.so")
- self.path("libaprutil-1.so.0")
- self.path("libaprutil-1.so.0.4.1")
self.path("libdb*.so")
- self.path("libexpat.so.*")
self.path("libuuid.so*")
self.path("libSDL-1.2.so.*")
self.path("libdirectfb-1.*.so.*")
@@ -1335,7 +1311,6 @@ class Linux_i686_Manifest(LinuxManifest):
self.path("libdirectfb-1.4.so.5")
self.path("libfusion-1.4.so.5")
self.path("libdirect-1.4.so.5*")
- self.path("libhunspell-1.3.so*")
self.path("libalut.so*")
self.path("libopenal.so*")
self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
@@ -1401,6 +1376,7 @@ if __name__ == "__main__":
dict(name='bugsplat', description="""BugSplat database to which to post crashes,
if BugSplat crash reporting is desired""", default=''),
dict(name='openal', description="""Indication openal libraries are needed""", default='OFF'),
+ dict(name='tracy', description="""Indication tracy profiler is enabled""", default='OFF'),
]
try:
main(extra=extra_arguments)