summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.hgtags11
-rw-r--r--BuildParams11
-rw-r--r--autobuild.xml128
-rwxr-xr-xbuild.sh4
-rw-r--r--doc/contributions.txt8
-rw-r--r--indra/cmake/00-Common.cmake5
-rw-r--r--[-rwxr-xr-x]indra/cmake/FMOD.cmake0
-rw-r--r--indra/cmake/OpenSSL.cmake2
-rw-r--r--[-rwxr-xr-x]indra/cmake/run_build_test.py0
-rw-r--r--indra/linux_crash_logger/linux_crash_logger.cpp14
-rw-r--r--indra/linux_crash_logger/llcrashloggerlinux.cpp2
-rw-r--r--indra/llcommon/CMakeLists.txt3
-rw-r--r--indra/llcommon/indra_constants.h2
-rw-r--r--indra/llcommon/lleventtimer.cpp20
-rw-r--r--indra/llcommon/llfasttimer_class.cpp30
-rw-r--r--indra/llcommon/llinstancetracker.h169
-rw-r--r--indra/llcommon/llsys.cpp710
-rw-r--r--indra/llcommon/llsys.h22
-rw-r--r--indra/llcommon/llthread.cpp3
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llcommon/tests/llinstancetracker_test.cpp159
-rw-r--r--indra/llcommon/tests/llsdserialize_test.cpp508
-rw-r--r--indra/llcommon/tests/setpython.py19
-rw-r--r--indra/llcrashlogger/llcrashlogger.cpp95
-rw-r--r--indra/llcrashlogger/llcrashlogger.h11
-rw-r--r--indra/llinventory/llparcel.cpp27
-rw-r--r--indra/llinventory/llparcel.h21
-rw-r--r--indra/llinventory/llparcelflags.h2
-rw-r--r--indra/llmath/CMakeLists.txt4
-rw-r--r--indra/llmath/llcalc.cpp145
-rw-r--r--indra/llmath/llcalc.h83
-rw-r--r--indra/llmath/llcalcparser.cpp46
-rw-r--r--indra/llmath/llcalcparser.h174
-rw-r--r--indra/llmath/llvolume.cpp48
-rw-r--r--indra/llmessage/llcurl.cpp119
-rw-r--r--indra/llmessage/llcurl.h2
-rw-r--r--indra/llmessage/llfiltersd2xmlrpc.cpp12
-rw-r--r--indra/llmessage/lliohttpserver.cpp9
-rw-r--r--indra/llmessage/lliosocket.cpp7
-rw-r--r--indra/llmessage/llioutil.cpp5
-rw-r--r--indra/llmessage/llsdrpcclient.cpp6
-rw-r--r--indra/llmessage/llsdrpcserver.cpp3
-rw-r--r--indra/llmessage/llurlrequest.cpp36
-rw-r--r--indra/llmessage/message_prehash.cpp3
-rw-r--r--indra/llmessage/message_prehash.h3
-rw-r--r--indra/llmessage/tests/test_llsdmessage_peer.py9
-rw-r--r--indra/llmessage/tests/testrunner.py100
-rw-r--r--indra/llrender/llcubemap.cpp12
-rw-r--r--indra/llrender/llgl.cpp50
-rw-r--r--indra/llrender/llgl.h2
-rw-r--r--indra/llrender/llglheaders.h39
-rw-r--r--indra/llrender/llglslshader.cpp7
-rw-r--r--indra/llrender/llglslshader.h7
-rw-r--r--indra/llrender/llimagegl.cpp12
-rw-r--r--indra/llrender/llrender.cpp31
-rw-r--r--indra/llrender/llrender.h2
-rw-r--r--indra/llrender/llrendertarget.cpp47
-rw-r--r--indra/llrender/llrendertarget.h14
-rw-r--r--indra/llrender/llvertexbuffer.cpp219
-rw-r--r--indra/llrender/llvertexbuffer.h12
-rw-r--r--indra/llui/llconsole.cpp4
-rw-r--r--indra/llui/llfloater.cpp86
-rw-r--r--indra/llui/llfloater.h7
-rw-r--r--indra/llui/llfloaterreg.cpp28
-rw-r--r--indra/llui/llfloaterreg.h2
-rw-r--r--indra/llui/lllayoutstack.cpp5
-rw-r--r--indra/llui/lllineeditor.cpp33
-rw-r--r--indra/llui/lllineeditor.h3
-rw-r--r--indra/llui/llpanel.cpp6
-rw-r--r--indra/llui/llpanel.h5
-rw-r--r--indra/llui/llspinctrl.cpp23
-rw-r--r--indra/llui/llui.cpp21
-rw-r--r--indra/llui/llui.h5
-rw-r--r--indra/llvfs/lldiriterator.cpp20
-rw-r--r--indra/lscript/lscript_compile/indra.l2
-rw-r--r--indra/mac_crash_logger/CrashReporter.nib/objects.xib2
-rw-r--r--indra/mac_crash_logger/llcrashloggermac.cpp5
-rw-r--r--indra/mac_crash_logger/mac_crash_logger.cpp15
-rw-r--r--indra/newview/CMakeLists.txt4
-rw-r--r--indra/newview/app_settings/cmd_line.xml13
-rw-r--r--indra/newview/app_settings/keywords.ini1
-rw-r--r--indra/newview/app_settings/logcontrol.xml1
-rw-r--r--indra/newview/app_settings/settings.xml10
-rw-r--r--indra/newview/app_settings/settings_files.xml5
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl15
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl11
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl12
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl15
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/uiF.glsl13
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/uiV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/bumpF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/bumpV.glsl16
-rw-r--r--indra/newview/featuretable.txt10
-rw-r--r--indra/newview/featuretable_linux.txt8
-rw-r--r--indra/newview/featuretable_mac.txt15
-rw-r--r--indra/newview/featuretable_xp.txt8
-rwxr-xr-x[-rw-r--r--]indra/newview/llagent.cpp5
-rw-r--r--indra/newview/llappviewer.cpp103
-rw-r--r--indra/newview/llappviewerlinux.cpp63
-rw-r--r--indra/newview/llappviewerwin32.cpp6
-rw-r--r--indra/newview/llassetuploadresponders.cpp2
-rw-r--r--indra/newview/llassetuploadresponders.h1
-rwxr-xr-x[-rw-r--r--]indra/newview/llavataractions.cpp1
-rwxr-xr-x[-rw-r--r--]indra/newview/llcommandhandler.cpp0
-rw-r--r--indra/newview/lldateutil.cpp27
-rw-r--r--indra/newview/lldateutil.h14
-rw-r--r--indra/newview/lldrawpool.cpp5
-rw-r--r--indra/newview/lldrawpoolalpha.cpp18
-rw-r--r--indra/newview/lldrawpoolbump.cpp103
-rw-r--r--indra/newview/lldrawpoolsimple.cpp16
-rw-r--r--indra/newview/lldrawpoolsky.cpp5
-rw-r--r--indra/newview/lldrawpoolterrain.cpp6
-rw-r--r--indra/newview/lldrawpooltree.cpp2
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp36
-rw-r--r--indra/newview/llestateinfomodel.cpp230
-rw-r--r--indra/newview/llestateinfomodel.h103
-rw-r--r--indra/newview/llface.cpp90
-rw-r--r--indra/newview/llfeaturemanager.cpp4
-rw-r--r--indra/newview/llfloaterauction.cpp15
-rw-r--r--indra/newview/llfloaterdeleteenvpreset.cpp2
-rw-r--r--indra/newview/llfloaterland.cpp17
-rw-r--r--indra/newview/llfloaterland.h1
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterpreference.cpp5
-rw-r--r--indra/newview/llfloaterproperties.cpp20
-rw-r--r--indra/newview/llfloaterregioninfo.cpp392
-rw-r--r--indra/newview/llfloaterregioninfo.h26
-rw-r--r--indra/newview/llfloaterwebcontent.cpp90
-rw-r--r--indra/newview/llfloaterwebcontent.h10
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterworldmap.cpp6
-rw-r--r--indra/newview/llhudnametag.cpp2
-rw-r--r--indra/newview/llinventorybridge.cpp5
-rw-r--r--indra/newview/llinventorymodel.cpp14
-rw-r--r--indra/newview/llinventorymodel.h2
-rw-r--r--indra/newview/lllocationinputctrl.cpp13
-rw-r--r--indra/newview/lllocationinputctrl.h16
-rw-r--r--indra/newview/llpanelface.cpp21
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp39
-rw-r--r--indra/newview/llpanellandaudio.cpp22
-rw-r--r--indra/newview/llpanellandaudio.h2
-rw-r--r--indra/newview/llpanelobject.cpp51
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelpicks.cpp0
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelpicks.h0
-rw-r--r--indra/newview/llpanelplaceprofile.cpp19
-rw-r--r--indra/newview/llpanelplaceprofile.h2
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelprofile.cpp0
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelprofile.h0
-rw-r--r--indra/newview/llpaneltopinfobar.cpp8
-rw-r--r--indra/newview/llpaneltopinfobar.h13
-rw-r--r--indra/newview/llpanelwearing.cpp24
-rw-r--r--indra/newview/llpanelwearing.h2
-rw-r--r--indra/newview/llpreview.cpp19
-rw-r--r--indra/newview/llregioninfomodel.cpp1
-rw-r--r--indra/newview/llspatialpartition.cpp5
-rw-r--r--indra/newview/lltexlayer.cpp94
-rw-r--r--indra/newview/lltexlayer.h6
-rw-r--r--indra/newview/llviewercontrol.cpp4
-rw-r--r--indra/newview/llviewerdisplay.cpp27
-rw-r--r--indra/newview/llviewerfloaterreg.cpp16
-rw-r--r--indra/newview/llviewermenu.cpp37
-rw-r--r--indra/newview/llviewermessage.cpp3
-rw-r--r--indra/newview/llviewernetwork.cpp2
-rw-r--r--indra/newview/llviewerobjectlist.cpp26
-rw-r--r--indra/newview/llviewerregion.cpp1
-rw-r--r--indra/newview/llviewershadermgr.cpp128
-rw-r--r--indra/newview/llviewershadermgr.h9
-rw-r--r--indra/newview/llviewertexture.cpp2
-rw-r--r--indra/newview/llviewertexturelist.cpp2
-rw-r--r--indra/newview/llviewerwindow.cpp42
-rw-r--r--indra/newview/llvoavatar.cpp6
-rw-r--r--indra/newview/llvoicevivox.cpp3
-rw-r--r--indra/newview/llvotree.cpp1
-rw-r--r--indra/newview/llvovolume.cpp44
-rw-r--r--indra/newview/llvowater.cpp6
-rw-r--r--indra/newview/llxmlrpctransaction.cpp10
-rw-r--r--indra/newview/pipeline.cpp256
-rw-r--r--indra/newview/pipeline.h2
-rw-r--r--indra/newview/res/viewerRes.rc6
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.pngbin0 -> 3194 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.pngbin0 -> 3189 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.pngbin0 -> 3011 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.pngbin0 -> 3011 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml14
-rw-r--r--indra/newview/skins/default/xui/de/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/de/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/de/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/de/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/de/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_wizard.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_tools.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml21
-rw-r--r--indra/newview/skins/default/xui/de/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_people.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_advanced.xml13
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_sound.xml26
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_terrain.xml74
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_inventory.xml32
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml28
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml65
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml18
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_wearing_gear.xml7
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml29
-rw-r--r--indra/newview/skins/default/xui/en/panel_topinfo_bar.xml10
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml17
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml8
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml14
-rw-r--r--indra/newview/skins/default/xui/es/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/es/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/es/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/es/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/es/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_wizard.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml21
-rw-r--r--indra/newview/skins/default/xui/es/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_people.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_advanced.xml13
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_sound.xml26
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_terrain.xml67
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_inventory.xml32
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/fr/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_wizard.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_people.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml13
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_sound.xml26
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_terrain.xml63
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_inventory.xml32
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml28
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml14
-rw-r--r--indra/newview/skins/default/xui/it/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/it/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/it/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/it/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/it/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_wizard.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml21
-rw-r--r--indra/newview/skins/default/xui/it/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_advanced.xml13
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_sound.xml26
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_terrain.xml65
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_inventory.xml32
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/ja/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_wizard.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_terrain.xml74
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_inventory.xml32
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml24
-rw-r--r--indra/newview/skins/default/xui/nl/strings.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/pt/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/pt/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/pt/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_wizard.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml61
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_sound.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_terrain.xml65
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_inventory.xml32
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/strings.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/en/widgets/location_input.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml16
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml16
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml16
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp12
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.cpp7
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.h1
-rw-r--r--indra/win_crash_logger/win_crash_logger.cpp35
-rwxr-xr-x[-rw-r--r--]scripts/gpu_table_tester0
-rwxr-xr-x[-rw-r--r--]scripts/md5check.py0
-rw-r--r--shining-fixes_rev18977.patch41
362 files changed, 9030 insertions, 2060 deletions
diff --git a/.hgtags b/.hgtags
index 8043bf9f40..9f1e925c8d 100644
--- a/.hgtags
+++ b/.hgtags
@@ -129,6 +129,8 @@ dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start
0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1
0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1
+a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
+a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
@@ -136,6 +138,8 @@ e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start
be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
+057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
+057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
@@ -143,3 +147,10 @@ a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start
09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1
09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1
+e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start
+502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
+6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
+6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
+e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1
+e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-beta1
+54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start
diff --git a/BuildParams b/BuildParams
index db16541aad..ad2f71e336 100644
--- a/BuildParams
+++ b/BuildParams
@@ -14,8 +14,8 @@ public_build = true
# skip windows debug build until we can get a fix in.
build_CYGWIN_Debug = false
-# Update Public Inworld Build Status Indicators
-email_status_this_is_os = false
+# Update Public Inworld Build Status Indicators (setting should mirror "public_build")
+email_status_this_is_os = true
# Limit extent of codeticket updates to revisions after...
codeticket_since = 2.2.0-release
@@ -159,4 +159,11 @@ viewer-asset-delivery-metrics.email = monty@lindenlab.com
viewer-asset-delivery-metrics.build_server = false
viewer-asset-delivery-metrics.build_server_tests = false
+# ========================================
+# Simon says
+# ========================================
+simon_viewer-dev-private.public_build = false
+simon_viewer-dev-private.email_status_this_is_os = false
+
+
# eof
diff --git a/autobuild.xml b/autobuild.xml
index c6e1a425d5..d381035248 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -138,9 +138,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>6299f1fd01147820e05195b84a3fe1d7</string>
+ <string>e6caaeea16131e1f2343ecd7765e3147</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/233053/arch/Darwin/installer/ares-1.7.4-darwin-20110616.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20110217.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -150,9 +150,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>b62efd5a68e5dd38314f60a20e651d43</string>
+ <string>0745872db83d45f4ab3bdc697d98e264</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/233053/arch/Linux/installer/ares-1.7.4-linux-20110616.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/223275/arch/Linux/installer/ares-1.7.1-linux-20110310.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -162,9 +162,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>c2f4ea23619f3d453e799d6e89ff6930</string>
+ <string>1dcec6babd249a2597114d4ac226c461</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/233053/arch/CYGWIN/installer/ares-1.7.4-windows-20110616.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/220963/arch/CYGWIN/installer/ares-1.7.1-windows-20110211.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -282,9 +282,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>463e4cc99ec8659eeee518beb41f31b6</string>
+ <string>aaea644191807f51051cefa2fac11069</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/236200/arch/Darwin/installer/curl-7.21.1-darwin-20110719.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-darwin-20110316.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -306,9 +306,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>23d603a7bb864d0a8b6001f19a1b7335</string>
+ <string>fea96aa2a7d513397317194f3d6c979b</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/236200/arch/CYGWIN/installer/curl-7.21.1-windows-20110719.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-windows-20110211.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -1206,9 +1206,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>c6c28da2f262b4a146a90724b635f13f</string>
+ <string>a7c80fd8516df3b879b669b2b220067f</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/236284/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110720.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/232420/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110608.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1218,9 +1218,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>67505bb5e72ed5912c818d506e9eac22</string>
+ <string>c05a33ee8b6f253b5a744596dfc3707d</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/236284/arch/Linux/installer/llqtwebkit-4.7.1-linux-20110720.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20101013.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1230,9 +1230,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>433e15cbb4d59aae9be10c18d19b094e</string>
+ <string>b9cc0333cc274c9cc40256ab7146b4fc</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/236284/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110720.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/232420/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110608.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -1359,26 +1359,36 @@
</map>
</map>
</map>
- <key>openal_soft</key>
+ <key>openSSL</key>
<map>
<key>license</key>
- <string>lgpl</string>
+ <string>openSSL</string>
<key>license_file</key>
- <string>LICENSES/OPENAL.txt</string>
+ <string>LICENSES/openssl.txt</string>
<key>name</key>
- <string>openal_soft</string>
+ <string>openSSL</string>
<key>platforms</key>
<map>
+ <key>darwin</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>facee34b8bd57ad602157e65a5af1a49</string>
+ <key>url</key>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openssl-0.9.8q-darwin-20110211.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>darwin</string>
+ </map>
<key>linux</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
- <string>fccdca18a950ac9363c6fb39118b80e1</string>
- <key>hash_algorithm</key>
- <string>md5</string>
+ <string>3d40be8566fa4b9df9a38e2a0f9ea467</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-3ad86a1c-linux-20110114.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/226882/arch/Linux/installer/openssl-1.0.0d-linux-20110418.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1388,47 +1398,35 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>04df406f3e5d04cf176660bdac66c3a1</string>
+ <string>774c7f0a0312bee3054757a623e227bc</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-windows-20110301.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/220986/arch/CYGWIN/installer/openssl-0.9.8q-windows-20110211.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
- <key>version</key>
- <string>3ad86a1c</string>
</map>
- <key>openjpeg</key>
+ <key>openal_soft</key>
<map>
<key>license</key>
- <string>openjpeg</string>
+ <string>lgpl</string>
<key>license_file</key>
- <string>LICENSES/openjpeg.txt</string>
+ <string>LICENSES/OPENAL.txt</string>
<key>name</key>
- <string>openjpeg</string>
+ <string>openal_soft</string>
<key>platforms</key>
<map>
- <key>darwin</key>
- <map>
- <key>archive</key>
- <map>
- <key>hash</key>
- <string>4be51c7cca7d84831e30b63279df7ae5</string>
- <key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-darwin-20110302.tar.bz2</string>
- </map>
- <key>name</key>
- <string>darwin</string>
- </map>
<key>linux</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
- <string>fb2382014c79e0049746e4e29bd834f9</string>
+ <string>fccdca18a950ac9363c6fb39118b80e1</string>
+ <key>hash_algorithm</key>
+ <string>md5</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-linux-20110314.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-3ad86a1c-linux-20110114.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1438,23 +1436,25 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>ca5765af55f798724d601720afdf6953</string>
+ <string>04df406f3e5d04cf176660bdac66c3a1</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-windows-20110302.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-windows-20110301.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
+ <key>version</key>
+ <string>3ad86a1c</string>
</map>
- <key>openssl</key>
+ <key>openjpeg</key>
<map>
<key>license</key>
- <string>openssl</string>
+ <string>openjpeg</string>
<key>license_file</key>
- <string>LICENSES/openssl.txt</string>
+ <string>LICENSES/openjpeg.txt</string>
<key>name</key>
- <string>openssl</string>
+ <string>openjpeg</string>
<key>platforms</key>
<map>
<key>darwin</key>
@@ -1462,9 +1462,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>1aecd89fee54741f2c4fd65c082d2604</string>
+ <string>4be51c7cca7d84831e30b63279df7ae5</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/227862/arch/Darwin/installer/openssl-1.0.0d-darwin-20110427.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-darwin-20110302.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1474,9 +1474,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>eab3a49d1ef77a651a3896d1d4864a78</string>
+ <string>fb2382014c79e0049746e4e29bd834f9</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/227862/arch/Linux/installer/openssl-1.0.0d-linux-20110427.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-linux-20110314.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1486,9 +1486,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>8ba049ecc76bb1adf3ab3e5bad64c39e</string>
+ <string>ca5765af55f798724d601720afdf6953</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/227862/arch/CYGWIN/installer/openssl-1.0.0d-windows-20110427.tar.bz2</string>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-windows-20110302.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -1907,12 +1907,12 @@
<map>
<key>build</key>
<map>
- <key>command</key>
- <string>xcodebuild</string>
<key>filters</key>
<array>
<string>setenv</string>
</array>
+ <key>command</key>
+ <string>xcodebuild</string>
<key>options</key>
<array>
<string>-configuration Debug</string>
@@ -1961,12 +1961,12 @@
<map>
<key>build</key>
<map>
- <key>command</key>
- <string>xcodebuild</string>
<key>filters</key>
<array>
<string>setenv</string>
</array>
+ <key>command</key>
+ <string>xcodebuild</string>
<key>options</key>
<array>
<string>-configuration RelWithDebInfo</string>
@@ -2017,12 +2017,12 @@
<map>
<key>build</key>
<map>
- <key>command</key>
- <string>xcodebuild</string>
<key>filters</key>
<array>
<string>setenv</string>
</array>
+ <key>command</key>
+ <string>xcodebuild</string>
<key>options</key>
<array>
<string>-configuration Release</string>
diff --git a/build.sh b/build.sh
index 4268c76e78..c7c89fe3c2 100755
--- a/build.sh
+++ b/build.sh
@@ -209,7 +209,7 @@ do
end_section BuildParallel
else
begin_section "Build$variant"
- build "$variant" "$build_dir" 2>&1 | tee -a "$build_log" | grep --line-buffered "^##teamcity"
+ build "$variant" "$build_dir" 2>&1 | tee -a "$build_log" | sed -n 's/^ *\(##teamcity.*\)/\1/p'
if `cat "$build_dir/build_ok"`
then
echo so far so good.
@@ -238,7 +238,7 @@ then
begin_section "Build$variant"
build_dir=`build_dir_$arch $variant`
build_dir_stubs="$build_dir/win_setup/$variant"
- tee -a $build_log < "$build_dir/build.log" | grep --line-buffered "^##teamcity"
+ tee -a $build_log < "$build_dir/build.log" | sed -n 's/^ *\(##teamcity.*\)/\1/p'
if `cat "$build_dir/build_ok"`
then
echo so far so good.
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 643dcf40cc..ee56ef3665 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -20,6 +20,7 @@ Aimee Trescothick
SNOW-570
SNOW-572
SNOW-575
+ STORM-1315
VWR-3321
VWR-3336
VWR-3903
@@ -103,6 +104,7 @@ Ales Beaumont
Alexandrea Fride
STORM-255
STORM-960
+ STORM-1459
Alissa Sabre
VWR-81
VWR-83
@@ -201,6 +203,7 @@ Boroondas Gupte
OPEN-29
OPEN-39
OPEN-39
+ OPEN-99
SNOW-278
SNOW-503
SNOW-510
@@ -216,6 +219,7 @@ Boroondas Gupte
VWR-20891
VWR-23455
VWR-24487
+ VWR-26066
WEB-262
Bulli Schumann
CT-218
@@ -448,6 +452,8 @@ Jonathan Yap
STORM-1313
STORM-899
STORM-1273
+ STORM-1462
+ STORM-1459
Kage Pixel
VWR-11
Ken March
@@ -689,6 +695,7 @@ Robin Cornelius
STORM-1019
STORM-1095
STORM-1128
+ STORM-1459
VWR-2488
VWR-9557
VWR-10579
@@ -830,6 +837,7 @@ Thickbrick Sleaford
VWR-24420
STORM-956
STORM-1147
+ STORM-1325
Thraxis Epsilon
SVC-371
VWR-383
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 2c974fb4ff..0266239454 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -171,7 +171,10 @@ if (LINUX)
add_definitions(-fvisibility=hidden)
# don't catch SIGCHLD in our base application class for the viewer - some of our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The viewer doesn't need to catch SIGCHLD anyway.
add_definitions(-DLL_IGNORE_SIGCHLD)
- add_definitions(-march=pentium4 -mfpmath=sse)
+ if (WORD_SIZE EQUAL 32)
+ add_definitions(-march=pentium4)
+ endif (WORD_SIZE EQUAL 32)
+ add_definitions(-mfpmath=sse)
#add_definitions(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
if (NOT STANDALONE)
# this stops us requiring a really recent glibc at runtime
diff --git a/indra/cmake/FMOD.cmake b/indra/cmake/FMOD.cmake
index cb5124812d..cb5124812d 100755..100644
--- a/indra/cmake/FMOD.cmake
+++ b/indra/cmake/FMOD.cmake
diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake
index dc50b1b8e7..5982ee9a49 100644
--- a/indra/cmake/OpenSSL.cmake
+++ b/indra/cmake/OpenSSL.cmake
@@ -7,7 +7,7 @@ set(OpenSSL_FIND_REQUIRED ON)
if (STANDALONE)
include(FindOpenSSL)
else (STANDALONE)
- use_prebuilt_binary(openssl)
+ use_prebuilt_binary(openSSL)
if (WINDOWS)
set(OPENSSL_LIBRARIES ssleay32 libeay32)
else (WINDOWS)
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index ce2d1e0386..ce2d1e0386 100755..100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
diff --git a/indra/linux_crash_logger/linux_crash_logger.cpp b/indra/linux_crash_logger/linux_crash_logger.cpp
index 8beae555fb..99d0ad7e14 100644
--- a/indra/linux_crash_logger/linux_crash_logger.cpp
+++ b/indra/linux_crash_logger/linux_crash_logger.cpp
@@ -24,16 +24,24 @@
* $/LicenseInfo$
*/
+#include "linden_common.h"
#include "llcrashloggerlinux.h"
int main(int argc, char **argv)
{
+ llinfos << "Starting crash reporter." << llendl;
+
LLCrashLoggerLinux app;
app.parseCommandOptions(argc, argv);
- app.init();
+
+ if (! app.init())
+ {
+ llwarns << "Unable to initialize application." << llendl;
+ return 1;
+ }
+
app.mainLoop();
app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}
-
-
diff --git a/indra/linux_crash_logger/llcrashloggerlinux.cpp b/indra/linux_crash_logger/llcrashloggerlinux.cpp
index 7449c6426f..7316717193 100644
--- a/indra/linux_crash_logger/llcrashloggerlinux.cpp
+++ b/indra/linux_crash_logger/llcrashloggerlinux.cpp
@@ -30,8 +30,6 @@
#include "linden_common.h"
-#include "boost/tokenizer.hpp"
-
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
#include "llfile.h"
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 9910281b64..c755020a64 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -317,7 +317,8 @@ if (LL_TESTS)
LL_ADD_INTEGRATION_TEST(lllazy "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llprocessor "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}")
- LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}"
+ "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/setpython.py")
LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lltreeiterators "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lluri "" "${test_libs}")
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index d0f287657e..0745696ef3 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -387,8 +387,6 @@ const S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000;
const S32 MAP_SIM_PRELUDE = 0x00020000;
// Crash reporter behavior
-const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
-const char* const CRASH_BEHAVIOR_SETTING = "CrashSubmitBehavior";
const S32 CRASH_BEHAVIOR_ASK = 0;
const S32 CRASH_BEHAVIOR_ALWAYS_SEND = 1;
const S32 CRASH_BEHAVIOR_NEVER_SEND = 2;
diff --git a/indra/llcommon/lleventtimer.cpp b/indra/llcommon/lleventtimer.cpp
index 7743826c60..0d96e03da4 100644
--- a/indra/llcommon/lleventtimer.cpp
+++ b/indra/llcommon/lleventtimer.cpp
@@ -58,19 +58,15 @@ LLEventTimer::~LLEventTimer()
void LLEventTimer::updateClass()
{
std::list<LLEventTimer*> completed_timers;
-
+ for (instance_iter iter = beginInstances(); iter != endInstances(); )
{
- LLInstanceTrackerScopedGuard guard;
- for (instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); )
- {
- LLEventTimer& timer = *iter++;
- F32 et = timer.mEventTimer.getElapsedTimeF32();
- if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
- timer.mEventTimer.reset();
- if ( timer.tick() )
- {
- completed_timers.push_back( &timer );
- }
+ LLEventTimer& timer = *iter++;
+ F32 et = timer.mEventTimer.getElapsedTimeF32();
+ if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
+ timer.mEventTimer.reset();
+ if ( timer.tick() )
+ {
+ completed_timers.push_back( &timer );
}
}
}
diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp
index 1dfc194d7c..ebb5961c91 100644
--- a/indra/llcommon/llfasttimer_class.cpp
+++ b/indra/llcommon/llfasttimer_class.cpp
@@ -219,15 +219,13 @@ LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name)
// static
void LLFastTimer::DeclareTimer::updateCachedPointers()
{
- DeclareTimer::LLInstanceTrackerScopedGuard guard;
// propagate frame state pointers to timer declarations
- for (DeclareTimer::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
// update cached pointer
it->mFrameState = &it->mTimer.getFrameState();
}
+
// also update frame states of timers on stack
LLFastTimer* cur_timerp = LLFastTimer::sCurTimerData.mCurTimer;
while(cur_timerp->mLastTimerData.mCurTimer != cur_timerp)
@@ -395,10 +393,7 @@ void LLFastTimer::NamedTimer::buildHierarchy()
// set up initial tree
{
- NamedTimer::LLInstanceTrackerScopedGuard guard;
- for (instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
NamedTimer& timer = *it;
if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
@@ -526,10 +521,7 @@ void LLFastTimer::NamedTimer::resetFrame()
LLSD sd;
{
- NamedTimer::LLInstanceTrackerScopedGuard guard;
- for (NamedTimer::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
NamedTimer& timer = *it;
FrameState& info = timer.getFrameState();
@@ -566,7 +558,7 @@ void LLFastTimer::NamedTimer::resetFrame()
llassert_always(timerp->mFrameStateIndex < (S32)getFrameStateList().size());
}
- // sort timers by dfs traversal order to improve cache coherency
+ // sort timers by DFS traversal order to improve cache coherency
std::sort(getFrameStateList().begin(), getFrameStateList().end(), SortTimersDFS());
// update pointers into framestatelist now that we've sorted it
@@ -574,10 +566,7 @@ void LLFastTimer::NamedTimer::resetFrame()
// reset for next frame
{
- NamedTimer::LLInstanceTrackerScopedGuard guard;
- for (NamedTimer::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
NamedTimer& timer = *it;
@@ -621,10 +610,7 @@ void LLFastTimer::NamedTimer::reset()
// reset all history
{
- NamedTimer::LLInstanceTrackerScopedGuard guard;
- for (NamedTimer::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
NamedTimer& timer = *it;
if (&timer != NamedTimerFactory::instance().getRootTimer())
@@ -872,7 +858,7 @@ std::string LLFastTimer::sClockType = "rdtsc";
#else
//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp
-// These use QueryPerformanceCounter, which is arguably fine and also works on amd architectures.
+// These use QueryPerformanceCounter, which is arguably fine and also works on AMD architectures.
U32 LLFastTimer::getCPUClockCount32()
{
return (U32)(get_clock_count()>>8);
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index b971b2f914..b4891eba67 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -52,13 +52,80 @@ class LLInstanceTracker : public LLInstanceTrackerBase
{
typedef typename std::map<KEY, T*> InstanceMap;
typedef LLInstanceTracker<T, KEY> MyT;
- typedef boost::function<const KEY&(typename InstanceMap::value_type&)> KeyGetter;
- typedef boost::function<T*(typename InstanceMap::value_type&)> InstancePtrGetter;
public:
- /// Dereferencing key_iter gives you a const KEY&
- typedef boost::transform_iterator<KeyGetter, typename InstanceMap::iterator> key_iter;
- /// Dereferencing instance_iter gives you a T&
- typedef boost::indirect_iterator< boost::transform_iterator<InstancePtrGetter, typename InstanceMap::iterator> > instance_iter;
+ class instance_iter : public boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag>
+ {
+ public:
+ typedef boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag> super_t;
+
+ instance_iter(const typename InstanceMap::iterator& it)
+ : mIterator(it)
+ {
+ ++sIterationNestDepth;
+ }
+
+ ~instance_iter()
+ {
+ --sIterationNestDepth;
+ }
+
+
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment() { mIterator++; }
+ bool equal(instance_iter const& other) const
+ {
+ return mIterator == other.mIterator;
+ }
+
+ T& dereference() const
+ {
+ return *(mIterator->second);
+ }
+
+ typename InstanceMap::iterator mIterator;
+ };
+
+ class key_iter : public boost::iterator_facade<key_iter, KEY, boost::forward_traversal_tag>
+ {
+ public:
+ typedef boost::iterator_facade<key_iter, KEY, boost::forward_traversal_tag> super_t;
+
+ key_iter(typename InstanceMap::iterator& it)
+ : mIterator(it)
+ {
+ ++sIterationNestDepth;
+ }
+
+ key_iter(const key_iter& other)
+ : mIterator(other.mIterator)
+ {
+ ++sIterationNestDepth;
+ }
+
+ ~key_iter()
+ {
+ --sIterationNestDepth;
+ }
+
+
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment() { mIterator++; }
+ bool equal(key_iter const& other) const
+ {
+ return mIterator == other.mIterator;
+ }
+
+ KEY& dereference() const
+ {
+ return const_cast<KEY&>(mIterator->first);
+ }
+
+ typename InstanceMap::iterator mIterator;
+ };
static T* getInstance(const KEY& k)
{
@@ -66,42 +133,47 @@ public:
return (found == getMap_().end()) ? NULL : found->second;
}
- static key_iter beginKeys()
- {
- return boost::make_transform_iterator(getMap_().begin(),
- boost::bind(&InstanceMap::value_type::first, _1));
+ static instance_iter beginInstances()
+ {
+ return instance_iter(getMap_().begin());
}
- static key_iter endKeys()
+
+ static instance_iter endInstances()
{
- return boost::make_transform_iterator(getMap_().end(),
- boost::bind(&InstanceMap::value_type::first, _1));
+ return instance_iter(getMap_().end());
}
- static instance_iter beginInstances()
+
+ static S32 instanceCount() { return getMap_().size(); }
+
+ static key_iter beginKeys()
{
- return instance_iter(boost::make_transform_iterator(getMap_().begin(),
- boost::bind(&InstanceMap::value_type::second, _1)));
+ return key_iter(getMap_().begin());
}
- static instance_iter endInstances()
+ static key_iter endKeys()
{
- return instance_iter(boost::make_transform_iterator(getMap_().end(),
- boost::bind(&InstanceMap::value_type::second, _1)));
+ return key_iter(getMap_().end());
}
- static S32 instanceCount() { return getMap_().size(); }
+
protected:
LLInstanceTracker(KEY key) { add_(key); }
- virtual ~LLInstanceTracker() { remove_(); }
+ virtual ~LLInstanceTracker()
+ {
+ // it's unsafe to delete instances of this type while all instances are being iterated over.
+ llassert(sIterationNestDepth == 0);
+ remove_();
+ }
virtual void setKey(KEY key) { remove_(); add_(key); }
- virtual const KEY& getKey() const { return mKey; }
+ virtual const KEY& getKey() const { return mInstanceKey; }
private:
void add_(KEY key)
{
- mKey = key;
+ mInstanceKey = key;
getMap_()[key] = static_cast<T*>(this);
}
void remove_()
{
- getMap_().erase(mKey);
+ getMap_().erase(mInstanceKey);
}
static InstanceMap& getMap_()
@@ -116,9 +188,12 @@ private:
private:
- KEY mKey;
+ KEY mInstanceKey;
+ static S32 sIterationNestDepth;
};
+template <typename T, typename KEY> S32 LLInstanceTracker<T, KEY>::sIterationNestDepth = 0;
+
/// explicit specialization for default case where KEY is T*
/// use a simple std::set<T*>
template<typename T>
@@ -127,42 +202,55 @@ class LLInstanceTracker<T, T*> : public LLInstanceTrackerBase
typedef typename std::set<T*> InstanceSet;
typedef LLInstanceTracker<T, T*> MyT;
public:
- /// Dereferencing key_iter gives you a T* (since T* is the key)
- typedef typename InstanceSet::iterator key_iter;
- /// Dereferencing instance_iter gives you a T&
- typedef boost::indirect_iterator<key_iter> instance_iter;
/// for completeness of analogy with the generic implementation
static T* getInstance(T* k) { return k; }
static S32 instanceCount() { return getSet_().size(); }
- // Instantiate this to get access to iterators for this type. It's a 'guard' in the sense
- // that it treats deletes of this type as errors as long as there is an instance of
- // this class alive in scope somewhere (i.e. deleting while iterating is bad).
- class LLInstanceTrackerScopedGuard
+ class instance_iter : public boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag>
{
public:
- LLInstanceTrackerScopedGuard()
+ instance_iter(const typename InstanceSet::iterator& it)
+ : mIterator(it)
+ {
+ ++sIterationNestDepth;
+ }
+
+ instance_iter(const instance_iter& other)
+ : mIterator(other.mIterator)
{
++sIterationNestDepth;
}
- ~LLInstanceTrackerScopedGuard()
+ ~instance_iter()
{
--sIterationNestDepth;
}
- static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
- static instance_iter endInstances() { return instance_iter(getSet_().end()); }
- static key_iter beginKeys() { return getSet_().begin(); }
- static key_iter endKeys() { return getSet_().end(); }
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment() { mIterator++; }
+ bool equal(instance_iter const& other) const
+ {
+ return mIterator == other.mIterator;
+ }
+
+ T& dereference() const
+ {
+ return **mIterator;
+ }
+
+ typename InstanceSet::iterator mIterator;
};
+ static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
+ static instance_iter endInstances() { return instance_iter(getSet_().end()); }
+
protected:
LLInstanceTracker()
{
// it's safe but unpredictable to create instances of this type while all instances are being iterated over. I hate unpredictable. This assert will probably be turned on early in the next development cycle.
- //llassert(sIterationNestDepth == 0);
getSet_().insert(static_cast<T*>(this));
}
virtual ~LLInstanceTracker()
@@ -174,7 +262,6 @@ protected:
LLInstanceTracker(const LLInstanceTracker& other)
{
- //llassert(sIterationNestDepth == 0);
getSet_().insert(static_cast<T*>(this));
}
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index e8616a9be6..99e61433c6 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -1,6 +1,6 @@
/**
* @file llsys.cpp
- * @brief Impelementation of the basic system query functions.
+ * @brief Implementation of the basic system query functions.
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#if LL_WINDOWS
+#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
+#endif
+
#include "linden_common.h"
#include "llsys.h"
@@ -36,22 +40,43 @@
#endif
#include "llprocessor.h"
+#include "llerrorcontrol.h"
+#include "llevents.h"
+#include "lltimer.h"
+#include "llsdserialize.h"
+#include "llsdutil.h"
+#include <boost/bind.hpp>
+#include <boost/circular_buffer.hpp>
+#include <boost/regex.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/range.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_float.hpp>
+
+using namespace llsd;
#if LL_WINDOWS
# define WIN32_LEAN_AND_MEAN
# include <winsock2.h>
# include <windows.h>
+# include <psapi.h> // GetPerformanceInfo() et al.
#elif LL_DARWIN
# include <errno.h>
# include <sys/sysctl.h>
# include <sys/utsname.h>
# include <stdint.h>
# include <Carbon/Carbon.h>
+# include <sys/wait.h>
+# include <string.h>
+# include <stdexcept>
#elif LL_LINUX
# include <errno.h>
# include <sys/utsname.h>
# include <unistd.h>
# include <sys/sysinfo.h>
+# include <stdexcept>
const char MEMINFO_FILE[] = "/proc/meminfo";
#elif LL_SOLARIS
# include <stdio.h>
@@ -70,6 +95,15 @@ extern int errno;
static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU;
+// Don't log memory info any more often than this. It also serves as our
+// framerate sample size.
+static const F32 MEM_INFO_THROTTLE = 20;
+// Sliding window of samples. We intentionally limit the length of time we
+// remember "the slowest" framerate because framerate is very slow at login.
+// If we only triggered FrameWatcher logging when the session framerate
+// dropped below the login framerate, we'd have very little additional data.
+static const F32 MEM_INFO_WINDOW = 10*60;
+
#if LL_WINDOWS
#ifndef DLLVERSIONINFO
typedef struct _DllVersionInfo
@@ -613,8 +647,78 @@ void LLCPUInfo::stream(std::ostream& s) const
s << "->mCPUString: " << mCPUString << std::endl;
}
+// Helper class for LLMemoryInfo: accumulate stats in the form we store for
+// LLMemoryInfo::getStatsMap().
+class Stats
+{
+public:
+ Stats():
+ mStats(LLSD::emptyMap())
+ {}
+
+ // Store every integer type as LLSD::Integer.
+ template <class T>
+ void add(const LLSD::String& name, const T& value,
+ typename boost::enable_if<boost::is_integral<T> >::type* = 0)
+ {
+ mStats[name] = LLSD::Integer(value);
+ }
+
+ // Store every floating-point type as LLSD::Real.
+ template <class T>
+ void add(const LLSD::String& name, const T& value,
+ typename boost::enable_if<boost::is_float<T> >::type* = 0)
+ {
+ mStats[name] = LLSD::Real(value);
+ }
+
+ // Hope that LLSD::Date values are sufficiently unambiguous.
+ void add(const LLSD::String& name, const LLSD::Date& value)
+ {
+ mStats[name] = value;
+ }
+
+ LLSD get() const { return mStats; }
+
+private:
+ LLSD mStats;
+};
+
+// Wrap boost::regex_match() with a function that doesn't throw.
+template <typename S, typename M, typename R>
+static bool regex_match_no_exc(const S& string, M& match, const R& regex)
+{
+ try
+ {
+ return boost::regex_match(string, match, regex);
+ }
+ catch (const std::runtime_error& e)
+ {
+ LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': "
+ << e.what() << ":\n'" << string << "'" << LL_ENDL;
+ return false;
+ }
+}
+
+// Wrap boost::regex_search() with a function that doesn't throw.
+template <typename S, typename M, typename R>
+static bool regex_search_no_exc(const S& string, M& match, const R& regex)
+{
+ try
+ {
+ return boost::regex_search(string, match, regex);
+ }
+ catch (const std::runtime_error& e)
+ {
+ LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': "
+ << e.what() << ":\n'" << string << "'" << LL_ENDL;
+ return false;
+ }
+}
+
LLMemoryInfo::LLMemoryInfo()
{
+ refresh();
}
#if LL_WINDOWS
@@ -638,11 +742,7 @@ static U32 LLMemoryAdjustKBResult(U32 inKB)
U32 LLMemoryInfo::getPhysicalMemoryKB() const
{
#if LL_WINDOWS
- MEMORYSTATUSEX state;
- state.dwLength = sizeof(state);
- GlobalMemoryStatusEx(&state);
-
- return LLMemoryAdjustKBResult((U32)(state.ullTotalPhys >> 10));
+ return LLMemoryAdjustKBResult(mStatsMap["Total Physical KB"].asInteger());
#elif LL_DARWIN
// This might work on Linux as well. Someone check...
@@ -690,12 +790,82 @@ U32 LLMemoryInfo::getPhysicalMemoryClamped() const
void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb)
{
#if LL_WINDOWS
- MEMORYSTATUSEX state;
- state.dwLength = sizeof(state);
- GlobalMemoryStatusEx(&state);
+ // Sigh, this shouldn't be a static method, then we wouldn't have to
+ // reload this data separately from refresh()
+ LLSD statsMap(loadStatsMap());
+
+ avail_physical_mem_kb = statsMap["Avail Physical KB"].asInteger();
+ avail_virtual_mem_kb = statsMap["Avail Virtual KB"].asInteger();
+
+#elif LL_DARWIN
+ // mStatsMap is derived from vm_stat, look for (e.g.) "kb free":
+ // $ vm_stat
+ // Mach Virtual Memory Statistics: (page size of 4096 bytes)
+ // Pages free: 462078.
+ // Pages active: 142010.
+ // Pages inactive: 220007.
+ // Pages wired down: 159552.
+ // "Translation faults": 220825184.
+ // Pages copy-on-write: 2104153.
+ // Pages zero filled: 167034876.
+ // Pages reactivated: 65153.
+ // Pageins: 2097212.
+ // Pageouts: 41759.
+ // Object cache: 841598 hits of 7629869 lookups (11% hit rate)
+ avail_physical_mem_kb = -1 ;
+ avail_virtual_mem_kb = -1 ;
- avail_physical_mem_kb = (U32)(state.ullAvailPhys/1024) ;
- avail_virtual_mem_kb = (U32)(state.ullAvailVirtual/1024) ;
+#elif LL_LINUX
+ // mStatsMap is derived from MEMINFO_FILE:
+ // $ cat /proc/meminfo
+ // MemTotal: 4108424 kB
+ // MemFree: 1244064 kB
+ // Buffers: 85164 kB
+ // Cached: 1990264 kB
+ // SwapCached: 0 kB
+ // Active: 1176648 kB
+ // Inactive: 1427532 kB
+ // Active(anon): 529152 kB
+ // Inactive(anon): 15924 kB
+ // Active(file): 647496 kB
+ // Inactive(file): 1411608 kB
+ // Unevictable: 16 kB
+ // Mlocked: 16 kB
+ // HighTotal: 3266316 kB
+ // HighFree: 721308 kB
+ // LowTotal: 842108 kB
+ // LowFree: 522756 kB
+ // SwapTotal: 6384632 kB
+ // SwapFree: 6384632 kB
+ // Dirty: 28 kB
+ // Writeback: 0 kB
+ // AnonPages: 528820 kB
+ // Mapped: 89472 kB
+ // Shmem: 16324 kB
+ // Slab: 159624 kB
+ // SReclaimable: 145168 kB
+ // SUnreclaim: 14456 kB
+ // KernelStack: 2560 kB
+ // PageTables: 5560 kB
+ // NFS_Unstable: 0 kB
+ // Bounce: 0 kB
+ // WritebackTmp: 0 kB
+ // CommitLimit: 8438844 kB
+ // Committed_AS: 1271596 kB
+ // VmallocTotal: 122880 kB
+ // VmallocUsed: 65252 kB
+ // VmallocChunk: 52356 kB
+ // HardwareCorrupted: 0 kB
+ // HugePages_Total: 0
+ // HugePages_Free: 0
+ // HugePages_Rsvd: 0
+ // HugePages_Surp: 0
+ // Hugepagesize: 2048 kB
+ // DirectMap4k: 434168 kB
+ // DirectMap2M: 477184 kB
+ // (could also run 'free', but easier to read a file than run a program)
+ avail_physical_mem_kb = -1 ;
+ avail_virtual_mem_kb = -1 ;
#else
//do not know how to collect available memory info for other systems.
@@ -708,56 +878,389 @@ void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_v
void LLMemoryInfo::stream(std::ostream& s) const
{
+ // We want these memory stats to be easy to grep from the log, along with
+ // the timestamp. So preface each line with the timestamp and a
+ // distinctive marker. Without that, we'd have to search the log for the
+ // introducer line, then read subsequent lines, etc...
+ std::string pfx(LLError::utcTime() + " <mem> ");
+
+ // Max key length
+ size_t key_width(0);
+ BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap))
+ {
+ size_t len(pair.first.length());
+ if (len > key_width)
+ {
+ key_width = len;
+ }
+ }
+
+ // Now stream stats
+ BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap))
+ {
+ s << pfx << std::setw(key_width+1) << (pair.first + ':') << ' ';
+ LLSD value(pair.second);
+ if (value.isInteger())
+ s << std::setw(12) << value.asInteger();
+ else if (value.isReal())
+ s << std::fixed << std::setprecision(1) << value.asReal();
+ else if (value.isDate())
+ value.asDate().toStream(s);
+ else
+ s << value; // just use default LLSD formatting
+ s << std::endl;
+ }
+}
+
+LLSD LLMemoryInfo::getStatsMap() const
+{
+ return mStatsMap;
+}
+
+LLMemoryInfo& LLMemoryInfo::refresh()
+{
+ mStatsMap = loadStatsMap();
+
+ LL_DEBUGS("LLMemoryInfo") << "Populated mStatsMap:\n";
+ LLSDSerialize::toPrettyXML(mStatsMap, LL_CONT);
+ LL_ENDL;
+
+ return *this;
+}
+
+LLSD LLMemoryInfo::loadStatsMap()
+{
+ // This implementation is derived from stream() code (as of 2011-06-29).
+ Stats stats;
+
+ // associate timestamp for analysis over time
+ stats.add("timestamp", LLDate::now());
+
#if LL_WINDOWS
MEMORYSTATUSEX state;
state.dwLength = sizeof(state);
GlobalMemoryStatusEx(&state);
- s << "Percent Memory use: " << (U32)state.dwMemoryLoad << '%' << std::endl;
- s << "Total Physical KB: " << (U32)(state.ullTotalPhys/1024) << std::endl;
- s << "Avail Physical KB: " << (U32)(state.ullAvailPhys/1024) << std::endl;
- s << "Total page KB: " << (U32)(state.ullTotalPageFile/1024) << std::endl;
- s << "Avail page KB: " << (U32)(state.ullAvailPageFile/1024) << std::endl;
- s << "Total Virtual KB: " << (U32)(state.ullTotalVirtual/1024) << std::endl;
- s << "Avail Virtual KB: " << (U32)(state.ullAvailVirtual/1024) << std::endl;
+ stats.add("Percent Memory use", state.dwMemoryLoad);
+ stats.add("Total Physical KB", state.ullTotalPhys/1024);
+ stats.add("Avail Physical KB", state.ullAvailPhys/1024);
+ stats.add("Total page KB", state.ullTotalPageFile/1024);
+ stats.add("Avail page KB", state.ullAvailPageFile/1024);
+ stats.add("Total Virtual KB", state.ullTotalVirtual/1024);
+ stats.add("Avail Virtual KB", state.ullAvailVirtual/1024);
+
+ PERFORMANCE_INFORMATION perf;
+ perf.cb = sizeof(perf);
+ GetPerformanceInfo(&perf, sizeof(perf));
+
+ SIZE_T pagekb(perf.PageSize/1024);
+ stats.add("CommitTotal KB", perf.CommitTotal * pagekb);
+ stats.add("CommitLimit KB", perf.CommitLimit * pagekb);
+ stats.add("CommitPeak KB", perf.CommitPeak * pagekb);
+ stats.add("PhysicalTotal KB", perf.PhysicalTotal * pagekb);
+ stats.add("PhysicalAvail KB", perf.PhysicalAvailable * pagekb);
+ stats.add("SystemCache KB", perf.SystemCache * pagekb);
+ stats.add("KernelTotal KB", perf.KernelTotal * pagekb);
+ stats.add("KernelPaged KB", perf.KernelPaged * pagekb);
+ stats.add("KernelNonpaged KB", perf.KernelNonpaged * pagekb);
+ stats.add("PageSize KB", pagekb);
+ stats.add("HandleCount", perf.HandleCount);
+ stats.add("ProcessCount", perf.ProcessCount);
+ stats.add("ThreadCount", perf.ThreadCount);
+
+ PROCESS_MEMORY_COUNTERS_EX pmem;
+ pmem.cb = sizeof(pmem);
+ // GetProcessMemoryInfo() is documented to accept either
+ // PROCESS_MEMORY_COUNTERS* or PROCESS_MEMORY_COUNTERS_EX*, presumably
+ // using the redundant size info to distinguish. But its prototype
+ // specifically accepts PROCESS_MEMORY_COUNTERS*, and since this is a
+ // classic-C API, PROCESS_MEMORY_COUNTERS_EX isn't a subclass. Cast the
+ // pointer.
+ GetProcessMemoryInfo(GetCurrentProcess(), PPROCESS_MEMORY_COUNTERS(&pmem), sizeof(pmem));
+
+ stats.add("Page Fault Count", pmem.PageFaultCount);
+ stats.add("PeakWorkingSetSize KB", pmem.PeakWorkingSetSize/1024);
+ stats.add("WorkingSetSize KB", pmem.WorkingSetSize/1024);
+ stats.add("QutaPeakPagedPoolUsage KB", pmem.QuotaPeakPagedPoolUsage/1024);
+ stats.add("QuotaPagedPoolUsage KB", pmem.QuotaPagedPoolUsage/1024);
+ stats.add("QuotaPeakNonPagedPoolUsage KB", pmem.QuotaPeakNonPagedPoolUsage/1024);
+ stats.add("QuotaNonPagedPoolUsage KB", pmem.QuotaNonPagedPoolUsage/1024);
+ stats.add("PagefileUsage KB", pmem.PagefileUsage/1024);
+ stats.add("PeakPagefileUsage KB", pmem.PeakPagefileUsage/1024);
+ stats.add("PrivateUsage KB", pmem.PrivateUsage/1024);
+
#elif LL_DARWIN
uint64_t phys = 0;
size_t len = sizeof(phys);
- if(sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
+ if (sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
{
- s << "Total Physical KB: " << phys/1024 << std::endl;
+ stats.add("Total Physical KB", phys/1024);
}
else
{
- s << "Unable to collect memory information";
+ LL_WARNS("LLMemoryInfo") << "Unable to collect hw.memsize memory information" << LL_ENDL;
+ }
+
+ FILE* pout = popen("vm_stat 2>&1", "r");
+ if (! pout) // popen() couldn't run vm_stat
+ {
+ // Save errno right away.
+ int popen_errno(errno);
+ LL_WARNS("LLMemoryInfo") << "Unable to collect vm_stat memory information: ";
+ char buffer[256];
+ if (0 == strerror_r(popen_errno, buffer, sizeof(buffer)))
+ {
+ LL_CONT << buffer;
+ }
+ else
+ {
+ LL_CONT << "errno " << popen_errno;
+ }
+ LL_CONT << LL_ENDL;
+ }
+ else // popen() launched vm_stat
+ {
+ // Mach Virtual Memory Statistics: (page size of 4096 bytes)
+ // Pages free: 462078.
+ // Pages active: 142010.
+ // Pages inactive: 220007.
+ // Pages wired down: 159552.
+ // "Translation faults": 220825184.
+ // Pages copy-on-write: 2104153.
+ // Pages zero filled: 167034876.
+ // Pages reactivated: 65153.
+ // Pageins: 2097212.
+ // Pageouts: 41759.
+ // Object cache: 841598 hits of 7629869 lookups (11% hit rate)
+
+ // Intentionally don't pass the boost::no_except flag. These
+ // boost::regex objects are constructed with string literals, so they
+ // should be valid every time. If they become invalid, we WANT an
+ // exception, hopefully even before the dev checks in.
+ boost::regex pagesize_rx("\\(page size of ([0-9]+) bytes\\)");
+ boost::regex stat_rx("(.+): +([0-9]+)\\.");
+ boost::regex cache_rx("Object cache: ([0-9]+) hits of ([0-9]+) lookups "
+ "\\(([0-9]+)% hit rate\\)");
+ boost::cmatch matched;
+ LLSD::Integer pagesizekb(4096/1024);
+
+ // Here 'pout' is vm_stat's stdout. Search it for relevant data.
+ char line[100];
+ line[sizeof(line)-1] = '\0';
+ while (fgets(line, sizeof(line)-1, pout))
+ {
+ size_t linelen(strlen(line));
+ // Truncate any trailing newline
+ if (line[linelen - 1] == '\n')
+ {
+ line[--linelen] = '\0';
+ }
+ LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
+ if (regex_search_no_exc(line, matched, pagesize_rx))
+ {
+ // "Mach Virtual Memory Statistics: (page size of 4096 bytes)"
+ std::string pagesize_str(matched[1].first, matched[1].second);
+ try
+ {
+ // Reasonable to assume that pagesize will always be a
+ // multiple of 1Kb?
+ pagesizekb = boost::lexical_cast<LLSD::Integer>(pagesize_str)/1024;
+ }
+ catch (const boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << pagesize_str
+ << "' in vm_stat line: " << line << LL_ENDL;
+ continue;
+ }
+ stats.add("page size", pagesizekb);
+ }
+ else if (regex_match_no_exc(line, matched, stat_rx))
+ {
+ // e.g. "Pages free: 462078."
+ // Strip double-quotes off certain statistic names
+ const char *key_begin(matched[1].first), *key_end(matched[1].second);
+ if (key_begin[0] == '"' && key_end[-1] == '"')
+ {
+ ++key_begin;
+ --key_end;
+ }
+ LLSD::String key(key_begin, key_end);
+ LLSD::String value_str(matched[2].first, matched[2].second);
+ LLSD::Integer value(0);
+ try
+ {
+ value = boost::lexical_cast<LLSD::Integer>(value_str);
+ }
+ catch (const boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
+ << "' in vm_stat line: " << line << LL_ENDL;
+ continue;
+ }
+ // Store this statistic.
+ stats.add(key, value);
+ // Is this in units of pages? If so, convert to Kb.
+ static const LLSD::String pages("Pages ");
+ if (key.substr(0, pages.length()) == pages)
+ {
+ // Synthesize a new key with kb in place of Pages
+ LLSD::String kbkey("kb ");
+ kbkey.append(key.substr(pages.length()));
+ stats.add(kbkey, value * pagesizekb);
+ }
+ }
+ else if (regex_match_no_exc(line, matched, cache_rx))
+ {
+ // e.g. "Object cache: 841598 hits of 7629869 lookups (11% hit rate)"
+ static const char* cache_keys[] = { "cache hits", "cache lookups", "cache hit%" };
+ std::vector<LLSD::Integer> cache_values;
+ for (size_t i = 0; i < (sizeof(cache_keys)/sizeof(cache_keys[0])); ++i)
+ {
+ LLSD::String value_str(matched[i+1].first, matched[i+1].second);
+ LLSD::Integer value(0);
+ try
+ {
+ value = boost::lexical_cast<LLSD::Integer>(value_str);
+ }
+ catch (boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
+ << "' in vm_stat line: " << line << LL_ENDL;
+ continue;
+ }
+ stats.add(cache_keys[i], value);
+ }
+ }
+ else
+ {
+ LL_WARNS("LLMemoryInfo") << "unrecognized vm_stat line: " << line << LL_ENDL;
+ }
+ }
+ int status(pclose(pout));
+ if (status == -1) // pclose() couldn't retrieve rc
+ {
+ // Save errno right away.
+ int pclose_errno(errno);
+ // The ECHILD error happens so frequently that unless filtered,
+ // the warning below spams the log file. This is too bad, because
+ // sometimes the logic above fails to produce any output derived
+ // from vm_stat, but we've been unable to observe any specific
+ // error indicating the problem.
+ if (pclose_errno != ECHILD)
+ {
+ LL_WARNS("LLMemoryInfo") << "Unable to obtain vm_stat termination code: ";
+ char buffer[256];
+ if (0 == strerror_r(pclose_errno, buffer, sizeof(buffer)))
+ {
+ LL_CONT << buffer;
+ }
+ else
+ {
+ LL_CONT << "errno " << pclose_errno;
+ }
+ LL_CONT << LL_ENDL;
+ }
+ }
+ else // pclose() retrieved rc; analyze
+ {
+ if (WIFEXITED(status))
+ {
+ int rc(WEXITSTATUS(status));
+ if (rc != 0)
+ {
+ LL_WARNS("LLMemoryInfo") << "vm_stat terminated with rc " << rc << LL_ENDL;
+ }
+ }
+ else if (WIFSIGNALED(status))
+ {
+ LL_WARNS("LLMemoryInfo") << "vm_stat terminated by signal " << WTERMSIG(status)
+ << LL_ENDL;
+ }
+ }
}
+
#elif LL_SOLARIS
- U64 phys = 0;
+ U64 phys = 0;
- phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
+ phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
- s << "Total Physical KB: " << phys << std::endl;
-#else
- // *NOTE: This works on linux. What will it do on other systems?
- LLFILE* meminfo = LLFile::fopen(MEMINFO_FILE,"rb");
- if(meminfo)
+ stats.add("Total Physical KB", phys);
+
+#elif LL_LINUX
+ std::ifstream meminfo(MEMINFO_FILE);
+ if (meminfo.is_open())
{
- char line[MAX_STRING]; /* Flawfinder: ignore */
- memset(line, 0, MAX_STRING);
- while(fgets(line, MAX_STRING, meminfo))
+ // MemTotal: 4108424 kB
+ // MemFree: 1244064 kB
+ // Buffers: 85164 kB
+ // Cached: 1990264 kB
+ // SwapCached: 0 kB
+ // Active: 1176648 kB
+ // Inactive: 1427532 kB
+ // ...
+ // VmallocTotal: 122880 kB
+ // VmallocUsed: 65252 kB
+ // VmallocChunk: 52356 kB
+ // HardwareCorrupted: 0 kB
+ // HugePages_Total: 0
+ // HugePages_Free: 0
+ // HugePages_Rsvd: 0
+ // HugePages_Surp: 0
+ // Hugepagesize: 2048 kB
+ // DirectMap4k: 434168 kB
+ // DirectMap2M: 477184 kB
+
+ // Intentionally don't pass the boost::no_except flag. This
+ // boost::regex object is constructed with a string literal, so it
+ // should be valid every time. If it becomes invalid, we WANT an
+ // exception, hopefully even before the dev checks in.
+ boost::regex stat_rx("(.+): +([0-9]+)( kB)?");
+ boost::smatch matched;
+
+ std::string line;
+ while (std::getline(meminfo, line))
{
- line[strlen(line)-1] = ' '; /*Flawfinder: ignore*/
- s << line;
+ LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
+ if (regex_match_no_exc(line, matched, stat_rx))
+ {
+ // e.g. "MemTotal: 4108424 kB"
+ LLSD::String key(matched[1].first, matched[1].second);
+ LLSD::String value_str(matched[2].first, matched[2].second);
+ LLSD::Integer value(0);
+ try
+ {
+ value = boost::lexical_cast<LLSD::Integer>(value_str);
+ }
+ catch (const boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
+ << "' in " << MEMINFO_FILE << " line: "
+ << line << LL_ENDL;
+ continue;
+ }
+ // Store this statistic.
+ stats.add(key, value);
+ }
+ else
+ {
+ LL_WARNS("LLMemoryInfo") << "unrecognized " << MEMINFO_FILE << " line: "
+ << line << LL_ENDL;
+ }
}
- fclose(meminfo);
}
else
{
- s << "Unable to collect memory information";
+ LL_WARNS("LLMemoryInfo") << "Unable to collect memory information" << LL_ENDL;
}
+
+#else
+ LL_WARNS("LLMemoryInfo") << "Unknown system; unable to collect memory information" << LL_ENDL;
+
#endif
+
+ return stats.get();
}
std::ostream& operator<<(std::ostream& s, const LLOSInfo& info)
@@ -778,6 +1281,143 @@ std::ostream& operator<<(std::ostream& s, const LLMemoryInfo& info)
return s;
}
+class FrameWatcher
+{
+public:
+ FrameWatcher():
+ // Hooking onto the "mainloop" event pump gets us one call per frame.
+ mConnection(LLEventPumps::instance()
+ .obtain("mainloop")
+ .listen("FrameWatcher", boost::bind(&FrameWatcher::tick, this, _1))),
+ // Initializing mSampleStart to an invalid timestamp alerts us to skip
+ // trying to compute framerate on the first call.
+ mSampleStart(-1),
+ // Initializing mSampleEnd to 0 ensures that we treat the first call
+ // as the completion of a sample window.
+ mSampleEnd(0),
+ mFrames(0),
+ // Both MEM_INFO_WINDOW and MEM_INFO_THROTTLE are in seconds. We need
+ // the number of integer MEM_INFO_THROTTLE sample slots that will fit
+ // in MEM_INFO_WINDOW. Round up.
+ mSamples(int((MEM_INFO_WINDOW / MEM_INFO_THROTTLE) + 0.7)),
+ // Initializing to F32_MAX means that the first real frame will become
+ // the slowest ever, which sounds like a good idea.
+ mSlowest(F32_MAX)
+ {}
+
+ bool tick(const LLSD&)
+ {
+ F32 timestamp(mTimer.getElapsedTimeF32());
+
+ // Count this frame in the interval just completed.
+ ++mFrames;
+
+ // Have we finished a sample window yet?
+ if (timestamp < mSampleEnd)
+ {
+ // no, just keep waiting
+ return false;
+ }
+
+ // Set up for next sample window. Capture values for previous frame in
+ // local variables and reset data members.
+ U32 frames(mFrames);
+ F32 sampleStart(mSampleStart);
+ // No frames yet in next window
+ mFrames = 0;
+ // which starts right now
+ mSampleStart = timestamp;
+ // and ends MEM_INFO_THROTTLE seconds in the future
+ mSampleEnd = mSampleStart + MEM_INFO_THROTTLE;
+
+ // On the very first call, that's all we can do, no framerate
+ // computation is possible.
+ if (sampleStart < 0)
+ {
+ return false;
+ }
+
+ // How long did this actually take? As framerate slows, the duration
+ // of the frame we just finished could push us WELL beyond our desired
+ // sample window size.
+ F32 elapsed(timestamp - sampleStart);
+ F32 framerate(frames/elapsed);
+
+ // Remember previous slowest framerate because we're just about to
+ // update it.
+ F32 slowest(mSlowest);
+ // Remember previous number of samples.
+ boost::circular_buffer<F32>::size_type prevSize(mSamples.size());
+
+ // Capture new framerate in our samples buffer. Once the buffer is
+ // full (after MEM_INFO_WINDOW seconds), this will displace the oldest
+ // sample. ("So they all rolled over, and one fell out...")
+ mSamples.push_back(framerate);
+
+ // Calculate the new minimum framerate. I know of no way to update a
+ // rolling minimum without ever rescanning the buffer. But since there
+ // are only a few tens of items in this buffer, rescanning it is
+ // probably cheaper (and certainly easier to reason about) than
+ // attempting to optimize away some of the scans.
+ mSlowest = framerate; // pick an arbitrary entry to start
+ for (boost::circular_buffer<F32>::const_iterator si(mSamples.begin()), send(mSamples.end());
+ si != send; ++si)
+ {
+ if (*si < mSlowest)
+ {
+ mSlowest = *si;
+ }
+ }
+
+ // We're especially interested in memory as framerate drops. Only log
+ // when framerate drops below the slowest framerate we remember.
+ // (Should always be true for the end of the very first sample
+ // window.)
+ if (framerate >= slowest)
+ {
+ return false;
+ }
+ // Congratulations, we've hit a new low. :-P
+
+ LL_INFOS("FrameWatcher") << ' ';
+ if (! prevSize)
+ {
+ LL_CONT << "initial framerate ";
+ }
+ else
+ {
+ LL_CONT << "slowest framerate for last " << int(prevSize * MEM_INFO_THROTTLE)
+ << " seconds ";
+ }
+ LL_CONT << std::fixed << std::setprecision(1) << framerate << '\n'
+ << LLMemoryInfo() << LL_ENDL;
+
+ return false;
+ }
+
+private:
+ // Storing the connection in an LLTempBoundListener ensures it will be
+ // disconnected when we're destroyed.
+ LLTempBoundListener mConnection;
+ // Track elapsed time
+ LLTimer mTimer;
+ // Some of what you see here is in fact redundant with functionality you
+ // can get from LLTimer. Unfortunately the LLTimer API is missing the
+ // feature we need: has at least the stated interval elapsed, and if so,
+ // exactly how long has passed? So we have to do it by hand, sigh.
+ // Time at start, end of sample window
+ F32 mSampleStart, mSampleEnd;
+ // Frames this sample window
+ U32 mFrames;
+ // Sliding window of framerate samples
+ boost::circular_buffer<F32> mSamples;
+ // Slowest framerate in mSamples
+ F32 mSlowest;
+};
+
+// Need an instance of FrameWatcher before it does any good
+static FrameWatcher sFrameWatcher;
+
BOOL gunzip_file(const std::string& srcfile, const std::string& dstfile)
{
std::string tmpfile;
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 41a4f25000..739e795d3a 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -36,6 +36,7 @@
// llinfos << info << llendl;
//
+#include "llsd.h"
#include <iosfwd>
#include <string>
@@ -117,6 +118,27 @@ public:
//get the available memory infomation in KiloBytes.
static void getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb);
+
+ // Retrieve a map of memory statistics. The keys of the map are platform-
+ // dependent. The values are in kilobytes to try to avoid integer overflow.
+ LLSD getStatsMap() const;
+
+ // Re-fetch memory data (as reported by stream() and getStatsMap()) from the
+ // system. Normally this is fetched at construction time. Return (*this)
+ // to permit usage of the form:
+ // @code
+ // LLMemoryInfo info;
+ // ...
+ // info.refresh().getStatsMap();
+ // @endcode
+ LLMemoryInfo& refresh();
+
+private:
+ // set mStatsMap
+ static LLSD loadStatsMap();
+
+ // Memory stats for getStatsMap().
+ LLSD mStatsMap;
};
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index d9400fb5b3..4063cc730b 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -323,7 +323,8 @@ LLMutex::LLMutex(apr_pool_t *poolp) :
LLMutex::~LLMutex()
{
#if MUTEX_DEBUG
- llassert_always(!isLocked()); // better not be locked!
+ //bad assertion, the subclass LLSignal might be "locked", and that's OK
+ //llassert_always(!isLocked()); // better not be locked!
#endif
apr_thread_mutex_destroy(mAPRMutexp);
mAPRMutexp = NULL;
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 69720bb903..f98a5398c3 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -28,8 +28,8 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 2;
-const S32 LL_VERSION_MINOR = 7;
-const S32 LL_VERSION_PATCH = 6;
+const S32 LL_VERSION_MINOR = 8;
+const S32 LL_VERSION_PATCH = 3;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp
index c7cb488ca1..3caf49aa6e 100644
--- a/indra/llcommon/tests/llinstancetracker_test.cpp
+++ b/indra/llcommon/tests/llinstancetracker_test.cpp
@@ -90,94 +90,79 @@ namespace tut
ensure_equals(Keyed::instanceCount(), 0);
}
- template<> template<>
- void object::test<2>()
- {
- ensure_equals(Unkeyed::instanceCount(), 0);
- {
- Unkeyed one;
- ensure_equals(Unkeyed::instanceCount(), 1);
- Unkeyed* found = Unkeyed::getInstance(&one);
- ensure_equals(found, &one);
- {
- boost::scoped_ptr<Unkeyed> two(new Unkeyed);
- ensure_equals(Unkeyed::instanceCount(), 2);
- Unkeyed* found = Unkeyed::getInstance(two.get());
- ensure_equals(found, two.get());
- }
- ensure_equals(Unkeyed::instanceCount(), 1);
- }
- ensure_equals(Unkeyed::instanceCount(), 0);
- }
-
- template<> template<>
- void object::test<3>()
- {
- Keyed one("one"), two("two"), three("three");
- // We don't want to rely on the underlying container delivering keys
- // in any particular order. That allows us the flexibility to
- // reimplement LLInstanceTracker using, say, a hash map instead of a
- // std::map. We DO insist that every key appear exactly once.
- typedef std::vector<std::string> StringVector;
- StringVector keys(Keyed::beginKeys(), Keyed::endKeys());
- std::sort(keys.begin(), keys.end());
- StringVector::const_iterator ki(keys.begin());
- ensure_equals(*ki++, "one");
- ensure_equals(*ki++, "three");
- ensure_equals(*ki++, "two");
- // Use ensure() here because ensure_equals would want to display
- // mismatched values, and frankly that wouldn't help much.
- ensure("didn't reach end", ki == keys.end());
+ // template<> template<>
+ // void object::test<2>()
+ // {
+ // ensure_equals(Unkeyed::instanceCount(), 0);
+ // {
+ // Unkeyed one;
+ // ensure_equals(Unkeyed::instanceCount(), 1);
+ // Unkeyed* found = Unkeyed::getInstance(&one);
+ // ensure_equals(found, &one);
+ // {
+ // boost::scoped_ptr<Unkeyed> two(new Unkeyed);
+ // ensure_equals(Unkeyed::instanceCount(), 2);
+ // Unkeyed* found = Unkeyed::getInstance(two.get());
+ // ensure_equals(found, two.get());
+ // }
+ // ensure_equals(Unkeyed::instanceCount(), 1);
+ // }
+ // ensure_equals(Unkeyed::instanceCount(), 0);
+ // }
- // Use a somewhat different approach to order independence with
- // beginInstances(): explicitly capture the instances we know in a
- // set, and delete them as we iterate through.
- typedef std::set<Keyed*> InstanceSet;
- InstanceSet instances;
- instances.insert(&one);
- instances.insert(&two);
- instances.insert(&three);
- for (Keyed::instance_iter ii(Keyed::beginInstances()), iend(Keyed::endInstances());
- ii != iend; ++ii)
- {
- Keyed& ref = *ii;
- ensure_equals("spurious instance", instances.erase(&ref), 1);
- }
- ensure_equals("unreported instance", instances.size(), 0);
- }
+ // template<> template<>
+ // void object::test<3>()
+ // {
+ // Keyed one("one"), two("two"), three("three");
+ // // We don't want to rely on the underlying container delivering keys
+ // // in any particular order. That allows us the flexibility to
+ // // reimplement LLInstanceTracker using, say, a hash map instead of a
+ // // std::map. We DO insist that every key appear exactly once.
+ // typedef std::vector<std::string> StringVector;
+ // StringVector keys(Keyed::beginKeys(), Keyed::endKeys());
+ // std::sort(keys.begin(), keys.end());
+ // StringVector::const_iterator ki(keys.begin());
+ // ensure_equals(*ki++, "one");
+ // ensure_equals(*ki++, "three");
+ // ensure_equals(*ki++, "two");
+ // // Use ensure() here because ensure_equals would want to display
+ // // mismatched values, and frankly that wouldn't help much.
+ // ensure("didn't reach end", ki == keys.end());
- template<> template<>
- void object::test<4>()
- {
- Unkeyed one, two, three;
- typedef std::set<Unkeyed*> KeySet;
- KeySet keys;
- keys.insert(&one);
- keys.insert(&two);
- keys.insert(&three);
- {
- Unkeyed::LLInstanceTrackerScopedGuard guard;
- for (Unkeyed::key_iter ki(guard.beginKeys()), kend(guard.endKeys());
- ki != kend; ++ki)
- {
- ensure_equals("spurious key", keys.erase(*ki), 1);
- }
- }
- ensure_equals("unreported key", keys.size(), 0);
+ // // Use a somewhat different approach to order independence with
+ // // beginInstances(): explicitly capture the instances we know in a
+ // // set, and delete them as we iterate through.
+ // typedef std::set<Keyed*> InstanceSet;
+ // InstanceSet instances;
+ // instances.insert(&one);
+ // instances.insert(&two);
+ // instances.insert(&three);
+ // for (Keyed::instance_iter ii(Keyed::beginInstances()), iend(Keyed::endInstances());
+ // ii != iend; ++ii)
+ // {
+ // Keyed& ref = *ii;
+ // ensure_equals("spurious instance", instances.erase(&ref), 1);
+ // }
+ // ensure_equals("unreported instance", instances.size(), 0);
+ // }
- KeySet instances;
- instances.insert(&one);
- instances.insert(&two);
- instances.insert(&three);
- {
- Unkeyed::LLInstanceTrackerScopedGuard guard;
- for (Unkeyed::instance_iter ii(guard.beginInstances()), iend(guard.endInstances());
- ii != iend; ++ii)
- {
- Unkeyed& ref = *ii;
- ensure_equals("spurious instance", instances.erase(&ref), 1);
- }
- }
- ensure_equals("unreported instance", instances.size(), 0);
- }
+ // template<> template<>
+ // void object::test<4>()
+ // {
+ // Unkeyed one, two, three;
+ // typedef std::set<Unkeyed*> KeySet;
+ //
+ // KeySet instances;
+ // instances.insert(&one);
+ // instances.insert(&two);
+ // instances.insert(&three);
+
+ //for (Unkeyed::instance_iter ii(Unkeyed::beginInstances()), iend(Unkeyed::endInstances()); ii != iend; ++ii)
+ //{
+ // Unkeyed& ref = *ii;
+ // ensure_equals("spurious instance", instances.erase(&ref), 1);
+ //}
+
+ // ensure_equals("unreported instance", instances.size(), 0);
+ // }
} // namespace tut
diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp
index 7b4c7d6a48..72322c3b72 100644
--- a/indra/llcommon/tests/llsdserialize_test.cpp
+++ b/indra/llcommon/tests/llsdserialize_test.cpp
@@ -25,35 +25,293 @@
* $/LicenseInfo$
*/
-#if !LL_WINDOWS
+
+#include "linden_common.h"
+
+#if LL_WINDOWS
+#include <winsock2.h>
+typedef U32 uint32_t;
+#include <process.h>
+#include <io.h>
+#else
+#include <unistd.h>
#include <netinet/in.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include "llprocesslauncher.h"
#endif
-#include "linden_common.h"
+#include <sstream>
+
+/*==========================================================================*|
+// Whoops, seems Linden's Boost package and the viewer are built with
+// different settings of VC's /Zc:wchar_t switch! Using Boost.Filesystem
+// pathname operations produces Windows link errors:
+// unresolved external symbol "private: static class std::codecvt<unsigned short,
+// char,int> const * & __cdecl boost::filesystem3::path::wchar_t_codecvt_facet()"
+// unresolved external symbol "void __cdecl boost::filesystem3::path_traits::convert()"
+// See:
+// http://boost.2283326.n4.nabble.com/filesystem-v3-unicode-and-std-codecvt-linker-error-td3455549.html
+// which points to:
+// http://msdn.microsoft.com/en-us/library/dh8che7s%28v=VS.100%29.aspx
+
+// As we're not trying to preserve compatibility with old Boost.Filesystem
+// code, but rather writing brand-new code, use the newest available
+// Filesystem API.
+#define BOOST_FILESYSTEM_VERSION 3
+#include "boost/filesystem.hpp"
+#include "boost/filesystem/v3/fstream.hpp"
+|*==========================================================================*/
+#include "boost/range.hpp"
+#include "boost/foreach.hpp"
+#include "boost/function.hpp"
+#include "boost/lambda/lambda.hpp"
+#include "boost/lambda/bind.hpp"
+namespace lambda = boost::lambda;
+/*==========================================================================*|
+// Aaaarrgh, Linden's Boost package doesn't even include Boost.Iostreams!
+#include "boost/iostreams/stream.hpp"
+#include "boost/iostreams/device/file_descriptor.hpp"
+|*==========================================================================*/
+
#include "../llsd.h"
#include "../llsdserialize.h"
+#include "llsdutil.h"
#include "../llformat.h"
#include "../test/lltut.h"
+#include "stringize.h"
+std::vector<U8> string_to_vector(const std::string& str)
+{
+ return std::vector<U8>(str.begin(), str.end());
+}
-#if LL_WINDOWS
-#include <winsock2.h>
-typedef U32 uint32_t;
-#endif
+#if ! LL_WINDOWS
+// We want to call strerror_r(), but alarmingly, there are two different
+// variants. The one that returns int always populates the passed buffer
+// (except in case of error), whereas the other one always returns a valid
+// char* but might or might not populate the passed buffer. How do we know
+// which one we're getting? Define adapters for each and let the compiler
+// select the applicable adapter.
-std::vector<U8> string_to_vector(std::string str)
+// strerror_r() returns char*
+std::string message_from(int /*orig_errno*/, const char* /*buffer*/, const char* strerror_ret)
{
- // bc LLSD can't...
- size_t len = (size_t)str.length();
- std::vector<U8> v(len);
- for (size_t i = 0; i < len ; i++)
- {
- v[i] = str[i];
- }
- return v;
+ return strerror_ret;
}
+// strerror_r() returns int
+std::string message_from(int orig_errno, const char* buffer, int strerror_ret)
+{
+ if (strerror_ret == 0)
+ {
+ return buffer;
+ }
+ // Here strerror_r() has set errno. Since strerror_r() has already failed,
+ // seems like a poor bet to call it again to diagnose its own error...
+ int stre_errno = errno;
+ if (stre_errno == ERANGE)
+ {
+ return STRINGIZE("strerror_r() can't explain errno " << orig_errno
+ << " (buffer too small)");
+ }
+ if (stre_errno == EINVAL)
+ {
+ return STRINGIZE("unknown errno " << orig_errno);
+ }
+ // Here we don't even understand the errno from strerror_r()!
+ return STRINGIZE("strerror_r() can't explain errno " << orig_errno
+ << " (error " << stre_errno << ')');
+}
+#endif // ! LL_WINDOWS
+
+// boost::filesystem::temp_directory_path() isn't yet in Boost 1.45! :-(
+std::string temp_directory_path()
+{
+#if LL_WINDOWS
+ char buffer[4096];
+ GetTempPathA(sizeof(buffer), buffer);
+ return buffer;
+
+#else // LL_DARWIN, LL_LINUX
+ static const char* vars[] = { "TMPDIR", "TMP", "TEMP", "TEMPDIR" };
+ BOOST_FOREACH(const char* var, vars)
+ {
+ const char* found = getenv(var);
+ if (found)
+ return found;
+ }
+ return "/tmp";
+#endif // LL_DARWIN, LL_LINUX
+}
+
+// Windows presents a kinda sorta compatibility layer. Code to the yucky
+// Windows names because they're less likely than the Posix names to collide
+// with any other names in this source.
+#if LL_WINDOWS
+#define _remove DeleteFileA
+#else // ! LL_WINDOWS
+#define _open open
+#define _write write
+#define _close close
+#define _remove remove
+#endif // ! LL_WINDOWS
+
+// Create a text file with specified content "somewhere in the
+// filesystem," cleaning up when it goes out of scope.
+class NamedTempFile
+{
+public:
+ // Function that accepts an ostream ref and (presumably) writes stuff to
+ // it, e.g.:
+ // (lambda::_1 << "the value is " << 17 << '\n')
+ typedef boost::function<void(std::ostream&)> Streamer;
+
+ NamedTempFile(const std::string& ext, const std::string& content):
+ mPath(temp_directory_path())
+ {
+ createFile(ext, lambda::_1 << content);
+ }
+
+ // Disambiguate when passing string literal
+ NamedTempFile(const std::string& ext, const char* content):
+ mPath(temp_directory_path())
+ {
+ createFile(ext, lambda::_1 << content);
+ }
+
+ NamedTempFile(const std::string& ext, const Streamer& func):
+ mPath(temp_directory_path())
+ {
+ createFile(ext, func);
+ }
+
+ ~NamedTempFile()
+ {
+ _remove(mPath.c_str());
+ }
+
+ std::string getName() const { return mPath; }
+
+private:
+ void createFile(const std::string& ext, const Streamer& func)
+ {
+ // Silly maybe, but use 'ext' as the name prefix. Strip off a leading
+ // '.' if present.
+ int pfx_offset = ((! ext.empty()) && ext[0] == '.')? 1 : 0;
+
+#if ! LL_WINDOWS
+ // Make sure mPath ends with a directory separator, if it doesn't already.
+ if (mPath.empty() ||
+ ! (mPath[mPath.length() - 1] == '\\' || mPath[mPath.length() - 1] == '/'))
+ {
+ mPath.append("/");
+ }
+
+ // mkstemp() accepts and modifies a char* template string. Generate
+ // the template string, then copy to modifiable storage.
+ // mkstemp() requires its template string to end in six X's.
+ mPath += ext.substr(pfx_offset) + "XXXXXX";
+ // Copy to vector<char>
+ std::vector<char> pathtemplate(mPath.begin(), mPath.end());
+ // append a nul byte for classic-C semantics
+ pathtemplate.push_back('\0');
+ // std::vector promises that a pointer to the 0th element is the same
+ // as a pointer to a contiguous classic-C array
+ int fd(mkstemp(&pathtemplate[0]));
+ if (fd == -1)
+ {
+ // The documented errno values (http://linux.die.net/man/3/mkstemp)
+ // are used in a somewhat unusual way, so provide context-specific
+ // errors.
+ if (errno == EEXIST)
+ {
+ LL_ERRS("NamedTempFile") << "mkstemp(\"" << mPath
+ << "\") could not create unique file " << LL_ENDL;
+ }
+ if (errno == EINVAL)
+ {
+ LL_ERRS("NamedTempFile") << "bad mkstemp() file path template '"
+ << mPath << "'" << LL_ENDL;
+ }
+ // Shrug, something else
+ int mkst_errno = errno;
+ char buffer[256];
+ LL_ERRS("NamedTempFile") << "mkstemp(\"" << mPath << "\") failed: "
+ << message_from(mkst_errno, buffer,
+ strerror_r(mkst_errno, buffer, sizeof(buffer)))
+ << LL_ENDL;
+ }
+ // mkstemp() seems to have worked! Capture the modified filename.
+ // Avoid the nul byte we appended.
+ mPath.assign(pathtemplate.begin(), (pathtemplate.end()-1));
+
+/*==========================================================================*|
+ // Define an ostream on the open fd. Tell it to close fd on destruction.
+ boost::iostreams::stream<boost::iostreams::file_descriptor_sink>
+ out(fd, boost::iostreams::close_handle);
+|*==========================================================================*/
+
+ // Write desired content.
+ std::ostringstream out;
+ // Stream stuff to it.
+ func(out);
+
+ std::string data(out.str());
+ int written(_write(fd, data.c_str(), data.length()));
+ int closed(_close(fd));
+ llassert_always(written == data.length() && closed == 0);
+
+#else // LL_WINDOWS
+ // GetTempFileName() is documented to require a MAX_PATH buffer.
+ char tempname[MAX_PATH];
+ // Use 'ext' as filename prefix, but skip leading '.' if any.
+ // The 0 param is very important: requests iterating until we get a
+ // unique name.
+ if (0 == GetTempFileNameA(mPath.c_str(), ext.c_str() + pfx_offset, 0, tempname))
+ {
+ // I always have to look up this call... :-P
+ LPSTR msgptr;
+ FormatMessageA(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ LPSTR(&msgptr), // have to cast (char**) to (char*)
+ 0, NULL );
+ LL_ERRS("NamedTempFile") << "GetTempFileName(\"" << mPath << "\", \""
+ << (ext.c_str() + pfx_offset) << "\") failed: "
+ << msgptr << LL_ENDL;
+ LocalFree(msgptr);
+ }
+ // GetTempFileName() appears to have worked! Capture the actual
+ // filename.
+ mPath = tempname;
+ // Open the file and stream content to it. Destructor will close.
+ std::ofstream out(tempname);
+ func(out);
+
+#endif // LL_WINDOWS
+ }
+
+ void peep()
+ {
+ std::cout << "File '" << mPath << "' contains:\n";
+ std::ifstream reader(mPath.c_str());
+ std::string line;
+ while (std::getline(reader, line))
+ std::cout << line << '\n';
+ std::cout << "---\n";
+ }
+
+ std::string mPath;
+};
+
namespace tut
{
struct sd_xml_data
@@ -1494,5 +1752,223 @@ namespace tut
ensureBinaryAndNotation("map", test);
ensureBinaryAndXML("map", test);
}
-}
+ struct TestPythonCompatible
+ {
+ TestPythonCompatible():
+ // Note the peculiar insertion of __FILE__ into this string. Since
+ // this script is being written into a platform-dependent temp
+ // directory, we can't locate indra/lib/python relative to
+ // Python's __file__. Use __FILE__ instead, navigating relative
+ // to this C++ source file. Use Python raw-string syntax so
+ // Windows pathname backslashes won't mislead Python's string
+ // scanner.
+ import_llsd("import os.path\n"
+ "import sys\n"
+ "sys.path.insert(0,\n"
+ " os.path.join(os.path.dirname(r'" __FILE__ "'),\n"
+ " os.pardir, os.pardir, 'lib', 'python'))\n"
+ "try:\n"
+ " from llbase import llsd\n"
+ "except ImportError:\n"
+ " from indra.base import llsd\n")
+ {}
+ ~TestPythonCompatible() {}
+
+ std::string import_llsd;
+
+ template <typename CONTENT>
+ void python(const std::string& desc, const CONTENT& script, int expect=0)
+ {
+ const char* PYTHON(getenv("PYTHON"));
+ ensure("Set $PYTHON to the Python interpreter", PYTHON);
+
+ NamedTempFile scriptfile(".py", script);
+
+#if LL_WINDOWS
+ std::string q("\"");
+ std::string qPYTHON(q + PYTHON + q);
+ std::string qscript(q + scriptfile.getName() + q);
+ int rc = _spawnl(_P_WAIT, PYTHON, qPYTHON.c_str(), qscript.c_str(), NULL);
+ if (rc == -1)
+ {
+ char buffer[256];
+ strerror_s(buffer, errno); // C++ can infer the buffer size! :-O
+ ensure(STRINGIZE("Couldn't run Python " << desc << "script: " << buffer), false);
+ }
+ else
+ {
+ ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc), rc, expect);
+ }
+
+#else // LL_DARWIN, LL_LINUX
+ LLProcessLauncher py;
+ py.setExecutable(PYTHON);
+ py.addArgument(scriptfile.getName());
+ ensure_equals(STRINGIZE("Couldn't launch " << desc << " script"), py.launch(), 0);
+ // Implementing timeout would mean messing with alarm() and
+ // catching SIGALRM... later maybe...
+ int status(0);
+ if (waitpid(py.getProcessID(), &status, 0) == -1)
+ {
+ int waitpid_errno(errno);
+ ensure_equals(STRINGIZE("Couldn't retrieve rc from " << desc << " script: "
+ "waitpid() errno " << waitpid_errno),
+ waitpid_errno, ECHILD);
+ }
+ else
+ {
+ if (WIFEXITED(status))
+ {
+ int rc(WEXITSTATUS(status));
+ ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc),
+ rc, expect);
+ }
+ else if (WIFSIGNALED(status))
+ {
+ ensure(STRINGIZE(desc << " script terminated by signal " << WTERMSIG(status)),
+ false);
+ }
+ else
+ {
+ ensure(STRINGIZE(desc << " script produced impossible status " << status),
+ false);
+ }
+ }
+#endif
+ }
+ };
+
+ typedef tut::test_group<TestPythonCompatible> TestPythonCompatibleGroup;
+ typedef TestPythonCompatibleGroup::object TestPythonCompatibleObject;
+ TestPythonCompatibleGroup pycompat("LLSD serialize Python compatibility");
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<1>()
+ {
+ set_test_name("verify python()");
+ python("hello",
+ "import sys\n"
+ "sys.exit(17)\n",
+ 17); // expect nonzero rc
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<2>()
+ {
+ set_test_name("verify NamedTempFile");
+ python("platform",
+ "import sys\n"
+ "print 'Running on', sys.platform\n");
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<3>()
+ {
+ set_test_name("verify sequence to Python");
+
+ LLSD cdata(LLSDArray(17)(3.14)
+ ("This string\n"
+ "has several\n"
+ "lines."));
+
+ const char pydata[] =
+ "def verify(iterable):\n"
+ " it = iter(iterable)\n"
+ " assert it.next() == 17\n"
+ " assert abs(it.next() - 3.14) < 0.01\n"
+ " assert it.next() == '''\\\n"
+ "This string\n"
+ "has several\n"
+ "lines.'''\n"
+ " try:\n"
+ " it.next()\n"
+ " except StopIteration:\n"
+ " pass\n"
+ " else:\n"
+ " assert False, 'Too many data items'\n";
+
+ // Create a something.llsd file containing 'data' serialized to
+ // notation. It's important to separate with newlines because Python's
+ // llsd module doesn't support parsing from a file stream, only from a
+ // string, so we have to know how much of the file to read into a
+ // string.
+ NamedTempFile file(".llsd",
+ // NamedTempFile's boost::function constructor
+ // takes a callable. To this callable it passes the
+ // std::ostream with which it's writing the
+ // NamedTempFile. This lambda-based expression
+ // first calls LLSD::Serialize() with that ostream,
+ // then streams a newline to it, etc.
+ (lambda::bind(LLSDSerialize::toNotation, cdata[0], lambda::_1),
+ lambda::_1 << '\n',
+ lambda::bind(LLSDSerialize::toNotation, cdata[1], lambda::_1),
+ lambda::_1 << '\n',
+ lambda::bind(LLSDSerialize::toNotation, cdata[2], lambda::_1),
+ lambda::_1 << '\n'));
+
+ python("read C++ notation",
+ lambda::_1 <<
+ import_llsd <<
+ "def parse_each(iterable):\n"
+ " for item in iterable:\n"
+ " yield llsd.parse(item)\n" <<
+ pydata <<
+ // Don't forget raw-string syntax for Windows pathnames.
+ "verify(parse_each(open(r'" << file.getName() << "')))\n");
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<4>()
+ {
+ set_test_name("verify sequence from Python");
+
+ // Create an empty data file. This is just a placeholder for our
+ // script to write into. Create it to establish a unique name that
+ // we know.
+ NamedTempFile file(".llsd", "");
+
+ python("write Python notation",
+ lambda::_1 <<
+ "from __future__ import with_statement\n" <<
+ import_llsd <<
+ "DATA = [\n"
+ " 17,\n"
+ " 3.14,\n"
+ " '''\\\n"
+ "This string\n"
+ "has several\n"
+ "lines.''',\n"
+ "]\n"
+ // Don't forget raw-string syntax for Windows pathnames.
+ // N.B. Using 'print' implicitly adds newlines.
+ "with open(r'" << file.getName() << "', 'w') as f:\n"
+ " for item in DATA:\n"
+ " print >>f, llsd.format_notation(item)\n");
+
+ std::ifstream inf(file.getName().c_str());
+ LLSD item;
+ // Notice that we're not doing anything special to parse out the
+ // newlines: LLSDSerialize::fromNotation ignores them. While it would
+ // seem they're not strictly necessary, going in this direction, we
+ // want to ensure that notation-separated-by-newlines works in both
+ // directions -- since in practice, a given file might be read by
+ // either language.
+ ensure_equals("Failed to read LLSD::Integer from Python",
+ LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
+ 1);
+ ensure_equals(item.asInteger(), 17);
+ ensure_equals("Failed to read LLSD::Real from Python",
+ LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
+ 1);
+ ensure_approximately_equals("Bad LLSD::Real value from Python",
+ item.asReal(), 3.14, 7); // 7 bits ~= 0.01
+ ensure_equals("Failed to read LLSD::String from Python",
+ LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
+ 1);
+ ensure_equals(item.asString(),
+ "This string\n"
+ "has several\n"
+ "lines.");
+ }
+}
diff --git a/indra/llcommon/tests/setpython.py b/indra/llcommon/tests/setpython.py
new file mode 100644
index 0000000000..df7b90428e
--- /dev/null
+++ b/indra/llcommon/tests/setpython.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+"""\
+@file setpython.py
+@author Nat Goodspeed
+@date 2011-07-13
+@brief Set PYTHON environment variable for tests that care.
+
+$LicenseInfo:firstyear=2011&license=viewerlgpl$
+Copyright (c) 2011, Linden Research, Inc.
+$/LicenseInfo$
+"""
+
+import os
+import sys
+import subprocess
+
+if __name__ == "__main__":
+ os.environ["PYTHON"] = sys.executable
+ sys.exit(subprocess.call(sys.argv[1:]))
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 68e45f36e4..93f3c910bd 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -31,10 +31,12 @@
#include "llcrashlogger.h"
#include "linden_common.h"
#include "llstring.h"
-#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
+#include "indra_constants.h" // CRASH_BEHAVIOR_...
#include "llerror.h"
+#include "llerrorcontrol.h"
#include "lltimer.h"
#include "lldir.h"
+#include "llfile.h"
#include "llsdserialize.h"
#include "lliopipe.h"
#include "llpumpio.h"
@@ -54,7 +56,7 @@ public:
virtual void error(U32 status, const std::string& reason)
{
- gBreak = true;
+ gBreak = true;
}
virtual void result(const LLSD& content)
@@ -64,21 +66,8 @@ public:
}
};
-bool LLCrashLoggerText::mainLoop()
-{
- std::cout << "Entering main loop" << std::endl;
- sendCrashLogs();
- return true;
-}
-
-void LLCrashLoggerText::updateApplication(const std::string& message)
-{
- LLCrashLogger::updateApplication(message);
- std::cout << message << std::endl;
-}
-
LLCrashLogger::LLCrashLogger() :
- mCrashBehavior(CRASH_BEHAVIOR_ASK),
+ mCrashBehavior(CRASH_BEHAVIOR_ALWAYS_SEND),
mCrashInPreviousExec(false),
mCrashSettings("CrashSettings"),
mSentCrashLogs(false),
@@ -281,26 +270,48 @@ LLSD LLCrashLogger::constructPostData()
return mCrashInfo;
}
+const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
+
S32 LLCrashLogger::loadCrashBehaviorSetting()
{
+ // First check user_settings (in the user's home dir)
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
+ if (! mCrashSettings.loadFromFile(filename))
+ {
+ // Next check app_settings (in the SL program dir)
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, CRASH_SETTINGS_FILE);
+ mCrashSettings.loadFromFile(filename);
+ }
- mCrashSettings.loadFromFile(filename);
-
- S32 value = mCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-
- if (value < CRASH_BEHAVIOR_ASK || CRASH_BEHAVIOR_NEVER_SEND < value) return CRASH_BEHAVIOR_ASK;
+ // If we didn't load any files above, this will return the default
+ S32 value = mCrashSettings.getS32("CrashSubmitBehavior");
- return value;
+ // Whatever value we got, make sure it's valid
+ switch (value)
+ {
+ case CRASH_BEHAVIOR_NEVER_SEND:
+ return CRASH_BEHAVIOR_NEVER_SEND;
+ case CRASH_BEHAVIOR_ALWAYS_SEND:
+ return CRASH_BEHAVIOR_ALWAYS_SEND;
+ }
+
+ return CRASH_BEHAVIOR_ASK;
}
bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
{
- if (crash_behavior != CRASH_BEHAVIOR_ASK && crash_behavior != CRASH_BEHAVIOR_ALWAYS_SEND) return false;
+ switch (crash_behavior)
+ {
+ case CRASH_BEHAVIOR_ASK:
+ case CRASH_BEHAVIOR_NEVER_SEND:
+ case CRASH_BEHAVIOR_ALWAYS_SEND:
+ break;
+ default:
+ return false;
+ }
- mCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior);
+ mCrashSettings.setS32("CrashSubmitBehavior", crash_behavior);
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
-
mCrashSettings.saveToFile(filename, FALSE);
return true;
@@ -309,14 +320,13 @@ bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout)
{
gBreak = false;
- std::string status_message;
for(int i = 0; i < retries; ++i)
{
- status_message = llformat("%s, try %d...", msg.c_str(), i+1);
+ updateApplication(llformat("%s, try %d...", msg.c_str(), i+1));
LLHTTPClient::post(host, data, new LLCrashLoggerResponder(), timeout);
while(!gBreak)
{
- updateApplication(status_message);
+ updateApplication(); // No new message, just pump the IO
}
if(gSent)
{
@@ -336,7 +346,7 @@ bool LLCrashLogger::sendCrashLogs()
updateApplication("Sending reports...");
std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
- "SecondLifeCrashReport");
+ "SecondLifeCrashReport");
std::string report_file = dump_path + ".log";
std::ofstream out_file(report_file.c_str());
@@ -365,6 +375,7 @@ void LLCrashLogger::updateApplication(const std::string& message)
{
gServicePump->pump();
gServicePump->callback();
+ if (!message.empty()) llinfos << message << llendl;
}
bool LLCrashLogger::init()
@@ -374,14 +385,27 @@ bool LLCrashLogger::init()
// We assume that all the logs we're looking for reside on the current drive
gDirUtilp->initAppDirs("SecondLife");
+ LLError::initForApplication(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+
// Default to the product name "Second Life" (this is overridden by the -name argument)
mProductName = "Second Life";
+
+ // Rename current log file to ".old"
+ std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log.old");
+ std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log");
+ LLFile::rename(log_file.c_str(), old_log_file.c_str());
+
+ // Set the log file to crashreport.log
+ LLError::logToFile(log_file);
- mCrashSettings.declareS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ASK, "Controls behavior when viewer crashes "
- "(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)");
+ mCrashSettings.declareS32("CrashSubmitBehavior", CRASH_BEHAVIOR_ALWAYS_SEND,
+ "Controls behavior when viewer crashes "
+ "(0 = ask before sending crash report, "
+ "1 = always send crash report, "
+ "2 = never send crash report)");
- llinfos << "Loading crash behavior setting" << llendl;
- mCrashBehavior = loadCrashBehaviorSetting();
+ // llinfos << "Loading crash behavior setting" << llendl;
+ // mCrashBehavior = loadCrashBehaviorSetting();
// If user doesn't want to send, bail out
if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND)
@@ -394,10 +418,11 @@ bool LLCrashLogger::init()
gServicePump->prime(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
- //If we've opened the crash logger, assume we can delete the marker file if it exists
+ //If we've opened the crash logger, assume we can delete the marker file if it exists
if( gDirUtilp )
{
- std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
+ std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
+ "SecondLife.exec_marker");
LLAPRFile::remove( marker_file );
}
diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h
index a5daa74247..5d0cb5931c 100644
--- a/indra/llcrashlogger/llcrashlogger.h
+++ b/indra/llcrashlogger/llcrashlogger.h
@@ -66,15 +66,4 @@ protected:
bool mSentCrashLogs;
};
-class LLCrashLoggerText : public LLCrashLogger
-{
-public:
- LLCrashLoggerText(void) {}
- ~LLCrashLoggerText(void) {}
-
- virtual bool mainLoop();
- virtual void updateApplication(const std::string& message = LLStringUtil::null);
-};
-
-
#endif //LLCRASHLOGGER_H
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index e8cd871157..c95f922301 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -226,6 +226,11 @@ void LLParcel::init(const LLUUID &owner_id,
setPreviousOwnerID(LLUUID::null);
setPreviouslyGroupOwned(FALSE);
+
+ setSeeAVs(TRUE);
+ setAllowGroupAVSounds(TRUE);
+ setAllowAnyAVSounds(TRUE);
+ setHaveNewParcelLimitData(FALSE);
}
void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
@@ -702,7 +707,9 @@ void LLParcel::packMessage(LLSD& msg)
msg["user_location"] = ll_sd_from_vector3(mUserLocation);
msg["user_look_at"] = ll_sd_from_vector3(mUserLookAt);
msg["landing_type"] = (U8)mLandingType;
-
+ msg["see_avs"] = (LLSD::Boolean) getSeeAVs();
+ msg["group_av_sounds"] = (LLSD::Boolean) getAllowGroupAVSounds();
+ msg["any_av_sounds"] = (LLSD::Boolean) getAllowAnyAVSounds();
}
@@ -721,6 +728,24 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MediaURL, buffer );
setMediaURL(buffer);
+ BOOL see_avs = TRUE; // All default to true for legacy server behavior
+ BOOL any_av_sounds = TRUE;
+ BOOL group_av_sounds = TRUE;
+ bool have_new_parcel_limit_data = (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_SeeAVs) > 0); // New version of server should send all 3 of these values
+ have_new_parcel_limit_data &= (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_AnyAVSounds) > 0);
+ have_new_parcel_limit_data &= (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_GroupAVSounds) > 0);
+ if (have_new_parcel_limit_data)
+ {
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_SeeAVs, see_avs);
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_AnyAVSounds, any_av_sounds);
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_GroupAVSounds, group_av_sounds);
+ }
+ setSeeAVs((bool) see_avs);
+ setAllowAnyAVSounds((bool) any_av_sounds);
+ setAllowGroupAVSounds((bool) group_av_sounds);
+
+ setHaveNewParcelLimitData(have_new_parcel_limit_data);
+
// non-optimized version
msg->getU8 ( "ParcelData", "MediaAutoScale", mMediaAutoScale );
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index 4893337967..ff35caab4c 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -75,7 +75,7 @@ const U8 PARCEL_AUCTION = 0x05;
// unused 0x06
// unused 0x07
// flag, unused 0x08
-// flag, unused 0x10
+const U8 PARCEL_HIDDENAVS = 0x10; // avatars not visible outside of parcel. Used for 'see avs' feature, but must be off for compatibility
const U8 PARCEL_SOUND_LOCAL = 0x20;
const U8 PARCEL_WEST_LINE = 0x40; // flag, property line on west edge
const U8 PARCEL_SOUTH_LINE = 0x80; // flag, property line on south edge
@@ -130,6 +130,12 @@ class LLSD;
class LLAccessEntry
{
public:
+ LLAccessEntry()
+ : mID(),
+ mTime(0),
+ mFlags(0)
+ {}
+
LLUUID mID; // Agent ID
S32 mTime; // Time (unix seconds) when entry expires
U32 mFlags; // Not used - currently should always be zero
@@ -265,6 +271,8 @@ public:
void setUserLocation(const LLVector3& pos) { mUserLocation = pos; }
void setUserLookAt(const LLVector3& rot) { mUserLookAt = rot; }
void setLandingType(const ELandingType type) { mLandingType = type; }
+ void setSeeAVs(BOOL see_avs) { mSeeAVs = see_avs; }
+ void setHaveNewParcelLimitData(bool have_new_parcel_data) { mHaveNewParcelLimitData = have_new_parcel_data; } // Remove this once hidden AV feature is fully available grid-wide
void setAuctionID(U32 auction_id) { mAuctionID = auction_id;}
@@ -291,6 +299,8 @@ public:
void setDenyAnonymous(BOOL b) { setParcelFlag(PF_DENY_ANONYMOUS, b); }
void setDenyAgeUnverified(BOOL b) { setParcelFlag(PF_DENY_AGEUNVERIFIED, b); }
void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }
+ void setAllowGroupAVSounds(BOOL b) { mAllowGroupAVSounds = b; }
+ void setAllowAnyAVSounds(BOOL b) { mAllowAnyAVSounds = b; }
void setDrawDistance(F32 dist) { mDrawDistance = dist; }
void setSalePrice(S32 price) { mSalePrice = price; }
@@ -367,6 +377,8 @@ public:
const LLVector3& getUserLocation() const { return mUserLocation; }
const LLVector3& getUserLookAt() const { return mUserLookAt; }
ELandingType getLandingType() const { return mLandingType; }
+ BOOL getSeeAVs() const { return mSeeAVs; }
+ BOOL getHaveNewParcelLimitData() const { return mHaveNewParcelLimitData; }
// User-specified snapshot
const LLUUID& getSnapshotID() const { return mSnapshotID; }
@@ -496,6 +508,9 @@ public:
BOOL getRegionDenyAgeUnverifiedOverride() const
{ return mRegionDenyAgeUnverifiedOverride; }
+ BOOL getAllowGroupAVSounds() const { return mAllowGroupAVSounds; }
+ BOOL getAllowAnyAVSounds() const { return mAllowAnyAVSounds; }
+
F32 getDrawDistance() const { return mDrawDistance; }
S32 getSalePrice() const { return mSalePrice; }
time_t getClaimDate() const { return mClaimDate; }
@@ -606,6 +621,8 @@ protected:
LLVector3 mUserLocation;
LLVector3 mUserLookAt;
ELandingType mLandingType;
+ BOOL mSeeAVs; // Avatars on this parcel are visible from outside it
+ BOOL mHaveNewParcelLimitData; // Remove once hidden AV feature is grid-wide
LLTimer mSaleTimerExpires;
LLTimer mMediaResetTimer;
@@ -661,6 +678,8 @@ protected:
BOOL mRegionPushOverride;
BOOL mRegionDenyAnonymousOverride;
BOOL mRegionDenyAgeUnverifiedOverride;
+ BOOL mAllowGroupAVSounds;
+ BOOL mAllowAnyAVSounds;
ParcelQuota mQuota;
diff --git a/indra/llinventory/llparcelflags.h b/indra/llinventory/llparcelflags.h
index a61130132a..b1a917df73 100644
--- a/indra/llinventory/llparcelflags.h
+++ b/indra/llinventory/llparcelflags.h
@@ -126,5 +126,7 @@ const S32 PARCEL_DETAILS_DESC = 1;
const S32 PARCEL_DETAILS_OWNER = 2;
const S32 PARCEL_DETAILS_GROUP = 3;
const S32 PARCEL_DETAILS_AREA = 4;
+const S32 PARCEL_DETAILS_ID = 5;
+const S32 PARCEL_DETAILS_SEE_AVATARS = 6;
#endif
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index 9dadad7dd3..cd100cdf9f 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -12,6 +12,8 @@ include_directories(
set(llmath_SOURCE_FILES
llbbox.cpp
llbboxlocal.cpp
+ llcalc.cpp
+ llcalcparser.cpp
llcamera.cpp
llcoordframe.cpp
llline.cpp
@@ -46,6 +48,8 @@ set(llmath_HEADER_FILES
coordframe.h
llbbox.h
llbboxlocal.h
+ llcalc.h
+ llcalcparser.h
llcamera.h
llcoord.h
llcoordframe.h
diff --git a/indra/llmath/llcalc.cpp b/indra/llmath/llcalc.cpp
new file mode 100644
index 0000000000..597d0815fb
--- /dev/null
+++ b/indra/llmath/llcalc.cpp
@@ -0,0 +1,145 @@
+/*
+ * LLCalc.cpp
+ * SecondLife
+ *
+ * Created by Aimee Walton on 28/09/2008.
+ * Copyright 2008 Aimee Walton.
+ *
+ */
+
+#include "linden_common.h"
+
+#include "llcalc.h"
+
+#include "llcalcparser.h"
+#include "llmath.h"
+
+
+// Variable names for use in the build floater
+const char* LLCalc::X_POS = "PX";
+const char* LLCalc::Y_POS = "PY";
+const char* LLCalc::Z_POS = "PZ";
+const char* LLCalc::X_SCALE = "SX";
+const char* LLCalc::Y_SCALE = "SY";
+const char* LLCalc::Z_SCALE = "SZ";
+const char* LLCalc::X_ROT = "RX";
+const char* LLCalc::Y_ROT = "RY";
+const char* LLCalc::Z_ROT = "RZ";
+const char* LLCalc::HOLLOW = "HLW";
+const char* LLCalc::CUT_BEGIN = "CB";
+const char* LLCalc::CUT_END = "CE";
+const char* LLCalc::PATH_BEGIN = "PB";
+const char* LLCalc::PATH_END = "PE";
+const char* LLCalc::TWIST_BEGIN = "TB";
+const char* LLCalc::TWIST_END = "TE";
+const char* LLCalc::X_SHEAR = "SHX";
+const char* LLCalc::Y_SHEAR = "SHY";
+const char* LLCalc::X_TAPER = "TPX";
+const char* LLCalc::Y_TAPER = "TPY";
+const char* LLCalc::RADIUS_OFFSET = "ROF";
+const char* LLCalc::REVOLUTIONS = "REV";
+const char* LLCalc::SKEW = "SKW";
+const char* LLCalc::X_HOLE = "HLX";
+const char* LLCalc::Y_HOLE = "HLY";
+const char* LLCalc::TEX_U_SCALE = "TSU";
+const char* LLCalc::TEX_V_SCALE = "TSV";
+const char* LLCalc::TEX_U_OFFSET = "TOU";
+const char* LLCalc::TEX_V_OFFSET = "TOV";
+const char* LLCalc::TEX_ROTATION = "TROT";
+const char* LLCalc::TEX_TRANSPARENCY = "TRNS";
+const char* LLCalc::TEX_GLOW = "GLOW";
+
+
+LLCalc* LLCalc::sInstance = NULL;
+
+LLCalc::LLCalc() : mLastErrorPos(0)
+{
+ // Init table of constants
+ mConstants["PI"] = F_PI;
+ mConstants["TWO_PI"] = F_TWO_PI;
+ mConstants["PI_BY_TWO"] = F_PI_BY_TWO;
+ mConstants["SQRT_TWO_PI"] = F_SQRT_TWO_PI;
+ mConstants["SQRT2"] = F_SQRT2;
+ mConstants["SQRT3"] = F_SQRT3;
+ mConstants["DEG_TO_RAD"] = DEG_TO_RAD;
+ mConstants["RAD_TO_DEG"] = RAD_TO_DEG;
+ mConstants["GRAVITY"] = GRAVITY;
+}
+
+LLCalc::~LLCalc()
+{
+}
+
+//static
+void LLCalc::cleanUp()
+{
+ delete sInstance;
+ sInstance = NULL;
+}
+
+//static
+LLCalc* LLCalc::getInstance()
+{
+ if (!sInstance) sInstance = new LLCalc();
+ return sInstance;
+}
+
+void LLCalc::setVar(const std::string& name, const F32& value)
+{
+ mVariables[name] = value;
+}
+
+void LLCalc::clearVar(const std::string& name)
+{
+ mVariables.erase(name);
+}
+
+void LLCalc::clearAllVariables()
+{
+ mVariables.clear();
+}
+
+/*
+void LLCalc::updateVariables(LLSD& vars)
+{
+ LLSD::map_iterator cIt = vars.beginMap();
+ for(; cIt != vars.endMap(); cIt++)
+ {
+ setVar(cIt->first, (F32)(LLSD::Real)cIt->second);
+ }
+}
+*/
+
+bool LLCalc::evalString(const std::string& expression, F32& result)
+{
+ std::string expr_upper = expression;
+ LLStringUtil::toUpper(expr_upper);
+
+ LLCalcParser calc(result, &mConstants, &mVariables);
+
+ mLastErrorPos = 0;
+ std::string::iterator start = expr_upper.begin();
+ parse_info<std::string::iterator> info;
+
+ try
+ {
+ info = parse(start, expr_upper.end(), calc, space_p);
+ lldebugs << "Math expression: " << expression << " = " << result << llendl;
+ }
+ catch(parser_error<std::string, std::string::iterator> &e)
+ {
+ mLastErrorPos = e.where - expr_upper.begin();
+
+ llinfos << "Calc parser exception: " << e.descriptor << " at " << mLastErrorPos << " in expression: " << expression << llendl;
+ return false;
+ }
+
+ if (!info.full)
+ {
+ mLastErrorPos = info.stop - expr_upper.begin();
+ llinfos << "Unhandled syntax error at " << mLastErrorPos << " in expression: " << expression << llendl;
+ return false;
+ }
+
+ return true;
+}
diff --git a/indra/llmath/llcalc.h b/indra/llmath/llcalc.h
new file mode 100644
index 0000000000..cc31950cb6
--- /dev/null
+++ b/indra/llmath/llcalc.h
@@ -0,0 +1,83 @@
+/*
+ * LLCalc.h
+ * SecondLife
+ *
+ * Created by Aimee Walton on 28/09/2008.
+ * Copyright 2008 Aimee Walton.
+ *
+ */
+
+#ifndef LL_CALC_H
+#define LL_CALC_H
+
+#include <map>
+#include <string>
+
+class LLCalc
+{
+public:
+ LLCalc();
+ ~LLCalc();
+
+ // Variable name constants
+ static const char* X_POS;
+ static const char* Y_POS;
+ static const char* Z_POS;
+ static const char* X_SCALE;
+ static const char* Y_SCALE;
+ static const char* Z_SCALE;
+ static const char* X_ROT;
+ static const char* Y_ROT;
+ static const char* Z_ROT;
+ static const char* HOLLOW;
+ static const char* CUT_BEGIN;
+ static const char* CUT_END;
+ static const char* PATH_BEGIN;
+ static const char* PATH_END;
+ static const char* TWIST_BEGIN;
+ static const char* TWIST_END;
+ static const char* X_SHEAR;
+ static const char* Y_SHEAR;
+ static const char* X_TAPER;
+ static const char* Y_TAPER;
+ static const char* RADIUS_OFFSET;
+ static const char* REVOLUTIONS;
+ static const char* SKEW;
+ static const char* X_HOLE;
+ static const char* Y_HOLE;
+ static const char* TEX_U_SCALE;
+ static const char* TEX_V_SCALE;
+ static const char* TEX_U_OFFSET;
+ static const char* TEX_V_OFFSET;
+ static const char* TEX_ROTATION;
+ static const char* TEX_TRANSPARENCY;
+ static const char* TEX_GLOW;
+
+ void setVar(const std::string& name, const F32& value);
+ void clearVar(const std::string& name);
+ void clearAllVariables();
+// void updateVariables(LLSD& vars);
+
+ bool evalString(const std::string& expression, F32& result);
+ std::string::size_type getLastErrorPos() { return mLastErrorPos; }
+
+ static LLCalc* getInstance();
+ static void cleanUp();
+
+ typedef std::map<std::string, F32> calc_map_t;
+
+private:
+ std::string::size_type mLastErrorPos;
+
+ calc_map_t mConstants;
+ calc_map_t mVariables;
+
+ // *TODO: Add support for storing user defined variables, and stored functions.
+ // Will need UI work, and a means to save them between sessions.
+// calc_map_t mUserVariables;
+
+ // "There shall be only one"
+ static LLCalc* sInstance;
+};
+
+#endif // LL_CALC_H
diff --git a/indra/llmath/llcalcparser.cpp b/indra/llmath/llcalcparser.cpp
new file mode 100644
index 0000000000..fd55376fa9
--- /dev/null
+++ b/indra/llmath/llcalcparser.cpp
@@ -0,0 +1,46 @@
+/*
+ * LLCalcParser.cpp
+ * SecondLife
+ *
+ * Created by Aimee Walton on 28/09/2008.
+ * Copyright 2008 Aimee Walton.
+ *
+ */
+
+#include "linden_common.h"
+
+#include "llcalcparser.h"
+using namespace boost::spirit::classic;
+
+F32 LLCalcParser::lookup(const std::string::iterator& start, const std::string::iterator& end) const
+{
+ LLCalc::calc_map_t::iterator iter;
+
+ std::string name(start, end);
+
+ if (mConstants)
+ {
+ iter = mConstants->find(name);
+ if (iter != mConstants->end())
+ {
+ return (*iter).second;
+ }
+ }
+ else
+ {
+ // This should never happen!
+ throw_(end, std::string("Missing constants table"));
+ }
+
+ if (mVariables)
+ {
+ iter = mVariables->find(name);
+ if (iter != mVariables->end())
+ {
+ return (*iter).second;
+ }
+ }
+
+ throw_(end, std::string("Unknown symbol " + name));
+ return 0.f;
+}
diff --git a/indra/llmath/llcalcparser.h b/indra/llmath/llcalcparser.h
new file mode 100644
index 0000000000..600e173661
--- /dev/null
+++ b/indra/llmath/llcalcparser.h
@@ -0,0 +1,174 @@
+/*
+ * LLCalcParser.h
+ * SecondLife
+ *
+ * Created by Aimee Walton on 28/09/2008.
+ * Copyright 2008 Aimee Walton.
+ *
+ */
+
+#ifndef LL_CALCPARSER_H
+#define LL_CALCPARSER_H
+
+#include <boost/spirit/include/classic_attribute.hpp>
+#include <boost/spirit/include/classic_core.hpp>
+#include <boost/spirit/include/classic_error_handling.hpp>
+#include <boost/spirit/include/classic_position_iterator.hpp>
+#include <boost/spirit/include/phoenix1_binders.hpp>
+#include <boost/spirit/include/classic_symbols.hpp>
+using namespace boost::spirit::classic;
+
+#include "llcalc.h"
+#include "llmath.h"
+
+struct LLCalcParser : grammar<LLCalcParser>
+{
+ LLCalcParser(F32& result, LLCalc::calc_map_t* constants, LLCalc::calc_map_t* vars) :
+ mResult(result), mConstants(constants), mVariables(vars) {};
+
+ struct value_closure : closure<value_closure, F32>
+ {
+ member1 value;
+ };
+
+ template <typename ScannerT>
+ struct definition
+ {
+ // Rule declarations
+ rule<ScannerT> statement, identifier;
+ rule<ScannerT, value_closure::context_t> expression, term,
+ power,
+ unary_expr,
+ factor,
+ unary_func,
+ binary_func,
+ group;
+
+ // start() should return the starting symbol
+ rule<ScannerT> const& start() const { return statement; }
+
+ definition(LLCalcParser const& self)
+ {
+ using namespace phoenix;
+
+ assertion<std::string> assert_domain("Domain error");
+// assertion<std::string> assert_symbol("Unknown symbol");
+ assertion<std::string> assert_syntax("Syntax error");
+
+ identifier =
+ lexeme_d[(alpha_p | '_') >> *(alnum_p | '_')]
+ ;
+
+ group =
+ '(' >> expression[group.value = arg1] >> assert_syntax(ch_p(')'))
+ ;
+
+ unary_func =
+ ((str_p("SIN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_sin)(self,arg1)]) |
+ (str_p("COS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_cos)(self,arg1)]) |
+ (str_p("TAN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_tan)(self,arg1)]) |
+ (str_p("ASIN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_asin)(self,arg1)]) |
+ (str_p("ACOS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_acos)(self,arg1)]) |
+ (str_p("ATAN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_atan)(self,arg1)]) |
+ (str_p("SQRT") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_sqrt)(self,arg1)]) |
+ (str_p("LOG") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_log)(self,arg1)]) |
+ (str_p("EXP") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_exp)(self,arg1)]) |
+ (str_p("ABS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_fabs)(self,arg1)]) |
+ (str_p("FLR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_floor)(self,arg1)]) |
+ (str_p("CEIL") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_ceil)(self,arg1)])
+ ) >> assert_syntax(ch_p(')'))
+ ;
+
+ binary_func =
+ ((str_p("ATAN2") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_atan2)(self, binary_func.value, arg1)]) |
+ (str_p("MIN") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_min)(self, binary_func.value, arg1)]) |
+ (str_p("MAX") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_max)(self, binary_func.value, arg1)])
+ ) >> assert_syntax(ch_p(')'))
+ ;
+
+ // *TODO: Localisation of the decimal point?
+ // Problem, LLLineEditor::postvalidateFloat accepts a comma when appropriate
+ // for the current locale. However to do that here could clash with using
+ // the comma as a separator when passing arguments to functions.
+ factor =
+ (ureal_p[factor.value = arg1] |
+ group[factor.value = arg1] |
+ unary_func[factor.value = arg1] |
+ binary_func[factor.value = arg1] |
+ // Lookup throws an Unknown Symbol error if it is unknown, while this works fine,
+ // would be "neater" to handle symbol lookup from here with an assertive parser.
+// constants_p[factor.value = arg1]|
+ identifier[factor.value = bind(&LLCalcParser::lookup)(self, arg1, arg2)]
+ ) >>
+ // Detect and throw math errors.
+ assert_domain(eps_p(bind(&LLCalcParser::checkNaN)(self, factor.value)))
+ ;
+
+ unary_expr =
+ !ch_p('+') >> factor[unary_expr.value = arg1] |
+ '-' >> factor[unary_expr.value = -arg1]
+ ;
+
+ power =
+ unary_expr[power.value = arg1] >>
+ *('^' >> assert_syntax(unary_expr[power.value = bind(&powf)(power.value, arg1)]))
+ ;
+
+ term =
+ power[term.value = arg1] >>
+ *(('*' >> assert_syntax(power[term.value *= arg1])) |
+ ('/' >> assert_syntax(power[term.value /= arg1])) |
+ ('%' >> assert_syntax(power[term.value = bind(&fmodf)(term.value, arg1)]))
+ )
+ ;
+
+ expression =
+ assert_syntax(term[expression.value = arg1]) >>
+ *(('+' >> assert_syntax(term[expression.value += arg1])) |
+ ('-' >> assert_syntax(term[expression.value -= arg1]))
+ )
+ ;
+
+ statement =
+ !ch_p('=') >> ( expression )[var(self.mResult) = arg1] >> (end_p)
+ ;
+ }
+ };
+
+private:
+ // Member functions for semantic actions
+ F32 lookup(const std::string::iterator&, const std::string::iterator&) const;
+ F32 _min(const F32& a, const F32& b) const { return llmin(a, b); }
+ F32 _max(const F32& a, const F32& b) const { return llmax(a, b); }
+
+ bool checkNaN(const F32& a) const { return !llisnan(a); }
+
+ //FIX* non ambigious function fix making SIN() work for calc -Cryogenic Blitz
+ F32 _sin(const F32& a) const { return sin(DEG_TO_RAD * a); }
+ F32 _cos(const F32& a) const { return cos(DEG_TO_RAD * a); }
+ F32 _tan(const F32& a) const { return tan(DEG_TO_RAD * a); }
+ F32 _asin(const F32& a) const { return asin(a * RAD_TO_DEG); }
+ F32 _acos(const F32& a) const { return acos(a * RAD_TO_DEG); }
+ F32 _atan(const F32& a) const { return atan(a * RAD_TO_DEG); }
+ F32 _sqrt(const F32& a) const { return sqrt(a); }
+ F32 _log(const F32& a) const { return log(a); }
+ F32 _exp(const F32& a) const { return exp(a); }
+ F32 _fabs(const F32& a) const { return fabs(a); }
+ F32 _floor(const F32& a) const { return llfloor(a); }
+ F32 _ceil(const F32& a) const { return llceil(a); }
+
+ F32 _atan2(const F32& a,const F32& b) const { return atan2(a,b); }
+
+
+
+ LLCalc::calc_map_t* mConstants;
+ LLCalc::calc_map_t* mVariables;
+// LLCalc::calc_map_t* mUserVariables;
+
+ F32& mResult;
+};
+
+#endif // LL_CALCPARSER_H
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 8c81f27784..21cc9b22f2 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -2500,37 +2500,43 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
{
U16* n = (U16*) &(norm[0]);
- for (U32 j = 0; j < num_verts; ++j)
+ if(n)
{
- norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]);
- norm_out->div(65535.f);
- norm_out->mul(2.f);
- norm_out->sub(1.f);
- norm_out++;
- n += 3;
+ for (U32 j = 0; j < num_verts; ++j)
+ {
+ norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]);
+ norm_out->div(65535.f);
+ norm_out->mul(2.f);
+ norm_out->sub(1.f);
+ norm_out++;
+ n += 3;
+ }
}
}
{
U16* t = (U16*) &(tc[0]);
- for (U32 j = 0; j < num_verts; j+=2)
+ if(t)
{
- if (j < num_verts-1)
+ for (U32 j = 0; j < num_verts; j+=2)
{
- tc_out->set((F32) t[0], (F32) t[1], (F32) t[2], (F32) t[3]);
- }
- else
- {
- tc_out->set((F32) t[0], (F32) t[1], 0.f, 0.f);
- }
+ if (j < num_verts-1)
+ {
+ tc_out->set((F32) t[0], (F32) t[1], (F32) t[2], (F32) t[3]);
+ }
+ else
+ {
+ tc_out->set((F32) t[0], (F32) t[1], 0.f, 0.f);
+ }
- t += 4;
+ t += 4;
- tc_out->div(65535.f);
- tc_out->mul(tc_range);
- tc_out->add(min_tc4);
+ tc_out->div(65535.f);
+ tc_out->mul(tc_range);
+ tc_out->add(min_tc4);
- tc_out++;
+ tc_out++;
+ }
}
}
@@ -3253,7 +3259,7 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
{
F32 area = sculptGetSurfaceArea();
- const F32 SCULPT_MAX_AREA = 32.f;
+ const F32 SCULPT_MAX_AREA = 384.f;
if (area < SCULPT_MIN_AREA || area > SCULPT_MAX_AREA)
{
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 7c8b7e3584..0735842dcd 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -579,11 +579,18 @@ void LLCurl::Easy::prepRequest(const std::string& url,
////////////////////////////////////////////////////////////////////////////
-class LLCurl::Multi
+class LLCurl::Multi : public LLThread
{
LOG_CLASS(Multi);
public:
-
+
+ typedef enum
+ {
+ PERFORM_STATE_READY=0,
+ PERFORM_STATE_PERFORMING=1,
+ PERFORM_STATE_COMPLETED=2
+ } ePerformState;
+
Multi();
~Multi();
@@ -593,13 +600,20 @@ public:
void removeEasy(Easy* easy);
S32 process();
- S32 perform();
+ void perform();
+ virtual void run();
+
CURLMsg* info_read(S32* msgs_in_queue);
S32 mQueued;
S32 mErrorCount;
+ S32 mPerformState;
+
+ LLCondition* mSignal;
+ bool mQuitting;
+
private:
void easyFree(Easy*);
@@ -614,9 +628,14 @@ private:
};
LLCurl::Multi::Multi()
- : mQueued(0),
- mErrorCount(0)
+ : LLThread("Curl Multi"),
+ mQueued(0),
+ mErrorCount(0),
+ mPerformState(PERFORM_STATE_READY)
{
+ mQuitting = false;
+ mSignal = new LLCondition(NULL);
+
mCurlMultiHandle = curl_multi_init();
if (!mCurlMultiHandle)
{
@@ -630,6 +649,11 @@ LLCurl::Multi::Multi()
LLCurl::Multi::~Multi()
{
+ llassert(isStopped());
+
+ delete mSignal;
+ mSignal = NULL;
+
// Clean up active
for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
iter != mEasyActiveList.end(); ++iter)
@@ -655,30 +679,50 @@ CURLMsg* LLCurl::Multi::info_read(S32* msgs_in_queue)
return curlmsg;
}
+void LLCurl::Multi::perform()
+{
+ if (mPerformState == PERFORM_STATE_READY)
+ {
+ mSignal->signal();
+ }
+}
-S32 LLCurl::Multi::perform()
+void LLCurl::Multi::run()
{
- S32 q = 0;
- for (S32 call_count = 0;
- call_count < MULTI_PERFORM_CALL_REPEAT;
- call_count += 1)
+ while (!mQuitting)
{
- CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
- if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
+ mSignal->wait();
+ mPerformState = PERFORM_STATE_PERFORMING;
+ if (!mQuitting)
{
- check_curl_multi_code(code);
- break;
- }
+ S32 q = 0;
+ for (S32 call_count = 0;
+ call_count < MULTI_PERFORM_CALL_REPEAT;
+ call_count += 1)
+ {
+ CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
+ if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
+ {
+ check_curl_multi_code(code);
+ break;
+ }
+ }
+ mQueued = q;
+ mPerformState = PERFORM_STATE_COMPLETED;
+ }
}
- mQueued = q;
- return q;
}
S32 LLCurl::Multi::process()
{
perform();
-
+
+ if (mPerformState != PERFORM_STATE_COMPLETED)
+ {
+ return 0;
+ }
+
CURLMsg* msg;
int msgs_in_queue;
@@ -709,6 +753,8 @@ S32 LLCurl::Multi::process()
}
}
}
+
+ mPerformState = PERFORM_STATE_READY;
return processed;
}
@@ -787,6 +833,18 @@ LLCurlRequest::LLCurlRequest() :
LLCurlRequest::~LLCurlRequest()
{
llassert_always(mThreadID == LLThread::currentID());
+
+ //stop all Multi handle background threads
+ for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ++iter)
+ {
+ LLCurl::Multi* multi = *iter;
+ multi->mQuitting = true;
+ while (!multi->isStopped())
+ {
+ multi->mSignal->signal();
+ apr_sleep(1000);
+ }
+ }
for_each(mMultiSet.begin(), mMultiSet.end(), DeletePointer());
}
@@ -794,6 +852,7 @@ void LLCurlRequest::addMulti()
{
llassert_always(mThreadID == LLThread::currentID());
LLCurl::Multi* multi = new LLCurl::Multi();
+ multi->start();
mMultiSet.insert(multi);
mActiveMulti = multi;
mActiveRequestCount = 0;
@@ -923,6 +982,13 @@ S32 LLCurlRequest::process()
if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0)
{
mMultiSet.erase(curiter);
+ multi->mQuitting = true;
+ while (!multi->isStopped())
+ {
+ multi->mSignal->signal();
+ apr_sleep(1000);
+ }
+
delete multi;
}
}
@@ -953,6 +1019,7 @@ LLCurlEasyRequest::LLCurlEasyRequest()
mResultReturned(false)
{
mMulti = new LLCurl::Multi();
+ mMulti->start();
mEasy = mMulti->allocEasy();
if (mEasy)
{
@@ -963,6 +1030,12 @@ LLCurlEasyRequest::LLCurlEasyRequest()
LLCurlEasyRequest::~LLCurlEasyRequest()
{
+ mMulti->mQuitting = true;
+ while (!mMulti->isStopped())
+ {
+ mMulti->mSignal->signal();
+ apr_sleep(1000);
+ }
delete mMulti;
}
@@ -1059,14 +1132,20 @@ void LLCurlEasyRequest::requestComplete()
}
}
-S32 LLCurlEasyRequest::perform()
+void LLCurlEasyRequest::perform()
{
- return mMulti->perform();
+ mMulti->perform();
}
// Usage: Call getRestult until it returns false (no more messages)
bool LLCurlEasyRequest::getResult(CURLcode* result, LLCurl::TransferInfo* info)
{
+ if (mMulti->mPerformState != LLCurl::Multi::PERFORM_STATE_COMPLETED)
+ { //we're busy, try again later
+ return false;
+ }
+ mMulti->mPerformState = LLCurl::Multi::PERFORM_STATE_READY;
+
if (!mEasy)
{
// Special case - we failed to initialize a curl_easy (can happen if too many open files)
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index 4ce3fa1078..2f951d6ab8 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -236,7 +236,7 @@ public:
void slist_append(const char* str);
void sendRequest(const std::string& url);
void requestComplete();
- S32 perform();
+ void perform();
bool getResult(CURLcode* result, LLCurl::TransferInfo* info = NULL);
std::string getErrorString();
diff --git a/indra/llmessage/llfiltersd2xmlrpc.cpp b/indra/llmessage/llfiltersd2xmlrpc.cpp
index 812ef7c151..e0ca056a5f 100644
--- a/indra/llmessage/llfiltersd2xmlrpc.cpp
+++ b/indra/llmessage/llfiltersd2xmlrpc.cpp
@@ -308,6 +308,7 @@ LLFilterSD2XMLRPCResponse::~LLFilterSD2XMLRPCResponse()
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SD2XMLRPC_RESPONSE("SD2XMLRPC Response");
// virtual
LLIOPipe::EStatus LLFilterSD2XMLRPCResponse::process_impl(
const LLChannelDescriptors& channels,
@@ -316,6 +317,8 @@ LLIOPipe::EStatus LLFilterSD2XMLRPCResponse::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SD2XMLRPC_RESPONSE);
+
PUMP_DEBUG;
// This pipe does not work if it does not have everyting. This
// could be addressed by making a stream parser for llsd which
@@ -382,6 +385,8 @@ LLFilterSD2XMLRPCRequest::~LLFilterSD2XMLRPCRequest()
{
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SD2XMLRPC_REQUEST("S22XMLRPC Request");
+
// virtual
LLIOPipe::EStatus LLFilterSD2XMLRPCRequest::process_impl(
const LLChannelDescriptors& channels,
@@ -390,6 +395,7 @@ LLIOPipe::EStatus LLFilterSD2XMLRPCRequest::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SD2XMLRPC_REQUEST);
// This pipe does not work if it does not have everyting. This
// could be addressed by making a stream parser for llsd which
// handled partial information.
@@ -586,6 +592,8 @@ LLFilterXMLRPCResponse2LLSD::~LLFilterXMLRPCResponse2LLSD()
{
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_XMLRPC2LLSD_RESPONSE("XMLRPC2LLSD Response");
+
LLIOPipe::EStatus LLFilterXMLRPCResponse2LLSD::process_impl(
const LLChannelDescriptors& channels,
buffer_ptr_t& buffer,
@@ -593,6 +601,8 @@ LLIOPipe::EStatus LLFilterXMLRPCResponse2LLSD::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_XMLRPC2LLSD_RESPONSE);
+
PUMP_DEBUG;
if(!eos) return STATUS_BREAK;
if(!buffer) return STATUS_ERROR;
@@ -668,6 +678,7 @@ LLFilterXMLRPCRequest2LLSD::~LLFilterXMLRPCRequest2LLSD()
{
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_XMLRPC2LLSD_REQUEST("XMLRPC2LLSD Request");
LLIOPipe::EStatus LLFilterXMLRPCRequest2LLSD::process_impl(
const LLChannelDescriptors& channels,
buffer_ptr_t& buffer,
@@ -675,6 +686,7 @@ LLIOPipe::EStatus LLFilterXMLRPCRequest2LLSD::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_XMLRPC2LLSD_REQUEST);
PUMP_DEBUG;
if(!eos) return STATUS_BREAK;
if(!buffer) return STATUS_ERROR;
diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp
index 3b18a9177c..73e8a69085 100644
--- a/indra/llmessage/lliohttpserver.cpp
+++ b/indra/llmessage/lliohttpserver.cpp
@@ -140,6 +140,7 @@ private:
LLSD mHeaders;
};
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_PIPE("HTTP Pipe");
LLIOPipe::EStatus LLHTTPPipe::process_impl(
const LLChannelDescriptors& channels,
buffer_ptr_t& buffer,
@@ -147,6 +148,7 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_HTTP_PIPE);
PUMP_DEBUG;
lldebugs << "LLSDHTTPServer::process_impl" << llendl;
@@ -428,6 +430,9 @@ protected:
/**
* LLHTTPResponseHeader
*/
+
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_HEADER("HTTP Header");
+
// virtual
LLIOPipe::EStatus LLHTTPResponseHeader::process_impl(
const LLChannelDescriptors& channels,
@@ -436,6 +441,7 @@ LLIOPipe::EStatus LLHTTPResponseHeader::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_HTTP_HEADER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
if(eos)
@@ -630,6 +636,8 @@ void LLHTTPResponder::markBad(
<< "</body>\n</html>\n";
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_RESPONDER("HTTP Responder");
+
// virtual
LLIOPipe::EStatus LLHTTPResponder::process_impl(
const LLChannelDescriptors& channels,
@@ -638,6 +646,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_HTTP_RESPONDER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
LLIOPipe::EStatus status = STATUS_OK;
diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp
index 8c752fbe30..b717e321bf 100644
--- a/indra/llmessage/lliosocket.cpp
+++ b/indra/llmessage/lliosocket.cpp
@@ -301,6 +301,8 @@ LLIOSocketReader::~LLIOSocketReader()
//lldebugs << "Destroying LLIOSocketReader" << llendl;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SOCKET_READER("Socket Reader");
+
// virtual
LLIOPipe::EStatus LLIOSocketReader::process_impl(
const LLChannelDescriptors& channels,
@@ -309,6 +311,7 @@ LLIOPipe::EStatus LLIOSocketReader::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SOCKET_READER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_TCP);
if(!mSource) return STATUS_PRECONDITION_NOT_MET;
@@ -401,6 +404,7 @@ LLIOSocketWriter::~LLIOSocketWriter()
//lldebugs << "Destroying LLIOSocketWriter" << llendl;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SOCKET_WRITER("Socket Writer");
// virtual
LLIOPipe::EStatus LLIOSocketWriter::process_impl(
const LLChannelDescriptors& channels,
@@ -409,6 +413,7 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SOCKET_WRITER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_TCP);
if(!mDestination) return STATUS_PRECONDITION_NOT_MET;
@@ -555,6 +560,7 @@ void LLIOServerSocket::setResponseTimeout(F32 timeout_secs)
mResponseTimeout = timeout_secs;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SERVER_SOCKET("Server Socket");
// virtual
LLIOPipe::EStatus LLIOServerSocket::process_impl(
const LLChannelDescriptors& channels,
@@ -563,6 +569,7 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SERVER_SOCKET);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_TCP);
if(!pump)
diff --git a/indra/llmessage/llioutil.cpp b/indra/llmessage/llioutil.cpp
index 2e6ee59ff2..8c50fd5069 100644
--- a/indra/llmessage/llioutil.cpp
+++ b/indra/llmessage/llioutil.cpp
@@ -43,6 +43,8 @@ LLIOPipe::EStatus LLIOFlush::process_impl(
return STATUS_OK;
}
+
+static LLFastTimer::DeclareTimer FTM_PROCESS_SLEEP("IO Sleep");
/**
* @class LLIOSleep
*/
@@ -53,6 +55,7 @@ LLIOPipe::EStatus LLIOSleep::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SLEEP);
if(mSeconds > 0.0)
{
if(pump) pump->sleepChain(mSeconds);
@@ -62,6 +65,7 @@ LLIOPipe::EStatus LLIOSleep::process_impl(
return STATUS_DONE;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_ADD_CHAIN("Add Chain");
/**
* @class LLIOAddChain
*/
@@ -72,6 +76,7 @@ LLIOPipe::EStatus LLIOAddChain::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_ADD_CHAIN);
pump->addChain(mChain, mTimeout);
return STATUS_DONE;
}
diff --git a/indra/llmessage/llsdrpcclient.cpp b/indra/llmessage/llsdrpcclient.cpp
index 86fe5c7912..91fd070f07 100644
--- a/indra/llmessage/llsdrpcclient.cpp
+++ b/indra/llmessage/llsdrpcclient.cpp
@@ -82,6 +82,8 @@ bool LLSDRPCResponse::extractResponse(const LLSD& sd)
return rv;
}
+static LLFastTimer::DeclareTimer FTM_SDRPC_RESPONSE("SDRPC Response");
+
// virtual
LLIOPipe::EStatus LLSDRPCResponse::process_impl(
const LLChannelDescriptors& channels,
@@ -90,6 +92,7 @@ LLIOPipe::EStatus LLSDRPCResponse::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_SDRPC_RESPONSE);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
if(mIsError)
@@ -178,6 +181,8 @@ bool LLSDRPCClient::call(
return true;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SDRPC_CLIENT("SDRPC Client");
+
// virtual
LLIOPipe::EStatus LLSDRPCClient::process_impl(
const LLChannelDescriptors& channels,
@@ -186,6 +191,7 @@ LLIOPipe::EStatus LLSDRPCClient::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SDRPC_CLIENT);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
if((STATE_NONE == mState) || (!pump))
diff --git a/indra/llmessage/llsdrpcserver.cpp b/indra/llmessage/llsdrpcserver.cpp
index f87c418fb1..9f776aca72 100644
--- a/indra/llmessage/llsdrpcserver.cpp
+++ b/indra/llmessage/llsdrpcserver.cpp
@@ -97,6 +97,8 @@ void LLSDRPCServer::clearLock()
}
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SDRPC_SERVER("SDRPC Server");
+
// virtual
LLIOPipe::EStatus LLSDRPCServer::process_impl(
const LLChannelDescriptors& channels,
@@ -105,6 +107,7 @@ LLIOPipe::EStatus LLSDRPCServer::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SDRPC_SERVER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
// lldebugs << "LLSDRPCServer::process_impl" << llendl;
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index 28bd09fc4c..e8e35d00a2 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -270,6 +270,8 @@ LLIOPipe::EStatus LLURLRequest::handleError(
return status;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST("URL Request");
+
// virtual
LLIOPipe::EStatus LLURLRequest::process_impl(
const LLChannelDescriptors& channels,
@@ -278,6 +280,7 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_URL_REQUEST);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
//llinfos << "LLURLRequest::process_impl()" << llendl;
@@ -288,6 +291,8 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
const S32 MIN_ACCUMULATION = 100000;
if(pump && (mDetail->mByteAccumulator > MIN_ACCUMULATION))
{
+ static LLFastTimer::DeclareTimer FTM_URL_ADJUST_TIMEOUT("Adjust Timeout");
+ LLFastTimer t(FTM_URL_ADJUST_TIMEOUT);
// This is a pretty sloppy calculation, but this
// tries to make the gross assumption that if data
// is coming in at 56kb/s, then this transfer will
@@ -335,16 +340,30 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
{
PUMP_DEBUG;
LLIOPipe::EStatus status = STATUS_BREAK;
- mDetail->mCurlRequest->perform();
+ static LLFastTimer::DeclareTimer FTM_URL_PERFORM("Perform");
+ {
+ LLFastTimer t(FTM_URL_PERFORM);
+ mDetail->mCurlRequest->perform();
+ }
+
while(1)
{
CURLcode result;
- bool newmsg = mDetail->mCurlRequest->getResult(&result);
+
+ static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST_GET_RESULT("Get Result");
+
+ bool newmsg = false;
+ {
+ LLFastTimer t(FTM_PROCESS_URL_REQUEST_GET_RESULT);
+ newmsg = mDetail->mCurlRequest->getResult(&result);
+ }
+
if(!newmsg)
{
// keep processing
break;
}
+
mState = STATE_HAVE_RESPONSE;
context[CONTEXT_REQUEST][CONTEXT_TRANSFERED_BYTES] = mRequestTransferedBytes;
@@ -370,7 +389,11 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
link.mChannels = LLBufferArray::makeChannelConsumer(
channels);
chain.push_back(link);
- pump->respond(chain, buffer, context);
+ static LLFastTimer::DeclareTimer FTM_PROCESS_URL_PUMP_RESPOND("Pump Respond");
+ {
+ LLFastTimer t(FTM_PROCESS_URL_PUMP_RESPOND);
+ pump->respond(chain, buffer, context);
+ }
mCompletionCallback = NULL;
}
break;
@@ -422,8 +445,11 @@ void LLURLRequest::initialize()
mResponseTransferedBytes = 0;
}
+static LLFastTimer::DeclareTimer FTM_URL_REQUEST_CONFIGURE("URL Configure");
bool LLURLRequest::configure()
{
+ LLFastTimer t(FTM_URL_REQUEST_CONFIGURE);
+
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
bool rv = false;
S32 bytes = mDetail->mResponseBuffer->countAfter(
@@ -624,6 +650,7 @@ static size_t headerCallback(void* data, size_t size, size_t nmemb, void* user)
return header_len;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_URL_EXTRACTOR("URL Extractor");
/**
* LLContextURLExtractor
*/
@@ -635,6 +662,7 @@ LLIOPipe::EStatus LLContextURLExtractor::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_URL_EXTRACTOR);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
// The destination host is in the context.
@@ -713,6 +741,7 @@ void LLURLRequestComplete::responseStatus(LLIOPipe::EStatus status)
mRequestStatus = status;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_URL_COMPLETE("URL Complete");
// virtual
LLIOPipe::EStatus LLURLRequestComplete::process_impl(
const LLChannelDescriptors& channels,
@@ -721,6 +750,7 @@ LLIOPipe::EStatus LLURLRequestComplete::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_URL_COMPLETE);
PUMP_DEBUG;
complete(channels, buffer);
return STATUS_OK;
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index 6133f50637..e71fb96540 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -1376,3 +1376,6 @@ char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getStri
char const* const _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex");
char const* const _PREHASH_StatusData = LLMessageStringTable::getInstance()->getString("StatusData");
char const* const _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->getString("ProductSKU");
+char const* const _PREHASH_SeeAVs = LLMessageStringTable::getInstance()->getString("SeeAVs");
+char const* const _PREHASH_AnyAVSounds = LLMessageStringTable::getInstance()->getString("AnyAVSounds");
+char const* const _PREHASH_GroupAVSounds = LLMessageStringTable::getInstance()->getString("GroupAVSounds");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index f94ee1ed22..dd2c2dbd64 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -1376,4 +1376,7 @@ extern char const* const _PREHASH_VCoord;
extern char const* const _PREHASH_FaceIndex;
extern char const* const _PREHASH_StatusData;
extern char const* const _PREHASH_ProductSKU;
+extern char const* const _PREHASH_SeeAVs;
+extern char const* const _PREHASH_AnyAVSounds;
+extern char const* const _PREHASH_GroupAVSounds;
#endif
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index 9886d49ccc..22edd9dad8 100644
--- a/indra/llmessage/tests/test_llsdmessage_peer.py
+++ b/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -124,14 +124,19 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
# Suppress error output as well
pass
+class Server(HTTPServer):
+ # This pernicious flag is on by default in HTTPServer. But proper
+ # operation of freeport() absolutely depends on it being off.
+ allow_reuse_address = False
+
if __name__ == "__main__":
- # Instantiate an HTTPServer(TestHTTPRequestHandler) on the first free port
+ # Instantiate a Server(TestHTTPRequestHandler) on the first free port
# in the specified port range. Doing this inline is better than in a
# daemon thread: if it blows up here, we'll get a traceback. If it blew up
# in some other thread, the traceback would get eaten and we'd run the
# subject test program anyway.
httpd, port = freeport(xrange(8000, 8020),
- lambda port: HTTPServer(('127.0.0.1', port), TestHTTPRequestHandler))
+ lambda port: Server(('127.0.0.1', port), TestHTTPRequestHandler))
# Pass the selected port number to the subject test program via the
# environment. We don't want to impose requirements on the test program's
# command-line parsing -- and anyway, for C++ integration tests, that's
diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py
index f329ec2a0e..f2c841532a 100644
--- a/indra/llmessage/tests/testrunner.py
+++ b/indra/llmessage/tests/testrunner.py
@@ -27,6 +27,8 @@ Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
+from __future__ import with_statement
+
import os
import sys
import re
@@ -79,9 +81,14 @@ def freeport(portlist, expr):
Example:
+ class Server(HTTPServer):
+ # If you use BaseHTTPServer.HTTPServer, turning off this flag is
+ # essential for proper operation of freeport()!
+ allow_reuse_address = False
+ # ...
server, port = freeport(xrange(8000, 8010),
- lambda port: HTTPServer(("localhost", port),
- MyRequestHandler))
+ lambda port: Server(("localhost", port),
+ MyRequestHandler))
# pass 'port' to client code
# call server.serve_forever()
"""
@@ -164,3 +171,92 @@ def run(*args, **kwds):
rc = os.spawnv(os.P_WAIT, args[0], args)
debug("%s returned %s", args[0], rc)
return rc
+
+# ****************************************************************************
+# test code -- manual at this point, see SWAT-564
+# ****************************************************************************
+def test_freeport():
+ # ------------------------------- Helpers --------------------------------
+ from contextlib import contextmanager
+ # helper Context Manager for expecting an exception
+ # with exc(SomeError):
+ # raise SomeError()
+ # raises AssertionError otherwise.
+ @contextmanager
+ def exc(exception_class, *args):
+ try:
+ yield
+ except exception_class, err:
+ for i, expected_arg in enumerate(args):
+ assert expected_arg == err.args[i], \
+ "Raised %s, but args[%s] is %r instead of %r" % \
+ (err.__class__.__name__, i, err.args[i], expected_arg)
+ print "Caught expected exception %s(%s)" % \
+ (err.__class__.__name__, ', '.join(repr(arg) for arg in err.args))
+ else:
+ assert False, "Failed to raise " + exception_class.__class__.__name__
+
+ # helper to raise specified exception
+ def raiser(exception):
+ raise exception
+
+ # the usual
+ def assert_equals(a, b):
+ assert a == b, "%r != %r" % (a, b)
+
+ # ------------------------ Sanity check the above ------------------------
+ class SomeError(Exception): pass
+ # Without extra args, accept any err.args value
+ with exc(SomeError):
+ raiser(SomeError("abc"))
+ # With extra args, accept only the specified value
+ with exc(SomeError, "abc"):
+ raiser(SomeError("abc"))
+ with exc(AssertionError):
+ with exc(SomeError, "abc"):
+ raiser(SomeError("def"))
+ with exc(AssertionError):
+ with exc(socket.error, errno.EADDRINUSE):
+ raiser(socket.error(errno.ECONNREFUSED, 'Connection refused'))
+
+ # ----------- freeport() without engaging socket functionality -----------
+ # If portlist is empty, freeport() raises StopIteration.
+ with exc(StopIteration):
+ freeport([], None)
+
+ assert_equals(freeport([17], str), ("17", 17))
+
+ # This is the magic exception that should prompt us to retry
+ inuse = socket.error(errno.EADDRINUSE, 'Address already in use')
+ # Get the iterator to our ports list so we can check later if we've used all
+ ports = iter(xrange(5))
+ with exc(socket.error, errno.EADDRINUSE):
+ freeport(ports, lambda port: raiser(inuse))
+ # did we entirely exhaust 'ports'?
+ with exc(StopIteration):
+ ports.next()
+
+ ports = iter(xrange(2))
+ # Any exception but EADDRINUSE should quit immediately
+ with exc(SomeError):
+ freeport(ports, lambda port: raiser(SomeError()))
+ assert_equals(ports.next(), 1)
+
+ # ----------- freeport() with platform-dependent socket stuff ------------
+ # This is what we should've had unit tests to begin with (see CHOP-661).
+ def newbind(port):
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.bind(('127.0.0.1', port))
+ return sock
+
+ bound0, port0 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port0, 7777)
+ bound1, port1 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port1, 7778)
+ bound2, port2 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port2, 7779)
+ with exc(socket.error, errno.EADDRINUSE):
+ bound3, port3 = freeport(xrange(7777, 7780), newbind)
+
+if __name__ == "__main__":
+ test_freeport()
diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp
index fb22d7f1f5..1b10354c22 100644
--- a/indra/llrender/llcubemap.cpp
+++ b/indra/llrender/llcubemap.cpp
@@ -259,7 +259,7 @@ void LLCubeMap::setMatrix(S32 stage)
if (mMatrixStage < 0) return;
- if (stage > 0)
+ //if (stage > 0)
{
gGL.getTexUnit(stage)->activate();
}
@@ -278,17 +278,17 @@ void LLCubeMap::setMatrix(S32 stage)
glLoadMatrixf((F32 *)trans.mMatrix);
glMatrixMode(GL_MODELVIEW);
- if (stage > 0)
+ /*if (stage > 0)
{
gGL.getTexUnit(0)->activate();
- }
+ }*/
}
void LLCubeMap::restoreMatrix()
{
if (mMatrixStage < 0) return;
- if (mMatrixStage > 0)
+ //if (mMatrixStage > 0)
{
gGL.getTexUnit(mMatrixStage)->activate();
}
@@ -296,10 +296,10 @@ void LLCubeMap::restoreMatrix()
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
- if (mMatrixStage > 0)
+ /*if (mMatrixStage > 0)
{
gGL.getTexUnit(0)->activate();
- }
+ }*/
}
void LLCubeMap::setReflection (void)
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index c224ab0e9b..39f59c0bd8 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -128,9 +128,21 @@ PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB = NULL;
PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB = NULL;
// GL_ARB_map_buffer_range
-PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
-PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
-
+PFNGLMAPBUFFERRANGEPROC glMapBufferRange = NULL;
+PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange = NULL;
+
+// GL_ARB_sync
+PFNGLFENCESYNCPROC glFenceSync = NULL;
+PFNGLISSYNCPROC glIsSync = NULL;
+PFNGLDELETESYNCPROC glDeleteSync = NULL;
+PFNGLCLIENTWAITSYNCPROC glClientWaitSync = NULL;
+PFNGLWAITSYNCPROC glWaitSync = NULL;
+PFNGLGETINTEGER64VPROC glGetInteger64v = NULL;
+PFNGLGETSYNCIVPROC glGetSynciv = NULL;
+
+// GL_APPLE_flush_buffer_range
+PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE = NULL;
+PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE = NULL;
// vertex object prototypes
PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI = NULL;
@@ -334,9 +346,10 @@ LLGLManager::LLGLManager() :
mHasFramebufferObject(FALSE),
mMaxSamples(0),
mHasBlendFuncSeparate(FALSE),
-
+ mHasSync(FALSE),
mHasVertexBufferObject(FALSE),
mHasMapBufferRange(FALSE),
+ mHasFlushBufferRange(FALSE),
mHasPBuffer(FALSE),
mHasShaderObjects(FALSE),
mHasVertexShader(FALSE),
@@ -774,7 +787,9 @@ void LLGLManager::initExtensions()
mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts);
mHasOcclusionQuery2 = ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts);
mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts);
+ mHasSync = ExtensionExists("GL_ARB_sync", gGLHExts.mSysExts);
mHasMapBufferRange = ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts);
+ mHasFlushBufferRange = ExtensionExists("GL_APPLE_flush_buffer_range", gGLHExts.mSysExts);
mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts);
// mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad
#ifdef GL_ARB_framebuffer_object
@@ -969,6 +984,16 @@ void LLGLManager::initExtensions()
mHasVertexBufferObject = FALSE;
}
}
+ if (mHasSync)
+ {
+ glFenceSync = (PFNGLFENCESYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glFenceSync");
+ glIsSync = (PFNGLISSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glIsSync");
+ glDeleteSync = (PFNGLDELETESYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteSync");
+ glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glClientWaitSync");
+ glWaitSync = (PFNGLWAITSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glWaitSync");
+ glGetInteger64v = (PFNGLGETINTEGER64VPROC) GLH_EXT_GET_PROC_ADDRESS("glGetInteger64v");
+ glGetSynciv = (PFNGLGETSYNCIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetSynciv");
+ }
if (mHasMapBufferRange)
{
glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glMapBufferRange");
@@ -1354,6 +1379,8 @@ void LLGLState::checkStates(const std::string& msg)
glGetIntegerv(GL_BLEND_SRC, &src);
glGetIntegerv(GL_BLEND_DST, &dst);
+ stop_glerror();
+
BOOL error = FALSE;
if (src != GL_SRC_ALPHA || dst != GL_ONE_MINUS_SRC_ALPHA)
@@ -1374,7 +1401,9 @@ void LLGLState::checkStates(const std::string& msg)
{
LLGLenum state = iter->first;
LLGLboolean cur_state = iter->second;
+ stop_glerror();
LLGLboolean gl_state = glIsEnabled(state);
+ stop_glerror();
if(cur_state != gl_state)
{
dumpStates();
@@ -1399,11 +1428,11 @@ void LLGLState::checkStates(const std::string& msg)
void LLGLState::checkTextureChannels(const std::string& msg)
{
+#if 0
if (!gDebugGL)
{
return;
}
-
stop_glerror();
GLint activeTexture;
@@ -1569,6 +1598,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)
LL_GL_ERRS << "GL texture state corruption detected. " << msg << LL_ENDL;
}
}
+#endif
}
void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
@@ -1685,7 +1715,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
}
}
- if (glIsEnabled(GL_TEXTURE_2D))
+ /*if (glIsEnabled(GL_TEXTURE_2D))
{
if (!(data_mask & 0x0008))
{
@@ -1708,7 +1738,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
gFailLog << "GL does not have GL_TEXTURE_2D enabled on channel 1." << std::endl;
}
}
- }
+ }*/
glClientActiveTextureARB(GL_TEXTURE0_ARB);
gGL.getTexUnit(0)->activate();
@@ -2110,8 +2140,7 @@ void LLGLNamePool::release(GLuint name)
void LLGLNamePool::upkeepPools()
{
LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS);
- tracker_t::LLInstanceTrackerScopedGuard guard;
- for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter)
+ for (tracker_t::instance_iter iter = beginInstances(); iter != endInstances(); ++iter)
{
LLGLNamePool & pool = *iter;
pool.upkeep();
@@ -2121,8 +2150,7 @@ void LLGLNamePool::upkeepPools()
//static
void LLGLNamePool::cleanupPools()
{
- tracker_t::LLInstanceTrackerScopedGuard guard;
- for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter)
+ for (tracker_t::instance_iter iter = beginInstances(); iter != endInstances(); ++iter)
{
LLGLNamePool & pool = *iter;
pool.cleanup();
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index d1bee00161..d736133f3f 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -88,7 +88,9 @@ public:
// ARB Extensions
BOOL mHasVertexBufferObject;
+ BOOL mHasSync;
BOOL mHasMapBufferRange;
+ BOOL mHasFlushBufferRange;
BOOL mHasPBuffer;
BOOL mHasShaderObjects;
BOOL mHasVertexShader;
diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h
index f35f329f00..851a75629e 100644
--- a/indra/llrender/llglheaders.h
+++ b/indra/llrender/llglheaders.h
@@ -68,6 +68,19 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_sync
+extern PFNGLFENCESYNCPROC glFenceSync;
+extern PFNGLISSYNCPROC glIsSync;
+extern PFNGLDELETESYNCPROC glDeleteSync;
+extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
+extern PFNGLWAITSYNCPROC glWaitSync;
+extern PFNGLGETINTEGER64VPROC glGetInteger64v;
+extern PFNGLGETSYNCIVPROC glGetSynciv;
+
+// GL_APPLE_flush_buffer_range
+extern PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE;
+
// GL_ARB_map_buffer_range
extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
@@ -310,6 +323,19 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_sync
+extern PFNGLFENCESYNCPROC glFenceSync;
+extern PFNGLISSYNCPROC glIsSync;
+extern PFNGLDELETESYNCPROC glDeleteSync;
+extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
+extern PFNGLWAITSYNCPROC glWaitSync;
+extern PFNGLGETINTEGER64VPROC glGetInteger64v;
+extern PFNGLGETSYNCIVPROC glGetSynciv;
+
+// GL_APPLE_flush_buffer_range
+extern PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE;
+
// GL_ARB_map_buffer_range
extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
@@ -519,6 +545,19 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_sync
+extern PFNGLFENCESYNCPROC glFenceSync;
+extern PFNGLISSYNCPROC glIsSync;
+extern PFNGLDELETESYNCPROC glDeleteSync;
+extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
+extern PFNGLWAITSYNCPROC glWaitSync;
+extern PFNGLGETINTEGER64VPROC glGetInteger64v;
+extern PFNGLGETSYNCIVPROC glGetSynciv;
+
+// GL_APPLE_flush_buffer_range
+extern PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE;
+
// GL_ARB_map_buffer_range
extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index ad2c662dfc..80c93bb0d2 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -49,6 +49,11 @@ using std::make_pair;
using std::string;
GLhandleARB LLGLSLShader::sCurBoundShader = 0;
+bool LLGLSLShader::sNoFixedFunction = false;
+
+//UI shader -- declared here so llui_libtest will link properly
+LLGLSLShader gUIProgram;
+LLGLSLShader gSolidColorProgram;
BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
{
@@ -376,6 +381,7 @@ BOOL LLGLSLShader::link(BOOL suppress_errors)
void LLGLSLShader::bind()
{
+ gGL.flush();
if (gGLManager.mHasShaderObjects)
{
glUseProgramObjectARB(mProgramObject);
@@ -390,6 +396,7 @@ void LLGLSLShader::bind()
void LLGLSLShader::unbind()
{
+ gGL.flush();
if (gGLManager.mHasShaderObjects)
{
stop_glerror();
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 4922eb6d67..621e0b82ee 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -67,6 +67,7 @@ public:
LLGLSLShader();
static GLhandleARB sCurBoundShader;
+ static bool sNoFixedFunction;
void unload();
BOOL createShader(std::vector<std::string> * attributes,
@@ -141,4 +142,10 @@ public:
std::string mName;
};
+//UI shader (declared here so llui_libtest will link properly)
+extern LLGLSLShader gUIProgram;
+//output vec4(color.rgb,color.a*tex0[tc0].a)
+extern LLGLSLShader gSolidColorProgram;
+
+
#endif
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 60a5962234..9ca3a23d52 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -1414,6 +1414,8 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
void LLImageGL::deleteDeadTextures()
{
+ bool reset = false;
+
while (!sDeadTextureList.empty())
{
GLuint tex = sDeadTextureList.front();
@@ -1426,12 +1428,22 @@ void LLImageGL::deleteDeadTextures()
{
tex_unit->unbind(tex_unit->getCurrType());
stop_glerror();
+
+ if (i > 0)
+ {
+ reset = true;
+ }
}
}
glDeleteTextures(1, &tex);
stop_glerror();
}
+
+ if (reset)
+ {
+ gGL.getTexUnit(0)->activate();
+ }
}
void LLImageGL::destroyGLTexture()
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 6a3f186531..70df1dd1d1 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -46,6 +46,7 @@ S32 gGLViewport[4];
U32 LLRender::sUICalls = 0;
U32 LLRender::sUIVerts = 0;
+U32 LLTexUnit::sWhiteTexture = 0;
static const U32 LL_NUM_TEXTURE_LAYERS = 32;
static const U32 LL_NUM_LIGHT_UNITS = 8;
@@ -126,7 +127,8 @@ void LLTexUnit::refreshState(void)
// Per apple spec, don't call glEnable/glDisable when index exceeds max texture units
// http://www.mailinglistarchive.com/html/mac-opengl@lists.apple.com/2008-07/msg00653.html
//
- bool enableDisable = (mIndex < gGLManager.mNumTextureUnits) && mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE;
+ bool enableDisable = !LLGLSLShader::sNoFixedFunction &&
+ (mIndex < gGLManager.mNumTextureUnits) && mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE;
if (mCurrTexType != TT_NONE)
{
@@ -184,7 +186,8 @@ void LLTexUnit::enable(eTextureType type)
mCurrTexType = type;
gGL.flush();
- if (type != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
+ if (!LLGLSLShader::sNoFixedFunction &&
+ type != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
mIndex < gGLManager.mNumTextureUnits)
{
glEnable(sGLTextureType[type]);
@@ -201,7 +204,8 @@ void LLTexUnit::disable(void)
activate();
unbind(mCurrTexType);
gGL.flush();
- if (mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
+ if (!LLGLSLShader::sNoFixedFunction &&
+ mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
mIndex < gGLManager.mNumTextureUnits)
{
glDisable(sGLTextureType[mCurrTexType]);
@@ -294,7 +298,7 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)
glBindTexture(sGLTextureType[texture->getTarget()], mCurrTexture);
texture->updateBindStats(texture->mTextureMemory);
mHasMipMaps = texture->mHasMipMaps;
- if (mIndex == 0 && texture->mTexOptionsDirty)
+ if (texture->mTexOptionsDirty)
{
texture->mTexOptionsDirty = false;
setTextureAddressMode(texture->mAddressMode);
@@ -403,7 +407,14 @@ void LLTexUnit::unbind(eTextureType type)
activate();
mCurrTexture = 0;
- glBindTexture(sGLTextureType[type], 0);
+ if (LLGLSLShader::sNoFixedFunction && type == LLTexUnit::TT_TEXTURE)
+ {
+ glBindTexture(sGLTextureType[type], sWhiteTexture);
+ }
+ else
+ {
+ glBindTexture(sGLTextureType[type], 0);
+ }
stop_glerror();
}
}
@@ -474,6 +485,11 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio
void LLTexUnit::setTextureBlendType(eTextureBlendType type)
{
+ if (LLGLSLShader::sNoFixedFunction)
+ { //texture blend type means nothing when using shaders
+ return;
+ }
+
if (mIndex < 0) return;
// Do nothing if it's already correctly set.
@@ -594,6 +610,11 @@ GLint LLTexUnit::getTextureSourceType(eTextureBlendSrc src, bool isAlpha)
void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha)
{
+ if (LLGLSLShader::sNoFixedFunction)
+ { //register combiners do nothing when not using fixed function
+ return;
+ }
+
if (mIndex < 0) return;
activate();
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 41e7b35341..9eedebe2ce 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -52,6 +52,8 @@ class LLTexUnit
{
friend class LLRender;
public:
+ static U32 sWhiteTexture;
+
typedef enum
{
TT_TEXTURE = 0, // Standard 2D Texture
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index b6463309e1..8c0d3592df 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -72,11 +72,11 @@ LLRenderTarget::~LLRenderTarget()
release();
}
-void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
+bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
{
stop_glerror();
-
release();
+ stop_glerror();
mResX = resx;
mResY = resy;
@@ -103,9 +103,11 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo
{
if (depth)
{
- stop_glerror();
- allocateDepth();
- stop_glerror();
+ if (!allocateDepth())
+ {
+ llwarns << "Failed to allocate depth buffer for render target." << llendl;
+ return false;
+ }
}
glGenFramebuffers(1, (GLuint *) &mFBO);
@@ -131,14 +133,14 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo
stop_glerror();
}
- addColorAttachment(color_fmt);
+ return addColorAttachment(color_fmt);
}
-void LLRenderTarget::addColorAttachment(U32 color_fmt)
+bool LLRenderTarget::addColorAttachment(U32 color_fmt)
{
if (color_fmt == 0)
{
- return;
+ return true;
}
U32 offset = mTex.size();
@@ -158,14 +160,26 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt)
#ifdef GL_ARB_texture_multisample
if (mSamples > 1)
{
+ clear_glerror();
glTexImage2DMultisample(LLTexUnit::getInternalType(mUsage), mSamples, color_fmt, mResX, mResY, GL_TRUE);
+ if (glGetError() != GL_NO_ERROR)
+ {
+ llwarns << "Could not allocate multisample color buffer for render target." << llendl;
+ return false;
+ }
}
else
#else
llassert_always(mSamples <= 1);
#endif
{
+ clear_glerror();
LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ if (glGetError() != GL_NO_ERROR)
+ {
+ llwarns << "Could not allocate color buffer for render target." << llendl;
+ return false;
+ }
}
stop_glerror();
@@ -217,15 +231,18 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt)
flush();
}
+ return true;
}
-void LLRenderTarget::allocateDepth()
+bool LLRenderTarget::allocateDepth()
{
if (mStencil)
{
//use render buffers where stencil buffers are in play
glGenRenderbuffers(1, (GLuint *) &mDepth);
glBindRenderbuffer(GL_RENDERBUFFER, mDepth);
+ stop_glerror();
+ clear_glerror();
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mResX, mResY);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
@@ -237,17 +254,29 @@ void LLRenderTarget::allocateDepth()
{
U32 internal_type = LLTexUnit::getInternalType(mUsage);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
+ stop_glerror();
+ clear_glerror();
LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
}
#ifdef GL_ARB_texture_multisample
else
{
+ stop_glerror();
+ clear_glerror();
glTexImage2DMultisample(LLTexUnit::getInternalType(mUsage), mSamples, GL_DEPTH_COMPONENT32, mResX, mResY, GL_TRUE);
}
#else
llassert_always(mSamples <= 1);
#endif
}
+
+ if (glGetError() != GL_NO_ERROR)
+ {
+ llwarns << "Unable to allocate depth buffer for render target." << llendl;
+ return false;
+ }
+
+ return true;
}
void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index 094b58b562..dea1de12d8 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -66,30 +66,30 @@ public:
static bool sUseFBO;
LLRenderTarget();
- virtual ~LLRenderTarget();
+ ~LLRenderTarget();
//allocate resources for rendering
//must be called before use
//multiple calls will release previously allocated resources
- void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = false, S32 samples = 0);
+ bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = false, S32 samples = 0);
//add color buffer attachment
//limit of 4 color attachments per render target
- virtual void addColorAttachment(U32 color_fmt);
+ bool addColorAttachment(U32 color_fmt);
//allocate a depth texture
- virtual void allocateDepth();
+ bool allocateDepth();
//share depth buffer with provided render target
- virtual void shareDepthBuffer(LLRenderTarget& target);
+ void shareDepthBuffer(LLRenderTarget& target);
//free any allocated resources
//safe to call redundantly
- virtual void release();
+ void release();
//bind target for rendering
//applies appropriate viewport
- virtual void bindTarget();
+ void bindTarget();
//unbind target for rendering
static void unbindTarget();
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 4a0b964e61..1180afa631 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -35,6 +35,8 @@
#include "llmemtype.h"
#include "llrender.h"
#include "llvector4a.h"
+#include "llglslshader.h"
+
//============================================================================
@@ -65,6 +67,60 @@ S32 LLVertexBuffer::sWeight4Loc = -1;
std::vector<U32> LLVertexBuffer::sDeleteList;
+const U32 FENCE_WAIT_TIME_NANOSECONDS = 10000; //1 ms
+
+class LLGLSyncFence : public LLGLFence
+{
+public:
+#ifdef GL_ARB_sync
+ GLsync mSync;
+#endif
+
+ LLGLSyncFence()
+ {
+#ifdef GL_ARB_sync
+ mSync = 0;
+#endif
+ }
+
+ ~LLGLSyncFence()
+ {
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ glDeleteSync(mSync);
+ }
+#endif
+ }
+
+ void placeFence()
+ {
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ glDeleteSync(mSync);
+ }
+ mSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
+#endif
+ }
+
+ void wait()
+ {
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ while (glClientWaitSync(mSync, 0, FENCE_WAIT_TIME_NANOSECONDS) == GL_TIMEOUT_EXPIRED)
+ { //track the number of times we've waited here
+ static S32 waits = 0;
+ waits++;
+ }
+ }
+#endif
+ }
+
+
+};
+
S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =
{
sizeof(LLVector4), // TYPE_VERTEX,
@@ -309,6 +365,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,
idx);
stop_glerror();
+ placeFence();
}
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
@@ -340,6 +397,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
glDrawElements(sGLMode[mode], count, GL_UNSIGNED_SHORT,
((U16*) getIndicesPointer()) + indices_offset);
stop_glerror();
+ placeFence();
}
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
@@ -365,6 +423,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
stop_glerror();
glDrawArrays(sGLMode[mode], first, count);
stop_glerror();
+ placeFence();
}
//static
@@ -444,9 +503,11 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
mFilthy(FALSE),
mEmpty(TRUE),
mResized(FALSE),
- mDynamicSize(FALSE)
+ mDynamicSize(FALSE),
+ mFence(NULL)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CONSTRUCTOR);
+ mFence = NULL;
if (!sEnableVBOs)
{
mUsage = 0 ;
@@ -527,9 +588,40 @@ LLVertexBuffer::~LLVertexBuffer()
destroyGLIndices();
sCount--;
+ if (mFence)
+ {
+ delete mFence;
+ }
+
+ mFence = NULL;
+
llassert_always(!mMappedData && !mMappedIndexData) ;
};
+void LLVertexBuffer::placeFence() const
+{
+ /*if (!mFence && useVBOs())
+ {
+ if (gGLManager.mHasSync)
+ {
+ mFence = new LLGLSyncFence();
+ }
+ }
+
+ if (mFence)
+ {
+ mFence->placeFence();
+ }*/
+}
+
+void LLVertexBuffer::waitFence() const
+{
+ /*if (mFence)
+ {
+ mFence->wait();
+ }*/
+}
+
//----------------------------------------------------------------------------
void LLVertexBuffer::genBuffer()
@@ -892,17 +984,11 @@ BOOL LLVertexBuffer::useVBOs() const
{
//it's generally ineffective to use VBO for things that are streaming on apple
-#if LL_DARWIN
- if (!mUsage || mUsage == GL_STREAM_DRAW_ARB)
- {
- return FALSE;
- }
-#else
if (!mUsage)
{
return FALSE;
}
-#endif
+
return TRUE;
}
@@ -967,8 +1053,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
if (useVBOs())
{
-
- if (sDisableVBOMapping || gGLManager.mHasMapBufferRange)
+ if (sDisableVBOMapping || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
{
if (count == -1)
{
@@ -1008,6 +1093,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES);
setBuffer(0, type);
mVertexLocked = TRUE;
+ sMappedCount++;
stop_glerror();
if(sDisableVBOMapping)
@@ -1018,29 +1104,50 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
else
{
U8* src = NULL;
-#ifdef GL_ARB_map_buffer_range
+ waitFence();
if (gGLManager.mHasMapBufferRange)
{
if (map_range)
{
+#ifdef GL_ARB_map_buffer_range
S32 offset = mOffsets[type] + sTypeSize[type]*index;
S32 length = (sTypeSize[type]*count+0xF) & ~0xF;
- src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
+ src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_FLUSH_EXPLICIT_BIT |
+ GL_MAP_INVALIDATE_RANGE_BIT);
+#endif
}
else
{
- src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
+#ifdef GL_ARB_map_buffer_range
+ src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_FLUSH_EXPLICIT_BIT);
+#endif
+ }
+ }
+ else if (gGLManager.mHasFlushBufferRange)
+ {
+ if (map_range)
+ {
+ glBufferParameteriAPPLE(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE);
+ glBufferParameteriAPPLE(GL_ARRAY_BUFFER_ARB, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE);
+ src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ }
+ else
+ {
+ src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
}
else
-#else
- llassert_always(!gGLManager.mHasMapBufferRange);
-#endif
{
map_range = false;
src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
+ llassert(src != NULL);
+
mMappedData = LL_NEXT_ALIGNED_ADDRESS<U8>(src);
mAlignedOffset = mMappedData - src;
@@ -1082,7 +1189,6 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
llerrs << "memory allocation for vertex data failed." << llendl ;
}
}
- sMappedCount++;
}
}
else
@@ -1090,7 +1196,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
map_range = false;
}
- if (map_range && !sDisableVBOMapping)
+ if (map_range && gGLManager.mHasMapBufferRange && !sDisableVBOMapping)
{
return mMappedData;
}
@@ -1114,7 +1220,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
if (useVBOs())
{
- if (sDisableVBOMapping || gGLManager.mHasMapBufferRange)
+ if (sDisableVBOMapping || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
{
if (count == -1)
{
@@ -1152,6 +1258,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
setBuffer(0, TYPE_INDEX);
mIndexLocked = TRUE;
+ sMappedCount++;
stop_glerror();
if(sDisableVBOMapping)
@@ -1162,29 +1269,51 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
else
{
U8* src = NULL;
-#ifdef GL_ARB_map_buffer_range
+ waitFence();
if (gGLManager.mHasMapBufferRange)
{
if (map_range)
{
+#ifdef GL_ARB_map_buffer_range
S32 offset = sizeof(U16)*index;
S32 length = sizeof(U16)*count;
- src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
+ src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_FLUSH_EXPLICIT_BIT |
+ GL_MAP_INVALIDATE_RANGE_BIT);
+#endif
+ }
+ else
+ {
+#ifdef GL_ARB_map_buffer_range
+ src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_FLUSH_EXPLICIT_BIT);
+#endif
+ }
+ }
+ else if (gGLManager.mHasFlushBufferRange)
+ {
+ if (map_range)
+ {
+ glBufferParameteriAPPLE(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE);
+ glBufferParameteriAPPLE(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE);
+ src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
else
{
- src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
+ src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
}
else
-#else
- llassert_always(!gGLManager.mHasMapBufferRange);
-#endif
{
map_range = false;
src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
+ llassert(src != NULL);
+
+
mMappedIndexData = src; //LL_NEXT_ALIGNED_ADDRESS<U8>(src);
mAlignedIndexOffset = mMappedIndexData - src;
stop_glerror();
@@ -1211,15 +1340,13 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
llerrs << "memory allocation for Index data failed. " << llendl ;
}
}
-
- sMappedCount++;
}
else
{
map_range = false;
}
- if (map_range && !sDisableVBOMapping)
+ if (map_range && gGLManager.mHasMapBufferRange && !sDisableVBOMapping)
{
return mMappedIndexData;
}
@@ -1268,8 +1395,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
}
else
{
-#ifdef GL_ARB_map_buffer_range
- if (gGLManager.mHasMapBufferRange)
+ if (gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
{
if (!mMappedVertexRegions.empty())
{
@@ -1279,16 +1405,22 @@ void LLVertexBuffer::unmapBuffer(S32 type)
const MappedRegion& region = mMappedVertexRegions[i];
S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0;
S32 length = sTypeSize[region.mType]*region.mCount;
- glFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, offset, length);
+ if (gGLManager.mHasMapBufferRange)
+ {
+#ifdef GL_ARB_map_buffer_range
+ glFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, offset, length);
+#endif
+ }
+ else if (gGLManager.mHasFlushBufferRange)
+ {
+ glFlushMappedBufferRangeAPPLE(GL_ARRAY_BUFFER_ARB, offset, length);
+ }
stop_glerror();
}
mMappedVertexRegions.clear();
}
}
-#else
- llassert_always(!gGLManager.mHasMapBufferRange);
-#endif
stop_glerror();
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
stop_glerror();
@@ -1326,8 +1458,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
}
else
{
-#ifdef GL_ARB_map_buffer_range
- if (gGLManager.mHasMapBufferRange)
+ if (gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
{
if (!mMappedIndexRegions.empty())
{
@@ -1336,16 +1467,24 @@ void LLVertexBuffer::unmapBuffer(S32 type)
const MappedRegion& region = mMappedIndexRegions[i];
S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0;
S32 length = sizeof(U16)*region.mCount;
- glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length);
+ if (gGLManager.mHasMapBufferRange)
+ {
+#ifdef GL_ARB_map_buffer_range
+ glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length);
+#endif
+ }
+ else if (gGLManager.mHasFlushBufferRange)
+ {
+#ifdef GL_APPLE_flush_buffer_range
+ glFlushMappedBufferRangeAPPLE(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length);
+#endif
+ }
stop_glerror();
}
mMappedIndexRegions.clear();
}
}
-#else
- llassert_always(!gGLManager.mHasMapBufferRange);
-#endif
stop_glerror();
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
stop_glerror();
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index aa5df305a6..cc5d11e1c2 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -70,6 +70,12 @@ protected:
}
};
+class LLGLFence
+{
+public:
+ virtual void placeFence() = 0;
+ virtual void wait() = 0;
+};
//============================================================================
// base class
@@ -270,6 +276,12 @@ protected:
std::vector<MappedRegion> mMappedVertexRegions;
std::vector<MappedRegion> mMappedIndexRegions;
+ mutable LLGLFence* mFence;
+
+ void placeFence() const;
+ void waitFence() const;
+
+
public:
static S32 sCount;
static S32 sGLCount;
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 04040200d0..161496b1f5 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -372,9 +372,7 @@ LLConsole::Paragraph::Paragraph (LLWString str, const LLColor4 &color, F32 add_t
// static
void LLConsole::updateClass()
{
- LLInstanceTrackerScopedGuard guard;
-
- for (instance_iter it = guard.beginInstances(); it != guard.endInstances(); ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
it->update();
}
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index d19e33ea55..43a37d6dff 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -766,7 +766,6 @@ void LLFloater::closeFloater(bool app_quitting)
void LLFloater::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLPanel::reshape(width, height, called_from_parent);
- storeRectControl();
}
void LLFloater::releaseFocus()
@@ -968,6 +967,11 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user)
const LLRect old_rect = getRect();
LLView::handleReshape(new_rect, by_user);
+ if (by_user)
+ {
+ storeRectControl();
+ }
+
// if not minimized, adjust all snapped dependents to new shape
if (!isMinimized())
{
@@ -2048,7 +2052,6 @@ static LLDefaultChildRegistry::Register<LLFloaterView> r("floater_view");
LLFloaterView::LLFloaterView (const Params& p)
: LLUICtrl (p),
-
mFocusCycleMode(FALSE),
mMinimizePositionVOffset(0),
mSnapOffsetBottom(0),
@@ -2059,12 +2062,6 @@ LLFloaterView::LLFloaterView (const Params& p)
// By default, adjust vertical.
void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- reshapeFloater(width, height, called_from_parent, ADJUST_VERTICAL_YES);
-}
-
-// When reshaping this view, make the floaters follow their closest edge.
-void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_parent, BOOL adjust_vertical)
-{
S32 old_width = getRect().getWidth();
S32 old_height = getRect().getHeight();
@@ -2109,11 +2106,7 @@ void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_paren
// "No vertical adjustment" usually means that the bottom of the view
// has been pushed up or down. Hence we want the floaters to follow
// the top.
- if (!adjust_vertical)
- {
- follow_flags |= FOLLOWS_TOP;
- }
- else if (top_offset < bottom_offset)
+ if (top_offset < bottom_offset)
{
follow_flags |= FOLLOWS_TOP;
}
@@ -2847,7 +2840,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
mAutoTile = p.auto_tile;
mOpenCentered = p.open_centered;
- if (p.save_rect)
+ if (p.save_rect && mRectControl.empty())
{
mRectControl = "t"; // flag to build mRectControl name once mInstanceName is set
}
@@ -2885,13 +2878,54 @@ boost::signals2::connection LLFloater::setCloseCallback( const commit_signal_t::
}
LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build");
+static LLFastTimer::DeclareTimer FTM_EXTERNAL_FLOATER_LOAD("Load Extern Floater Reference");
bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node)
{
- Params params(LLUICtrlFactory::getDefaultParams<LLFloater>());
+ Params default_params(LLUICtrlFactory::getDefaultParams<LLFloater>());
+ Params params(default_params);
+
LLXUIParser parser;
parser.readXUI(node, params, filename); // *TODO: Error checking
+ std::string xml_filename = params.filename;
+
+ if (!xml_filename.empty())
+ {
+ LLXMLNodePtr referenced_xml;
+
+ if (output_node)
+ {
+ //if we are exporting, we want to export the current xml
+ //not the referenced xml
+ Params output_params;
+ parser.readXUI(node, output_params, LLUICtrlFactory::getInstance()->getCurFileName());
+ setupParamsForExport(output_params, parent);
+ output_node->setName(node->getName()->mString);
+ parser.writeXUI(output_node, output_params, &default_params);
+ return TRUE;
+ }
+
+ LLUICtrlFactory::instance().pushFileName(xml_filename);
+
+ LLFastTimer _(FTM_EXTERNAL_FLOATER_LOAD);
+ if (!LLUICtrlFactory::getLayeredXMLNode(xml_filename, referenced_xml))
+ {
+ llwarns << "Couldn't parse panel from: " << xml_filename << llendl;
+
+ return FALSE;
+ }
+
+ parser.readXUI(referenced_xml, params, LLUICtrlFactory::getInstance()->getCurFileName());
+
+ // add children using dimensions from referenced xml for consistent layout
+ setShape(params.rect);
+ LLUICtrlFactory::createChildren(this, referenced_xml, child_registry_t::instance());
+
+ LLUICtrlFactory::instance().popFileName();
+ }
+
+
if (output_node)
{
Params output_params(params);
@@ -2912,7 +2946,6 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::str
{
params.rect.left.set(0);
}
-
params.from_xui = true;
applyXUILayout(params, parent);
initFromParams(params);
@@ -3054,3 +3087,24 @@ bool LLFloater::buildFromFile(const std::string& filename, LLXMLNodePtr output_n
return res;
}
+
+void LLFloater::stackWith(LLFloater& other)
+{
+ static LLUICachedControl<S32> floater_offset ("UIFloaterOffset", 16);
+
+ LLRect next_rect;
+ if (other.getHost())
+ {
+ next_rect = other.getHost()->getRect();
+ }
+ else
+ {
+ next_rect = other.getRect();
+ }
+ next_rect.translate(floater_offset, -floater_offset);
+
+ next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, getRect().getWidth(), getRect().getHeight());
+
+ mRectControl.clear(); // don't save rect of stacked floaters
+ setShape(next_rect);
+} \ No newline at end of file
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 9aae1afc62..58c2d34253 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -265,6 +265,8 @@ public:
virtual void setTornOff(bool torn_off) { mTornOff = torn_off; }
+ void stackWith(LLFloater& other);
+
// Return a closeable floater, if any, given the current focus.
static LLFloater* getClosableFloaterFromFocus();
@@ -289,9 +291,6 @@ public:
void updateTransparency(ETypeTransparency transparency_type);
protected:
-
- void setRectControl(const std::string& rectname) { mRectControl = rectname; };
-
virtual void applySavedVariables();
void applyRectControl();
@@ -455,8 +454,6 @@ protected:
public:
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- void reshapeFloater(S32 width, S32 height, BOOL called_from_parent, BOOL adjust_vertical);
-
/*virtual*/ void draw();
/*virtual*/ LLRect getSnapRect() const;
/*virtual*/ void refresh();
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index f5e6444287..1463d0bfbb 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -57,7 +57,7 @@ void LLFloaterReg::add(const std::string& name, const std::string& filename, con
}
//static
-LLRect LLFloaterReg::getFloaterRect(const std::string& name)
+LLFloater* LLFloaterReg::getLastFloaterInGroup(const std::string& name)
{
LLRect rect;
const std::string& groupname = sGroupMap[name];
@@ -66,20 +66,10 @@ LLRect LLFloaterReg::getFloaterRect(const std::string& name)
instance_list_t& list = sInstanceMap[groupname];
if (!list.empty())
{
- static LLUICachedControl<S32> floater_offset ("UIFloaterOffset", 16);
- LLFloater* last_floater = list.back();
- if (last_floater->getHost())
- {
- rect = last_floater->getHost()->getRect();
- }
- else
- {
- rect = last_floater->getRect();
- }
- rect.translate(floater_offset, -floater_offset);
+ return list.back();
}
}
- return rect;
+ return NULL;
}
//static
@@ -137,12 +127,12 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
res->applySavedVariables(); // Can't apply rect and dock state until setting instance name
if (res->mAutoTile && !res->getHost() && index > 0)
{
- const LLRect& cur_rect = res->getRect();
- LLRect next_rect = getFloaterRect(groupname);
- next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, cur_rect.getWidth(), cur_rect.getHeight());
- res->setRect(next_rect);
- res->setRectControl(LLStringUtil::null); // don't save rect of tiled floaters
- gFloaterView->adjustToFitScreen(res, true);
+ LLFloater* last_floater = getLastFloaterInGroup(groupname);
+ if (last_floater)
+ {
+ res->stackWith(*last_floater);
+ gFloaterView->adjustToFitScreen(res, true);
+ }
}
else
{
diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h
index 8414b92113..a2027a77a0 100644
--- a/indra/llui/llfloaterreg.h
+++ b/indra/llui/llfloaterreg.h
@@ -86,7 +86,7 @@ public:
const std::string& groupname = LLStringUtil::null);
// Helpers
- static LLRect getFloaterRect(const std::string& name);
+ static LLFloater* getLastFloaterInGroup(const std::string& name);
// Find / get (create) / remove / destroy
static LLFloater* findInstance(const std::string& name, const LLSD& key = LLSD());
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 6a91ec56e4..a59247ba09 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -713,10 +713,7 @@ void LLLayoutStack::createResizeBars()
//static
void LLLayoutStack::updateClass()
{
- LLInstanceTrackerScopedGuard guard;
- for (LLLayoutStack::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
it->updateLayout();
}
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 123997e5e9..06fbc0f234 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -37,6 +37,7 @@
#include "llgl.h"
#include "lltimer.h"
+#include "llcalc.h"
//#include "llclipboard.h"
#include "llcontrol.h"
#include "llbutton.h"
@@ -133,6 +134,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mIgnoreTab( p.ignore_tab ),
mDrawAsterixes( p.is_password ),
mSelectAllonFocusReceived( p.select_on_focus ),
+ mSelectAllonCommit( TRUE ),
mPassDelete(FALSE),
mReadOnly(FALSE),
mBgImage( p.background_image ),
@@ -230,7 +232,10 @@ void LLLineEditor::onCommit()
setControlValue(getValue());
LLUICtrl::onCommit();
- selectAll();
+
+ // Selection on commit needs to be turned off when evaluating maths
+ // expressions, to allow indication of the error position
+ if (mSelectAllonCommit) selectAll();
}
// Returns TRUE if user changed value at all
@@ -2072,6 +2077,32 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str)
return success;
}
+BOOL LLLineEditor::evaluateFloat()
+{
+ bool success;
+ F32 result = 0.f;
+ std::string expr = getText();
+ LLStringUtil::toUpper(expr);
+
+ success = LLCalc::getInstance()->evalString(expr, result);
+
+ if (!success)
+ {
+ // Move the cursor to near the error on failure
+ setCursor(LLCalc::getInstance()->getLastErrorPos());
+ // *TODO: Translated error message indicating the type of error? Select error text?
+ }
+ else
+ {
+ // Replace the expression with the result
+ std::string result_str = llformat("%f",result);
+ setText(result_str);
+ selectAll();
+ }
+
+ return success;
+}
+
void LLLineEditor::onMouseCaptureLost()
{
endSelection();
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 4b77708590..583bde360a 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -221,6 +221,7 @@ public:
void deleteSelection();
void setSelectAllonFocusReceived(BOOL b);
+ void setSelectAllonCommit(BOOL b) { mSelectAllonCommit = b; }
typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t;
void setKeystrokeCallback(callback_t callback, void* user_data);
@@ -241,6 +242,7 @@ public:
static BOOL postvalidateFloat(const std::string &str);
bool prevalidateInput(const LLWString& wstr);
+ BOOL evaluateFloat();
// line history support:
void setEnableLineHistory( BOOL enabled ) { mHaveHistory = enabled; } // switches line history on or off
@@ -340,6 +342,7 @@ protected:
BOOL mDrawAsterixes;
BOOL mSelectAllonFocusReceived;
+ BOOL mSelectAllonCommit;
BOOL mPassDelete;
BOOL mReadOnly;
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 775db6bc9d..e3193bc352 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -515,9 +515,6 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
if (!xml_filename.empty())
{
- LLUICtrlFactory::instance().pushFileName(xml_filename);
-
- LLFastTimer timer(FTM_EXTERNAL_PANEL_LOAD);
if (output_node)
{
//if we are exporting, we want to export the current xml
@@ -530,6 +527,9 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
return TRUE;
}
+ LLUICtrlFactory::instance().pushFileName(xml_filename);
+
+ LLFastTimer timer(FTM_EXTERNAL_PANEL_LOAD);
if (!LLUICtrlFactory::getLayeredXMLNode(xml_filename, referenced_xml))
{
llwarns << "Couldn't parse panel from: " << xml_filename << llendl;
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 1b777ee1cb..790025cb2d 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -265,6 +265,9 @@ protected:
std::string mHelpTopic; // the name of this panel's help topic to display in the Help Viewer
typedef std::deque<const LLCallbackMap::map_t*> factory_stack_t;
static factory_stack_t sFactoryStack;
+
+ // for setting the xml filename when building panel in context dependent cases
+ std::string mXMLFilename;
private:
BOOL mBgVisible; // any background at all?
@@ -283,8 +286,6 @@ private:
typedef std::map<std::string, std::string> ui_string_map_t;
ui_string_map_t mUIStrings;
- // for setting the xml filename when building panel in context dependent cases
- std::string mXMLFilename;
}; // end class LLPanel
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index 15a7438ec9..934879cdfd 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -44,7 +44,7 @@
#include "llresmgr.h"
#include "lluictrlfactory.h"
-const U32 MAX_STRING_LENGTH = 32;
+const U32 MAX_STRING_LENGTH = 255;
static LLDefaultChildRegistry::Register<LLSpinCtrl> r2("spinner");
@@ -124,14 +124,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
params.max_length.bytes(MAX_STRING_LENGTH);
params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2)));
- if( mPrecision>0 )//should accept float numbers
- {
- params.prevalidate_callback(&LLTextValidate::validateFloat);
- }
- else //should accept int numbers
- {
- params.prevalidate_callback(&LLTextValidate::validateInt);
- }
+ //*NOTE: allow entering of any chars for LLCalc, proper input will be evaluated on commit
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
@@ -140,6 +133,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
// than when it doesn't. Instead, if you always have to double click to select all the text,
// it's easier to understand
//mEditor->setSelectAllonFocusReceived(TRUE);
+ mEditor->setSelectAllonCommit(FALSE);
addChild(mEditor);
updateEditor();
@@ -304,9 +298,10 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
{
BOOL success = FALSE;
- std::string text = mEditor->getText();
- if( LLLineEditor::postvalidateFloat( text ) )
+ if( mEditor->evaluateFloat() )
{
+ std::string text = mEditor->getText();
+
LLLocale locale(LLLocale::USER_LOCALE);
F32 val = (F32) atof(text.c_str());
@@ -327,7 +322,11 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
}
updateEditor();
- if( !success )
+ if( success )
+ {
+ updateEditor();
+ }
+ else
{
reportInvalidData();
}
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index bc2432f6f7..58ba9e05f5 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -95,7 +95,6 @@ static LLDefaultChildRegistry::Register<LLSearchEditor> register_search_editor("
// register other widgets which otherwise may not be linked in
static LLDefaultChildRegistry::Register<LLLoadingIndicator> register_loading_indicator("loading_indicator");
-
//
// Functions
//
@@ -524,8 +523,15 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
if (solid_color)
{
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
- gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gSolidColorProgram.bind();
+ }
+ else
+ {
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
+ gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);
+ }
}
gGL.getTexUnit(0)->bind(image);
@@ -699,7 +705,14 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
if (solid_color)
{
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+ else
+ {
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
}
}
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 4e622033b3..7801a01ace 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -33,6 +33,7 @@
#include "llrect.h"
#include "llcontrol.h"
#include "llcoord.h"
+#include "llglslshader.h"
#include "llinitparam.h"
#include "llregistry.h"
#include "lluicolor.h"
@@ -47,6 +48,7 @@
// for initparam specialization
#include "llfontgl.h"
+
class LLColor4;
class LLVector3;
class LLVector2;
@@ -484,4 +486,7 @@ namespace LLInitParam
};
}
+extern LLGLSLShader gSolidColorProgram;
+extern LLGLSLShader gUIProgram;
+
#endif
diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp
index 25550321f0..ff92cbb7fd 100644
--- a/indra/llvfs/lldiriterator.cpp
+++ b/indra/llvfs/lldiriterator.cpp
@@ -52,8 +52,20 @@ LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
{
fs::path dir_path(dirname);
- // Check if path exists.
- if (!fs::exists(dir_path))
+ bool is_dir = false;
+
+ // Check if path is a directory.
+ try
+ {
+ is_dir = fs::is_directory(dir_path);
+ }
+ catch (fs::basic_filesystem_error<fs::path>& e)
+ {
+ llwarns << e.what() << llendl;
+ return;
+ }
+
+ if (!is_dir)
{
llwarns << "Invalid path: \"" << dir_path.string() << "\"" << llendl;
return;
@@ -66,7 +78,7 @@ LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
}
catch (fs::basic_filesystem_error<fs::path>& e)
{
- llerrs << e.what() << llendl;
+ llwarns << e.what() << llendl;
return;
}
@@ -82,7 +94,7 @@ LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
}
catch (boost::regex_error& e)
{
- llerrs << "\"" << exp << "\" is not a valid regular expression: "
+ llwarns << "\"" << exp << "\" is not a valid regular expression: "
<< e.what() << llendl;
return;
}
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 188c9e1950..4e103ae2ba 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -603,6 +603,8 @@ extern "C" { int yyerror(const char *fmt, ...); }
"PARCEL_DETAILS_OWNER" { count(); yylval.ival = PARCEL_DETAILS_OWNER; return(INTEGER_CONSTANT); }
"PARCEL_DETAILS_GROUP" { count(); yylval.ival = PARCEL_DETAILS_GROUP; return(INTEGER_CONSTANT); }
"PARCEL_DETAILS_AREA" { count(); yylval.ival = PARCEL_DETAILS_AREA; return(INTEGER_CONSTANT); }
+"PARCEL_DETAILS_ID" { count(); yylval.ival = PARCEL_DETAILS_ID; return(INTEGER_CONSTANT); }
+"PARCEL_DETAILS_SEE_AVATARS" { count(); yylval.ival = PARCEL_DETAILS_SEE_AVATARS; return(INTEGER_CONSTANT); }
"STRING_TRIM_HEAD" { count(); yylval.ival = STRING_TRIM_HEAD; return(INTEGER_CONSTANT); }
"STRING_TRIM_TAIL" { count(); yylval.ival = STRING_TRIM_TAIL; return(INTEGER_CONSTANT); }
diff --git a/indra/mac_crash_logger/CrashReporter.nib/objects.xib b/indra/mac_crash_logger/CrashReporter.nib/objects.xib
index 634d1c5321..32647391b6 100644
--- a/indra/mac_crash_logger/CrashReporter.nib/objects.xib
+++ b/indra/mac_crash_logger/CrashReporter.nib/objects.xib
@@ -15,7 +15,7 @@
<string name="bounds">414 390 434 487 </string>
</object>
<object class="IBCarbonStaticText" id="181">
- <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Cancel.&#10;</string>
+ <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Don&apos;t Send.&#10;</string>
<string name="bounds">20 20 231 487 </string>
</object>
<object class="IBCarbonWindow" id="166">
diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp
index bec8cce04e..b555e92b96 100644
--- a/indra/mac_crash_logger/llcrashloggermac.cpp
+++ b/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -29,9 +29,6 @@
#include <Carbon/Carbon.h>
#include <iostream>
-#include <sstream>
-
-#include "boost/tokenizer.hpp"
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
@@ -247,7 +244,7 @@ bool LLCrashLoggerMac::mainLoop()
void LLCrashLoggerMac::updateApplication(const std::string& message)
{
- LLCrashLogger::updateApplication();
+ LLCrashLogger::updateApplication(message);
}
bool LLCrashLoggerMac::cleanup()
diff --git a/indra/mac_crash_logger/mac_crash_logger.cpp b/indra/mac_crash_logger/mac_crash_logger.cpp
index 20b491c401..6571b35241 100644
--- a/indra/mac_crash_logger/mac_crash_logger.cpp
+++ b/indra/mac_crash_logger/mac_crash_logger.cpp
@@ -25,22 +25,23 @@
*/
#include "linden_common.h"
-
#include "llcrashloggermac.h"
int main(int argc, char **argv)
{
- //time(&gLaunchTime);
-
- llinfos << "Starting Second Life Viewer Crash Reporter" << llendl;
+ llinfos << "Starting crash reporter." << llendl;
LLCrashLoggerMac app;
app.parseCommandOptions(argc, argv);
- if(!app.init())
+
+ if (! app.init())
{
- return 0;
+ llwarns << "Unable to initialize application." << llendl;
+ return 1;
}
+
app.mainLoop();
-
+ app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index da9a145423..935dd2e887 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -150,8 +150,9 @@ set(viewer_SOURCE_FILES
lldrawpoolwlsky.cpp
lldriverparam.cpp
lldynamictexture.cpp
- llenvmanager.cpp
llemote.cpp
+ llenvmanager.cpp
+ llestateinfomodel.cpp
lleventnotifier.cpp
lleventpoll.cpp
llexpandabletextbox.cpp
@@ -711,6 +712,7 @@ set(viewer_HEADER_FILES
lldynamictexture.h
llemote.h
llenvmanager.h
+ llestateinfomodel.h
lleventnotifier.h
lleventpoll.h
llexpandabletextbox.h
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index 89e5949fbe..15434f2b8f 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -220,8 +220,7 @@
<map>
<key>desc</key>
<string>Set the detail level.
- 0 - low, 1 - medium, 2 - high, 3 - ultra
- </string>
+0 - low, 1 - medium, 2 - high, 3 - ultra</string>
<key>count</key>
<integer>1</integer>
</map>
@@ -229,10 +228,7 @@
<key>setdefault</key>
<map>
<key>desc</key>
- <string> specify the value of a particular
- configuration variable which can be
- overridden by settings.xml
- </string>
+ <string>specify the value of a particular configuration variable which can be overridden by settings.xml.</string>
<key>count</key>
<integer>2</integer>
<!-- Special case. Mapped to settings procedurally. -->
@@ -241,10 +237,7 @@
<key>set</key>
<map>
<key>desc</key>
- <string> specify the value of a particular
- configuration variable that
- overrides all other settings
- </string>
+ <string>specify the value of a particular configuration variable that overrides all other settings.</string>
<key>count</key>
<integer>2</integer>
<key>compose</key>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 263b73ba23..9fa4046fdf 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -498,6 +498,7 @@ PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id.
PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id.
PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters.
PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id.
+PARCEL_DETAILS_SEE_AVATARS Used with llGetParcelDetails to get the avatars visibility setting.
STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string.
STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string.
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 9f4e89691f..ae72dee900 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -44,7 +44,6 @@
<array>
<!-- sample entry for debugging a specific item -->
<!-- <string>Voice</string> -->
- <string>Capabilities</string>
</array>
</map>
</array>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 916f376c4c..708bb60fca 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3850,7 +3850,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>https://www.xstreetsl.com/modules.php?name=Marketplace&amp;CategoryID=233</string>
+ <string>https://marketplace.secondlife.com/products/search?search[category_id]=200&amp;search[maturity][]=General&amp;search[page]=1&amp;search[per_page]=12</string>
</map>
<key>GridCrossSections</key>
<map>
@@ -4863,7 +4863,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string />
+ <string>http://viewer-login.agni.lindenlab.com/</string>
</map>
<key>LosslessJ2CUpload</key>
<map>
@@ -4885,7 +4885,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>20.0</real>
+ <real>60.0</real>
</map>
<key>MapOverlayIndex</key>
<map>
@@ -12573,13 +12573,13 @@
<key>WatchdogEnabled</key>
<map>
<key>Comment</key>
- <string>Controls whether the thread watchdog timer is activated.</string>
+ <string>Controls whether the thread watchdog timer is activated. Value is boolean. Set to -1 to defer to built-in default.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>20</integer>
+ <integer>1</integer>
</map>
<key>WaterGLFogDensityScale</key>
<map>
diff --git a/indra/newview/app_settings/settings_files.xml b/indra/newview/app_settings/settings_files.xml
index 079a54f957..bfc09286e3 100644
--- a/indra/newview/app_settings/settings_files.xml
+++ b/indra/newview/app_settings/settings_files.xml
@@ -20,7 +20,8 @@
file_name="settings.xml"
file_name_setting="ClientSettingsFile"/>
<file name="CrashSettings"
- file_name="settings_crash_behavior"/>
+ file_name="settings_crash_behavior.xml"
+ file_name_setting="CrashSettingsFile"/>
<file name="Warnings"
file_name="ignorable_dialogs.xml"
file_name_setting="WarningSettingsFile"/>
@@ -61,4 +62,4 @@
file_name="colors.xml"
file_name_setting="SkinningSettingsFile"/>
</group>
-</settings_files> \ No newline at end of file
+</settings_files>
diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl
new file mode 100644
index 0000000000..3827c72f4c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl
@@ -0,0 +1,17 @@
+/**
+ * @file customalphaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+uniform sampler2D diffuseMap;
+
+uniform float custom_alpha;
+
+void main()
+{
+ vec4 color = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
+ color.a *= custom_alpha;
+ gl_FragColor = color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl
new file mode 100644
index 0000000000..04bfff22c1
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl
@@ -0,0 +1,16 @@
+/**
+ * @file customalphaV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_FrontColor = gl_Color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl
new file mode 100644
index 0000000000..a60fb1eaa7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl
@@ -0,0 +1,17 @@
+/**
+ * @file glowcombineF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+uniform sampler2D glowMap;
+uniform sampler2DRect screenMap;
+
+void main()
+{
+ gl_FragColor = texture2D(glowMap, gl_TexCoord[0].xy) +
+ texture2DRect(screenMap, gl_TexCoord[1].xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl
new file mode 100644
index 0000000000..ce183ec154
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl
@@ -0,0 +1,15 @@
+/**
+ * @file glowcombineV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_TexCoord[1] = gl_MultiTexCoord1;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl
new file mode 100644
index 0000000000..b140712f18
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl
@@ -0,0 +1,11 @@
+/**
+ * @file occlusionF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+void main()
+{
+ gl_FragColor = vec4(1,1,1,1);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl
new file mode 100644
index 0000000000..5a5d0ec506
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl
@@ -0,0 +1,12 @@
+/**
+ * @file uiV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
new file mode 100644
index 0000000000..ae943cc438
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
@@ -0,0 +1,15 @@
+/**
+ * @file twotextureaddF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+uniform sampler2D tex0;
+
+void main()
+{
+ float alpha = texture2D(tex0, gl_TexCoord[0].xy).a;
+
+ gl_FragColor = vec4(gl_Color.rgb, alpha);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
new file mode 100644
index 0000000000..8401208e28
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
@@ -0,0 +1,16 @@
+/**
+ * @file solidcolorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_FrontColor = gl_Color;
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl
new file mode 100644
index 0000000000..d81b56fdb9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl
@@ -0,0 +1,14 @@
+/**
+ * @file twotextureaddF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+uniform sampler2D tex0;
+uniform sampler2D tex1;
+
+void main()
+{
+ gl_FragColor = texture2D(tex0, gl_TexCoord[0].xy)+texture2D(tex1, gl_TexCoord[1].xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl
new file mode 100644
index 0000000000..f685b112b4
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl
@@ -0,0 +1,16 @@
+/**
+ * @file twotextureaddV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_TexCoord[1] = gl_MultiTexCoord1;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/uiF.glsl b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl
new file mode 100644
index 0000000000..9dec7a56ba
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl
@@ -0,0 +1,13 @@
+/**
+ * @file uiF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+uniform sampler2D diffuseMap;
+
+void main()
+{
+ gl_FragColor = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/uiV.glsl b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl
new file mode 100644
index 0000000000..9ca6cae5c5
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl
@@ -0,0 +1,16 @@
+/**
+ * @file uiV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_FrontColor = gl_Color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
new file mode 100644
index 0000000000..587ab93a80
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
@@ -0,0 +1,17 @@
+/**
+ * @file bumpF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+
+void main()
+{
+ float tex0 = texture2D(texture0, gl_TexCoord[0].xy).a;
+ float tex1 = texture2D(texture1, gl_TexCoord[1].xy).a;
+
+ gl_FragColor = vec4(tex0+(1.0-tex1)-0.5);
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl
new file mode 100644
index 0000000000..056d1a9582
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl
@@ -0,0 +1,16 @@
+/**
+ * @file bumpV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+void main()
+{
+ //transform vertex
+ gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;
+ gl_FrontColor = gl_Color;
+}
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 22c79a4cbd..1f9dc6e4e5 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,6 +1,6 @@
-version 30
+version 32
-// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
+// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
//
@@ -244,10 +244,10 @@ RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
-// No GL_ARB_map_buffer_range
+// GL_ARB_map_buffer_range exists
//
-list NoMapBufferRange
-RenderVBOMappingDisable 1 0
+list MapBufferRange
+RenderVBOMappingDisable 1 1
//
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 649f5ebd18..6e962f3c56 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 25
+version 27
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -242,10 +242,10 @@ RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
-// No GL_ARB_map_buffer_range
+// GL_ARB_map_buffer_range exists
//
-list NoMapBufferRange
-RenderVBOMappingDisable 1 0
+list MapBufferRange
+RenderVBOMappingDisable 1 1
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index ee08e78af5..fa67ee547c 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 26
+version 29
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -47,8 +47,8 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
-RenderVBOEnable 1 1
-RenderVBOMappingDisable 1 1
+RenderVBOEnable 1 0
+RenderVBOMappingDisable 1 0
RenderVolumeLODFactor 1 2.0
UseStartScreen 1 1
UseOcclusion 1 1
@@ -63,7 +63,7 @@ RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
-RenderUseStreamVBO 1 1
+RenderUseStreamVBO 1 0
RenderFSAASamples 1 16
//
@@ -244,13 +244,6 @@ RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
-// No GL_ARB_map_buffer_range
-//
-list NoMapBufferRange
-RenderVBOMappingDisable 1 0
-
-
-//
// "Default" setups for safe, low, medium, high
//
list safe
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index ba74f9a6c2..a0245f5369 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -1,4 +1,4 @@
-version 30
+version 31
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -244,10 +244,10 @@ RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
-// No GL_ARB_map_buffer_range
+// GL_ARB_map_buffer_range exists
//
-list NoMapBufferRange
-RenderVBOMappingDisable 1 0
+list MapBufferRange
+RenderVBOMappingDisable 1 1
//
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 8954937f69..492cfe7c1b 100644..100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -577,7 +577,10 @@ void LLAgent::setFlying(BOOL fly)
// static
void LLAgent::toggleFlying()
{
- LLToolPie::instance().stopClickToWalk();
+ if ( gAgent.mAutoPilot )
+ {
+ LLToolPie::instance().stopClickToWalk();
+ }
BOOL fly = !gAgent.getFlying();
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 1d9519d675..b65933f8a1 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -56,6 +56,7 @@
#include "llallocator.h"
#include "llares.h"
#include "llcurl.h"
+#include "llcalc.h"
#include "lltexturestats.h"
#include "lltexturestats.h"
#include "llviewerwindow.h"
@@ -468,18 +469,6 @@ void request_initial_instant_messages()
}
}
-// A settings system callback for CrashSubmitBehavior
-bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue)
-{
- S32 cb = newvalue.asInteger();
- const S32 NEVER_SUBMIT_REPORT = 2;
- if(cb == NEVER_SUBMIT_REPORT)
- {
- LLAppViewer::instance()->destroyMainloopTimeout();
- }
- return true;
-}
-
// Use these strictly for things that are constructed at startup,
// or for things that are performance critical. JC
static void settings_to_globals()
@@ -611,9 +600,6 @@ bool LLAppViewer::sendURLToOtherInstance(const std::string& url)
// Static members.
// The single viewer app.
LLAppViewer* LLAppViewer::sInstance = NULL;
-
-const std::string LLAppViewer::sGlobalSettingsName = "Global";
-
LLTextureCache* LLAppViewer::sTextureCache = NULL;
LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;
LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
@@ -771,16 +757,6 @@ bool LLAppViewer::init()
LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL;
LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL;
- // Get the single value from the crash settings file, if it exists
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- gCrashSettings.loadFromFile(crash_settings_filename);
- if(gSavedSettings.getBOOL("IgnoreAllNotifications"))
- {
- gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ALWAYS_SEND);
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
- }
- LL_INFOS("InitInfo") << "Crash settings done." << LL_ENDL ;
-
/////////////////////////////////////////////////
// OS-specific login dialogs
/////////////////////////////////////////////////
@@ -1055,7 +1031,7 @@ bool LLAppViewer::init()
//EXT-7013 - On windows for some locale (Japanese) standard
//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 = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language");
+ std::string language = gSavedSettings.getString("Language");
if(language == "ja" || language == "pl")
{
LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
@@ -1543,7 +1519,9 @@ bool LLAppViewer::cleanup()
// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be deleted.
LLWorldMap::getInstance()->reset(); // release any images
-
+
+ LLCalc::cleanUp();
+
llinfos << "Global stuff deleted" << llendflush;
if (gAudiop)
@@ -1706,10 +1684,6 @@ bool LLAppViewer::cleanup()
llinfos << "Saved settings" << llendflush;
}
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- // save all settings, even if equals defaults
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
-
std::string warnings_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Warnings"));
gWarningSettings.saveToFile(warnings_settings_filename, TRUE);
@@ -1839,7 +1813,6 @@ bool LLAppViewer::cleanup()
gSavedSettings.cleanup();
LLUIColorTable::instance().clear();
- gCrashSettings.cleanup();
LLWatchdog::getInstance()->cleanup();
@@ -1982,7 +1955,6 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
llerrs << "Invalid settings location list" << llendl;
}
- LLControlGroup* global_settings = LLControlGroup::getInstance(sGlobalSettingsName);
for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
it != end_it;
++it)
@@ -2015,11 +1987,15 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
std::string full_settings_path;
if (file_it->file_name_setting.isProvided()
- && global_settings->controlExists(file_it->file_name_setting))
+ && gSavedSettings.controlExists(file_it->file_name_setting))
{
// try to find filename stored in file_name_setting control
- full_settings_path = global_settings->getString(file_it->file_name_setting);
- if (!gDirUtilp->fileExists(full_settings_path))
+ full_settings_path = gSavedSettings.getString(file_it->file_name_setting);
+ if (full_settings_path.empty())
+ {
+ continue;
+ }
+ else if (!gDirUtilp->fileExists(full_settings_path))
{
// search in default path
full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, full_settings_path);
@@ -2165,8 +2141,6 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.setS32("WatchdogEnabled", 0);
#endif
- gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _2));
-
// These are warnings that appear on the first experience of that condition.
// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse
// for disable/reset ability
@@ -2297,15 +2271,33 @@ bool LLAppViewer::initConfiguration()
{
const std::string& name = *itr;
const std::string& value = *(++itr);
- LLControlVariable* c = LLControlGroup::getInstance(sGlobalSettingsName)->getControl(name);
- if(c)
+ std::string name_part;
+ std::string group_part;
+ LLControlVariable* control = NULL;
+
+ // Name can be further split into ControlGroup.Name, with the default control group being Global
+ size_t pos = name.find('.');
+ if (pos != std::string::npos)
+ {
+ group_part = name.substr(0, pos);
+ name_part = name.substr(pos+1);
+ llinfos << "Setting " << group_part << "." << name_part << " to " << value << llendl;
+ LLControlGroup* g = LLControlGroup::getInstance(group_part);
+ if (g) control = g->getControl(name_part);
+ }
+ else
+ {
+ llinfos << "Setting Global." << name << " to " << value << llendl;
+ control = gSavedSettings.getControl(name);
+ }
+
+ if (control)
{
- c->setValue(value, false);
+ control->setValue(value, false);
}
else
{
- llwarns << "'--set' specified with unknown setting: '"
- << name << "'." << llendl;
+ llwarns << "Failed --set " << name << ": setting name unknown." << llendl;
}
}
}
@@ -2762,7 +2754,8 @@ void LLAppViewer::checkForCrash(void)
// Pop up a freeze or crash warning dialog
//
S32 choice;
- if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_ASK)
+ const S32 cb = gCrashSettings.getS32("CrashSubmitBehavior");
+ if(cb == CRASH_BEHAVIOR_ASK)
{
std::ostringstream msg;
msg << LLTrans::getString("MBFrozenCrashed");
@@ -2771,7 +2764,7 @@ void LLAppViewer::checkForCrash(void)
alert,
OSMB_YESNO);
}
- else if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_NEVER_SEND)
+ else if(cb == CRASH_BEHAVIOR_NEVER_SEND)
{
choice = OSBTN_NO;
}
@@ -2828,10 +2821,9 @@ bool LLAppViewer::initWindow()
LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
// Need to load feature table before cheking to start watchdog.
- const S32 NEVER_SUBMIT_REPORT = 2;
bool use_watchdog = false;
int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled");
- if(watchdog_enabled_setting == -1)
+ if (watchdog_enabled_setting == -1)
{
use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");
}
@@ -2841,8 +2833,7 @@ bool LLAppViewer::initWindow()
use_watchdog = bool(watchdog_enabled_setting);
}
- bool send_reports = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT;
- if(use_watchdog && send_reports)
+ if (use_watchdog)
{
LLWatchdog::getInstance()->init(watchdog_killer_callback);
}
@@ -4012,6 +4003,8 @@ public:
static LLFastTimer::DeclareTimer FTM_AUDIO_UPDATE("Update Audio");
static LLFastTimer::DeclareTimer FTM_CLEANUP("Cleanup");
+static LLFastTimer::DeclareTimer FTM_CLEANUP_DRAWABLES("Drawables");
+static LLFastTimer::DeclareTimer FTM_CLEANUP_OBJECTS("Objects");
static LLFastTimer::DeclareTimer FTM_IDLE_CB("Idle Callbacks");
static LLFastTimer::DeclareTimer FTM_LOD_UPDATE("Update LOD");
static LLFastTimer::DeclareTimer FTM_OBJECTLIST_UPDATE("Update Objectlist");
@@ -4288,8 +4281,14 @@ void LLAppViewer::idle()
{
LLFastTimer t(FTM_CLEANUP);
- gObjectList.cleanDeadObjects();
- LLDrawable::cleanupDeadDrawables();
+ {
+ LLFastTimer t(FTM_CLEANUP_OBJECTS);
+ gObjectList.cleanDeadObjects();
+ }
+ {
+ LLFastTimer t(FTM_CLEANUP_DRAWABLES);
+ LLDrawable::cleanupDeadDrawables();
+ }
}
//
@@ -4513,7 +4512,7 @@ void LLAppViewer::idleShutdown()
void LLAppViewer::sendLogoutRequest()
{
- if(!mLogoutRequestSent)
+ if(!mLogoutRequestSent && gMessageSystem)
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_LogoutRequest);
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 714e0e6163..48d02dfeaa 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -361,46 +361,35 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
}
else
{
- const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-
- // Always generate the report, have the logger do the asking, and
- // don't wait for the logger before exiting (-> total cleanup).
- if (CRASH_BEHAVIOR_NEVER_SEND != cb)
- {
- // launch the actual crash logger
- const char* ask_dialog = "-dialog";
- if (CRASH_BEHAVIOR_ASK != cb)
- ask_dialog = ""; // omit '-dialog' option
- const char * cmdargv[] =
- {cmd.c_str(),
- ask_dialog,
- "-user",
- (char*)LLGridManager::getInstance()->getGridLabel().c_str(),
- "-name",
- LLAppViewer::instance()->getSecondLifeTitle().c_str(),
- NULL};
- fflush(NULL);
- pid_t pid = fork();
- if (pid == 0)
- { // child
- execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
- llwarns << "execv failure when trying to start " << cmd << llendl;
- _exit(1); // avoid atexit()
+ // launch the actual crash logger
+ const char * cmdargv[] =
+ {cmd.c_str(),
+ "-user",
+ (char*)LLGridManager::getInstance()->getGridLabel().c_str(),
+ "-name",
+ LLAppViewer::instance()->getSecondLifeTitle().c_str(),
+ NULL};
+ fflush(NULL);
+ pid_t pid = fork();
+ if (pid == 0)
+ { // child
+ execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
+ llwarns << "execv failure when trying to start " << cmd << llendl;
+ _exit(1); // avoid atexit()
+ }
+ else
+ {
+ if (pid > 0)
+ {
+ // DO NOT wait for child proc to die; we want
+ // the logger to outlive us while we quit to
+ // free up the screen/keyboard/etc.
+ ////int childExitStatus;
+ ////waitpid(pid, &childExitStatus, 0);
}
else
{
- if (pid > 0)
- {
- // DO NOT wait for child proc to die; we want
- // the logger to outlive us while we quit to
- // free up the screen/keyboard/etc.
- ////int childExitStatus;
- ////waitpid(pid, &childExitStatus, 0);
- }
- else
- {
- llwarns << "fork failure." << llendl;
- }
+ llwarns << "fork failure." << llendl;
}
}
// Sometimes signals don't seem to quit the viewer. Also, we may
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 445bd208ef..f94c843ad9 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -518,11 +518,7 @@ void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)
}
else
{
- S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
- if(cb != CRASH_BEHAVIOR_NEVER_SEND)
- {
- _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
- }
+ _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
}
}
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index d7ba4ea470..5b9a449be1 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -449,7 +449,7 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
std::string result = content["state"];
LLUUID new_id = content["new_asset"];
- llinfos << "result: " << result << "new_id:" << new_id << llendl;
+ llinfos << "result: " << result << " new_id: " << new_id << llendl;
if (result == "complete"
&& mBakedUploadData != NULL)
{ // Invoke
diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h
index 70871b62e2..381b919c4a 100644
--- a/indra/newview/llassetuploadresponders.h
+++ b/indra/newview/llassetuploadresponders.h
@@ -112,6 +112,7 @@ private:
struct LLBakedUploadData;
class LLSendTexLayerResponder : public LLAssetUploadResponder
{
+ LOG_CLASS(LLSendTexLayerResponder);
public:
LLSendTexLayerResponder(const LLSD& post_data,
const LLUUID& vfile_id,
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index cd6754facd..5ccd5ff073 100644..100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -320,6 +320,7 @@ static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarNa
url(url).
id(agent_id).
show_chrome(show_chrome).
+ window_class("profile").
preferred_media_size(profile_rect));
}
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 19dba3f917..19dba3f917 100644..100755
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index 18ae6107e7..c7fc45f61e 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -27,10 +27,16 @@
#include "lldateutil.h"
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/posix_time/ptime.hpp>
+
// Linden libraries
#include "lltrans.h"
#include "llui.h"
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
static S32 DAYS_PER_MONTH_NOLEAP[] =
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static S32 DAYS_PER_MONTH_LEAP[] =
@@ -186,3 +192,24 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string)
//{
// return ageFromDateISO(date_string, LLDate::now());
//}
+
+S32 LLDateUtil::secondsSinceEpochFromString(const std::string& format, const std::string& str)
+{
+ date_input_facet *facet = new date_input_facet(format);
+
+ std::stringstream ss;
+ ss << str;
+ ss.imbue(std::locale(ss.getloc(), facet));
+
+ date d;
+ ss >> d;
+
+ ptime time_t_date(d);
+ ptime time_t_epoch(date(1970,1,1));
+
+ // We assume that the date defined by str is in UTC, so the difference
+ // is calculated with no time zone corrections.
+ time_duration diff = time_t_date - time_t_epoch;
+
+ return diff.total_seconds();
+}
diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h
index 2843a357c9..f027d360f7 100644
--- a/indra/newview/lldateutil.h
+++ b/indra/newview/lldateutil.h
@@ -69,6 +69,20 @@ namespace LLDateUtil
//std::string ageFromDateISO(const std::string& date_string);
//std::string ageFromDate(S32 born_year, S32 born_month, S32 born_day, const LLDate& now);
+
+ /**
+ * Convert a string of a specified date format into seconds since the Epoch.
+ *
+ * Many of the format flags are those used by strftime(...), but not all.
+ * For the full list of supported time format specifiers
+ * see http://www.boost.org/doc/libs/1_47_0/doc/html/date_time/date_time_io.html#date_time.format_flags
+ *
+ * @param format Format characters string. Example: "%A %b %d, %Y"
+ * @param str Date string containing the time in specified format.
+ *
+ * @return Number of seconds since 01/01/1970 UTC.
+ */
+ S32 secondsSinceEpochFromString(const std::string& format, const std::string& str);
}
#endif
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index fa7d6e2a40..286284f828 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -190,15 +190,16 @@ void LLDrawPool::renderPostDeferred(S32 pass)
//virtual
void LLDrawPool::endRenderPass( S32 pass )
{
- for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
+ /*for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
{ //dummy cleanup of any currently bound textures
if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
{
gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
gGL.getTexUnit(i)->disable();
}
- }
+ }*/
+ //make sure channel 0 is active channel
gGL.getTexUnit(0)->activate();
}
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 5e4d5319ec..ddcf42e523 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -138,6 +138,7 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
gPipeline.mDeferredDepth.bindTarget();
simple_shader = NULL;
fullbright_shader = NULL;
+ gObjectFullbrightProgram.bind();
}
deferred_render = TRUE;
@@ -156,6 +157,7 @@ void LLDrawPoolAlpha::endPostDeferredPass(S32 pass)
{
gPipeline.mDeferredDepth.flush();
gPipeline.mScreen.bindTarget();
+ gObjectFullbrightProgram.unbind();
}
deferred_render = FALSE;
@@ -238,7 +240,7 @@ void LLDrawPoolAlpha::render(S32 pass)
fullbright_shader->bind();
}
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
- LLGLSLShader::bindNoShader();
+ //LLGLSLShader::bindNoShader();
}
else
{
@@ -295,16 +297,24 @@ void LLDrawPoolAlpha::render(S32 pass)
if (sShowDebugAlpha)
{
- if(gPipeline.canUseWindLightShaders())
+ BOOL shaders = gPipeline.canUseVertexShaders();
+ if(shaders)
{
- LLGLSLShader::bindNoShader();
+ gObjectFullbrightNonIndexedProgram.bind();
+ }
+ else
+ {
+ gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
}
- gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
glColor4f(1,0,0,1);
LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f);
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep, TRUE) ;
renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0);
+ if(shaders)
+ {
+ gObjectFullbrightNonIndexedProgram.unbind();
+ }
}
}
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 813b3820ee..d801f6df18 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -464,11 +464,15 @@ void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32&
}
}
}
- gGL.getTexUnit(diffuse_channel)->disable();
- gGL.getTexUnit(cube_channel)->disable();
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.getTexUnit(diffuse_channel)->disable();
+ gGL.getTexUnit(cube_channel)->disable();
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
}
void LLDrawPoolBump::endShiny(bool invisible)
@@ -583,19 +587,19 @@ void LLDrawPoolBump::endFullbrightShiny()
cube_map->disable();
cube_map->restoreMatrix();
- if (diffuse_channel != 0)
+ /*if (diffuse_channel != 0)
{
shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
}
gGL.getTexUnit(0)->activate();
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);*/
shader->unbind();
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ //gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ //gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
diffuse_channel = -1;
cube_channel = 0;
@@ -706,36 +710,44 @@ void LLDrawPoolBump::beginBump(U32 pass)
// Optional second pass: emboss bump map
stop_glerror();
- // TEXTURE UNIT 0
- // Output.rgb = texture at texture coord 0
- gGL.getTexUnit(0)->activate();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gObjectBumpProgram.bind();
+ }
+ else
+ {
+ // TEXTURE UNIT 0
+ // Output.rgb = texture at texture coord 0
+ gGL.getTexUnit(0)->activate();
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
- gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
+ gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
- // TEXTURE UNIT 1
- gGL.getTexUnit(1)->activate();
+ // TEXTURE UNIT 1
+ gGL.getTexUnit(1)->activate();
- gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
+
+ gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA);
+ gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
- gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA);
- gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
+ // src = tex0 + (1 - tex1) - 0.5
+ // = (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5
+ // = (1 + bump0 - bump1) / 2
- // src = tex0 + (1 - tex1) - 0.5
- // = (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5
- // = (1 + bump0 - bump1) / 2
+ // Blend: src * dst + dst * src
+ // = 2 * src * dst
+ // = 2 * ((1 + bump0 - bump1) / 2) * dst [0 - 2 * dst]
+ // = (1 + bump0 - bump1) * dst.rgb
+ // = dst.rgb + dst.rgb * (bump0 - bump1)
+
+ gGL.getTexUnit(0)->activate();
+ gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
+ }
- // Blend: src * dst + dst * src
- // = 2 * src * dst
- // = 2 * ((1 + bump0 - bump1) / 2) * dst [0 - 2 * dst]
- // = (1 + bump0 - bump1) * dst.rgb
- // = dst.rgb + dst.rgb * (bump0 - bump1)
gGL.setSceneBlendType(LLRender::BT_MULT_X2);
- gGL.getTexUnit(0)->activate();
stop_glerror();
-
- gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
}
//static
@@ -765,14 +777,21 @@ void LLDrawPoolBump::endBump(U32 pass)
return;
}
- // Disable texture unit 1
- gGL.getTexUnit(1)->activate();
- gGL.getTexUnit(1)->disable();
- gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gObjectBumpProgram.unbind();
+ }
+ else
+ {
+ // Disable texture blending on unit 1
+ gGL.getTexUnit(1)->activate();
+ //gGL.getTexUnit(1)->disable();
+ gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
- // Disable texture unit 0
- gGL.getTexUnit(0)->activate();
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ // Disable texture blending on unit 0
+ gGL.getTexUnit(0)->activate();
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
@@ -1407,6 +1426,11 @@ void LLDrawPoolInvisible::render(S32 pass)
{ //render invisiprims
LLFastTimer t(FTM_RENDER_INVISIBLE);
+ if (gPipeline.canUseVertexShaders())
+ {
+ gOcclusionProgram.bind();
+ }
+
U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;
glStencilMask(0);
gGL.setColorMask(false, false);
@@ -1414,6 +1438,11 @@ void LLDrawPoolInvisible::render(S32 pass)
gGL.setColorMask(true, false);
glStencilMask(0xFFFFFFFF);
+ if (gPipeline.canUseVertexShaders())
+ {
+ gOcclusionProgram.unbind();
+ }
+
if (gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY))
{
beginShiny(true);
diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp
index 5dbb27cabb..224f149c6b 100644
--- a/indra/newview/lldrawpoolsimple.cpp
+++ b/indra/newview/lldrawpoolsimple.cpp
@@ -49,6 +49,8 @@ void LLDrawPoolGlow::beginPostDeferredPass(S32 pass)
gDeferredFullbrightProgram.bind();
}
+static LLFastTimer::DeclareTimer FTM_RENDER_GLOW_PUSH("Glow Push");
+
void LLDrawPoolGlow::renderPostDeferred(S32 pass)
{
LLFastTimer t(FTM_RENDER_GLOW);
@@ -62,7 +64,11 @@ void LLDrawPoolGlow::renderPostDeferred(S32 pass)
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.setColorMask(false, true);
- pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+
+ {
+ LLFastTimer t(FTM_RENDER_GLOW_PUSH);
+ pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ }
gGL.setColorMask(true, false);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -374,10 +380,14 @@ void LLDrawPoolFullbright::endRenderPass(S32 pass)
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
LLRenderPass::endRenderPass(pass);
+ stop_glerror();
+
if (mVertexShaderLevel > 0)
{
fullbright_shader->unbind();
}
+
+ stop_glerror();
}
void LLDrawPoolFullbright::render(S32 pass)
@@ -385,6 +395,8 @@ void LLDrawPoolFullbright::render(S32 pass)
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ stop_glerror();
+
if (mVertexShaderLevel > 0)
{
fullbright_shader->bind();
@@ -398,6 +410,8 @@ void LLDrawPoolFullbright::render(S32 pass)
U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;
renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
}
+
+ stop_glerror();
}
S32 LLDrawPoolFullbright::getNumPasses()
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 030d6e1110..efffb2df9e 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -82,6 +82,10 @@ void LLDrawPoolSky::render(S32 pass)
mShader = &gObjectFullbrightWaterProgram;
mShader->bind();
}
+ else if (LLGLSLShader::sNoFixedFunction)
+ { //just use the UI shader (generic single texture no lighting)
+ gUIProgram.bind();
+ }
else
{
// don't use shaders!
@@ -139,6 +143,7 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)
if (LLSkyTex::doInterpolate())
{
+
LLGLEnable blend(GL_BLEND);
mSkyTex[side].bindTexture(FALSE);
glColor4f(1, 1, 1, LLSkyTex::getInterpVal()); // lighting is disabled
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 84eeace9c6..3daa0f8261 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -143,7 +143,7 @@ void LLDrawPoolTerrain::beginRenderPass( S32 pass )
void LLDrawPoolTerrain::endRenderPass( S32 pass )
{
LLFastTimer t(FTM_RENDER_TERRAIN);
- LLFacePool::endRenderPass(pass);
+ //LLFacePool::endRenderPass(pass);
if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0) {
sShader->unbind();
@@ -215,8 +215,10 @@ void LLDrawPoolTerrain::render(S32 pass)
{ //use fullbright shader for highlighting
LLGLSLShader* old_shader = sShader;
sShader->unbind();
- sShader = &gObjectFullbrightProgram;
+ sShader = &gObjectFullbrightNonIndexedProgram;
sShader->bind();
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.0f, -1.0f);
renderOwnership();
sShader = old_shader;
sShader->bind();
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 81c796b146..429e06b227 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -73,7 +73,7 @@ void LLDrawPoolTree::beginRenderPass(S32 pass)
shader = &gObjectSimpleNonIndexedProgram;
}
- if (gPipeline.canUseWindLightShadersOnObjects())
+ if (gPipeline.canUseVertexShaders())
{
shader->bind();
}
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index bf79c2100c..f9fd501072 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -189,16 +189,31 @@ void LLDrawPoolWLSky::renderStars(void) const
glRotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
// gl_FragColor.rgb = gl_Color.rgb;
// gl_FragColor.a = gl_Color.a * star_alpha.a;
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
- gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA);
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gCustomAlphaProgram.bind();
+ gCustomAlphaProgram.uniform1f("custom_alpha", star_alpha.mV[3]);
+ }
+ else
+ {
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
+ gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA);
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV);
+ }
gSky.mVOWLSkyp->drawStars();
gGL.popMatrix();
-
- // and disable the combiner states
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gCustomAlphaProgram.unbind();
+ }
+ else
+ {
+ // and disable the combiner states
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
}
void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const
@@ -242,6 +257,10 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
if (gSky.mVOSkyp->getMoon().getDraw() && face->getGeomCount())
{
+ if (gPipeline.canUseVertexShaders())
+ {
+ gUIProgram.bind();
+ }
// *NOTE: even though we already bound this texture above for the
// stars register combiners, we bind again here for defensive reasons,
// since LLImageGL::bind detects that it's a noop, and optimizes it out.
@@ -257,6 +276,11 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
LLFacePool::LLOverrideFaceColor color_override(this, color);
face->renderIndexed();
+
+ if (gPipeline.canUseVertexShaders())
+ {
+ gUIProgram.unbind();
+ }
}
}
diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp
new file mode 100644
index 0000000000..7ed22d68f6
--- /dev/null
+++ b/indra/newview/llestateinfomodel.cpp
@@ -0,0 +1,230 @@
+/**
+ * @file llestateinfomodel.cpp
+ * @brief Estate info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llestateinfomodel.h"
+
+// libs
+#include "llhttpclient.h"
+#include "llregionflags.h"
+#include "message.h"
+
+// viewer
+#include "llagent.h"
+#include "llfloaterregioninfo.h" // for invoice id
+#include "llviewerregion.h"
+
+LLEstateInfoModel::LLEstateInfoModel()
+: mID(0)
+, mFlags(0)
+, mSunHour(0)
+{
+}
+
+boost::signals2::connection LLEstateInfoModel::setUpdateCallback(const update_signal_t::slot_type& cb)
+{
+ return mUpdateSignal.connect(cb);
+}
+
+boost::signals2::connection LLEstateInfoModel::setCommitCallback(const update_signal_t::slot_type& cb)
+{
+ return mCommitSignal.connect(cb);
+}
+
+void LLEstateInfoModel::sendEstateInfo()
+{
+ if (!commitEstateInfoCaps())
+ {
+ // the caps method failed, try the old way
+ LLFloaterRegionInfo::nextInvoice();
+ commitEstateInfoDataserver();
+ }
+}
+
+bool LLEstateInfoModel::getUseFixedSun() const { return mFlags & REGION_FLAGS_SUN_FIXED; }
+bool LLEstateInfoModel::getIsExternallyVisible() const { return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE; }
+bool LLEstateInfoModel::getAllowDirectTeleport() const { return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT; }
+bool LLEstateInfoModel::getDenyAnonymous() const { return mFlags & REGION_FLAGS_DENY_ANONYMOUS; }
+bool LLEstateInfoModel::getDenyAgeUnverified() const { return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED; }
+bool LLEstateInfoModel::getAllowVoiceChat() const { return mFlags & REGION_FLAGS_ALLOW_VOICE; }
+
+void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); }
+void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); }
+void LLEstateInfoModel::setAllowDirectTeleport(bool val) { setFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, val); }
+void LLEstateInfoModel::setDenyAnonymous(bool val) { setFlag(REGION_FLAGS_DENY_ANONYMOUS, val); }
+void LLEstateInfoModel::setDenyAgeUnverified(bool val) { setFlag(REGION_FLAGS_DENY_AGEUNVERIFIED, val); }
+void LLEstateInfoModel::setAllowVoiceChat(bool val) { setFlag(REGION_FLAGS_ALLOW_VOICE, val); }
+
+void LLEstateInfoModel::update(const strings_t& strings)
+{
+ // NOTE: LLDispatcher extracts strings with an extra \0 at the
+ // end. If we pass the std::string direct to the UI/renderer
+ // it draws with a weird character at the end of the string.
+ mName = strings[0].c_str();
+ mOwnerID = LLUUID(strings[1].c_str());
+ mID = strtoul(strings[2].c_str(), NULL, 10);
+ mFlags = strtoul(strings[3].c_str(), NULL, 10);
+ mSunHour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
+
+ LL_DEBUGS("Windlight Sync") << "Received estate info: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << getInfoDump() << llendl;
+
+ // Update region owner.
+ LLViewerRegion* regionp = gAgent.getRegion();
+ regionp->setOwner(mOwnerID);
+
+ // Let interested parties know that estate info has been updated.
+ mUpdateSignal();
+}
+
+void LLEstateInfoModel::notifyCommit()
+{
+ mCommitSignal();
+}
+
+//== PRIVATE STUFF ============================================================
+
+class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
+{
+public:
+
+ // if we get a normal response, handle it here
+ virtual void result(const LLSD& content)
+ {
+ llinfos << "Committed estate info" << llendl;
+ LLEstateInfoModel::instance().notifyCommit();
+ }
+
+ // if we get an error response
+ virtual void error(U32 status, const std::string& reason)
+ {
+ llwarns << "Failed to commit estate info (" << status << "): " << reason << llendl;
+ }
+};
+
+// tries to send estate info using a cap; returns true if it succeeded
+bool LLEstateInfoModel::commitEstateInfoCaps()
+{
+ std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
+
+ if (url.empty())
+ {
+ // whoops, couldn't find the cap, so bail out
+ return false;
+ }
+
+ LLSD body;
+ body["estate_name" ] = getName();
+ body["sun_hour" ] = getSunHour();
+
+ body["is_sun_fixed" ] = getUseFixedSun();
+ body["is_externally_visible"] = getIsExternallyVisible();
+ body["allow_direct_teleport"] = getAllowDirectTeleport();
+ body["deny_anonymous" ] = getDenyAnonymous();
+ body["deny_age_unverified" ] = getDenyAgeUnverified();
+ body["allow_voice_chat" ] = getAllowVoiceChat();
+
+ body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
+
+ LL_DEBUGS("Windlight Sync") << "Sending estate caps: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << body << LL_ENDL;
+
+ // we use a responder so that we can re-get the data after committing to the database
+ LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder);
+ return true;
+}
+
+/* This is the old way of doing things, is deprecated, and should be
+ deleted when the dataserver model can be removed */
+// key = "estatechangeinfo"
+// strings[0] = str(estate_id) (added by simulator before relay - not here)
+// strings[1] = estate_name
+// strings[2] = str(estate_flags)
+// strings[3] = str((S32)(sun_hour * 1024.f))
+void LLEstateInfoModel::commitEstateInfoDataserver()
+{
+ LL_DEBUGS("Windlight Sync") << "Sending estate info: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << getInfoDump() << LL_ENDL;
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("EstateOwnerMessage");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
+
+ msg->nextBlock("MethodData");
+ msg->addString("Method", "estatechangeinfo");
+ msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", getName());
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", llformat("%u", getFlags()));
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", llformat("%d", (S32) (getSunHour() * 1024.0f)));
+
+ gAgent.sendMessage();
+}
+
+void LLEstateInfoModel::setFlag(U32 flag, bool val)
+{
+ if (val)
+ {
+ mFlags |= flag;
+ }
+ else
+ {
+ mFlags &= ~flag;
+ }
+}
+
+std::string LLEstateInfoModel::getInfoDump()
+{
+ LLSD dump;
+ dump["estate_name" ] = getName();
+ dump["sun_hour" ] = getSunHour();
+
+ dump["is_sun_fixed" ] = getUseFixedSun();
+ dump["is_externally_visible"] = getIsExternallyVisible();
+ dump["allow_direct_teleport"] = getAllowDirectTeleport();
+ dump["deny_anonymous" ] = getDenyAnonymous();
+ dump["deny_age_unverified" ] = getDenyAgeUnverified();
+ dump["allow_voice_chat" ] = getAllowVoiceChat();
+
+ std::stringstream dump_str;
+ dump_str << dump;
+ return dump_str.str();
+}
diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h
new file mode 100644
index 0000000000..56391eda91
--- /dev/null
+++ b/indra/newview/llestateinfomodel.h
@@ -0,0 +1,103 @@
+/**
+ * @file llestateinfomodel.h
+ * @brief Estate info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLESTATEINFOMODEL_H
+#define LL_LLESTATEINFOMODEL_H
+
+class LLMessageSystem;
+
+#include "llsingleton.h"
+
+/**
+ * Contains estate info, notifies interested parties of its changes.
+ */
+class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel>
+{
+ LOG_CLASS(LLEstateInfoModel);
+
+public:
+ typedef boost::signals2::signal<void()> update_signal_t;
+ boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb); /// the model has been externally updated
+ boost::signals2::connection setCommitCallback(const update_signal_t::slot_type& cb); /// our changes have been applied
+
+ void sendEstateInfo(); /// send estate info to the simulator
+
+ // getters
+ bool getUseFixedSun() const;
+ bool getIsExternallyVisible() const;
+ bool getAllowDirectTeleport() const;
+ bool getDenyAnonymous() const;
+ bool getDenyAgeUnverified() const;
+ bool getAllowVoiceChat() const;
+
+ const std::string& getName() const { return mName; }
+ const LLUUID& getOwnerID() const { return mOwnerID; }
+ U32 getID() const { return mID; }
+ F32 getSunHour() const { return getUseFixedSun() ? mSunHour : 0.f; }
+
+ // setters
+ void setUseFixedSun(bool val);
+ void setIsExternallyVisible(bool val);
+ void setAllowDirectTeleport(bool val);
+ void setDenyAnonymous(bool val);
+ void setDenyAgeUnverified(bool val);
+ void setAllowVoiceChat(bool val);
+
+ void setSunHour(F32 sun_hour) { mSunHour = sun_hour; }
+
+protected:
+ typedef std::vector<std::string> strings_t;
+
+ friend class LLSingleton<LLEstateInfoModel>;
+ friend class LLDispatchEstateUpdateInfo;
+ friend class LLEstateChangeInfoResponder;
+
+ LLEstateInfoModel();
+
+ /// refresh model with data from the incoming server message
+ void update(const strings_t& strings);
+
+ void notifyCommit();
+
+private:
+ bool commitEstateInfoCaps();
+ void commitEstateInfoDataserver();
+ U32 getFlags() const { return mFlags; }
+ void setFlag(U32 flag, bool val);
+ std::string getInfoDump();
+
+ // estate info
+ std::string mName; /// estate name
+ LLUUID mOwnerID; /// estate owner id
+ U32 mID; /// estate id
+ U32 mFlags; /// estate flags
+ F32 mSunHour; /// estate sun hour
+
+ update_signal_t mUpdateSignal; /// emitted when we receive update from sim
+ update_signal_t mCommitSignal; /// emitted when our update gets applied to sim
+};
+
+#endif // LL_LLESTATEINFOMODEL_H
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index b6566fcbd0..432e61f6d8 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -1051,6 +1051,13 @@ bool LLFace::canRenderAsMask()
static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_POSITION("Position");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_NORMAL("Normal");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_TEXTURE("Texture");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_COLOR("Color");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_BINORMAL("Binormal");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index");
BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const S32 &f,
@@ -1064,6 +1071,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
S32 num_vertices = (S32)vf.mNumVertices;
S32 num_indices = (S32) vf.mNumIndices;
+ bool map_range = gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange;
+
if (mVertexBuffer.notNull())
{
if (num_indices + (S32) mIndicesIndex > mVertexBuffer->getNumIndices())
@@ -1182,7 +1191,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
// INDICES
if (full_rebuild)
{
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, true);
+ LLFastTimer t(FTM_FACE_GEOM_INDEX);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, map_range);
__m128i* dst = (__m128i*) indicesp.get();
__m128i* src = (__m128i*) vf.mIndices;
@@ -1201,7 +1211,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
indicesp[i] = vf.mIndices[i]+index_offset;
}
- mVertexBuffer->setBuffer(0);
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
}
LLMatrix4a mat_normal;
@@ -1215,6 +1228,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (rebuild_tcoord)
{
+ LLFastTimer t(FTM_FACE_GEOM_TEXTURE);
bool do_xform;
if (tep)
@@ -1422,11 +1436,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
- mVertexBuffer->setBuffer(0);
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
}
else
{ //either bump mapped or in atlas, just do the whole expensive loop
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, true);
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range);
std::vector<LLVector2> bump_tc;
@@ -1566,12 +1583,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
- mVertexBuffer->setBuffer(0);
-
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
if (do_bump)
{
- mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, true);
+ mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, map_range);
for (S32 i = 0; i < num_vertices; i++)
{
@@ -1601,14 +1620,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
*tex_coords2++ = tc;
}
- mVertexBuffer->setBuffer(0);
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
}
}
}
if (rebuild_pos)
{
- mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, true);
+ LLFastTimer t(FTM_FACE_GEOM_POSITION);
+ llassert(num_vertices > 0);
+
+ mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range);
vertices = (LLVector4a*) vert.get();
LLMatrix4a mat_vert;
@@ -1636,13 +1661,25 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
index_dst += 4;
}
while (index_dst < index_end);
-
- mVertexBuffer->setBuffer(0);
+
+ S32 aligned_pad_vertices = mGeomCount - num_vertices;
+ LLVector4a* last_vec = end - 1;
+ while (aligned_pad_vertices > 0)
+ {
+ --aligned_pad_vertices;
+ *dst++ = *last_vec;
+ }
+
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
}
if (rebuild_normal)
{
- mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, true);
+ LLFastTimer t(FTM_FACE_GEOM_NORMAL);
+ mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range);
normals = (LLVector4a*) norm.get();
for (S32 i = 0; i < num_vertices; i++)
@@ -1653,12 +1690,16 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
normals[i] = normal;
}
- mVertexBuffer->setBuffer(0);
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
}
if (rebuild_binormal)
{
- mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, true);
+ LLFastTimer t(FTM_FACE_GEOM_BINORMAL);
+ mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range);
binormals = (LLVector4a*) binorm.get();
for (S32 i = 0; i < num_vertices; i++)
@@ -1669,20 +1710,28 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
binormals[i] = binormal;
}
- mVertexBuffer->setBuffer(0);
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
}
if (rebuild_weights && vf.mWeights)
{
- mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, true);
+ LLFastTimer t(FTM_FACE_GEOM_WEIGHTS);
+ mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range);
weights = (LLVector4a*) wght.get();
LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
- mVertexBuffer->setBuffer(0);
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
}
if (rebuild_color)
{
- mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, true);
+ LLFastTimer t(FTM_FACE_GEOM_COLOR);
+ mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, map_range);
LLVector4a src;
@@ -1703,7 +1752,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
dst[i] = src;
}
- mVertexBuffer->setBuffer(0);
+ if (map_range)
+ {
+ mVertexBuffer->setBuffer(0);
+ }
}
if (rebuild_tcoord)
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 83844048d1..0ea0e41dfa 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -769,6 +769,10 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("TexUnit8orLess");
}
+ if (gGLManager.mHasMapBufferRange)
+ {
+ maskFeatures("MapBufferRange");
+ }
// now mask by gpu string
// Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index c6743ca13b..2939d31087 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -27,7 +27,6 @@
#include "llviewerprecompiledheaders.h"
#include "llfloaterauction.h"
-#include "llfloaterregioninfo.h"
#include "llgl.h"
#include "llimagej2c.h"
@@ -40,6 +39,7 @@
#include "llagent.h"
#include "llcombobox.h"
+#include "llestateinfomodel.h"
#include "llmimetypes.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
@@ -114,16 +114,9 @@ void LLFloaterAuction::initialize()
getChildView("reset_parcel_btn")->setEnabled(TRUE);
getChildView("start_auction_btn")->setEnabled(TRUE);
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (panel)
- { // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
- U32 estate_id = panel->getEstateID();
- getChildView("sell_to_anyone_btn")->setEnabled((estate_id == ESTATE_TEEN || estate_id == 0));
- }
- else
- { // Don't have the panel up, so don't know if we're on the teen grid or not. Default to enabling it
- getChildView("sell_to_anyone_btn")->setEnabled(TRUE);
- }
+ U32 estate_id = LLEstateInfoModel::instance().getID();
+ // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
+ getChildView("sell_to_anyone_btn")->setEnabled(estate_id == ESTATE_TEEN || estate_id == 0);
}
else
{
diff --git a/indra/newview/llfloaterdeleteenvpreset.cpp b/indra/newview/llfloaterdeleteenvpreset.cpp
index 4fefd2242a..d08aa81cfe 100644
--- a/indra/newview/llfloaterdeleteenvpreset.cpp
+++ b/indra/newview/llfloaterdeleteenvpreset.cpp
@@ -258,7 +258,7 @@ void LLFloaterDeleteEnvPreset::populateDayCyclesList()
void LLFloaterDeleteEnvPreset::postPopulate()
{
// Handle empty list and empty selection.
- bool has_selection = mPresetCombo->getItemCount() > 1 && mPresetCombo->getSelectedValue().isDefined();
+ bool has_selection = mPresetCombo->getItemCount() > 0 && mPresetCombo->getSelectedValue().isDefined();
if (!has_selection)
{
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 0d0c1f594d..9b7593ce61 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1818,6 +1818,7 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
mClearBtn(NULL),
mMatureCtrl(NULL),
mPushRestrictionCtrl(NULL),
+ mSeeAvatarsCtrl(NULL),
mParcel(parcel)
{
}
@@ -1860,6 +1861,9 @@ BOOL LLPanelLandOptions::postBuild()
mPushRestrictionCtrl = getChild<LLCheckBoxCtrl>( "PushRestrictCheck");
childSetCommitCallback("PushRestrictCheck", onCommitAny, this);
+ mSeeAvatarsCtrl = getChild<LLCheckBoxCtrl>( "SeeAvatarsCheck");
+ childSetCommitCallback("SeeAvatarsCheck", onCommitAny, this);
+
mCheckShowDirectory = getChild<LLCheckBoxCtrl>( "ShowDirectoryCheck");
childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this);
@@ -1952,7 +1956,7 @@ void LLPanelLandOptions::refresh()
mCheckEditLand ->set(FALSE);
mCheckEditLand ->setEnabled(FALSE);
-
+
mCheckSafe ->set(FALSE);
mCheckSafe ->setEnabled(FALSE);
@@ -1968,6 +1972,9 @@ void LLPanelLandOptions::refresh()
mPushRestrictionCtrl->set(FALSE);
mPushRestrictionCtrl->setEnabled(FALSE);
+ mSeeAvatarsCtrl->set(TRUE);
+ mSeeAvatarsCtrl->setEnabled(FALSE);
+
mLandingTypeCombo->setCurrentByIndex(0);
mLandingTypeCombo->setEnabled(FALSE);
@@ -2001,7 +2008,7 @@ void LLPanelLandOptions::refresh()
BOOL can_change_terraform = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_EDIT);
mCheckEditLand ->set( parcel->getAllowTerraform() );
mCheckEditLand ->setEnabled( can_change_terraform );
-
+
mCheckSafe ->set( !parcel->getAllowDamage() );
mCheckSafe ->setEnabled( can_change_options );
@@ -2027,6 +2034,10 @@ void LLPanelLandOptions::refresh()
mPushRestrictionCtrl->setEnabled(can_change_options);
}
+ mSeeAvatarsCtrl->set(parcel->getSeeAVs());
+ mSeeAvatarsCtrl->setLabel(getString("see_avs_text"));
+ mSeeAvatarsCtrl->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData());
+
BOOL can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel,
GP_LAND_SET_LANDING_POINT);
mLandingTypeCombo->setCurrentByIndex((S32)parcel->getLandingType());
@@ -2231,6 +2242,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
BOOL allow_publish = FALSE;
BOOL mature_publish = self->mMatureCtrl->get();
BOOL push_restriction = self->mPushRestrictionCtrl->get();
+ BOOL see_avs = self->mSeeAvatarsCtrl->get();
BOOL show_directory = self->mCheckShowDirectory->get();
// we have to get the index from a lookup, not from the position in the dropdown!
S32 category_index = LLParcel::getCategoryFromString(self->mCategoryCombo->getSelectedValue());
@@ -2264,6 +2276,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
parcel->setCategory((LLParcel::ECategory)category_index);
parcel->setLandingType((LLParcel::ELandingType)landing_type_index);
parcel->setSnapshotID(snapshot_id);
+ parcel->setSeeAVs(see_avs);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 8a70fa24d8..6fceca1acd 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -348,6 +348,7 @@ private:
LLCheckBoxCtrl *mMatureCtrl;
LLCheckBoxCtrl *mPushRestrictionCtrl;
+ LLCheckBoxCtrl *mSeeAvatarsCtrl;
LLSafeHandle<LLParcelSelection>& mParcel;
};
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 7848484ac6..5fd262a720 100644..100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -751,10 +751,7 @@ void LLFloaterPreference::onBtnOK()
closeFloater(false);
LLUIColorTable::instance().saveUserSettings();
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- // save all settings, even if equals defaults
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
}
else
{
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index dd12fa64d3..3f00ba39c7 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -887,18 +887,14 @@ void LLFloaterProperties::dirtyAll()
LLMultiProperties::LLMultiProperties()
: LLMultiFloater(LLSD())
{
- // *TODO: There should be a .xml file for this
- const LLRect& nextrect = LLFloaterReg::getFloaterRect("properties"); // place where the next properties should show up
- if (nextrect.getWidth() > 0)
- {
- setRect(nextrect);
- }
- else
- {
- // start with a small rect in the top-left corner ; will get resized
- LLRect rect;
- rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20);
- setRect(rect);
+ // start with a small rect in the top-left corner ; will get resized
+ LLRect rect;
+ rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20);
+ setRect(rect);
+ LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup("properties");
+ if (last_floater)
+ {
+ stackWith(*last_floater);
}
setTitle(LLTrans::getString("MultiPropertiesTitle"));
buildTabContainer();
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 07c0878877..538c5e3b88 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -54,6 +54,7 @@
#include "llcombobox.h"
#include "lldaycyclemanager.h"
#include "llenvmanager.h"
+#include "llestateinfomodel.h"
#include "llfilepicker.h"
#include "llfloatergodtools.h" // for send_sim_wide_deletes()
#include "llfloatertopobjects.h" // added to fix SL-32336
@@ -317,11 +318,8 @@ void LLFloaterRegionInfo::processEstateOwnerRequest(LLMessageSystem* msg,void**)
// static
void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
{
- LL_DEBUGS("Windlight") << "Processing region info" << LL_ENDL;
-
LLPanel* panel;
LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
- llinfos << "LLFloaterRegionInfo::processRegionInfo" << llendl;
if(!floater)
{
return;
@@ -330,6 +328,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
// We need to re-request environment setting here,
// otherwise after we apply (send) updated region settings we won't get them back,
// so our environment won't be updated.
+ // This is also the way to know about externally changed region environment.
LLEnvManagerNew::instance().requestRegionSettings();
LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
@@ -1365,6 +1364,9 @@ LLPanelEstateInfo::LLPanelEstateInfo()
: LLPanelRegionInfo(),
mEstateID(0) // invalid
{
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+ estate_info.setCommitCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));
+ estate_info.setUpdateCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));
}
// static
@@ -1387,29 +1389,6 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
estate_dispatch_initialized = true;
}
-#ifndef TMP_DISABLE_WLES
-// Disables the sun-hour slider and the use fixed time check if the use global time is check
-void LLPanelEstateInfo::onChangeUseGlobalTime()
-{
- bool enabled = !getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean();
- getChildView("sun_hour_slider")->setEnabled(enabled);
- getChildView("fixed_sun_check")->setEnabled(enabled);
- getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(FALSE));
- enableButton("apply_btn");
-}
-
-// Enables the sun-hour slider if the fixed-sun checkbox is set
-void LLPanelEstateInfo::onChangeFixedSun()
-{
- bool enabled = !getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
- getChildView("use_global_time_check")->setEnabled(enabled);
- getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(FALSE));
- enableButton("apply_btn");
-}
-#endif // TMP_DISABLE_WLES
-
-
-
//---------------------------------------------------------------------------
// Add/Remove estate access button callbacks
//---------------------------------------------------------------------------
@@ -1612,10 +1591,7 @@ std::string all_estates_text()
// static
bool LLPanelEstateInfo::isLindenEstate()
{
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (!panel) return false;
-
- U32 estate_id = panel->getEstateID();
+ U32 estate_id = LLEstateInfoModel::instance().getID();
return (estate_id <= ESTATE_LAST_LINDEN);
}
@@ -1977,7 +1953,7 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
// Can't ban people from mainland, orientation islands, etc. because this
// creates much network traffic and server load.
// Disable their accounts in CSR tool instead.
- bool linden_estate = (getEstateID() <= ESTATE_LAST_LINDEN);
+ bool linden_estate = isLindenEstate();
bool enable_ban = (god || owner || manager) && !linden_estate;
getChildView("add_banned_avatar_btn")->setEnabled(enable_ban);
getChildView("remove_banned_avatar_btn")->setEnabled(enable_ban);
@@ -1989,6 +1965,8 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
getChildView("add_estate_manager_btn")->setEnabled(god || owner);
getChildView("remove_estate_manager_btn")->setEnabled(god || owner);
getChildView("estate_manager_name_list")->setEnabled(god || owner);
+
+ refresh();
}
bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
@@ -2095,10 +2073,13 @@ BOOL LLPanelEstateInfo::postBuild()
void LLPanelEstateInfo::refresh()
{
+ // Disable access restriction controls if they make no sense.
bool public_access = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean();
+
getChildView("Only Allow")->setEnabled(public_access);
getChildView("limit_payment")->setEnabled(public_access);
getChildView("limit_age_verified")->setEnabled(public_access);
+
// if this is set to false, then the limit fields are meaningless and should be turned off
if (public_access == false)
{
@@ -2107,6 +2088,39 @@ void LLPanelEstateInfo::refresh()
}
}
+void LLPanelEstateInfo::refreshFromEstate()
+{
+ const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+
+ getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName());
+ setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString());
+
+ getChild<LLUICtrl>("externally_visible_check")->setValue(estate_info.getIsExternallyVisible());
+ getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat());
+ getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport());
+ getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous());
+ getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified());
+
+ // If visible from mainland, disable the access allowed
+ // UI, as anyone can teleport there.
+ // However, gods need to be able to edit the access list for
+ // linden estates, regardless of visibility, to allow object
+ // and L$ transfers.
+ {
+ bool visible_from_mainland = estate_info.getIsExternallyVisible();
+ bool god = gAgent.isGodlike();
+ bool linden_estate = isLindenEstate();
+
+ bool enable_agent = (!visible_from_mainland || (god && linden_estate));
+ bool enable_group = enable_agent;
+ bool enable_ban = !linden_estate;
+
+ setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
+ }
+
+ refresh();
+}
+
BOOL LLPanelEstateInfo::sendUpdate()
{
llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl;
@@ -2114,7 +2128,7 @@ BOOL LLPanelEstateInfo::sendUpdate()
LLNotification::Params params("ChangeLindenEstate");
params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2));
- if (getEstateID() <= ESTATE_LAST_LINDEN)
+ if (isLindenEstate())
{
// trying to change reserved estate, warn
LLNotifications::instance().add(params);
@@ -2133,13 +2147,21 @@ bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, con
switch(option)
{
case 0:
- // send the update
- if (!commitEstateInfoCaps())
{
- // the caps method failed, try the old way
- LLFloaterRegionInfo::nextInvoice();
- commitEstateInfoDataserver();
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+
+ // update model
+ estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore
+ estate_info.setIsExternallyVisible(getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean());
+ estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean());
+ estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean());
+ estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean());
+ estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean());
+
+ // send the update to sim
+ estate_info.sendEstateInfo();
}
+
// we don't want to do this because we'll get it automatically from the sim
// after the spaceserver processes it
// else
@@ -2196,6 +2218,8 @@ public:
// if we get a normal response, handle it here
virtual void result(const LLSD& content)
{
+ LL_INFOS("Windlight") << "Successfully committed estate info" << llendl;
+
// refresh the panel from the database
LLPanelEstateInfo* panel = dynamic_cast<LLPanelEstateInfo*>(mpPanel.get());
if (panel)
@@ -2212,178 +2236,6 @@ private:
LLHandle<LLPanel> mpPanel;
};
-// tries to send estate info using a cap; returns true if it succeeded
-bool LLPanelEstateInfo::commitEstateInfoCaps()
-{
- std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
-
- if (url.empty())
- {
- // whoops, couldn't find the cap, so bail out
- return false;
- }
-
- LLSD body;
- body["estate_name"] = getEstateName();
-
- body["is_externally_visible"] = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean();
- body["allow_direct_teleport"] = getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean();
- body["deny_anonymous" ] = getChild<LLUICtrl>("limit_payment")->getValue().asBoolean();
- body["deny_age_unverified" ] = getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean();
- body["allow_voice_chat" ] = getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean();
- body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
-
- // block fly is in estate database but not in estate UI, so we're not supporting it
- //body["block_fly" ] = getChild<LLUICtrl>("")->getValue().asBoolean();
-
- F32 sun_hour = getSunHour();
- if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean())
- {
- sun_hour = 0.f; // 0 = global time
- }
- body["sun_hour"] = sun_hour;
-
- // we use a responder so that we can re-get the data after committing to the database
- LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this));
- return true;
-}
-
-/* This is the old way of doing things, is deprecated, and should be
- deleted when the dataserver model can be removed */
-// key = "estatechangeinfo"
-// strings[0] = str(estate_id) (added by simulator before relay - not here)
-// strings[1] = estate_name
-// strings[2] = str(estate_flags)
-// strings[3] = str((S32)(sun_hour * 1024.f))
-void LLPanelEstateInfo::commitEstateInfoDataserver()
-{
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("EstateOwnerMessage");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
-
- msg->nextBlock("MethodData");
- msg->addString("Method", "estatechangeinfo");
- msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
-
- msg->nextBlock("ParamList");
- msg->addString("Parameter", getEstateName());
-
- std::string buffer;
- buffer = llformat("%u", computeEstateFlags());
- msg->nextBlock("ParamList");
- msg->addString("Parameter", buffer);
-
- F32 sun_hour = getSunHour();
- if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean())
- {
- sun_hour = 0.f; // 0 = global time
- }
-
- buffer = llformat("%d", (S32)(sun_hour*1024.0f));
- msg->nextBlock("ParamList");
- msg->addString("Parameter", buffer);
-
- gAgent.sendMessage();
-}
-
-void LLPanelEstateInfo::setEstateFlags(U32 flags)
-{
- getChild<LLUICtrl>("externally_visible_check")->setValue(LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) );
- getChild<LLUICtrl>("voice_chat_check")->setValue(
- LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE));
- getChild<LLUICtrl>("allow_direct_teleport")->setValue(LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) );
- getChild<LLUICtrl>("limit_payment")->setValue(LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) );
- getChild<LLUICtrl>("limit_age_verified")->setValue(LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) );
-
- refresh();
-}
-
-U32 LLPanelEstateInfo::computeEstateFlags()
-{
- U32 flags = 0;
-
- if (getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_EXTERNALLY_VISIBLE;
- }
-
- if ( getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean() )
- {
- flags |= REGION_FLAGS_ALLOW_VOICE;
- }
-
- if (getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_ALLOW_DIRECT_TELEPORT;
- }
-
- if (getChild<LLUICtrl>("limit_payment")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_DENY_ANONYMOUS;
- }
-
- if (getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_DENY_AGEUNVERIFIED;
- }
-
-
- return flags;
-}
-
-BOOL LLPanelEstateInfo::getGlobalTime()
-{
- return getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean();
-}
-
-void LLPanelEstateInfo::setGlobalTime(bool b)
-{
- getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(b));
- getChildView("fixed_sun_check")->setEnabled(LLSD(!b));
- getChildView("sun_hour_slider")->setEnabled(LLSD(!b));
- if (b)
- {
- getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(0.f));
- }
-}
-
-
-BOOL LLPanelEstateInfo::getFixedSun()
-{
- return getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
-}
-
-void LLPanelEstateInfo::setSunHour(F32 sun_hour)
-{
- if(sun_hour < 6.0f)
- {
- sun_hour = 24.0f + sun_hour;
- }
- getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(sun_hour));
-}
-
-F32 LLPanelEstateInfo::getSunHour()
-{
- if (getChildView("sun_hour_slider")->getEnabled())
- {
- return (F32)getChild<LLUICtrl>("sun_hour_slider")->getValue().asReal();
- }
- return 0.f;
-}
-
-const std::string LLPanelEstateInfo::getEstateName() const
-{
- return getChild<LLUICtrl>("estate_name")->getValue().asString();
-}
-
-void LLPanelEstateInfo::setEstateName(const std::string& name)
-{
- getChild<LLUICtrl>("estate_name")->setValue(LLSD(name));
-}
-
const std::string LLPanelEstateInfo::getOwnerName() const
{
return getChild<LLUICtrl>("estate_owner")->getValue().asString();
@@ -2886,55 +2738,10 @@ bool LLDispatchEstateUpdateInfo::operator()(
{
lldebugs << "Received estate update" << llendl;
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (!panel) return true;
-
- // NOTE: LLDispatcher extracts strings with an extra \0 at the
- // end. If we pass the std::string direct to the UI/renderer
- // it draws with a weird character at the end of the string.
- std::string estate_name = strings[0].c_str(); // preserve c_str() call!
- panel->setEstateName(estate_name);
-
- LLViewerRegion* regionp = gAgent.getRegion();
-
- LLUUID owner_id(strings[1]);
- regionp->setOwner(owner_id);
- // Update estate owner name in UI
- std::string owner_name = LLSLURL("agent", owner_id, "inspect").getSLURLString();
- panel->setOwnerName(owner_name);
-
- U32 estate_id = strtoul(strings[2].c_str(), NULL, 10);
- panel->setEstateID(estate_id);
-
- U32 flags = strtoul(strings[3].c_str(), NULL, 10);
- panel->setEstateFlags(flags);
-
- F32 sun_hour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
- if(sun_hour == 0 && (flags & REGION_FLAGS_SUN_FIXED ? FALSE : TRUE))
- {
- lldebugs << "Estate uses global time" << llendl;
- panel->setGlobalTime(TRUE);
- }
- else
- {
- lldebugs << "Estate sun hour: " << sun_hour << llendl;
- panel->setGlobalTime(FALSE);
- panel->setSunHour(sun_hour);
- }
-
- bool visible_from_mainland = (bool)(flags & REGION_FLAGS_EXTERNALLY_VISIBLE);
- bool god = gAgent.isGodlike();
- bool linden_estate = (estate_id <= ESTATE_LAST_LINDEN);
-
- // If visible from mainland, disable the access allowed
- // UI, as anyone can teleport there.
- // However, gods need to be able to edit the access list for
- // linden estates, regardless of visibility, to allow object
- // and L$ transfers.
- bool enable_agent = (!visible_from_mainland || (god && linden_estate));
- bool enable_group = enable_agent;
- bool enable_ban = !linden_estate;
- panel->setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
+ // Update estate info model.
+ // This will call LLPanelEstateInfo::refreshFromEstate().
+ // *TODO: Move estate message handling stuff to llestateinfomodel.cpp.
+ LLEstateInfoModel::instance().update(strings);
return true;
}
@@ -3249,33 +3056,48 @@ void LLPanelEnvironmentInfo::setDirty(bool dirty)
getChildView("cancel_btn")->setEnabled(dirty);
}
-void LLPanelEnvironmentInfo::sendRegionSunUpdate(F32 sun_angle)
+void LLPanelEnvironmentInfo::sendRegionSunUpdate()
{
LLRegionInfoModel& region_info = LLRegionInfoModel::instance();
- bool region_use_fixed_sky = sun_angle >= 0.f;
- // Set sun hour.
+ // If the region is being switched to fixed sky,
+ // change the region's sun hour according to the (fixed) sun position.
+ // This is needed for llGetSunDirection() LSL function to work properly (STORM-1330).
+ const LLSD& sky_map = mNewRegionSettings.getSkyMap();
+ bool region_use_fixed_sky = sky_map.size() == 1;
if (region_use_fixed_sky)
{
LLWLParamSet param_set;
- LLSD params;
- std::string unused;
- if (!getSelectedSkyParams(params, unused))
- {
- return;
- }
- param_set.setAll(params);
+ llassert(sky_map.isMap());
+ param_set.setAll(sky_map.beginMap()->second);
+ F32 sun_angle = param_set.getSunAngle();
+ LL_DEBUGS("Windlight Sync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL;
// convert value range from 0..2pi to 6..30
region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f;
}
region_info.setUseFixedSun(region_use_fixed_sky);
region_info.mUseEstateSun = !region_use_fixed_sky;
+ LL_DEBUGS("Windlight Sync") << "Sun hour: " << region_info.mSunHour << LL_ENDL;
region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice());
}
+void LLPanelEnvironmentInfo::fixEstateSun()
+{
+ // We don't support fixed sun estates anymore and need to fix
+ // such estates for region day cycle to take effect.
+ // *NOTE: Assuming that current estate settings have arrived already.
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+ if (estate_info.getUseFixedSun())
+ {
+ llinfos << "Switching estate to global sun" << llendl;
+ estate_info.setUseFixedSun(false);
+ estate_info.sendEstateInfo();
+ }
+}
+
void LLPanelEnvironmentInfo::populateWaterPresetsList()
{
mWaterPresetCombo->removeall();
@@ -3555,7 +3377,6 @@ void LLPanelEnvironmentInfo::onBtnApply()
LLSD day_cycle;
LLSD sky_map;
LLSD water_params;
- F32 sun_angle = -1.f; // invalid value meaning no fixed sky
if (use_defaults)
{
@@ -3588,9 +3409,6 @@ void LLPanelEnvironmentInfo::onBtnApply()
param_set.setAll(params);
refs[LLWLParamKey(preset_name, LLEnvKey::SCOPE_LOCAL)] = param_set; // scope doesn't matter here
sky_map = LLWLParamManager::createSkyMap(refs);
-
- // Remember the sun angle to set fixed region sun hour below.
- sun_angle = param_set.getSunAngle();
}
else // use day cycle
{
@@ -3611,16 +3429,6 @@ void LLPanelEnvironmentInfo::onBtnApply()
LL_DEBUGS("Windlight") << "Fixing negative time" << LL_ENDL;
day_cycle[0][0] = 0.0f;
}
-
- // If the day cycle contains exactly one preset (i.e it's effectively a fixed sky),
- // remember the preset's sun angle to set fixed region sun hour below.
- if (sky_map.size() == 1)
- {
- LLWLParamSet param_set;
- llassert(sky_map.isMap());
- param_set.setAll(sky_map.beginMap()->second);
- sun_angle = param_set.getSunAngle();
- }
}
// Get water params.
@@ -3640,8 +3448,9 @@ void LLPanelEnvironmentInfo::onBtnApply()
return;
}
- // Set the region sun phase/flags according to the chosen new preferences.
- sendRegionSunUpdate(sun_angle);
+ // When the settings get applied, we'll also send the region sun position update.
+ // To determine the sun angle we're going to need the new settings.
+ mNewRegionSettings = new_region_settings;
// Start spinning the progress indicator.
setApplyProgress(true);
@@ -3672,10 +3481,21 @@ void LLPanelEnvironmentInfo::onRegionSettingschange()
void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok)
{
- LL_DEBUGS("Windlight") << "Applying region settings finished, stopping indicator" << LL_ENDL;
// If applying new settings has failed, stop the indicator right away.
// Otherwise it will be stopped when we receive the updated settings from server.
- if (!ok)
+ if (ok)
+ {
+ // Set the region sun phase/flags according to the chosen new preferences.
+ //
+ // If we do this earlier we may get jerky transition from fixed sky to a day cycle (STORM-1481).
+ // That is caused by the simulator re-sending the region info, which in turn makes us
+ // re-request and display old region environment settings while the new ones haven't been applied yet.
+ sendRegionSunUpdate();
+
+ // Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506).
+ fixEstateSun();
+ }
+ else
{
setApplyProgress(false);
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 4809937324..c1fef57ac9 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -34,6 +34,8 @@
#include "llhost.h"
#include "llpanel.h"
+#include "llenvmanager.h" // for LLEnvironmentSettings
+
class LLAvatarName;
class LLDispatcher;
class LLLineEditor;
@@ -302,23 +304,9 @@ public:
virtual BOOL postBuild();
virtual void updateChild(LLUICtrl* child_ctrl);
virtual void refresh();
-
- U32 computeEstateFlags();
- void setEstateFlags(U32 flags);
-
- BOOL getGlobalTime();
- void setGlobalTime(bool b);
-
- BOOL getFixedSun(); // *TODO: deprecated
- F32 getSunHour(); // *TODO: deprecated
- void setSunHour(F32 sun_hour); // *TODO: deprecated
+ void refreshFromEstate();
- const std::string getEstateName() const;
- void setEstateName(const std::string& name);
-
- U32 getEstateID() const { return mEstateID; }
- void setEstateID(U32 estate_id) { mEstateID = estate_id; }
static bool isLindenEstate();
const std::string getOwnerName() const;
@@ -332,8 +320,6 @@ protected:
// confirmation dialog callback
bool callbackChangeLindenEstate(const LLSD& notification, const LLSD& response);
- void commitEstateInfoDataserver();
- bool commitEstateInfoCaps();
void commitEstateAccess();
void commitEstateManagers();
@@ -431,7 +417,8 @@ private:
void setApplyProgress(bool started);
void setDirty(bool dirty);
- void sendRegionSunUpdate(F32 sun_angle);
+ void sendRegionSunUpdate();
+ void fixEstateSun();
void populateWaterPresetsList();
void populateSkyPresetsList();
@@ -454,6 +441,9 @@ private:
void onRegionSettingschange();
void onRegionSettingsApplied(bool ok);
+ /// New environment settings that are being applied to the region.
+ LLEnvironmentSettings mNewRegionSettings;
+
bool mEnableEditing;
LLRadioGroup* mRegionSettingsRadioGroup;
diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp
index 785441a67e..5269e9d1d7 100644
--- a/indra/newview/llfloaterwebcontent.cpp
+++ b/indra/newview/llfloaterwebcontent.cpp
@@ -44,14 +44,17 @@ LLFloaterWebContent::_Params::_Params()
: url("url"),
target("target"),
id("id"),
+ window_class("window_class", "web_content"),
show_chrome("show_chrome", true),
allow_address_entry("allow_address_entry", true),
preferred_media_size("preferred_media_size"),
trusted_content("trusted_content", false)
{}
-LLFloaterWebContent::LLFloaterWebContent( const Params& key )
-: LLFloater( key )
+LLFloaterWebContent::LLFloaterWebContent( const Params& params )
+: LLFloater( params ),
+ LLInstanceTracker<LLFloaterWebContent, LLUUID>(params.id()),
+ mUUID(params.id().asString())
{
mCommitCallbackRegistrar.add( "WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this ));
mCommitCallbackRegistrar.add( "WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this ));
@@ -64,9 +67,9 @@ LLFloaterWebContent::LLFloaterWebContent( const Params& key )
BOOL LLFloaterWebContent::postBuild()
{
// these are used in a bunch of places so cache them
- mWebBrowser = getChild< LLMediaCtrl >( "webbrowser" );
- mAddressCombo = getChild< LLComboBox >( "address" );
- mStatusBarText = getChild< LLTextBox >( "statusbartext" );
+ mWebBrowser = getChild< LLMediaCtrl >( "webbrowser" );
+ mAddressCombo = getChild< LLComboBox >( "address" );
+ mStatusBarText = getChild< LLTextBox >( "statusbartext" );
mStatusBarProgress = getChild<LLProgressBar>("statusbarprogress" );
// observe browser events
@@ -110,10 +113,8 @@ void LLFloaterWebContent::initializeURLHistory()
// Get all of the entries in the "browser" collection
LLSD browser_history = LLURLHistory::getURLHistory("browser");
- LLSD::array_iterator iter_history =
- browser_history.beginArray();
- LLSD::array_iterator end_history =
- browser_history.endArray();
+ LLSD::array_iterator iter_history = browser_history.beginArray();
+ LLSD::array_iterator end_history = browser_history.endArray();
for(; iter_history != end_history; ++iter_history)
{
std::string url = (*iter_history).asString();
@@ -123,7 +124,7 @@ void LLFloaterWebContent::initializeURLHistory()
}
//static
-void LLFloaterWebContent::create( Params p)
+LLFloater* LLFloaterWebContent::create( Params p)
{
lldebugs << "url = " << p.url() << ", target = " << p.target() << ", uuid = " << p.id().asString() << llendl;
@@ -139,7 +140,9 @@ void LLFloaterWebContent::create( Params p)
S32 browser_window_limit = gSavedSettings.getS32("WebContentWindowLimit");
- if(LLFloaterReg::findInstance("web_content", p.target()) != NULL)
+ LLSD sd;
+ sd["target"] = p.target;
+ if(LLFloaterReg::findInstance(p.window_class, sd) != NULL)
{
// There's already a web browser for this tag, so we won't be opening a new window.
}
@@ -148,7 +151,7 @@ void LLFloaterWebContent::create( 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("web_content");
+ LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList(p.window_class);
lldebugs << "total instance count is " << instances.size() << llendl;
for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)
@@ -163,40 +166,26 @@ void LLFloaterWebContent::create( Params p)
}
}
- LLFloaterReg::showInstance("web_content", p);
+ return LLFloaterReg::showInstance(p.window_class, p);
}
//static
void LLFloaterWebContent::closeRequest(const std::string &uuid)
{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("web_content");
- lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ LLFloaterWebContent* floaterp = getInstance(LLUUID(uuid));
+ if (floaterp)
{
- LLFloaterWebContent* i = dynamic_cast<LLFloaterWebContent*>(*iter);
- lldebugs << " " << i->mUUID << llendl;
- if (i && i->mUUID == uuid)
- {
- i->closeFloater(false);
- return;
- }
- }
+ floaterp->closeFloater(false);
+ }
}
//static
void LLFloaterWebContent::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)
{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("web_content");
- lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ LLFloaterWebContent* floaterp = getInstance(LLUUID(uuid));
+ if (floaterp)
{
- LLFloaterWebContent* i = dynamic_cast<LLFloaterWebContent*>(*iter);
- lldebugs << " " << i->mUUID << llendl;
- if (i && i->mUUID == uuid)
- {
- i->geometryChanged(x, y, width, height);
- return;
- }
+ floaterp->geometryChanged(x, y, width, height);
}
}
@@ -210,15 +199,21 @@ void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)
getWindow()->getSize(&window_size);
// Adjust width and height for the size of the chrome on the web Browser window.
- width += getRect().getWidth() - mWebBrowser->getRect().getWidth();
- height += getRect().getHeight() - mWebBrowser->getRect().getHeight();
+ LLRect browser_rect;
+ mWebBrowser->localRectToOtherView(mWebBrowser->getLocalRect(), &browser_rect, this);
+ S32 requested_browser_bottom = window_size.mY - (y + height);
LLRect geom;
- geom.setOriginAndSize(x, window_size.mY - (y + height), width, height);
+ geom.setOriginAndSize(x - browser_rect.mLeft,
+ requested_browser_bottom - browser_rect.mBottom,
+ width + getRect().getWidth() - browser_rect.getWidth(),
+ height + getRect().getHeight() - browser_rect.getHeight());
lldebugs << "geometry change: " << geom << llendl;
-
- setShape(geom);
+
+ LLRect new_rect;
+ getParent()->screenRectToLocal(geom, &new_rect);
+ setShape(new_rect);
}
void LLFloaterWebContent::open_media(const Params& p)
@@ -242,8 +237,12 @@ void LLFloaterWebContent::open_media(const Params& p)
if (!p.preferred_media_size().isEmpty())
{
- //ignore x, y for now
- geometryChanged(getRect().mLeft, getRect().mBottom, p.preferred_media_size().getWidth(), p.preferred_media_size().getHeight());
+ LLLayoutStack::updateClass();
+ LLRect browser_rect = mWebBrowser->calcScreenRect();
+ LLCoordWindow window_size;
+ getWindow()->getSize(&window_size);
+
+ geometryChanged(browser_rect.mLeft, window_size.mY - browser_rect.mTop, p.preferred_media_size().getWidth(), p.preferred_media_size().getHeight());
}
}
@@ -258,11 +257,6 @@ void LLFloaterWebContent::onOpen(const LLSD& key)
return;
}
- if (params.target() == params.id().asString())
- {
- setRectControl("");
- }
- mUUID = params.id().asString();
mWebBrowser->setTrustedContent(params.trusted_content);
// tell the browser instance to load the specified URL
@@ -279,7 +273,7 @@ void LLFloaterWebContent::onClose(bool app_quitting)
// virtual
void LLFloaterWebContent::draw()
{
- // this is asychronous so we need to keep checking
+ // this is asynchronous so we need to keep checking
getChildView( "back" )->setEnabled( mWebBrowser->canNavigateBack() );
getChildView( "forward" )->setEnabled( mWebBrowser->canNavigateForward() );
@@ -421,7 +415,7 @@ void LLFloaterWebContent::onClickStop()
// still should happen when we catch the navigate complete event
// but sometimes (don't know why) that event isn't sent from Qt
- // and we getto a point where the stop button stays active.
+ // and we ghetto a point where the stop button stays active.
getChildView("reload")->setVisible( true );
getChildView("stop")->setVisible( false );
}
diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h
index 3a99d49b5a..2e3c6ffd84 100644
--- a/indra/newview/llfloaterwebcontent.h
+++ b/indra/newview/llfloaterwebcontent.h
@@ -39,7 +39,8 @@ class LLIconCtrl;
class LLFloaterWebContent :
public LLFloater,
- public LLViewerMediaObserver
+ public LLViewerMediaObserver,
+ public LLInstanceTracker<LLFloaterWebContent, LLUUID>
{
public:
LOG_CLASS(LLFloaterWebContent);
@@ -47,7 +48,8 @@ public:
struct _Params : public LLInitParam::Block<_Params>
{
Optional<std::string> url,
- target;
+ target,
+ window_class;
Optional<LLUUID> id;
Optional<bool> show_chrome,
allow_address_entry,
@@ -59,11 +61,11 @@ public:
typedef LLSDParamAdapter<_Params> Params;
- LLFloaterWebContent(const Params& key);
+ LLFloaterWebContent(const Params& params);
void initializeURLHistory();
- static void create(Params);
+ static LLFloater* create(Params);
static void closeRequest(const std::string &uuid);
static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height);
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index b3910982d1..d5f0648f3b 100644..100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -70,7 +70,7 @@
#include "llappviewer.h"
#include "llmapimagetype.h"
#include "llweb.h"
-#include "llslider.h"
+#include "llsliderctrl.h"
#include "message.h"
#include "llwindow.h" // copyTextToClipboard()
#include <algorithm>
@@ -1029,7 +1029,7 @@ void LLFloaterWorldMap::adjustZoomSliderBounds()
F32 min_power = log(pixels_per_region/256.f)/log(2.f);
- getChild<LLSlider>("zoom slider")->setMinValue(min_power);
+ getChild<LLSliderCtrl>("zoom slider")->setMinValue(min_power);
}
@@ -1070,7 +1070,7 @@ void LLFloaterWorldMap::onComboTextEntry()
// Reset the tracking whenever we start typing into any of the search fields,
// so that hitting <enter> does an auto-complete versus teleporting us to the
// previously selected landmark/friend.
- LLTracker::clearFocus();
+ LLTracker::stopTracking(NULL);
}
void LLFloaterWorldMap::onSearchTextEntry( )
diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index 82e1f2dfb5..482294c8a6 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -477,7 +477,7 @@ void LLHUDNameTag::renderText(BOOL for_select)
// Render label
{
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ //gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
for(std::vector<LLHUDTextSegment>::iterator segment_iter = mLabelSegments.begin();
segment_iter != mLabelSegments.end(); ++segment_iter )
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 4ed39da5cb..ff328fd071 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2512,6 +2512,11 @@ void LLFolderBridge::folderOptionsMenu()
}
}
+ if (!isItemRemovable())
+ {
+ mDisabledItems.push_back(std::string("Delete"));
+ }
+
#ifndef LL_RELEASE_FOR_DOWNLOAD
if (LLFolderType::lookupIsProtectedType(type))
{
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 50b5a2a5e5..e86c427ae2 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -2287,18 +2287,21 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account)
}
// static
-void LLInventoryModel::removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg)
+void LLInventoryModel::removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label)
{
LLUUID item_id;
- S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
+ S32 count = msg->getNumberOfBlocksFast(msg_label);
+ lldebugs << "Message has " << count << " item blocks" << llendl;
uuid_vec_t item_ids;
update_map_t update;
for(S32 i = 0; i < count; ++i)
{
- msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_ItemID, item_id, i);
+ msg->getUUIDFast(msg_label, _PREHASH_ItemID, item_id, i);
+ lldebugs << "Checking for item-to-be-removed " << item_id << llendl;
LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
if(itemp)
{
+ lldebugs << "Item will be removed " << item_id << llendl;
// we only bother with the delete and account if we found
// the item - this is usually a back-up for permissions,
// so frequently the item will already be gone.
@@ -2309,6 +2312,7 @@ void LLInventoryModel::removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg
gInventory.accountForUpdate(update);
for(uuid_vec_t::iterator it = item_ids.begin(); it != item_ids.end(); ++it)
{
+ lldebugs << "Calling deleteObject " << *it << llendl;
gInventory.deleteObject(*it);
}
}
@@ -2325,7 +2329,7 @@ void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**)
<< llendl;
return;
}
- LLInventoryModel::removeInventoryItem(agent_id, msg);
+ LLInventoryModel::removeInventoryItem(agent_id, msg, _PREHASH_InventoryData);
gInventory.notifyObservers();
}
@@ -2447,7 +2451,7 @@ void LLInventoryModel::processRemoveInventoryObjects(LLMessageSystem* msg,
return;
}
LLInventoryModel::removeInventoryFolder( agent_id, msg );
- LLInventoryModel::removeInventoryItem( agent_id, msg );
+ LLInventoryModel::removeInventoryItem( agent_id, msg, _PREHASH_ItemData );
gInventory.notifyObservers();
}
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index c3775ac088..e0e81f1006 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -492,7 +492,7 @@ protected:
//--------------------------------------------------------------------
public:
static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**);
- static void removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg);
+ static void removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label);
static void processRemoveInventoryItem(LLMessageSystem* msg, void**);
static void processUpdateInventoryFolder(LLMessageSystem* msg, void**);
static void removeInventoryFolder(LLUUID agent_id, LLMessageSystem* msg);
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 5c65dcec34..1c8f6b6c98 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -190,6 +190,7 @@ LLLocationInputCtrl::Params::Params()
scripts_icon("scripts_icon"),
damage_icon("damage_icon"),
damage_text("damage_text"),
+ see_avatars_icon("see_avatars_icon"),
maturity_help_topic("maturity_help_topic")
{
}
@@ -342,6 +343,13 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mDamageText = LLUICtrlFactory::create<LLTextBox>(damage_text);
addChild(mDamageText);
+ LLIconCtrl::Params see_avatars_icon = p.see_avatars_icon;
+ see_avatars_icon.tool_tip = LLTrans::getString("LocationCtrlSeeAVsTooltip");
+ see_avatars_icon.mouse_opaque = true;
+ mParcelIcon[SEE_AVATARS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(see_avatars_icon);
+ mParcelIcon[SEE_AVATARS_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, SEE_AVATARS_ICON));
+ addChild(mParcelIcon[SEE_AVATARS_ICON]);
+
// Register callbacks and load the location field context menu (NB: the order matters).
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2));
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Navbar.EnableMenuItem", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemEnabled, this, _2));
@@ -810,6 +818,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
+ bool see_avs = current_parcel->getSeeAVs();
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
@@ -819,6 +828,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mDamageText->setVisible(allow_damage);
+ mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
// Padding goes to left of both landmark star and for sale btn
x -= mAddLandmarkHPad;
@@ -1175,6 +1185,9 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
case DAMAGE_ICON:
LLNotificationsUtil::add("NotSafe");
break;
+ case SEE_AVATARS_ICON:
+ LLNotificationsUtil::add("SeeAvatars");
+ break;
case ICON_COUNT:
break;
// no default to get compiler warning when a new icon gets added
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 6368bf5cf2..ed47ba73e3 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -77,7 +77,8 @@ public:
push_icon,
build_icon,
scripts_icon,
- damage_icon;
+ damage_icon,
+ see_avatars_icon;
Optional<LLTextBox::Params> damage_text;
Params();
};
@@ -109,12 +110,13 @@ private:
enum EParcelIcon
{
VOICE_ICON = 0,
- FLY_ICON,
- PUSH_ICON,
- BUILD_ICON,
- SCRIPTS_ICON,
- DAMAGE_ICON,
- ICON_COUNT
+ FLY_ICON, // 1
+ PUSH_ICON, // 2
+ BUILD_ICON, // 3
+ SCRIPTS_ICON, // 4
+ DAMAGE_ICON, // 5
+ SEE_AVATARS_ICON, // 6
+ ICON_COUNT // 7 total
};
friend class LLUICtrlFactory;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 07c7f35989..a4f6921f98 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -30,6 +30,7 @@
#include "llpanelface.h"
// library includes
+#include "llcalc.h"
#include "llerror.h"
#include "llfocusmgr.h"
#include "llrect.h"
@@ -926,6 +927,16 @@ void LLPanelFace::getState()
getChildView("button apply")->setEnabled(enabled);
}
}
+
+ // 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());
}
else
{
@@ -961,6 +972,16 @@ void LLPanelFace::getState()
//getChildView("has media")->setEnabled(FALSE);
//getChildView("media info set")->setEnabled(FALSE);
+
+ // Set variable values for numeric expressions
+ LLCalc* calcp = LLCalc::getInstance();
+ calcp->clearVar(LLCalc::TEX_U_SCALE);
+ calcp->clearVar(LLCalc::TEX_V_SCALE);
+ calcp->clearVar(LLCalc::TEX_U_OFFSET);
+ calcp->clearVar(LLCalc::TEX_V_OFFSET);
+ calcp->clearVar(LLCalc::TEX_ROTATION);
+ calcp->clearVar(LLCalc::TEX_TRANSPARENCY);
+ calcp->clearVar(LLCalc::TEX_GLOW);
}
}
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 8d8d9bc1c4..eddd6e554d 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -35,6 +35,7 @@
#include "llqueryflags.h"
#include "llagent.h"
+#include "lldateutil.h"
#include "lliconctrl.h"
#include "llfloaterreg.h"
#include "lllineeditor.h"
@@ -1056,6 +1057,14 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,
msg->getS32Fast(_PREHASH_MoneyData, _PREHASH_CurrentInterval, current_interval );
msg->getStringFast(_PREHASH_MoneyData, _PREHASH_StartDate, start_date);
+ std::string time_str = LLTrans::getString("GroupMoneyDate");
+ LLSD substitution;
+
+ // We don't do time zone corrections of the calculated number of seconds
+ // because we don't have a full time stamp, only a date.
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%A %b %d, %Y", start_date);
+ LLStringUtil::format (time_str, substitution);
+
if ( interval_days != mImplementationp->mIntervalLength ||
current_interval != mImplementationp->mCurrentInterval )
{
@@ -1064,7 +1073,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,
return;
}
- std::string text = start_date;
+ std::string text = time_str;
text.append("\n\n");
S32 total_amount = 0;
@@ -1203,7 +1212,15 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,
// Start with the date.
if (text == mImplementationp->mLoadingText)
{
- text = start_date + "\n\n";
+ std::string time_str = LLTrans::getString("GroupMoneyDate");
+ LLSD substitution;
+
+ // We don't do time zone corrections of the calculated number of seconds
+ // because we don't have a full time stamp, only a date.
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%A %b %d, %Y", start_date);
+ LLStringUtil::format (time_str, substitution);
+
+ text = time_str + "\n\n";
}
S32 transactions = msg->getNumberOfBlocksFast(_PREHASH_HistoryData);
@@ -1408,12 +1425,26 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,
}
text.append(LLTrans::getString("SummaryForTheWeek"));
- text.append(start_date);
+
+ std::string date_format_str = LLTrans::getString("GroupPlanningDate");
+ std::string time_str = date_format_str;
+ LLSD substitution;
+ // We don't do time zone corrections of the calculated number of seconds
+ // because we don't have a full time stamp, only a date.
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", start_date);
+ LLStringUtil::format (time_str, substitution);
+
+ text.append(time_str);
if (current_interval == 0)
{
text.append(LLTrans::getString("NextStipendDay"));
- text.append(next_stipend_date);
+
+ time_str = date_format_str;
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", next_stipend_date);
+ LLStringUtil::format (time_str, substitution);
+
+ text.append(time_str);
text.append("\n\n");
text.append(llformat("%-24sL$%6d\n", LLTrans::getString("GroupMoneyBalance").c_str(), balance ));
text.append(1, '\n');
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index f9730d9b71..e7bdc51b4a 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -91,6 +91,12 @@ BOOL LLPanelLandAudio::postBuild()
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
+ mCheckAVSoundAny = getChild<LLCheckBoxCtrl>("all av sound check");
+ childSetCommitCallback("all av sound check", onCommitAny, this);
+
+ mCheckAVSoundGroup = getChild<LLCheckBoxCtrl>("group av sound check");
+ childSetCommitCallback("group av sound check", onCommitAny, this);
+
return TRUE;
}
@@ -144,6 +150,13 @@ void LLPanelLandAudio::refresh()
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
+
+ BOOL can_change_av_sounds = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS) && parcel->getHaveNewParcelLimitData();
+ mCheckAVSoundAny->set(parcel->getAllowAnyAVSounds());
+ mCheckAVSoundAny->setEnabled(can_change_av_sounds);
+
+ mCheckAVSoundGroup->set(parcel->getAllowGroupAVSounds() || parcel->getAllowAnyAVSounds()); // On if "Everyone" is on
+ mCheckAVSoundGroup->setEnabled(can_change_av_sounds && !parcel->getAllowAnyAVSounds()); // Enabled if "Everyone" is off
}
}
// static
@@ -164,6 +177,13 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
+ BOOL any_av_sound = self->mCheckAVSoundAny->get();
+ BOOL group_av_sound = TRUE; // If set to "Everyone" then group is checked as well
+ if (!any_av_sound)
+ { // If "Everyone" is off, use the value from the checkbox
+ group_av_sound = self->mCheckAVSoundGroup->get();
+ }
+
// Remove leading/trailing whitespace (common when copying/pasting)
LLStringUtil::trim(music_url);
@@ -172,6 +192,8 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
parcel->setMusicURL(music_url);
+ parcel->setAllowAnyAVSounds(any_av_sound);
+ parcel->setAllowGroupAVSounds(group_av_sound);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llpanellandaudio.h b/indra/newview/llpanellandaudio.h
index 4b0953bdc1..32a45100f4 100644
--- a/indra/newview/llpanellandaudio.h
+++ b/indra/newview/llpanellandaudio.h
@@ -52,6 +52,8 @@ private:
LLCheckBoxCtrl* mCheckParcelVoiceLocal;
LLLineEditor* mMusicURLEdit;
LLCheckBoxCtrl* mMusicUrlCheck;
+ LLCheckBoxCtrl* mCheckAVSoundAny;
+ LLCheckBoxCtrl* mCheckAVSoundGroup;
LLSafeHandle<LLParcelSelection>& mParcel;
};
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 52917ff20b..c222bbb191 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -41,6 +41,7 @@
// project includes
#include "llagent.h"
#include "llbutton.h"
+#include "llcalc.h"
#include "llcheckboxctrl.h"
#include "llcolorswatch.h"
#include "llcombobox.h"
@@ -318,6 +319,8 @@ void LLPanelObject::getState( )
}
}
+ LLCalc* calcp = LLCalc::getInstance();
+
LLVOVolume *volobjp = NULL;
if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
{
@@ -334,6 +337,7 @@ void LLPanelObject::getState( )
// Disable all text input fields
clearCtrls();
+ calcp->clearAllVariables();
return;
}
@@ -360,12 +364,18 @@ void LLPanelObject::getState( )
mCtrlPosX->set( vec.mV[VX] );
mCtrlPosY->set( vec.mV[VY] );
mCtrlPosZ->set( vec.mV[VZ] );
+ calcp->setVar(LLCalc::X_POS, vec.mV[VX]);
+ calcp->setVar(LLCalc::Y_POS, vec.mV[VY]);
+ calcp->setVar(LLCalc::Z_POS, vec.mV[VZ]);
}
else
{
mCtrlPosX->clear();
mCtrlPosY->clear();
mCtrlPosZ->clear();
+ calcp->clearVar(LLCalc::X_POS);
+ calcp->clearVar(LLCalc::Y_POS);
+ calcp->clearVar(LLCalc::Z_POS);
}
@@ -380,12 +390,18 @@ void LLPanelObject::getState( )
mCtrlScaleX->set( vec.mV[VX] );
mCtrlScaleY->set( vec.mV[VY] );
mCtrlScaleZ->set( vec.mV[VZ] );
+ calcp->setVar(LLCalc::X_SCALE, vec.mV[VX]);
+ calcp->setVar(LLCalc::Y_SCALE, vec.mV[VY]);
+ calcp->setVar(LLCalc::Z_SCALE, vec.mV[VZ]);
}
else
{
mCtrlScaleX->clear();
mCtrlScaleY->clear();
mCtrlScaleZ->clear();
+ calcp->setVar(LLCalc::X_SCALE, 0.f);
+ calcp->setVar(LLCalc::Y_SCALE, 0.f);
+ calcp->setVar(LLCalc::Z_SCALE, 0.f);
}
mLabelSize->setEnabled( enable_scale );
@@ -405,12 +421,18 @@ void LLPanelObject::getState( )
mCtrlRotX->set( mCurEulerDegrees.mV[VX] );
mCtrlRotY->set( mCurEulerDegrees.mV[VY] );
mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] );
+ calcp->setVar(LLCalc::X_ROT, mCurEulerDegrees.mV[VX]);
+ calcp->setVar(LLCalc::Y_ROT, mCurEulerDegrees.mV[VY]);
+ calcp->setVar(LLCalc::Z_ROT, mCurEulerDegrees.mV[VZ]);
}
else
{
mCtrlRotX->clear();
mCtrlRotY->clear();
mCtrlRotZ->clear();
+ calcp->clearVar(LLCalc::X_ROT);
+ calcp->clearVar(LLCalc::Y_ROT);
+ calcp->clearVar(LLCalc::Z_ROT);
}
mLabelRotation->setEnabled( enable_rotate );
@@ -625,9 +647,9 @@ void LLPanelObject::getState( )
F32 end_t = volume_params.getEndT();
// Hollowness
- F32 hollow = volume_params.getHollow();
- mSpinHollow->set( 100.f * hollow );
-
+ F32 hollow = 100.f * volume_params.getHollow();
+ mSpinHollow->set( hollow );
+ calcp->setVar(LLCalc::HOLLOW, hollow);
// All hollow objects allow a shape to be selected.
if (hollow > 0.f)
{
@@ -679,6 +701,10 @@ void LLPanelObject::getState( )
mSpinCutEnd ->set( cut_end );
mCtrlPathBegin ->set( adv_cut_begin );
mCtrlPathEnd ->set( adv_cut_end );
+ calcp->setVar(LLCalc::CUT_BEGIN, cut_begin);
+ calcp->setVar(LLCalc::CUT_END, cut_end);
+ calcp->setVar(LLCalc::PATH_BEGIN, adv_cut_begin);
+ calcp->setVar(LLCalc::PATH_END, adv_cut_end);
// Twist
F32 twist = volume_params.getTwist();
@@ -697,18 +723,24 @@ void LLPanelObject::getState( )
mSpinTwist ->set( twist );
mSpinTwistBegin ->set( twist_begin );
+ calcp->setVar(LLCalc::TWIST_END, twist);
+ calcp->setVar(LLCalc::TWIST_BEGIN, twist_begin);
// Shear
F32 shear_x = volume_params.getShearX();
F32 shear_y = volume_params.getShearY();
mSpinShearX->set( shear_x );
mSpinShearY->set( shear_y );
+ calcp->setVar(LLCalc::X_SHEAR, shear_x);
+ calcp->setVar(LLCalc::Y_SHEAR, shear_y);
// Taper
F32 taper_x = volume_params.getTaperX();
F32 taper_y = volume_params.getTaperY();
mSpinTaperX->set( taper_x );
mSpinTaperY->set( taper_y );
+ calcp->setVar(LLCalc::X_TAPER, taper_x);
+ calcp->setVar(LLCalc::Y_TAPER, taper_y);
// Radius offset.
F32 radius_offset = volume_params.getRadiusOffset();
@@ -738,10 +770,12 @@ void LLPanelObject::getState( )
}
}
mSpinRadiusOffset->set( radius_offset);
+ calcp->setVar(LLCalc::RADIUS_OFFSET, radius_offset);
// Revolutions
F32 revolutions = volume_params.getRevolutions();
mSpinRevolutions->set( revolutions );
+ calcp->setVar(LLCalc::REVOLUTIONS, revolutions);
// Skew
F32 skew = volume_params.getSkew();
@@ -766,6 +800,7 @@ void LLPanelObject::getState( )
}
}
mSpinSkew->set( skew );
+ calcp->setVar(LLCalc::SKEW, skew);
}
// Compute control visibility, label names, and twist range.
@@ -869,6 +904,8 @@ void LLPanelObject::getState( )
case MI_RING:
mSpinScaleX->set( scale_x );
mSpinScaleY->set( scale_y );
+ calcp->setVar(LLCalc::X_HOLE, scale_x);
+ calcp->setVar(LLCalc::Y_HOLE, scale_y);
mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE);
mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X);
mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE);
@@ -883,6 +920,14 @@ void LLPanelObject::getState( )
mSpinScaleX->setMaxValue(1.f);
mSpinScaleY->setMinValue(-1.f);
mSpinScaleY->setMaxValue(1.f);
+
+ // Torus' Hole Size is Box/Cyl/Prism's Taper
+ calcp->setVar(LLCalc::X_TAPER, 1.f - scale_x);
+ calcp->setVar(LLCalc::Y_TAPER, 1.f - scale_y);
+
+ // Box/Cyl/Prism have no hole size
+ calcp->setVar(LLCalc::X_HOLE, 0.f);
+ calcp->setVar(LLCalc::Y_HOLE, 0.f);
}
break;
}
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index ddce83c616..ddce83c616 100644..100755
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 29db110523..29db110523 100644..100755
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 68ecb0165c..1e9ce58237 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -70,6 +70,8 @@ static std::string icon_scripts;
static std::string icon_scripts_no;
static std::string icon_damage;
static std::string icon_damage_no;
+static std::string icon_see_avs_on;
+static std::string icon_see_avs_off;
LLPanelPlaceProfile::LLPanelPlaceProfile()
: LLPanelPlaceInfo(),
@@ -114,6 +116,8 @@ BOOL LLPanelPlaceProfile::postBuild()
mScriptsText = getChild<LLTextBox>("scripts_value");
mDamageIcon = getChild<LLIconCtrl>("damage_icon");
mDamageText = getChild<LLTextBox>("damage_value");
+ mSeeAVsIcon = getChild<LLIconCtrl>("see_avatars_icon");
+ mSeeAVsText = getChild<LLTextBox>("see_avatars_value");
mRegionNameText = getChild<LLTextBox>("region_name");
mRegionTypeText = getChild<LLTextBox>("region_type");
@@ -153,6 +157,8 @@ BOOL LLPanelPlaceProfile::postBuild()
icon_scripts_no = getString("icon_ScriptsNo");
icon_damage = getString("icon_Damage");
icon_damage_no = getString("icon_DamageNo");
+ icon_see_avs_on = getString("icon_SeeAVs_On");
+ icon_see_avs_off = getString("icon_SeeAVs_Off");
return TRUE;
}
@@ -182,6 +188,8 @@ void LLPanelPlaceProfile::resetLocation()
mScriptsText->setText(loading);
mDamageIcon->setValue(loading);
mDamageText->setText(loading);
+ mSeeAVsIcon->setValue(loading);
+ mSeeAVsText->setText(loading);
mRegionNameText->setValue(loading);
mRegionTypeText->setValue(loading);
@@ -414,6 +422,17 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
mDamageText->setText(off);
}
+ if (parcel->getSeeAVs())
+ {
+ mSeeAVsIcon->setValue(icon_see_avs_on);
+ mSeeAVsText->setText(on);
+ }
+ else
+ {
+ mSeeAVsIcon->setValue(icon_see_avs_off);
+ mSeeAVsText->setText(off);
+ }
+
mRegionNameText->setText(region->getName());
mRegionTypeText->setText(region->getSimProductName());
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
index f28b3b3832..a33fc12ce4 100644
--- a/indra/newview/llpanelplaceprofile.h
+++ b/indra/newview/llpanelplaceprofile.h
@@ -91,6 +91,8 @@ private:
LLTextBox* mScriptsText;
LLIconCtrl* mDamageIcon;
LLTextBox* mDamageText;
+ LLIconCtrl* mSeeAVsIcon;
+ LLTextBox* mSeeAVsText;
LLTextBox* mRegionNameText;
LLTextBox* mRegionTypeText;
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index fd5c3362bb..fd5c3362bb 100644..100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index fca359f51e..fca359f51e 100644..100755
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
index 30949f8f02..7087541fc8 100644
--- a/indra/newview/llpaneltopinfobar.cpp
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -102,6 +102,7 @@ void LLPanelTopInfoBar::initParcelIcons()
mParcelIcon[BUILD_ICON] = getChild<LLIconCtrl>("build_icon");
mParcelIcon[SCRIPTS_ICON] = getChild<LLIconCtrl>("scripts_icon");
mParcelIcon[DAMAGE_ICON] = getChild<LLIconCtrl>("damage_icon");
+ mParcelIcon[SEE_AVATARS_ICON] = getChild<LLIconCtrl>("see_avatars_icon");
mParcelIcon[VOICE_ICON]->setToolTip(LLTrans::getString("LocationCtrlVoiceTooltip"));
mParcelIcon[FLY_ICON]->setToolTip(LLTrans::getString("LocationCtrlFlyTooltip"));
@@ -109,6 +110,7 @@ void LLPanelTopInfoBar::initParcelIcons()
mParcelIcon[BUILD_ICON]->setToolTip(LLTrans::getString("LocationCtrlBuildTooltip"));
mParcelIcon[SCRIPTS_ICON]->setToolTip(LLTrans::getString("LocationCtrlScriptsTooltip"));
mParcelIcon[DAMAGE_ICON]->setToolTip(LLTrans::getString("LocationCtrlDamageTooltip"));
+ mParcelIcon[SEE_AVATARS_ICON]->setToolTip(LLTrans::getString("LocationCtrlSeeAVsTooltip"));
mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, VOICE_ICON));
mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, FLY_ICON));
@@ -116,6 +118,7 @@ void LLPanelTopInfoBar::initParcelIcons()
mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, BUILD_ICON));
mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SCRIPTS_ICON));
mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, DAMAGE_ICON));
+ mParcelIcon[SEE_AVATARS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SEE_AVATARS_ICON));
mDamageText->setText(LLStringExplicit("100%"));
}
@@ -295,6 +298,7 @@ void LLPanelTopInfoBar::updateParcelIcons()
bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
+ bool see_avs = current_parcel->getSeeAVs();
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
@@ -304,6 +308,7 @@ void LLPanelTopInfoBar::updateParcelIcons()
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mDamageText->setVisible(allow_damage);
+ mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
layoutParcelIcons();
}
@@ -409,6 +414,9 @@ void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon)
case DAMAGE_ICON:
LLNotificationsUtil::add("NotSafe");
break;
+ case SEE_AVATARS_ICON:
+ LLNotificationsUtil::add("SeeAvatars");
+ break;
case ICON_COUNT:
break;
// no default to get compiler warning when a new icon gets added
diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h
index db922ef424..583e91d15e 100644
--- a/indra/newview/llpaneltopinfobar.h
+++ b/indra/newview/llpaneltopinfobar.h
@@ -65,12 +65,13 @@ private:
enum EParcelIcon
{
VOICE_ICON = 0,
- FLY_ICON,
- PUSH_ICON,
- BUILD_ICON,
- SCRIPTS_ICON,
- DAMAGE_ICON,
- ICON_COUNT
+ FLY_ICON, // 1
+ PUSH_ICON, // 2
+ BUILD_ICON, // 3
+ SCRIPTS_ICON, // 4
+ DAMAGE_ICON, // 5
+ SEE_AVATARS_ICON, // 6
+ ICON_COUNT // 7 total
};
/**
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index 0645fd8a54..f19b54c1d4 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -38,6 +38,8 @@
#include "llsidetray.h"
#include "llviewermenu.h"
#include "llwearableitemslist.h"
+#include "llsdserialize.h"
+#include "llclipboard.h"
// Context menu and Gear menu helper.
static void edit_outfit()
@@ -58,6 +60,7 @@ public:
registrar.add("Gear.Edit", boost::bind(&edit_outfit));
registrar.add("Gear.TakeOff", boost::bind(&LLWearingGearMenu::onTakeOff, this));
+ registrar.add("Gear.Copy", boost::bind(&LLPanelWearing::copyToClipboard, mPanelWearing));
enable_registrar.add("Gear.OnEnable", boost::bind(&LLPanelWearing::isActionEnabled, mPanelWearing, _2));
@@ -280,4 +283,25 @@ void LLPanelWearing::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
mCOFItemsList->getSelectedUUIDs(selected_uuids);
}
+void LLPanelWearing::copyToClipboard()
+{
+ std::string text;
+ std::vector<LLSD> data;
+ mCOFItemsList->getValues(data);
+
+ for(std::vector<LLSD>::const_iterator iter = data.begin(); iter != data.end();)
+ {
+ LLSD uuid = (*iter);
+ LLViewerInventoryItem* item = gInventory.getItem(uuid);
+
+ iter++;
+ if (item != NULL)
+ {
+ // Append a newline to all but the last line
+ text += iter != data.end() ? item->getName() + "\n" : item->getName();
+ }
+ }
+
+ gClipboard.copyFromString(utf8str_to_wstring(text));
+}
// EOF
diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h
index 157b2c4c5f..9a212b3cca 100644
--- a/indra/newview/llpanelwearing.h
+++ b/indra/newview/llpanelwearing.h
@@ -60,6 +60,8 @@ public:
/*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;
+ /*virtual*/ void copyToClipboard();
+
boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb);
bool hasItemSelected();
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index a90f23d637..119fc95cf0 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -444,18 +444,15 @@ void LLPreview::handleReshape(const LLRect& new_rect, bool by_user)
LLMultiPreview::LLMultiPreview()
: LLMultiFloater(LLSD())
{
- // *TODO: There should be a .xml file for this
- const LLRect& nextrect = LLFloaterReg::getFloaterRect("preview"); // place where the next preview should show up
- if (nextrect.getWidth() > 0)
- {
- setRect(nextrect);
- }
- else
+ // start with a rect in the top-left corner ; will get resized
+ LLRect rect;
+ rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 400);
+ setRect(rect);
+
+ LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup("preview");
+ if (last_floater)
{
- // start with a rect in the top-left corner ; will get resized
- LLRect rect;
- rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 400);
- setRect(rect);
+ stackWith(*last_floater);
}
setTitle(LLTrans::getString("MultiPreviewTitle"));
buildTabContainer();
diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp
index 6238f183c1..698c4f9bb9 100644
--- a/indra/newview/llregioninfomodel.cpp
+++ b/indra/newview/llregioninfomodel.cpp
@@ -157,6 +157,7 @@ void LLRegionInfoModel::update(LLMessageSystem* msg)
// actually the "last set" sun hour, not the current sun hour. JC
msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour);
+ LL_DEBUGS("Windlight Sync") << "Got region sun hour: " << mSunHour << LL_ENDL;
// the only reasonable way to decide if we actually have any data is to
// check to see if any of these fields have nonzero sizes
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index f99afa923b..e23b431457 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -47,6 +47,7 @@
#include "llvoavatar.h"
#include "llvolumemgr.h"
#include "lltextureatlas.h"
+#include "llglslshader.h"
static LLFastTimer::DeclareTimer FTM_FRUSTUM_CULL("Frustum Culling");
static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound");
@@ -3176,6 +3177,8 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
glColor4fv(line_color.mV);
LLVertexBuffer::unbind();
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);
+
glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);
glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
@@ -3257,7 +3260,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
if (phys_volume->mHullPoints && phys_volume->mHullIndices)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);
LLVertexBuffer::unbind();
glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);
glColor4fv(line_color.mV);
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 500c2a7b86..e8abee2fb7 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -45,12 +45,16 @@
#include "llagentwearables.h"
#include "llwearable.h"
#include "llviewercontrol.h"
+#include "llviewershadermgr.h"
#include "llviewervisualparam.h"
//#include "../tools/imdebug/imdebug.h"
using namespace LLVOAvatarDefines;
+static const S32 BAKE_UPLOAD_ATTEMPTS = 7;
+static const F32 BAKE_UPLOAD_RETRY_DELAY = 2.f; // actual delay grows by power of 2 each attempt
+
class LLTexLayerInfo
{
friend class LLTexLayer;
@@ -93,11 +97,13 @@ private:
//-----------------------------------------------------------------------------
LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar,
LLTexLayerSet* layerset,
- const LLUUID& id) :
+ const LLUUID& id,
+ bool highest_res) :
mAvatar(avatar),
mTexLayerSet(layerset),
mID(id),
- mStartTime(LLFrameTimer::getTotalTime()) // Record starting time
+ mStartTime(LLFrameTimer::getTotalTime()), // Record starting time
+ mIsHighestRes(highest_res)
{
}
@@ -116,6 +122,7 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner,
mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates
mNeedsUpload(FALSE),
mNumLowresUploads(0),
+ mUploadFailCount(0),
mNeedsUpdate(TRUE),
mNumLowresUpdates(0),
mTexLayerSet(owner)
@@ -204,6 +211,7 @@ void LLTexLayerSetBuffer::cancelUpload()
mNeedsUpload = FALSE;
mUploadPending = FALSE;
mNeedsUploadTimer.pause();
+ mUploadRetryTimer.reset();
}
void LLTexLayerSetBuffer::pushProjection() const
@@ -287,11 +295,17 @@ BOOL LLTexLayerSetBuffer::render()
BOOL success = TRUE;
+ //hack to use fixed function when updating tex layer sets
+ bool no_ff = LLGLSLShader::sNoFixedFunction;
+ LLGLSLShader::sNoFixedFunction = false;
+
// Composite the color data
LLGLSUIDefault gls_ui;
success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight );
gGL.flush();
+ LLGLSLShader::sNoFixedFunction = no_ff;
+
if(upload_now)
{
if (!success)
@@ -356,25 +370,38 @@ BOOL LLTexLayerSetBuffer::isReadyToUpload() const
if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries.
if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) return FALSE; // Don't upload if avatar is using composites.
- // If we requested an upload and have the final LOD ready, then upload.
- if (mTexLayerSet->isLocalTextureDataFinal()) return TRUE;
-
- // Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure
- // we aren't doing uploads too frequently.
- const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout");
- if (texture_timeout != 0)
+ BOOL ready = FALSE;
+ if (mTexLayerSet->isLocalTextureDataFinal())
+ {
+ // If we requested an upload and have the final LOD ready, upload (or wait a while if this is a retry)
+ if (mUploadFailCount == 0)
+ {
+ ready = TRUE;
+ }
+ else
+ {
+ ready = mUploadRetryTimer.getElapsedTimeF32() >= BAKE_UPLOAD_RETRY_DELAY * (1 << (mUploadFailCount - 1));
+ }
+ }
+ else
{
- // The timeout period increases exponentially between every lowres upload in order to prevent
- // spamming the server with frequent uploads.
- const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads);
+ // Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure
+ // we aren't doing uploads too frequently.
+ const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout");
+ if (texture_timeout != 0)
+ {
+ // The timeout period increases exponentially between every lowres upload in order to prevent
+ // spamming the server with frequent uploads.
+ const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads);
- // If we hit our timeout and have textures available at even lower resolution, then upload.
- const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold;
- const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable();
- if (has_lower_lod && is_upload_textures_timeout) return TRUE;
+ // If we hit our timeout and have textures available at even lower resolution, then upload.
+ const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold;
+ const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable();
+ ready = has_lower_lod && is_upload_textures_timeout;
+ }
}
- return FALSE;
+ return ready;
}
BOOL LLTexLayerSetBuffer::isReadyToUpdate() const
@@ -482,17 +509,20 @@ void LLTexLayerSetBuffer::doUpload()
if (valid)
{
+ const bool highest_lod = mTexLayerSet->isLocalTextureDataFinal();
// Baked_upload_data is owned by the responder and deleted after the request completes.
LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp,
this->mTexLayerSet,
- asset_id);
+ asset_id,
+ highest_lod);
// upload ID is used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit.
mUploadID = asset_id;
// Upload the image
const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture");
if(!url.empty()
- && !LLPipeline::sForceOldBakedUpload) // toggle debug setting UploadBakedTexOld to change between the new caps method and old method
+ && !LLPipeline::sForceOldBakedUpload // toggle debug setting UploadBakedTexOld to change between the new caps method and old method
+ && (mUploadFailCount < (BAKE_UPLOAD_ATTEMPTS - 1))) // Try last ditch attempt via asset store if cap upload is failing.
{
LLSD body = LLSD::emptyMap();
// The responder will call LLTexLayerSetBuffer::onTextureUploadComplete()
@@ -511,7 +541,6 @@ void LLTexLayerSetBuffer::doUpload()
llinfos << "Baked texture upload via Asset Store." << llendl;
}
- const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal();
if (highest_lod)
{
// Sending the final LOD for the baked texture. All done, pause
@@ -603,14 +632,15 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
{
LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata;
- if ((result == 0) &&
- isAgentAvatarValid() &&
+ if (isAgentAvatarValid() &&
!gAgentAvatarp->isDead() &&
(baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures.
(baked_upload_data->mTexLayerSet->hasComposite()))
{
LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite();
-
+ S32 failures = layerset_buffer->mUploadFailCount;
+ layerset_buffer->mUploadFailCount = 0;
+
if (layerset_buffer->mUploadID.isNull())
{
// The upload got canceled, we should be in the
@@ -626,20 +656,28 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
{
// This is the upload we're currently waiting for.
layerset_buffer->mUploadID.setNull();
+ const std::string name(baked_upload_data->mTexLayerSet->getBodyRegionName());
+ const std::string resolution = baked_upload_data->mIsHighestRes ? " full res " : " low res ";
if (result >= 0)
{
- layerset_buffer->mUploadPending = FALSE;
+ layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later
LLVOAvatarDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->mTexLayerSet);
// Update baked texture info with the new UUID
U64 now = LLFrameTimer::getTotalTime(); // Record starting time
- llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
+ llinfos << "Baked" << resolution << "texture upload for " << name << " took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
gAgentAvatarp->setNewBakedTexture(baked_te, uuid);
}
else
{
- // Avatar appearance is changing, ignore the upload results
- llinfos << "Baked upload failed. Reason: " << result << llendl;
- // *FIX: retry upload after n seconds, asset server could be busy
+ ++failures;
+ S32 max_attempts = baked_upload_data->mIsHighestRes ? BAKE_UPLOAD_ATTEMPTS : 1; // only retry final bakes
+ llwarns << "Baked" << resolution << "texture upload for " << name << " failed (attempt " << failures << "/" << max_attempts << ")" << llendl;
+ if (failures < max_attempts)
+ {
+ layerset_buffer->mUploadFailCount = failures;
+ layerset_buffer->mUploadRetryTimer.start();
+ layerset_buffer->requestUpload();
+ }
}
}
else
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 2d710d2dce..85dadb213c 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -312,6 +312,8 @@ private:
BOOL mUploadPending; // Whether we have received back the new baked textures
LLUUID mUploadID; // The current upload process (null if none).
LLFrameTimer mNeedsUploadTimer; // Tracks time since upload was requested and performed.
+ S32 mUploadFailCount; // Number of consecutive upload failures
+ LLFrameTimer mUploadRetryTimer; // Tracks time since last upload failure.
//--------------------------------------------------------------------
// Updates
@@ -363,12 +365,14 @@ struct LLBakedUploadData
{
LLBakedUploadData(const LLVOAvatarSelf* avatar,
LLTexLayerSet* layerset,
- const LLUUID& id);
+ const LLUUID& id,
+ bool highest_res);
~LLBakedUploadData() {}
const LLUUID mID;
const LLVOAvatarSelf* mAvatar; // note: backlink only; don't LLPointer
LLTexLayerSet* mTexLayerSet;
const U64 mStartTime; // for measuring baked texture upload time
+ const bool mIsHighestRes; // whether this is a "final" bake, or intermediate low res
};
#endif // LL_LLTEXLAYER_H
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 87ca80260f..b87ca1eaec 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -566,7 +566,7 @@ bool toggle_show_object_render_cost(const LLSD& newvalue)
return true;
}
-void toggle_updater_service_active(LLControlVariable* control, const LLSD& new_value)
+void toggle_updater_service_active(const LLSD& new_value)
{
if(new_value.asInteger())
{
@@ -735,7 +735,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));
gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
- gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(&toggle_updater_service_active);
+ gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(boost::bind(&toggle_updater_service_active, _2));
gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));
gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));
}
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 911fc8e1ed..39053fe9e4 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -616,6 +616,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")
&& gSavedSettings.getBOOL("UseOcclusion")
&& gGLManager.mHasOcclusionQuery) ? 2 : 0;
+ LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
/*if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)
{ //force occlusion on for all render types if doing deferred render (tighter shadow frustum)
@@ -709,6 +710,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
//if (!for_snapshot)
{
LLMemType mt_gw(LLMemType::MTYPE_DISPLAY_GEN_REFLECTION);
@@ -717,6 +721,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
gPipeline.generateHighlight(*LLViewerCamera::getInstance());
}
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
//////////////////////////////////////
//
// Update images, using the image stats generated during object update/culling
@@ -743,6 +750,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLImageGL::deleteDeadTextures();
stop_glerror();
}
+
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
///////////////////////////////////
//
// StateSort
@@ -770,6 +781,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
}
}
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
LLPipeline::sUseOcclusion = occlusion;
{
@@ -828,6 +842,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;
LLPipeline::refreshRenderDeferred();
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
stop_glerror();
if (to_texture)
@@ -878,6 +895,14 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
stop_glerror();
}
+ for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
+ { //dummy cleanup of any currently bound textures
+ if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
+ {
+ gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
+ gGL.getTexUnit(i)->disable();
+ }
+ }
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");
if (to_texture)
@@ -1339,7 +1364,7 @@ void render_ui_2d()
}
stop_glerror();
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ //gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
// render outline for HUD
if (isAgentAvatarValid() && gAgentCamera.mHUDCurZoom < 0.98f)
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 0e58f54f8b..77afd0ea22 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -246,15 +246,11 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>);
LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>);
- LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml",
- &LLFloaterReg::build<LLFloaterTestInspectors>);
+ LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml", &LLFloaterReg::build<LLFloaterTestInspectors>);
//LLFloaterReg::add("test_list_view", "floater_test_list_view.xml",&LLFloaterReg::build<LLFloaterTestListView>);
- LLFloaterReg::add("test_textbox", "floater_test_textbox.xml",
- &LLFloaterReg::build<LLFloater>);
- LLFloaterReg::add("test_text_editor", "floater_test_text_editor.xml",
- &LLFloaterReg::build<LLFloater>);
- LLFloaterReg::add("test_widgets", "floater_test_widgets.xml",
- &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("test_textbox", "floater_test_textbox.xml", &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("test_text_editor", "floater_test_text_editor.xml", &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("test_widgets", "floater_test_widgets.xml", &LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("top_objects", "floater_top_objects.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTopObjects>);
LLFloaterReg::add("reporter", "floater_report_abuse.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterReporter>);
@@ -274,7 +270,9 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>);
LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>);
- LLFloaterReg::add("search", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
+ LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
+ LLFloaterReg::add("profile", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWebContent>);
+
LLFloaterUIPreviewUtil::registerFloater();
LLFloaterReg::add("upload_anim", "floater_animation_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload");
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index a37f8ad0d8..f74bcafc5c 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -44,6 +44,7 @@
#include "llbottomtray.h"
#include "llcompilequeue.h"
#include "llconsole.h"
+#include "lldaycyclemanager.h"
#include "lldebugview.h"
#include "llenvmanager.h"
#include "llfilepicker.h"
@@ -100,6 +101,7 @@
#include "llworldmap.h"
#include "pipeline.h"
#include "llviewerjoystick.h"
+#include "llwaterparammanager.h"
#include "llwlanimator.h"
#include "llwlparammanager.h"
#include "llfloatercamera.h"
@@ -7667,6 +7669,40 @@ class LLWorldEnvPreset : public view_listener_t
}
};
+class LLWorldEnableEnvPreset : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string item = userdata.asString();
+
+ if (item == "delete_water")
+ {
+ LLWaterParamManager::preset_name_list_t user_waters;
+ LLWaterParamManager::instance().getUserPresetNames(user_waters);
+ return !user_waters.empty();
+ }
+ else if (item == "delete_sky")
+ {
+ LLWLParamManager::preset_name_list_t user_skies;
+ LLWLParamManager::instance().getUserPresetNames(user_skies);
+ return !user_skies.empty();
+ }
+ else if (item == "delete_day_cycle")
+ {
+ LLDayCycleManager::preset_name_list_t user_days;
+ LLDayCycleManager::instance().getUserPresetNames(user_days);
+ return !user_days.empty();
+ }
+ else
+ {
+ llwarns << "Unknown item" << llendl;
+ }
+
+ return false;
+ }
+};
+
+
/// Post-Process callbacks
class LLWorldPostProcess : public view_listener_t
{
@@ -7906,6 +7942,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings");
view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset");
+ view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls");
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 44b3a85f25..e934c38c22 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4346,8 +4346,7 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
LLWorld::getInstance()->setSpaceTimeUSec(space_time_usec);
- LL_DEBUGS("Windlight Sync") << "time_synch() - " << sun_direction << ", " << sun_ang_velocity
- << ", " << phase << LL_ENDL;
+ LL_DEBUGS("Windlight Sync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL;
gSky.setSunPhase(phase);
gSky.setSunTargetDirection(sun_direction, sun_ang_velocity);
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index a59afdc28a..ef5c65eb87 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -35,7 +35,7 @@
#include "llweb.h"
-const char* DEFAULT_LOGIN_PAGE = "http://secondlife.com/app/login/";
+const char* DEFAULT_LOGIN_PAGE = "http://viewer-login.agni.lindenlab.com/";
const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";
const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 9f882ee732..48ccc7d035 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1339,18 +1339,29 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
S32 num_removed = 0;
LLViewerObject *objectp;
- for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); )
+
+ vobj_list_t::reverse_iterator target = mObjects.rbegin();
+
+ vobj_list_t::iterator iter = mObjects.begin();
+ for ( ; iter != mObjects.end(); )
{
- // Scan for all of the dead objects and remove any "global" references to them.
+ // Scan for all of the dead objects and put them all on the end of the list with no ref count ops
objectp = *iter;
+ if (objectp == NULL)
+ { //we caught up to the dead tail
+ break;
+ }
+
if (objectp->isDead())
{
- iter = mObjects.erase(iter);
+ LLPointer<LLViewerObject>::swap(*iter, *target);
+ *target = NULL;
+ ++target;
num_removed++;
- if (num_removed == mNumDeadObjects)
+ if (num_removed == mNumDeadObjects || iter->isNull())
{
- // We've cleaned up all of the dead objects.
+ // We've cleaned up all of the dead objects or caught up to the dead tail
break;
}
}
@@ -1360,6 +1371,11 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
}
}
+ llassert(num_removed == mNumDeadObjects);
+
+ //erase as a block
+ mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end());
+
// We've cleaned the global object list, now let's do some paranoia testing on objects
// before blowing away the dead list.
mDeadObjects.clear();
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 8ba231b28c..bb7170e0f7 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -645,6 +645,7 @@ void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
{
// send it to 'observers'
// *TODO: switch the floaters to using LLRegionInfoModel
+ llinfos << "Processing region info" << llendl;
LLRegionInfoModel::instance().update(msg);
LLFloaterGodTools::processRegionInfo(msg);
LLFloaterRegionInfo::processRegionInfo(msg);
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index e473901609..62d83b516f 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -61,6 +61,12 @@ BOOL LLViewerShaderMgr::sInitialized = FALSE;
LLVector4 gShinyOrigin;
+//utility shaders
+LLGLSLShader gOcclusionProgram;
+LLGLSLShader gCustomAlphaProgram;
+LLGLSLShader gGlowCombineProgram;
+LLGLSLShader gTwoTextureAddProgram;
+
//object shaders
LLGLSLShader gObjectSimpleProgram;
LLGLSLShader gObjectSimpleWaterProgram;
@@ -70,6 +76,7 @@ LLGLSLShader gObjectFullbrightShinyProgram;
LLGLSLShader gObjectFullbrightShinyWaterProgram;
LLGLSLShader gObjectShinyProgram;
LLGLSLShader gObjectShinyWaterProgram;
+LLGLSLShader gObjectBumpProgram;
LLGLSLShader gObjectSimpleNonIndexedProgram;
LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
@@ -166,14 +173,24 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gWLCloudProgram);
mShaderList.push_back(&gAvatarProgram);
mShaderList.push_back(&gObjectShinyProgram);
+ mShaderList.push_back(&gObjectShinyNonIndexedProgram);
mShaderList.push_back(&gWaterProgram);
mShaderList.push_back(&gAvatarEyeballProgram);
mShaderList.push_back(&gObjectSimpleProgram);
+ mShaderList.push_back(&gObjectBumpProgram);
+ mShaderList.push_back(&gUIProgram);
+ mShaderList.push_back(&gCustomAlphaProgram);
+ mShaderList.push_back(&gGlowCombineProgram);
+ mShaderList.push_back(&gTwoTextureAddProgram);
+ mShaderList.push_back(&gSolidColorProgram);
+ mShaderList.push_back(&gOcclusionProgram);
mShaderList.push_back(&gObjectFullbrightProgram);
mShaderList.push_back(&gObjectFullbrightShinyProgram);
mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);
mShaderList.push_back(&gObjectSimpleNonIndexedProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedWaterProgram);
mShaderList.push_back(&gObjectFullbrightNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightNonIndexedWaterProgram);
mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);
mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);
mShaderList.push_back(&gSkinnedObjectSimpleProgram);
@@ -190,6 +207,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gObjectFullbrightWaterProgram);
mShaderList.push_back(&gAvatarWaterProgram);
mShaderList.push_back(&gObjectShinyWaterProgram);
+ mShaderList.push_back(&gObjectShinyNonIndexedWaterProgram);
mShaderList.push_back(&gUnderWaterProgram);
mShaderList.push_back(&gDeferredSunProgram);
mShaderList.push_back(&gDeferredBlurLightProgram);
@@ -410,9 +428,13 @@ void LLViewerShaderMgr::setShaders()
}
mMaxAvatarShaderLevel = 0;
+ LLGLSLShader::sNoFixedFunction = false;
if (LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")
&& gSavedSettings.getBOOL("VertexShaderEnable"))
{
+ //using shaders, disable fixed function
+ LLGLSLShader::sNoFixedFunction = true;
+
S32 light_class = 2;
S32 env_class = 2;
S32 obj_class = 2;
@@ -554,6 +576,7 @@ void LLViewerShaderMgr::setShaders()
}
else
{
+ LLGLSLShader::sNoFixedFunction = false;
gPipeline.mVertexShadersEnabled = FALSE;
gPipeline.mVertexShadersLoaded = 0;
mVertexShaderLevel[SHADER_LIGHTING] = 0;
@@ -568,6 +591,7 @@ void LLViewerShaderMgr::setShaders()
}
else
{
+ LLGLSLShader::sNoFixedFunction = false;
gPipeline.mVertexShadersEnabled = FALSE;
gPipeline.mVertexShadersLoaded = 0;
mVertexShaderLevel[SHADER_LIGHTING] = 0;
@@ -591,7 +615,15 @@ void LLViewerShaderMgr::setShaders()
void LLViewerShaderMgr::unloadShaders()
{
+ gOcclusionProgram.unload();
+ gUIProgram.unload();
+ gCustomAlphaProgram.unload();
+ gGlowCombineProgram.unload();
+ gTwoTextureAddProgram.unload();
+ gSolidColorProgram.unload();
+
gObjectSimpleProgram.unload();
+ gObjectBumpProgram.unload();
gObjectSimpleWaterProgram.unload();
gObjectFullbrightProgram.unload();
gObjectFullbrightWaterProgram.unload();
@@ -1581,6 +1613,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightShinyWaterProgram.unload();
gObjectShinyWaterProgram.unload();
gObjectSimpleProgram.unload();
+ gObjectBumpProgram.unload();
gObjectSimpleWaterProgram.unload();
gObjectFullbrightProgram.unload();
gObjectFullbrightWaterProgram.unload();
@@ -1753,6 +1786,22 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectBumpProgram.mName = "Bump Shader";
+ /*gObjectBumpProgram.mFeatures.calculatesLighting = true;
+ gObjectBumpProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectBumpProgram.mFeatures.hasGamma = true;
+ gObjectBumpProgram.mFeatures.hasAtmospherics = true;
+ gObjectBumpProgram.mFeatures.hasLighting = true;
+ gObjectBumpProgram.mFeatures.mIndexedTextureChannels = 0;*/
+ gObjectBumpProgram.mShaderFiles.clear();
+ gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectBumpProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gObjectSimpleWaterProgram.mName = "Simple Water Shader";
gObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
gObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
@@ -2135,6 +2184,85 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
success = gHighlightProgram.createShader(NULL, NULL);
}
+ if (success)
+ {
+ gUIProgram.mName = "UI Shader";
+ gUIProgram.mShaderFiles.clear();
+ gUIProgram.mShaderFiles.push_back(make_pair("interface/uiV.glsl", GL_VERTEX_SHADER_ARB));
+ gUIProgram.mShaderFiles.push_back(make_pair("interface/uiF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gUIProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gUIProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gCustomAlphaProgram.mName = "Custom Alpha Shader";
+ gCustomAlphaProgram.mShaderFiles.clear();
+ gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaV.glsl", GL_VERTEX_SHADER_ARB));
+ gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gCustomAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gCustomAlphaProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gGlowCombineProgram.mName = "Glow Combine Shader";
+ gGlowCombineProgram.mShaderFiles.clear();
+ gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineV.glsl", GL_VERTEX_SHADER_ARB));
+ gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gGlowCombineProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gGlowCombineProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gGlowCombineProgram.bind();
+ gGlowCombineProgram.uniform1i("glowMap", 0);
+ gGlowCombineProgram.uniform1i("screenMap", 1);
+ gGlowCombineProgram.unbind();
+ }
+ }
+
+ if (success)
+ {
+ gTwoTextureAddProgram.mName = "Two Texture Add Shader";
+ gTwoTextureAddProgram.mShaderFiles.clear();
+ gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddV.glsl", GL_VERTEX_SHADER_ARB));
+ gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gTwoTextureAddProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gTwoTextureAddProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gTwoTextureAddProgram.bind();
+ gTwoTextureAddProgram.uniform1i("tex0", 0);
+ gTwoTextureAddProgram.uniform1i("tex1", 1);
+ }
+ }
+
+ if (success)
+ {
+ gSolidColorProgram.mName = "Solid Color Shader";
+ gSolidColorProgram.mShaderFiles.clear();
+ gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorV.glsl", GL_VERTEX_SHADER_ARB));
+ gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSolidColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gSolidColorProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gSolidColorProgram.bind();
+ gSolidColorProgram.uniform1i("tex0", 0);
+ gSolidColorProgram.unbind();
+ }
+ }
+
+ if (success)
+ {
+ gOcclusionProgram.mName = "Occlusion Shader";
+ gOcclusionProgram.mShaderFiles.clear();
+ gOcclusionProgram.mShaderFiles.push_back(make_pair("interface/occlusionV.glsl", GL_VERTEX_SHADER_ARB));
+ gOcclusionProgram.mShaderFiles.push_back(make_pair("interface/occlusionF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gOcclusionProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gOcclusionProgram.createShader(NULL, NULL);
+ }
+
if( !success )
{
mVertexShaderLevel[SHADER_INTERFACE] = 0;
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index efef9ec5b2..93a0ecc4f0 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -287,6 +287,14 @@ inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShade
extern LLVector4 gShinyOrigin;
+//utility shaders
+extern LLGLSLShader gOcclusionProgram;
+extern LLGLSLShader gCustomAlphaProgram;
+extern LLGLSLShader gGlowCombineProgram;
+
+//output tex0[tc0] + tex1[tc1]
+extern LLGLSLShader gTwoTextureAddProgram;
+
//object shaders
extern LLGLSLShader gObjectSimpleProgram;
extern LLGLSLShader gObjectSimpleWaterProgram;
@@ -296,6 +304,7 @@ extern LLGLSLShader gObjectFullbrightProgram;
extern LLGLSLShader gObjectFullbrightWaterProgram;
extern LLGLSLShader gObjectFullbrightNonIndexedProgram;
extern LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
+extern LLGLSLShader gObjectBumpProgram;
extern LLGLSLShader gObjectSimpleLODProgram;
extern LLGLSLShader gObjectFullbrightLODProgram;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 4da0f80a00..5fcc57bc91 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -599,7 +599,7 @@ bool LLViewerTexture::bindDefaultImage(S32 stage)
}
if (!res && LLViewerTexture::sNullImagep.notNull() && (this != LLViewerTexture::sNullImagep))
{
- res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep) ;
+ res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep);
}
if (!res)
{
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index d24174adea..30ef8b8a29 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -115,7 +115,7 @@ void LLViewerTextureList::doPreloadImages()
// Set the "white" image
LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI);
-
+ LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
LLUIImageList* image_list = LLUIImageList::getInstance();
image_list->initFromFile();
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 260840e8e4..f04337ca89 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1578,6 +1578,25 @@ LLViewerWindow::LLViewerWindow(
ignore_pixel_depth,
gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
+ if (NULL == mWindow)
+ {
+ LLSplashScreen::update(LLTrans::getString("StartupRequireDriverUpdate"));
+
+ LL_WARNS("Window") << "Failed to create window, to be shutting Down, be sure your graphics driver is updated." << llendl ;
+
+ ms_sleep(5000) ; //wait for 5 seconds.
+
+ LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
+#if LL_LINUX || LL_SOLARIS
+ llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information."
+ << llendl;
+#else
+ LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings"
+ << LL_ENDL;
+#endif
+ LLAppViewer::instance()->fastQuit(1);
+ }
+
if (!LLAppViewer::instance()->restoreErrorTrap())
{
LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
@@ -1593,19 +1612,6 @@ LLViewerWindow::LLViewerWindow(
gSavedSettings.setS32("FullScreenHeight",scr.mY);
}
- if (NULL == mWindow)
- {
- LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
-#if LL_LINUX || LL_SOLARIS
- llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information."
- << llendl;
-#else
- LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings"
- << LL_ENDL;
-#endif
- LLAppViewer::instance()->fastQuit(1);
- }
-
// Get the real window rect the window was created with (since there are various OS-dependent reasons why
// the size of a window or fullscreen context may have been adjusted slightly...)
F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor");
@@ -2296,6 +2302,11 @@ void LLViewerWindow::draw()
// Draw all nested UI views.
// No translation needed, this view is glued to 0,0
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
gGL.pushMatrix();
LLUI::pushMatrix();
{
@@ -2370,6 +2381,11 @@ void LLViewerWindow::draw()
LLUI::popMatrix();
gGL.popMatrix();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
+
//#if LL_DEBUG
LLView::sIsDrawing = FALSE;
//#endif
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 8eda6346b0..3f98df9eb9 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7270,9 +7270,9 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
llinfos << "Re-requesting AvatarAppearance for object: " << getID() << llendl;
LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID());
mRuthTimer.reset();
- }
- else
- {
+ }
+ else
+ {
llinfos << "That's okay, we already have a non-default shape for object: " << getID() << llendl;
// we don't really care.
}
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index cd2bbad620..0db0010688 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -7049,6 +7049,8 @@ LLVivoxProtocolParser::~LLVivoxProtocolParser()
XML_ParserFree(parser);
}
+static LLFastTimer::DeclareTimer FTM_VIVOX_PROCESS("Vivox Process");
+
// virtual
LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
const LLChannelDescriptors& channels,
@@ -7057,6 +7059,7 @@ LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_VIVOX_PROCESS);
LLBufferStream istr(channels, buffer.get());
std::ostringstream ostr;
while (istr.good())
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 3c7fe708e6..890861df71 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -51,6 +51,7 @@
#include "llspatialpartition.h"
#include "llnotificationsutil.h"
#include "raytrace.h"
+#include "llglslshader.h"
extern LLPipeline gPipeline;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e6da8eb89d..4c137d3394 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -3743,6 +3743,11 @@ bool can_batch_texture(LLFace* facep)
return false;
}
+ if (facep->getTexture() && facep->getTexture()->getPrimaryFormat() == GL_ALPHA)
+ { //can't batch invisiprims
+ return false;
+ }
+
if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
{ //texture animation breaks batches
return false;
@@ -4361,6 +4366,8 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->mBuilt = 1.f;
+ std::set<LLVertexBuffer*> mapped_buffers;
+
for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
{
LLFastTimer t(FTM_VOLUME_GEOM_PARTIAL);
@@ -4375,35 +4382,31 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
LLFace* face = drawablep->getFace(i);
- if (face && face->getVertexBuffer())
+ if (face)
{
- face->getGeometryVolume(*volume, face->getTEOffset(),
- vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (buff)
+ {
+ face->getGeometryVolume(*volume, face->getTEOffset(),
+ vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
+
+ if (buff->isLocked())
+ {
+ mapped_buffers.insert(buff);
+ }
+ }
}
}
-
+
drawablep->clearState(LLDrawable::REBUILD_ALL);
}
}
- //unmap all the buffers
- for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i)
+ for (std::set<LLVertexBuffer*>::iterator iter = mapped_buffers.begin(); iter != mapped_buffers.end(); ++iter)
{
- LLSpatialGroup::buffer_texture_map_t& map = i->second;
- for (LLSpatialGroup::buffer_texture_map_t::iterator j = map.begin(); j != map.end(); ++j)
- {
- LLSpatialGroup::buffer_list_t& list = j->second;
- for (LLSpatialGroup::buffer_list_t::iterator k = list.begin(); k != list.end(); ++k)
- {
- LLVertexBuffer* buffer = *k;
- if (buffer->isLocked())
- {
- buffer->setBuffer(0);
- }
- }
- }
+ (*iter)->setBuffer(0);
}
-
+
// don't forget alpha
if(group != NULL &&
!group->mVertexBuffer.isNull() &&
@@ -4713,6 +4716,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
const LLTextureEntry* te = facep->getTextureEntry();
+ tex = facep->getTexture();
BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE;
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp
index 69ebad61ac..e70ac0a2e7 100644
--- a/indra/newview/llvowater.cpp
+++ b/indra/newview/llvowater.cpp
@@ -282,6 +282,11 @@ void LLVOWater::updateSpatialExtents(LLVector4a &newMin, LLVector4a& newMax)
U32 LLVOWater::getPartitionType() const
{
+ if (mIsEdgePatch)
+ {
+ return LLViewerRegion::PARTITION_VOIDWATER;
+ }
+
return LLViewerRegion::PARTITION_WATER;
}
@@ -300,6 +305,7 @@ LLWaterPartition::LLWaterPartition()
LLVoidWaterPartition::LLVoidWaterPartition()
{
+ mOcclusionEnabled = FALSE;
mDrawableType = LLPipeline::RENDER_TYPE_VOIDWATER;
mPartitionType = LLViewerRegion::PARTITION_VOIDWATER;
}
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index 257884d921..bd1d2ed7a7 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -394,16 +394,18 @@ bool LLXMLRPCTransaction::Impl::process()
}
}
- const F32 MAX_PROCESSING_TIME = 0.05f;
- LLTimer timer;
+ //const F32 MAX_PROCESSING_TIME = 0.05f;
+ //LLTimer timer;
- while (mCurlRequest->perform() > 0)
+ mCurlRequest->perform();
+
+ /*while (mCurlRequest->perform() > 0)
{
if (timer.getElapsedTimeF32() >= MAX_PROCESSING_TIME)
{
return false;
}
- }
+ }*/
while(1)
{
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e74bf2a620..dfcc7396ba 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -336,10 +336,10 @@ static const U32 gl_cube_face[] =
void validate_framebuffer_object();
-void addDeferredAttachments(LLRenderTarget& target)
+bool addDeferredAttachments(LLRenderTarget& target)
{
- target.addColorAttachment(GL_RGBA); //specular
- target.addColorAttachment(GL_RGBA); //normal+z
+ return target.addColorAttachment(GL_RGBA) && //specular
+ target.addColorAttachment(GL_RGBA); //normal+z
}
LLPipeline::LLPipeline() :
@@ -586,18 +586,61 @@ void LLPipeline::allocatePhysicsBuffer()
void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
- // remember these dimensions
- mScreenWidth = resX;
- mScreenHeight = resY;
-
- //cap samples at 4 for render targets to avoid out of memory errors
U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));
if (gGLManager.mIsATI)
- { //disable multisampling of render targets where ATI is involved
+ { //ATI doesn't like the way we use multisample texture
samples = 0;
}
+ //try to allocate screen buffers at requested resolution and samples
+ // - on failure, shrink number of samples and try again
+ // - if not multisampled, shrink resolution and try again (favor X resolution over Y)
+ // Make sure to call "releaseScreenBuffers" after each failure to cleanup the partially loaded state
+
+ if (!allocateScreenBuffer(resX, resY, samples))
+ {
+ releaseScreenBuffers();
+ //reduce number of samples
+ while (samples > 0)
+ {
+ samples /= 2;
+ if (allocateScreenBuffer(resX, resY, samples))
+ { //success
+ return;
+ }
+ releaseScreenBuffers();
+ }
+
+ //reduce resolution
+ while (resY > 0 && resX > 0)
+ {
+ resY /= 2;
+ if (allocateScreenBuffer(resX, resY, samples))
+ {
+ return;
+ }
+ releaseScreenBuffers();
+
+ resX /= 2;
+ if (allocateScreenBuffer(resX, resY, samples))
+ {
+ return;
+ }
+ releaseScreenBuffers();
+ }
+
+ llwarns << "Unable to allocate screen buffer at any resolution!" << llendl;
+ }
+}
+
+
+bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
+{
+ // remember these dimensions
+ mScreenWidth = resX;
+ mScreenHeight = resY;
+
U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
if (res_mod > 1 && res_mod < resX && res_mod < resY)
@@ -608,7 +651,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (gSavedSettings.getBOOL("RenderUIBuffer"))
{
- mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ if (!mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE))
+ {
+ return false;
+ }
}
if (LLPipeline::sRenderDeferred)
@@ -618,22 +664,22 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
bool gi = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED);
//allocate deferred rendering color buffers
- mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
- mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
- addDeferredAttachments(mDeferredScreen);
+ if (!mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
+ if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
+ if (!addDeferredAttachments(mDeferredScreen)) return false;
- mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
+ if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
#if LL_DARWIN
// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
- mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ if (!mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
#else
- mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ if (!mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
#endif
if (shadow_detail > 0 || ssao)
{ //only need mDeferredLight[0] for shadows OR ssao
- mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ if (!mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
}
else
{
@@ -642,7 +688,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (ssao)
{ //only need mDeferredLight[1] for ssao
- mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false);
+ if (!mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false)) return false;
}
else
{
@@ -651,14 +697,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (gi)
{ //only need mDeferredLight[2] and mGIMapPost for gi
- mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false);
+ if (!mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false)) return false;
for (U32 i = 0; i < 2; i++)
{
#if LL_DARWIN
// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
- mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ if (!mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
#else
- mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ if (!mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
#endif
}
}
@@ -685,7 +731,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{ //allocate 4 sun shadow maps
for (U32 i = 0; i < 4; i++)
{
- mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ if (!mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
}
}
else
@@ -703,7 +749,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{ //allocate two spot shadow maps
for (U32 i = 4; i < 6; i++)
{
- mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE);
+ if (!mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE)) return false;
}
}
else
@@ -716,7 +762,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
width = nhpo2(resX)/2;
height = nhpo2(resY)/2;
- mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE);
+ if (!mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE)) return false;
}
else
{
@@ -738,7 +784,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
mEdgeMap.release();
mLuminanceMap.release();
- mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
}
if (LLPipeline::sRenderDeferred)
@@ -750,6 +796,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
stop_glerror();
+ return true;
}
//static
@@ -800,9 +847,23 @@ void LLPipeline::releaseGLBuffers()
mWaterRef.release();
mWaterDis.release();
+
+ for (U32 i = 0; i < 3; i++)
+ {
+ mGlow[i].release();
+ }
+
+ releaseScreenBuffers();
+
+ gBumpImageList.destroyGL();
+ LLVOAvatar::resetImpostors();
+}
+
+void LLPipeline::releaseScreenBuffers()
+{
+ mUIScreen.release();
mScreen.release();
mPhysicsDisplay.release();
- mUIScreen.release();
mDeferredScreen.release();
mDeferredDepth.release();
for (U32 i = 0; i < 3; i++)
@@ -821,16 +882,9 @@ void LLPipeline::releaseGLBuffers()
{
mShadow[i].release();
}
-
- for (U32 i = 0; i < 3; i++)
- {
- mGlow[i].release();
- }
-
- gBumpImageList.destroyGL();
- LLVOAvatar::resetImpostors();
}
+
void LLPipeline::createGLBuffers()
{
LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS);
@@ -1983,6 +2037,14 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ bool bound_shader = false;
+ if (gPipeline.canUseVertexShaders() && LLGLSLShader::sCurBoundShader == 0)
+ { //if no shader is currently bound, use the occlusion shader instead of fixed function if we can
+ // (shadow render uses a special shader that clamps to clip planes)
+ bound_shader = true;
+ gOcclusionProgram.bind();
+ }
+
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
@@ -2010,6 +2072,11 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
}
}
+ if (bound_shader)
+ {
+ gOcclusionProgram.unbind();
+ }
+
camera.disableUserClipPlane();
if (hasRenderType(LLPipeline::RENDER_TYPE_SKY) &&
@@ -2133,7 +2200,21 @@ void LLPipeline::doOcclusion(LLCamera& camera)
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
+
+ bool bind_shader = LLGLSLShader::sNoFixedFunction && LLGLSLShader::sCurBoundShader == 0;
+ if (bind_shader)
+ {
+ if (LLPipeline::sShadowRender)
+ {
+ gDeferredShadowProgram.bind();
+ }
+ else
+ {
+ gOcclusionProgram.bind();
+ }
+ }
+
for (LLCullResult::sg_list_t::iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -2141,6 +2222,18 @@ void LLPipeline::doOcclusion(LLCamera& camera)
group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);
}
+ if (bind_shader)
+ {
+ if (LLPipeline::sShadowRender)
+ {
+ gDeferredShadowProgram.unbind();
+ }
+ else
+ {
+ gOcclusionProgram.unbind();
+ }
+ }
+
gGL.setColorMask(true, false);
}
}
@@ -3249,6 +3342,11 @@ void render_hud_elements()
gGL.color4f(1,1,1,1);
if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
gViewerWindow->renderSelections(FALSE, FALSE, FALSE); // For HUD version in render_ui_3d()
@@ -3262,6 +3360,10 @@ void render_hud_elements()
// Render name tags.
LLHUDObject::renderAll();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
}
else if (gForceRenderLandFence)
{
@@ -3599,8 +3701,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
check_stack_depth(stack_depth);
std::string msg = llformat("pass %d", i);
LLGLState::checkStates(msg);
- LLGLState::checkTextureChannels(msg);
- LLGLState::checkClientArrays(msg);
+ //LLGLState::checkTextureChannels(msg);
+ //LLGLState::checkClientArrays(msg);
}
}
}
@@ -3638,16 +3740,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLVertexBuffer::unbind();
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
-
-
-
- stop_glerror();
-
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderHighlights");
@@ -3701,8 +3793,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLVertexBuffer::unbind();
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
+// LLGLState::checkTextureChannels();
+// LLGLState::checkClientArrays();
}
void LLPipeline::renderGeomDeferred(LLCamera& camera)
@@ -3785,8 +3877,6 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
llerrs << "GL matrix stack corrupted!" << llendl;
}
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
}
}
}
@@ -3879,8 +3969,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
llerrs << "GL matrix stack corrupted!" << llendl;
}
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
}
}
}
@@ -3955,8 +4043,6 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
LLVertexBuffer::unbind();
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
}
}
else
@@ -6449,30 +6535,39 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
LLGLDisable blend(GL_BLEND);
- //tex unit 0
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
-
- gGL.getTexUnit(0)->bind(&mGlow[1]);
- gGL.getTexUnit(1)->activate();
- gGL.getTexUnit(1)->enable(LLTexUnit::TT_RECT_TEXTURE);
-
-
- //tex unit 1
- gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gGlowCombineProgram.bind();
+ }
+ else
+ {
+ //tex unit 0
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
+ //tex unit 1
+ gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
+ }
+ gGL.getTexUnit(0)->bind(&mGlow[1]);
gGL.getTexUnit(1)->bind(&mScreen);
- gGL.getTexUnit(1)->activate();
LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
buff->setBuffer(mask);
buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3);
- gGL.getTexUnit(1)->disable();
- gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gGlowCombineProgram.unbind();
+ }
+ else
+ {
+ gGL.getTexUnit(1)->disable();
+ gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
- gGL.getTexUnit(0)->activate();
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ gGL.getTexUnit(0)->activate();
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
+
}
if (LLRenderTarget::sUseFBO)
@@ -6485,6 +6580,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
{
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
gGL.setColorMask(true, false);
LLVector2 tc1(0,0);
@@ -6508,6 +6608,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.end();
gGL.flush();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
+
}
glMatrixMode(GL_PROJECTION);
@@ -7923,7 +8029,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
static LLCullResult ref_result;
- if (LLDrawPoolWater::sNeedsDistortionUpdate)
+ if (LLDrawPoolWater::sNeedsReflectionUpdate)
{
//initial sky pass (no user clip plane)
{ //mask out everything but the sky
@@ -8063,8 +8169,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLViewerCamera::getInstance()->setUserClipPlane(npnorm);
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
if (!skip_avatar_update)
{
@@ -8197,6 +8301,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
LLVertexBuffer::unbind();
{
+ if (!use_shader)
+ { //occlusion program is general purpose depth-only no-textures
+ gOcclusionProgram.bind();
+ }
LLFastTimer ftm(FTM_SHADOW_SIMPLE);
LLGLDisable test(GL_ALPHA_TEST);
gGL.getTexUnit(0)->disable();
@@ -8205,6 +8313,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
renderObjects(types[i], LLVertexBuffer::MAP_VERTEX, FALSE);
}
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ if (!use_shader)
+ {
+ gOcclusionProgram.unbind();
+ }
}
if (use_shader)
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index e9da25e544..28e6526acd 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -113,9 +113,11 @@ public:
void resetVertexBuffers();
void resizeScreenTexture();
void releaseGLBuffers();
+ void releaseScreenBuffers();
void createGLBuffers();
void allocateScreenBuffer(U32 resX, U32 resY);
+ bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);
void allocatePhysicsBuffer();
void resetVertexBuffers(LLDrawable* drawable);
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 38d04b4b5c..a53dece422 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -62,12 +62,12 @@ IDI_LCD_LL_ICON ICON "icon1.ico"
// Dialog
//
-SPLASHSCREEN DIALOG 32, 32, 144, 34
+SPLASHSCREEN DIALOG 32, 32, 264, 34
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE
FONT 8, "MS Sans Serif"
BEGIN
ICON IDI_LL_ICON,IDC_STATIC,7,7,20,20
- LTEXT "Loading Second Life...",666,36,13,91,8
+ LTEXT "Loading Second Life...",666,36,13,211,8
END
@@ -82,7 +82,7 @@ BEGIN
"SPLASHSCREEN", DIALOG
BEGIN
LEFTMARGIN, 7
- RIGHTMARGIN, 137
+ RIGHTMARGIN, 257
VERTGUIDE, 36
TOPMARGIN, 7
BOTTOMMARGIN, 27
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png
new file mode 100644
index 0000000000..956e02b14d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png
new file mode 100644
index 0000000000..434caeda8b
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png
new file mode 100644
index 0000000000..064687ed0f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png
new file mode 100644
index 0000000000..5465650d0c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index c2757f2c94..799cd907dc 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -1,4 +1,4 @@
-<!--
+<!--
This file contains metadata about how to load, display, and scale textures for rendering in the UI.
Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
to them by filename (relative to textures directory).
@@ -390,6 +390,10 @@ with the same filename but different name
<texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
<texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
<texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Dark" file_name="icons/Parcel_SeeAVsOff_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Dark" file_name="icons/Parcel_SeeAVsOn_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Light" file_name="icons/Parcel_SeeAVsOff_Light.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Light" file_name="icons/Parcel_SeeAVsOn_Light.png" preload="false" />
<texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
<texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/da/panel_edit_pick.xml b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
index fd287b1a0a..3036f30240 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Gem valgte" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annullér" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 68b861fe92..b5d8ac44bc 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -1209,9 +1209,6 @@ Prøv venligst om lidt igen.
<string name="InvFolder My Inventory">
Min beholdning
</string>
- <string name="InvFolder My Favorites">
- Mine favoritter
- </string>
<string name="InvFolder Library">
Bibliotek
</string>
@@ -1270,10 +1267,10 @@ Prøv venligst om lidt igen.
Bevægelser
</string>
<string name="InvFolder Favorite">
- Favoritter
+ Mine favoritter
</string>
<string name="InvFolder favorite">
- Favoritter
+ Mine favoritter
</string>
<string name="InvFolder Current Outfit">
Nuværende sæt
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index f0fa4386d2..c65dc5f41d 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -133,12 +133,12 @@
0
</text>
<button label="Land kaufen" label_selected="Land kaufen..." name="Buy Land..."/>
+ <button label="Linden-Verkauf" label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
<button label="Skriptinfo" name="Scripts..."/>
<button label="Für Gruppe kaufen" label_selected="Für Gruppe kaufen..." name="Buy For Group..."/>
<button label="Pass kaufen" label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/>
<button label="Land aufgeben" label_selected="Land aufgeben..." name="Abandon Land..."/>
<button label="Land in Besitz nehmen" label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/>
- <button label="Linden-Verkauf" label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
</panel>
<panel label="VERTRAG" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -309,6 +309,9 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<panel.string name="push_restrict_region_text">
Kein Stoßen (regional)
</panel.string>
+ <panel.string name="see_avs_text">
+ Auf dieser Parzelle Einwohner sehen und mit ihnen chatten
+ </panel.string>
<text name="allow_label">
Anderen Einwohnern gestatten:
</text>
@@ -371,6 +374,10 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+ <text name="allow_label5">
+ Einwohnern auf anderen Parzellen Folgendes gestatten:
+ </text>
+ <check_box label="Avatare sehen" name="SeeAvatarsCheck" tool_tip="Gestattet sowohl Einwohnern auf anderen Parzellen, Einwohner auf dieser Parzelle zu sehen und mit ihnen zu chatten, als auch Ihnen, diese Einwohner auf anderen Parzellen zu sehen und mit ihnen zu chatten."/>
<text name="landing_point">
Landepunkt: [LANDING]
</text>
@@ -427,6 +434,11 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Sound:
</text>
<check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Avatarsounds:
+ </text>
+ <check_box label="Jeder" name="all av sound check"/>
+ <check_box label="Gruppe" name="group av sound check"/>
<text name="Voice settings:">
Voice:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/de/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..c924716523
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="UMGEB.VOREINST. LÖSCHEN">
+ <string name="title_water">
+ Wasser-Voreinstellung löschen
+ </string>
+ <string name="title_sky">
+ Hilmmel-Voreinstellung löschen
+ </string>
+ <string name="title_day_cycle">
+ Tageszyklus löschen
+ </string>
+ <string name="label_water">
+ Voreinstellung:
+ </string>
+ <string name="label_sky">
+ Voreinstellung:
+ </string>
+ <string name="label_day_cycle">
+ Tageszyklus:
+ </string>
+ <string name="msg_confirm_deletion">
+ Möchten Sie die ausgewählte Voreinstellung wirklich löschen?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Eine Voreinstellung, auf die sich ein Tageszyklus bezieht, kann nicht gelöscht werden.
+ </string>
+ <string name="combo_label">
+ -Voreinstellung auswählen-
+ </string>
+ <text name="label">
+ Voreinstellung:
+ </text>
+ <button label="Löschen" name="delete"/>
+ <button label="Abbrechen" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/de/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..8b29428c24
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Tageszyklus bearbeiten">
+ <string name="title_new">
+ Neuen Tageszyklus erstellen
+ </string>
+ <string name="title_edit">
+ Tageszyklus bearbeiten
+ </string>
+ <string name="hint_new">
+ Geben Sie einen Namen für den Tageszyklus ein, passen Sie die Steuerungen an, um den Tageszyklus zu erstellen, und klicken Sie auf „Speichern“.
+ </string>
+ <string name="hint_edit">
+ Um den Tageszyklus zu bearbeiten, passen Sie die Steuerungen unten an und klicken Sie auf „Speichern“.
+ </string>
+ <string name="combo_label">
+ -Voreinstellung auswählen-
+ </string>
+ <text name="label">
+ Name der Voreinstellung:
+ </text>
+ <text name="note">
+ Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
+ </text>
+ <text name="hint_item1">
+ - Klicken Sie auf eine Registerkarte, um die Himmeleinstellungen und die Uhrzeit zu bearbeiten.
+ </text>
+ <text name="hint_item2">
+ - Klicken und ziehen Sie die Registerkarten, um die Übergangszeiten einzustellen.
+ </text>
+ <text name="hint_item3">
+ - Anhand des Scrubbers können Sie eine Vorschau Ihres Tageszyklus anzeigen.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Schlüssel hinzufügen" label_selected="Schlüssel hinzufügen" name="WLAddKey"/>
+ <button label="Schlüssel löschen" label_selected="Schlüssel löschen" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 0:00
+ </text>
+ <text name="WL3am">
+ 3:00
+ </text>
+ <text name="WL6am">
+ 6:00
+ </text>
+ <text name="WL9amHash">
+ 9:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00
+ </text>
+ <text name="WL3pm">
+ 15:00
+ </text>
+ <text name="WL6pm">
+ 18:00
+ </text>
+ <text name="WL9pm">
+ 21:00
+ </text>
+ <text name="WL12am2">
+ 0:00
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Himmeleinstellung:
+ </text>
+ <combo_box label="Voreinstellung" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Uhrzeit:
+ </text>
+ <time name="time" value="6:00"/>
+ <check_box label="Zu meinem neuen Tageszyklus machen" name="make_default_cb"/>
+ <button label="Speichern" name="save"/>
+ <button label="Abbrechen" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/de/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..ea4c5f7ebc
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Himmel-Voreinstellung bearbeiten">
+ <string name="title_new">
+ Neue Himmel-Voreinstellung erstellen
+ </string>
+ <string name="title_edit">
+ Himmel-Voreinstellung bearbeiten
+ </string>
+ <string name="hint_new">
+ Geben Sie einen Namen für die Voreinstellung ein, passen Sie die Steuerungen an, um die Voreinstellung zu erstellen, und klicken Sie dann auf „Speichern“.
+ </string>
+ <string name="hint_edit">
+ Um Ihre Himmel-Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
+ </string>
+ <string name="combo_label">
+ -Voreinstellung auswählen-
+ </string>
+ <text name="hint">
+ Um Ihre Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
+ </text>
+ <text name="label">
+ Name der Voreinstellung:
+ </text>
+ <text name="note">
+ Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSPHÄRE" name="Atmosphere">
+ <text name="BHText">
+ Blauer Horizont
+ </text>
+ <text name="BDensText">
+ Horizonttrübung
+ </text>
+ <text name="BDensText2">
+ Farbintensität
+ </text>
+ <text name="HDText">
+ Trübungsintensität
+ </text>
+ <text name="DensMultText">
+ Dichtemultiplikator
+ </text>
+ <text name="WLDistanceMultText">
+ Entfernungsmultiplikator
+ </text>
+ <text name="MaxAltText">
+ Max. Höhe
+ </text>
+ </panel>
+ <panel label="BELEUCHTUNG" name="Lighting">
+ <text name="SLCText">
+ Sonne/Mond-Farbe
+ </text>
+ <text name="WLAmbientText">
+ Umgebung
+ </text>
+ <text name="SunGlowText">
+ Sonnenleuchtkraft
+ </text>
+ <slider label="Fokus" name="WLGlowB"/>
+ <slider label="Größe" name="WLGlowR"/>
+ <text name="WLStarText">
+ Sternenleuchtkraft
+ </text>
+ <text name="SceneGammaText">
+ Gamma in Szene
+ </text>
+ <text name="TODText">
+ Sonne/Mond-Stand
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 0:00
+ </text>
+ <text name="WL6am">
+ 3:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00
+ </text>
+ <text name="WL6pm">
+ 18:00
+ </text>
+ <text name="WL12am2">
+ 0:00
+ </text>
+ <time name="WLDayTime" value="6:00"/>
+ <text name="WLEastAngleText">
+ Ostausrichtung
+ </text>
+ </panel>
+ <panel label="WOLKEN" name="Clouds">
+ <text name="WLCloudColorText">
+ Wolkenfarbe
+ </text>
+ <text name="WLCloudColorText2">
+ Wolken-XY/Dichte
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Wolkendichte
+ </text>
+ <text name="WLCloudScaleText">
+ Wolkenskalierung
+ </text>
+ <text name="WLCloudDetailText">
+ Wolkendetails (XY/Dichte)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Wolkenbewegung X
+ </text>
+ <check_box label="Sperren" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Wolkenbewegung Y
+ </text>
+ <check_box label="Sperren" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Diese Voreinstellung zu meiner neuen Himmeleinstellung machen" name="make_default_cb"/>
+ <button label="Speichern" name="save"/>
+ <button label="Abbrechen" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/de/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..9b9d5e7d77
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Wasser-Voreinstellung bearbeiten">
+ <string name="title_new">
+ Neue Wasser-Voreinstellung erstellen
+ </string>
+ <string name="title_edit">
+ Wasser-Voreinstellung bearbeiten
+ </string>
+ <string name="hint_new">
+ Geben Sie einen Namen für die Voreinstellung ein, passen Sie die Steuerungen an, um die Voreinstellung zu erstellen, und klicken Sie dann auf „Speichern“.
+ </string>
+ <string name="hint_edit">
+ Um Ihre Wasser-Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
+ </string>
+ <string name="combo_label">
+ -Voreinstellung auswählen-
+ </string>
+ <text name="hint">
+ Um Ihre Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
+ </text>
+ <text name="label">
+ Name der Voreinstellung:
+ </text>
+ <text name="note">
+ Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Trübungsfarbe
+ </text>
+ <text name="water_fog_density_label">
+ Exponent für Trübungsdichte
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Modifikator für Wassertrübung
+ </text>
+ <text name="BHText">
+ Richtung für große Wellen
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Reflexionswellengröße
+ </text>
+ <text name="HDText">
+ Fresnel-Skalierung
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel-Versatz
+ </text>
+ <text name="BHText2">
+ Richtung für kleine Wellen
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Brechungsstärke oben
+ </text>
+ <text name="WaterScaleBelowText">
+ Brechungsstärke unten
+ </text>
+ <text name="MaxAltText">
+ Mischungsmultiplikator
+ </text>
+ <text name="BHText3">
+ Normal-Map
+ </text>
+ </panel>
+ <check_box label="Diese Voreinstellung zu meiner neuen Wassereinstellung machen" name="make_default_cb"/>
+ <button label="Speichern" name="save"/>
+ <button label="Abbrechen" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_environment_settings.xml b/indra/newview/skins/default/xui/de/floater_environment_settings.xml
new file mode 100644
index 0000000000..946416980a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="UMGEBUNGSEINSTELLUNGEN">
+ <text name="note">
+ Anhand der Optionen unten können Sie die Umgebungseinstellungen für Ihren Viewer anpassen.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Regionseinstellungen verwenden" name="use_region_settings"/>
+ <radio_item label="Meine Umgebung anpassen" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Hinweis: Ihre benutzerdefinierten Einstellungen sind für andere Benutzer nicht sichtbar.
+ </text>
+ <text name="water_settings_title">
+ Wassereinstellung
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Himmel / Tageszyklus
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Fester Himmel" name="my_sky_settings"/>
+ <radio_item label="Tageszyklus" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml
index 83c51132ee..24e2788e0b 100644
--- a/indra/newview/skins/default/xui/de/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml
@@ -3,6 +3,9 @@
<string name="status_idle">
Inaktiv
</string>
+ <string name="status_parse_error">
+ DAE-Parsing-Fehler. Details siehe Protokoll.
+ </string>
<string name="status_reading_file">
Laden...
</string>
@@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen.
</string>
+ <string name="bad_element">
+ Fehler: ungültiges Element.
+ </string>
<string name="high">
Hoch
</string>
diff --git a/indra/newview/skins/default/xui/de/floater_model_wizard.xml b/indra/newview/skins/default/xui/de/floater_model_wizard.xml
index 2c7b45906e..618b60e0ec 100644
--- a/indra/newview/skins/default/xui/de/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/de/floater_model_wizard.xml
@@ -193,6 +193,9 @@
<string name="status_idle">
Inaktiv
</string>
+ <string name="status_parse_error">
+ DAE-Parsing-Fehler. Details siehe Protokoll.
+ </string>
<string name="status_reading_file">
Laden...
</string>
@@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen.
</string>
+ <string name="bad_element">
+ Fehler: ungültiges Element.
+ </string>
<string name="high">
Hoch
</string>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index 338b609343..00f983b77c 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -66,7 +66,7 @@
<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
<button label="Link" name="link_btn" width="30"/>
<button label="Verknüpfung auflösen" name="unlink_btn" width="126"/>
- <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt" left_pad="0">
+ <text left_pad="0" name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt">
þ: [COUNT]
</text>
<check_box label="" name="checkbox uniform"/>
@@ -408,7 +408,7 @@
</combo_box>
<spinner label="Schwerkraft" name="Physics Gravity"/>
<spinner label="Reibung" name="Physics Friction"/>
- <spinner label="Dichte" name="Physics Density"/>
+ <spinner label="Dichte in 100 kg/m^3" name="Physics Density"/>
<spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Textur" name="Texture">
diff --git a/indra/newview/skins/default/xui/de/menu_login.xml b/indra/newview/skins/default/xui/de/menu_login.xml
index a373e15338..d932234cd1 100644
--- a/indra/newview/skins/default/xui/de/menu_login.xml
+++ b/indra/newview/skins/default/xui/de/menu_login.xml
@@ -18,7 +18,7 @@
<menu_item_call label="Servicebedingungen anzeigen" name="TOS"/>
<menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/>
<menu_item_call label="Test Medienbrowser" name="Web Browser Test"/>
- <menu_item_call label="Test Webinhalt-Floater" name="Web Content Floater Test"/>
+ <menu_item_call label="Web Content Floater Debug Test" name="Web Content Floater Debug Test"/>
<menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/>
<menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
index 0f252ab46d..a001544f3e 100644
--- a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/>
<menu_item_check label="Nach Name sortieren" name="sort_name"/>
<menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/>
<menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_check label="Karte anzeigen" name="view_map"/>
<menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 05f9f94c8a..de4c269be6 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -31,6 +31,7 @@
<menu_item_call label="Meine Gruppen" name="My Groups"/>
<menu_item_check label="Chat in der Nähe" name="Nearby Chat"/>
<menu_item_call label="Leute in der Nähe" name="Active Speakers"/>
+ <menu_item_check label="Stimme in der Nähe" name="Nearby Voice"/>
</menu>
<menu label="Welt" name="World">
<menu_item_check label="Minikarte" name="Mini-Map"/>
@@ -63,8 +64,24 @@
<menu_item_call label="Mittag" name="Noon"/>
<menu_item_call label="Sonnenuntergang" name="Sunset"/>
<menu_item_call label="Mitternacht" name="Midnight"/>
- <menu_item_call label="Grundbesitzzeit" name="Revert to Region Default"/>
- <menu_item_call label="Umwelt-Editor" name="Environment Editor"/>
+ </menu>
+ <menu label="Umgebungs-Editor" name="Enviroment Editor">
+ <menu_item_call label="Umgebungseinstellungen..." name="Enviroment Settings"/>
+ <menu label="Wasser-Voreinstellungen" name="Water Presets">
+ <menu_item_call label="Neue Voreinstellung..." name="new_water_preset"/>
+ <menu_item_call label="Voreinstellung bearbeiten..." name="edit_water_preset"/>
+ <menu_item_call label="Voreinstellung löschen..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Himmel-Voreinstellungen" name="Sky Presets">
+ <menu_item_call label="Neue Voreinstellung..." name="new_sky_preset"/>
+ <menu_item_call label="Voreinstellung bearbeiten..." name="edit_sky_preset"/>
+ <menu_item_call label="Voreinstellung löschen..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Tag-Voreinstellungen" name="Day Presets">
+ <menu_item_call label="Neue Voreinstellung..." name="new_day_preset"/>
+ <menu_item_call label="Voreinstellung bearbeiten..." name="edit_day_preset"/>
+ <menu_item_call label="Voreinstellung löschen..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Bauen" name="BuildTools">
diff --git a/indra/newview/skins/default/xui/de/menu_wearing_gear.xml b/indra/newview/skins/default/xui/de/menu_wearing_gear.xml
index 80d4ff4d9f..dacf898b6a 100644
--- a/indra/newview/skins/default/xui/de/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Outfit bearbeiten" name="edit"/>
<menu_item_call label="Ausziehen" name="takeoff"/>
-</menu>
+ <menu_item_call label="Outfitliste in Zwischenablage kopieren" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 75f26c6990..05e47cd31a 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -1565,6 +1565,11 @@ Versuchen Sie es später erneut.
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Sie haben versucht, [OFFERS] Teleport-Angebote zu machen,
+womit Sie die Höchstgrenze von [LIMIT] überschreiten.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
Einwohner zu Ihrem Standort einladen?
<form name="form">
@@ -1986,6 +1991,10 @@ Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschl
Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ Möchten Sie Ihren Viewer-Cache wirklich leeren?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Sind Sie sicher, dass Sie Ihre Cookies löschen möchten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
@@ -2011,48 +2020,30 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies
Die gespeicherte Voreinstellung überschreiben?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
- <notification name="WLDeletePresetAlert">
- [SKY] löschen?
- <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
- </notification>
<notification name="WLNoEditDefault">
Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
</notification>
<notification name="WLMissingSky">
Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben?
- <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
- </notification>
- <notification name="NewSkyPreset">
- Wählen Sie einen Namen für den neuen Himmel.
- <form name="form">
- <input name="message">
- Neue Voreinstellung
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Abbrechen"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ Die Einstellungen konnten nicht auf die Region angewendet werden. Verlassen Sie die Region und kehren Sie zurück, um das Problem zu beheben. Angegebener Grund: [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- Voreinstellung bereits vorhanden!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Der letzte Schlüssel in diesem Tageszyklus kann nicht gelöscht werden, da ein Tageszyklus nicht leer sein kann. Statt den letzten verbleibenden Schlüssel zu löschen, versuchen Sie stattdessen, ihn zu modifizieren und dann einen neuen zu erstellen.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Wählen Sie einen Namen für die neue Wasservoreinstellung.
- <form name="form">
- <input name="message">
- Neue Voreinstellung
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Abbrechen"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ Sie können diesem Tageszyklus keine Keyframes mehr hinzufügen. Die Höchstzahl an Keyframes für Tageszyklen mit Umfang [SCOPE] beträgt [MAX].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- Voreinstellung bereits vorhanden!
+ <notification name="EnvUpdateRate">
+ Sie können die Umgebungseinstellungen der Region nur alle [WAIT] Sekunden aktualisieren. Warten Sie mindestens so lange und versuchen Sie es dann erneut.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
+ <notification name="PPSaveEffectAlert">
+ Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben?
+ <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="ChatterBoxSessionStartError">
Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden.
@@ -2343,6 +2334,9 @@ Fliegen ist hier nicht möglich.
<notification name="NoBuild">
In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen.
</notification>
+ <notification name="SeeAvatars">
+ Diese Parzelle verbirgt Avatare und Text-Chat vor einer anderen Parzelle. Sie können Einwohner außerhalb dieser Parzelle weder sehen noch von ihnen gesehen werden. Regulärer Text-Chat auf Kanal 0 ist ebenfalls blockiert.
+ </notification>
<notification name="ScriptsStopped">
Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert.
</notification>
@@ -2771,7 +2765,9 @@ Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist.
Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten.
</notification>
<notification name="MeshUploadError">
- [LABEL] konnte nicht hochgeladen werden: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ [LABEL] konnte nicht hochgeladen werden: [MESSAGE] [IDENTIFIER]
+
+Details finden Sie in der Protokolldatei.
</notification>
<notification name="ShareItemsConfirmation">
Möchten Sie wirklich die folgenden Objekte:
diff --git a/indra/newview/skins/default/xui/de/panel_edit_pick.xml b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
index 3c56df763d..aafffc7ae3 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Auswahl speichern" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Abbrechen" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_outfits_list.xml b/indra/newview/skins/default/xui/de/panel_outfits_list.xml
index 65a38ea342..ea3a938be9 100644
--- a/indra/newview/skins/default/xui/de/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/de/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Sie haben noch keine Outfits. Versuchen Sie es mit der [secondlife:///app/search/all/ ] Suche]."/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <menu_button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
<button name="trash_btn" tool_tip="Ausgewähltes Outfit löschen"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml
index 63a832a165..4e76147746 100644
--- a/indra/newview/skins/default/xui/de/panel_people.xml
+++ b/indra/newview/skins/default/xui/de/panel_people.xml
@@ -67,13 +67,13 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
<button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/>
</layout_panel>
<layout_panel name="im_btn_lp">
- <button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/>
+ <button label="IM" name="im_btn" tool_tip="IM-Sitzung öffnen"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
</layout_panel>
<layout_panel name="share_btn_lp">
- <button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/>
+ <button label="Freigeben" name="share_btn" tool_tip="Inventarobjekt freigeben"/>
</layout_panel>
<layout_panel name="teleport_btn_lp">
<button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>
diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml
index 555fa56d57..4077fdab36 100644
--- a/indra/newview/skins/default/xui/de/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml
@@ -68,6 +68,8 @@
<text name="scripts_value" value="Ein"/>
<text name="damage_label" value="Schaden:"/>
<text name="damage_value" value="Aus"/>
+ <text name="see_avatars_label" value="Avatare sehen:"/>
+ <text name="see_avatars_value" value="Aus"/>
<button label="Über Land" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
index 0a596f2b25..8a5c175f2f 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <text name="Cache:">
+ Cache:
+ </text>
+ <spinner label="Cache-Größe (64 – 9.984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Cache leeren" label_selected="Cache leeren" name="clear_cache"/>
+ <text name="Cache location">
+ Cache-Ordner:
+ </text>
+ <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
+ <button label="Vorgabestandort" label_selected="Vorgabestandort" name="default_cache_location"/>
<text name="UI Size:">
UI-Größe:
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
index c118e4e4dd..1e6a03c99f 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
@@ -19,6 +19,7 @@
<check_box label="Aktiviert" name="enable_voice_check"/>
<check_box label="Automatische Wiedergabe zulassen" name="media_auto_play_btn" tool_tip="Hier aktivieren, um Medien automatisch wiederzugeben." value="true"/>
<check_box label="Medien, die an andere Avatare angehängt sind, wiedergeben." name="media_show_on_others_btn" tool_tip="Diese Option deaktivieren, um Medien für andere Avataren, die sich in der Nähe befinden, auszublenden." value="true"/>
+ <check_box label="Sounds von Gesten abspielen" name="gesture_audio_play_btn" tool_tip="Markieren, um Sounds von Gesten zu hören" value="true"/>
<text name="voice_chat_settings">
Voice-Chat-Einstellungen
</text>
@@ -35,28 +36,5 @@
<button label="Taste festlegen" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/>
<button label="Eingabe-/Ausgabegeräte" name="device_settings_btn"/>
- <panel label="Geräte-Einstellungen" name="device_settings_panel">
- <panel.string name="default_text">
- Standard
- </panel.string>
- <panel.string name="default system device">
- Standardgerät
- </panel.string>
- <panel.string name="no device">
- Kein Gerät
- </panel.string>
- <text name="Input">
- Eingabe
- </text>
- <text name="My volume label">
- Meine Lautstärke:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ändern Sie die Lautstärke mit dem Regler"/>
- <text name="wait_text">
- Bitte warten
- </text>
- <text name="Output">
- Ausgabe
- </text>
- </panel>
+ <panel label="Geräte-Einstellungen" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_environment.xml b/indra/newview/skins/default/xui/de/panel_region_environment.xml
new file mode 100644
index 0000000000..daadd30f62
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Umgebung" name="panel_env_info">
+ <text name="water_settings_title">
+ Wählen Sie die Wasser- und Himmel-/Tageszykluseinstellungen aus, die alle Besucher Ihrer Region sehen sollen. Mehr Infos
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Second Life-Standard verwenden" name="use_sl_default_settings"/>
+ <radio_item label="Folgende Einstellungen verwenden" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Wassereinstellung
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Himmel / Tageszyklus
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Fester Himmel" name="my_sky_settings"/>
+ <radio_item label="Tageszyklus" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Anwenden" name="apply_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_terrain.xml b/indra/newview/skins/default/xui/de/panel_region_terrain.xml
index 01721791a7..7801be30e4 100644
--- a/indra/newview/skins/default/xui/de/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_terrain.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terrain" name="Terrain">
<text name="region_text_lbl">
Region:
@@ -6,25 +6,55 @@
<text name="region_text">
unbekannt
</text>
- <spinner label="Wasserhöhe" name="water_height_spin" />
- <button label="?" name="water_height_help" />
- <spinner label="Obere Terraingrenze" name="terrain_raise_spin" />
- <button label="?" name="terrain_raise_help" />
- <spinner label="Untere Terraingrenze" name="terrain_lower_spin" />
- <button label="?" name="terrain_lower_help" />
- <check_box label="Grundbesitzsonne verwenden" name="use_estate_sun_check" />
- <button label="?" name="use_estate_sun_help" />
- <check_box label="Sonne fest" name="fixed_sun_check" />
- <button label="?" name="fixed_sun_help" />
- <slider label="Phase" name="sun_hour_slider" />
- <button label="Übernehmen" name="apply_btn" />
- <button label="RAW-Terrain herunterladen..." name="download_raw_btn"
- tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" />
- <button label="?" name="download_raw_help" />
- <button label="RAW-Terrain hochladen..." name="upload_raw_btn"
- tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" />
- <button label="?" name="upload_raw_help" />
- <button label="Terrain formen" name="bake_terrain_btn"
- tool_tip="Das aktuelle Terrain zum Mittelpunkt für die oberen/unteren Terraingrenzen machen" />
- <button label="?" name="bake_terrain_help" />
+ <spinner label="Wasserhöhe" name="water_height_spin"/>
+ <spinner label="Obere Terraingrenze" name="terrain_raise_spin"/>
+ <spinner label="Untere Terraingrenze" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Terraintexturen (erfordert 24-Bit-.tga-Dateien mit einer Größe von 512x512)
+ </text>
+ <text name="height_text_lbl">
+ 1 (niedrig)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Hoch)
+ </text>
+ <text name="height_text_lbl5">
+ Texturhöhenbereich
+ </text>
+ <text name="height_text_lbl10">
+ Diese Werte geben den Mischungsgrad für die obigen Texturen an.
+ </text>
+ <text name="height_text_lbl11">
+ In Metern gemessen. Der Wert „Niedrig“ ist die maximale Höhe von Textur 1, der Wert „Hoch“ die Mindesthöhe von Textur 4.
+ </text>
+ <text name="height_text_lbl6">
+ Nordwest
+ </text>
+ <text name="height_text_lbl7">
+ Nordost
+ </text>
+ <spinner label="Niedrig" name="height_start_spin_1"/>
+ <spinner label="Niedrig" name="height_start_spin_3"/>
+ <spinner label="Hoch" name="height_range_spin_1"/>
+ <spinner label="Hoch" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Südwest
+ </text>
+ <text name="height_text_lbl9">
+ Südost
+ </text>
+ <spinner label="Niedrig" name="height_start_spin_0"/>
+ <spinner label="Niedrig" name="height_start_spin_2"/>
+ <spinner label="Hoch" name="height_range_spin_0"/>
+ <spinner label="Hoch" name="height_range_spin_2"/>
+ <button label="RAW-Terrain herunterladen..." name="download_raw_btn" tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter"/>
+ <button label="RAW-Terrain hochladen..." name="upload_raw_btn" tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter"/>
+ <button label="Terrain formen" name="bake_terrain_btn" tool_tip="Das aktuelle Terrain zum Mittelpunkt für die oberen/unteren Terraingrenzen machen"/>
+ <button label="Übernehmen" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
index d817d1df90..3dd1bfb357 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
@@ -1,6 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sonstiges" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Erhaltene Objekte ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Erhaltene Objekte
+ </string>
+ <button label="Erhaltene Objekte" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] neu
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ Einkäufe auf dem Marktplatz werden hierher geliefert.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="outbox_layout_panel">
+ <panel label="" name="marketplace_outbox">
+ <button label="Händler-Outbox" name="outbox_btn"/>
+ <button label="" name="outbox_sync_btn" tool_tip="Zu meiner Marktplatz-Storefront verschieben"/>
+ <panel tool_tip="Drag and drop items here to prepare them for sale on your storefront">
+ <text name="outbox_inventory_placeholder">
+ Richtigen Sie ein Händlerkonto ein, um diese Funktion zu verwenden.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index d77b4a1e44..e1c9ad0e5c 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1192,6 +1192,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InventoryNoTexture">
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
</string>
+ <string name="InventoryInboxNoItems">
+ Objekte, die auf dem Marktplatz gekauft wurden, werden hierher geliefert.
+ </string>
+ <string name="InventoryOutboxNoItems">
+ Objekte hierher ziehen, um Sie in Ihrer Marktplatz-Storefront zum Verkauf anzubieten.
+ </string>
<string name="no_transfer" value=" (kein Transferieren)"/>
<string name="no_modify" value=" (kein Bearbeiten)"/>
<string name="no_copy" value=" (kein Kopieren)"/>
@@ -1238,9 +1244,6 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InvFolder My Inventory">
Mein Inventar
</string>
- <string name="InvFolder My Favorites">
- Meine Favoriten
- </string>
<string name="InvFolder Library">
Bibliothek
</string>
@@ -1299,10 +1302,10 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
Gesten
</string>
<string name="InvFolder Favorite">
- Favoriten
+ Meine Favoriten
</string>
<string name="InvFolder favorite">
- Favoriten
+ Meine Favoriten
</string>
<string name="InvFolder Current Outfit">
Aktuelles Outfit
@@ -1325,6 +1328,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InvFolder All">
Alle
</string>
+ <string name="no_attachments">
+ Keine Anhänge getragen
+ </string>
<string name="Buy">
Kaufen
</string>
@@ -1660,6 +1666,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="IMTeen">
Teen
</string>
+ <string name="Anyone">
+ jeder
+ </string>
<string name="RegionInfoError">
Fehler
</string>
@@ -1882,6 +1891,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="Public">
Öffentlich
</string>
+ <string name="LocalSettings">
+ Lokale Einstellungen
+ </string>
+ <string name="RegionSettings">
+ Regionseinstellungen
+ </string>
<string name="ClassifiedClicksTxt">
Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
</string>
@@ -3727,6 +3742,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="LocationCtrlGeneralIconTooltip">
Generelle Region
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatare sichtbar; Chat außerhalb dieser Parzelle gestattet
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] Aktualisierung
</string>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index ecd2b119c9..07cb4c12f5 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1205,6 +1205,10 @@ Only large parcels can be listed in search.
name="push_restrict_region_text">
No Pushing (Region Override)
</panel.string>
+ <panel.string
+ name="see_avs_text">
+ See and chat with residents on this parcel
+ </panel.string>
<text
type="string"
length="1"
@@ -1314,7 +1318,7 @@ Only large parcels can be listed in search.
name="check group scripts"
top_delta="0"
width="70" />
- <text
+ <text
type="string"
text_color="white"
length="1"
@@ -1515,10 +1519,32 @@ Only large parcels can be listed in search.
type="string"
length="1"
follows="left|top"
+ text_color="white"
+ height="16"
+ layout="topleft"
+ left="230"
+ top="174"
+ name="allow_label5"
+ width="278">
+ Allow Residents on other parcels to:
+ </text>
+ <check_box
height="16"
+ label="See Avatars"
+ follows="top"
layout="topleft"
- left="220"
- top="180"
+ left="230"
+ name="SeeAvatarsCheck"
+ tool_tip="Allows residents on other parcels to see and chat with residents on this parcel, and you to see and chat with them."
+ width="120" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="230"
+ top="230"
text_color="white"
name="landing_point"
word_wrap="true"
@@ -1532,7 +1558,7 @@ Only large parcels can be listed in search.
label_selected="Set"
layout="topleft"
name="Set"
- right="-68"
+ left="230"
tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
width="50" />
<button
@@ -1544,7 +1570,6 @@ Only large parcels can be listed in search.
left_pad="5"
name="Clear"
tool_tip="Clear the landing point"
- right="-10"
width="55" />
<text
type="string"
@@ -1553,7 +1578,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="220"
+ left="230"
top_pad="10"
name="Teleport Routing: "
width="200">
@@ -1846,6 +1871,34 @@ Only large parcels can be listed in search.
name="check sound local"
left_pad="0"
width="292" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Avatar Sounds:"
+ top_pad="10"
+ width="100">
+ Avatar Sounds:
+ </text>
+ <check_box
+ height="16"
+ label="Everyone"
+ layout="topleft"
+ left_pad="0"
+ name="all av sound check"
+ top_delta="0"
+ width="130" />
+ <check_box
+ height="16"
+ label="Group"
+ layout="topleft"
+ left_pad="0"
+ name="group av sound check"
+ top_delta="0"
+ width="70" />
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
new file mode 100644
index 0000000000..114b3a72e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="775"
+ layout="topleft"
+ min_height="400"
+ min_width="500"
+ name="floater_web_content"
+ help_topic="floater_web_content"
+ save_rect="true"
+ auto_tile="true"
+ save_visibility="true"
+ title=""
+ initial_mime_type="text/html"
+ width="780"
+ filename="floater_web_content.xml"/>
+ tab_stop="true" \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 317c6fe9ac..ab5c543376 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -557,6 +557,9 @@
<menu_item_call.on_click
function="World.EnvPreset"
parameter="delete_water"/>
+ <menu_item_call.on_enable
+ function="World.EnableEnvPreset"
+ parameter="delete_water"/>
</menu_item_call>
</menu>
@@ -583,6 +586,9 @@
<menu_item_call.on_click
function="World.EnvPreset"
parameter="delete_sky"/>
+ <menu_item_call.on_enable
+ function="World.EnableEnvPreset"
+ parameter="delete_sky"/>
</menu_item_call>
</menu>
@@ -609,6 +615,9 @@
<menu_item_call.on_click
function="World.EnvPreset"
parameter="delete_day_cycle"/>
+ <menu_item_call.on_enable
+ function="World.EnableEnvPreset"
+ parameter="delete_day_cycle"/>
</menu_item_call>
</menu>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
index 0ac2c14253..0e858ccf10 100644
--- a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
@@ -20,4 +20,11 @@
function="Gear.OnEnable"
parameter="take_off" />
</menu_item_call>
+ <menu_item_call
+ label="Copy outfit list to clipboard"
+ layout="topleft"
+ name="copy">
+ <on_click
+ function="Gear.Copy" />
+ </menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 2ba9393eec..1bc377126e 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5628,6 +5628,15 @@ This area has building disabled. You can&apos;t build or rez objects here.
<notification
icon="notify.tga"
+ name="SeeAvatars"
+ persist="true"
+ type="notify"
+ unique="true">
+This parcel hides avatars and text chat from another parcel. You can&apos;t see other residents outside the parcel, and those outside are not able to see you. Regular text chat on channel 0 is also blocked.
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="ScriptsStopped"
persist="true"
type="notify">
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index 82dfb445da..2ec2e03e8c 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -220,7 +220,7 @@
height="23"
layout="topleft"
left_pad="4"
- name="layout_panel1"
+ name="layout_panel2"
user_resize="false"
auto_resize="true"
width="146">
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 774a9e8bbf..e280115bda 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -153,6 +153,14 @@
name="icon_DamageNo"
translate="false"
value="Parcel_DamageNo_Dark" />
+ <string
+ name="icon_SeeAVs_Off"
+ translate="false"
+ value="Parcel_SeeAVsOff_Dark" />
+ <string
+ name="icon_SeeAVs_On"
+ translate="false"
+ value="Parcel_SeeAVsOn_Dark" />
<button
follows="top|left"
height="24"
@@ -354,7 +362,7 @@
title="Parcel">
<panel
follows="all"
- height="175"
+ height="200"
layout="topleft"
left="0"
name="parcel_characteristics_panel"
@@ -543,6 +551,31 @@
top_delta="0"
value="Off"
width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_SeeAVsOff_Dark"
+ layout="topleft"
+ left="10"
+ name="see_avatars_icon"
+ top_pad="7"
+ width="22" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="see_avatars_label"
+ value="See Avatars:"
+ width="90" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="see_avatars_value"
+ value="Off"
+ width="60" />
<button
follows="bottom|right"
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 1c22a5c02e..e639f0dc9d 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -268,7 +268,7 @@
height="23"
layout="topleft"
left_delta="50"
- top_pad="5"
+ top_pad="5"
name="updater_service_combobox"
width="300">
<combo_box.item
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index 450853993a..6b28639a77 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -79,13 +79,22 @@
(unknown)
</text>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="95"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ width="470" />
+
<check_box
height="20"
label="Allow Public Access"
layout="topleft"
- left="10"
+ left="20"
name="externally_visible_check"
- top_pad="6"
+ top_delta="5"
width="200" />
<check_box
@@ -104,6 +113,16 @@
name="allow_direct_teleport"
top_pad="4"
width="80" />
+ <button
+ enabled="false"
+ follows="left|top"
+ height="23"
+ label="Apply"
+ layout="topleft"
+ name="apply_btn"
+ top_pad="15"
+ left_delta="0"
+ width="97" />
<text
type="string"
@@ -111,9 +130,9 @@
follows="top|left"
height="16"
layout="topleft"
- left="32"
+ left="20"
name="Only Allow"
- top_delta="0"
+ top_delta="-30"
width="278">
Restrict Access to accounts verified by:
</text>
@@ -146,7 +165,7 @@
height="20"
layout="topleft"
name="estate_manager_label"
- top_pad="10"
+ top_pad="30"
left="10"
width="200">
Estate Managers:
diff --git a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
index 30d3064e14..79f29777ce 100644
--- a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
@@ -88,6 +88,16 @@
visible="false"
width="14"
/>
+ <icon
+ follows="right|top"
+ height="13"
+ image_name="Parcel_SeeAVsOff_Light"
+ left="2"
+ name="see_avatars_icon"
+ top="3"
+ visible="false"
+ width="14"
+ />
<text
follows="right|top"
font="SansSerifSmall"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index def4079ba9..ee6317f367 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -18,6 +18,7 @@
<string name="StartupClearingCache">Clearing cache...</string>
<string name="StartupInitializingTextureCache">Initializing Texture Cache...</string>
<string name="StartupInitializingVFS">Initializing VFS...</string>
+ <string name="StartupRequireDriverUpdate">Graphics Initialization Failed. Please Update Your Graphics Driver!</string>
<!-- progress -->
<string name="ProgressRestoring">Restoring...</string>
@@ -1759,10 +1760,10 @@ integer llGetParcelMaxPrims(vector pos, integer sim_wide)
Returns the maximum number of prims allowed on the parcel at pos
</string>
<string name="LSLTipText_llGetParcelDetails" translate="false">
-list llGetParcelDetails(vector pos, list params)
-Returns the parcel details specified in params for the parcel at pos.
-Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA
- </string>
+ list llGetParcelDetails(vector pos, list params)
+ Returns the parcel details specified in params for the parcel at pos.
+ Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
+ </string>
<string name="LSLTipText_llSetLinkPrimitiveParams" translate="false">
llSetLinkPrimitiveParams(integer linknumber, list rules)
Sets primitive parameters for linknumber based on rules
@@ -2069,7 +2070,6 @@ Returns a string with the requested data about the region
<!-- inventory folder -->
<string name="InvFolder My Inventory">My Inventory</string>
- <string name="InvFolder My Favorites">My Favorites</string>
<string name="InvFolder Library">Library</string>
<string name="InvFolder Textures">Textures</string>
<string name="InvFolder Sounds">Sounds</string>
@@ -2089,10 +2089,10 @@ Returns a string with the requested data about the region
<string name="InvFolder Uncompressed Sounds">Uncompressed Sounds</string>
<string name="InvFolder Animations">Animations</string>
<string name="InvFolder Gestures">Gestures</string>
- <string name="InvFolder Favorite">Favorites</string>
+ <string name="InvFolder Favorite">My Favorites</string>
<!-- historically default name of the Favorites folder can start from either "f" or "F" letter.
We should localize both of them with the same value -->
- <string name="InvFolder favorite">Favorites</string>
+ <string name="InvFolder favorite">My Favorites</string>
<string name="InvFolder Current Outfit">Current Outfit</string>
<string name="InvFolder Initial Outfits">Initial Outfits</string>
<string name="InvFolder My Outfits">My Outfits</string>
@@ -2238,6 +2238,7 @@ Returns a string with the requested data about the region
<string name="Unknown">(Unknown)</string>
<string name="SummaryForTheWeek" value="Summary for this week, beginning on " />
<string name="NextStipendDay" value="The next stipend day is " />
+ <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>
<string name="GroupIndividualShare" value=" Group Individual Share" />
<string name="GroupColumn" value=" Group" />
<string name="Balance">Balance</string>
@@ -2394,6 +2395,7 @@ Returns a string with the requested data about the region
<string name="GroupMoneyBalance">Balance</string>
<string name="GroupMoneyCredits">Credits</string>
<string name="GroupMoneyDebits">Debits</string>
+ <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>
<!-- viewer object -->
<string name="ViewerObjectContents">Contents</string>
@@ -3142,6 +3144,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlAdultIconTooltip">Adult Region</string>
<string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
<string name="LocationCtrlGeneralIconTooltip">General Region</string>
+ <string name="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string>
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 37d60f1671..44436fb6f2 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -123,6 +123,14 @@
font="SansSerifSmall"
text_color="TextFgColor"
/>
+ <see_avatars_icon
+ name="see_avatars_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Parcel_SeeAVsOff_Light"
+ />
<combo_button
name="Location History"
label=""
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 1c4b965f46..83749fc535 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -133,12 +133,12 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
0
</text>
<button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
+ <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
<button label="Información de scripts" name="Scripts..."/>
<button label="Comprar para el grupo" name="Buy For Group..."/>
<button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
<button label="Abandonar el terreno" name="Abandon Land..."/>
<button label="Reclamar el terreno" name="Reclaim Land..."/>
- <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
</panel>
<panel label="CONTRATO" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -308,6 +308,9 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<panel.string name="push_restrict_region_text">
Sin &apos;empujones&apos; (prevalece lo marcado en la región)
</panel.string>
+ <panel.string name="see_avs_text">
+ Ver a los residentes de esta parcela y chatear con ellos
+ </panel.string>
<text name="allow_label">
Permitir a otros Residentes:
</text>
@@ -370,6 +373,10 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
+ <text name="allow_label5">
+ Permitir a los residentes de otras parcelas:
+ </text>
+ <check_box label="Ver los avatares" name="SeeAvatarsCheck" tool_tip="Permite que los residentes de otras parcelas vean a los residentes de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/>
<text name="landing_point">
Punto de llegada: [LANDING]
</text>
@@ -429,6 +436,11 @@ los media:
Sonido:
</text>
<check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Sonidos de avatar:
+ </text>
+ <check_box label="Todos" name="all av sound check"/>
+ <check_box label="Grupo" name="group av sound check"/>
<text name="Voice settings:">
Voz:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/es/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..5e7df8530e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="ELIMINAR EL ENV PREDEFINIDO">
+ <string name="title_water">
+ Eliminar el agua predefinida
+ </string>
+ <string name="title_sky">
+ Eliminar cielo predefinido
+ </string>
+ <string name="title_day_cycle">
+ Eliminar ciclo del día
+ </string>
+ <string name="label_water">
+ Predefinido:
+ </string>
+ <string name="label_sky">
+ Predefinido:
+ </string>
+ <string name="label_day_cycle">
+ Ciclo del día:
+ </string>
+ <string name="msg_confirm_deletion">
+ ¿Estás seguro de que quieres eliminar el valor predefinido seleccionado?
+ </string>
+ <string name="msg_sky_is_referenced">
+ No se puede quitar un valor predefinido al que se hace referencia en otro u otros ciclos del día.
+ </string>
+ <string name="combo_label">
+ -Selecciona un valor predefinido-
+ </string>
+ <text name="label">
+ Predefinido:
+ </text>
+ <button label="Borrar" name="delete"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/es/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..6ac46351db
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Editar ciclo del día">
+ <string name="title_new">
+ Crear un ciclo del día nuevo
+ </string>
+ <string name="title_edit">
+ Editar ciclo del día
+ </string>
+ <string name="hint_new">
+ Asigna un nombre al ciclo del día, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar el ciclo del día, ajusta los controles siguientes y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecciona un valor predefinido-
+ </string>
+ <text name="label">
+ Nombre predefinido:
+ </text>
+ <text name="note">
+ Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
+ </text>
+ <text name="hint_item1">
+ - Pulsa en una pestaña para editar la configuración y el tiempo de un cielo determinado.
+ </text>
+ <text name="hint_item2">
+ - Pulsa y arrastra las pestañas para ajustar los tiempos de transición.
+ </text>
+ <text name="hint_item3">
+ - Usa el depurador para obtener una vista previa del ciclo del día.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Añadir clave" label_selected="Añadir clave" name="WLAddKey"/>
+ <button label="Eliminar clave" label_selected="Eliminar clave" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 12 AM
+ </text>
+ <text name="WL3am">
+ 3 AM
+ </text>
+ <text name="WL6am">
+ 6 AM
+ </text>
+ <text name="WL9amHash">
+ 9 AM
+ </text>
+ <text name="WL12pmHash">
+ 12 PM
+ </text>
+ <text name="WL3pm">
+ 3 PM
+ </text>
+ <text name="WL6pm">
+ 6 PM
+ </text>
+ <text name="WL9pm">
+ 9 PM
+ </text>
+ <text name="WL12am2">
+ 12 AM
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Configuración del cielo:
+ </text>
+ <combo_box label="Predefinido" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Hora:
+ </text>
+ <time name="time" value="6 AM"/>
+ <check_box label="Convertir en mi nuevo ciclo del día" name="make_default_cb"/>
+ <button label="Guardar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/es/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..d2197b80fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Editar cielo predefinido">
+ <string name="title_new">
+ Crear un nuevo cielo predefinido
+ </string>
+ <string name="title_edit">
+ Editar cielo predefinido
+ </string>
+ <string name="hint_new">
+ Asigna un nombre al valor predefinido, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar el cielo predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecciona un valor predefinido-
+ </string>
+ <text name="hint">
+ Para editar el valor predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
+ </text>
+ <text name="label">
+ Nombre predefinido:
+ </text>
+ <text name="note">
+ Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMÓSFERA" name="Atmosphere">
+ <text name="BHText">
+ Horizonte azul
+ </text>
+ <text name="BDensText">
+ Cantidad de bruma
+ </text>
+ <text name="BDensText2">
+ Saturación
+ </text>
+ <text name="HDText">
+ Densidad de la bruma
+ </text>
+ <text name="DensMultText">
+ Densidad
+ </text>
+ <text name="WLDistanceMultText">
+ Distancia
+ </text>
+ <text name="MaxAltText">
+ Altitud máx.
+ </text>
+ </panel>
+ <panel label="LUZ" name="Lighting">
+ <text name="SLCText">
+ Color del sol y de la luna
+ </text>
+ <text name="WLAmbientText">
+ Ambiental
+ </text>
+ <text name="SunGlowText">
+ Resplandor del sol
+ </text>
+ <slider label="Visión" name="WLGlowB"/>
+ <slider label="Tamaño" name="WLGlowR"/>
+ <text name="WLStarText">
+ Brillo de las estrellas
+ </text>
+ <text name="SceneGammaText">
+ Gamma de la escena
+ </text>
+ <text name="TODText">
+ Posición del sol y la luna
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 12 AM
+ </text>
+ <text name="WL6am">
+ 6 AM
+ </text>
+ <text name="WL12pmHash">
+ 12 PM
+ </text>
+ <text name="WL6pm">
+ 6 PM
+ </text>
+ <text name="WL12am2">
+ 12 AM
+ </text>
+ <time name="WLDayTime" value="6:00 AM"/>
+ <text name="WLEastAngleText">
+ Ángulo de elevación
+ </text>
+ </panel>
+ <panel label="NUBES" name="Clouds">
+ <text name="WLCloudColorText">
+ Color de las nubes
+ </text>
+ <text name="WLCloudColorText2">
+ Posición/Densidad de las nubes
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Nubosidad
+ </text>
+ <text name="WLCloudScaleText">
+ Altitud de las nubes
+ </text>
+ <text name="WLCloudDetailText">
+ Detalle de las nubes (Posición/Densidad)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Velocidad de las nubes: X
+ </text>
+ <check_box label="Lock" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Velocidad de las nubes: Y
+ </text>
+ <check_box label="Lock" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Convertir este valor predefinido en mi nueva configuración de cielo" name="make_default_cb"/>
+ <button label="Guardar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/es/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..f90ad59f78
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Editar el agua predefinida">
+ <string name="title_new">
+ Crear una nueva agua predefinida
+ </string>
+ <string name="title_edit">
+ Editar el agua predefinida
+ </string>
+ <string name="hint_new">
+ Asigna un nombre al valor predefinido, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar el agua predefinida, ajusta los controles y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecciona un valor predefinido-
+ </string>
+ <text name="hint">
+ Para editar el valor predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
+ </text>
+ <text name="label">
+ Nombre predefinido:
+ </text>
+ <text name="note">
+ Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Color del agua
+ </text>
+ <text name="water_fog_density_label">
+ Transparencia
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Modificar la claridad del agua
+ </text>
+ <text name="BHText">
+ Sentido de las olas grandes
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Tamaño de las ondulaciones
+ </text>
+ <text name="HDText">
+ Escala de Fresnel
+ </text>
+ <text name="FresnelOffsetText">
+ Coeficiente de reflexión
+ </text>
+ <text name="BHText2">
+ Sentido de las olas pequeñas
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Refracción de la superficie
+ </text>
+ <text name="WaterScaleBelowText">
+ Refracción bajo la superficie
+ </text>
+ <text name="MaxAltText">
+ Desenfoque
+ </text>
+ <text name="BHText3">
+ Vista Normal
+ </text>
+ </panel>
+ <check_box label="Convertir este valor predefinido en mi nueva configuración de agua" name="make_default_cb"/>
+ <button label="Guardar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_environment_settings.xml b/indra/newview/skins/default/xui/es/floater_environment_settings.xml
new file mode 100644
index 0000000000..a9c5705d52
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="CONFIGURACIÓN DE ENTORNO">
+ <text name="note">
+ Puedes personalizar la configuración del entorno de tu visor con las opciones siguientes.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usar configuración de región" name="use_region_settings"/>
+ <radio_item label="Personalizar mi entorno" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Nota: La configuración personalizada no estará visible para otros usuarios.
+ </text>
+ <text name="water_settings_title">
+ Configuración de agua
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Cielo/Ciclo del día
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Cielo invariable" name="my_sky_settings"/>
+ <radio_item label="Ciclo del día" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_model_preview.xml b/indra/newview/skins/default/xui/es/floater_model_preview.xml
index 6208db75f9..0af44e1d91 100644
--- a/indra/newview/skins/default/xui/es/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_model_preview.xml
@@ -3,6 +3,9 @@
<string name="status_idle">
Inactivo
</string>
+ <string name="status_parse_error">
+ Problema de análisis de DAE - consulta los datos en el registro.
+ </string>
<string name="status_reading_file">
Cargando...
</string>
@@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
Error: El número de intersección es superior a 65534. Cancelado.
</string>
+ <string name="bad_element">
+ Error: el elemento no es válido
+ </string>
<string name="high">
Alto
</string>
diff --git a/indra/newview/skins/default/xui/es/floater_model_wizard.xml b/indra/newview/skins/default/xui/es/floater_model_wizard.xml
index 019c2d3829..a2c6c456eb 100644
--- a/indra/newview/skins/default/xui/es/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/es/floater_model_wizard.xml
@@ -193,6 +193,9 @@
<string name="status_idle">
Inactivo
</string>
+ <string name="status_parse_error">
+ Problema de análisis de DAE - consulta los datos en el registro.
+ </string>
<string name="status_reading_file">
Cargando...
</string>
@@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
Error: El número de intersección es superior a 65534. Cancelado.
</string>
+ <string name="bad_element">
+ Error: el elemento no es válido
+ </string>
<string name="high">
Alto
</string>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index 78f18b745c..70eac1e2c5 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -405,7 +405,7 @@
</combo_box>
<spinner label="Gravedad" name="Physics Gravity"/>
<spinner label="Fricción" name="Physics Friction"/>
- <spinner label="Densidad" name="Physics Density"/>
+ <spinner label="Densidad en 100 kg/m^3" name="Physics Density"/>
<spinner label="Reemplazo" name="Physics Restitution"/>
</panel>
<panel label="Textura" name="Texture">
diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml
index c27d624732..cabcacaed5 100644
--- a/indra/newview/skins/default/xui/es/menu_login.xml
+++ b/indra/newview/skins/default/xui/es/menu_login.xml
@@ -17,7 +17,7 @@
<menu_item_call label="Mostrar los &apos;TOS&apos;" name="TOS"/>
<menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
<menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/>
- <menu_item_call label="Prueba de ventanas de contenidos web" name="Web Content Floater Test"/>
+ <menu_item_call label="Prueba de depuración de ventanas de contenido web" name="Web Content Floater Debug Test"/>
<menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/>
<menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
index f0fe383c0c..1403e4db01 100644
--- a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/>
<menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
<menu_item_check label="Ordenar según distancia" name="sort_distance"/>
<menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_check label="Ver mapa" name="view_map"/>
<menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 0824e386d5..049a89aa06 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -31,6 +31,7 @@
<menu_item_call label="Mis grupos" name="My Groups"/>
<menu_item_check label="Chat" name="Nearby Chat"/>
<menu_item_call label="Gente cerca" name="Active Speakers"/>
+ <menu_item_check label="Chat de voz" name="Nearby Voice"/>
</menu>
<menu label="Mundo" name="World">
<menu_item_check label="Minimapa" name="Mini-Map"/>
@@ -63,8 +64,24 @@
<menu_item_call label="Mediodía" name="Noon"/>
<menu_item_call label="Atardecer" name="Sunset"/>
<menu_item_call label="Medianoche" name="Midnight"/>
- <menu_item_call label="Hora del Estado" name="Revert to Region Default"/>
- <menu_item_call label="Editor del entorno" name="Environment Editor"/>
+ </menu>
+ <menu label="Editor de entorno" name="Enviroment Editor">
+ <menu_item_call label="Configuración de entorno..." name="Enviroment Settings"/>
+ <menu label="Agua predefinida" name="Water Presets">
+ <menu_item_call label="Nuevo predefinido..." name="new_water_preset"/>
+ <menu_item_call label="Editar predefinido..." name="edit_water_preset"/>
+ <menu_item_call label="Eliminar predefinido..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Cielos predefinidos" name="Sky Presets">
+ <menu_item_call label="Nuevo predefinido..." name="new_sky_preset"/>
+ <menu_item_call label="Editar predefinido..." name="edit_sky_preset"/>
+ <menu_item_call label="Eliminar predefinido..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Días predefinidos" name="Day Presets">
+ <menu_item_call label="Nuevo predefinido..." name="new_day_preset"/>
+ <menu_item_call label="Editar predefinido..." name="edit_day_preset"/>
+ <menu_item_call label="Eliminar predefinido..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Construir" name="BuildTools">
diff --git a/indra/newview/skins/default/xui/es/menu_wearing_gear.xml b/indra/newview/skins/default/xui/es/menu_wearing_gear.xml
index 9d9ce75e53..ec13f99a01 100644
--- a/indra/newview/skins/default/xui/es/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Editar el vestuario" name="edit"/>
<menu_item_call label="Quitarme" name="takeoff"/>
-</menu>
+ <menu_item_call label="Copiar la lista del vestuario al portapapeles" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index b2131fc038..a1cd676142 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -1560,6 +1560,11 @@ Vuelve a intentarlo más tarde.
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Has intentado hacer [OFFERS] ofertas de teleporte,
+excediendo el límite de [LIMIT].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
¿Obligar a este Residente a ir a tu localización?
<form name="form">
@@ -1980,6 +1985,10 @@ Linden Lab
¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ ¿Estás seguro de que quieres vaciar la caché del visor?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
¿Estás seguro de que quieres limpiar tus cookies?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
@@ -2005,48 +2014,30 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
¿Quieres sobrescribir la preselección guardada?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
- <notification name="WLDeletePresetAlert">
- ¿Quieres borrar [SKY]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
<notification name="WLNoEditDefault">
No puedes editar ni borrar una preselección por defecto.
</notification>
<notification name="WLMissingSky">
Este archivo del ciclo de un día se refiere a un archivo perdido de cielo: [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="NewSkyPreset">
- Dame un nombre para el cielo nuevo.
- <form name="form">
- <input name="message">
- Preselección nueva
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ No se pudo aplicar la configuración a la región. El problema podría solucionarse saliendo de la región y regresando a ella. La razón especificada fue: [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- ¡Esa preselección ya existe!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ No se puede eliminar la última clave de este ciclo del día, ya que no puedes vaciar la caché del día. En lugar de intentar eliminar la última clave restante y después intentar crear una nueva, debes modificarla.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Dame un nombre para la nueva preselección de agua.
- <form name="form">
- <input name="message">
- Preselección nueva
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ No se pueden añadir más fotogramas clave a este ciclo del día. El número máximo de fotogramas clave para ciclos del día de alcance [SCOPE] es [MAX].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- ¡Esa preselección ya existe!
+ <notification name="EnvUpdateRate">
+ La configuración de entorno de la región sólo puede actualizarse cada [WAIT] segundos. Espera por lo menos este tiempo y vuelve intentarlo.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- No puedes editar o borrar una preselección por defecto.
+ <notification name="PPSaveEffectAlert">
+ Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="ChatterBoxSessionStartError">
No se puede empezar una nueva sesión de chat con [RECIPIENT].
@@ -2337,6 +2328,9 @@ Aquí no puedes volar.
<notification name="NoBuild">
Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
</notification>
+ <notification name="SeeAvatars">
+ Esta parcela oculta los avatares y el chat de texto de otras parcelas. No podrás ver a los residentes que estén fuera la parcela ni ellos podrán verte a ti. El chat de texto regular del canal 0 también está bloqueado.
+ </notification>
<notification name="ScriptsStopped">
Un administrador ha detenido temporalmente los scripts en esta región.
</notification>
@@ -2763,7 +2757,9 @@ Se mostrará cuando haya suficiente espacio.
Selecciona los residentes con quienes deseas compartir.
</notification>
<notification name="MeshUploadError">
- No se ha cargado [ETIQUETA]: [MENSAJE] [IDENTIFICADOR] [IDENTIFICADOR_FALTA_VALIDEZ]
+ [LABEL] no se pudo subir: [MESSAGE] [IDENTIFIER]
+
+Consulta los detalles en el archivo de registro.
</notification>
<notification name="ShareItemsConfirmation">
¿Estás seguro de que quieres compartir los elementos siguientes?
diff --git a/indra/newview/skins/default/xui/es/panel_edit_pick.xml b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
index 9b101ee4ba..cda465da9c 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Guardar" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cancelar" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/es/panel_outfits_list.xml b/indra/newview/skins/default/xui/es/panel_outfits_list.xml
index 661b44e419..3f8057f242 100644
--- a/indra/newview/skins/default/xui/es/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/es/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="¿No encuentras lo que buscas? Inténtalo con [secondlife:///app/search/all/[SEARCH_TERM] Buscar]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Todavía no tienes vestuario. Inténtalo con [secondlife:///app/search/all/ Buscar]"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Ver más opciones"/>
+ <menu_button name="options_gear_btn" tool_tip="Ver más opciones"/>
<button name="trash_btn" tool_tip="Eliminar el vestuario seleccionado"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
index a9d38dca25..2fcbb00aed 100644
--- a/indra/newview/skins/default/xui/es/panel_people.xml
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -76,7 +76,7 @@
<button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>
</layout_panel>
<layout_panel name="teleport_btn_lp">
- <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
+ <button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
</layout_panel>
</layout_stack>
<layout_stack name="bottom_bar_ls1">
diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml
index 3c363859a4..e1cf1332e2 100644
--- a/indra/newview/skins/default/xui/es/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml
@@ -64,6 +64,8 @@
<text name="scripts_value" value="Sí"/>
<text name="damage_label" value="Daño:"/>
<text name="damage_value" value="No"/>
+ <text name="see_avatars_label" value="Ver los avatares:"/>
+ <text name="see_avatars_value" value="No"/>
<button label="Acerca del terreno" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
index 96e63e6fa0..620a95de4d 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <text name="Cache:">
+ Caché:
+ </text>
+ <spinner label="Tamaño de la caché (64 - 9984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Vaciar la caché" label_selected="Vaciar la caché" name="clear_cache"/>
+ <text name="Cache location">
+ Localización de la caché:
+ </text>
+ <button label="Elegir" label_selected="Elegir" name="set_cache"/>
+ <button label="Ubicación predeterminada" label_selected="Ubicación predeterminada" name="default_cache_location"/>
<text name="UI Size:">
Tamaño de la UI:
</text>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
index 75d175b262..5cb1654c70 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -19,6 +19,7 @@
<check_box label="Activado" name="enable_voice_check"/>
<check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media" value="true"/>
<check_box label="Ejecutar para otros avatares los media anexados" name="media_show_on_others_btn" tool_tip="Al desmarcar esto se esconderán los media anexados a otros avatares cercanos" value="true"/>
+ <check_box label="Reproducir sonidos de los gestos" name="gesture_audio_play_btn" tool_tip="Selecciona esta opción para escuchar los sonidos de los gestos" value="verdadero"/>
<text name="voice_chat_settings">
Configuración del chat de voz
</text>
@@ -35,28 +36,5 @@
<button label="Elegir la tecla" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="Reconfigurarlo al botón medio del ratón"/>
<button label="Dispositivos de entrada y salida" name="device_settings_btn" width="210"/>
- <panel label="Configuración de dispositivos" name="device_settings_panel">
- <panel.string name="default_text">
- Por defecto
- </panel.string>
- <panel.string name="default system device">
- Dispositivo del sistema por defecto
- </panel.string>
- <panel.string name="no device">
- Ningún dispositivo
- </panel.string>
- <text name="Input">
- Entrada
- </text>
- <text name="My volume label">
- Mi volumen:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia el volumen usando este deslizable"/>
- <text name="wait_text">
- Por favor, espera
- </text>
- <text name="Output">
- Salida
- </text>
- </panel>
+ <panel label="Configuración de dispositivos" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_environment.xml b/indra/newview/skins/default/xui/es/panel_region_environment.xml
new file mode 100644
index 0000000000..a73f1deed4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Entorno" name="panel_env_info">
+ <text name="water_settings_title">
+ Selecciona la configuración de agua y cielo/ciclo del día que deseas que vean todos los visitantes de tu región. Más información
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usar los valores predeterminados de Second Life" name="use_sl_default_settings"/>
+ <radio_item label="Usar la configuración siguiente" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Configuración de agua
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Cielo/Ciclo del día
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Cielo invariable" name="my_sky_settings"/>
+ <radio_item label="Ciclo del día" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Aplicar" name="apply_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
index 98b10e4895..cb6c03dbb5 100644
--- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
@@ -7,21 +7,56 @@
desconocida
</text>
<spinner label="Nivel del agua" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Límite de elevación &#10;del terreno" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Límite de bajada del &#10;terreno" name="terrain_lower_spin" bottom_delta="-34"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Usar el Sol del estado" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Fijar el Sol" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
+ <spinner label="Límite de elevación
+del terreno" name="terrain_raise_spin"/>
+ <spinner bottom_delta="-34" label="Límite de bajada del
+terreno" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Texturas del terreno (requiere archivos .tga de 512x512, 24 bits)
+ </text>
+ <text name="height_text_lbl">
+ 1 (bajo)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (alto)
+ </text>
+ <text name="height_text_lbl5">
+ Intervalos de elevación de textura
+ </text>
+ <text name="height_text_lbl10">
+ Estos valores representan la gama de mezclas para las texturas anteriores.
+ </text>
+ <text name="height_text_lbl11">
+ El valor BAJA mide en metros la altura MÁXIMA de la textura n.º 1, y el valor ALTA es la altura MÍNIMA de la textura n.º 4.
+ </text>
+ <text name="height_text_lbl6">
+ Noroeste
+ </text>
+ <text name="height_text_lbl7">
+ Noreste
+ </text>
+ <spinner label="Bajo" name="height_start_spin_1"/>
+ <spinner label="Bajo" name="height_start_spin_3"/>
+ <spinner label="Alto" name="height_range_spin_1"/>
+ <spinner label="Alto" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Suroeste
+ </text>
+ <text name="height_text_lbl9">
+ Sureste
+ </text>
+ <spinner label="Bajo" name="height_start_spin_0"/>
+ <spinner label="Bajo" name="height_start_spin_2"/>
+ <spinner label="Alto" name="height_range_spin_0"/>
+ <spinner label="Alto" name="height_range_spin_2"/>
+ <button label="Descargar el RAW del terreno..." name="download_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores" width="230"/>
+ <button label="Subir un RAW para el terreno..." name="upload_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores" width="230"/>
+ <button label="Predeterminar este terreno" name="bake_terrain_btn" tool_tip="Definir el terreno actual como punto medio para los límites de elevación/bajada" width="230"/>
<button label="Aplicar" name="apply_btn"/>
- <button width="230" label="Descargar el RAW del terreno..." name="download_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores"/>
- <button left="246" label="?" name="download_raw_help"/>
- <button width="230" label="Subir un RAW para el terreno..." name="upload_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores"/>
- <button left="246" label="?" name="upload_raw_help"/>
- <button width="230" label="Predeterminar este terreno" name="bake_terrain_btn" tool_tip="Definir el terreno actual como punto medio para los límites de elevación/bajada"/>
- <button left="246" label="?" name="bake_terrain_help"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
index b233fdd734..84d19c703b 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
@@ -1,6 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Cosas" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Objetos recibidos ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Objetos recibidos
+ </string>
+ <button label="Objetos recibidos" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] Nuevos
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ Aquí se entregarán las compras realizadas en el mercado.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="outbox_layout_panel">
+ <panel label="" name="marketplace_outbox">
+ <button label="Buzón de salida de comerciante" name="outbox_btn"/>
+ <button label="" name="outbox_sync_btn" tool_tip="Poner en el escaparate de Mi Mercado"/>
+ <panel tool_tip="Drag and drop items here to prepare them for sale on your storefront">
+ <text name="outbox_inventory_placeholder">
+ Configura tu cuenta de comerciante para utilizar esta función.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index b759eed738..51ac3849ed 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1171,6 +1171,12 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InventoryNoTexture">
No tienes en tu inventario una copia de esta textura
</string>
+ <string name="InventoryInboxNoItems">
+ Aquí se entregarán los objetos comprados en el mercado.
+ </string>
+ <string name="InventoryOutboxNoItems">
+ Arrastra objetos aquí para preparar una lista del escaparate de tu mercado.
+ </string>
<string name="no_transfer" value="(no transferible)"/>
<string name="no_modify" value="(no modificable)"/>
<string name="no_copy" value="(no copiable)"/>
@@ -1211,9 +1217,6 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InvFolder My Inventory">
Mi Inventario
</string>
- <string name="InvFolder My Favorites">
- Mis Favoritos
- </string>
<string name="InvFolder Library">
Biblioteca
</string>
@@ -1272,10 +1275,10 @@ Intenta iniciar sesión de nuevo en unos instantes.
Gestos
</string>
<string name="InvFolder Favorite">
- Favoritos
+ Mis Favoritos
</string>
<string name="InvFolder favorite">
- Favoritos
+ Mis Favoritos
</string>
<string name="InvFolder Current Outfit">
Vestuario actual
@@ -1298,6 +1301,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InvFolder All">
Todas
</string>
+ <string name="no_attachments">
+ No tienes puestos anexos
+ </string>
<string name="Buy">
Comprar
</string>
@@ -1633,6 +1639,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="IMTeen">
teen
</string>
+ <string name="Anyone">
+ cualquiera
+ </string>
<string name="RegionInfoError">
error
</string>
@@ -1849,6 +1858,12 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="Public">
Público
</string>
+ <string name="LocalSettings">
+ Configuración local
+ </string>
+ <string name="RegionSettings">
+ Configuración de la región
+ </string>
<string name="ClassifiedClicksTxt">
Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
</string>
@@ -3640,6 +3655,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Región General
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Los avatares están visibles y está permitido el chat fuera de esta parcela
+ </string>
<string name="UpdaterWindowTitle">
Actualizar [APP_NAME]
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index bef41bb1ba..55dd913a22 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -135,12 +135,12 @@
0
</text>
<button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
+ <button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
<button label="Infos sur les scripts" name="Scripts..." width="110"/>
<button label="Acheter pour le groupe" label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
<button label="Acheter un pass" label_selected="Acheter un pass..." left_delta="-127" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
<button label="Abandonner le terrain" label_selected="Abandonner le terrain..." name="Abandon Land..."/>
<button label="Récupérer le terrain" label_selected="Redemander le terrain…" name="Reclaim Land..."/>
- <button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
</panel>
<panel label="RÈGLEMENT" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -312,6 +312,9 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<panel.string name="push_restrict_region_text">
Pas de bousculades (les règles de la région priment)
</panel.string>
+ <panel.string name="see_avs_text">
+ Voir et chatter avec les résidents sur cette parcelle
+ </panel.string>
<text name="allow_label">
Autoriser les autres résidents à :
</text>
@@ -374,6 +377,10 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
Photo :
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
+ <text name="allow_label5">
+ Autoriser les résidents sur les autres parcelles à :
+ </text>
+ <check_box label="Voir les avatars" name="SeeAvatarsCheck" tool_tip="Permettre aux résidents présents sur d&apos;autres parcelles de voir et chatter avec les résidents présents sur cette parcelle et vous permettre de les voir et de chatter avec eux."/>
<text name="landing_point">
Lieu d&apos;arrivée : [LANDING]
</text>
@@ -434,6 +441,11 @@ musique :
Son :
</text>
<check_box label="Limiter les gestes et sons d&apos;objet à cette parcelle" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Sons d&apos;avatar :
+ </text>
+ <check_box label="Tout le monde" name="all av sound check"/>
+ <check_box label="Groupe" name="group av sound check"/>
<text name="Voice settings:">
Voix :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/fr/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..035bdbe5f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="SUPPRIMER PRÉRÉGLAGE ENV.">
+ <string name="title_water">
+ Supprimer un préréglage de l&apos;eau
+ </string>
+ <string name="title_sky">
+ Supprimer un préréglage du ciel
+ </string>
+ <string name="title_day_cycle">
+ Supprimer un cycle du jour
+ </string>
+ <string name="label_water">
+ Préréglage :
+ </string>
+ <string name="label_sky">
+ Préréglage :
+ </string>
+ <string name="label_day_cycle">
+ Cycle du jour :
+ </string>
+ <string name="msg_confirm_deletion">
+ Voulez-vous vraiment supprimer le préréglage sélectionné ?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Impossible de supprimer un préréglage référencé dans un ou plusieurs cycles du jour.
+ </string>
+ <string name="combo_label">
+ -Effectuer une sélection-
+ </string>
+ <text name="label">
+ Préréglage :
+ </text>
+ <button label="Supprimer" name="delete"/>
+ <button label="Annuler" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..0100419bc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Modifier un cycle du jour">
+ <string name="title_new">
+ Créer un nouveau cycle du jour
+ </string>
+ <string name="title_edit">
+ Modifier un cycle du jour
+ </string>
+ <string name="hint_new">
+ Donnez un nom au cycle du jour, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
+ </string>
+ <string name="hint_edit">
+ Pour modifier le cycle du jour, ajustez les contrôles ci-dessous, puis cliquez sur Enregistrer.
+ </string>
+ <string name="combo_label">
+ -Effectuer une sélection-
+ </string>
+ <text name="label">
+ Nom du préréglage :
+ </text>
+ <text name="note">
+ Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
+ </text>
+ <text name="hint_item1">
+ - Cliquez sur un repère pour modifier le réglage du ciel et l&apos;heure associés.
+ </text>
+ <text name="hint_item2">
+ - Cliquez sur les repères et faites-les glisser afin de définir les heures de transition.
+ </text>
+ <text name="hint_item3">
+ - Déplacez le marqueur en forme de triangle pour afficher un aperçu du cycle du jour.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey"/>
+ <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey"/>
+ <text name="WL12am">
+ Min.
+ </text>
+ <text name="WL3am">
+ 3h
+ </text>
+ <text name="WL6am">
+ 6h
+ </text>
+ <text name="WL9amHash">
+ 9h
+ </text>
+ <text name="WL12pmHash">
+ Midi
+ </text>
+ <text name="WL3pm">
+ 15h
+ </text>
+ <text name="WL6pm">
+ 18h
+ </text>
+ <text name="WL9pm">
+ 21h
+ </text>
+ <text name="WL12am2">
+ Min.
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Réglage du ciel :
+ </text>
+ <combo_box label="Préréglage" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Heure :
+ </text>
+ <time name="time" value="6h"/>
+ <check_box label="Appliquer ce nouveau cycle du jour" name="make_default_cb"/>
+ <button label="Enregistrer" name="save"/>
+ <button label="Annuler" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/fr/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..4ec9bbb3dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Modifier un préréglage du ciel">
+ <string name="title_new">
+ Créer un nouveau préréglage du ciel
+ </string>
+ <string name="title_edit">
+ Modifier un préréglage du ciel
+ </string>
+ <string name="hint_new">
+ Donnez un nom à votre préréglage, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
+ </string>
+ <string name="hint_edit">
+ Pour modifier le préréglage du ciel, ajustez les contrôles, puis cliquez sur Enregistrer.
+ </string>
+ <string name="combo_label">
+ -Effectuer une sélection-
+ </string>
+ <text name="hint">
+ Pour modifier le préréglage, ajustez les contrôles, puis cliquez sur Enregistrer.
+ </text>
+ <text name="label">
+ Nom du préréglage :
+ </text>
+ <text name="note">
+ Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSPHÈRE" name="Atmosphere">
+ <text name="BHText">
+ Bleu de l&apos;horizon
+ </text>
+ <text name="BDensText">
+ Quantité de brume
+ </text>
+ <text name="BDensText2">
+ Densité du bleu
+ </text>
+ <text name="HDText">
+ Densité de la brume
+ </text>
+ <text name="DensMultText">
+ Multiplicateur de densité
+ </text>
+ <text name="WLDistanceMultText">
+ Multiplicateur de distance
+ </text>
+ <text name="MaxAltText">
+ Altitude maximum
+ </text>
+ </panel>
+ <panel label="LUMIÈRE" name="Lighting">
+ <text name="SLCText">
+ Couleur soleil/lune
+ </text>
+ <text name="WLAmbientText">
+ Éclairage ambiant
+ </text>
+ <text name="SunGlowText">
+ Rayonnement du soleil
+ </text>
+ <slider label="Netteté" name="WLGlowB"/>
+ <slider label="Taille" name="WLGlowR"/>
+ <text name="WLStarText">
+ Éclat des étoiles
+ </text>
+ <text name="SceneGammaText">
+ Gamma de la scène
+ </text>
+ <text name="TODText">
+ Position soleil/lune
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ Min.
+ </text>
+ <text name="WL6am">
+ 6h
+ </text>
+ <text name="WL12pmHash">
+ Midi
+ </text>
+ <text name="WL6pm">
+ 18h
+ </text>
+ <text name="WL12am2">
+ Min.
+ </text>
+ <time name="WLDayTime" value="6h"/>
+ <text name="WLEastAngleText">
+ Angle du levant
+ </text>
+ </panel>
+ <panel label="NUAGES" name="Clouds">
+ <text name="WLCloudColorText">
+ Couleur des nuages
+ </text>
+ <text name="WLCloudColorText2">
+ Nuages - XY/Densité
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Couverture nuageuse
+ </text>
+ <text name="WLCloudScaleText">
+ Altitude des nuages
+ </text>
+ <text name="WLCloudDetailText">
+ Détails des nuages - XY/Densité
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Direction et vitesse X
+ </text>
+ <check_box label="Verrouiller" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Direction et vitesse Y
+ </text>
+ <check_box label="Verrouiller" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Appliquer ce nouveau préréglage pour le ciel" name="make_default_cb"/>
+ <button label="Enregistrer" name="save"/>
+ <button label="Annuler" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/fr/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..81d9d34cfb
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Modifier un préréglage de l&apos;eau">
+ <string name="title_new">
+ Créer un nouveau préréglage de l&apos;eau
+ </string>
+ <string name="title_edit">
+ Modifier un préréglage de l&apos;eau
+ </string>
+ <string name="hint_new">
+ Donnez un nom à votre préréglage, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
+ </string>
+ <string name="hint_edit">
+ Pour modifier le préréglage de l&apos;eau, ajustez les contrôles, puis cliquez sur Enregistrer.
+ </string>
+ <string name="combo_label">
+ -Effectuer une sélection-
+ </string>
+ <text name="hint">
+ Pour modifier le préréglage, ajustez les contrôles, puis cliquez sur Enregistrer.
+ </text>
+ <text name="label">
+ Nom du préréglage :
+ </text>
+ <text name="note">
+ Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Couleur du brouillard dans l&apos;eau
+ </text>
+ <text name="water_fog_density_label">
+ Densité du brouillard
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Brouillard sous-marin
+ </text>
+ <text name="BHText">
+ Direction grande vague
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Échelle des vaguelettes
+ </text>
+ <text name="HDText">
+ Échelle Fresnel
+ </text>
+ <text name="FresnelOffsetText">
+ Décalage Fresnel
+ </text>
+ <text name="BHText2">
+ Direction petite vague
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Réfraction au-dessus
+ </text>
+ <text name="WaterScaleBelowText">
+ Réfraction en dessous
+ </text>
+ <text name="MaxAltText">
+ Multiplicateur de flou
+ </text>
+ <text name="BHText3">
+ Normal Map
+ </text>
+ </panel>
+ <check_box label="Appliquer ce nouveau préréglage pour l&apos;eau" name="make_default_cb"/>
+ <button label="Enregistrer" name="save"/>
+ <button label="Annuler" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_environment_settings.xml b/indra/newview/skins/default/xui/fr/floater_environment_settings.xml
new file mode 100644
index 0000000000..9ea47a3dd7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="PARAMÈTRES D&apos;ENVIRONNEMENT">
+ <text name="note">
+ Utilisez les options ci-dessous pour personnaliser l&apos;environnement de votre client.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Utiliser les réglages de la région" name="use_region_settings"/>
+ <radio_item label="Personnaliser mon environnement" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Remarque : les autres utilisateurs ne pourront pas voir votre configuration personnalisée.
+ </text>
+ <text name="water_settings_title">
+ Réglage de l&apos;eau
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciel / Cycle du jour
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Ciel fixe" name="my_sky_settings"/>
+ <radio_item label="Cycle du jour" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
index 213847bbd0..4788f674c8 100644
--- a/indra/newview/skins/default/xui/fr/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
@@ -3,6 +3,9 @@
<string name="status_idle">
Inactif
</string>
+ <string name="status_parse_error">
+ Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
+ </string>
<string name="status_reading_file">
Chargement...
</string>
@@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
</string>
+ <string name="bad_element">
+ Erreur : élément non valide
+ </string>
<string name="high">
Élevé
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_model_wizard.xml b/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
index bb64361959..ebb87f3ba4 100644
--- a/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
@@ -193,6 +193,9 @@
<string name="status_idle">
Inactif
</string>
+ <string name="status_parse_error">
+ Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
+ </string>
<string name="status_reading_file">
Chargement...
</string>
@@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
</string>
+ <string name="bad_element">
+ Erreur : élément non valide
+ </string>
<string name="high">
Élevé
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index 09d77a8d34..908048192e 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -405,7 +405,7 @@
</combo_box>
<spinner label="Gravité" name="Physics Gravity"/>
<spinner label="Friction" name="Physics Friction"/>
- <spinner label="Densité" name="Physics Density"/>
+ <spinner label="Densité en 100 kg/m^3" name="Physics Density"/>
<spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Texture" name="Texture">
diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml
index 400c77e51a..6b96a16e75 100644
--- a/indra/newview/skins/default/xui/fr/menu_login.xml
+++ b/indra/newview/skins/default/xui/fr/menu_login.xml
@@ -18,7 +18,7 @@
<menu_item_call label="Afficher les conditions d&apos;utilisation" name="TOS"/>
<menu_item_call label="Afficher le message critique" name="Critical"/>
<menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
- <menu_item_call label="Test de la fenêtre flottante du contenu Web" name="Web Content Floater Test"/>
+ <menu_item_call label="Test de débogage de la fenêtre flottante du contenu Web" name="Web Content Floater Debug Test"/>
<menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/>
<menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
index 45f97e062e..0aad174fbd 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/>
<menu_item_check label="Trier par nom" name="sort_name"/>
<menu_item_check label="Trier par distance" name="sort_distance"/>
<menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
+ <menu_item_check label="Afficher la carte" name="view_map"/>
<menu_item_call label="Afficher les résidents et les objets interdits" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index d614cfe00c..ccea1e4570 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -31,6 +31,7 @@
<menu_item_call label="Mes groupes" name="My Groups"/>
<menu_item_check label="Chat près de moi" name="Nearby Chat"/>
<menu_item_call label="Personnes près de moi" name="Active Speakers"/>
+ <menu_item_check label="Chat vocal près de vous" name="Nearby Voice"/>
</menu>
<menu label="Monde" name="World">
<menu_item_check label="Mini-carte" name="Mini-Map"/>
@@ -63,8 +64,24 @@
<menu_item_call label="Milieu de journée" name="Noon"/>
<menu_item_call label="Coucher de soleil" name="Sunset"/>
<menu_item_call label="Minuit" name="Midnight"/>
- <menu_item_call label="Heure du domaine" name="Revert to Region Default"/>
- <menu_item_call label="Éditeur d&apos;environnement" name="Environment Editor"/>
+ </menu>
+ <menu label="Éditeur d&apos;environnement" name="Enviroment Editor">
+ <menu_item_call label="Paramètres d&apos;environnement..." name="Enviroment Settings"/>
+ <menu label="Préréglages de l&apos;eau" name="Water Presets">
+ <menu_item_call label="Nouveau préréglage..." name="new_water_preset"/>
+ <menu_item_call label="Modifier un préréglage..." name="edit_water_preset"/>
+ <menu_item_call label="Supprimer un préréglage..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Préréglages du ciel" name="Sky Presets">
+ <menu_item_call label="Nouveau préréglage..." name="new_sky_preset"/>
+ <menu_item_call label="Modifier un préréglage..." name="edit_sky_preset"/>
+ <menu_item_call label="Supprimer un préréglage..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Préréglages du jour" name="Day Presets">
+ <menu_item_call label="Nouveau préréglage..." name="new_day_preset"/>
+ <menu_item_call label="Modifier un préréglage..." name="edit_day_preset"/>
+ <menu_item_call label="Supprimer un préréglage..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Construire" name="BuildTools">
diff --git a/indra/newview/skins/default/xui/fr/menu_wearing_gear.xml b/indra/newview/skins/default/xui/fr/menu_wearing_gear.xml
index 0ca9fe1879..c3d9d908b0 100644
--- a/indra/newview/skins/default/xui/fr/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Modifier la tenue" name="edit"/>
<menu_item_call label="Enlever" name="takeoff"/>
-</menu>
+ <menu_item_call label="Copier la liste de la tenue dans le presse-papiers" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 6bfab25087..52b8e8569a 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -1550,6 +1550,11 @@ Veuillez réessayer ultérieurement.
<button name="Cancel" text="Annuler"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Vous avez essayé d&apos;effectuer [OFFERS] offres de téléportation,
+or ce nombre dépasse la limite autorisée fixée à [LIMIT].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
Exiger du résident qu&apos;il vienne vous rejoindre ?
<form name="form">
@@ -1971,6 +1976,10 @@ Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
Êtes-vous certain de vouloir supprimer l&apos;historique de vos visites et recherches ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ Voulez-vous vraiment vider le cache de votre client ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Êtes-vous certain de vouloir supprimer vos cookies ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
@@ -1996,48 +2005,30 @@ Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apo
Voulez-vous écraser l&apos;option précédemment enregistrée ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
- <notification name="WLDeletePresetAlert">
- Voulez-vous supprimer [SKY] ?
- <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
- </notification>
<notification name="WLNoEditDefault">
Vous ne pouvez pas modifier ou supprimer un préréglage par défaut.
</notification>
<notification name="WLMissingSky">
Une dossier semble manquer au Cycle du jour : [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ?
- <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
- </notification>
- <notification name="NewSkyPreset">
- Nommez le nouveau ciel.
- <form name="form">
- <input name="message">
- Nouveau préréglage
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuler"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ Impossible d&apos;appliquer les réglages à la région. Le problème est parfois résolu en quittant la région puis en y revenant. Motif fourni : [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- Ce préréglage existe déjà !
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Impossible de supprimer la dernière clé de ce cycle du jour car ce dernier ne peut pas être vide. Modifiez la dernière clé restante au lieu d&apos;essayer de la supprimer puis d&apos;en créer une nouvelle.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Nommez ce nouveau préréglage d&apos;eau.
- <form name="form">
- <input name="message">
- Nouveau préréglage
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuler"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ Impossible d&apos;ajouter plus d&apos;images-clés à ce cycle du jour. Un maximum de [MAX] images-clés peut être associé aux cycles du jour de type [SCOPE].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- Ce préréglage existe déjà !
+ <notification name="EnvUpdateRate">
+ Vous ne pouvez mettre à jour les paramètres d&apos;environnement d&apos;une région que toutes les [WAIT] secondes. Veuillez patienter pendant au moins ce délai avant de réessayer.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- Vous ne pouvez pas modifier ou supprimer un préréglage par défaut.
+ <notification name="PPSaveEffectAlert">
+ Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ?
+ <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification name="ChatterBoxSessionStartError">
Impossible de démarrer une nouvelle session de chat avec [RECIPIENT].
@@ -2329,6 +2320,9 @@ Vous ne pouvez pas voler ici.
<notification name="NoBuild">
La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d&apos;objets ici.
</notification>
+ <notification name="SeeAvatars">
+ Cette parcelle masque les avatars et le chat écrit des autres parcelles. Vous ne pouvez pas voir les résidents qui se trouvent en dehors, et ceux qui se trouvent en dehors ne peuvent pas vous voir. Le chat écrit habituel sur le canal 0 est également bloqué.
+ </notification>
<notification name="ScriptsStopped">
Un administrateur a temporairement stoppé les scripts dans cette région.
</notification>
@@ -2756,7 +2750,9 @@ Le bouton sera affiché quand il y aura suffisamment de place.
Sélectionnez les résidents avec lesquels partager l&apos;élément.
</notification>
<notification name="MeshUploadError">
- Échec de chargement de [LABEL] : [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ Échec de chargement de [LABEL] : [MESSAGE] [IDENTIFIER]
+
+Voir le fichier journal pour plus de détails.
</notification>
<notification name="ShareItemsConfirmation">
Voulez-vous vraiment partager les articles suivants :
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
index 2364d9bbb2..247e18da82 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Enregistrer" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annuler" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_list.xml b/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
index ab352deec4..416353e1d4 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Aucune tenue n&apos;est actuellement en votre possession. Essayez [secondlife:///app/search/all Rechercher]."/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ <menu_button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
<button name="trash_btn" tool_tip="Supprimer la tenue sélectionnée"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml
index b24c340708..f035853efc 100644
--- a/indra/newview/skins/default/xui/fr/panel_people.xml
+++ b/indra/newview/skins/default/xui/fr/panel_people.xml
@@ -67,16 +67,16 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife://
<button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/>
</layout_panel>
<layout_panel name="im_btn_lp">
- <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
+ <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM."/>
</layout_panel>
<layout_panel name="call_btn_lp">
- <button label="Appel" name="call_btn" tool_tip="Appeler ce résident"/>
+ <button label="Appel" name="call_btn" tool_tip="Appeler ce résident."/>
</layout_panel>
<layout_panel name="share_btn_lp">
- <button label="Partager" name="share_btn" tool_tip="Partager un article de l&apos;inventaire"/>
+ <button label="Partager" name="share_btn" tool_tip="Partager un article de l&apos;inventaire."/>
</layout_panel>
<layout_panel name="teleport_btn_lp">
- <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/>
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation."/>
</layout_panel>
</layout_stack>
<layout_stack name="bottom_bar_ls1">
diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
index 3c2c1b9d37..30be838896 100644
--- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
@@ -68,6 +68,8 @@
<text name="scripts_value" value="Activé"/>
<text name="damage_label" value="Dégâts :"/>
<text name="damage_value" value="Désactivé"/>
+ <text name="see_avatars_label" value="Voir les avatars :"/>
+ <text name="see_avatars_value" value="Désactivé"/>
<button label="À propos du terrain" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
index 3468afbafe..3f3d0f51f4 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
@@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <text name="Cache:">
+ Cache :
+ </text>
+ <spinner label="Taille du cache (64 - 9984 Mo)" name="cachesizespinner"/>
+ <text name="text_box5">
+ Mo
+ </text>
+ <button label="Vider le cache" label_selected="Vider le cache" name="clear_cache"/>
+ <text name="Cache location">
+ Emplacement du cache :
+ </text>
+ <button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
+ <button label="Par défaut" label_selected="Par défaut" name="default_cache_location"/>
<text name="UI Size:">
Taille d&apos;interface :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
index a404aae483..deaec2e14f 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
@@ -19,6 +19,7 @@
<check_box label="Activé" name="enable_voice_check"/>
<check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média" value="true"/>
<check_box label="Lecture du média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous" value="true"/>
+ <check_box label="Lire les sons des gestes" name="gesture_audio_play_btn" tool_tip="Cochez cette case pour entendre les sons associés aux gestes." value="true"/>
<text name="voice_chat_settings">
Paramètres du chat vocal
</text>
@@ -35,28 +36,5 @@
<button label="Définir la touche" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="Réinitialiser sur le bouton central de la souris"/>
<button label="Périphériques d&apos;entrée/de sortie" name="device_settings_btn"/>
- <panel label="Paramètres du matériel" name="device_settings_panel">
- <panel.string name="default_text">
- Défaut
- </panel.string>
- <panel.string name="default system device">
- Périphérique système par défaut
- </panel.string>
- <panel.string name="no device">
- Aucun périphérique
- </panel.string>
- <text name="Input">
- Entrée
- </text>
- <text name="My volume label">
- Mon volume :
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Régler le volume avec le curseur"/>
- <text name="wait_text">
- Veuillez patienter
- </text>
- <text name="Output">
- Sortie
- </text>
- </panel>
+ <panel label="Paramètres du matériel" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_environment.xml b/indra/newview/skins/default/xui/fr/panel_region_environment.xml
new file mode 100644
index 0000000000..d18503db86
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Environnement" name="panel_env_info">
+ <text name="water_settings_title">
+ Sélectionnez les réglages d&apos;eau et de ciel/cycle du jour que vous souhaitez afficher pour tous les résidents visitant votre région. En savoir plus
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Utiliser les réglages par défaut de Second Life" name="use_sl_default_settings"/>
+ <radio_item label="Utiliser les réglages suivants" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Réglage de l&apos;eau
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciel / Cycle du jour
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Ciel fixe" name="my_sky_settings"/>
+ <radio_item label="Cycle du jour" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Appliquer" name="apply_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
index 4d7652eb6f..d7e321d06d 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
@@ -7,21 +7,56 @@
(inconnue)
</text>
<spinner label="Niveau de l&apos;eau" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Limite d&apos;élévation du &#10;terrain" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Limite d&apos;abaissement &#10;du terrain" name="terrain_lower_spin" bottom_delta="-34"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Utiliser le soleil du domaine" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Soleil fixe" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Phase" name="sun_hour_slider"/>
- <button label="Appliquer" name="apply_btn"/>
+ <spinner label="Limite d&apos;élévation du
+terrain" name="terrain_raise_spin"/>
+ <spinner bottom_delta="-34" label="Limite d&apos;abaissement
+du terrain" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Textures du terrain (fichiers .tga 512 x 512, 24 bit requis)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Bas)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Haut)
+ </text>
+ <text name="height_text_lbl5">
+ Limites d&apos;élévation de texture
+ </text>
+ <text name="height_text_lbl10">
+ Ces valeurs représentent les limites de mélange pour les textures ci-dessus.
+ </text>
+ <text name="height_text_lbl11">
+ En mètres, la valeur BAS correspond à la hauteur MAXIMUM de la texture n°1 et la valeur HAUT à la hauteur MINIMUM de la texture n°4.
+ </text>
+ <text name="height_text_lbl6">
+ Nord-ouest
+ </text>
+ <text name="height_text_lbl7">
+ Nord-est
+ </text>
+ <spinner label="Bas" name="height_start_spin_1"/>
+ <spinner label="Bas" name="height_start_spin_3"/>
+ <spinner label="Haut" name="height_range_spin_1"/>
+ <spinner label="Haut" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Sud-ouest
+ </text>
+ <text name="height_text_lbl9">
+ Sud-est
+ </text>
+ <spinner label="Bas" name="height_start_spin_0"/>
+ <spinner label="Bas" name="height_start_spin_2"/>
+ <spinner label="Haut" name="height_range_spin_0"/>
+ <spinner label="Haut" name="height_range_spin_2"/>
<button label="Télécharger le terrain au format RAW..." name="download_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" width="230"/>
- <button label="?" name="download_raw_help" left="246" />
<button label="Charger le terrain au format RAW..." name="upload_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" width="230"/>
- <button label="?" name="upload_raw_help" left="246" />
<button label="Figer le terrain" name="bake_terrain_btn" tool_tip="Définir le terrain actuel comme point central pour les limites d&apos;élévation/abaissement"/>
- <button label="?" name="bake_terrain_help"/>
+ <button label="Appliquer" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
index 3c4d2626c1..83543e3d0b 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
@@ -1,6 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Choses" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Articles reçus ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Articles reçus
+ </string>
+ <button label="Articles reçus" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] nouv.
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ Ici seront livrés les achats effectués sur la Place du marché.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="outbox_layout_panel">
+ <panel label="" name="marketplace_outbox">
+ <button label="Boîte d&apos;envoi vendeur" name="outbox_btn"/>
+ <button label="" name="outbox_sync_btn" tool_tip="Vers ma vitrine de la Place du marché"/>
+ <panel tool_tip="Drag and drop items here to prepare them for sale on your storefront">
+ <text name="outbox_inventory_placeholder">
+ Configurez votre compte de vendeur de façon à pouvoir utiliser cette fonctionnalité.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 3ec85551da..134ea0c6bb 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1192,6 +1192,12 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="InventoryNoTexture">
Vous n&apos;avez pas de copie de cette texture dans votre inventaire
</string>
+ <string name="InventoryInboxNoItems">
+ Ici seront livrés les articles achetés sur la Place du marché.
+ </string>
+ <string name="InventoryOutboxNoItems">
+ Faites glisser des articles ici en vue de les publier sur votre vitrine de la Place du marché.
+ </string>
<string name="no_transfer" value=" (pas de transfert)"/>
<string name="no_modify" value=" (pas de modification)"/>
<string name="no_copy" value=" (pas de copie)"/>
@@ -1238,9 +1244,6 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="InvFolder My Inventory">
Mon inventaire
</string>
- <string name="InvFolder My Favorites">
- Mes Favoris
- </string>
<string name="InvFolder Library">
Bibliothèque
</string>
@@ -1299,10 +1302,10 @@ Veuillez réessayer de vous connecter dans une minute.
Gestes
</string>
<string name="InvFolder Favorite">
- Favoris
+ Mes Favoris
</string>
<string name="InvFolder favorite">
- Favoris
+ Mes Favoris
</string>
<string name="InvFolder Current Outfit">
Tenue actuelle
@@ -1325,6 +1328,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="InvFolder All">
Tout
</string>
+ <string name="no_attachments">
+ Aucun élément attaché porté
+ </string>
<string name="Buy">
Acheter
</string>
@@ -1660,6 +1666,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="IMTeen">
teen
</string>
+ <string name="Anyone">
+ n&apos;importe qui
+ </string>
<string name="RegionInfoError">
erreur
</string>
@@ -1882,6 +1891,12 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="Public">
Public
</string>
+ <string name="LocalSettings">
+ Réglages locaux
+ </string>
+ <string name="RegionSettings">
+ Réglages de la région
+ </string>
<string name="ClassifiedClicksTxt">
Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil
</string>
@@ -3727,6 +3742,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Région de type Général
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatars visibles et chat autorisé en dehors de cette parcelle
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] - Mise à jour
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index a96433d7aa..cf0f8f2f6f 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -136,12 +136,12 @@ Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezz
0
</text>
<button label="Acquista il terreno..." label_selected="Acquista il terreno..." left="130" name="Buy Land..." width="125"/>
+ <button label="Vendita Linden" name="Linden Sale..." tool_tip="La terra deve essere di proprietà, con contenuto impostato, e non già messa all&apos;asta."/>
<button label="Informazioni script" name="Scripts..."/>
<button label="Acquista per il gruppo" name="Buy For Group..."/>
<button label="Compra Pass..." label_selected="Compra Pass..." left="130" name="Buy Pass..." tool_tip="Un pass ti da un accesso temporaneo in questo territorio." width="125"/>
<button label="Abbandona la terra" name="Abandon Land..."/>
<button label="Reclama la terra" name="Reclaim Land..."/>
- <button label="Vendita Linden" name="Linden Sale..." tool_tip="La terra deve essere di proprietà, con contenuto impostato, e non già messa all&apos;asta."/>
</panel>
<panel label="REGOLAMENTO" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -313,6 +313,9 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<panel.string name="push_restrict_region_text">
Nessuna spinta (Impostazione regionale)
</panel.string>
+ <panel.string name="see_avs_text">
+ Vedi i residenti in questo lotto e chatta con loro
+ </panel.string>
<text name="allow_label">
Permetti ad altri residenti di:
</text>
@@ -375,6 +378,10 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
Fotografia:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Clicca per scegliere una immagine"/>
+ <text name="allow_label5">
+ Permetti ai residenti in altri lotti di:
+ </text>
+ <check_box label="Vedi avatar" name="SeeAvatarsCheck" tool_tip="Consente ai residenti in altri lotti di vedere i residenti in questo lotto e chattare con loro, e ti consente di vederli e chattare con loro."/>
<text name="landing_point">
Punto di atterraggio: [LANDING]
</text>
@@ -434,6 +441,11 @@ Media:
Audio:
</text>
<check_box label="Limita l&apos;audio per oggetti e gesture a questo lotto" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Suoni avatar:
+ </text>
+ <check_box label="Tutti" name="all av sound check"/>
+ <check_box label="Gruppo" name="group av sound check"/>
<text name="Voice settings:">
Voce:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/it/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..71071825af
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="CANCELLA PREDEFINITO AMB">
+ <string name="title_water">
+ Cancella valore predefinito acqua
+ </string>
+ <string name="title_sky">
+ Cancella valore predefinito cielo
+ </string>
+ <string name="title_day_cycle">
+ Cancella ciclo giornata
+ </string>
+ <string name="label_water">
+ Valori predefiniti:
+ </string>
+ <string name="label_sky">
+ Valori predefiniti:
+ </string>
+ <string name="label_day_cycle">
+ Ciclo giornata:
+ </string>
+ <string name="msg_confirm_deletion">
+ Sei sicuro di volere eliminare il valore predefinito selezionato?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Impossibile rimuovere un valore predefinito che viene utilizzato in uno o più cicli di giornata.
+ </string>
+ <string name="combo_label">
+ -Seleziona un valore predefinito-
+ </string>
+ <text name="label">
+ Valori predefiniti:
+ </text>
+ <button label="Elimina" name="delete"/>
+ <button label="Annulla" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/it/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..c922b2e4f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Modifica ciclo giornata">
+ <string name="title_new">
+ Crea un nuovo ciclo giornata
+ </string>
+ <string name="title_edit">
+ Modifica ciclo giornata
+ </string>
+ <string name="hint_new">
+ Dai un nome al ciclo della giornata, modifica i controlli per crearlo e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="hint_edit">
+ Per modificare il ciclo della giornata, modifica i controlli seguenti e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="combo_label">
+ -Seleziona un valore predefinito-
+ </string>
+ <text name="label">
+ Nome predefinito:
+ </text>
+ <text name="note">
+ Nota: se cambi il nome del valore predefinito, in realtà ne crei uno nuovo e quello esistente non viene cambiato.
+ </text>
+ <text name="hint_item1">
+ - Fai clic su una scheda per modificare gli orari e le impostazioni cielo specifiche.
+ </text>
+ <text name="hint_item2">
+ - Fai clic e trascina le schede per impostare i tempi di transizione.
+ </text>
+ <text name="hint_item3">
+ - Usa lo scrubber per visualizzare in anteprima il ciclo giornata.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Aggiungi chiave" label_selected="Aggiungi chiave" name="WLAddKey"/>
+ <button label="Tasto cancella" label_selected="Tasto cancella" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 00:00
+ </text>
+ <text name="WL3am">
+ 03:00:00
+ </text>
+ <text name="WL6am">
+ 06:00:00
+ </text>
+ <text name="WL9amHash">
+ 09:00:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00:00
+ </text>
+ <text name="WL3pm">
+ 15:00:00
+ </text>
+ <text name="WL6pm">
+ 18:00:00
+ </text>
+ <text name="WL9pm">
+ 21:00:00
+ </text>
+ <text name="WL12am2">
+ 00:00
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Impostazioni cielo:
+ </text>
+ <combo_box label="Valori predefiniti" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Giorno/ora:
+ </text>
+ <time name="time" value="06:00:00"/>
+ <check_box label="Usa come nuovo ciclo giornata" name="make_default_cb"/>
+ <button label="Salva" name="save"/>
+ <button label="Annulla" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/it/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..571027fd29
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Modifica predefiniti cielo">
+ <string name="title_new">
+ Crea un nuovo valore predefinito per il cielo
+ </string>
+ <string name="title_edit">
+ Modifica predefiniti cielo
+ </string>
+ <string name="hint_new">
+ Dai un nome al valore predefinito, modifica i controlli per crearlo e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="hint_edit">
+ Per modificare il valore predefinito per il cielo, modifica i controlli e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="combo_label">
+ -Seleziona un valore predefinito-
+ </string>
+ <text name="hint">
+ Per modificare i valori predefiniti, modifica i controlli e quindi fai clic su &quot;Salva&quot;
+ </text>
+ <text name="label">
+ Nome predefinito:
+ </text>
+ <text name="note">
+ Nota: se cambi il nome del valore predefinito, in realtà ne crei uno nuovo e quello esistente non viene cambiato.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSFERA" name="Atmosphere">
+ <text name="BHText">
+ Orizzonte blu
+ </text>
+ <text name="BDensText">
+ Orizzonte foschia
+ </text>
+ <text name="BDensText2">
+ Densità blu
+ </text>
+ <text name="HDText">
+ Densità foschia
+ </text>
+ <text name="DensMultText">
+ Fattore moltiplicativo densità
+ </text>
+ <text name="WLDistanceMultText">
+ Fattore moltiplicativo distanza
+ </text>
+ <text name="MaxAltText">
+ Altitudine massima
+ </text>
+ </panel>
+ <panel label="ILLUMINAZIONE" name="Lighting">
+ <text name="SLCText">
+ Colore sole/luna
+ </text>
+ <text name="WLAmbientText">
+ Ambiente
+ </text>
+ <text name="SunGlowText">
+ Bagliore sole
+ </text>
+ <slider label="Centro focale" name="WLGlowB"/>
+ <slider label="Dimensioni" name="WLGlowR"/>
+ <text name="WLStarText">
+ Luminosità cielo
+ </text>
+ <text name="SceneGammaText">
+ Gamma scena
+ </text>
+ <text name="TODText">
+ Posizione sole/luna
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 00:00
+ </text>
+ <text name="WL6am">
+ 06:00:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00:00
+ </text>
+ <text name="WL6pm">
+ 18:00:00
+ </text>
+ <text name="WL12am2">
+ 00:00
+ </text>
+ <time name="WLDayTime" value="06:00:00"/>
+ <text name="WLEastAngleText">
+ Angolo est
+ </text>
+ </panel>
+ <panel label="NUVOLE" name="Clouds">
+ <text name="WLCloudColorText">
+ Colore nuvole
+ </text>
+ <text name="WLCloudColorText2">
+ XY/Densità nuvole
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Copertura nuvole
+ </text>
+ <text name="WLCloudScaleText">
+ Scala nuvole
+ </text>
+ <text name="WLCloudDetailText">
+ Dettaglio nuvole (XY/Densità)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Scorrimento nuvole X
+ </text>
+ <check_box label="Blocca" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Scorrimento nuvole Y
+ </text>
+ <check_box label="Blocca" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Usa questo valore predefinito come nuova impostazione per il cielo" name="make_default_cb"/>
+ <button label="Salva" name="save"/>
+ <button label="Annulla" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/it/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..7bffc60ba2
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Modifica un valore predefinito acqua">
+ <string name="title_new">
+ Crea un nuovo valore predefinito per l&apos;acqua
+ </string>
+ <string name="title_edit">
+ Modifica un valore predefinito per l&apos;acqua
+ </string>
+ <string name="hint_new">
+ Dai un nome al valore predefinito, modifica i controlli per crearlo e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="hint_edit">
+ Per modificare il valore predefinito per l&apos;acqua, modifica i controlli e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="combo_label">
+ -Seleziona un valore predefinito-
+ </string>
+ <text name="hint">
+ Per modificare i valori predefiniti, modifica i controlli e quindi fai clic su &quot;Salva&quot;
+ </text>
+ <text name="label">
+ Nome predefinito:
+ </text>
+ <text name="note">
+ Nota: se cambi il nome del valore predefinito, in realtà ne crei uno nuovo e quello esistente non viene cambiato.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Colore nebbia acqua
+ </text>
+ <text name="water_fog_density_label">
+ Esponente densità nebbia
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Modificatore nebbia sott&apos;acqua
+ </text>
+ <text name="BHText">
+ Direzione onda grande
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Scala wavelet riflesso
+ </text>
+ <text name="HDText">
+ Scala Fresnel
+ </text>
+ <text name="FresnelOffsetText">
+ Spostamento Fresnel
+ </text>
+ <text name="BHText2">
+ Direzione onda piccola
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Scala wavelet sopra
+ </text>
+ <text name="WaterScaleBelowText">
+ Scala wavelet sotto
+ </text>
+ <text name="MaxAltText">
+ Fattore moltiplicativo blu
+ </text>
+ <text name="BHText3">
+ Mappa normale
+ </text>
+ </panel>
+ <check_box label="Usa questo valore predefinito come nuova impostazione per l&apos;acqua" name="make_default_cb"/>
+ <button label="Salva" name="save"/>
+ <button label="Annulla" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_environment_settings.xml b/indra/newview/skins/default/xui/it/floater_environment_settings.xml
new file mode 100644
index 0000000000..f191078fad
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="IMPOSTAZIONI AMBIENTE">
+ <text name="note">
+ Usa le opzioni seguenti per personalizzare le impostazioni dell&apos;ambiente per il tuo viewer.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usa impostazioni regione" name="use_region_settings"/>
+ <radio_item label="Personalizza il mio ambiente" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Nota: gli altri utenti non vedranno le tue impostazioni personalizzate.
+ </text>
+ <text name="water_settings_title">
+ Impostazione Acqua
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciclo giornata / cielo
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Cielo fisso" name="my_sky_settings"/>
+ <radio_item label="Ciclo giornata" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_model_preview.xml b/indra/newview/skins/default/xui/it/floater_model_preview.xml
index a17b8b36c2..69245f0755 100644
--- a/indra/newview/skins/default/xui/it/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_model_preview.xml
@@ -3,6 +3,9 @@
<string name="status_idle">
Pausa
</string>
+ <string name="status_parse_error">
+ Problema nell&apos;elaborazione DAE - vedi il registro per informazioni al riguardo.
+ </string>
<string name="status_reading_file">
Caricamento in corso...
</string>
@@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
Errore: numero di vertici maggiore di 65534, annullato.
</string>
+ <string name="bad_element">
+ Errore: elemento non valido
+ </string>
<string name="high">
Alto
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_model_wizard.xml b/indra/newview/skins/default/xui/it/floater_model_wizard.xml
index b17f731089..67ba452ce5 100644
--- a/indra/newview/skins/default/xui/it/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/it/floater_model_wizard.xml
@@ -193,6 +193,9 @@
<string name="status_idle">
Pausa
</string>
+ <string name="status_parse_error">
+ Problema nell&apos;elaborazione DAE - vedi il registro per informazioni al riguardo.
+ </string>
<string name="status_reading_file">
Caricamento in corso...
</string>
@@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
Errore: numero di vertici maggiore di 65534, annullato.
</string>
+ <string name="bad_element">
+ Errore: elemento non valido
+ </string>
<string name="high">
Alto
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml
index 23e01a3943..f7c83c9e0f 100644
--- a/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -412,7 +412,7 @@
</combo_box>
<spinner label="Gravità" name="Physics Gravity"/>
<spinner label="Frizione" name="Physics Friction"/>
- <spinner label="Densità" name="Physics Density"/>
+ <spinner label="Densità in 100 kg/m^3" name="Physics Density"/>
<spinner label="Restituzione" name="Physics Restitution"/>
</panel>
<panel label="Texture" name="Texture">
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index bdf7d2094f..fe8bf703aa 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -17,7 +17,7 @@
<menu_item_call label="Mostra i Termini del servizio (TOS)" name="TOS"/>
<menu_item_call label="Mostra messaggio critico" name="Critical"/>
<menu_item_call label="Test browser multimedia" name="Web Browser Test"/>
- <menu_item_call label="Test finestra contenuti Web" name="Web Content Floater Test"/>
+ <menu_item_call label="Test debug finestra contenuti Web" name="Web Content Floater Debug Test"/>
<menu_item_check label="Mostra selettore griglia" name="Show Grid Picker"/>
<menu_item_call label="Mostra Console notifiche" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
index aae2313702..2b5c235706 100644
--- a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Ordina in base a intervenuti recenti" name="sort_by_recent_speakers"/>
<menu_item_check label="Ordina in base al nome" name="sort_name"/>
<menu_item_check label="Ordina in base alla distanza" name="sort_distance"/>
<menu_item_check label="Icone persone" name="view_icons"/>
+ <menu_item_check label="Visualizza mappa" name="view_map"/>
<menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index e4df0630d9..daeda576cc 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -31,6 +31,7 @@
<menu_item_call label="I miei gruppi" name="My Groups"/>
<menu_item_check label="Chat nei dintorni" name="Nearby Chat"/>
<menu_item_call label="Persone vicine" name="Active Speakers"/>
+ <menu_item_check label="Voce nei dintorni" name="Nearby Voice"/>
</menu>
<menu label="Mondo" name="World">
<menu_item_check label="Mini mappa" name="Mini-Map"/>
@@ -63,8 +64,24 @@
<menu_item_call label="Mezzogiorno" name="Noon"/>
<menu_item_call label="Tramonto" name="Sunset"/>
<menu_item_call label="Mezzanotte" name="Midnight"/>
- <menu_item_call label="Orario della proprietà" name="Revert to Region Default"/>
- <menu_item_call label="Editor dell&apos;ambiente" name="Environment Editor"/>
+ </menu>
+ <menu label="Editor ambiente" name="Enviroment Editor">
+ <menu_item_call label="Impostazioni ambiente..." name="Enviroment Settings"/>
+ <menu label="Valori predefiniti acqua" name="Water Presets">
+ <menu_item_call label="Nuovo valore predefinito..." name="new_water_preset"/>
+ <menu_item_call label="Modifica valori predefiniti..." name="edit_water_preset"/>
+ <menu_item_call label="Cancella valore predefinito..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Valori predefiniti cielo" name="Sky Presets">
+ <menu_item_call label="Nuovo valore predefinito..." name="new_sky_preset"/>
+ <menu_item_call label="Modifica valori predefiniti..." name="edit_sky_preset"/>
+ <menu_item_call label="Cancella valore predefinito..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Valori predefiniti giornata" name="Day Presets">
+ <menu_item_call label="Nuovo valore predefinito..." name="new_day_preset"/>
+ <menu_item_call label="Modifica valori predefiniti..." name="edit_day_preset"/>
+ <menu_item_call label="Cancella valore predefinito..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Costruisci" name="BuildTools">
diff --git a/indra/newview/skins/default/xui/it/menu_wearing_gear.xml b/indra/newview/skins/default/xui/it/menu_wearing_gear.xml
index 7c8eef64e5..de25f88aca 100644
--- a/indra/newview/skins/default/xui/it/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Modifica vestiario" name="edit"/>
<menu_item_call label="Togli" name="takeoff"/>
-</menu>
+ <menu_item_call label="Copia gruppo vestiti negli Appunti" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index f50051c004..2d5c8e3522 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -1555,6 +1555,11 @@ Riprova più tardi.
<button name="Cancel" text="Annulla"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Hai cercato di fare [OFFERS] offerte di teleport,
+più del limite [LIMIT].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
Chiedere, in qualità di Admin, al residente di raggiungerti?
<form name="form">
@@ -1977,6 +1982,10 @@ Desideri abbandonare la modalità &apos;Occupato&apos; prima di completare quest
Vuoi veramente eliminare la cronologia viaggi, web e ricerche fatte?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ Sei sicuro di volere cancellare la cache del viewer?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Confermi di volere cancellare i tuoi cookie?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
@@ -2002,48 +2011,30 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
Vuoi sovrascrivere le preimpostazioni salvate?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
- <notification name="WLDeletePresetAlert">
- Vuoi cancellare [SKY]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
<notification name="WLNoEditDefault">
Non puoi modificare o cancellare una preimpostazione di fabbrica.
</notification>
<notification name="WLMissingSky">
Questo file di ciclo giornaliero fa riferimento ad un file di cielo mancante: [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Effetto di post elaborazione già presente. Vuoi sovrascrivere?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="NewSkyPreset">
- Fornisci il nome per il nuovo cielo.
- <form name="form">
- <input name="message">
- Nuova preimpostazione
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ Queste impostazioni non possono essere applicare alla regione. Uscendo dalla regione e ritornandoci potrebbe risolvere il problema. Il motivo fornito: [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- La preimpostazione esiste già!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Impossibile cancellare l&apos;ultima chiave in questo ciclo giornata. Il ciclo giornata non può essere vuoto. Invece di cancellare la chiave restante, modificala e quindi creane una nuova.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Fornisci il nome per la nuova preregolazione del livello dell&apos;acqua.
- <form name="form">
- <input name="message">
- Nuova preimpostazione
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ Non puoi aggiungere altri frame chiave a questo ciclo giornata. Il numero massimo di frame chiave per i cicli giornata nell&apos;ambito [SCOPE] è [MAX].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- La preimpostazione esiste già!
+ <notification name="EnvUpdateRate">
+ Puoi aggiornare le impostazioni dell&apos;ambiente della regione ogni [WAIT] secondi. Attendi e riprova.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- Non puoi modificare o cancellare una preimpostazione.
+ <notification name="PPSaveEffectAlert">
+ Effetto di post elaborazione già presente. Vuoi sovrascrivere?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="ChatterBoxSessionStartError">
Impossibile iniziare una nuova sessione di chat con [RECIPIENT].
@@ -2334,6 +2325,9 @@ Qui non puoi volare.
<notification name="NoBuild">
In questa zona è proibita la costruzione. Qui non puoi costruire né rezzare oggetti.
</notification>
+ <notification name="SeeAvatars">
+ In questo lotto non si possono vedere avatar e chat di testo presenti in altri lotti. Non puoi vedere altri residenti fuori dal lotto e loro non possono vederti. Viene bloccata anche la normale chat di testo sul canale 0.
+ </notification>
<notification name="ScriptsStopped">
Un amministratore ha temporaneamente disabilitato gli script in questa regione.
</notification>
@@ -2758,7 +2752,9 @@ Il pulsante verrà visualizzato quando lo spazio sarà sufficiente.
Scegli i residenti con i quali condividere.
</notification>
<notification name="MeshUploadError">
- [LABEL] non è stato caricato: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ [LABEL] non è stato caricato: [MESSAGE] [IDENTIFIER]
+
+Per informazioni dettagliate, vedi il file del registro.
</notification>
<notification name="ShareItemsConfirmation">
Sei sicuro di volere condividere gli oggetti
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pick.xml b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
index 8e464ca037..145b8cf4e3 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Salva luogo preferito" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annulla" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/panel_outfits_list.xml b/indra/newview/skins/default/xui/it/panel_outfits_list.xml
index e5194e95d7..d0c275e29f 100644
--- a/indra/newview/skins/default/xui/it/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/it/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Non hai ancora vestiario da indossare. Prova [secondlife:///app/search/all Cerca]."/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/>
+ <menu_button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/>
<button name="trash_btn" tool_tip="Elimina il vestiario selezionato"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_place_profile.xml b/indra/newview/skins/default/xui/it/panel_place_profile.xml
index c4ffe6af85..890dfc2458 100644
--- a/indra/newview/skins/default/xui/it/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_place_profile.xml
@@ -64,6 +64,8 @@
<text name="scripts_value" value="Attivo"/>
<text name="damage_label" value="Danni:"/>
<text name="damage_value" value="Disattivato"/>
+ <text name="see_avatars_label" value="Vedi avatar:"/>
+ <text name="see_avatars_value" value="Disattiva"/>
<button label="Informazioni sui terreni" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
index b628a29206..224780f234 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
@@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <text name="Cache:">
+ Cache:
+ </text>
+ <spinner label="Dimensione cache (64 - 9984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Pulizia della cache" label_selected="Pulizia della cache" name="clear_cache"/>
+ <text name="Cache location">
+ Ubicazione della cache:
+ </text>
+ <button label="Sfoglia" label_selected="Sfoglia" name="set_cache"/>
+ <button label="Posizione predefinita" label_selected="Posizione predefinita" name="default_cache_location"/>
<text name="UI Size:">
Dimensioni UI:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
index bbfae5e9e8..d00512aaf7 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
@@ -19,6 +19,7 @@
<check_box label="Abilitato" name="enable_voice_check"/>
<check_box label="Consenti riproduzione multimediale automatica" name="media_auto_play_btn" tool_tip="Seleziona qui per consentire la riproduzione multimediale automatica" value="true"/>
<check_box label="Riproduci media in uso da altri avatar" name="media_show_on_others_btn" tool_tip="Deseleziona qui per nascondere i media in uso dagli altri avatar nei dintorni" value="true"/>
+ <check_box label="Riproduci suoni dai gesti" name="gesture_audio_play_btn" tool_tip="Seleziona per ascoltare i suoni dai gesti" value="true"/>
<text name="voice_chat_settings">
Impostazioni Chat vocale
</text>
@@ -35,28 +36,5 @@
<button label="Imposta tasto" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/>
<button label="Dispositivi di Input/Output" name="device_settings_btn" width="165"/>
- <panel label="Impostazioni del dispositivo" name="device_settings_panel">
- <panel.string name="default_text">
- Predefinito
- </panel.string>
- <panel.string name="default system device">
- Dispositivo di sistema predefinito
- </panel.string>
- <panel.string name="no device">
- Nessun dispositivo
- </panel.string>
- <text name="Input">
- Input
- </text>
- <text name="My volume label">
- Il mio volume:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia il volume utilizzando questa barra"/>
- <text name="wait_text">
- Attendi
- </text>
- <text name="Output">
- Output
- </text>
- </panel>
+ <panel label="Impostazioni del dispositivo" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_region_environment.xml b/indra/newview/skins/default/xui/it/panel_region_environment.xml
new file mode 100644
index 0000000000..81bc8253f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ambiente" name="panel_env_info">
+ <text name="water_settings_title">
+ Seleziona le impostazioni del ciclo dell&apos;acqua e del cielo/giornata che vuoi che vedano tutti coloro che visitano la tua regione. Maggiori informazioni
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usa valori predefiniti di Second Life" name="use_sl_default_settings"/>
+ <radio_item label="Usa le impostazioni seguenti" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Impostazione Acqua
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciclo cielo / giornata
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Cielo fisso" name="my_sky_settings"/>
+ <radio_item label="Ciclo giornata" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Applica" name="apply_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_region_terrain.xml b/indra/newview/skins/default/xui/it/panel_region_terrain.xml
index 92044bae11..c61ac3ecce 100644
--- a/indra/newview/skins/default/xui/it/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_terrain.xml
@@ -7,21 +7,56 @@
sconosciuto
</text>
<spinner label="Altezza dell&apos;acqua" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Limite di altezza del &#10;terreno" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Limite di abbassamento &#10;del terreno" name="terrain_lower_spin" bottom_delta="-34"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Usa il sole della regione" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Sole fisso" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
- <button label="Applica" name="apply_btn"/>
+ <spinner label="Limite di altezza del
+terreno" name="terrain_raise_spin"/>
+ <spinner bottom_delta="-34" label="Limite di abbassamento
+del terreno" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Texture terreno (richiede file 512x512, 24 bit .tga)
+ </text>
+ <text name="height_text_lbl">
+ 1 (basso)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Alto)
+ </text>
+ <text name="height_text_lbl5">
+ Intervalli altitudine texture
+ </text>
+ <text name="height_text_lbl10">
+ Questi valori indicano la gamma di miscele per le texture di cui sopra.
+ </text>
+ <text name="height_text_lbl11">
+ Misurato in metri, il valore BASSO è la MASSIMA altezza della texture n. 1, e il valore ALTO è l&apos;altezza MINIMA della texture n. 4.
+ </text>
+ <text name="height_text_lbl6">
+ Nordovest
+ </text>
+ <text name="height_text_lbl7">
+ Nordest
+ </text>
+ <spinner label="Basso" name="height_start_spin_1"/>
+ <spinner label="Basso" name="height_start_spin_3"/>
+ <spinner label="Alto" name="height_range_spin_1"/>
+ <spinner label="Alto" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Sudovest
+ </text>
+ <text name="height_text_lbl9">
+ Sudest
+ </text>
+ <spinner label="Basso" name="height_start_spin_0"/>
+ <spinner label="Basso" name="height_start_spin_2"/>
+ <spinner label="Alto" name="height_range_spin_0"/>
+ <spinner label="Alto" name="height_range_spin_2"/>
<button label="Scarica terreno RAW..." name="download_raw_btn" tool_tip="Disponibile solo per i proprietari del terreno, non per i manager"/>
- <button label="?" name="download_raw_help"/>
<button label="Carica terreno RAW..." name="upload_raw_btn" tool_tip="Disponibile solo per i proprietari del terreno, non per i manager"/>
- <button label="?" name="upload_raw_help"/>
- <button width="170" label="Trasforma il terreno" name="bake_terrain_btn" tool_tip="Imposta il terreno corrente come punto medio per i limiti di innalzamento/abbassamento"/>
- <button left="190" label="?" name="bake_terrain_help"/>
+ <button label="Trasforma il terreno" name="bake_terrain_btn" tool_tip="Imposta il terreno corrente come punto medio per i limiti di innalzamento/abbassamento" width="170"/>
+ <button label="Applica" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
index 1c1744d94b..72ca2f6d68 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
@@ -1,6 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Cose" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Elementi ricevuti ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Elementi ricevuti
+ </string>
+ <button label="Elementi ricevuti" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] nuovi
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ Gli acquisti dal mercato verranno consegnati qui.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="outbox_layout_panel">
+ <panel label="" name="marketplace_outbox">
+ <button label="Casella uscita commercianti" name="outbox_btn"/>
+ <button label="" name="outbox_sync_btn" tool_tip="Sposta al mercato"/>
+ <panel tool_tip="Drag and drop items here to prepare them for sale on your storefront">
+ <text name="outbox_inventory_placeholder">
+ Imposta il tuo account commercianti per usare questa funzione.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index cbe8ef24c4..4bcb4dd88f 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -1177,6 +1177,12 @@ Prova ad accedere nuovamente tra un minuto.
<string name="InventoryNoTexture">
Non hai una copia di questa texture nel tuo inventario
</string>
+ <string name="InventoryInboxNoItems">
+ Gli elementi acquistati attraverso il mercato verranno consegnati qui
+ </string>
+ <string name="InventoryOutboxNoItems">
+ Trascina gli elementi qui per poi elencarli nel tuo mercato.
+ </string>
<string name="no_transfer" value="(nessun trasferimento)"/>
<string name="no_modify" value="(nessuna modifica)"/>
<string name="no_copy" value="(nessuna copia)"/>
@@ -1217,9 +1223,6 @@ Prova ad accedere nuovamente tra un minuto.
<string name="InvFolder My Inventory">
Il mio inventario
</string>
- <string name="InvFolder My Favorites">
- I miei preferiti
- </string>
<string name="InvFolder Library">
Libreria
</string>
@@ -1278,10 +1281,10 @@ Prova ad accedere nuovamente tra un minuto.
Gesture
</string>
<string name="InvFolder Favorite">
- Preferiti
+ I miei preferiti
</string>
<string name="InvFolder favorite">
- Preferiti
+ I miei preferiti
</string>
<string name="InvFolder Current Outfit">
Abbigliamento attuale
@@ -1304,6 +1307,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="InvFolder All">
Tutto
</string>
+ <string name="no_attachments">
+ Nessun allegato indossato
+ </string>
<string name="Buy">
Acquista
</string>
@@ -1639,6 +1645,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="IMTeen">
teen
</string>
+ <string name="Anyone">
+ chiunque
+ </string>
<string name="RegionInfoError">
errore
</string>
@@ -1855,6 +1864,12 @@ Prova ad accedere nuovamente tra un minuto.
<string name="Public">
Pubblica
</string>
+ <string name="LocalSettings">
+ Impostazioni locali
+ </string>
+ <string name="RegionSettings">
+ Impostazioni regione
+ </string>
<string name="ClassifiedClicksTxt">
Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo
</string>
@@ -3643,6 +3658,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Regione generale
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatar visibili e chat consentita fuori di questo lotto
+ </string>
<string name="UpdaterWindowTitle">
Aggiornamento [APP_NAME]
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index 2f578862d3..e870a8ace9 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -133,12 +133,12 @@
</text>
<button label="土地の購入" label_selected="土地を購入..." left="130" name="Buy Land..." width="100"/>
+ <button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="土地が所有されており、コンテンツが設定されている必要があります。オークションの対象になっていないことも必要条件です。"/>
<button label="スクリプト情報" name="Scripts..." width="100"/>
<button label="グループに購入" label_selected="グループ用に購入..." name="Buy For Group..."/>
<button label="入場許可を購入" label_selected="入場許可を購入..." left="130" name="Buy Pass..." tool_tip="この土地への一時的なアクセスを許可します。" width="100"/>
<button label="土地の放棄" label_selected="土地を放棄..." name="Abandon Land..."/>
<button label="土地を取り戻す" label_selected="土地の返還を要求..." name="Reclaim Land..."/>
- <button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="土地が所有されており、コンテンツが設定されている必要があります。オークションの対象になっていないことも必要条件です。"/>
</panel>
<panel label="約款" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -310,6 +310,9 @@
<panel.string name="push_restrict_region_text">
プッシュ禁止 (地域設定優先)
</panel.string>
+ <panel.string name="see_avs_text">
+ この区画にいる住人と会ってチャットする
+ </panel.string>
<text name="allow_label">
他の住人への許可:
</text>
@@ -372,6 +375,10 @@
スナップショット:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="写真をクリックして選択"/>
+ <text name="allow_label5">
+ 他の区画にいる住人への許可:
+ </text>
+ <check_box label="アバターを表示" name="SeeAvatarsCheck" tool_tip="他の区画の住人が、この区画にいる住人に会ってチャットすることを許可し、あなたもそれら住人に会ってチャットできるようにします。"/>
<text name="landing_point">
着地点: [LANDING]
</text>
@@ -428,6 +435,11 @@
サウンド:
</text>
<check_box label="ジェスチャーとオブジェクトの音をこの区画だけに限定する" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ アバターのサウンド:
+ </text>
+ <check_box label="全員" name="all av sound check"/>
+ <check_box label="グループ" name="group av sound check"/>
<text name="Voice settings:">
ボイス:
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/ja/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..eb39d1b336
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="環境の事前設定を削除">
+ <string name="title_water">
+ 水の事前設定を削除
+ </string>
+ <string name="title_sky">
+ 空の事前設定を削除
+ </string>
+ <string name="title_day_cycle">
+ デイサイクルを削除
+ </string>
+ <string name="label_water">
+ 事前設定:
+ </string>
+ <string name="label_sky">
+ 事前設定:
+ </string>
+ <string name="label_day_cycle">
+ デイサイクル:
+ </string>
+ <string name="msg_confirm_deletion">
+ 選択された事前設定を削除しますか?
+ </string>
+ <string name="msg_sky_is_referenced">
+ デイサイクルの参照先として使われている事前設定は削除できません。
+ </string>
+ <string name="combo_label">
+ - 事前設定を選択 -
+ </string>
+ <text name="label">
+ 事前設定:
+ </text>
+ <button label="削除" name="delete"/>
+ <button label="取り消し" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/ja/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..fd601672b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="デイサイクルを編集">
+ <string name="title_new">
+ 新たなデイサイクルを作成
+ </string>
+ <string name="title_edit">
+ デイサイクルを編集
+ </string>
+ <string name="hint_new">
+ 新しいデイサイクルに名前をつけ、希望の設定に調節して、「保存」をクリックします。
+ </string>
+ <string name="hint_edit">
+ 自分で作成したデイサイクルを編集するには、希望の設定に調節して、「保存」をクリックします。
+ </string>
+ <string name="combo_label">
+ - 事前設定を選択 -
+ </string>
+ <text name="label">
+ 事前設定の名前:
+ </text>
+ <text name="note">
+ 注意:自分で作成した事前設定の名前を変更すると、新しい事前設定が別に作成されるだけで、元の事前設定は変更されません。
+ </text>
+ <text name="hint_item1">
+ - 特定の空の設定や時間を編集するにはタブを1つクリックします。
+ </text>
+ <text name="hint_item2">
+ - 移行時間を設定するにはタブをクリックしてドラッグします。
+ </text>
+ <text name="hint_item3">
+ - デイサイクルをプレビューするにはスクラバーを使います。
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="キーの追加" label_selected="キーの追加" name="WLAddKey"/>
+ <button label="キーの削除" label_selected="キーの削除" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 12am
+ </text>
+ <text name="WL3am">
+ 3am
+ </text>
+ <text name="WL6am">
+ 6am
+ </text>
+ <text name="WL9amHash">
+ 9am
+ </text>
+ <text name="WL12pmHash">
+ 12pm
+ </text>
+ <text name="WL3pm">
+ 3pm
+ </text>
+ <text name="WL6pm">
+ 6pm
+ </text>
+ <text name="WL9pm">
+ 9pm
+ </text>
+ <text name="WL12am2">
+ 12am
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ 空の設定:
+ </text>
+ <combo_box label="事前設定" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ 時間:
+ </text>
+ <time name="time" value="6:00 AM"/>
+ <check_box label="これを新しいデイサイクルにする" name="make_default_cb"/>
+ <button label="保存" name="save"/>
+ <button label="取り消し" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/ja/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..68d0c70baa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="空の事前設定を編集">
+ <string name="title_new">
+ 新しい空の事前設定を作成
+ </string>
+ <string name="title_edit">
+ 空の事前設定を編集
+ </string>
+ <string name="hint_new">
+ 新しい事前設定に名前をつけ、希望の設定に調節して、「保存」をクリックします。
+ </string>
+ <string name="hint_edit">
+ 空の事前設定を編集するには、希望の設定に調節して、「保存」をクリックします。
+ </string>
+ <string name="combo_label">
+ - 事前設定を選択 -
+ </string>
+ <text name="hint">
+ 事前設定を編集するには、希望の設定に調節して、「保存」をクリックします。
+ </text>
+ <text name="label">
+ 事前設定の名前:
+ </text>
+ <text name="note">
+ 注意:自分で作成した事前設定の名前を変更すると、新しい事前設定が別に作成されるだけで、元の事前設定は変更されません。
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="大気" name="Atmosphere">
+ <text name="BHText">
+ 空の配色
+ </text>
+ <text name="BDensText">
+ 空と遠景の露光
+ </text>
+ <text name="BDensText2">
+ 空の配色と濃度
+ </text>
+ <text name="HDText">
+ 大気の不透明度
+ </text>
+ <text name="DensMultText">
+ 大気の不透明度の増幅
+ </text>
+ <text name="WLDistanceMultText">
+ 視界の増幅
+ </text>
+ <text name="MaxAltText">
+ 最大高度
+ </text>
+ </panel>
+ <panel label="ライティング" name="Lighting">
+ <text name="SLCText">
+ 太陽/月の色
+ </text>
+ <text name="WLAmbientText">
+ 風
+ </text>
+ <text name="SunGlowText">
+ 太陽の輝き
+ </text>
+ <slider label="焦点" name="WLGlowB"/>
+ <slider label="サイズ" name="WLGlowR"/>
+ <text name="WLStarText">
+ 星の輝き
+ </text>
+ <text name="SceneGammaText">
+ 風景ガンマ
+ </text>
+ <text name="TODText">
+ 太陽/月の位置
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 12am
+ </text>
+ <text name="WL6am">
+ 6am
+ </text>
+ <text name="WL12pmHash">
+ 12pm
+ </text>
+ <text name="WL6pm">
+ 6pm
+ </text>
+ <text name="WL12am2">
+ 12am
+ </text>
+ <time name="WLDayTime" value="6:00 AM"/>
+ <text name="WLEastAngleText">
+ 東の角度
+ </text>
+ </panel>
+ <panel label="雲" name="Clouds">
+ <text name="WLCloudColorText">
+ 雲の色
+ </text>
+ <text name="WLCloudColorText2">
+ 雲のXY/密度
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ 雲の量
+ </text>
+ <text name="WLCloudScaleText">
+ 雲のスケール
+ </text>
+ <text name="WLCloudDetailText">
+ 雲の詳細(XY/密度)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ 雲の移動速度(X方向)
+ </text>
+ <check_box label="ロック" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ 雲の移動速度(Y 方向)
+ </text>
+ <check_box label="ロック" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="この事前設定を新しい空の設定にする" name="make_default_cb"/>
+ <button label="保存" name="save"/>
+ <button label="取り消し" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/ja/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..eddfbd4298
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="水の事前設定を編集">
+ <string name="title_new">
+ 新しい水の事前設定を作成
+ </string>
+ <string name="title_edit">
+ 水の事前設定を編集
+ </string>
+ <string name="hint_new">
+ 新しい事前設定に名前をつけ、希望の設定に調節して、「保存」をクリックします。
+ </string>
+ <string name="hint_edit">
+ 水の事前設定を編集するには、希望の設定に調節して、「保存」をクリックします。
+ </string>
+ <string name="combo_label">
+ - 事前設定を選択 -
+ </string>
+ <text name="hint">
+ 事前設定を編集するには、希望の設定に調節して、「保存」をクリックします。
+ </text>
+ <text name="label">
+ 事前設定の名前:
+ </text>
+ <text name="note">
+ 注意:自分で作成した事前設定の名前を変更すると、新しい事前設定が別に作成されるだけで、元の事前設定は変更されません。
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ 水中のフォグ効果の色
+ </text>
+ <text name="water_fog_density_label">
+ 水中の透明度指数
+ </text>
+ <text name="underwater_fog_modifier_label">
+ 水中のフォグ効果加減
+ </text>
+ <text name="BHText">
+ 大波の方向
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ さざ波の反射スケール
+ </text>
+ <text name="HDText">
+ フレネル・スケール
+ </text>
+ <text name="FresnelOffsetText">
+ フレネル・オフセット
+ </text>
+ <text name="BHText2">
+ 小波の方向
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ 水面の屈折スケール
+ </text>
+ <text name="WaterScaleBelowText">
+ 水中の屈折スケール
+ </text>
+ <text name="MaxAltText">
+ 不透明度の増幅
+ </text>
+ <text name="BHText3">
+ ノーマル・マップ
+ </text>
+ </panel>
+ <check_box label="この事前設定を新しい水の設定にする" name="make_default_cb"/>
+ <button label="保存" name="save"/>
+ <button label="取り消し" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_environment_settings.xml b/indra/newview/skins/default/xui/ja/floater_environment_settings.xml
new file mode 100644
index 0000000000..0e3803119f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="自然環境の設定">
+ <text name="note">
+ ビューワの自然環境の設定は以下のオプションを使ってカスタマイズできます。
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="リージョンの設定を使用" name="use_region_settings"/>
+ <radio_item label="自然環境をカスタマイズ" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ 注意:カスタム設定は他のユーザーには見えません。
+ </text>
+ <text name="water_settings_title">
+ 水の設定
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="- 事前設定を選択 -" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ 空 / デイサイクル
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="空の固定" name="my_sky_settings"/>
+ <radio_item label="デイサイクル" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="- 事前設定を選択 -" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="- 事前設定を選択 -" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="取り消し" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
index 5eb141a28c..d0580b752c 100644
--- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
@@ -3,6 +3,9 @@
<string name="status_idle">
待機状態
</string>
+ <string name="status_parse_error">
+ Dae に問題が見つかりました - 詳細についてはログをご参照ください。
+ </string>
<string name="status_reading_file">
ローディング...
</string>
@@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
エラー:頂点の数が65534を超過したので中止されました。
</string>
+ <string name="bad_element">
+ エラー:要素が無効です
+ </string>
<string name="high">
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_wizard.xml b/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
index a785172f20..249d9f22b9 100644
--- a/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
@@ -193,6 +193,9 @@
<string name="status_idle">
待機状態
</string>
+ <string name="status_parse_error">
+ Dae に問題が見つかりました - 詳細についてはログをご参照ください。
+ </string>
<string name="status_reading_file">
ローディング...
</string>
@@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
エラー:頂点の数が65534を超過したので中止されました。
</string>
+ <string name="bad_element">
+ エラー:要素が無効です
+ </string>
<string name="high">
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index f7d77d351e..0cb5c2d8bb 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -75,7 +75,7 @@
</text>
<check_box initial_value="true" label="テクスチャを引き延ばす" name="checkbox stretch textures"/>
<check_box initial_value="true" label="グリッドにスナップ" name="checkbox snap to grid"/>
- <combo_box name="combobox grid mode" tool_tip="オブジェクトの配置に使うグリッドルーラを選択します" >
+ <combo_box name="combobox grid mode" tool_tip="オブジェクトの配置に使うグリッドルーラを選択します">
<combo_box.item label="インワールドグリッド" name="World"/>
<combo_box.item label="ローカルグリッド" name="Local"/>
<combo_box.item label="リファレンスグリッド" name="Reference"/>
@@ -137,7 +137,7 @@
<text name="object_cost" tool_tip="[prims] / [physics complexity] として現在選択されているオブジェクトのコスト">
料金: [COST] / [PHYSICS]
</text>
- <tab_container name="Object Info Tabs" >
+ <tab_container name="Object Info Tabs">
<panel label="一般" name="General">
<panel.string name="text deed continued">
譲渡
@@ -379,22 +379,22 @@
オブジェクトの特徴を編集:
</text>
<check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心にオブジェクトの屈曲を有効にします(クライアント側のみ)"/>
- <spinner label="柔軟性" name="FlexNumSections" />
- <spinner label="重力" name="FlexGravity" />
- <spinner label="ドラッグ" name="FlexFriction" />
- <spinner label="風" name="FlexWind" />
- <spinner label="緊張" name="FlexTension" />
- <spinner label="X 軸方向の力" name="FlexForceX" />
- <spinner label="Y 軸方向の力" name="FlexForceY" />
- <spinner label="Z 軸方向の力" name="FlexForceZ" />
+ <spinner label="柔軟性" name="FlexNumSections"/>
+ <spinner label="重力" name="FlexGravity"/>
+ <spinner label="ドラッグ" name="FlexFriction"/>
+ <spinner label="風" name="FlexWind"/>
+ <spinner label="緊張" name="FlexTension"/>
+ <spinner label="X 軸方向の力" name="FlexForceX"/>
+ <spinner label="Y 軸方向の力" name="FlexForceY"/>
+ <spinner label="Z 軸方向の力" name="FlexForceZ"/>
<check_box label="光" name="Light Checkbox Ctrl" tool_tip="オブジェクトが発光します"/>
<color_swatch label="" name="colorswatch" tool_tip="クリックしてカラーピッカーを開きます"/>
<texture_picker label="" name="light texture control" tool_tip="クリックで投影画を選択します(遅延レンダリング有効時のみ)"/>
- <spinner label="輝度" name="Light Intensity" />
+ <spinner label="輝度" name="Light Intensity"/>
<spinner label="FOV" name="Light FOV"/>
- <spinner label="半径" name="Light Radius" />
+ <spinner label="半径" name="Light Radius"/>
<spinner label="焦点" name="Light Focus"/>
- <spinner label="弱まる" name="Light Falloff" />
+ <spinner label="弱まる" name="Light Falloff"/>
<spinner label="環境" name="Light Ambiance"/>
<text name="label physicsshapetype">
実像の種類:
@@ -411,7 +411,7 @@
</combo_box>
<spinner label="重力" name="Physics Gravity"/>
<spinner label="摩擦" name="Physics Friction"/>
- <spinner label="密度" name="Physics Density"/>
+ <spinner label="密度(100 kg/m^3)" name="Physics Density"/>
<spinner label="復元" name="Physics Restitution"/>
</panel>
<panel label="材質" name="Texture">
@@ -496,18 +496,18 @@
</panel>
</panel>
<panel label="中身" name="Contents">
- <button label="新しいスクリプト" label_selected="新規スクリプト" name="button new script" />
- <button label="権限" name="button permissions" />
+ <button label="新しいスクリプト" label_selected="新規スクリプト" name="button new script"/>
+ <button label="権限" name="button permissions"/>
</panel>
</tab_container>
<panel name="land info panel">
<text name="label_parcel_info">
区画情報
</text>
- <text name="label_area_price" >
+ <text name="label_area_price">
価格: [AREA] 平方メートル L$ [PRICE]
</text>
- <text name="label_area" >
+ <text name="label_area">
面積: [AREA] 平方メートル
</text>
<button label="土地情報" label_selected="土地情報" name="button about land"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index 265f3ebcd0..dca872e9b8 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -18,7 +18,7 @@
<menu_item_call label="利用規約を表示" name="TOS"/>
<menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
<menu_item_call label="メディアブラウザのテスト" name="Web Browser Test"/>
- <menu_item_call label="Web コンテンツフローターのテスト" name="Web Content Floater Test"/>
+ <menu_item_call label="Web コンテンツフローターのデバッグテスト" name="Web Content Floater Debug Test"/>
<menu_item_check label="グリッドピッカーを表示する" name="Show Grid Picker"/>
<menu_item_call label="通知コンソールを表示する" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
index a31480158a..44c5438509 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="最近の発言者で並べ替え" name="sort_by_recent_speakers"/>
<menu_item_check label="名前で並べ替え" name="sort_name"/>
<menu_item_check label="距離で並べ替え" name="sort_distance"/>
<menu_item_check label="人のアイコン表示" name="view_icons"/>
+ <menu_item_check label="地図を表示" name="view_map"/>
<menu_item_call label="ブロックされた住人とオブジェクトを表示" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index ec9db02522..09b315b026 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -31,6 +31,7 @@
<menu_item_call label="所属グループ" name="My Groups"/>
<menu_item_check label="近くのチャット" name="Nearby Chat"/>
<menu_item_call label="近くにいる人" name="Active Speakers"/>
+ <menu_item_check label="近くのボイス" name="Nearby Voice"/>
</menu>
<menu label="世界" name="World">
<menu_item_check label="ミニマップ" name="Mini-Map"/>
@@ -63,8 +64,24 @@
<menu_item_call label="正午" name="Noon"/>
<menu_item_call label="日没" name="Sunset"/>
<menu_item_call label="深夜" name="Midnight"/>
- <menu_item_call label="エステートタイム" name="Revert to Region Default"/>
- <menu_item_call label="自然環境エディター" name="Environment Editor"/>
+ </menu>
+ <menu label="自然環境エディター" name="Enviroment Editor">
+ <menu_item_call label="環境の設定..." name="Enviroment Settings"/>
+ <menu label="水の事前設定" name="Water Presets">
+ <menu_item_call label="新しい事前設定..." name="new_water_preset"/>
+ <menu_item_call label="事前設定を編集..." name="edit_water_preset"/>
+ <menu_item_call label="事前設定を削除..." name="delete_water_preset"/>
+ </menu>
+ <menu label="空の事前設定" name="Sky Presets">
+ <menu_item_call label="新しい事前設定..." name="new_sky_preset"/>
+ <menu_item_call label="事前設定を編集..." name="edit_sky_preset"/>
+ <menu_item_call label="事前設定を削除..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="デイの事前設定" name="Day Presets">
+ <menu_item_call label="新しい事前設定..." name="new_day_preset"/>
+ <menu_item_call label="事前設定を編集..." name="edit_day_preset"/>
+ <menu_item_call label="事前設定を削除..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="制作" name="BuildTools">
diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
index 7a97538117..5334042dc9 100644
--- a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="アウトフットの編集" name="edit"/>
<menu_item_call label="取り外す" name="takeoff"/>
-</menu>
+ <menu_item_call label="アウトフィットのリストをクリップボードにコピー" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index d63ca84035..a471e4941d 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -1590,6 +1590,11 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してくだ
<button name="Cancel" text="取り消し"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ [OFFERS] 回にわたってテレポートを送ろうとしましたが、
+それは限度数 [LIMIT] を超えています。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
現在地に住人をゴッドサモンしますか?
<form name="form">
@@ -2018,6 +2023,10 @@ Linden Lab
トラベル、Web、検索の履歴をすべて削除しますか?
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ ビューワのキャッシュをクリアしますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
本当にクッキーをクリアしますか?
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
@@ -2043,48 +2052,30 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
保存された事前設定を上書きしますか?
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="WLDeletePresetAlert">
- 「 [SKY] 」を削除しますか?
- <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
- </notification>
<notification name="WLNoEditDefault">
デフォルトの設定を編集したり削除したりすることはできません。
</notification>
<notification name="WLMissingSky">
このデイサイクルのファイルは次の存在しない「空」ファイルを参照しています: [SKY]。
</notification>
- <notification name="PPSaveEffectAlert">
- ポストプロセス効果が存在します。 上書きしますか?
- <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
- </notification>
- <notification name="NewSkyPreset">
- 新しい空の名前を指定してください。
- <form name="form">
- <input name="message">
- 新しい事前設定
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="キャンセル"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ 申し訳ございませんが、設定をリージョンに適用できませんでした。一度リージョンを出てから戻ると、問題が解決されるかもしれません。問題の発生した理由:[FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- 事前設定がすでに存在します!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ デイサイクルを空にはできないので、このデイサイクルの最後のキーを削除することはできません。最後のキーを削除して新しいキーを作成するのではなく、最後のキーを変更してください。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- 新しい水の事前設定の名前を指定してください。
- <form name="form">
- <input name="message">
- 新しい事前設定
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="キャンセル"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ このデイサイクルにはこれ以上キーフレームを追加できません。[SCOPE] の範囲のデイサイクルに追加できるキーフレーム数は最高 [MAX] です。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- 事前設定がすでに存在します!
+ <notification name="EnvUpdateRate">
+ リージョンの自然環境の設定は [WAIT] 秒ごとにしか更新できません。その間隔を置いてからもう一度お試しください。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- デフォルトの設定を編集したり削除したりすることはできません。
+ <notification name="PPSaveEffectAlert">
+ ポストプロセス効果が存在します。 上書きしますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
<notification name="ChatterBoxSessionStartError">
[RECIPIENT] と新しいチャットを開始することができません。
@@ -2378,6 +2369,9 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
<notification name="NoBuild">
このエリアでは制作が禁止されています。 オブジェクトを制作したり Rez することはできません。
</notification>
+ <notification name="SeeAvatars">
+ この区画にいるアバターやこの区画内で行われる文字チャットは、他の区画から見えません。あなたには、この区画外にいる住人が見えず、外の住人にはあなたの姿が見えません。チャンネル 0 での通常の文字チャットもブロックされます。
+ </notification>
<notification name="ScriptsStopped">
管理者がこのリージョンのスクリプトを一時停止しました。
</notification>
@@ -2802,7 +2796,9 @@ M キーを押して変更します。
共有する住人を選択します。
</notification>
<notification name="MeshUploadError">
- [LABEL] をアップロードできませんでした: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ [LABEL] をアップロードできませんでした:[MESSAGE] [IDENTIFIER]
+
+詳細についてはログをご覧ください。
</notification>
<notification name="ShareItemsConfirmation">
次のアイテムを共有しますか?
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
index 4fb031b677..39ea1df1e3 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="ピックを保存" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="取り消し" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
index e9e36e4842..df9ef40113 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="お探しのものは見つかりましたか?[secondlife:///app/search/all/[SEARCH_TERM] 検索] をお試しください。"/>
+ <no_visible_tabs_text name="no_outfits_msg" value="アウトフィットがまだありません。[secondlife:///app/search/all 検索] をお試しください。"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="オプションを表示します"/>
+ <menu_button name="options_gear_btn" tool_tip="オプションを表示します"/>
<button name="trash_btn" tool_tip="選択したアウトフィットを削除する"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
index 8a40d7aa5a..7235bc0f18 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -68,6 +68,8 @@
<text name="scripts_value" value="オン"/>
<text name="damage_label" value="ダメージ:"/>
<text name="damage_value" value="オフ"/>
+ <text name="see_avatars_label" value="アバターを表示:"/>
+ <text name="see_avatars_value" value="オフ"/>
<button label="土地情報" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index ccc5c3908b..dcaa23fee5 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <text name="Cache:">
+ キャッシュ:
+ </text>
+ <spinner label="キャッシュサイズ(64~9,984MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="キャッシュをクリア" label_selected="キャッシュをクリア" name="clear_cache"/>
+ <text name="Cache location">
+ キャッシュの保存場所:
+ </text>
+ <button label="参照" label_selected="参照" name="set_cache"/>
+ <button label="デフォルトの場所" label_selected="デフォルトの場所" name="default_cache_location"/>
<text name="UI Size:">
UI サイズ:
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
index c11e636875..3a4c360ccc 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -19,6 +19,7 @@
<check_box label="有効" name="enable_voice_check"/>
<check_box label="メディアを自動再生する" name="media_auto_play_btn" tool_tip="ここにチェックを入れてメディアの自動再生を許可します" value="true"/>
<check_box label="他のアバターに取り付けられたメディアを再生する" name="media_show_on_others_btn" tool_tip="このチェックを外すと、近くにいる他のアバターに取り付けられたメディアを非表示にします" value="true"/>
+ <check_box label="ジェスチャーの音を再生" name="gesture_audio_play_btn" tool_tip="ジェスチャーの音を聞くにはこれを選択" value="true"/>
<text name="voice_chat_settings">
ボイスチャットの設定
</text>
@@ -35,28 +36,5 @@
<button label="キー設定" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="マウスの中央ボタンにリセット"/>
<button label="入力・出力機器" name="device_settings_btn"/>
- <panel label="機器の設定" name="device_settings_panel">
- <panel.string name="default_text">
- デフォルト
- </panel.string>
- <panel.string name="default system device">
- デフォルトのシステム機器
- </panel.string>
- <panel.string name="no device">
- 機器が設定されていません
- </panel.string>
- <text name="Input">
- 入力
- </text>
- <text name="My volume label">
- 私の音量:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="スライダーを使って音量を調節します"/>
- <text name="wait_text">
- しばらくお待ちください。
- </text>
- <text name="Output">
- 出力
- </text>
- </panel>
+ <panel label="機器の設定" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_environment.xml b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
new file mode 100644
index 0000000000..f6ef3f0934
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="環境" name="panel_env_info">
+ <text name="water_settings_title">
+ あなたのリージョンを訪れるユーザーに見せたい、水と空/デイサイクルの設定を選択します。詳細
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Second Life のデフォルト設定を使用" name="use_sl_default_settings"/>
+ <radio_item label="次の設定を使用" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ 水の設定
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="- 事前設定を選択 -" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ 空 / デイサイクル
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="空の固定" name="my_sky_settings"/>
+ <radio_item label="デイサイクル" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="- 事前設定を選択 -" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="- 事前設定を選択 -" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="適用" name="apply_btn"/>
+ <button label="取り消し" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
index 8df803b2dc..fb853c1925 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="地形" name="Terrain">
<text name="region_text_lbl">
地域:
@@ -6,25 +6,55 @@
<text name="region_text">
未知
</text>
- <spinner label="水面の高さ" name="water_height_spin" />
- <button label="?" name="water_height_help" />
- <spinner label="地形の上昇限度" name="terrain_raise_spin" />
- <button label="?" name="terrain_raise_help" />
- <spinner label="地形の下降限度" name="terrain_lower_spin" />
- <button label="?" name="terrain_lower_help" />
- <check_box label="不動産太陽使用" name="use_estate_sun_check" />
- <button label="?" name="use_estate_sun_help" />
- <check_box label="太陽固定" name="fixed_sun_check" />
- <button label="?" name="fixed_sun_help" />
- <slider label="段階" name="sun_hour_slider" />
- <button label="適用" name="apply_btn" />
- <button label="RAW 地形ダウンロード..." name="download_raw_btn"
- tool_tip="不動産オーナーのみ利用可能、管理者は利用不可です" />
- <button label="?" name="download_raw_help" />
- <button label="RAW 地形アップロード..." name="upload_raw_btn"
- tool_tip="不動産オーナーのみ利用可能、管理者は利用不可です" />
- <button label="?" name="upload_raw_help" />
- <button label="地形の構築" name="bake_terrain_btn"
- tool_tip="現在の地形を上昇・下降範囲の中間点として設定します" />
- <button label="?" name="bake_terrain_help" />
+ <spinner label="水面の高さ" name="water_height_spin"/>
+ <spinner label="地形の上昇限度" name="terrain_raise_spin"/>
+ <spinner label="地形の下降限度" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ 地形テクスチャ(512x512 の 24 bit .tga ファイル)
+ </text>
+ <text name="height_text_lbl">
+ 1(低)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4(高)
+ </text>
+ <text name="height_text_lbl5">
+ 地形の隆起範囲
+ </text>
+ <text name="height_text_lbl10">
+ 数値は上のテクスチャのブレンド範囲を示します。
+ </text>
+ <text name="height_text_lbl11">
+ 計測単位はメートルで、「低」の値は、1番のテクスチャの高さの「最大値」です。「高」の値は、4番のテクスチャの高さの「最低値」です。
+ </text>
+ <text name="height_text_lbl6">
+ 北西
+ </text>
+ <text name="height_text_lbl7">
+ 北東
+ </text>
+ <spinner label="低" name="height_start_spin_1"/>
+ <spinner label="低" name="height_start_spin_3"/>
+ <spinner label="高" name="height_range_spin_1"/>
+ <spinner label="高" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ 南西
+ </text>
+ <text name="height_text_lbl9">
+ 南東
+ </text>
+ <spinner label="低" name="height_start_spin_0"/>
+ <spinner label="低" name="height_start_spin_2"/>
+ <spinner label="高" name="height_range_spin_0"/>
+ <spinner label="高" name="height_range_spin_2"/>
+ <button label="RAW 地形ダウンロード..." name="download_raw_btn" tool_tip="不動産オーナーのみ利用可能、管理者は利用不可です"/>
+ <button label="RAW 地形アップロード..." name="upload_raw_btn" tool_tip="不動産オーナーのみ利用可能、管理者は利用不可です"/>
+ <button label="地形の構築" name="bake_terrain_btn" tool_tip="現在の地形を上昇・下降範囲の中間点として設定します"/>
+ <button label="適用" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
index e26d8717d1..7edda6e1a3 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
@@ -1,6 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="もの" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ 受け取った商品([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ 受け取った商品
+ </string>
+ <button label="受け取った商品" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] 新登場
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ マーケットプレイスから購入した商品はここに配達されます。
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="outbox_layout_panel">
+ <panel label="" name="marketplace_outbox">
+ <button label="マーチャントのアウトボックス" name="outbox_btn"/>
+ <button label="" name="outbox_sync_btn" tool_tip="自分のマーケットプレイス店頭に移動"/>
+ <panel tool_tip="Drag and drop items here to prepare them for sale on your storefront">
+ <text name="outbox_inventory_placeholder">
+ この機能を使用するには、マーチャントアカウントをセットアップしてください。
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index ff22221aab..cb4fb80a55 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -1192,6 +1192,12 @@ support@secondlife.com にお問い合わせください。
<string name="InventoryNoTexture">
「持ち物」内にこのテクスチャのコピーがありません
</string>
+ <string name="InventoryInboxNoItems">
+ マーケットプレイスで購入した商品はここに配達されます。
+ </string>
+ <string name="InventoryOutboxNoItems">
+ マーケットプレイス店頭に掲載するための準備として、ここに商品をドラッグします。
+ </string>
<string name="no_transfer" value=" (再販・プレゼント不可)"/>
<string name="no_modify" value=" (編集不可)"/>
<string name="no_copy" value=" (コピー不可)"/>
@@ -1238,9 +1244,6 @@ support@secondlife.com にお問い合わせください。
<string name="InvFolder My Inventory">
持ち物
</string>
- <string name="InvFolder My Favorites">
- お気に入り
- </string>
<string name="InvFolder Library">
ライブラリ
</string>
@@ -1325,6 +1328,9 @@ support@secondlife.com にお問い合わせください。
<string name="InvFolder All">
全員
</string>
+ <string name="no_attachments">
+ 着用しているアタッチメントはありません
+ </string>
<string name="Buy">
買う
</string>
@@ -1660,6 +1666,9 @@ support@secondlife.com にお問い合わせください。
<string name="IMTeen">
ティーン
</string>
+ <string name="Anyone">
+ 全員
+ </string>
<string name="RegionInfoError">
エラー
</string>
@@ -1882,6 +1891,12 @@ support@secondlife.com にお問い合わせください。
<string name="Public">
パブリック
</string>
+ <string name="LocalSettings">
+ ローカル設定
+ </string>
+ <string name="RegionSettings">
+ リージョン(地域)の設定
+ </string>
<string name="ClassifiedClicksTxt">
クリック数: [TELEPORT] テレポート、 [MAP] 地図、 [PROFILE] プロフィール
</string>
@@ -3727,6 +3742,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="LocationCtrlGeneralIconTooltip">
General リージョン
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ この区画外にアバターを見えるようにして、チャットも許可
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] アップデート
</string>
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
index a53c0769dc..e9db237e82 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -849,9 +849,6 @@
<string name="InvFolder My Inventory">
Mijn Inventaris
</string>
- <string name="InvFolder My Favorites">
- Mijn Favorieten
- </string>
<string name="InvFolder Library">
Bibliotheek
</string>
@@ -910,10 +907,10 @@
Gebaren
</string>
<string name="InvFolder Favorite">
- Favoriten
+ Mijn Favorieten
</string>
<string name="InvFolder favorite">
- Favoriten
+ Mijn Favorieten
</string>
<string name="InvFolder Current Outfit">
Huidige Uitrusting
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_pick.xml b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
index 8a183c00cf..72c162f63d 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Zapisz obrazek" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cofnij" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 6eceed46d3..e93da48dc0 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -1072,9 +1072,6 @@
<string name="InvFolder My Inventory">
Moja Szafa
</string>
- <string name="InvFolder My Favorites">
- Moje ulubione
- </string>
<string name="InvFolder Library">
Biblioteka
</string>
@@ -1133,10 +1130,10 @@
Gesturki
</string>
<string name="InvFolder Favorite">
- Ulubione
+ Moje ulubione
</string>
<string name="InvFolder favorite">
- Ulubione
+ Moje ulubione
</string>
<string name="InvFolder Current Outfit">
Obecny strój
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index e48cac7d1f..514c7382f8 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -133,12 +133,12 @@ Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar
0
</text>
<button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/>
+ <button label="Venda Linden" name="Linden Sale..." tool_tip="O terreno precisa ser possuído, estar com o conteúdo configurado e não estar pronto para leilão."/>
<button label="Dados do script" name="Scripts..."/>
<button label="Comprar para o grupo" name="Buy For Group..."/>
<button label="Comprar passe..." label_selected="Comprar passe..." left="130" name="Buy Pass..." tool_tip="Um passe concede a você acesso temporário a este terreno." width="125"/>
<button label="Abandonar terreno..." label_selected="Abandonar terreno..." name="Abandon Land..."/>
<button label="Pedir terreno" name="Reclaim Land..."/>
- <button label="Venda Linden" name="Linden Sale..." tool_tip="O terreno precisa ser possuído, estar com o conteúdo configurado e não estar pronto para leilão."/>
</panel>
<panel label="CONTRATO" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -308,6 +308,9 @@ Apenas lotes maiores podem ser listados na busca.
<panel.string name="push_restrict_region_text">
Proibido empurrar (regulamento da região)
</panel.string>
+ <panel.string name="see_avs_text">
+ Veja e bata papo com os residentes deste terreno
+ </panel.string>
<text name="allow_label">
Autorizar outros residentes a:
</text>
@@ -370,6 +373,10 @@ Apenas lotes maiores podem ser listados na busca.
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Clique para escolher uma imagem"/>
+ <text name="allow_label5">
+ Permitir que residentes de outros terrenos:
+ </text>
+ <check_box label="Ver avatares" name="SeeAvatarsCheck" tool_tip="Permite que residentes de outros terrenos vejam e conversem com os residentes deste terreno e vice-versa."/>
<text name="landing_point">
Ponto de Aterrissagem: [LANDING]
</text>
@@ -429,6 +436,11 @@ Mídia:
Som:
</text>
<check_box label="Limitar sons de gestos e objetos a esta parcela" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Áudio de avatares:
+ </text>
+ <check_box label="Todos" name="all av sound check"/>
+ <check_box label="Grupo" name="group av sound check"/>
<text name="Voice settings:">
Voz:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/pt/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..a8b5d8f67d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="EXCLUIR CONF AMBIENTE">
+ <string name="title_water">
+ Excluir pré-configuração da água
+ </string>
+ <string name="title_sky">
+ Excluir pré-configuração de céu
+ </string>
+ <string name="title_day_cycle">
+ Excluir pré-configuração dos dias
+ </string>
+ <string name="label_water">
+ Pré-configuração:
+ </string>
+ <string name="label_sky">
+ Pré-configuração:
+ </string>
+ <string name="label_day_cycle">
+ Ciclo dia:
+ </string>
+ <string name="msg_confirm_deletion">
+ Tem certeza de que quer excluir esta pré-configuração?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Impossível excluir pré-configuração utilizada por um ou mais ciclos de dia .
+ </string>
+ <string name="combo_label">
+ -Selecione uma pré-configuração-
+ </string>
+ <text name="label">
+ Pré-configuração:
+ </text>
+ <button label="Excluir" name="delete"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/pt/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..9e25938986
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Editar ciclo dos dias">
+ <string name="title_new">
+ Criar novo ciclo de dias
+ </string>
+ <string name="title_edit">
+ Editar ciclo dos dias
+ </string>
+ <string name="hint_new">
+ Dê um nome ao seu ciclo dos dias, ajuste os controles para criá-lo e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar sua configuração do dia, ajuste os controles e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecione uma pré-configuração-
+ </string>
+ <text name="label">
+ Nome:
+ </text>
+ <text name="note">
+ Observação: trocar o nome de uma pré-configuração criará uma nova sem modificar a uma pré-configuração atual.
+ </text>
+ <text name="hint_item1">
+ - Clique em uma guia para editar as configurações e horário de um céu.
+ </text>
+ <text name="hint_item2">
+ - Clique e arraste as guias para definir as transições.
+ </text>
+ <text name="hint_item3">
+ - Use a seta para rever o ciclo dos dias.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/>
+ <button label="Excluir chave" label_selected="Excluir chave" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 24:00
+ </text>
+ <text name="WL3am">
+ 03:00
+ </text>
+ <text name="WL6am">
+ 06:00
+ </text>
+ <text name="WL9amHash">
+ 09:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00
+ </text>
+ <text name="WL3pm">
+ 15:00
+ </text>
+ <text name="WL6pm">
+ 18:00
+ </text>
+ <text name="WL9pm">
+ 21:00
+ </text>
+ <text name="WL12am2">
+ 24:00
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Configuração do céu:
+ </text>
+ <combo_box label="Pré-configuração" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Hora:
+ </text>
+ <time name="time" value="06:00"/>
+ <check_box label="Usar como novo ciclo de dias" name="make_default_cb"/>
+ <button label="Salvar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/pt/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..1f1fbcce7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Editar pré-configuração do céu">
+ <string name="title_new">
+ Criar nova pré-configuração de céu
+ </string>
+ <string name="title_edit">
+ Editar pré-configuração do céu
+ </string>
+ <string name="hint_new">
+ Dê um nome à sua pré-configuração, ajuste os controles para criá-la e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar sua pré-configuração do céu, ajuste os controles e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecione uma pré-configuração-
+ </string>
+ <text name="hint">
+ Para editar sua pré-configuração do céu, ajuste os controles e clique em &quot;Salvar&quot;.
+ </text>
+ <text name="label">
+ Nome:
+ </text>
+ <text name="note">
+ Observação: trocar o nome de uma pré-configuração criará uma nova sem modificar a pré-configuração atual.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSFERA" name="Atmosphere">
+ <text name="BHText">
+ Horizonte azul
+ </text>
+ <text name="BDensText">
+ Horizonte com névoa
+ </text>
+ <text name="BDensText2">
+ Densidade azul
+ </text>
+ <text name="HDText">
+ Densidade da névoa
+ </text>
+ <text name="DensMultText">
+ Multiplicador de densidade
+ </text>
+ <text name="WLDistanceMultText">
+ Multiplicador de distância
+ </text>
+ <text name="MaxAltText">
+ Altitude máxima
+ </text>
+ </panel>
+ <panel label="ILUMINAÇÃO" name="Lighting">
+ <text name="SLCText">
+ Cor do sol/lua
+ </text>
+ <text name="WLAmbientText">
+ Ambiente
+ </text>
+ <text name="SunGlowText">
+ Brilho do sol
+ </text>
+ <slider label="Foco" name="WLGlowB"/>
+ <slider label="Tamanho" name="WLGlowR"/>
+ <text name="WLStarText">
+ Brilho das estrelas
+ </text>
+ <text name="SceneGammaText">
+ Raios gama
+ </text>
+ <text name="TODText">
+ Posição do sol/lua
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 24:00
+ </text>
+ <text name="WL6am">
+ 06:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00
+ </text>
+ <text name="WL6pm">
+ 18:00
+ </text>
+ <text name="WL12am2">
+ 24:00
+ </text>
+ <time name="WLDayTime" value="06:00"/>
+ <text name="WLEastAngleText">
+ Ângulo leste
+ </text>
+ </panel>
+ <panel label="NUVENS" name="Clouds">
+ <text name="WLCloudColorText">
+ Cor das nuvens
+ </text>
+ <text name="WLCloudColorText2">
+ XY / densidade das nuvens
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Cobertura das nuvens
+ </text>
+ <text name="WLCloudScaleText">
+ Escala das nuvens
+ </text>
+ <text name="WLCloudDetailText">
+ Detalhe das nuvens (XY / densidade)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Passagem das nuvens X
+ </text>
+ <check_box label="Fixar" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Passagem das nuvens Y
+ </text>
+ <check_box label="Fixar" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Usar esta pré-configuração como meu novo céu" name="make_default_cb"/>
+ <button label="Salvar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/pt/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..7bde22851e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Editar pré-configuração da água">
+ <string name="title_new">
+ Criar nova pré-configuração de água
+ </string>
+ <string name="title_edit">
+ Editar pré-configuração da água
+ </string>
+ <string name="hint_new">
+ Dê um nome à sua pré-configuração, ajuste os controles para criá-la e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar sua pré-configuração de água, ajuste os controles e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecione uma pré-configuração-
+ </string>
+ <text name="hint">
+ Para editar sua pré-configuração, ajuste os controles e clique em &quot;Salvar&quot;.
+ </text>
+ <text name="label">
+ Nome da pré-configuração:
+ </text>
+ <text name="note">
+ Observação: trocar o nome de uma pré-configuração criará uma nova sem modificar a configuração atual.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Cor da névoa da água
+ </text>
+ <text name="water_fog_density_label">
+ Expoente da densidade da névoa
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Modificador de névoa submerso
+ </text>
+ <text name="BHText">
+ Direção de onda grande
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Escala de ondas de reflexo
+ </text>
+ <text name="HDText">
+ Escala de Fresnel
+ </text>
+ <text name="FresnelOffsetText">
+ Recuo de Fresnel
+ </text>
+ <text name="BHText2">
+ Direção de onda pequena
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Escala de refração acima
+ </text>
+ <text name="WaterScaleBelowText">
+ Escala de refração abaixo
+ </text>
+ <text name="MaxAltText">
+ Multiplicador de distorção
+ </text>
+ <text name="BHText3">
+ Mapa normal
+ </text>
+ </panel>
+ <check_box label="Usar esta pré-configuração na minha água" name="make_default_cb"/>
+ <button label="Salvar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_environment_settings.xml b/indra/newview/skins/default/xui/pt/floater_environment_settings.xml
new file mode 100644
index 0000000000..4055ba97ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="AMBIENTE">
+ <text name="note">
+ Use as opções abaixo para personalizar as configurações de ambiente no visualizador.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usar configurações da região" name="use_region_settings"/>
+ <radio_item label="Personalizar meu ambiente" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Observação: suas configurações não se aplicam aos outros usuários.
+ </text>
+ <text name="water_settings_title">
+ Configuração de água
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciclo céu / dia
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Céu fixo" name="my_sky_settings"/>
+ <radio_item label="Ciclo dia" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_model_preview.xml b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
index cdad55bded..fbd88500a8 100644
--- a/indra/newview/skins/default/xui/pt/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
@@ -3,6 +3,9 @@
<string name="status_idle">
Inativo
</string>
+ <string name="status_parse_error">
+ Dae parsing - erro, detalhes no log.
+ </string>
<string name="status_reading_file">
Carregando...
</string>
@@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
Erro: Número de Vertex acima de 65534. Abortado.
</string>
+ <string name="bad_element">
+ Erro: elemento inválido
+ </string>
<string name="high">
Alto
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_model_wizard.xml b/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
index 1064e16e83..e8d5fcdc05 100644
--- a/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
@@ -193,6 +193,9 @@
<string name="status_idle">
Inativo
</string>
+ <string name="status_parse_error">
+ Dae parsing - erro, detalhes no log.
+ </string>
<string name="status_reading_file">
Carregando...
</string>
@@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
Erro: Número de Vertex acima de 65534. Abortado.
</string>
+ <string name="bad_element">
+ Erro: elemento inválido
+ </string>
<string name="high">
Alto
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml
index ed273d9f28..35d9a0ffab 100644
--- a/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -405,7 +405,7 @@
</combo_box>
<spinner label="Gravidade" name="Physics Gravity"/>
<spinner label="Fricção" name="Physics Friction"/>
- <spinner label="Densidade" name="Physics Density"/>
+ <spinner label="Densidade em 100 kg/m^3" name="Physics Density"/>
<spinner label="Restituição" name="Physics Restitution"/>
</panel>
<panel label="Textura" name="Texture">
diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml
index 3dff3d7c8a..1d3fa48fb3 100644
--- a/indra/newview/skins/default/xui/pt/menu_login.xml
+++ b/indra/newview/skins/default/xui/pt/menu_login.xml
@@ -17,7 +17,7 @@
<menu_item_call label="Mostrar TOS" name="TOS"/>
<menu_item_call label="Mostrar mensagem crítica" name="Critical"/>
<menu_item_call label="Teste de mídia do navegador" name="Web Browser Test"/>
- <menu_item_call label="Teste de conteúdo web" name="Web Content Floater Test"/>
+ <menu_item_call label="Test de Bugs de Conteúdo Web" name="Web Content Floater Debug Test"/>
<menu_item_check label="Exibir seletor da grade" name="Show Grid Picker"/>
<menu_item_call label="Exibir painel de notificações" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
index 228ce46a31..0d32d58de4 100644
--- a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/>
<menu_item_check label="Ordenar por nome" name="sort_name"/>
<menu_item_check label="Ordenar por distância" name="sort_distance"/>
<menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_check label="Ver Mapa" name="view_map"/>
<menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 4213db7440..c184fb0af3 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -31,6 +31,7 @@
<menu_item_call label="Meus grupos" name="My Groups"/>
<menu_item_check label="Bate-papo local" name="Nearby Chat"/>
<menu_item_call label="Pessoas por perto" name="Active Speakers"/>
+ <menu_item_check label="Voz por perto" name="Nearby Voice"/>
</menu>
<menu label="Mundo" name="World">
<menu_item_check label="Mini Mapa" name="Mini-Map"/>
@@ -63,8 +64,24 @@
<menu_item_call label="Meio-dia" name="Noon"/>
<menu_item_call label="Pôr-do-Sol" name="Sunset"/>
<menu_item_call label="Meia-noite" name="Midnight"/>
- <menu_item_call label="Horário da propriedade" name="Revert to Region Default"/>
- <menu_item_call label="Editor de ambiente" name="Environment Editor"/>
+ </menu>
+ <menu label="Editor de ambientes" name="Enviroment Editor">
+ <menu_item_call label="Configurações de ambiente..." name="Enviroment Settings"/>
+ <menu label="Pré-configurações de água" name="Water Presets">
+ <menu_item_call label="Nova pré-configuração..." name="new_water_preset"/>
+ <menu_item_call label="Editar pré-configuração..." name="edit_water_preset"/>
+ <menu_item_call label="Excluir pré-configuração..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Pré-configurações de céu" name="Sky Presets">
+ <menu_item_call label="Nova pré-configuração..." name="new_sky_preset"/>
+ <menu_item_call label="Editar pré-configuração..." name="edit_sky_preset"/>
+ <menu_item_call label="Excluir pré-configuração..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Pré-configurações de dias" name="Day Presets">
+ <menu_item_call label="Nova pré-configuração..." name="new_day_preset"/>
+ <menu_item_call label="Editar pré-configuração..." name="edit_day_preset"/>
+ <menu_item_call label="Excluir pré-configuração..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Construir" name="BuildTools">
diff --git a/indra/newview/skins/default/xui/pt/menu_wearing_gear.xml b/indra/newview/skins/default/xui/pt/menu_wearing_gear.xml
index 7b6ce4d87e..75dca703cb 100644
--- a/indra/newview/skins/default/xui/pt/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Editar look" name="edit"/>
<menu_item_call label="Tirar" name="takeoff"/>
-</menu>
+ <menu_item_call label="Copiar lista do look para a área de transferência" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 56a33f51e8..ffdaf8a26f 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -1541,6 +1541,10 @@ Por favor volte mais tarde.
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Você fez [OFFERS] ofertas de teletransporte, porém o seu limite é [LIMIT].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
Convocar residente à sua localização com poderes de deus?
<form name="form">
@@ -1962,6 +1966,10 @@ Você gostaria de deixar o modo Ocupado antes de completar esta transação?
Tem certeza de que quer apagar todo o histórico de viagens, web e buscas?
<usetemplate name="okcancelbuttons" notext="Não" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ Tem certeza que deseja apagar o cache do visualizador?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Você tem certeza de que deseja limpar os cookies?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/>
@@ -1987,48 +1995,30 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de
Você deseja substituir a pré-configuração salva?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
- <notification name="WLDeletePresetAlert">
- Você deseja apagar [SKY]?
- <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
- </notification>
<notification name="WLNoEditDefault">
Você não pode editar ou excluir um padrão predefinido.
</notification>
<notification name="WLMissingSky">
Este arquivo de ciclo de dia se refere a um arquivo de céu faltando: [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Existe efeito de Pós-Processamento. Você deseja substituí-lo?
- <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
- </notification>
- <notification name="NewSkyPreset">
- Me dê o nome para o novo céu.
- <form name="form">
- <input name="message">
- Novo padrão
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ As configurações não podem ser aplicadas à região. Talvez sair e votlar à região resolva. Motivo: [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- Este padrão já existe!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Impossível excluir a última chave do ciclo pois um ciclo não pode ficar vazio. Modifique a última chave em vez de tentar apagá-la, depois crie uma chave nova.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Dê o nome para o novo padrão de água.
- <form name="form">
- <input name="message">
- Nova Apresentação
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ Não é possível adicionar mais chaves de quadro a este ciclo. O máximo de chaves de quadro para ciclos de dia de [SCOPE] é [MAX].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- Este padrão já existe!
+ <notification name="EnvUpdateRate">
+ Cada configuração de ambiente só pode ser atualizada a cada [WAIT] segundos. Aguarde pelo menos isso e tente novamente.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- Você não pode editar ou apagar um padrão predefinido.
+ <notification name="PPSaveEffectAlert">
+ Existe efeito de Pós-Processamento. Você deseja substituí-lo?
+ <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="ChatterBoxSessionStartError">
Não foi possível iniciar uma nova sessão bate-papo com [RECIPIENT].
@@ -2316,6 +2306,9 @@ Logo, não é possível voar aqui.
<notification name="NoBuild">
Esta área desativou a opção de construir. Não é possível construir ou fazer rez de objetos nesta área.
</notification>
+ <notification name="SeeAvatars">
+ Este terreno oculta os avatares e bate-papo de outro terreno. Não é possível ver residentes fora do terreno e vice-versa. O bate-papo por texto no canal 0 também está bloqueado.
+ </notification>
<notification name="ScriptsStopped">
Um administrador não permitiu scripts temporariamente nesta região.
</notification>
@@ -2740,7 +2733,9 @@ O botão será exibido quando houver espaço suficente.
Selecione os residentes com quem compartilhar.
</notification>
<notification name="MeshUploadError">
- [LABEL] não foi carregado: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ [LABEL] não foi carregado: [MESSAGE] [IDENTIFIER]
+
+Mais detalhes no log.
</notification>
<notification name="ShareItemsConfirmation">
Tem certeza de que quer compartilhar os itens abaixo?
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
index 432affcf09..5eb9987e71 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Salvar destaque" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cancelar" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_list.xml b/indra/newview/skins/default/xui/pt/panel_outfits_list.xml
index 2b2e7c1dbf..2d74e092a4 100644
--- a/indra/newview/skins/default/xui/pt/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Não encontrou o que procura? Tente fazer uma [secondlife:///app/search/people/[SEARCH_TERM] Busca]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Você ainda não tem nenhum look. Tente encontrar um na [secondlife:///app/search/groups Busca]."/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <menu_button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
<button name="trash_btn" tool_tip="Excluir o look selecionado"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_place_profile.xml b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
index 7fc07483c0..8abe579702 100644
--- a/indra/newview/skins/default/xui/pt/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
@@ -64,6 +64,8 @@
<text name="scripts_value" value="Ligado"/>
<text name="damage_label" value="Dano:"/>
<text name="damage_value" value="Desligado"/>
+ <text name="see_avatars_label" value="Ver avatares:"/>
+ <text name="see_avatars_value" value="Desligar"/>
<button label="Sobre o terreno" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
index bbe7e15ba2..c72928fc35 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
@@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <text name="Cache:">
+ Cache:
+ </text>
+ <spinner label="Cache (64 - 9984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Limpar cache" label_selected="Limpar cache" name="clear_cache"/>
+ <text name="Cache location">
+ Localização do cache:
+ </text>
+ <button label="Navegar" label_selected="Navegar" name="set_cache"/>
+ <button label="Localização padrão" label_selected="Localização padrão" name="default_cache_location"/>
<text name="UI Size:">
Interface:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
index 4164147e5c..d910a7b812 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
@@ -19,6 +19,7 @@
<check_box label="Ativado" name="enable_voice_check"/>
<check_box label="Autorizar auto-play de mídias" name="media_auto_play_btn" tool_tip="Marque esta opção para auto-executar mídias, se elas quiserem" value="true"/>
<check_box label="Tocar mídia anexada em outros avatares" name="media_show_on_others_btn" tool_tip="Desmarque esta opção para ocultar mídias anexadas em avatares por perto" value="true"/>
+ <check_box label="Tocar áudio de gestos" name="gesture_audio_play_btn" tool_tip="Selecione para ouvir o áudio de gestos" value="verdadeiro"/>
<text name="voice_chat_settings">
Configuração de bate-papo de voz
</text>
@@ -35,28 +36,5 @@
<button label="Definir chave" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="Redefinir como botão do meio do mouse"/>
<button label="Controles de entrada/saída" name="device_settings_btn" width="180"/>
- <panel label="Configuração dos dispositivo" name="device_settings_panel">
- <panel.string name="default_text">
- Padrão
- </panel.string>
- <panel.string name="default system device">
- Dispositivo padrão do sistema
- </panel.string>
- <panel.string name="no device">
- Nenhum
- </panel.string>
- <text name="Input">
- Entrada
- </text>
- <text name="My volume label">
- Meu volume:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Mude o volume usando o controle deslizante"/>
- <text name="wait_text">
- Aguarde
- </text>
- <text name="Output">
- Saída
- </text>
- </panel>
+ <panel label="Configuração dos dispositivo" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_environment.xml b/indra/newview/skins/default/xui/pt/panel_region_environment.xml
new file mode 100644
index 0000000000..79eedebe5f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ambiente" name="panel_env_info">
+ <text name="water_settings_title">
+ Selecione as configurações de Água e céu / Ciclo dos dias que todos os visitantes à sua região verão. Mais informações
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usar o padrão do Second Life" name="use_sl_default_settings"/>
+ <radio_item label="Usar as seguintes configurações" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Configuração de água
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciclo céu / dia
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Céu fixo" name="my_sky_settings"/>
+ <radio_item label="Ciclo dia" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Aplicar" name="apply_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_terrain.xml b/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
index b9b0e9d90f..74330a8946 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
@@ -7,21 +7,56 @@
nenhum
</text>
<spinner label="Altura da água" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Limite do aumento do &#10;terreno" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Limite mais baixo do &#10;terreno" name="terrain_lower_spin" bottom_delta="-34"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Usar o sol da propriedade" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Sol fixo" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
- <button label="Aplicar" name="apply_btn"/>
+ <spinner label="Limite do aumento do
+terreno" name="terrain_raise_spin"/>
+ <spinner bottom_delta="-34" label="Limite mais baixo do
+terreno" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Texturas de terreno (exige arquivos .tga 512x512, 24 bit)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Baixo)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Alto)
+ </text>
+ <text name="height_text_lbl5">
+ Intervalos de elevação de textura
+ </text>
+ <text name="height_text_lbl10">
+ Os valores representam o intervalo de mistura das texturas acima.
+ </text>
+ <text name="height_text_lbl11">
+ Em metros, o valor BAIXO é a altura MÁXIMA da Textura 1, e HIGH é a altura MÍNIMA da Textura 4.
+ </text>
+ <text name="height_text_lbl6">
+ Noroeste
+ </text>
+ <text name="height_text_lbl7">
+ Nordeste
+ </text>
+ <spinner label="Baixo" name="height_start_spin_1"/>
+ <spinner label="Baixo" name="height_start_spin_3"/>
+ <spinner label="Alto" name="height_range_spin_1"/>
+ <spinner label="Alto" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Sudoeste
+ </text>
+ <text name="height_text_lbl9">
+ Sudeste
+ </text>
+ <spinner label="Baixo" name="height_start_spin_0"/>
+ <spinner label="Baixo" name="height_start_spin_2"/>
+ <spinner label="Alto" name="height_range_spin_0"/>
+ <spinner label="Alto" name="height_range_spin_2"/>
<button label="Download de terreno RAW..." name="download_raw_btn" tool_tip="Não disponível aos gerentes, somente aos proprietários."/>
- <button label="?" name="download_raw_help"/>
<button label="Upload de terreno RAW..." name="upload_raw_btn" tool_tip="Não disponível aos gerentes, somente aos proprietários."/>
- <button label="?" name="upload_raw_help"/>
- <button width="170" label="Nivelar o terreno" name="bake_terrain_btn" tool_tip="Ajustar terreno atual como o ponto médio para os limites de aumento/decréscimo"/>
- <button left="190" label="?" name="bake_terrain_help"/>
+ <button label="Nivelar o terreno" name="bake_terrain_btn" tool_tip="Ajustar terreno atual como o ponto médio para os limites de aumento/decréscimo" width="170"/>
+ <button label="Aplicar" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
index 11ac6c106a..988e7c7076 100644
--- a/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
@@ -1,6 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Coisas" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Itens recebidos ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Itens recebidos
+ </string>
+ <button label="Itens recebidos" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] novos
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ Compras do marketplace serão entregues aqui.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="outbox_layout_panel">
+ <panel label="" name="marketplace_outbox">
+ <button label="Caixa de saída de comerciante" name="outbox_btn"/>
+ <button label="" name="outbox_sync_btn" tool_tip="Enviar para minha vitrine no Marketplace"/>
+ <panel tool_tip="Drag and drop items here to prepare them for sale on your storefront">
+ <text name="outbox_inventory_placeholder">
+ Abra uma conta de comerciante para usar este recurso.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index c5268966c1..3b3b7041d7 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -1132,6 +1132,12 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="InventoryNoTexture">
Você não possui uma cópia desta textura no seu inventário
</string>
+ <string name="InventoryInboxNoItems">
+ Compras do marketplace serão entregues aqui.
+ </string>
+ <string name="InventoryOutboxNoItems">
+ Arraste seus itens aqui para preparar sua listagem na sua vitrine do Marketplace.
+ </string>
<string name="no_transfer" value="(não transferível)"/>
<string name="no_modify" value="(não modificável)"/>
<string name="no_copy" value="(não copiável)"/>
@@ -1172,9 +1178,6 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="InvFolder My Inventory">
Meu inventário
</string>
- <string name="InvFolder My Favorites">
- Meus favoritos
- </string>
<string name="InvFolder Library">
Biblioteca
</string>
@@ -1233,10 +1236,10 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
Gestos
</string>
<string name="InvFolder Favorite">
- Favoritos
+ Meus favoritos
</string>
<string name="InvFolder favorite">
- Favoritos
+ Meus favoritos
</string>
<string name="InvFolder Current Outfit">
Look atual
@@ -1259,6 +1262,9 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="InvFolder All">
Tudo
</string>
+ <string name="no_attachments">
+ Nenhum anexo vestido
+ </string>
<string name="Buy">
Comprar
</string>
@@ -1594,6 +1600,9 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="IMTeen">
adolescente
</string>
+ <string name="Anyone">
+ qualquer um
+ </string>
<string name="RegionInfoError">
erro
</string>
@@ -1810,6 +1819,12 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="Public">
Público
</string>
+ <string name="LocalSettings">
+ Configurações locais
+ </string>
+ <string name="RegionSettings">
+ Configurações da região
+ </string>
<string name="ClassifiedClicksTxt">
Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil
</string>
@@ -3597,6 +3612,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Região em geral
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatar visíveis e bate-papo permitido fora deste terreno
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] Atualização
</string>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pick.xml b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
index 6ac7226185..a624877ab3 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="儲存精選地點" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="取消" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index 986ab82523..28b8cce5b2 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -1099,9 +1099,6 @@
<string name="InvFolder My Inventory">
我的收納區
</string>
- <string name="InvFolder My Favorites">
- My Favorites
- </string>
<string name="InvFolder Library">
Library
</string>
@@ -1160,10 +1157,10 @@
姿勢
</string>
<string name="InvFolder Favorite">
- Favorites
+ My Favorites
</string>
<string name="InvFolder favorite">
- Favorites
+ My Favorites
</string>
<string name="InvFolder Current Outfit">
目前裝扮
diff --git a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
index 0ef2234fec..56c2310f2f 100644
--- a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <text name="avatar_name" value="Unbekannt"/>
<layout_stack name="button_stack">
<layout_panel name="view_profile_btn_panel">
<button label="Profil" name="view_profile_btn"/>
@@ -11,20 +10,20 @@
<layout_panel name="teleport_btn_panel">
<button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten"/>
</layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Teilen" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Bezahlen" name="pay_btn"/>
- </layout_panel>
<layout_panel name="call_btn_panel">
<button label="Anrufen" name="call_btn"/>
</layout_panel>
<layout_panel name="end_call_btn_panel">
<button label="Anruf beenden" name="end_call_btn"/>
</layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Voice-Steuerung" name="voice_ctrls_btn"/>
+ <layout_panel name="block_btn_panel">
+ <button label="Ignorieren" name="block_btn"/>
+ </layout_panel>
+ <layout_panel name="unblock_btn_panel">
+ <button label="Freischalten" name="unblock_btn"/>
+ </layout_panel>
+ <layout_panel name="volume_ctrl_panel">
+ <slider name="volume_slider" tool_tip="Anrufvolumen" value="0,5"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/minimal/xui/en/widgets/location_input.xml b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
index fe06a2d816..ba148cf421 100644
--- a/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
@@ -113,6 +113,14 @@
font="SansSerifSmall"
text_color="TextFgColor"
/>
+ <see_avatars_icon
+ name="see_avatars_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="21"
+ follows="right|top"
+ />
<combo_button
name="Location History"
label=""
diff --git a/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
index 1be6997813..93b6526f77 100644
--- a/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
@@ -10,20 +10,20 @@
<layout_panel name="teleport_btn_panel">
<button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
</layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Compartir" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Pagar" name="pay_btn"/>
- </layout_panel>
<layout_panel name="call_btn_panel">
<button label="Llamar" name="call_btn"/>
</layout_panel>
<layout_panel name="end_call_btn_panel">
<button label="Colgar" name="end_call_btn"/>
</layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Controles de la voz" name="voice_ctrls_btn"/>
+ <layout_panel name="block_btn_panel">
+ <button label="Ignorar" name="block_btn"/>
+ </layout_panel>
+ <layout_panel name="unblock_btn_panel">
+ <button label="No ignorar" name="unblock_btn"/>
+ </layout_panel>
+ <layout_panel name="volume_ctrl_panel">
+ <slider name="volume_slider" tool_tip="Volumen de la llamada" value="0.5"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
index fdc5aeca49..1643cf3229 100644
--- a/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <text name="avatar_name" value="Inconnu"/>
<layout_stack name="button_stack">
<layout_panel name="view_profile_btn_panel">
<button label="Profil" name="view_profile_btn"/>
@@ -11,20 +10,20 @@
<layout_panel name="teleport_btn_panel">
<button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne."/>
</layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Partager" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Payer" name="pay_btn"/>
- </layout_panel>
<layout_panel name="call_btn_panel">
<button label="Appeler" name="call_btn"/>
</layout_panel>
<layout_panel name="end_call_btn_panel">
<button label="Quitter l&apos;appel" name="end_call_btn"/>
</layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Contrôles vocaux" name="voice_ctrls_btn"/>
+ <layout_panel name="block_btn_panel">
+ <button label="Ignorer" name="block_btn"/>
+ </layout_panel>
+ <layout_panel name="unblock_btn_panel">
+ <button label="Ne plus ignorer" name="unblock_btn"/>
+ </layout_panel>
+ <layout_panel name="volume_ctrl_panel">
+ <slider name="volume_slider" tool_tip="Volume de l&apos;appel." value="0,5"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml
index 756db84c1c..269931a1a4 100644
--- a/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml
@@ -10,20 +10,20 @@
<layout_panel name="teleport_btn_panel">
<button label="Teleport" name="teleport_btn" tool_tip="Offri teleport a questa persona"/>
</layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Condividi" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Paga" name="pay_btn"/>
- </layout_panel>
<layout_panel name="call_btn_panel">
<button label="Chiama" name="call_btn"/>
</layout_panel>
<layout_panel name="end_call_btn_panel">
<button label="Chiudi chiamata" name="end_call_btn"/>
</layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Regolazione voce" name="voice_ctrls_btn"/>
+ <layout_panel name="block_btn_panel">
+ <button label="Blocca" name="block_btn"/>
+ </layout_panel>
+ <layout_panel name="unblock_btn_panel">
+ <button label="Sblocca" name="unblock_btn"/>
+ </layout_panel>
+ <layout_panel name="volume_ctrl_panel">
+ <slider name="volume_slider" tool_tip="Volume chiamata" value="0.5"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
index f2429ac12a..14c38c796f 100644
--- a/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <text name="avatar_name" value="不明"/>
<layout_stack name="button_stack">
<layout_panel name="view_profile_btn_panel">
<button label="プロフィール" name="view_profile_btn"/>
@@ -11,20 +10,20 @@
<layout_panel name="teleport_btn_panel">
<button label="テレポート" name="teleport_btn" tool_tip="この人にテレポートを送ります"/>
</layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="共有" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="支払う" name="pay_btn"/>
- </layout_panel>
<layout_panel name="call_btn_panel">
<button label="コール" name="call_btn"/>
</layout_panel>
<layout_panel name="end_call_btn_panel">
<button label="コール終了" name="end_call_btn"/>
</layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="ボイスコントロール" name="voice_ctrls_btn"/>
+ <layout_panel name="block_btn_panel">
+ <button label="ブロック" name="block_btn"/>
+ </layout_panel>
+ <layout_panel name="unblock_btn_panel">
+ <button label="ブロック解除" name="unblock_btn"/>
+ </layout_panel>
+ <layout_panel name="volume_ctrl_panel">
+ <slider name="volume_slider" tool_tip="コールの音量" value="0.5"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
index d223ee9c69..190323c3b0 100644
--- a/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
@@ -10,20 +10,20 @@
<layout_panel name="teleport_btn_panel">
<button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
</layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Compartilhar" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Pagar" name="pay_btn"/>
- </layout_panel>
<layout_panel name="call_btn_panel">
<button label="Ligar" name="call_btn"/>
</layout_panel>
<layout_panel name="end_call_btn_panel">
<button label="Encerrar ligação" name="end_call_btn"/>
</layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Controles de voz" name="voice_ctrls_btn"/>
+ <layout_panel name="block_btn_panel">
+ <button label="Bloquear" name="block_btn"/>
+ </layout_panel>
+ <layout_panel name="unblock_btn_panel">
+ <button label="Desbloquear" name="unblock_btn"/>
+ </layout_panel>
+ <layout_panel name="volume_ctrl_panel">
+ <slider name="volume_slider" tool_tip="Volume da ligação" value="0.5"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index dd7761475e..3c89b64d52 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -164,7 +164,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page is correct",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Agni is a favorite",
grid.has(GRID_IS_FAVORITE_VALUE));
ensure("Agni is a system grid",
@@ -208,7 +208,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page the same after grid file",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Agni still a favorite after grid file",
grid.has(GRID_IS_FAVORITE_VALUE));
ensure("Agni system grid still set after grid file",
@@ -310,7 +310,7 @@ namespace tut
std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
ensure_equals("Override known grid login uri: login page is not set",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
// Override with loginuri
// override custom grid
@@ -359,7 +359,7 @@ namespace tut
std::string("https://my.helper.uri/mycustomhelpers"));
ensure_equals("Override known grid helper uri: login page is not changed",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
// Override with helperuri
// override custom grid
@@ -451,9 +451,9 @@ namespace tut
ensure_equals("getHelperURI", LLGridManager::getInstance()->getHelperURI(),
std::string("https://secondlife.com/helpers/"));
ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure_equals("getLoginPage2", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid());
std::vector<std::string> uris;
LLGridManager::getInstance()->getLoginURIs(uris);
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 51ff754c27..170babbb98 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -296,6 +296,7 @@ void LLCrashLoggerWindows::gatherPlatformSpecificFiles()
bool LLCrashLoggerWindows::mainLoop()
{
+ llinfos << "CrashSubmitBehavior is " << mCrashBehavior << llendl;
// Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529
// win_crash_logger.rc has been edited by hand.
@@ -308,6 +309,7 @@ bool LLCrashLoggerWindows::mainLoop()
if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND)
{
+ llinfos << "Showing crash report submit progress window." << llendl;
ShowWindow(gHwndProgress, SW_SHOW );
sendCrashLogs();
}
@@ -354,7 +356,7 @@ bool LLCrashLoggerWindows::mainLoop()
void LLCrashLoggerWindows::updateApplication(const std::string& message)
{
- LLCrashLogger::updateApplication();
+ LLCrashLogger::updateApplication(message);
if(!message.empty()) show_progress(message);
update_messages();
}
@@ -370,6 +372,3 @@ bool LLCrashLoggerWindows::cleanup()
PostQuitMessage(0);
return true;
}
-
-
-
diff --git a/indra/win_crash_logger/llcrashloggerwindows.h b/indra/win_crash_logger/llcrashloggerwindows.h
index 24c564457c..5c45a998b3 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.h
+++ b/indra/win_crash_logger/llcrashloggerwindows.h
@@ -41,7 +41,6 @@ public:
virtual void updateApplication(const std::string& message = LLStringUtil::null);
virtual bool cleanup();
virtual void gatherPlatformSpecificFiles();
- //void annotateCallStack();
void setHandle(HINSTANCE hInst) { mhInst = hInst; }
private:
void ProcessDlgItemText(HWND hWnd, int nIDDlgItem);
diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp
index 5c22053317..8e916ae437 100644
--- a/indra/win_crash_logger/win_crash_logger.cpp
+++ b/indra/win_crash_logger/win_crash_logger.cpp
@@ -24,51 +24,30 @@
* $/LicenseInfo$
*/
-// win_crash_logger.cpp : Defines the entry point for the application.
-//
-
-// Must be first include, precompiled headers.
#include "linden_common.h"
-
#include "stdafx.h"
-
#include <stdlib.h>
-
#include "llcrashloggerwindows.h"
-
-
-//
-// Implementation
-//
-
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
- llinfos << "Starting crash reporter" << llendl;
+ llinfos << "Starting crash reporter." << llendl;
LLCrashLoggerWindows app;
app.setHandle(hInstance);
- bool ok = app.init();
- if(!ok)
+ app.parseCommandOptions(__argc, __argv);
+
+ if (! app.init())
{
llwarns << "Unable to initialize application." << llendl;
return -1;
}
- // Run the application main loop
- if(!LLApp::isQuitting()) app.mainLoop();
-
- if (!app.isError())
- {
- //
- // We don't want to do cleanup here if the error handler got called -
- // the assumption is that the error handler is responsible for doing
- // app cleanup if there was a problem.
- //
- app.cleanup();
- }
+ app.mainLoop();
+ app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}
diff --git a/scripts/gpu_table_tester b/scripts/gpu_table_tester
index 52b1c8f31d..52b1c8f31d 100644..100755
--- a/scripts/gpu_table_tester
+++ b/scripts/gpu_table_tester
diff --git a/scripts/md5check.py b/scripts/md5check.py
index 1a54a2844c..1a54a2844c 100644..100755
--- a/scripts/md5check.py
+++ b/scripts/md5check.py
diff --git a/shining-fixes_rev18977.patch b/shining-fixes_rev18977.patch
new file mode 100644
index 0000000000..b711da870a
--- /dev/null
+++ b/shining-fixes_rev18977.patch
@@ -0,0 +1,41 @@
+# HG changeset patch
+# User Dave Parks <davep@lindenlab.com>
+# Date 1308673064 18000
+# Node ID 95c5639a3f80920e8dc54703d894517dd7694edf
+# Parent 6af10678de4736222b2c3f7e010e984fb5b327de
+SH-208 Disable VBO on all intel graphics chips (stability improvement).
+
+diff -r 6af10678de47 -r 95c5639a3f80 indra/newview/featuretable.txt
+--- a/indra/newview/featuretable.txt Mon Jun 20 16:42:31 2011 -0700
++++ b/indra/newview/featuretable.txt Tue Jun 21 11:17:44 2011 -0500
+@@ -1,4 +1,4 @@
+-version 29
++version 30
+
+ // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
+ // Should be combined into one table
+@@ -297,6 +297,7 @@
+
+ list Intel
+ RenderAnisotropic 1 0
++RenderVBOEnable 1 0
+
+ list GeForce2
+ RenderAnisotropic 1 0
+diff -r 6af10678de47 -r 95c5639a3f80 indra/newview/featuretable_xp.txt
+--- a/indra/newview/featuretable_xp.txt Mon Jun 20 16:42:31 2011 -0700
++++ b/indra/newview/featuretable_xp.txt Tue Jun 21 11:17:44 2011 -0500
+@@ -1,4 +1,4 @@
+-version 29
++version 30
+
+ // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
+ // Should be combined into one table
+@@ -295,6 +295,7 @@
+
+ list Intel
+ RenderAnisotropic 1 0
++RenderVBOEnable 1 0
+
+ list GeForce2
+ RenderAnisotropic 1 0